@oneuptime/common 12.0.8 → 12.0.9
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/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +1 -1
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +1 -1
- package/Models/DatabaseModels/AIConversation.ts +32 -0
- package/Models/DatabaseModels/AIConversationMessage.ts +41 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +27 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +28 -0
- package/Models/DatabaseModels/Index.ts +12 -4
- package/Models/DatabaseModels/{TelemetryEntity.ts → InventoryItem.ts} +139 -9
- package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
- package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +8 -8
- package/Models/DatabaseModels/NetworkDevice.ts +141 -0
- package/Models/DatabaseModels/NetworkDeviceLink.ts +699 -0
- package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +467 -0
- package/Models/DatabaseModels/NetworkTopologySuppression.ts +429 -0
- package/Models/DatabaseModels/OnCallDutyPolicyFeed.ts +9 -0
- package/Models/DatabaseModels/Project.ts +78 -0
- package/Models/DatabaseModels/UserCall.ts +42 -0
- package/Models/DatabaseModels/UserEmail.ts +44 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +425 -55
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +24 -2
- package/Models/DatabaseModels/UserPush.ts +49 -0
- package/Models/DatabaseModels/UserSMS.ts +43 -0
- package/Models/DatabaseModels/UserTelegram.ts +59 -0
- package/Models/DatabaseModels/UserWebhook.ts +52 -0
- package/Models/DatabaseModels/UserWhatsApp.ts +41 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +12 -0
- package/Server/API/AIChatAPI.ts +315 -1
- package/Server/API/DashboardAPI.ts +217 -1
- package/Server/API/OnCallReadinessAPI.ts +841 -0
- package/Server/API/TeamComplianceAPI.ts +69 -17
- package/Server/API/TelemetryAPI.ts +220 -12
- package/Server/EnvironmentConfig.ts +52 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +22 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +4 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +5 -5
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.ts +82 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.ts +255 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.ts +107 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.ts +90 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Infrastructure/Queue.ts +78 -13
- package/Server/Middleware/PublicDashboardRateLimit.ts +593 -0
- package/Server/Services/AIService.ts +7 -0
- package/Server/Services/AlertEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/AlertSeverityService.ts +63 -0
- package/Server/Services/DashboardService.ts +9 -10
- package/Server/Services/DatabaseService.ts +32 -2
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/IncidentSeverityService.ts +76 -0
- package/Server/Services/Index.ts +12 -4
- package/Server/Services/InventoryItemCustomFieldService.ts +9 -0
- package/Server/Services/{TelemetryEntityRelationshipService.ts → InventoryItemRelationshipService.ts} +4 -4
- package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +89 -20
- package/Server/Services/LogAggregationService.ts +45 -8
- package/Server/Services/MetricAggregationService.ts +121 -0
- package/Server/Services/MetricService.ts +7 -7
- package/Server/Services/NetworkDeviceLinkRuleService.ts +10 -0
- package/Server/Services/NetworkDeviceLinkService.ts +84 -0
- package/Server/Services/NetworkDeviceService.ts +140 -0
- package/Server/Services/NetworkSiteService.ts +77 -25
- package/Server/Services/NetworkTopologySuppressionService.ts +84 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +41 -29
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +8 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +62 -13
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +61 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +742 -0
- package/Server/Services/OnCallReadinessService.ts +2803 -0
- package/Server/Services/OnCallSetupReminderService.ts +955 -0
- package/Server/Services/ProfileAggregationService.ts +123 -0
- package/Server/Services/StatusPageService.ts +9 -10
- package/Server/Services/TeamComplianceService.ts +429 -252
- package/Server/Services/UserCallService.ts +26 -1
- package/Server/Services/UserEmailService.ts +26 -1
- package/Server/Services/UserNotificationRuleAdminService.ts +1183 -0
- package/Server/Services/UserNotificationRuleService.ts +3812 -333
- package/Server/Services/UserOnCallLogService.ts +561 -48
- package/Server/Services/UserPushService.ts +29 -0
- package/Server/Services/UserService.ts +11 -0
- package/Server/Services/UserSmsService.ts +26 -1
- package/Server/Services/UserTelegramService.ts +24 -1
- package/Server/Services/UserWebhookService.ts +28 -1
- package/Server/Services/UserWhatsAppService.ts +24 -1
- package/Server/Types/Database/Permissions/BasePermission.ts +19 -0
- package/Server/Types/Database/Permissions/CreatePermission.ts +164 -0
- package/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.ts +340 -0
- package/Server/Types/Database/Permissions/QueryPermission.ts +48 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +8 -1
- package/Server/Types/Workflow/Components/API/Delete.ts +1 -1
- package/Server/Types/Workflow/Components/API/Get.ts +1 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +1 -1
- package/Server/Types/Workflow/Components/API/Post.ts +1 -1
- package/Server/Types/Workflow/Components/API/Put.ts +1 -1
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +29 -5
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +18 -10
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +55 -0
- package/Server/Types/Workflow/Components/Conditions/IfElse.ts +3 -17
- package/Server/Types/Workflow/Components/Email.ts +25 -7
- package/Server/Types/Workflow/Components/JavaScript.ts +10 -3
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +1 -1
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +643 -48
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +32 -3
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +20 -6
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +7 -0
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +2 -2
- package/Server/Utils/AI/Toolbox/AIMetaTools.ts +863 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +177 -15
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +191 -10
- package/Server/Utils/AI/Toolbox/Index.ts +48 -0
- package/Server/Utils/AI/Toolbox/MonitorTools.ts +298 -11
- package/Server/Utils/AI/Toolbox/NoteWriteTools.ts +295 -0
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +1246 -0
- package/Server/Utils/AI/Toolbox/RunbookTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +456 -0
- package/Server/Utils/AI/Toolbox/StatusPageTools.ts +559 -0
- package/Server/Utils/AI/Toolbox/TeamTools.ts +327 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +615 -0
- package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +664 -0
- package/Server/Utils/ClientIp.ts +221 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +47 -0
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +163 -0
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +147 -0
- package/Server/Utils/Express.ts +12 -17
- package/Server/Utils/LLM/LLMService.ts +85 -8
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +204 -10
- package/Server/Utils/SSRFProtection.ts +98 -23
- package/Server/Utils/StartServer.ts +12 -3
- package/Server/Utils/Telemetry/EntityRegistry.ts +205 -18
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +25 -25
- package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +7 -3
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +2146 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +561 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +2470 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +1897 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3606 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +784 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +1119 -0
- package/Tests/App/Dashboard/SloWidgetFetching.test.tsx +531 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +1312 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +1390 -0
- package/Tests/Models/InventoryItemModel.test.ts +174 -0
- package/Tests/Models/InventoryItemNaming.test.ts +302 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +437 -0
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +659 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +18 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +880 -0
- package/Tests/Server/API/Helpers.ts +24 -15
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +2680 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +915 -0
- package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +533 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +213 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +432 -0
- package/Tests/Server/Infrastructure/Queue.test.ts +293 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +1645 -0
- package/Tests/Server/Services/AdminRuleEditGuards.test.ts +2848 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1393 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +1802 -0
- package/Tests/Server/Services/EpisodeStateTimelineNote.test.ts +304 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +339 -0
- package/Tests/Server/Services/{TelemetryEntityManualCreate.test.ts → InventoryItemManualCreate.test.ts} +27 -27
- package/Tests/Server/Services/IpAllowlistSpoofing.test.ts +450 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +235 -1
- package/Tests/Server/Services/MetricAggregationService.test.ts +231 -0
- package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +80 -29
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +30 -30
- package/Tests/Server/Services/NetworkSiteService.test.ts +18 -3
- package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +1728 -0
- package/Tests/Server/Services/NotificationDeletionImpact.test.ts +2402 -0
- package/Tests/Server/Services/OnCallDutyPolicyExecutionLogTimelineGapFeed.test.ts +394 -0
- package/Tests/Server/Services/OnCallNotificationFallback.test.ts +1744 -0
- package/Tests/Server/Services/OnCallReadinessService.test.ts +4295 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +1272 -0
- package/Tests/Server/Services/OnCallWeeklyReadinessDigest.test.ts +1021 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +296 -0
- package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +1536 -0
- package/Tests/Server/Services/SeverityRuleBackfill.test.ts +1818 -0
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1845 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +1394 -0
- package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +1166 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1468 -0
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1457 -0
- package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +1546 -0
- package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +529 -0
- package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +1219 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1089 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +2 -1
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +190 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +44 -14
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +151 -0
- package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +98 -0
- package/Tests/Server/Types/Workflow/Components/JavaScript.test.ts +51 -0
- package/Tests/Server/Utils/AI/AIMetaTools.test.ts +586 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +582 -0
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +726 -0
- package/Tests/Server/Utils/AI/IncidentToolsFilters.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceStopReason.test.ts +314 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +26 -3
- package/Tests/Server/Utils/AI/NoteWriteTools.test.ts +268 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +169 -0
- package/Tests/Server/Utils/AI/OnCallTools.test.ts +664 -0
- package/Tests/Server/Utils/AI/RunbookTools.test.ts +325 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +306 -0
- package/Tests/Server/Utils/AI/StatusPageTools.test.ts +391 -0
- package/Tests/Server/Utils/AI/TeamTools.test.ts +257 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +472 -0
- package/Tests/Server/Utils/AI/WorkflowProbeTools.test.ts +428 -0
- package/Tests/Server/Utils/ClientIp.test.ts +438 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +171 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +383 -0
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +23 -25
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnssecMonitorCriteria.test.ts +307 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +468 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorTelemetryDeepLinks.test.ts +460 -0
- package/Tests/Server/Utils/ResponseRateLimitStatusCodes.test.ts +137 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +40 -8
- package/Tests/Server/Utils/SSRFProtectionUserInfo.test.ts +351 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistryRetirement.test.ts +531 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +15 -15
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
- package/Tests/Types/IP/IP.test.ts +263 -0
- package/Tests/Types/IP/IPWhitelist.test.ts +197 -0
- package/Tests/Types/IP/IPv6.test.ts +12 -1
- package/Tests/Types/Monitor/SnmpOid.test.ts +64 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +110 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +106 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeDifferential.test.ts +511 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageEndToEnd.test.ts +489 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageGapTolerance.test.ts +479 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageState.test.ts +822 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +6 -6
- package/Tests/Types/Workflow/BaseModelComponents.test.ts +429 -0
- package/Tests/Types/Workflow/Components/BaseModel.test.ts +225 -0
- package/Tests/Types/Workflow/IntegrationCredentialMetadata.test.ts +100 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +112 -0
- package/Tests/Types/Workflow/Templates.test.ts +916 -101
- package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
- package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
- package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
- package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +913 -0
- package/Tests/UI/Components/SimpleLogViewer.test.tsx +228 -0
- package/Tests/UI/Components/TableRowSelectability.test.tsx +312 -0
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +72 -0
- package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +242 -7
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +15 -7
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +242 -28
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +59 -1
- package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +256 -0
- package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +665 -0
- package/Tests/UI/Components/Workflow/WorkflowIssuesModal.test.tsx +485 -0
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +478 -0
- package/Tests/UI/Components/Workflow/WorkflowStatusBar.test.tsx +379 -0
- package/Tests/UI/EsbuildConfig.test.ts +607 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +11 -4
- package/Tests/UI/Utils/ModelAPICreateMiscData.test.ts +94 -0
- package/Tests/UI/Utils/Platform.test.ts +147 -0
- package/Tests/UI/Utils/ProjectInvitationDisplay.test.ts +357 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +198 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +487 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
- package/Tests/__mocks__/bullmq.js +55 -0
- package/Types/AI/AIChatMessageStatus.ts +8 -1
- package/Types/AI/AIChatTypes.ts +12 -0
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +88 -0
- package/Types/Exception/ExceptionCode.ts +2 -0
- package/Types/Exception/ServiceUnavailableException.ts +8 -0
- package/Types/Exception/TooManyRequestsException.ts +8 -0
- package/Types/IP/IP.ts +93 -47
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +49 -3
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +55 -0
- package/Types/OnCallDutyPolicy/Layer.ts +203 -149
- package/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.ts +13 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +155 -10
- package/Types/Permission.ts +193 -0
- package/Types/Telemetry/EntityRelationshipType.ts +1 -1
- package/Types/Telemetry/EntitySource.ts +1 -1
- package/Types/Telemetry/EntityType.ts +1 -1
- package/Types/Telemetry/EntityTypeGroups.ts +1 -1
- package/Types/Workflow/Components/BaseModel.ts +75 -29
- package/Types/Workflow/Components/Discord.ts +1 -0
- package/Types/Workflow/Components/Email.ts +12 -3
- package/Types/Workflow/Components/JavaScript.ts +7 -0
- package/Types/Workflow/Components/MicrosoftTeams.ts +3 -2
- package/Types/Workflow/Components/Slack.ts +1 -0
- package/Types/Workflow/Components/Telegram.ts +1 -0
- package/Types/Workflow/TemplateSyntax.ts +44 -0
- package/Types/Workflow/Templates.ts +2097 -45
- package/UI/Components/Calendar/Calendar.css +43 -0
- package/UI/Components/Calendar/Calendar.tsx +8 -0
- package/UI/Components/Card/Card.tsx +2 -2
- package/UI/Components/Checkbox/Checkbox.tsx +16 -0
- package/UI/Components/Dictionary/Dictionary.tsx +48 -9
- package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
- package/UI/Components/Input/Input.tsx +1 -0
- package/UI/Components/KeyboardShortcut/KeyboardKey.ts +185 -0
- package/UI/Components/KeyboardShortcut/KeyboardShortcut.tsx +87 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +28 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +31 -0
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -18
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +363 -14
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +11 -0
- package/UI/Components/LogsViewer/components/LogsTable.tsx +155 -12
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +29 -0
- package/UI/Components/LogsViewer/types.ts +23 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +15 -30
- package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +442 -0
- package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +23 -1
- package/UI/Components/Table/Table.tsx +49 -16
- package/UI/Components/Table/TableBody.tsx +53 -28
- package/UI/Components/Table/TableHeader.tsx +13 -0
- package/UI/Components/Table/TableRow.tsx +58 -26
- package/UI/Components/Workflow/ArgumentsForm.tsx +155 -9
- package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +10 -1
- package/UI/Components/Workflow/ComponentValuePickerModal.tsx +135 -7
- package/UI/Components/Workflow/ComponentsModal.tsx +116 -22
- package/UI/Components/Workflow/DocumentationViewer.tsx +59 -9
- package/UI/Components/Workflow/GraphLint.ts +42 -5
- package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +154 -22
- package/UI/Components/Workflow/ModelSchema.ts +115 -33
- package/UI/Components/Workflow/RunStatusWatcher.ts +1 -1
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Components/Workflow/UseRunWatch.ts +212 -0
- package/UI/Components/Workflow/VariableModal.tsx +6 -2
- package/UI/Components/Workflow/Workflow.tsx +49 -3
- package/UI/Components/Workflow/WorkflowIssuesModal.tsx +255 -0
- package/UI/Components/Workflow/WorkflowLogModal.tsx +128 -0
- package/UI/Components/Workflow/WorkflowStatusBar.tsx +224 -0
- package/UI/Utils/AIChatExport/ConversationMarkdown.ts +10 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +7 -1
- package/UI/Utils/Platform.ts +149 -0
- package/UI/Utils/ProjectInvitationDisplay.ts +118 -0
- package/UI/esbuild-config.js +22 -1
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +187 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +888 -164
- package/Utils/Telemetry/CrossSignalScope.ts +502 -0
- package/Utils/Telemetry/EntityKey.ts +5 -5
- package/Utils/Telemetry/EntityRelationship.ts +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +1 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js +32 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js +42 -0
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +28 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +29 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{TelemetryEntity.js → InventoryItem.js} +167 -31
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +454 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{TelemetryEntityRelationship.js → InventoryItemRelationship.js} +27 -27
- package/build/dist/Models/DatabaseModels/InventoryItemRelationship.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +141 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +719 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +475 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js +446 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js +9 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +80 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +46 -2
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +48 -2
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +424 -55
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +24 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +51 -1
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +47 -2
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +65 -3
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebhook.js +56 -2
- package/build/dist/Models/DatabaseModels/UserWebhook.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +45 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +12 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +237 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +165 -13
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +599 -0
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -0
- package/build/dist/Server/API/TeamComplianceAPI.js +68 -9
- package/build/dist/Server/API/TeamComplianceAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +129 -18
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +45 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +4 -4
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js +150 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js +69 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +72 -13
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +399 -0
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AIService.js +1 -0
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +54 -0
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +10 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +24 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +67 -0
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js +9 -0
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityRelationshipService.js → InventoryItemRelationshipService.js} +6 -6
- package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +68 -23
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +27 -8
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +80 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +6 -6
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js +9 -0
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +113 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +53 -13
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js +85 -0
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +48 -32
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +8 -0
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -12
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +57 -13
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +548 -0
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -0
- package/build/dist/Server/Services/OnCallReadinessService.js +1961 -0
- package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js +738 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -0
- package/build/dist/Server/Services/ProfileAggregationService.js +68 -4
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +11 -10
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceService.js +312 -160
- package/build/dist/Server/Services/TeamComplianceService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +24 -1
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +24 -1
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +858 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +2830 -175
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js +488 -43
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +26 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +24 -1
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +22 -1
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +25 -1
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +22 -1
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +12 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +126 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js +254 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js +47 -2
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +7 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +21 -5
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +14 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +31 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +3 -9
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +15 -4
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +7 -2
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +514 -56
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +20 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +19 -6
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +7 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +692 -0
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +148 -12
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +157 -10
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +37 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +259 -14
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js +235 -0
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +1000 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js +356 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +394 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +465 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js +280 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +527 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +548 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -0
- package/build/dist/Server/Utils/ClientIp.js +137 -0
- package/build/dist/Server/Utils/ClientIp.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +38 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +89 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +77 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -0
- package/build/dist/Server/Utils/Express.js +12 -12
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +70 -7
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +121 -11
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +82 -21
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +165 -18
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +11 -11
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +122 -47
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +7 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js +8 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +12 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +60 -0
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +2 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +8 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js +8 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -0
- package/build/dist/Types/IP/IP.js +87 -43
- package/build/dist/Types/IP/IP.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +50 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +186 -123
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js +13 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +105 -11
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +174 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +66 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Discord.js +1 -0
- package/build/dist/Types/Workflow/Components/Discord.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Email.js +12 -3
- package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Types/Workflow/Components/JavaScript.js +7 -0
- package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js +3 -2
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Slack.js +1 -0
- package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Telegram.js +1 -0
- package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -1
- package/build/dist/Types/Workflow/TemplateSyntax.js +12 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -1
- package/build/dist/Types/Workflow/Templates.js +1931 -38
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/Dictionary.js +25 -11
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +27 -4
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -0
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js +163 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js.map +1 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js +47 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +4 -4
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +11 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +10 -8
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +227 -14
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +5 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +69 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +8 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +9 -2
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +8 -21
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +251 -0
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -0
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +9 -2
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +27 -15
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +24 -18
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +9 -1
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +29 -21
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +130 -12
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +10 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +4 -4
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +57 -7
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +53 -18
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js +19 -6
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +33 -4
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js +231 -0
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +116 -21
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelSchema.js +72 -34
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/UseRunWatch.js +123 -0
- package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -0
- package/build/dist/UI/Components/Workflow/VariableModal.js +3 -2
- package/build/dist/UI/Components/Workflow/VariableModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +41 -1
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +99 -0
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +56 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +92 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +9 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Platform.js +118 -0
- package/build/dist/UI/Utils/Platform.js.map +1 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js +106 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +108 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +642 -136
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +328 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +5 -5
- package/build/dist/Utils/Telemetry/EntityRelationship.js +1 -1
- package/jest.config.json +1 -0
- package/package.json +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +0 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +0 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import Query from "../Query";
|
|
2
|
+
import Select from "../Select";
|
|
3
|
+
import BaseModel, {
|
|
4
|
+
DatabaseBaseModelType,
|
|
5
|
+
} from "../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
6
|
+
import DatabaseCommonInteractionProps from "../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
7
|
+
import {
|
|
8
|
+
getOwnerOnlyColumns,
|
|
9
|
+
isOwnerOnlyColumn,
|
|
10
|
+
} from "../../../../Types/Database/AccessControl/OwnerOnlyColumn";
|
|
11
|
+
import { TableColumnMetadata } from "../../../../Types/Database/TableColumn";
|
|
12
|
+
import TableColumnType from "../../../../Types/Database/TableColumnType";
|
|
13
|
+
import NotAuthorizedException from "../../../../Types/Exception/NotAuthorizedException";
|
|
14
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
15
|
+
import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* THE RULE, IN ONE SENTENCE.
|
|
19
|
+
*
|
|
20
|
+
* A column marked @OwnerOnlyColumn() may be read only when the query that
|
|
21
|
+
* reaches its row is pinned to the caller's own id. The owner reading their own
|
|
22
|
+
* settings passes. An administrator reading somebody else's does not - whether
|
|
23
|
+
* they come at the column directly, or sideways through a relation, or by
|
|
24
|
+
* ordering on it, or by probing it in a WHERE clause.
|
|
25
|
+
*
|
|
26
|
+
* WHY A COLUMN-PERMISSION LIST CANNOT EXPRESS THIS. Permission.CurrentUser is
|
|
27
|
+
* auto-granted to every authenticated caller, so it never means "only my own
|
|
28
|
+
* row" in a COLUMN list - row scoping comes from the TABLE list alone. This
|
|
29
|
+
* class therefore ignores permissions entirely and looks at the QUERY: not who
|
|
30
|
+
* is asking, but which rows the request is allowed to touch.
|
|
31
|
+
*
|
|
32
|
+
* THE FOUR ROUTES INTO A MARKED COLUMN. All four are closed here, because
|
|
33
|
+
* closing three of them is the same as closing none:
|
|
34
|
+
*
|
|
35
|
+
* 1. A top-level select - `select: { webhookUrl: true }` on UserWebhook.
|
|
36
|
+
* checkSelectPermission(), called from BasePermission.
|
|
37
|
+
*
|
|
38
|
+
* 2. A select nested through a relation - `select: { userWebhook: {
|
|
39
|
+
* webhookUrl: true } }` on UserNotificationRule. checkRelationSelect(),
|
|
40
|
+
* called from inside QueryPermission's relation traversal. This is the
|
|
41
|
+
* route an earlier attempt missed, and it is the one that matters most:
|
|
42
|
+
* widening a rule table's read to administrators does not widen the method
|
|
43
|
+
* tables' reads, so a nested select is how the credential escapes without
|
|
44
|
+
* anything appearing to have been widened at all.
|
|
45
|
+
*
|
|
46
|
+
* 3. A sort key - `sort: { webhookUrl: "ASC" }`. DatabaseService adds sorted
|
|
47
|
+
* columns to the select AFTER the permission layer has run, so the gate is
|
|
48
|
+
* simply not in the path; isOwnerOnlyColumnOnModel() lets that code refuse
|
|
49
|
+
* to add a marked column.
|
|
50
|
+
*
|
|
51
|
+
* 4. A WHERE predicate - `query: { webhookUrl: "https://..." }`. Equality on a
|
|
52
|
+
* secret is a value oracle: enough queries and the value is read out one
|
|
53
|
+
* guess at a time, with nothing ever selected. checkQueryPermission().
|
|
54
|
+
*
|
|
55
|
+
* FAIL CLOSED. No caller identity, no ownership column on the model, a query
|
|
56
|
+
* shape this code does not recognise, or an ownership predicate that names
|
|
57
|
+
* anything other than exactly one id - the caller's - all refuse. The cost of a
|
|
58
|
+
* false refusal is a visible error on a settings page. The cost of a false
|
|
59
|
+
* allowance is a colleague's phone number.
|
|
60
|
+
*/
|
|
61
|
+
export default class OwnerOnlyColumnPermission {
|
|
62
|
+
/**
|
|
63
|
+
* Route 1 - a marked column named directly in the select of the model that
|
|
64
|
+
* owns it.
|
|
65
|
+
*/
|
|
66
|
+
@CaptureSpan()
|
|
67
|
+
public static checkSelectPermission<TBaseModel extends BaseModel>(
|
|
68
|
+
modelType: DatabaseBaseModelType,
|
|
69
|
+
query: Query<TBaseModel>,
|
|
70
|
+
select: Select<TBaseModel>,
|
|
71
|
+
props: DatabaseCommonInteractionProps,
|
|
72
|
+
): void {
|
|
73
|
+
if (OwnerOnlyColumnPermission.isPrivilegedInternalRead(props)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const model: BaseModel = new modelType();
|
|
78
|
+
|
|
79
|
+
for (const columnName in select) {
|
|
80
|
+
if (!isOwnerOnlyColumn(model, columnName)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (
|
|
85
|
+
!OwnerOnlyColumnPermission.isQueryPinnedToCurrentUser(
|
|
86
|
+
modelType,
|
|
87
|
+
query,
|
|
88
|
+
props,
|
|
89
|
+
)
|
|
90
|
+
) {
|
|
91
|
+
throw OwnerOnlyColumnPermission.refusal(model, columnName);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Route 2 - a marked column named through a relation, where the OUTER query
|
|
98
|
+
* is the only thing that decides whether the related rows belong to the
|
|
99
|
+
* caller.
|
|
100
|
+
*
|
|
101
|
+
* The outer query is what gets checked, and it has to be. By the time the
|
|
102
|
+
* traversal reaches `userWebhook: { webhookUrl: true }` there is no separate
|
|
103
|
+
* permission pass over UserWebhook at all: the related rows are whichever
|
|
104
|
+
* rows the outer query's join drags in. So the question is not "may this
|
|
105
|
+
* caller read UserWebhook" - it is "is the outer query confined to rows this
|
|
106
|
+
* caller owns", and that is answered by the outer model's own ownership
|
|
107
|
+
* column.
|
|
108
|
+
*/
|
|
109
|
+
@CaptureSpan()
|
|
110
|
+
public static checkRelationSelect(data: {
|
|
111
|
+
modelType: DatabaseBaseModelType;
|
|
112
|
+
relationColumnName: string;
|
|
113
|
+
relatedModelType: DatabaseBaseModelType;
|
|
114
|
+
relatedColumnName: string;
|
|
115
|
+
query: Query<BaseModel>;
|
|
116
|
+
props: DatabaseCommonInteractionProps;
|
|
117
|
+
}): void {
|
|
118
|
+
if (OwnerOnlyColumnPermission.isPrivilegedInternalRead(data.props)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const relatedModel: BaseModel = new data.relatedModelType();
|
|
123
|
+
|
|
124
|
+
if (!isOwnerOnlyColumn(relatedModel, data.relatedColumnName)) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (
|
|
129
|
+
OwnerOnlyColumnPermission.isQueryPinnedToCurrentUser(
|
|
130
|
+
data.modelType,
|
|
131
|
+
data.query,
|
|
132
|
+
data.props,
|
|
133
|
+
)
|
|
134
|
+
) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const model: BaseModel = new data.modelType();
|
|
139
|
+
|
|
140
|
+
throw new NotAuthorizedException(
|
|
141
|
+
`You do not have permissions to read ${data.relatedColumnName} of ${relatedModel.singularName} through ${data.relationColumnName} on ${model.singularName}. This column belongs to the user it was created for, so it can only be read by a query restricted to your own records.`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Route 4 - a marked column used as a query predicate. Reading a value and
|
|
147
|
+
* guessing it are the same disclosure given enough attempts, so a WHERE on a
|
|
148
|
+
* marked column is held to the identical standard as a select on it. Nested
|
|
149
|
+
* relation filters are walked too, because `{ userWebhook: { webhookUrl: x } }`
|
|
150
|
+
* probes exactly the same value from one level out.
|
|
151
|
+
*/
|
|
152
|
+
@CaptureSpan()
|
|
153
|
+
public static checkQueryPermission<TBaseModel extends BaseModel>(
|
|
154
|
+
modelType: DatabaseBaseModelType,
|
|
155
|
+
query: Query<TBaseModel>,
|
|
156
|
+
props: DatabaseCommonInteractionProps,
|
|
157
|
+
): void {
|
|
158
|
+
if (OwnerOnlyColumnPermission.isPrivilegedInternalRead(props)) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const model: BaseModel = new modelType();
|
|
163
|
+
|
|
164
|
+
for (const columnName in query) {
|
|
165
|
+
if (isOwnerOnlyColumn(model, columnName)) {
|
|
166
|
+
if (
|
|
167
|
+
!OwnerOnlyColumnPermission.isQueryPinnedToCurrentUser(
|
|
168
|
+
modelType,
|
|
169
|
+
query,
|
|
170
|
+
props,
|
|
171
|
+
)
|
|
172
|
+
) {
|
|
173
|
+
throw OwnerOnlyColumnPermission.refusal(model, columnName);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const value: unknown = (query as Record<string, unknown>)[columnName];
|
|
180
|
+
|
|
181
|
+
if (!OwnerOnlyColumnPermission.isPlainObject(value)) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const tableColumnMetadata: TableColumnMetadata =
|
|
186
|
+
model.getTableColumnMetadata(columnName);
|
|
187
|
+
|
|
188
|
+
if (
|
|
189
|
+
!tableColumnMetadata ||
|
|
190
|
+
!tableColumnMetadata.modelType ||
|
|
191
|
+
(tableColumnMetadata.type !== TableColumnType.Entity &&
|
|
192
|
+
tableColumnMetadata.type !== TableColumnType.EntityArray)
|
|
193
|
+
) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const relatedModel: BaseModel = new tableColumnMetadata.modelType();
|
|
198
|
+
|
|
199
|
+
for (const relatedColumnName in value as Record<string, unknown>) {
|
|
200
|
+
if (!isOwnerOnlyColumn(relatedModel, relatedColumnName)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (
|
|
205
|
+
!OwnerOnlyColumnPermission.isQueryPinnedToCurrentUser(
|
|
206
|
+
modelType,
|
|
207
|
+
query,
|
|
208
|
+
props,
|
|
209
|
+
)
|
|
210
|
+
) {
|
|
211
|
+
throw new NotAuthorizedException(
|
|
212
|
+
`You do not have permissions to query on ${relatedColumnName} of ${relatedModel.singularName} through ${columnName} on ${model.singularName}. This column belongs to the user it was created for, so it can only be queried by a request restricted to your own records.`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Route 3's building block. DatabaseService injects sorted columns into the
|
|
221
|
+
* select after the permission layer has already run, and it has no query it
|
|
222
|
+
* can trust by then (the query has been serialized into Raw operators), so it
|
|
223
|
+
* asks the only question it can answer safely: is this column marked. A
|
|
224
|
+
* marked column that the caller legitimately selected is already in the
|
|
225
|
+
* select and is never re-added, so refusing here costs a legitimate reader
|
|
226
|
+
* nothing.
|
|
227
|
+
*/
|
|
228
|
+
public static isOwnerOnlyColumnOnModel(
|
|
229
|
+
modelType: DatabaseBaseModelType,
|
|
230
|
+
columnName: string,
|
|
231
|
+
): boolean {
|
|
232
|
+
return isOwnerOnlyColumn(new modelType(), columnName);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public static getOwnerOnlyColumnsOnModel(
|
|
236
|
+
modelType: DatabaseBaseModelType,
|
|
237
|
+
): Array<string> {
|
|
238
|
+
return getOwnerOnlyColumns(new modelType());
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* "Pinned to the caller" means the query constrains this model's
|
|
243
|
+
* @CurrentUserCanAccessRecordBy column to exactly one id, and that id is the
|
|
244
|
+
* caller's.
|
|
245
|
+
*
|
|
246
|
+
* Every part of that sentence is load bearing:
|
|
247
|
+
*
|
|
248
|
+
* - props.userId absent - an API key or a system caller can hold the
|
|
249
|
+
* auto-granted CurrentUser permission with no user identity at all. There
|
|
250
|
+
* is no id to pin to, so there is no pinning.
|
|
251
|
+
*
|
|
252
|
+
* - no ownership column - the model has no notion of an owner, so no query
|
|
253
|
+
* against it can be owner-scoped. A marked column on such a model is a
|
|
254
|
+
* modelling mistake; refuse rather than invent a scope.
|
|
255
|
+
*
|
|
256
|
+
* - exactly one id - operators are the trap. NotEqual, Includes, IsNull and
|
|
257
|
+
* friends all stringify to (or contain) the id they wrap, so comparing
|
|
258
|
+
* string values alone would let `userId != me` pass itself off as `userId
|
|
259
|
+
* = me` while selecting every OTHER row in the project. Compare the TYPE
|
|
260
|
+
* first: only a bare string or ObjectID is an exact predicate. This is the
|
|
261
|
+
* same test, and for the same reason, as TenantPermission.isExactUserScope.
|
|
262
|
+
*
|
|
263
|
+
* - an array of queries is refused outright. That shape is produced only by
|
|
264
|
+
* the multi-tenant fan-out in TenantPermission, which re-enters the whole
|
|
265
|
+
* permission stack once per project and so has already applied this check
|
|
266
|
+
* per project with a real single query. Recognising the array here would
|
|
267
|
+
* mean reasoning about a shape whose ownership predicate has already been
|
|
268
|
+
* rewritten into a Raw operator; refusing it is both safe and, in
|
|
269
|
+
* practice, unreachable.
|
|
270
|
+
*/
|
|
271
|
+
public static isQueryPinnedToCurrentUser<TBaseModel extends BaseModel>(
|
|
272
|
+
modelType: DatabaseBaseModelType,
|
|
273
|
+
query: Query<TBaseModel>,
|
|
274
|
+
props: DatabaseCommonInteractionProps,
|
|
275
|
+
): boolean {
|
|
276
|
+
if (!props.userId) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!query || typeof query !== "object" || Array.isArray(query)) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const model: BaseModel = new modelType();
|
|
285
|
+
const ownershipColumn: string | null = model.getUserColumn();
|
|
286
|
+
|
|
287
|
+
if (!ownershipColumn) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const ownershipPredicate: unknown = (query as Record<string, unknown>)[
|
|
292
|
+
ownershipColumn
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
if (!OwnerOnlyColumnPermission.isExactUserScope(ownershipPredicate)) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return ownershipPredicate.toString() === props.userId.toString();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Root and master admin short-circuit before any of this. Notification
|
|
304
|
+
* delivery reads these exact columns as root in order to actually send the
|
|
305
|
+
* page - a phone number it cannot read is a phone that never rings - and the
|
|
306
|
+
* whole on-call system stops if that path is closed.
|
|
307
|
+
*/
|
|
308
|
+
private static isPrivilegedInternalRead(
|
|
309
|
+
props: DatabaseCommonInteractionProps,
|
|
310
|
+
): boolean {
|
|
311
|
+
return Boolean(props.isRoot) || Boolean(props.isMasterAdmin);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
private static isExactUserScope(value: unknown): value is string | ObjectID {
|
|
315
|
+
return typeof value === "string" || value instanceof ObjectID;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* A plain `{}` literal, as opposed to a query operator instance such as
|
|
320
|
+
* Includes or NotEqual, which are also objects but carry their own class.
|
|
321
|
+
*/
|
|
322
|
+
private static isPlainObject(value: unknown): boolean {
|
|
323
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const prototype: unknown = Object.getPrototypeOf(value);
|
|
328
|
+
|
|
329
|
+
return prototype === Object.prototype || prototype === null;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
private static refusal(
|
|
333
|
+
model: BaseModel,
|
|
334
|
+
columnName: string,
|
|
335
|
+
): NotAuthorizedException {
|
|
336
|
+
return new NotAuthorizedException(
|
|
337
|
+
`You do not have permissions to read ${columnName} on ${model.singularName}. This column belongs to the user it was created for, so it can only be read by a query restricted to your own records.`,
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
@@ -2,6 +2,7 @@ import DatabaseRequestType from "../../BaseDatabase/DatabaseRequestType";
|
|
|
2
2
|
import Query from "../Query";
|
|
3
3
|
import Select from "../Select";
|
|
4
4
|
import ColumnPermissions from "./ColumnPermission";
|
|
5
|
+
import OwnerOnlyColumnPermission from "./OwnerOnlyColumnPermission";
|
|
5
6
|
import BaseModel, {
|
|
6
7
|
DatabaseBaseModelType,
|
|
7
8
|
} from "../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
@@ -24,9 +25,22 @@ import Permission, {
|
|
|
24
25
|
import Typeof from "../../../../Types/Typeof";
|
|
25
26
|
|
|
26
27
|
export default class QueryPermission {
|
|
28
|
+
/**
|
|
29
|
+
* Validates every column reached through a relation in the select.
|
|
30
|
+
*
|
|
31
|
+
* Takes the OUTER query as well as the select because two of the checks below
|
|
32
|
+
* cannot be answered from the select alone. Which COLUMNS a relation may
|
|
33
|
+
* expose is a property of the related model (canReadOnRelationQuery, the
|
|
34
|
+
* column's own read permissions); which ROWS the relation will expose is a
|
|
35
|
+
* property of the outer query, and nothing else - the related rows are
|
|
36
|
+
* whichever ones the join drags in. An owner-only column needs both answers,
|
|
37
|
+
* so the outer query is threaded down here rather than left behind in
|
|
38
|
+
* BasePermission.
|
|
39
|
+
*/
|
|
27
40
|
@CaptureSpan()
|
|
28
41
|
public static checkRelationQueryPermission<TBaseModel extends BaseModel>(
|
|
29
42
|
modelType: DatabaseBaseModelType,
|
|
43
|
+
query: Query<TBaseModel>,
|
|
30
44
|
select: Select<TBaseModel>,
|
|
31
45
|
props: DatabaseCommonInteractionProps,
|
|
32
46
|
): void {
|
|
@@ -80,6 +94,29 @@ export default class QueryPermission {
|
|
|
80
94
|
);
|
|
81
95
|
}
|
|
82
96
|
|
|
97
|
+
/*
|
|
98
|
+
* Owner-only columns are checked BEFORE the canReadOnRelationQuery
|
|
99
|
+
* short-circuit below, and that ordering is the whole point.
|
|
100
|
+
* canReadOnRelationQuery is a modelling flag meaning "this column is
|
|
101
|
+
* safe to surface as a label on a joined row"; it skips every
|
|
102
|
+
* permission check that follows it. The seven notification-method
|
|
103
|
+
* models set it on their identifier columns so that a user's own
|
|
104
|
+
* rule table can render "Email: jane@example.com" - which is
|
|
105
|
+
* correct, and which is also exactly how an administrator's widened
|
|
106
|
+
* read of the RULE table reaches into the METHOD table and lifts a
|
|
107
|
+
* phone number, an email address or a webhook URL belonging to
|
|
108
|
+
* somebody else. Nothing downstream of the `continue` can stop it,
|
|
109
|
+
* so the check has to happen here.
|
|
110
|
+
*/
|
|
111
|
+
OwnerOnlyColumnPermission.checkRelationSelect({
|
|
112
|
+
modelType: modelType,
|
|
113
|
+
relationColumnName: key,
|
|
114
|
+
relatedModelType: tableColumnMetadata.modelType,
|
|
115
|
+
relatedColumnName: innerKey,
|
|
116
|
+
query: query as Query<BaseModel>,
|
|
117
|
+
props: props,
|
|
118
|
+
});
|
|
119
|
+
|
|
83
120
|
if (
|
|
84
121
|
!getRelatedTableColumnMetadata.canReadOnRelationQuery &&
|
|
85
122
|
!excludedColumnNames.includes(innerKey)
|
|
@@ -132,6 +169,17 @@ export default class QueryPermission {
|
|
|
132
169
|
): void {
|
|
133
170
|
const model: BaseModel = new modelType();
|
|
134
171
|
|
|
172
|
+
/*
|
|
173
|
+
* A WHERE clause reads a value just as surely as a SELECT does, one guess
|
|
174
|
+
* at a time. The name-intersection below authorises a predicate on any
|
|
175
|
+
* column the caller may READ, and Permission.CurrentUser being auto-granted
|
|
176
|
+
* means an owner-only column passes that intersection for everybody - so
|
|
177
|
+
* `{ webhookUrl: "https://hooks.slack.com/services/T.../B.../x" }` is a
|
|
178
|
+
* confirm/deny oracle over somebody else's credential that never appears in
|
|
179
|
+
* any result set. Hold a predicate to the same standard as a select.
|
|
180
|
+
*/
|
|
181
|
+
OwnerOnlyColumnPermission.checkQueryPermission(modelType, query, props);
|
|
182
|
+
|
|
135
183
|
const userPermissions: Array<UserPermission> =
|
|
136
184
|
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
137
185
|
props,
|
|
@@ -252,8 +252,15 @@ export default class TenantPermission {
|
|
|
252
252
|
* True if the only permission letting this user through the table-level
|
|
253
253
|
* check for this op is Permission.CurrentUser. In that case the query must
|
|
254
254
|
* be restricted to rows the user owns (via the model's user column).
|
|
255
|
+
*
|
|
256
|
+
* Public because CreatePermission needs exactly this predicate. Create never
|
|
257
|
+
* reaches addTenantScopeToQuery (see the `type !== DatabaseRequestType.Create`
|
|
258
|
+
* carve-out above), so it enforces ownership on the DATA rather than on a
|
|
259
|
+
* query — but it must decide "is this caller here purely as some logged-in
|
|
260
|
+
* user, or do they hold a real role permission" identically, or the two paths
|
|
261
|
+
* would disagree about who may act on whose rows.
|
|
255
262
|
*/
|
|
256
|
-
|
|
263
|
+
public static isAccessGrantedOnlyByCurrentUser<TBaseModel extends BaseModel>(
|
|
257
264
|
modelType: { new (): TBaseModel },
|
|
258
265
|
props: DatabaseCommonInteractionProps,
|
|
259
266
|
type: DatabaseRequestType,
|
|
@@ -82,7 +82,7 @@ export default class ApiDelete extends ComponentCode {
|
|
|
82
82
|
|
|
83
83
|
return Promise.resolve({
|
|
84
84
|
returnValues: {
|
|
85
|
-
|
|
85
|
+
error: (err as Error).message || "Unknown error",
|
|
86
86
|
},
|
|
87
87
|
executePort: result.errorPort,
|
|
88
88
|
});
|
|
@@ -82,7 +82,7 @@ export default class ApiGet extends ComponentCode {
|
|
|
82
82
|
|
|
83
83
|
return Promise.resolve({
|
|
84
84
|
returnValues: {
|
|
85
|
-
|
|
85
|
+
error: (err as Error).message || "Unknown error",
|
|
86
86
|
},
|
|
87
87
|
executePort: result.errorPort,
|
|
88
88
|
});
|
|
@@ -82,7 +82,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
82
82
|
|
|
83
83
|
return Promise.resolve({
|
|
84
84
|
returnValues: {
|
|
85
|
-
|
|
85
|
+
error: (err as Error).message || "Unknown error",
|
|
86
86
|
},
|
|
87
87
|
executePort: result.errorPort,
|
|
88
88
|
});
|
|
@@ -121,7 +121,7 @@ export default class ApiPost extends ComponentCode {
|
|
|
121
121
|
|
|
122
122
|
return Promise.resolve({
|
|
123
123
|
returnValues: {
|
|
124
|
-
|
|
124
|
+
error: (err as Error).message || "Unknown error",
|
|
125
125
|
},
|
|
126
126
|
executePort: result.errorPort,
|
|
127
127
|
});
|
|
@@ -83,7 +83,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
83
83
|
|
|
84
84
|
return Promise.resolve({
|
|
85
85
|
returnValues: {
|
|
86
|
-
|
|
86
|
+
error: (err as Error).message || "Unknown error",
|
|
87
87
|
},
|
|
88
88
|
executePort: result.errorPort,
|
|
89
89
|
});
|
|
@@ -10,7 +10,8 @@ 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
|
+
import { applyTenantColumn, logUnknownColumns } from "./ModelArguments";
|
|
14
|
+
import logComponentError from "./LogComponentError";
|
|
14
15
|
|
|
15
16
|
export default class CreateManyBaseModel<
|
|
16
17
|
TBaseModel extends BaseModel,
|
|
@@ -97,9 +98,28 @@ export default class CreateManyBaseModel<
|
|
|
97
98
|
* was only meant to guard the projectId stamping, so a model without a
|
|
98
99
|
* tenant column created nothing at all and still reported success.
|
|
99
100
|
*/
|
|
100
|
-
for (const item of
|
|
101
|
+
for (const [index, item] of (
|
|
102
|
+
args["json-array"] as Array<JSONObject>
|
|
103
|
+
).entries()) {
|
|
104
|
+
const element: JSONObject = (item as JSONObject) || {};
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* Checked before applyTenantColumn rather than after: the report should
|
|
108
|
+
* name the keys the builder actually typed, and the tenant column the
|
|
109
|
+
* stamp adds is not one of them. The position is prefixed because one
|
|
110
|
+
* mistyped key in a long array is otherwise impossible to locate - and
|
|
111
|
+
* unlike Create One, an array can carry several different mistakes.
|
|
112
|
+
*/
|
|
113
|
+
logUnknownColumns(
|
|
114
|
+
element,
|
|
115
|
+
this.modelService.getModel(),
|
|
116
|
+
(message: string): void => {
|
|
117
|
+
options.log(`Item ${index + 1}: ${message}`);
|
|
118
|
+
},
|
|
119
|
+
);
|
|
120
|
+
|
|
101
121
|
const json: JSONObject = applyTenantColumn(
|
|
102
|
-
|
|
122
|
+
element,
|
|
103
123
|
this.modelService.getModel(),
|
|
104
124
|
options.projectId,
|
|
105
125
|
);
|
|
@@ -125,8 +145,12 @@ export default class CreateManyBaseModel<
|
|
|
125
145
|
executePort: successPort,
|
|
126
146
|
};
|
|
127
147
|
} catch (err: any) {
|
|
128
|
-
|
|
129
|
-
|
|
148
|
+
logComponentError({
|
|
149
|
+
error: err,
|
|
150
|
+
model: this.modelService?.getModel() || null,
|
|
151
|
+
log: options.log,
|
|
152
|
+
});
|
|
153
|
+
|
|
130
154
|
return {
|
|
131
155
|
returnValues: {},
|
|
132
156
|
executePort: errorPort,
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import DatabaseService from "../../../../Services/DatabaseService";
|
|
2
|
-
import logger from "../../../../Utils/Logger";
|
|
3
2
|
import ComponentCode, { RunOptions, RunReturnType } from "../../ComponentCode";
|
|
4
3
|
import BaseModel from "../../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
5
4
|
import BadDataException from "../../../../../Types/Exception/BadDataException";
|
|
6
|
-
import Exception from "../../../../../Types/Exception/Exception";
|
|
7
5
|
import { JSONObject } from "../../../../../Types/JSON";
|
|
8
6
|
import JSONFunctions from "../../../../../Types/JSONFunctions";
|
|
9
7
|
import Text from "../../../../../Types/Text";
|
|
@@ -12,7 +10,8 @@ import ComponentMetadata, {
|
|
|
12
10
|
} from "../../../../../Types/Workflow/Component";
|
|
13
11
|
import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
|
|
14
12
|
import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
|
|
15
|
-
import { applyTenantColumn } from "./ModelArguments";
|
|
13
|
+
import { applyTenantColumn, logUnknownColumns } from "./ModelArguments";
|
|
14
|
+
import logComponentError from "./LogComponentError";
|
|
16
15
|
|
|
17
16
|
export default class CreateOneBaseModel<
|
|
18
17
|
TBaseModel extends BaseModel,
|
|
@@ -91,6 +90,17 @@ export default class CreateOneBaseModel<
|
|
|
91
90
|
);
|
|
92
91
|
}
|
|
93
92
|
|
|
93
|
+
/*
|
|
94
|
+
* Checked before applyTenantColumn rather than after: the report should
|
|
95
|
+
* name the keys the builder actually typed, and the tenant column the
|
|
96
|
+
* stamp adds is not one of them.
|
|
97
|
+
*/
|
|
98
|
+
logUnknownColumns(
|
|
99
|
+
args["json"] as JSONObject,
|
|
100
|
+
this.modelService.getModel(),
|
|
101
|
+
options.log,
|
|
102
|
+
);
|
|
103
|
+
|
|
94
104
|
args["json"] = applyTenantColumn(
|
|
95
105
|
args["json"] as JSONObject,
|
|
96
106
|
this.modelService.getModel(),
|
|
@@ -115,13 +125,11 @@ export default class CreateOneBaseModel<
|
|
|
115
125
|
executePort: successPort,
|
|
116
126
|
};
|
|
117
127
|
} catch (err: any) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
options.log
|
|
122
|
-
}
|
|
123
|
-
options.log(err.message ? err.message : JSON.stringify(err, null, 2));
|
|
124
|
-
}
|
|
128
|
+
logComponentError({
|
|
129
|
+
error: err,
|
|
130
|
+
model: this.modelService?.getModel() || null,
|
|
131
|
+
log: options.log,
|
|
132
|
+
});
|
|
125
133
|
|
|
126
134
|
return {
|
|
127
135
|
returnValues: {},
|
|
@@ -206,3 +206,58 @@ export const describeModelColumns: DescribeModelColumnsFunction = (
|
|
|
206
206
|
|
|
207
207
|
return columns.join(", ");
|
|
208
208
|
};
|
|
209
|
+
|
|
210
|
+
type LogUnknownColumnsFunction = (
|
|
211
|
+
json: JSONObject,
|
|
212
|
+
model: BaseModel,
|
|
213
|
+
log: (message: string) => void,
|
|
214
|
+
) => void;
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* Create silently drops keys it does not recognise. DatabaseBaseModel._fromJSON
|
|
218
|
+
* only assigns a key when getTableColumnMetadata returns something, and there is
|
|
219
|
+
* no else branch, so a misspelled key never reaches the record. A required
|
|
220
|
+
* column still fails loudly through DatabaseService.checkRequiredFields, but an
|
|
221
|
+
* optional one - MonitorSecret.description, for instance - creates a record with
|
|
222
|
+
* the field missing, returns Success, and says nothing at all. So "descriptoin"
|
|
223
|
+
* looked like a green run to the builder who typed it.
|
|
224
|
+
*
|
|
225
|
+
* This only reports. Throwing would start failing workflows that run fine today,
|
|
226
|
+
* and graphs created through the API never pass through the builder that would
|
|
227
|
+
* have caught the typo, so the run has to continue.
|
|
228
|
+
*/
|
|
229
|
+
export const logUnknownColumns: LogUnknownColumnsFunction = (
|
|
230
|
+
json: JSONObject,
|
|
231
|
+
model: BaseModel,
|
|
232
|
+
log: (message: string) => void,
|
|
233
|
+
): void => {
|
|
234
|
+
const unknownKeys: Array<string> = Object.keys(json).filter(
|
|
235
|
+
(key: string): boolean => {
|
|
236
|
+
/*
|
|
237
|
+
* "id" has no column of its own - _fromJSON rewrites it to the "_id"
|
|
238
|
+
* primary key before looking the column up - so it is a legitimate key
|
|
239
|
+
* here and must not be reported.
|
|
240
|
+
*/
|
|
241
|
+
if (key === ID_ARGUMENT_KEY) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return !model.getTableColumnMetadata(key);
|
|
246
|
+
},
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
if (unknownKeys.length === 0) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const modelName: string =
|
|
254
|
+
model.singularName || model.tableName || "this model";
|
|
255
|
+
|
|
256
|
+
log(
|
|
257
|
+
`Ignored ${unknownKeys.join(
|
|
258
|
+
", ",
|
|
259
|
+
)}: not columns on ${modelName}. Columns you can use: ${describeModelColumns(
|
|
260
|
+
model,
|
|
261
|
+
)}.`,
|
|
262
|
+
);
|
|
263
|
+
};
|