@oneuptime/common 12.0.7 → 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.
Files changed (873) hide show
  1. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +1 -1
  2. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +1 -1
  3. package/Models/DatabaseModels/AIConversation.ts +32 -0
  4. package/Models/DatabaseModels/AIConversationMessage.ts +41 -0
  5. package/Models/DatabaseModels/AlertEpisodeMember.ts +27 -0
  6. package/Models/DatabaseModels/IncidentEpisodeMember.ts +28 -0
  7. package/Models/DatabaseModels/Index.ts +12 -4
  8. package/Models/DatabaseModels/{TelemetryEntity.ts → InventoryItem.ts} +184 -9
  9. package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
  10. package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +33 -7
  11. package/Models/DatabaseModels/NetworkDevice.ts +141 -0
  12. package/Models/DatabaseModels/NetworkDeviceLink.ts +699 -0
  13. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +467 -0
  14. package/Models/DatabaseModels/NetworkTopologySuppression.ts +429 -0
  15. package/Models/DatabaseModels/OnCallDutyPolicyFeed.ts +9 -0
  16. package/Models/DatabaseModels/Project.ts +78 -0
  17. package/Models/DatabaseModels/UserCall.ts +42 -0
  18. package/Models/DatabaseModels/UserEmail.ts +44 -0
  19. package/Models/DatabaseModels/UserNotificationRule.ts +425 -55
  20. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +24 -2
  21. package/Models/DatabaseModels/UserPush.ts +49 -0
  22. package/Models/DatabaseModels/UserSMS.ts +43 -0
  23. package/Models/DatabaseModels/UserTelegram.ts +59 -0
  24. package/Models/DatabaseModels/UserWebhook.ts +52 -0
  25. package/Models/DatabaseModels/UserWhatsApp.ts +41 -0
  26. package/Models/DatabaseModels/WorkflowLog.ts +38 -0
  27. package/Models/DatabaseModels/WorkflowVariable.ts +12 -0
  28. package/Server/API/AIChatAPI.ts +315 -1
  29. package/Server/API/DashboardAPI.ts +217 -1
  30. package/Server/API/OnCallReadinessAPI.ts +841 -0
  31. package/Server/API/TeamComplianceAPI.ts +69 -17
  32. package/Server/API/TelemetryAPI.ts +220 -12
  33. package/Server/API/UserAPI.ts +16 -1
  34. package/Server/EnvironmentConfig.ts +52 -0
  35. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +22 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +4 -4
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +5 -5
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.ts +35 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.ts +82 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.ts +91 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.ts +47 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.ts +255 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.ts +107 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.ts +90 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.ts +39 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.ts +33 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.ts +59 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +24 -0
  51. package/Server/Infrastructure/Queue.ts +78 -13
  52. package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
  53. package/Server/Middleware/PublicDashboardRateLimit.ts +593 -0
  54. package/Server/Services/AIService.ts +7 -0
  55. package/Server/Services/AlertEpisodeStateTimelineService.ts +29 -0
  56. package/Server/Services/AlertSeverityService.ts +63 -0
  57. package/Server/Services/DashboardService.ts +9 -10
  58. package/Server/Services/DatabaseService.ts +32 -2
  59. package/Server/Services/IncidentEpisodeStateTimelineService.ts +29 -0
  60. package/Server/Services/IncidentSeverityService.ts +76 -0
  61. package/Server/Services/Index.ts +12 -4
  62. package/Server/Services/InventoryItemCustomFieldService.ts +9 -0
  63. package/Server/Services/{TelemetryEntityRelationshipService.ts → InventoryItemRelationshipService.ts} +7 -4
  64. package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +203 -21
  65. package/Server/Services/LogAggregationService.ts +45 -8
  66. package/Server/Services/MetricAggregationService.ts +121 -0
  67. package/Server/Services/MetricService.ts +7 -7
  68. package/Server/Services/NetworkDeviceLinkRuleService.ts +10 -0
  69. package/Server/Services/NetworkDeviceLinkService.ts +84 -0
  70. package/Server/Services/NetworkDeviceService.ts +140 -0
  71. package/Server/Services/NetworkSiteService.ts +77 -25
  72. package/Server/Services/NetworkTopologySuppressionService.ts +84 -0
  73. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +41 -29
  74. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +8 -0
  75. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +62 -13
  76. package/Server/Services/OnCallDutyPolicyScheduleService.ts +61 -1
  77. package/Server/Services/OnCallNotificationAlertingService.ts +742 -0
  78. package/Server/Services/OnCallReadinessService.ts +2803 -0
  79. package/Server/Services/OnCallSetupReminderService.ts +955 -0
  80. package/Server/Services/ProfileAggregationService.ts +123 -0
  81. package/Server/Services/StatusPageService.ts +9 -10
  82. package/Server/Services/TeamComplianceService.ts +429 -252
  83. package/Server/Services/UserCallService.ts +26 -1
  84. package/Server/Services/UserEmailService.ts +26 -1
  85. package/Server/Services/UserNotificationRuleAdminService.ts +1183 -0
  86. package/Server/Services/UserNotificationRuleService.ts +3812 -333
  87. package/Server/Services/UserOnCallLogService.ts +561 -48
  88. package/Server/Services/UserPushService.ts +29 -0
  89. package/Server/Services/UserService.ts +11 -0
  90. package/Server/Services/UserSmsService.ts +26 -1
  91. package/Server/Services/UserTelegramService.ts +24 -1
  92. package/Server/Services/UserWebhookService.ts +28 -1
  93. package/Server/Services/UserWhatsAppService.ts +24 -1
  94. package/Server/Types/Database/Permissions/BasePermission.ts +19 -0
  95. package/Server/Types/Database/Permissions/CreatePermission.ts +164 -0
  96. package/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.ts +340 -0
  97. package/Server/Types/Database/Permissions/QueryPermission.ts +48 -0
  98. package/Server/Types/Database/Permissions/TenantPermission.ts +8 -1
  99. package/Server/Types/Workflow/Components/API/Delete.ts +1 -1
  100. package/Server/Types/Workflow/Components/API/Get.ts +1 -1
  101. package/Server/Types/Workflow/Components/API/Patch.ts +1 -1
  102. package/Server/Types/Workflow/Components/API/Post.ts +1 -1
  103. package/Server/Types/Workflow/Components/API/Put.ts +1 -1
  104. package/Server/Types/Workflow/Components/API/Utils.ts +44 -1
  105. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +29 -5
  106. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +18 -10
  107. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +55 -0
  108. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +3 -17
  109. package/Server/Types/Workflow/Components/Email.ts +25 -7
  110. package/Server/Types/Workflow/Components/JavaScript.ts +10 -3
  111. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +1 -1
  112. package/Server/Types/Workflow/TriggerCode.ts +12 -0
  113. package/Server/Types/Workflow/Workflow.ts +5 -0
  114. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +643 -48
  115. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +32 -3
  116. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +20 -6
  117. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +7 -0
  118. package/Server/Utils/AI/Toolbox/AIActionTools.ts +2 -2
  119. package/Server/Utils/AI/Toolbox/AIMetaTools.ts +863 -0
  120. package/Server/Utils/AI/Toolbox/AlertTools.ts +177 -15
  121. package/Server/Utils/AI/Toolbox/IncidentTools.ts +191 -10
  122. package/Server/Utils/AI/Toolbox/Index.ts +48 -0
  123. package/Server/Utils/AI/Toolbox/MonitorTools.ts +298 -11
  124. package/Server/Utils/AI/Toolbox/NoteWriteTools.ts +295 -0
  125. package/Server/Utils/AI/Toolbox/OnCallTools.ts +1246 -0
  126. package/Server/Utils/AI/Toolbox/RunbookTools.ts +424 -0
  127. package/Server/Utils/AI/Toolbox/SloTools.ts +456 -0
  128. package/Server/Utils/AI/Toolbox/StatusPageTools.ts +559 -0
  129. package/Server/Utils/AI/Toolbox/TeamTools.ts +327 -0
  130. package/Server/Utils/AI/Toolbox/TimelineTools.ts +615 -0
  131. package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +664 -0
  132. package/Server/Utils/ClientIp.ts +221 -0
  133. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +47 -0
  134. package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +163 -0
  135. package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +147 -0
  136. package/Server/Utils/Express.ts +12 -17
  137. package/Server/Utils/LLM/LLMService.ts +85 -8
  138. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +204 -10
  139. package/Server/Utils/SSRFProtection.ts +98 -23
  140. package/Server/Utils/StartServer.ts +12 -3
  141. package/Server/Utils/Telemetry/EntityRegistry.ts +205 -18
  142. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
  143. package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
  144. package/Server/Utils/VM/VMAPI.ts +56 -8
  145. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +7 -3
  146. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +2146 -0
  147. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +561 -0
  148. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +2470 -0
  149. package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
  150. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +1897 -0
  151. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3606 -0
  152. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +784 -0
  153. package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +1119 -0
  154. package/Tests/App/Dashboard/SloWidgetFetching.test.tsx +531 -0
  155. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +1312 -0
  156. package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +1390 -0
  157. package/Tests/Models/InventoryItemModel.test.ts +174 -0
  158. package/Tests/Models/InventoryItemNaming.test.ts +302 -0
  159. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +437 -0
  160. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +659 -0
  161. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +18 -0
  162. package/Tests/Server/API/DashboardPublicSloAPI.test.ts +880 -0
  163. package/Tests/Server/API/Helpers.ts +24 -15
  164. package/Tests/Server/API/OnCallReadinessAPI.test.ts +2680 -0
  165. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +915 -0
  166. package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
  167. package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +533 -0
  168. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +213 -0
  169. package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +432 -0
  170. package/Tests/Server/Infrastructure/Queue.test.ts +293 -0
  171. package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +1645 -0
  172. package/Tests/Server/Services/AdminRuleEditGuards.test.ts +2848 -0
  173. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1393 -0
  174. package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +1802 -0
  175. package/Tests/Server/Services/EpisodeStateTimelineNote.test.ts +304 -0
  176. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +339 -0
  177. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +248 -0
  178. package/Tests/Server/Services/IpAllowlistSpoofing.test.ts +450 -0
  179. package/Tests/Server/Services/LogAggregationService.test.ts +235 -1
  180. package/Tests/Server/Services/MetricAggregationService.test.ts +231 -0
  181. package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +80 -29
  182. package/Tests/Server/Services/MetricServiceAggregate.test.ts +30 -30
  183. package/Tests/Server/Services/NetworkSiteService.test.ts +18 -3
  184. package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +1728 -0
  185. package/Tests/Server/Services/NotificationDeletionImpact.test.ts +2402 -0
  186. package/Tests/Server/Services/OnCallDutyPolicyExecutionLogTimelineGapFeed.test.ts +394 -0
  187. package/Tests/Server/Services/OnCallNotificationFallback.test.ts +1744 -0
  188. package/Tests/Server/Services/OnCallReadinessService.test.ts +4295 -0
  189. package/Tests/Server/Services/OnCallSetupReminder.test.ts +1272 -0
  190. package/Tests/Server/Services/OnCallWeeklyReadinessDigest.test.ts +1021 -0
  191. package/Tests/Server/Services/ProfileAggregationService.test.ts +296 -0
  192. package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +1536 -0
  193. package/Tests/Server/Services/SeverityRuleBackfill.test.ts +1818 -0
  194. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1845 -0
  195. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +1394 -0
  196. package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +1166 -0
  197. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1468 -0
  198. package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1457 -0
  199. package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +1546 -0
  200. package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +529 -0
  201. package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +1219 -0
  202. package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1089 -0
  203. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +2 -1
  204. package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
  205. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +190 -0
  206. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +44 -14
  207. package/Tests/Server/Types/Workflow/Components/Email.test.ts +151 -0
  208. package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +98 -0
  209. package/Tests/Server/Types/Workflow/Components/JavaScript.test.ts +51 -0
  210. package/Tests/Server/Utils/AI/AIMetaTools.test.ts +586 -0
  211. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +582 -0
  212. package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +726 -0
  213. package/Tests/Server/Utils/AI/IncidentToolsFilters.test.ts +315 -0
  214. package/Tests/Server/Utils/AI/LLMServiceStopReason.test.ts +314 -0
  215. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +26 -3
  216. package/Tests/Server/Utils/AI/NoteWriteTools.test.ts +268 -0
  217. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +169 -0
  218. package/Tests/Server/Utils/AI/OnCallTools.test.ts +664 -0
  219. package/Tests/Server/Utils/AI/RunbookTools.test.ts +325 -0
  220. package/Tests/Server/Utils/AI/SloTools.test.ts +306 -0
  221. package/Tests/Server/Utils/AI/StatusPageTools.test.ts +391 -0
  222. package/Tests/Server/Utils/AI/TeamTools.test.ts +257 -0
  223. package/Tests/Server/Utils/AI/TimelineTools.test.ts +472 -0
  224. package/Tests/Server/Utils/AI/WorkflowProbeTools.test.ts +428 -0
  225. package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
  226. package/Tests/Server/Utils/ClientIp.test.ts +438 -0
  227. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +171 -0
  228. package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +383 -0
  229. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +23 -25
  230. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +6 -0
  231. package/Tests/Server/Utils/Monitor/Criteria/DnssecMonitorCriteria.test.ts +307 -0
  232. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +468 -0
  233. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorTelemetryDeepLinks.test.ts +460 -0
  234. package/Tests/Server/Utils/ResponseRateLimitStatusCodes.test.ts +137 -0
  235. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +40 -8
  236. package/Tests/Server/Utils/SSRFProtectionUserInfo.test.ts +351 -0
  237. package/Tests/Server/Utils/Telemetry/EntityRegistryRetirement.test.ts +531 -0
  238. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
  239. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
  240. package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
  241. package/Tests/Types/IP/IP.test.ts +263 -0
  242. package/Tests/Types/IP/IPWhitelist.test.ts +197 -0
  243. package/Tests/Types/IP/IPv6.test.ts +12 -1
  244. package/Tests/Types/Monitor/SnmpOid.test.ts +64 -0
  245. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +110 -0
  246. package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +106 -0
  247. package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeDifferential.test.ts +511 -0
  248. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageEndToEnd.test.ts +489 -0
  249. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageGapTolerance.test.ts +479 -0
  250. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageState.test.ts +822 -0
  251. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
  252. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
  253. package/Tests/Types/Workflow/BaseModelComponents.test.ts +429 -0
  254. package/Tests/Types/Workflow/Components/BaseModel.test.ts +225 -0
  255. package/Tests/Types/Workflow/IntegrationCredentialMetadata.test.ts +100 -0
  256. package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
  257. package/Tests/Types/Workflow/TemplateSyntax.test.ts +491 -0
  258. package/Tests/Types/Workflow/Templates.test.ts +1218 -0
  259. package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
  260. package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
  261. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
  262. package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
  263. package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
  264. package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
  265. package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
  266. package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
  267. package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
  268. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +42 -0
  269. package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
  270. package/Tests/UI/Components/ModalPortalDismissal.test.tsx +90 -0
  271. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +913 -0
  272. package/Tests/UI/Components/SimpleLogViewer.test.tsx +228 -0
  273. package/Tests/UI/Components/TableRowSelectability.test.tsx +312 -0
  274. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +49 -7
  275. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
  276. package/Tests/UI/Components/Workflow/GraphLint.test.ts +893 -0
  277. package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
  278. package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +522 -0
  279. package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +193 -0
  280. package/Tests/UI/Components/Workflow/ModelSchema.test.ts +388 -0
  281. package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +210 -0
  282. package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +256 -0
  283. package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +665 -0
  284. package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
  285. package/Tests/UI/Components/Workflow/WorkflowIssuesModal.test.tsx +485 -0
  286. package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +478 -0
  287. package/Tests/UI/Components/Workflow/WorkflowStatusBar.test.tsx +379 -0
  288. package/Tests/UI/EsbuildConfig.test.ts +607 -0
  289. package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
  290. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  291. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +11 -4
  292. package/Tests/UI/Utils/ModelAPICreateMiscData.test.ts +94 -0
  293. package/Tests/UI/Utils/Platform.test.ts +147 -0
  294. package/Tests/UI/Utils/ProjectInvitationDisplay.test.ts +357 -0
  295. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +198 -0
  296. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
  297. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +727 -0
  298. package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
  299. package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
  300. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
  301. package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
  302. package/Tests/__mocks__/bullmq.js +55 -0
  303. package/Types/AI/AIChatMessageStatus.ts +8 -1
  304. package/Types/AI/AIChatTypes.ts +12 -0
  305. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +88 -0
  306. package/Types/Exception/ExceptionCode.ts +2 -0
  307. package/Types/Exception/ServiceUnavailableException.ts +8 -0
  308. package/Types/Exception/TooManyRequestsException.ts +8 -0
  309. package/Types/IP/IP.ts +93 -47
  310. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +80 -3
  311. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +55 -0
  312. package/Types/OnCallDutyPolicy/Layer.ts +203 -149
  313. package/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.ts +13 -0
  314. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +155 -10
  315. package/Types/Permission.ts +193 -0
  316. package/Types/SerializableObjectDictionary.ts +133 -39
  317. package/Types/Telemetry/EntityRelationshipType.ts +1 -1
  318. package/Types/Telemetry/EntitySource.ts +40 -0
  319. package/Types/Telemetry/EntityType.ts +28 -1
  320. package/Types/Telemetry/EntityTypeGroups.ts +65 -0
  321. package/Types/Workflow/Component.ts +29 -0
  322. package/Types/Workflow/Components/API.ts +35 -0
  323. package/Types/Workflow/Components/BaseModel.ts +77 -27
  324. package/Types/Workflow/Components/Discord.ts +1 -0
  325. package/Types/Workflow/Components/Email.ts +12 -3
  326. package/Types/Workflow/Components/JavaScript.ts +7 -0
  327. package/Types/Workflow/Components/MicrosoftTeams.ts +3 -2
  328. package/Types/Workflow/Components/Slack.ts +1 -0
  329. package/Types/Workflow/Components/Telegram.ts +1 -0
  330. package/Types/Workflow/StepTrace.ts +181 -0
  331. package/Types/Workflow/TemplateSyntax.ts +543 -0
  332. package/Types/Workflow/Templates.ts +2368 -0
  333. package/UI/Components/Calendar/Calendar.css +43 -0
  334. package/UI/Components/Calendar/Calendar.tsx +8 -0
  335. package/UI/Components/Card/Card.tsx +2 -2
  336. package/UI/Components/Checkbox/Checkbox.tsx +16 -0
  337. package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
  338. package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
  339. package/UI/Components/Dictionary/Dictionary.tsx +71 -15
  340. package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
  341. package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
  342. package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
  343. package/UI/Components/Forms/Types/Field.ts +7 -0
  344. package/UI/Components/Forms/Validation.ts +63 -1
  345. package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
  346. package/UI/Components/Input/Input.tsx +32 -3
  347. package/UI/Components/KeyboardShortcut/KeyboardKey.ts +185 -0
  348. package/UI/Components/KeyboardShortcut/KeyboardShortcut.tsx +87 -0
  349. package/UI/Components/LogsViewer/LogsViewer.tsx +28 -0
  350. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +31 -0
  351. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -18
  352. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +363 -14
  353. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
  354. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +11 -0
  355. package/UI/Components/LogsViewer/components/LogsTable.tsx +155 -12
  356. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +29 -0
  357. package/UI/Components/LogsViewer/types.ts +23 -0
  358. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +9 -2
  359. package/UI/Components/Modal/Modal.tsx +37 -4
  360. package/UI/Components/Navbar/NavBarMenuModal.tsx +15 -30
  361. package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +442 -0
  362. package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +23 -1
  363. package/UI/Components/Table/Table.tsx +49 -16
  364. package/UI/Components/Table/TableBody.tsx +53 -28
  365. package/UI/Components/Table/TableHeader.tsx +13 -0
  366. package/UI/Components/Table/TableRow.tsx +58 -26
  367. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
  368. package/UI/Components/Workflow/ArgumentsForm.tsx +341 -8
  369. package/UI/Components/Workflow/Component.tsx +28 -26
  370. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
  371. package/UI/Components/Workflow/ComponentSettingsModal.tsx +79 -9
  372. package/UI/Components/Workflow/ComponentValuePickerModal.tsx +135 -7
  373. package/UI/Components/Workflow/ComponentsModal.tsx +116 -22
  374. package/UI/Components/Workflow/DocumentationViewer.tsx +59 -9
  375. package/UI/Components/Workflow/GraphLint.ts +628 -0
  376. package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
  377. package/UI/Components/Workflow/ModelColumnEditor.tsx +528 -0
  378. package/UI/Components/Workflow/ModelSchema.ts +278 -0
  379. package/UI/Components/Workflow/RunForm.tsx +41 -7
  380. package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
  381. package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
  382. package/UI/Components/Workflow/UseRunWatch.ts +212 -0
  383. package/UI/Components/Workflow/Utils.ts +93 -1
  384. package/UI/Components/Workflow/VariableModal.tsx +6 -2
  385. package/UI/Components/Workflow/Workflow.tsx +126 -7
  386. package/UI/Components/Workflow/WorkflowIssuesModal.tsx +255 -0
  387. package/UI/Components/Workflow/WorkflowLogModal.tsx +128 -0
  388. package/UI/Components/Workflow/WorkflowStatusBar.tsx +224 -0
  389. package/UI/Types/LayeredDismissal.ts +31 -0
  390. package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
  391. package/UI/Utils/AIChatExport/ConversationMarkdown.ts +10 -0
  392. package/UI/Utils/ModelAPI/ModelAPI.ts +7 -1
  393. package/UI/Utils/Platform.ts +149 -0
  394. package/UI/Utils/ProjectInvitationDisplay.ts +118 -0
  395. package/UI/esbuild-config.js +22 -1
  396. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +187 -0
  397. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
  398. package/Utils/Monitor/NetworkTopologyUtil.ts +917 -155
  399. package/Utils/Telemetry/CrossSignalScope.ts +502 -0
  400. package/Utils/Telemetry/EntityKey.ts +71 -5
  401. package/Utils/Telemetry/EntityRelationship.ts +1 -1
  402. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +1 -1
  403. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +1 -1
  404. package/build/dist/Models/DatabaseModels/AIConversation.js +32 -0
  405. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  406. package/build/dist/Models/DatabaseModels/AIConversationMessage.js +42 -0
  407. package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -1
  408. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +28 -0
  409. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  410. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +29 -0
  411. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  412. package/build/dist/Models/DatabaseModels/Index.js +12 -4
  413. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  414. package/build/dist/Models/DatabaseModels/{TelemetryEntity.js → InventoryItem.js} +212 -29
  415. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -0
  416. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +454 -0
  417. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -0
  418. package/build/dist/Models/DatabaseModels/{TelemetryEntityRelationship.js → InventoryItemRelationship.js} +52 -25
  419. package/build/dist/Models/DatabaseModels/InventoryItemRelationship.js.map +1 -0
  420. package/build/dist/Models/DatabaseModels/NetworkDevice.js +141 -0
  421. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  422. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +719 -0
  423. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -0
  424. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +475 -0
  425. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -0
  426. package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js +446 -0
  427. package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js.map +1 -0
  428. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js +9 -0
  429. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/Project.js +80 -0
  431. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  432. package/build/dist/Models/DatabaseModels/UserCall.js +46 -2
  433. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/UserEmail.js +48 -2
  435. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  436. package/build/dist/Models/DatabaseModels/UserNotificationRule.js +424 -55
  437. package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
  438. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +24 -2
  439. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  440. package/build/dist/Models/DatabaseModels/UserPush.js +51 -1
  441. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  442. package/build/dist/Models/DatabaseModels/UserSMS.js +47 -2
  443. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  444. package/build/dist/Models/DatabaseModels/UserTelegram.js +65 -3
  445. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  446. package/build/dist/Models/DatabaseModels/UserWebhook.js +56 -2
  447. package/build/dist/Models/DatabaseModels/UserWebhook.js.map +1 -1
  448. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +45 -2
  449. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
  451. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  452. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +12 -0
  453. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  454. package/build/dist/Server/API/AIChatAPI.js +237 -1
  455. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  456. package/build/dist/Server/API/DashboardAPI.js +165 -13
  457. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  458. package/build/dist/Server/API/OnCallReadinessAPI.js +599 -0
  459. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -0
  460. package/build/dist/Server/API/TeamComplianceAPI.js +68 -9
  461. package/build/dist/Server/API/TeamComplianceAPI.js.map +1 -1
  462. package/build/dist/Server/API/TelemetryAPI.js +129 -18
  463. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  464. package/build/dist/Server/API/UserAPI.js +16 -1
  465. package/build/dist/Server/API/UserAPI.js.map +1 -1
  466. package/build/dist/Server/EnvironmentConfig.js +45 -0
  467. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  468. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +22 -0
  469. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  470. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +4 -4
  471. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
  472. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
  473. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
  474. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
  475. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js +18 -0
  476. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js.map +1 -0
  477. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js +39 -0
  478. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js.map +1 -0
  479. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js +38 -0
  480. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js.map +1 -0
  481. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js +22 -0
  482. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js.map +1 -0
  483. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js +150 -0
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js.map +1 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js +57 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js.map +1 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js +69 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js.map +1 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js +32 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js.map +1 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js +26 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js.map +1 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js +48 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js.map +1 -0
  495. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +24 -0
  496. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  497. package/build/dist/Server/Infrastructure/Queue.js +72 -13
  498. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  499. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
  500. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  501. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +399 -0
  502. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -0
  503. package/build/dist/Server/Services/AIService.js +1 -0
  504. package/build/dist/Server/Services/AIService.js.map +1 -1
  505. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +24 -3
  506. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
  507. package/build/dist/Server/Services/AlertSeverityService.js +54 -0
  508. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  509. package/build/dist/Server/Services/DashboardService.js +10 -9
  510. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  511. package/build/dist/Server/Services/DatabaseService.js +24 -2
  512. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  513. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +24 -3
  514. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  515. package/build/dist/Server/Services/IncidentSeverityService.js +67 -0
  516. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  517. package/build/dist/Server/Services/Index.js +12 -4
  518. package/build/dist/Server/Services/Index.js.map +1 -1
  519. package/build/dist/Server/Services/InventoryItemCustomFieldService.js +9 -0
  520. package/build/dist/Server/Services/InventoryItemCustomFieldService.js.map +1 -0
  521. package/build/dist/Server/Services/{TelemetryEntityRelationshipService.js → InventoryItemRelationshipService.js} +9 -6
  522. package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
  523. package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +158 -23
  524. package/build/dist/Server/Services/InventoryItemService.js.map +1 -0
  525. package/build/dist/Server/Services/LogAggregationService.js +27 -8
  526. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  527. package/build/dist/Server/Services/MetricAggregationService.js +80 -0
  528. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  529. package/build/dist/Server/Services/MetricService.js +6 -6
  530. package/build/dist/Server/Services/MetricService.js.map +1 -1
  531. package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js +9 -0
  532. package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js.map +1 -0
  533. package/build/dist/Server/Services/NetworkDeviceLinkService.js +71 -0
  534. package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -0
  535. package/build/dist/Server/Services/NetworkDeviceService.js +113 -0
  536. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  537. package/build/dist/Server/Services/NetworkSiteService.js +53 -13
  538. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  539. package/build/dist/Server/Services/NetworkTopologySuppressionService.js +85 -0
  540. package/build/dist/Server/Services/NetworkTopologySuppressionService.js.map +1 -0
  541. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +48 -32
  542. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  543. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +8 -0
  544. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  545. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -12
  546. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  547. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +57 -13
  548. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  549. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +548 -0
  550. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -0
  551. package/build/dist/Server/Services/OnCallReadinessService.js +1961 -0
  552. package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -0
  553. package/build/dist/Server/Services/OnCallSetupReminderService.js +738 -0
  554. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -0
  555. package/build/dist/Server/Services/ProfileAggregationService.js +68 -4
  556. package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
  557. package/build/dist/Server/Services/StatusPageService.js +11 -10
  558. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  559. package/build/dist/Server/Services/TeamComplianceService.js +312 -160
  560. package/build/dist/Server/Services/TeamComplianceService.js.map +1 -1
  561. package/build/dist/Server/Services/UserCallService.js +24 -1
  562. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  563. package/build/dist/Server/Services/UserEmailService.js +24 -1
  564. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  565. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +858 -0
  566. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -0
  567. package/build/dist/Server/Services/UserNotificationRuleService.js +2830 -175
  568. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  569. package/build/dist/Server/Services/UserOnCallLogService.js +488 -43
  570. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  571. package/build/dist/Server/Services/UserPushService.js +26 -0
  572. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  573. package/build/dist/Server/Services/UserService.js +10 -0
  574. package/build/dist/Server/Services/UserService.js.map +1 -1
  575. package/build/dist/Server/Services/UserSmsService.js +24 -1
  576. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  577. package/build/dist/Server/Services/UserTelegramService.js +22 -1
  578. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  579. package/build/dist/Server/Services/UserWebhookService.js +25 -1
  580. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  581. package/build/dist/Server/Services/UserWhatsAppService.js +22 -1
  582. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  583. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +12 -1
  584. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  585. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +126 -0
  586. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  587. package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js +254 -0
  588. package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js.map +1 -0
  589. package/build/dist/Server/Types/Database/Permissions/QueryPermission.js +47 -2
  590. package/build/dist/Server/Types/Database/Permissions/QueryPermission.js.map +1 -1
  591. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +7 -0
  592. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  593. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +1 -1
  594. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  595. package/build/dist/Server/Types/Workflow/Components/API/Get.js +1 -1
  596. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  597. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +1 -1
  598. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  599. package/build/dist/Server/Types/Workflow/Components/API/Post.js +1 -1
  600. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  601. package/build/dist/Server/Types/Workflow/Components/API/Put.js +1 -1
  602. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  603. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +28 -0
  604. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  605. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +21 -5
  606. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  607. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +14 -10
  608. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  609. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +31 -0
  610. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -1
  611. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +3 -9
  612. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  613. package/build/dist/Server/Types/Workflow/Components/Email.js +15 -4
  614. package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
  615. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +7 -2
  616. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  617. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +1 -1
  618. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  619. package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
  620. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +514 -56
  621. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  622. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +20 -3
  623. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  624. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +19 -6
  625. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  626. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +7 -0
  627. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  628. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +2 -2
  629. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  630. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +692 -0
  631. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -0
  632. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +148 -12
  633. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  634. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +157 -10
  635. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
  636. package/build/dist/Server/Utils/AI/Toolbox/Index.js +37 -0
  637. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  638. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +259 -14
  639. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
  640. package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js +235 -0
  641. package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js.map +1 -0
  642. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +1000 -0
  643. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -0
  644. package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js +356 -0
  645. package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js.map +1 -0
  646. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +394 -0
  647. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -0
  648. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +465 -0
  649. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -0
  650. package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js +280 -0
  651. package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js.map +1 -0
  652. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +527 -0
  653. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -0
  654. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +548 -0
  655. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -0
  656. package/build/dist/Server/Utils/ClientIp.js +137 -0
  657. package/build/dist/Server/Utils/ClientIp.js.map +1 -0
  658. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +38 -0
  659. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  660. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +89 -0
  661. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -0
  662. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +77 -0
  663. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -0
  664. package/build/dist/Server/Utils/Express.js +12 -12
  665. package/build/dist/Server/Utils/Express.js.map +1 -1
  666. package/build/dist/Server/Utils/LLM/LLMService.js +70 -7
  667. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  668. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +121 -11
  669. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  670. package/build/dist/Server/Utils/SSRFProtection.js +82 -21
  671. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  672. package/build/dist/Server/Utils/StartServer.js +12 -4
  673. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  674. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +165 -18
  675. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  676. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
  677. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
  678. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +122 -47
  679. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  680. package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
  681. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  682. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +7 -3
  683. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  684. package/build/dist/Types/AI/AIChatMessageStatus.js +8 -1
  685. package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -1
  686. package/build/dist/Types/AI/AIChatTypes.js +12 -0
  687. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  688. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +60 -0
  689. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -0
  690. package/build/dist/Types/Exception/ExceptionCode.js +2 -0
  691. package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
  692. package/build/dist/Types/Exception/ServiceUnavailableException.js +8 -0
  693. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -0
  694. package/build/dist/Types/Exception/TooManyRequestsException.js +8 -0
  695. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -0
  696. package/build/dist/Types/IP/IP.js +87 -43
  697. package/build/dist/Types/IP/IP.js.map +1 -1
  698. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +50 -0
  699. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -0
  700. package/build/dist/Types/OnCallDutyPolicy/Layer.js +186 -123
  701. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  702. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js +13 -0
  703. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js.map +1 -1
  704. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +105 -11
  705. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  706. package/build/dist/Types/Permission.js +174 -0
  707. package/build/dist/Types/Permission.js.map +1 -1
  708. package/build/dist/Types/SerializableObjectDictionary.js +133 -39
  709. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  710. package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
  711. package/build/dist/Types/Telemetry/EntitySource.js +39 -0
  712. package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
  713. package/build/dist/Types/Telemetry/EntityType.js +28 -1
  714. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  715. package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
  716. package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
  717. package/build/dist/Types/Workflow/Component.js +21 -0
  718. package/build/dist/Types/Workflow/Component.js.map +1 -1
  719. package/build/dist/Types/Workflow/Components/API.js +35 -0
  720. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  721. package/build/dist/Types/Workflow/Components/BaseModel.js +68 -26
  722. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  723. package/build/dist/Types/Workflow/Components/Discord.js +1 -0
  724. package/build/dist/Types/Workflow/Components/Discord.js.map +1 -1
  725. package/build/dist/Types/Workflow/Components/Email.js +12 -3
  726. package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
  727. package/build/dist/Types/Workflow/Components/JavaScript.js +7 -0
  728. package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
  729. package/build/dist/Types/Workflow/Components/MicrosoftTeams.js +3 -2
  730. package/build/dist/Types/Workflow/Components/MicrosoftTeams.js.map +1 -1
  731. package/build/dist/Types/Workflow/Components/Slack.js +1 -0
  732. package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
  733. package/build/dist/Types/Workflow/Components/Telegram.js +1 -0
  734. package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -1
  735. package/build/dist/Types/Workflow/StepTrace.js +104 -0
  736. package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
  737. package/build/dist/Types/Workflow/TemplateSyntax.js +338 -0
  738. package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
  739. package/build/dist/Types/Workflow/Templates.js +2111 -0
  740. package/build/dist/Types/Workflow/Templates.js.map +1 -0
  741. package/build/dist/UI/Components/Calendar/Calendar.js +1 -1
  742. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  743. package/build/dist/UI/Components/Checkbox/Checkbox.js +1 -1
  744. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  745. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
  746. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
  747. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
  748. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
  749. package/build/dist/UI/Components/Dictionary/Dictionary.js +47 -17
  750. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  751. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  752. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
  753. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  754. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
  755. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  756. package/build/dist/UI/Components/Forms/Validation.js +44 -0
  757. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  758. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +27 -4
  759. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  760. package/build/dist/UI/Components/Input/Input.js +13 -4
  761. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  762. package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js +163 -0
  763. package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js.map +1 -0
  764. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js +47 -0
  765. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js.map +1 -0
  766. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +4 -4
  767. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  768. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +11 -1
  769. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  770. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +10 -8
  771. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  772. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +227 -14
  773. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  774. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
  775. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  776. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +5 -0
  777. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  778. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +69 -5
  779. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  780. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +8 -0
  781. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  782. package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
  783. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +9 -2
  784. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  785. package/build/dist/UI/Components/Modal/Modal.js +31 -5
  786. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  787. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +8 -21
  788. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  789. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +251 -0
  790. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -0
  791. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +9 -2
  792. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
  793. package/build/dist/UI/Components/Table/Table.js +27 -15
  794. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  795. package/build/dist/UI/Components/Table/TableBody.js +24 -18
  796. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  797. package/build/dist/UI/Components/Table/TableHeader.js +9 -1
  798. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  799. package/build/dist/UI/Components/Table/TableRow.js +29 -21
  800. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  801. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
  802. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  803. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +261 -14
  804. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  805. package/build/dist/UI/Components/Workflow/Component.js +20 -19
  806. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  807. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +10 -1
  808. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  809. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +35 -7
  810. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  811. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +57 -7
  812. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +1 -1
  813. package/build/dist/UI/Components/Workflow/ComponentsModal.js +53 -18
  814. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  815. package/build/dist/UI/Components/Workflow/DocumentationViewer.js +19 -6
  816. package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
  817. package/build/dist/UI/Components/Workflow/GraphLint.js +425 -0
  818. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
  819. package/build/dist/UI/Components/Workflow/GraphLintSummary.js +231 -0
  820. package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -0
  821. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +320 -0
  822. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
  823. package/build/dist/UI/Components/Workflow/ModelSchema.js +156 -0
  824. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
  825. package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
  826. package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
  827. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
  828. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
  829. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
  830. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
  831. package/build/dist/UI/Components/Workflow/UseRunWatch.js +123 -0
  832. package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -0
  833. package/build/dist/UI/Components/Workflow/Utils.js +73 -1
  834. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  835. package/build/dist/UI/Components/Workflow/VariableModal.js +3 -2
  836. package/build/dist/UI/Components/Workflow/VariableModal.js.map +1 -1
  837. package/build/dist/UI/Components/Workflow/Workflow.js +92 -7
  838. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  839. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +99 -0
  840. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -0
  841. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +56 -0
  842. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -0
  843. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +92 -0
  844. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -0
  845. package/build/dist/UI/Types/LayeredDismissal.js +21 -0
  846. package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
  847. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
  848. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  849. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +9 -0
  850. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -1
  851. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +1 -1
  852. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  853. package/build/dist/UI/Utils/Platform.js +118 -0
  854. package/build/dist/UI/Utils/Platform.js.map +1 -0
  855. package/build/dist/UI/Utils/ProjectInvitationDisplay.js +106 -0
  856. package/build/dist/UI/Utils/ProjectInvitationDisplay.js.map +1 -0
  857. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +108 -0
  858. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -0
  859. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
  860. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
  861. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +661 -126
  862. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  863. package/build/dist/Utils/Telemetry/CrossSignalScope.js +328 -0
  864. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -0
  865. package/build/dist/Utils/Telemetry/EntityKey.js +57 -5
  866. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  867. package/build/dist/Utils/Telemetry/EntityRelationship.js +1 -1
  868. package/jest.config.json +1 -0
  869. package/package.json +1 -1
  870. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +0 -1
  871. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +0 -1
  872. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +0 -1
  873. package/build/dist/Server/Services/TelemetryEntityService.js.map +0 -1
