@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
|
@@ -27,12 +27,76 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
27
27
|
import Permission from "../../Types/Permission";
|
|
28
28
|
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
29
29
|
|
|
30
|
+
/*
|
|
31
|
+
* Who, other than the owner, may look at a member's paging configuration, and
|
|
32
|
+
* who may repair it. Named once and spread everywhere so the table-level gate
|
|
33
|
+
* and the per-column gates cannot drift apart - a column quietly narrower than
|
|
34
|
+
* its table is how a required field becomes unwritable by the very permission
|
|
35
|
+
* that was supposed to be able to write it.
|
|
36
|
+
*/
|
|
37
|
+
const ADMIN_READ_PERMISSIONS: Array<Permission> = [
|
|
38
|
+
Permission.ProjectOwner,
|
|
39
|
+
Permission.ProjectAdmin,
|
|
40
|
+
Permission.ReadProjectUserNotificationRule,
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const ADMIN_WRITE_PERMISSIONS: Array<Permission> = [
|
|
44
|
+
Permission.ProjectOwner,
|
|
45
|
+
Permission.ProjectAdmin,
|
|
46
|
+
Permission.EditProjectUserNotificationRule,
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
* Two audiences, one table, and the difference between them is decided by which
|
|
51
|
+
* permission let the caller through rather than by two different endpoints.
|
|
52
|
+
*
|
|
53
|
+
* Permission.CurrentUser stays first in every list and
|
|
54
|
+
* @CurrentUserCanAccessRecordBy("userId") stays on the class, because together
|
|
55
|
+
* they are what keeps an ordinary member scoped. TenantPermission
|
|
56
|
+
* .isAccessGrantedOnlyByCurrentUser intersects what the caller holds with what
|
|
57
|
+
* the model accepts: a plain member matches nothing here but the auto-granted
|
|
58
|
+
* CurrentUser, so addCurrentUserScopeToQuery rewrites their query to
|
|
59
|
+
* `userId = me` and rejects outright any attempt to name somebody else. Adding
|
|
60
|
+
* the admin entries below does not weaken that - a member holds none of them,
|
|
61
|
+
* so their intersection is unchanged.
|
|
62
|
+
*
|
|
63
|
+
* For a caller who DOES hold one of them the intersection is no longer
|
|
64
|
+
* CurrentUser alone, the ownership predicate is not applied, and they can read
|
|
65
|
+
* and repair another member's rules. TeamMember already carries exactly this
|
|
66
|
+
* combination and behaves the same way, which is the reason to reuse the
|
|
67
|
+
* mechanism here rather than invent a second one.
|
|
68
|
+
*
|
|
69
|
+
* That capability is the entire point of this table being reachable by an
|
|
70
|
+
* administrator at all. An on-call policy can say "page the engineer on duty",
|
|
71
|
+
* but whether that page arrives is decided by rows in THIS table, and until now
|
|
72
|
+
* nobody but the engineer themselves could see them. A member with no matching
|
|
73
|
+
* rule was silently unpageable, and the only person able to notice was the
|
|
74
|
+
* person who was not being notified.
|
|
75
|
+
*
|
|
76
|
+
* ProjectOwner and ProjectAdmin are listed ALONGSIDE the granular permissions,
|
|
77
|
+
* not instead of them, and that is load-bearing rather than belt-and-braces.
|
|
78
|
+
* Existing project teams are seeded with ROLES only, so a brand-new granular
|
|
79
|
+
* permission is held by literally nobody on the day it ships; a list containing
|
|
80
|
+
* only EditProjectUserNotificationRule would leave the feature dead on arrival
|
|
81
|
+
* for every project that already exists.
|
|
82
|
+
*
|
|
83
|
+
* Note the asymmetry with the seven notification-method models this rule points
|
|
84
|
+
* at (UserEmail, UserSMS, UserCall, UserPush, UserWhatsApp, UserTelegram,
|
|
85
|
+
* UserWebhook). There, only `read` is widened. An administrator may see which
|
|
86
|
+
* methods a member has and repair the rules that route to them, but may never
|
|
87
|
+
* create or edit a method on somebody else's behalf. Letting them would hand
|
|
88
|
+
* any administrator a paging-hijack primitive - add a phone number or webhook
|
|
89
|
+
* you control, point the victim's rules at it, and their pages arrive at your
|
|
90
|
+
* device - and it would not even solve the problem it appears to solve, because
|
|
91
|
+
* a member with no methods needs to verify a device THEY own. The lever for
|
|
92
|
+
* that case is a reminder, not a keyboard.
|
|
93
|
+
*/
|
|
30
94
|
@TenantColumn("projectId")
|
|
31
95
|
@TableAccessControl({
|
|
32
|
-
create: [Permission.CurrentUser],
|
|
33
|
-
read: [Permission.CurrentUser],
|
|
34
|
-
delete: [Permission.CurrentUser],
|
|
35
|
-
update: [Permission.CurrentUser],
|
|
96
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
97
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
98
|
+
delete: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
99
|
+
update: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
36
100
|
})
|
|
37
101
|
@CrudApiEndpoint(new Route("/user-notification-rule"))
|
|
38
102
|
@Entity({
|
|
@@ -47,9 +111,15 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
|
47
111
|
})
|
|
48
112
|
@CurrentUserCanAccessRecordBy("userId")
|
|
49
113
|
class UserNotificationRule extends BaseModel {
|
|
114
|
+
/*
|
|
115
|
+
* Writable at create, readable by an administrator, and permanently frozen
|
|
116
|
+
* afterwards - see the essay on `userId` below, which applies to this column
|
|
117
|
+
* for the same reason. A rule that could be moved between projects would
|
|
118
|
+
* escape the tenant scope it was created under.
|
|
119
|
+
*/
|
|
50
120
|
@ColumnAccessControl({
|
|
51
|
-
create: [Permission.CurrentUser],
|
|
52
|
-
read: [Permission.CurrentUser],
|
|
121
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
122
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
53
123
|
update: [],
|
|
54
124
|
})
|
|
55
125
|
@TableColumn({
|
|
@@ -73,9 +143,13 @@ class UserNotificationRule extends BaseModel {
|
|
|
73
143
|
@JoinColumn({ name: "projectId" })
|
|
74
144
|
public project?: Project = undefined;
|
|
75
145
|
|
|
146
|
+
/*
|
|
147
|
+
* update: [] - deliberately, and not merely inherited from the shape this
|
|
148
|
+
* model had before administrators could touch it. See `userId`.
|
|
149
|
+
*/
|
|
76
150
|
@ColumnAccessControl({
|
|
77
|
-
create: [Permission.CurrentUser],
|
|
78
|
-
read: [Permission.CurrentUser],
|
|
151
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
152
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
79
153
|
update: [],
|
|
80
154
|
})
|
|
81
155
|
@Index()
|
|
@@ -94,9 +168,17 @@ class UserNotificationRule extends BaseModel {
|
|
|
94
168
|
})
|
|
95
169
|
public projectId?: ObjectID = undefined;
|
|
96
170
|
|
|
171
|
+
/*
|
|
172
|
+
* The rule type, together with the severity relations further down, is the
|
|
173
|
+
* ADDRESS of this rule - the cell in the grid it occupies. Changing it would
|
|
174
|
+
* silently move a rule from one cell to another, which reads as an edit but
|
|
175
|
+
* behaves as a delete plus a create, so it stays create-only for everybody.
|
|
176
|
+
* An administrator repairing a member's setup adds and removes rules; they do
|
|
177
|
+
* not slide an existing one sideways.
|
|
178
|
+
*/
|
|
97
179
|
@ColumnAccessControl({
|
|
98
|
-
create: [Permission.CurrentUser],
|
|
99
|
-
read: [Permission.CurrentUser],
|
|
180
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
181
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
100
182
|
update: [],
|
|
101
183
|
})
|
|
102
184
|
@TableColumn({
|
|
@@ -115,9 +197,17 @@ class UserNotificationRule extends BaseModel {
|
|
|
115
197
|
})
|
|
116
198
|
public ruleType?: NotificationRuleType = undefined;
|
|
117
199
|
|
|
200
|
+
/*
|
|
201
|
+
* The relation spelling of the ownership column. It is `update: []` for the
|
|
202
|
+
* same reason `userId` is, and it has to be stated separately because the two
|
|
203
|
+
* are different decorated members over one physical column: an update
|
|
204
|
+
* expressed as `user: { _id }` is resolved by TypeORM to the same join column
|
|
205
|
+
* that `userId` writes. Closing one spelling and leaving the other open would
|
|
206
|
+
* close nothing at all.
|
|
207
|
+
*/
|
|
118
208
|
@ColumnAccessControl({
|
|
119
|
-
create: [Permission.CurrentUser],
|
|
120
|
-
read: [Permission.CurrentUser],
|
|
209
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
210
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
121
211
|
update: [],
|
|
122
212
|
})
|
|
123
213
|
@TableColumn({
|
|
@@ -141,9 +231,40 @@ class UserNotificationRule extends BaseModel {
|
|
|
141
231
|
@JoinColumn({ name: "userId" })
|
|
142
232
|
public user?: User = undefined;
|
|
143
233
|
|
|
234
|
+
/*
|
|
235
|
+
* READ THIS BEFORE WIDENING `update` HERE.
|
|
236
|
+
*
|
|
237
|
+
* This column is the ownership column - the one @CurrentUserCanAccessRecordBy
|
|
238
|
+
* points at, and therefore the one that decides whose pages this rule is
|
|
239
|
+
* consulted for. It is writable at CREATE, because provisioning a rule on
|
|
240
|
+
* behalf of a member who has none is the entire point of the administrator
|
|
241
|
+
* capability; it is writable at UPDATE by nobody, including the
|
|
242
|
+
* administrators who may otherwise rewrite every other field on the row.
|
|
243
|
+
*
|
|
244
|
+
* The temptation to mirror the widened lists onto this column is strong and
|
|
245
|
+
* wrong. An administrator who can re-point an EXISTING rule's userId does not
|
|
246
|
+
* gain a convenience, they gain a paging hijack: take a rule that already
|
|
247
|
+
* points at their own verified phone, move its userId to a colleague, and the
|
|
248
|
+
* colleague's pages now ring the administrator's handset - or take the
|
|
249
|
+
* colleague's rule and hand it to themselves. Nothing about that is
|
|
250
|
+
* distinguishable from a legitimate edit at the row level, and it is exactly
|
|
251
|
+
* the hole the create-side ownership gate was written to close
|
|
252
|
+
* (Common/Server/Types/Database/Permissions/CreatePermission.ts), reopened
|
|
253
|
+
* through a different verb.
|
|
254
|
+
*
|
|
255
|
+
* Create is safe by comparison only because it is guarded: the create gate
|
|
256
|
+
* defers to a real role permission rather than stamping the caller, and the
|
|
257
|
+
* service layer verifies that the supplied userId is a member of
|
|
258
|
+
* props.tenantId before the row is written. A rule pointed at a stranger from
|
|
259
|
+
* another project is refused there, not here.
|
|
260
|
+
*
|
|
261
|
+
* The correct way for an administrator to move a rule to a different member is
|
|
262
|
+
* to delete it and create another. That leaves two audit events instead of a
|
|
263
|
+
* silent mutation, which is the behaviour we want.
|
|
264
|
+
*/
|
|
144
265
|
@ColumnAccessControl({
|
|
145
|
-
create: [Permission.CurrentUser],
|
|
146
|
-
read: [Permission.CurrentUser],
|
|
266
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
267
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
147
268
|
update: [],
|
|
148
269
|
})
|
|
149
270
|
@TableColumn({
|
|
@@ -160,9 +281,16 @@ class UserNotificationRule extends BaseModel {
|
|
|
160
281
|
@Index()
|
|
161
282
|
public userId?: ObjectID = undefined;
|
|
162
283
|
|
|
284
|
+
/*
|
|
285
|
+
* Read is widened but create is not, because this column is stamped
|
|
286
|
+
* server-side from props.userId after the permission checks have run and is
|
|
287
|
+
* never accepted from a request body. Widening the read matters for a reason
|
|
288
|
+
* beyond completeness: it is what lets a member see that a rule on their own
|
|
289
|
+
* account was written by an administrator rather than by themselves.
|
|
290
|
+
*/
|
|
163
291
|
@ColumnAccessControl({
|
|
164
292
|
create: [Permission.CurrentUser],
|
|
165
|
-
read: [Permission.CurrentUser],
|
|
293
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
166
294
|
update: [],
|
|
167
295
|
})
|
|
168
296
|
@TableColumn({
|
|
@@ -189,7 +317,7 @@ class UserNotificationRule extends BaseModel {
|
|
|
189
317
|
|
|
190
318
|
@ColumnAccessControl({
|
|
191
319
|
create: [Permission.CurrentUser],
|
|
192
|
-
read: [Permission.CurrentUser],
|
|
320
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
193
321
|
update: [],
|
|
194
322
|
})
|
|
195
323
|
@TableColumn({
|
|
@@ -253,8 +381,64 @@ class UserNotificationRule extends BaseModel {
|
|
|
253
381
|
})
|
|
254
382
|
public deletedByUserId?: ObjectID = undefined;
|
|
255
383
|
|
|
384
|
+
/*
|
|
385
|
+
* THE SEVEN METHOD RELATIONS BELOW ARE THE MOST DANGEROUS COLUMNS ON THIS
|
|
386
|
+
* MODEL. What follows applies to every one of them - userCall, userPush,
|
|
387
|
+
* userSms, userWhatsApp, userTelegram, userWebhook and userEmail, in both
|
|
388
|
+
* their relation and their `*Id` spelling - and is written out once here
|
|
389
|
+
* rather than fourteen times.
|
|
390
|
+
*
|
|
391
|
+
* A rule is a pair: the ownership column decides WHOSE pages select the row,
|
|
392
|
+
* and the method relation decides WHERE those pages are delivered. The two
|
|
393
|
+
* halves are read from different tables and nothing in the schema requires
|
|
394
|
+
* them to agree. A row owned by a victim and pointing at an administrator's
|
|
395
|
+
* own webhook or email is perfectly well-formed, and it silently redirects the
|
|
396
|
+
* victim's pages to the administrator's device. That is the whole hijack, and
|
|
397
|
+
* it needs no other bug to work.
|
|
398
|
+
*
|
|
399
|
+
* The `*Id` columns are open to UPDATE because repairing a member's routing is
|
|
400
|
+
* the capability this phase exists to provide: "your rules point at an email
|
|
401
|
+
* you never verified" is only actionable if somebody can re-point them at one
|
|
402
|
+
* the member did verify. But THIS ACCESS CONTROL LIST IS NOT WHAT MAKES THAT
|
|
403
|
+
* SAFE. A column list answers "may this caller write this column at all"; it
|
|
404
|
+
* never sees the VALUE being written, so it cannot tell a repair from a
|
|
405
|
+
* redirect.
|
|
406
|
+
*
|
|
407
|
+
* What makes it safe is a service-layer assertion: whenever one of these FKs
|
|
408
|
+
* is written, on create or on update, the referenced method row must belong to
|
|
409
|
+
* the same user as the rule's own userId - and on update that userId is
|
|
410
|
+
* re-read from the database rather than taken from the request body, because
|
|
411
|
+
* the body is exactly what an attacker controls. DO NOT REMOVE THAT ASSERTION
|
|
412
|
+
* BELIEVING THIS DECORATOR COVERS IT. It does not, and the failure is silent:
|
|
413
|
+
* everything keeps working, pages just start arriving somewhere else.
|
|
414
|
+
*
|
|
415
|
+
* The relation spellings stay `update: []` while the `*Id` spellings open.
|
|
416
|
+
* That is not an oversight. They are two decorated members over one physical
|
|
417
|
+
* join column, so leaving both writable would give the same hijack two
|
|
418
|
+
* different shapes to arrive in, and the ownership assertion would have to
|
|
419
|
+
* recognise both to be complete. One spelling in, one spelling out, and the
|
|
420
|
+
* check has exactly one form to validate.
|
|
421
|
+
*/
|
|
422
|
+
/*
|
|
423
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
424
|
+
*
|
|
425
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
426
|
+
* method models was meant to close, by a different route. A read of this
|
|
427
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
428
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
429
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
430
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
431
|
+
* authenticated caller. So `select: { userCall: { phone: true } }` on somebody
|
|
432
|
+
* else's rule would hand back their raw phone number with no row scope
|
|
433
|
+
* anywhere in the path.
|
|
434
|
+
*
|
|
435
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
436
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
437
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
438
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
439
|
+
*/
|
|
256
440
|
@ColumnAccessControl({
|
|
257
|
-
create: [Permission.CurrentUser],
|
|
441
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
258
442
|
read: [Permission.CurrentUser],
|
|
259
443
|
update: [],
|
|
260
444
|
})
|
|
@@ -279,10 +463,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
279
463
|
@JoinColumn({ name: "userCallId" })
|
|
280
464
|
public userCall?: UserCall = undefined;
|
|
281
465
|
|
|
466
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
282
467
|
@ColumnAccessControl({
|
|
283
|
-
create: [Permission.CurrentUser],
|
|
284
|
-
read: [Permission.CurrentUser],
|
|
285
|
-
update: [],
|
|
468
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
469
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
470
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
286
471
|
})
|
|
287
472
|
@Index()
|
|
288
473
|
@TableColumn({
|
|
@@ -300,8 +485,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
300
485
|
})
|
|
301
486
|
public userCallId?: ObjectID = undefined;
|
|
302
487
|
|
|
488
|
+
/*
|
|
489
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
490
|
+
*
|
|
491
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
492
|
+
* method models was meant to close, by a different route. A read of this
|
|
493
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
494
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
495
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
496
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
497
|
+
* authenticated caller. So `select: { userPush: { deviceToken: true } }` on somebody
|
|
498
|
+
* else's rule would hand back their raw device token with no row scope
|
|
499
|
+
* anywhere in the path.
|
|
500
|
+
*
|
|
501
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
502
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
503
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
504
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
505
|
+
*/
|
|
303
506
|
@ColumnAccessControl({
|
|
304
|
-
create: [Permission.CurrentUser],
|
|
507
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
305
508
|
read: [Permission.CurrentUser],
|
|
306
509
|
update: [],
|
|
307
510
|
})
|
|
@@ -326,10 +529,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
326
529
|
@JoinColumn({ name: "userPushId" })
|
|
327
530
|
public userPush?: UserPush = undefined;
|
|
328
531
|
|
|
532
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
329
533
|
@ColumnAccessControl({
|
|
330
|
-
create: [Permission.CurrentUser],
|
|
331
|
-
read: [Permission.CurrentUser],
|
|
332
|
-
update: [],
|
|
534
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
535
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
536
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
333
537
|
})
|
|
334
538
|
@Index()
|
|
335
539
|
@TableColumn({
|
|
@@ -347,8 +551,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
347
551
|
})
|
|
348
552
|
public userPushId?: ObjectID = undefined;
|
|
349
553
|
|
|
554
|
+
/*
|
|
555
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
556
|
+
*
|
|
557
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
558
|
+
* method models was meant to close, by a different route. A read of this
|
|
559
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
560
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
561
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
562
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
563
|
+
* authenticated caller. So `select: { userSms: { phone: true } }` on somebody
|
|
564
|
+
* else's rule would hand back their raw phone number with no row scope
|
|
565
|
+
* anywhere in the path.
|
|
566
|
+
*
|
|
567
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
568
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
569
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
570
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
571
|
+
*/
|
|
350
572
|
@ColumnAccessControl({
|
|
351
|
-
create: [Permission.CurrentUser],
|
|
573
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
352
574
|
read: [Permission.CurrentUser],
|
|
353
575
|
update: [],
|
|
354
576
|
})
|
|
@@ -373,10 +595,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
373
595
|
@JoinColumn({ name: "userSmsId" })
|
|
374
596
|
public userSms?: UserSMS = undefined;
|
|
375
597
|
|
|
598
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
376
599
|
@ColumnAccessControl({
|
|
377
|
-
create: [Permission.CurrentUser],
|
|
378
|
-
read: [Permission.CurrentUser],
|
|
379
|
-
update: [],
|
|
600
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
601
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
602
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
380
603
|
})
|
|
381
604
|
@Index()
|
|
382
605
|
@TableColumn({
|
|
@@ -394,8 +617,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
394
617
|
})
|
|
395
618
|
public userSmsId?: ObjectID = undefined;
|
|
396
619
|
|
|
620
|
+
/*
|
|
621
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
622
|
+
*
|
|
623
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
624
|
+
* method models was meant to close, by a different route. A read of this
|
|
625
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
626
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
627
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
628
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
629
|
+
* authenticated caller. So `select: { userWhatsApp: { phone: true } }` on somebody
|
|
630
|
+
* else's rule would hand back their raw phone number with no row scope
|
|
631
|
+
* anywhere in the path.
|
|
632
|
+
*
|
|
633
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
634
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
635
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
636
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
637
|
+
*/
|
|
397
638
|
@ColumnAccessControl({
|
|
398
|
-
create: [Permission.CurrentUser],
|
|
639
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
399
640
|
read: [Permission.CurrentUser],
|
|
400
641
|
update: [],
|
|
401
642
|
})
|
|
@@ -421,10 +662,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
421
662
|
@JoinColumn({ name: "userWhatsAppId" })
|
|
422
663
|
public userWhatsApp?: UserWhatsApp = undefined;
|
|
423
664
|
|
|
665
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
424
666
|
@ColumnAccessControl({
|
|
425
|
-
create: [Permission.CurrentUser],
|
|
426
|
-
read: [Permission.CurrentUser],
|
|
427
|
-
update: [],
|
|
667
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
668
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
669
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
428
670
|
})
|
|
429
671
|
@Index()
|
|
430
672
|
@TableColumn({
|
|
@@ -442,8 +684,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
442
684
|
})
|
|
443
685
|
public userWhatsAppId?: ObjectID = undefined;
|
|
444
686
|
|
|
687
|
+
/*
|
|
688
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
689
|
+
*
|
|
690
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
691
|
+
* method models was meant to close, by a different route. A read of this
|
|
692
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
693
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
694
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
695
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
696
|
+
* authenticated caller. So `select: { userTelegram: { telegramChatId: true } }` on somebody
|
|
697
|
+
* else's rule would hand back their raw Telegram chat id with no row scope
|
|
698
|
+
* anywhere in the path.
|
|
699
|
+
*
|
|
700
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
701
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
702
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
703
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
704
|
+
*/
|
|
445
705
|
@ColumnAccessControl({
|
|
446
|
-
create: [Permission.CurrentUser],
|
|
706
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
447
707
|
read: [Permission.CurrentUser],
|
|
448
708
|
update: [],
|
|
449
709
|
})
|
|
@@ -469,10 +729,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
469
729
|
@JoinColumn({ name: "userTelegramId" })
|
|
470
730
|
public userTelegram?: UserTelegram = undefined;
|
|
471
731
|
|
|
732
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
472
733
|
@ColumnAccessControl({
|
|
473
|
-
create: [Permission.CurrentUser],
|
|
474
|
-
read: [Permission.CurrentUser],
|
|
475
|
-
update: [],
|
|
734
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
735
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
736
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
476
737
|
})
|
|
477
738
|
@Index()
|
|
478
739
|
@TableColumn({
|
|
@@ -490,8 +751,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
490
751
|
})
|
|
491
752
|
public userTelegramId?: ObjectID = undefined;
|
|
492
753
|
|
|
754
|
+
/*
|
|
755
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
756
|
+
*
|
|
757
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
758
|
+
* method models was meant to close, by a different route. A read of this
|
|
759
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
760
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
761
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
762
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
763
|
+
* authenticated caller. So `select: { userWebhook: { webhookUrl: true } }` on somebody
|
|
764
|
+
* else's rule would hand back their raw webhook URL with no row scope
|
|
765
|
+
* anywhere in the path.
|
|
766
|
+
*
|
|
767
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
768
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
769
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
770
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
771
|
+
*/
|
|
493
772
|
@ColumnAccessControl({
|
|
494
|
-
create: [Permission.CurrentUser],
|
|
773
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
495
774
|
read: [Permission.CurrentUser],
|
|
496
775
|
update: [],
|
|
497
776
|
})
|
|
@@ -517,10 +796,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
517
796
|
@JoinColumn({ name: "userWebhookId" })
|
|
518
797
|
public userWebhook?: UserWebhook = undefined;
|
|
519
798
|
|
|
799
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
520
800
|
@ColumnAccessControl({
|
|
521
|
-
create: [Permission.CurrentUser],
|
|
522
|
-
read: [Permission.CurrentUser],
|
|
523
|
-
update: [],
|
|
801
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
802
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
803
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
524
804
|
})
|
|
525
805
|
@Index()
|
|
526
806
|
@TableColumn({
|
|
@@ -538,8 +818,26 @@ class UserNotificationRule extends BaseModel {
|
|
|
538
818
|
})
|
|
539
819
|
public userWebhookId?: ObjectID = undefined;
|
|
540
820
|
|
|
821
|
+
/*
|
|
822
|
+
* READ IS OWNER-ONLY ON THE RELATION, EVEN THOUGH THIS TABLE IS ADMIN-READABLE.
|
|
823
|
+
*
|
|
824
|
+
* Widening the relation would re-open the exposure that reverting the seven
|
|
825
|
+
* method models was meant to close, by a different route. A read of this
|
|
826
|
+
* table is NOT pinned to the caller's own rows for an administrator - that is
|
|
827
|
+
* the whole point of the phase - and QueryPermission.checkRelationQueryPermission
|
|
828
|
+
* authorises each nested field with relatedModel.hasReadPermissions, a
|
|
829
|
+
* name-intersection in which Permission.CurrentUser is auto-granted to every
|
|
830
|
+
* authenticated caller. So `select: { userEmail: { email: true } }` on somebody
|
|
831
|
+
* else's rule would hand back their raw email address with no row scope
|
|
832
|
+
* anywhere in the path.
|
|
833
|
+
*
|
|
834
|
+
* The FK below stays admin-readable: an id is not sensitive, and it is what
|
|
835
|
+
* correlates a rule with the masked entry in OnCallReadinessService's
|
|
836
|
+
* ReadinessMethod { methodId, methodType, maskedIdentifier, isVerified }.
|
|
837
|
+
* That masked payload is the administrator's sanctioned view of a method.
|
|
838
|
+
*/
|
|
541
839
|
@ColumnAccessControl({
|
|
542
|
-
create: [Permission.CurrentUser],
|
|
840
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
543
841
|
read: [Permission.CurrentUser],
|
|
544
842
|
update: [],
|
|
545
843
|
})
|
|
@@ -564,10 +862,11 @@ class UserNotificationRule extends BaseModel {
|
|
|
564
862
|
@JoinColumn({ name: "userEmailId" })
|
|
565
863
|
public userEmail?: UserEmail = undefined;
|
|
566
864
|
|
|
865
|
+
// Re-pointable by an administrator. Read the essay above `userCall` first.
|
|
567
866
|
@ColumnAccessControl({
|
|
568
|
-
create: [Permission.CurrentUser],
|
|
569
|
-
read: [Permission.CurrentUser],
|
|
570
|
-
update: [],
|
|
867
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
868
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
869
|
+
update: [...ADMIN_WRITE_PERMISSIONS],
|
|
571
870
|
})
|
|
572
871
|
@Index()
|
|
573
872
|
@TableColumn({
|
|
@@ -585,10 +884,18 @@ class UserNotificationRule extends BaseModel {
|
|
|
585
884
|
})
|
|
586
885
|
public userEmailId?: ObjectID = undefined;
|
|
587
886
|
|
|
887
|
+
/*
|
|
888
|
+
* The escalation delay, and one of only two plain preference columns an
|
|
889
|
+
* administrator may rewrite. It is here rather than frozen because "you are
|
|
890
|
+
* on the escalation policy but your first rule waits thirty minutes" is a
|
|
891
|
+
* real, common misconfiguration, and correcting a number carries none of the
|
|
892
|
+
* redirect risk the method relations do - the page still goes to the same
|
|
893
|
+
* place, it just goes sooner.
|
|
894
|
+
*/
|
|
588
895
|
@ColumnAccessControl({
|
|
589
|
-
create: [Permission.CurrentUser],
|
|
590
|
-
read: [Permission.CurrentUser],
|
|
591
|
-
update: [Permission.CurrentUser],
|
|
896
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
897
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
898
|
+
update: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
592
899
|
})
|
|
593
900
|
@Index()
|
|
594
901
|
@TableColumn({
|
|
@@ -608,9 +915,12 @@ class UserNotificationRule extends BaseModel {
|
|
|
608
915
|
})
|
|
609
916
|
public notifyAfterMinutes?: number = undefined;
|
|
610
917
|
|
|
918
|
+
/*
|
|
919
|
+
* Part of the rule's address, like `ruleType` - create-only for everybody.
|
|
920
|
+
*/
|
|
611
921
|
@ColumnAccessControl({
|
|
612
|
-
create: [Permission.CurrentUser],
|
|
613
|
-
read: [Permission.CurrentUser],
|
|
922
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
923
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
614
924
|
update: [],
|
|
615
925
|
})
|
|
616
926
|
@TableColumn({
|
|
@@ -636,8 +946,8 @@ class UserNotificationRule extends BaseModel {
|
|
|
636
946
|
public incidentSeverity?: IncidentSeverity = undefined;
|
|
637
947
|
|
|
638
948
|
@ColumnAccessControl({
|
|
639
|
-
create: [Permission.CurrentUser],
|
|
640
|
-
read: [Permission.CurrentUser],
|
|
949
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
950
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
641
951
|
update: [],
|
|
642
952
|
})
|
|
643
953
|
@Index()
|
|
@@ -659,8 +969,8 @@ class UserNotificationRule extends BaseModel {
|
|
|
659
969
|
// alert severity.
|
|
660
970
|
|
|
661
971
|
@ColumnAccessControl({
|
|
662
|
-
create: [Permission.CurrentUser],
|
|
663
|
-
read: [Permission.CurrentUser],
|
|
972
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
973
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
664
974
|
update: [],
|
|
665
975
|
})
|
|
666
976
|
@TableColumn({
|
|
@@ -686,8 +996,8 @@ class UserNotificationRule extends BaseModel {
|
|
|
686
996
|
public alertSeverity?: AlertSeverity = undefined;
|
|
687
997
|
|
|
688
998
|
@ColumnAccessControl({
|
|
689
|
-
create: [Permission.CurrentUser],
|
|
690
|
-
read: [Permission.CurrentUser],
|
|
999
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
1000
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
691
1001
|
update: [],
|
|
692
1002
|
})
|
|
693
1003
|
@Index()
|
|
@@ -705,6 +1015,66 @@ class UserNotificationRule extends BaseModel {
|
|
|
705
1015
|
transformer: ObjectID.getDatabaseTransformer(),
|
|
706
1016
|
})
|
|
707
1017
|
public alertSeverityId?: ObjectID = undefined;
|
|
1018
|
+
|
|
1019
|
+
/*
|
|
1020
|
+
* An opt-out row is a rule that exists in order to send nothing. It carries a
|
|
1021
|
+
* `ruleType` and a severity exactly like a normal rule, sets `isOptOut` to true, and
|
|
1022
|
+
* holds NO notification-method relation at all — there is no userEmail, userSms,
|
|
1023
|
+
* userCall, userPush, userWhatsApp, userTelegram or userWebhook on it, and that
|
|
1024
|
+
* absence is the point rather than a misconfiguration.
|
|
1025
|
+
*
|
|
1026
|
+
* It exists because "this user has zero rules matching this ruleType and severity" is
|
|
1027
|
+
* otherwise two completely different situations wearing the same clothes. Almost
|
|
1028
|
+
* always it means the user never configured anything for that cell — a severity added
|
|
1029
|
+
* after they joined, an episode rule type they never opened the page for — and a page
|
|
1030
|
+
* routed to them must still land somewhere. Occasionally it means the user genuinely
|
|
1031
|
+
* asked not to be woken for that cell, and paging them anyway would be the bug.
|
|
1032
|
+
*
|
|
1033
|
+
* Before this column the runtime could not tell those apart, so it chose the safe-
|
|
1034
|
+
* looking option and delivered nothing, which is how pages were being lost silently.
|
|
1035
|
+
* Making deliberate silence expressible as a row is the precondition for the fallback:
|
|
1036
|
+
* once "do not page me" has somewhere to live, the remaining zero-row cases can be
|
|
1037
|
+
* treated as misconfiguration and rescued by notifying the user on whatever verified
|
|
1038
|
+
* method they do have.
|
|
1039
|
+
*
|
|
1040
|
+
* Note the `update` permission below. Every column on this model except
|
|
1041
|
+
* `notifyAfterMinutes` is `update: []`, so copying a neighbour's access control would
|
|
1042
|
+
* have left this flag writable only at create time — a user could opt out but never
|
|
1043
|
+
* opt back in without deleting and recreating the row. Muting and unmuting is exactly
|
|
1044
|
+
* the kind of preference that gets toggled, so it is explicitly updatable by its owner.
|
|
1045
|
+
*
|
|
1046
|
+
* An administrator may toggle it too, and that deserves a word because it looks
|
|
1047
|
+
* like the one place where the admin capability could be used to silence somebody.
|
|
1048
|
+
* It could - but an administrator who wanted a colleague unpageable has a far
|
|
1049
|
+
* blunter tool available in the same breath, which is to delete their rules
|
|
1050
|
+
* outright, and that is a capability nobody proposes withholding. The reason
|
|
1051
|
+
* this direction matters more is the opposite one: a member who opted out of a
|
|
1052
|
+
* severity months ago and forgot is precisely the invisible gap this phase
|
|
1053
|
+
* exists to close, and leaving an administrator able to SEE the opt-out but not
|
|
1054
|
+
* lift it would stop one step short of the fix. Both directions are audited
|
|
1055
|
+
* against props.userId, so a suppression an administrator made is attributable.
|
|
1056
|
+
*/
|
|
1057
|
+
@ColumnAccessControl({
|
|
1058
|
+
create: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
1059
|
+
read: [Permission.CurrentUser, ...ADMIN_READ_PERMISSIONS],
|
|
1060
|
+
update: [Permission.CurrentUser, ...ADMIN_WRITE_PERMISSIONS],
|
|
1061
|
+
})
|
|
1062
|
+
@TableColumn({
|
|
1063
|
+
type: TableColumnType.Boolean,
|
|
1064
|
+
required: false,
|
|
1065
|
+
isDefaultValueColumn: true,
|
|
1066
|
+
title: "Opt Out of Notifications",
|
|
1067
|
+
description:
|
|
1068
|
+
"When true, this rule deliberately suppresses notifications for its rule type and severity instead of delivering any. A rule with this set carries no notification method.",
|
|
1069
|
+
defaultValue: false,
|
|
1070
|
+
example: false,
|
|
1071
|
+
})
|
|
1072
|
+
@Column({
|
|
1073
|
+
type: ColumnType.Boolean,
|
|
1074
|
+
nullable: true,
|
|
1075
|
+
default: false,
|
|
1076
|
+
})
|
|
1077
|
+
public isOptOut?: boolean = undefined;
|
|
708
1078
|
}
|
|
709
1079
|
|
|
710
1080
|
export default UserNotificationRule;
|