@@ -0,0 +1,841 @@
1
+ import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import OnCallReadinessService, {
3
+ ReadinessCoverageCell,
4
+ ReadinessMethod,
5
+ ReadinessSummary,
6
+ ReadinessTeam,
7
+ UserReadiness,
8
+ } from "../Services/OnCallReadinessService";
9
+ import OnCallDutyPolicyService from "../Services/OnCallDutyPolicyService";
10
+ import OnCallSetupReminderService, {
11
+ SetupReminderResult,
12
+ SetupReminderUserResult,
13
+ } from "../Services/OnCallSetupReminderService";
14
+ import TeamMemberService from "../Services/TeamMemberService";
15
+ import Express, {
16
+ ExpressRequest,
17
+ ExpressResponse,
18
+ ExpressRouter,
19
+ NextFunction,
20
+ } from "../Utils/Express";
21
+ import Response from "../Utils/Response";
22
+ import CommonAPI from "./CommonAPI";
23
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
24
+ import DatabaseCommonInteractionPropsUtil, {
25
+ PermissionType,
26
+ } from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
27
+ import BadDataException from "../../Types/Exception/BadDataException";
28
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
29
+ import { JSONObject } from "../../Types/JSON";
30
+ import ObjectID from "../../Types/ObjectID";
31
+ import Permission, { UserPermission } from "../../Types/Permission";
32
+ import OnCallDutyPolicy from "../../Models/DatabaseModels/OnCallDutyPolicy";
33
+ import TeamMember from "../../Models/DatabaseModels/TeamMember";
34
+
35
+ /*
36
+ * "Can this responder actually be paged?" answered over HTTP, for one policy,
37
+ * one project, or one user. Everything the routes below return is computed by
38
+ * OnCallReadinessService; this file is transport and authorisation only, and
39
+ * deliberately holds no readiness logic of its own so the API and any in-process
40
+ * caller (TeamComplianceService, the on-call banner) can never disagree.
41
+ *
42
+ * Why a plain ExpressRouter rather than `extends BaseAPI`:
43
+ *
44
+ * The obvious model for this file, TeamComplianceAPI, does
45
+ * `class TeamComplianceAPI extends BaseAPI<Team, TeamServiceType>` and calls
46
+ * `super(Team, TeamService)` purely to inherit `this.router`. That side effect
47
+ * is not free: the BaseAPI constructor registers the ENTIRE Team CRUD route set
48
+ * (list, get, count, create, update, delete) onto that router. Team is already
49
+ * registered independently at App/FeatureSet/BaseAPI/Index.ts:2884, and Express
50
+ * dispatches to whichever matching handler was `app.use`d first, so the second
51
+ * copy is dead code that exists only to be shadowed - and it would quietly stop
52
+ * being dead the day the mount order changed. Readiness is not a CRUD model at
53
+ * all, so there is nothing to inherit here even in principle. AIReadinessAPI
54
+ * (Common/Server/API/AIReadinessAPI.ts) is the pattern this follows instead: a
55
+ * bare router, exported as the router itself, mounted with
56
+ * `app.use(prefix, OnCallReadinessAPI)`.
57
+ *
58
+ * Authorisation, on every route:
59
+ *
60
+ * These endpoints deliberately disclose ONE USER'S CONFIGURATION TO ANOTHER -
61
+ * which channels they have, which severities they are covered for. That is the
62
+ * whole point (an owner has to be able to see who cannot be reached), but it
63
+ * means the usual "the model's TableAccessControl will catch it" reasoning does
64
+ * not apply: OnCallReadinessService reads with `isRoot: true`, so these handlers
65
+ * are the only gate underneath. UserMiddleware.getUserMiddleware is NOT that
66
+ * gate - it admits anonymous callers as UserType.Public and calls next(), and
67
+ * the tenant id it attaches comes straight off the caller-supplied `tenantid`
68
+ * header before any authorisation runs. So each route asserts, itself:
69
+ *
70
+ * 1. the caller is a logged-in member of the project it named
71
+ * (CommonAPI.assertAuthenticatedProjectMember), and
72
+ * 2. the resource in the path - the policy, or the user - actually belongs to
73
+ * that same project, because otherwise a member of project A reads project
74
+ * B's data simply by sending their own `tenantid` header alongside a
75
+ * borrowed id.
76
+ *
77
+ * OnCallReadinessService guards its own reads too - getReadinessForPolicy
78
+ * rejects a policy from another project, getReadinessForUser rejects a user who
79
+ * is not a member of one - and the checks here deliberately duplicate that.
80
+ * They are not redundant belt-and-braces for its own sake: the service's guards
81
+ * are data-scoping guards that answer with BadDataException (a 400), whereas a
82
+ * member of project A reaching for project B's policy id is an authorisation
83
+ * failure and should be answered as one. More to the point, an endpoint's
84
+ * authorisation should be legible in the endpoint. If the service later relaxes
85
+ * its guard for a legitimate internal caller - a preview for a user not yet
86
+ * added to the project, say - these routes must not quietly become a
87
+ * cross-project probe as a side effect. The cost is one primary-key lookup on a
88
+ * request that is about to do considerably more work than that.
89
+ *
90
+ * Identifiers are masked by the service, before they ever reach this file, and
91
+ * the serialisers below copy `maskedIdentifier` and nothing else. There is no
92
+ * "unmask for self" branch anywhere: the contract carries no raw field to
93
+ * populate, so a future change would have to widen the contract in the open
94
+ * rather than slip a raw phone number through a boolean flag.
95
+ *
96
+ * The two summary routes are PAGED - see READINESS_PAGE_SIZE_DEFAULT below for
97
+ * why, and for the rule that keeps a paged answer from lying about the whole.
98
+ *
99
+ * THE ONE ROUTE THAT IS NOT A READ:
100
+ *
101
+ * /on-call-readiness/send-setup-reminder is a POST that sends branded email to
102
+ * real people, and it therefore carries a HIGHER bar than its read siblings -
103
+ * see SETUP_REMINDER_PERMISSIONS below. Membership was the original bar and it
104
+ * was the wrong one: `assertAuthenticatedProjectMember` proves only that the
105
+ * caller has SOME access entry for the project, which every read-only Viewer
106
+ * has, so anyone who could look at the readiness table could also make the
107
+ * product mail their colleagues in the project's name. Disclosure and action are
108
+ * different questions, and this route is the only one here that answers the
109
+ * second.
110
+ */
111
+ const router: ExpressRouter = Express.getRouter();
112
+
113
+ /*
114
+ * Paging, and the one rule that makes it safe.
115
+ *
116
+ * A summary carries one UserReadiness per responder, and each of those carries a
117
+ * coverage cell per (rule type, severity) pair: four rule types against, say,
118
+ * eight incident and eight alert severities is 32 cells with a name and two ids
119
+ * apiece. That is a few kilobytes per responder, so a project with a few
120
+ * thousand responders serialises to tens of megabytes of JSON - built in memory,
121
+ * on every page load, by a service that also caches it. Nobody reads a table of
122
+ * five thousand rows in one screen, so the wire format should not pretend
123
+ * otherwise.
124
+ *
125
+ * THE RULE: the response is bounded, but the FACTS ARE NOT. readyCount,
126
+ * partiallyReadyCount and notReachableCount always describe the entire scope,
127
+ * never the page, and `totalCount` states how many responders the scope holds so
128
+ * a client can always see that it is holding part of a list. This is the
129
+ * difference between a paged answer and a truncated one, and it is the whole
130
+ * reason the counts are computed by the service rather than derived by the
131
+ * client from `users.length`: a UI that counted the rows it received would put a
132
+ * reassuring "3 not reachable" under a page that happened to contain three, in a
133
+ * project with forty.
134
+ *
135
+ * Ordering is what makes the FIRST page the useful one: the service sorts
136
+ * most-broken-first (NotReachable, then PartiallyReady, then Ready), so page one
137
+ * of a paged response holds the responders somebody needs to act on, and the
138
+ * rows that fall off the end are the healthy ones.
139
+ *
140
+ * A `limit` above the maximum is REFUSED rather than clamped. Silently returning
141
+ * 500 rows to a caller who asked for 5,000 is precisely the failure this feature
142
+ * exists to prevent - a client cannot tell a short page from a complete list -
143
+ * so the caller is told the ceiling and asked to page.
144
+ */
145
+ const READINESS_PAGE_SIZE_DEFAULT: number = 100;
146
+ const READINESS_PAGE_SIZE_MAX: number = 500;
147
+
148
+ interface ReadinessPageRequest {
149
+ limit: number;
150
+ skip: number;
151
+ }
152
+
153
+ /**
154
+ * The wire shape of a paged summary. Exported so the dashboard can derive its
155
+ * own types from it rather than hand-copying the field names, the way
156
+ * ReadinessTypes.ts already derives from the service's contract.
157
+ */
158
+ export interface ReadinessSummaryPageWire {
159
+ projectId: string;
160
+ onCallDutyPolicyId?: string | undefined;
161
+ /** Whole-scope counts. Never the page's. */
162
+ readyCount: number;
163
+ partiallyReadyCount: number;
164
+ notReachableCount: number;
165
+ /**
166
+ * Whether a page with no matching rule falls back to the responder's verified
167
+ * methods, or is dropped. Carried on the wire because a UI that tells an admin
168
+ * "those pages still reach them through the fallback" must stop saying so for
169
+ * a project that has the fallback switched off - which is the moment the
170
+ * sentence stops being reassuring and starts being false.
171
+ */
172
+ isFallbackEnabled: boolean;
173
+ /**
174
+ * TRUE means the SCOPE was truncated before it was paged - a read behind the
175
+ * summary hit its ceiling - so responders may be missing from it entirely and
176
+ * `totalCount` is a floor rather than a total. Distinct from `hasMore`, which
177
+ * merely says there are further pages of a complete answer.
178
+ */
179
+ isTruncated: boolean;
180
+ /**
181
+ * Responders in the whole scope, so a client can always see that it is holding
182
+ * part of a list. A lower bound when isTruncated is true.
183
+ */
184
+ totalCount: number;
185
+ limit: number;
186
+ skip: number;
187
+ hasMore: boolean;
188
+ users: Array<JSONObject>;
189
+ }
190
+
191
+ /*
192
+ * Digits and nothing else. No sign, no decimal point, no trailing units: a page
193
+ * parameter is a count of rows.
194
+ */
195
+ const WHOLE_NUMBER: RegExp = /^\d+$/;
196
+
197
+ /*
198
+ * Query parameters are strings from an untrusted caller. parseInt("12abc") is
199
+ * 12 and parseInt("abc") is NaN, and both would otherwise become a page size, so
200
+ * the value is required to be nothing but digits before it is believed.
201
+ */
202
+ function readPositiveIntegerParam(
203
+ req: ExpressRequest,
204
+ name: string,
205
+ fallback: number,
206
+ ): number {
207
+ const raw: string | undefined = req.query[name] as string | undefined;
208
+
209
+ if (raw === undefined || raw === null || raw === "") {
210
+ return fallback;
211
+ }
212
+
213
+ if (!WHOLE_NUMBER.test(raw)) {
214
+ throw new BadDataException(
215
+ `${name} must be a whole number. Received: "${raw}".`,
216
+ );
217
+ }
218
+
219
+ return parseInt(raw, 10);
220
+ }
221
+
222
+ /*
223
+ * An explicit refresh must actually re-read.
224
+ *
225
+ * The service answers from a 60s in-process cache, which is right for the
226
+ * ordinary case - several surfaces ask the same question on one screen. It is
227
+ * wrong for the one interaction where the user has just CHANGED the answer: a
228
+ * responder verifies a device while an admin watches, the admin presses
229
+ * Recheck, and a cached summary redraws them as still unreachable. The admin
230
+ * concludes the fix did not work.
231
+ *
232
+ * `?refresh=true` drops this replica's cache before recomputing. It is a
233
+ * deliberate, user-initiated cost, and it is bounded by the same authorisation
234
+ * as the read itself, so it cannot be used to force recomputation on a project
235
+ * the caller cannot already read. Each replica clears only its own copy; the
236
+ * TTL remains the only cross-process guarantee.
237
+ */
238
+ function isRefreshRequested(req: ExpressRequest): boolean {
239
+ const raw: string | undefined = (req.query as Record<string, unknown>)[
240
+ "refresh"
241
+ ] as string | undefined;
242
+
243
+ if (raw === undefined || raw === null) {
244
+ return false;
245
+ }
246
+
247
+ const normalized: string = String(raw).trim().toLowerCase();
248
+
249
+ return normalized === "true" || normalized === "1";
250
+ }
251
+
252
+ function readPageRequest(req: ExpressRequest): ReadinessPageRequest {
253
+ const limit: number = readPositiveIntegerParam(
254
+ req,
255
+ "limit",
256
+ READINESS_PAGE_SIZE_DEFAULT,
257
+ );
258
+ const skip: number = readPositiveIntegerParam(req, "skip", 0);
259
+
260
+ if (limit < 1 || limit > READINESS_PAGE_SIZE_MAX) {
261
+ throw new BadDataException(
262
+ `limit must be between 1 and ${READINESS_PAGE_SIZE_MAX}. Ask for the next page with skip instead.`,
263
+ );
264
+ }
265
+
266
+ return {
267
+ limit: limit,
268
+ skip: skip,
269
+ };
270
+ }
271
+
272
+ /*
273
+ * Project membership for the user NAMED IN THE PATH (not the caller). Without
274
+ * this, /on-call-readiness/user/:userId is a cross-project probe: the readiness
275
+ * queries are all projectId-scoped and would come back empty for a stranger,
276
+ * but the summary still carries that stranger's name and login email, read from
277
+ * the User table where no project scoping exists. TeamMember is the membership
278
+ * table for a project - even the creating owner gets a row
279
+ * (ProjectService.ts:1853) - so its absence is a definitive "not in this
280
+ * project".
281
+ *
282
+ * Invitation state is deliberately not part of the query, matching the check
283
+ * OnCallReadinessService.getReadinessForUser makes for the same reason. A user
284
+ * with a pending invitation can already be selected onto an escalation rule, and
285
+ * "is this person reachable?" is exactly the question worth asking about them;
286
+ * requiring hasAcceptedInvitation would refuse the readiness read for the
287
+ * responders most likely to be misconfigured.
288
+ *
289
+ * The rejection reuses assertResourceBelongsToProject's wording verbatim so a
290
+ * caller cannot tell "this user exists but is in another project" apart from
291
+ * "this user does not exist", and therefore cannot enumerate users through it.
292
+ */
293
+ async function assertUserBelongsToProject(
294
+ userId: ObjectID,
295
+ projectId: ObjectID,
296
+ ): Promise<void> {
297
+ const memberships: Array<TeamMember> = await TeamMemberService.findBy({
298
+ query: {
299
+ userId: userId,
300
+ projectId: projectId,
301
+ },
302
+ select: {
303
+ _id: true,
304
+ },
305
+ limit: 1,
306
+ skip: 0,
307
+ props: {
308
+ isRoot: true,
309
+ },
310
+ });
311
+
312
+ if (memberships.length === 0) {
313
+ throw new NotAuthorizedException(
314
+ "You are not authorized to access this project's data.",
315
+ );
316
+ }
317
+ }
318
+
319
+ /*
320
+ * Who may make the product send mail in this project's name.
321
+ *
322
+ * The action is "manage on-call", so the granular permission that means exactly
323
+ * that - EditProjectOnCallDutyPolicy, the one that lets somebody change who gets
324
+ * paged - is the permission this asks for. The two project roles and the on-call
325
+ * role are listed ALONGSIDE it rather than being expanded into it because
326
+ * OneUptime's teams hold ROLES, not granular permissions: a project created
327
+ * before this feature existed has an owner whose team carries ProjectOwner and
328
+ * nothing more granular, and a gate that named only the granular permission
329
+ * would lock every existing project's owner out of their own button.
330
+ *
331
+ * Deliberately NOT here:
332
+ *
333
+ * - ProjectMember and Viewer, which is the whole point of the change. Both can
334
+ * read the readiness table, and reading who is unreachable is a different
335
+ * act from mailing them about it under the project's branding.
336
+ * - OnCallMember and OnCallViewer. The on-call tiers below Admin are for
337
+ * people who are ON call, not people who administer it.
338
+ *
339
+ * The read routes keep the membership bar: they disclose configuration to
340
+ * somebody who is already inside the project, which is what the feature is for.
341
+ */
342
+ const SETUP_REMINDER_PERMISSIONS: Array<Permission> = [
343
+ Permission.ProjectOwner,
344
+ Permission.ProjectAdmin,
345
+ Permission.OnCallAdmin,
346
+ Permission.EditProjectOnCallDutyPolicy,
347
+ ];
348
+
349
+ /*
350
+ * The permission check, read the way the rest of the API reads permissions.
351
+ *
352
+ * getUserPermissions(Allow) rather than `userTenantAccessPermission[...]`
353
+ * directly, and that is not a stylistic preference. That dictionary's entries
354
+ * hold GRANTS AND DENIALS in one array, discriminated only by
355
+ * `isBlockPermission`; mapping it raw would count a team's explicit BLOCK of
356
+ * ProjectAdmin as a grant of ProjectAdmin, so the admin action that restricts a
357
+ * team would be the thing that handed it this endpoint. The helper filters by
358
+ * type and scopes to props.tenantId, which is the same project
359
+ * assertAuthenticatedProjectMember just authorised the caller for.
360
+ *
361
+ * The refusal reuses the router's single refusal sentence verbatim, so an
362
+ * under-privileged member cannot tell "you may not do this" apart from "you are
363
+ * not in this project" and use the difference to probe.
364
+ */
365
+ function assertCanSendSetupReminders(
366
+ databaseProps: DatabaseCommonInteractionProps,
367
+ ): void {
368
+ if (databaseProps.isMasterAdmin) {
369
+ return;
370
+ }
371
+
372
+ const permissions: Array<Permission> =
373
+ DatabaseCommonInteractionPropsUtil.getUserPermissions(
374
+ databaseProps,
375
+ PermissionType.Allow,
376
+ ).map((userPermission: UserPermission): Permission => {
377
+ return userPermission.permission;
378
+ });
379
+
380
+ const isAllowed: boolean = permissions.some(
381
+ (permission: Permission): boolean => {
382
+ return SETUP_REMINDER_PERMISSIONS.includes(permission);
383
+ },
384
+ );
385
+
386
+ if (!isAllowed) {
387
+ throw new NotAuthorizedException(
388
+ "You are not authorized to access this project's data.",
389
+ );
390
+ }
391
+ }
392
+
393
+ /*
394
+ * ObjectID's constructor accepts any string, so an unparseable path segment
395
+ * would otherwise travel all the way to a query that matches nothing and read
396
+ * as "this policy has no responders" rather than "you sent nonsense".
397
+ */
398
+ function readObjectIdParam(req: ExpressRequest, name: string): ObjectID {
399
+ const raw: string = (req.params[name] as string) || "";
400
+ ObjectID.validateUUID(raw);
401
+ return new ObjectID(raw);
402
+ }
403
+
404
+ /*
405
+ * The `userIds` array from a POST body, validated before it is believed.
406
+ *
407
+ * A request body is a bag of JSON from an untrusted caller, so every layer of
408
+ * this is checked rather than asserted: that the field is there, that it is an
409
+ * array, that each element is a string, and that each string is a UUID.
410
+ * ObjectID's constructor accepts ANY string, so skipping the last check would
411
+ * push arbitrary caller text into a database query - and, in this case, into the
412
+ * "not a member of this project" branch of a mail-sending service, where it
413
+ * would look exactly like an ordinary stale id rather than like nonsense.
414
+ *
415
+ * The ceiling is enforced in the service rather than here, because the service
416
+ * is what the ceiling protects and it must hold for every caller. This route
417
+ * only has to hand it a well-formed list.
418
+ */
419
+ function readUserIdsFromBody(req: ExpressRequest): Array<ObjectID> {
420
+ const body: JSONObject = (req.body || {}) as JSONObject;
421
+
422
+ const raw: unknown = body["userIds"];
423
+
424
+ if (!Array.isArray(raw)) {
425
+ throw new BadDataException(
426
+ "userIds is required and must be an array of user ids.",
427
+ );
428
+ }
429
+
430
+ return raw.map((value: unknown): ObjectID => {
431
+ if (typeof value !== "string") {
432
+ throw new BadDataException(
433
+ "Every entry in userIds must be a user id string.",
434
+ );
435
+ }
436
+
437
+ ObjectID.validateUUID(value);
438
+
439
+ return new ObjectID(value);
440
+ });
441
+ }
442
+
443
+ /*
444
+ * ObjectID.toJSON() serialises to `{ _type: "ObjectID", value: "..." }`, which
445
+ * is right for model payloads the client parses back through JSONFunctions but
446
+ * wrong for a hand-rolled response body. These serialisers flatten every id to
447
+ * a plain string, the same way TeamComplianceAPI does, so the browser can read
448
+ * `userId` without knowing about ObjectID at all.
449
+ */
450
+ function serializeMethod(method: ReadinessMethod): JSONObject {
451
+ return {
452
+ /*
453
+ * The id of the METHOD ROW, flattened like every other id here.
454
+ *
455
+ * It is not sensitive - it is already the foreign key stored on any rule its
456
+ * owner created - and it is the whole reason an administrator can POINT A
457
+ * RULE AT a method without READING that method's row. The seven method
458
+ * models stay scoped to their owner precisely so the raw phone number,
459
+ * webhook url, device token and chat id behind them never leave the server;
460
+ * the dropdown an admin uses is built from this id plus the mask below.
461
+ *
462
+ * Dropping it does not fail loudly. The payload still looks well-formed and
463
+ * the readiness page still renders - only the admin's rule form quietly has
464
+ * nothing to submit. A merge did exactly that, which is why the API test
465
+ * asserts this field's presence and that it is the METHOD row's id rather
466
+ * than the user's or the rule's.
467
+ */
468
+ methodId: method.methodId.toString(),
469
+ methodType: method.methodType,
470
+ // Masked upstream. Never widened here, for any caller, including self.
471
+ maskedIdentifier: method.maskedIdentifier,
472
+ isVerified: method.isVerified,
473
+ };
474
+ }
475
+
476
+ function serializeCoverageCell(cell: ReadinessCoverageCell): JSONObject {
477
+ return {
478
+ ruleType: cell.ruleType,
479
+ /*
480
+ * Undefined rather than absent for the two go-on-call / go-off-call rule
481
+ * types, which are not per-severity at all. The client renders one row per
482
+ * cell and needs to be able to tell "this cell has no severity" from "the
483
+ * severity failed to load".
484
+ */
485
+ severityId: cell.severityId ? cell.severityId.toString() : undefined,
486
+ severityName: cell.severityName,
487
+ hasRule: cell.hasRule,
488
+ isOptOut: cell.isOptOut,
489
+ };
490
+ }
491
+
492
+ function serializeUserReadiness(readiness: UserReadiness): JSONObject {
493
+ return {
494
+ userId: readiness.userId.toString(),
495
+ userName: readiness.userName,
496
+ userEmail: readiness.userEmail,
497
+ userProfilePictureId: readiness.userProfilePictureId
498
+ ? readiness.userProfilePictureId.toString()
499
+ : undefined,
500
+ status: readiness.status,
501
+ methods: readiness.methods.map(serializeMethod),
502
+ coverage: readiness.coverage.map(serializeCoverageCell),
503
+ reasons: readiness.reasons,
504
+ reachedVia: readiness.reachedVia,
505
+ /*
506
+ * The teams that page this responder, ids flattened to strings like every other id
507
+ * here. A team name is already readable by any project member through the team list,
508
+ * so nothing is disclosed by naming it — and naming it is what lets the readiness
509
+ * table offer a team filter whose options a reader can actually recognise.
510
+ */
511
+ teams: readiness.teams.map((team: ReadinessTeam): JSONObject => {
512
+ return {
513
+ _id: team._id.toString(),
514
+ name: team.name,
515
+ };
516
+ }),
517
+ };
518
+ }
519
+
520
+ /*
521
+ * One page of a summary. `users` is sliced; nothing else is. See
522
+ * READINESS_PAGE_SIZE_DEFAULT for why the counts stay whole-scope.
523
+ */
524
+ function serializeSummaryPage(
525
+ summary: ReadinessSummary,
526
+ page: ReadinessPageRequest,
527
+ ): JSONObject {
528
+ const totalCount: number = summary.users.length;
529
+ const pagedUsers: Array<UserReadiness> = summary.users.slice(
530
+ page.skip,
531
+ page.skip + page.limit,
532
+ );
533
+
534
+ const wire: ReadinessSummaryPageWire = {
535
+ projectId: summary.projectId.toString(),
536
+ onCallDutyPolicyId: summary.onCallDutyPolicyId
537
+ ? summary.onCallDutyPolicyId.toString()
538
+ : undefined,
539
+ readyCount: summary.readyCount,
540
+ partiallyReadyCount: summary.partiallyReadyCount,
541
+ notReachableCount: summary.notReachableCount,
542
+ /*
543
+ * Both of these are facts about the SCOPE, so they are copied onto every
544
+ * page of it rather than onto the first. A client that fetched page two
545
+ * would otherwise be told the answer is complete and the fallback is on.
546
+ */
547
+ isFallbackEnabled: summary.isFallbackEnabled,
548
+ isTruncated: summary.isTruncated,
549
+ totalCount: totalCount,
550
+ limit: page.limit,
551
+ skip: page.skip,
552
+ /*
553
+ * Stated rather than left to be derived. `skip + users.length < totalCount`
554
+ * is the same arithmetic, but a client that gets it slightly wrong stops
555
+ * paging one page early and silently drops responders - which is the exact
556
+ * failure mode paging was introduced to avoid.
557
+ */
558
+ hasMore: page.skip + pagedUsers.length < totalCount,
559
+ users: pagedUsers.map(serializeUserReadiness),
560
+ };
561
+
562
+ return wire as unknown as JSONObject;
563
+ }
564
+
565
+ /**
566
+ * The wire shape of a setup-reminder run. Exported so the dashboard derives its
567
+ * type from the contract rather than hand-copying field names, the same way
568
+ * ReadinessSummaryPageWire is used.
569
+ */
570
+ export interface SetupReminderResultWire {
571
+ projectId: string;
572
+ /** Distinct users considered. May be fewer than the ids posted, if they repeated. */
573
+ requestedCount: number;
574
+ sentCount: number;
575
+ /** Every skipped outcome of whatever kind; `results` says which kind, per user. */
576
+ skippedCount: number;
577
+ failedCount: number;
578
+ results: Array<JSONObject>;
579
+ }
580
+
581
+ /*
582
+ * Per user, always - even when everything worked.
583
+ *
584
+ * The counts alone would be enough to render "5 sent, 2 skipped, 1 failed", and
585
+ * that sentence is already far better than a tick. The array is here for the
586
+ * next question the reader has, which is "which one failed?" - and answering
587
+ * that from the client requires the outcome to be attached to an id it can match
588
+ * against the row the admin ticked.
589
+ *
590
+ * `outcome` is the enum's own string, not a boolean or a status code, because
591
+ * the four ways of not being sent are four different things to do next and a UI
592
+ * that cannot tell them apart ends up saying "3 skipped" with no explanation of
593
+ * why - which reads as a malfunction rather than as a throttle working.
594
+ *
595
+ * No user name or address is echoed back. The client already holds both from the
596
+ * readiness payload it was rendering when the admin made the selection, so
597
+ * repeating them here would widen what this endpoint discloses in exchange for
598
+ * nothing.
599
+ */
600
+ function serializeSetupReminderUserResult(
601
+ result: SetupReminderUserResult,
602
+ ): JSONObject {
603
+ return {
604
+ userId: result.userId.toString(),
605
+ outcome: result.outcome,
606
+ message: result.message,
607
+ };
608
+ }
609
+
610
+ function serializeSetupReminderResult(result: SetupReminderResult): JSONObject {
611
+ const wire: SetupReminderResultWire = {
612
+ projectId: result.projectId.toString(),
613
+ requestedCount: result.requestedCount,
614
+ sentCount: result.sentCount,
615
+ skippedCount: result.skippedCount,
616
+ failedCount: result.failedCount,
617
+ results: result.results.map(serializeSetupReminderUserResult),
618
+ };
619
+
620
+ return wire as unknown as JSONObject;
621
+ }
622
+
623
+ /*
624
+ * Readiness for one policy's effective responder set - direct users, team
625
+ * members, schedule-layer users and overrides alike. This is what the policy
626
+ * overview card and the coloured dots on the escalation-rule responder chips
627
+ * read.
628
+ *
629
+ * Paged: `?limit=&skip=`. The chips surface asks about specific responders, so a
630
+ * policy with more responders than one page holds must be paged through before
631
+ * every chip can be dotted - a chip whose user is not in the page it has must
632
+ * render as unknown rather than as ready.
633
+ */
634
+ router.get(
635
+ "/on-call-readiness/policy/:policyId",
636
+ UserMiddleware.getUserMiddleware,
637
+ async (
638
+ req: ExpressRequest,
639
+ res: ExpressResponse,
640
+ next: NextFunction,
641
+ ): Promise<void> => {
642
+ try {
643
+ const databaseProps: DatabaseCommonInteractionProps =
644
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
645
+
646
+ const projectId: ObjectID =
647
+ CommonAPI.assertAuthenticatedProjectMember(databaseProps);
648
+
649
+ if (isRefreshRequested(req)) {
650
+ OnCallReadinessService.clearCache();
651
+ }
652
+
653
+ const policyId: ObjectID = readObjectIdParam(req, "policyId");
654
+
655
+ const page: ReadinessPageRequest = readPageRequest(req);
656
+
657
+ /*
658
+ * The policy id arrives from the caller and the readiness read below runs
659
+ * as root, so the policy's OWN projectId - not the header - is what has to
660
+ * agree with the project the caller was authorised for.
661
+ */
662
+ const policy: OnCallDutyPolicy | null =
663
+ await OnCallDutyPolicyService.findOneById({
664
+ id: policyId,
665
+ select: {
666
+ projectId: true,
667
+ },
668
+ props: {
669
+ isRoot: true,
670
+ },
671
+ });
672
+
673
+ CommonAPI.assertResourceBelongsToProject({
674
+ resourceProjectId: policy?.projectId,
675
+ projectId: projectId,
676
+ });
677
+
678
+ const summary: ReadinessSummary =
679
+ await OnCallReadinessService.getReadinessForPolicy(policyId, projectId);
680
+
681
+ return Response.sendJsonObjectResponse(
682
+ req,
683
+ res,
684
+ serializeSummaryPage(summary, page),
685
+ );
686
+ } catch (err) {
687
+ next(err);
688
+ }
689
+ },
690
+ );
691
+
692
+ /*
693
+ * Readiness across every policy in the project. Backs the On-Call > Readiness
694
+ * page and the section banner. The project comes from the `tenantid` header
695
+ * rather than the path, which is why assertAuthenticatedProjectMember - which
696
+ * checks the caller against that very header - is the whole authorisation story
697
+ * for this route.
698
+ *
699
+ * Paged: `?limit=&skip=`. This is the widest scope in the product - every
700
+ * responder on every policy - so it is the route that would otherwise serialise
701
+ * a whole project's coverage grid into one response.
702
+ */
703
+ router.get(
704
+ "/on-call-readiness/project",
705
+ UserMiddleware.getUserMiddleware,
706
+ async (
707
+ req: ExpressRequest,
708
+ res: ExpressResponse,
709
+ next: NextFunction,
710
+ ): Promise<void> => {
711
+ try {
712
+ const databaseProps: DatabaseCommonInteractionProps =
713
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
714
+
715
+ const projectId: ObjectID =
716
+ CommonAPI.assertAuthenticatedProjectMember(databaseProps);
717
+
718
+ if (isRefreshRequested(req)) {
719
+ OnCallReadinessService.clearCache();
720
+ }
721
+
722
+ const page: ReadinessPageRequest = readPageRequest(req);
723
+
724
+ const summary: ReadinessSummary =
725
+ await OnCallReadinessService.getReadinessForProject(projectId);
726
+
727
+ return Response.sendJsonObjectResponse(
728
+ req,
729
+ res,
730
+ serializeSummaryPage(summary, page),
731
+ );
732
+ } catch (err) {
733
+ next(err);
734
+ }
735
+ },
736
+ );
737
+
738
+ /*
739
+ * Readiness for a single responder. Used by the add-responder modal, which asks
740
+ * about a user the moment they are picked - before they are on any policy, so
741
+ * this route deliberately does not require the user to be on one.
742
+ */
743
+ router.get(
744
+ "/on-call-readiness/user/:userId",
745
+ UserMiddleware.getUserMiddleware,
746
+ async (
747
+ req: ExpressRequest,
748
+ res: ExpressResponse,
749
+ next: NextFunction,
750
+ ): Promise<void> => {
751
+ try {
752
+ const databaseProps: DatabaseCommonInteractionProps =
753
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
754
+
755
+ const projectId: ObjectID =
756
+ CommonAPI.assertAuthenticatedProjectMember(databaseProps);
757
+
758
+ if (isRefreshRequested(req)) {
759
+ OnCallReadinessService.clearCache();
760
+ }
761
+
762
+ const userId: ObjectID = readObjectIdParam(req, "userId");
763
+
764
+ await assertUserBelongsToProject(userId, projectId);
765
+
766
+ const readiness: UserReadiness =
767
+ await OnCallReadinessService.getReadinessForUser(userId, projectId);
768
+
769
+ return Response.sendJsonObjectResponse(
770
+ req,
771
+ res,
772
+ serializeUserReadiness(readiness),
773
+ );
774
+ } catch (err) {
775
+ next(err);
776
+ }
777
+ },
778
+ );
779
+
780
+ /*
781
+ * Ask a set of responders to finish their own notification setup.
782
+ *
783
+ * The only WRITE on this router, and the only thing in the readiness feature
784
+ * that reaches outside the product. It exists because the gaps this feature
785
+ * reports are not gaps an admin can close: a notification method lives on the
786
+ * responder's own account and has to be verified by them, so "tell them" is
787
+ * genuinely the whole of the available fix.
788
+ *
789
+ * Everything about who is mailed, what the mail says and whether it is sent at
790
+ * all belongs to OnCallSetupReminderService - including the re-check that each
791
+ * id is a member of this project, which is duplicated there on purpose so the
792
+ * service is safe for any caller and not only for this route.
793
+ *
794
+ * Two gates, in this order: membership (which project is this, and is the caller
795
+ * in it) and then permission (may they act in it). Both run before the body is
796
+ * read, because a route that validates a payload for a caller it is about to
797
+ * refuse has told that caller something about the payload format.
798
+ *
799
+ * The response is a PER-USER array, never a bare success. A caller that ticked
800
+ * eight responders and got a 200 back has no idea that two were reminded this
801
+ * morning and one has no address on file, and a UI that renders a green tick
802
+ * over that has told its user something false about whether a page will reach
803
+ * somebody. See serializeSetupReminderResult.
804
+ */
805
+ router.post(
806
+ "/on-call-readiness/send-setup-reminder",
807
+ UserMiddleware.getUserMiddleware,
808
+ async (
809
+ req: ExpressRequest,
810
+ res: ExpressResponse,
811
+ next: NextFunction,
812
+ ): Promise<void> => {
813
+ try {
814
+ const databaseProps: DatabaseCommonInteractionProps =
815
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
816
+
817
+ const projectId: ObjectID =
818
+ CommonAPI.assertAuthenticatedProjectMember(databaseProps);
819
+
820
+ assertCanSendSetupReminders(databaseProps);
821
+
822
+ const userIds: Array<ObjectID> = readUserIdsFromBody(req);
823
+
824
+ const result: SetupReminderResult =
825
+ await OnCallSetupReminderService.sendSetupReminders({
826
+ projectId: projectId,
827
+ userIds: userIds,
828
+ });
829
+
830
+ return Response.sendJsonObjectResponse(
831
+ req,
832
+ res,
833
+ serializeSetupReminderResult(result),
834
+ );
835
+ } catch (err) {
836
+ next(err);
837
+ }
838
+ },
839
+ );
840
+
841
+ export default router;