@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,1390 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import {
11
+ act,
12
+ cleanup,
13
+ fireEvent,
14
+ render,
15
+ screen,
16
+ waitFor,
17
+ } from "@testing-library/react";
18
+ import React from "react";
19
+ import getJestMockFunction, { MockFunction } from "../../MockType";
20
+
21
+ /*
22
+ * The setup checklist, rendered for real.
23
+ *
24
+ * The pure model has its own suite; everything here is a property that is
25
+ * invisible to it, because it is about what reaches the DOM and what reaches
26
+ * the network:
27
+ *
28
+ * - the three step states have to LOOK different, not merely carry different
29
+ * enum members, because the entire promise of this page is that somebody
30
+ * can see what is left without reading every row;
31
+ * - a step nobody can act on must not be clickable, and an actionable one
32
+ * must go to the page that fixes it - a checklist whose links land on the
33
+ * wrong settings page is worse than no links;
34
+ * - a slow load keeps the card's shape, because a card that blanks reads as
35
+ * broken and this one waits on several requests;
36
+ * - a failed readiness read shows the server's own message and NO list. The
37
+ * all-clear is the one claim this page must never make on partial evidence,
38
+ * and a green "you are all set" drawn from a failed request is exactly that
39
+ * claim;
40
+ * - one refused probe must not take the page down with it;
41
+ * - and no raw email address or phone number ever reaches the DOM. The server
42
+ * masks; this asserts the browser layer never un-masks, so a change that
43
+ * starts rendering a raw field the API happens to include fails here even
44
+ * with the server-side masking tests green. The fixture plants the raw
45
+ * values next to the masked ones precisely so that assertion means
46
+ * something.
47
+ */
48
+
49
+ /*
50
+ * Mounting the real page costs real module work per test. The default 5s budget
51
+ * is a machine-speed check, not an assertion about this code.
52
+ */
53
+ jest.setTimeout(120000);
54
+
55
+ const apiGetMock: MockFunction = getJestMockFunction();
56
+ const getCommonHeadersMock: MockFunction = getJestMockFunction();
57
+ const getListMock: MockFunction = getJestMockFunction();
58
+ const getItemMock: MockFunction = getJestMockFunction();
59
+ const countMock: MockFunction = getJestMockFunction();
60
+ const navigateMock: MockFunction = getJestMockFunction();
61
+
62
+ /*
63
+ * The arrow wrappers are load bearing: jest.mock is hoisted above the compiled
64
+ * requires, so the consts above are still in their temporal dead zone when the
65
+ * factory body runs. Dereferencing them lazily, at call time, is what works.
66
+ */
67
+ jest.mock("../../../UI/Utils/API/API", () => {
68
+ return {
69
+ __esModule: true,
70
+ default: {
71
+ get: (...args: Array<any>) => {
72
+ return apiGetMock(...args);
73
+ },
74
+ /*
75
+ * Reads the error's own text, so an assertion about the message on screen
76
+ * is an assertion that the SERVER's message was surfaced rather than a
77
+ * generic one this test also wrote.
78
+ */
79
+ getFriendlyMessage: (error: unknown) => {
80
+ return error instanceof Error
81
+ ? error.message
82
+ : "Could not load your setup";
83
+ },
84
+ },
85
+ };
86
+ });
87
+
88
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
89
+ return {
90
+ __esModule: true,
91
+ default: {
92
+ getCommonHeaders: (...args: Array<any>) => {
93
+ return getCommonHeadersMock(...args);
94
+ },
95
+ getList: (...args: Array<any>) => {
96
+ return getListMock(...args);
97
+ },
98
+ getItem: (...args: Array<any>) => {
99
+ return getItemMock(...args);
100
+ },
101
+ count: (...args: Array<any>) => {
102
+ return countMock(...args);
103
+ },
104
+ },
105
+ };
106
+ });
107
+
108
+ jest.mock("../../../UI/Utils/Navigation", () => {
109
+ return {
110
+ __esModule: true,
111
+ default: {
112
+ navigate: (...args: Array<any>) => {
113
+ return navigateMock(...args);
114
+ },
115
+ },
116
+ };
117
+ });
118
+
119
+ jest.mock("react-i18next", () => {
120
+ return {
121
+ useTranslation: () => {
122
+ return {
123
+ t: (key: string, options?: { defaultValue?: string }): string => {
124
+ return options?.defaultValue ?? key;
125
+ },
126
+ };
127
+ },
128
+ };
129
+ });
130
+
131
+ /* Imports of the code under test come AFTER every jest.mock call. */
132
+ import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
133
+ import HTTPResponse from "../../../Types/API/HTTPResponse";
134
+ import Route from "../../../Types/API/Route";
135
+ import { JSONArray, JSONObject } from "../../../Types/JSON";
136
+ import NotificationRuleType from "../../../Types/NotificationRule/NotificationRuleType";
137
+ import NotificationSettingEventType from "../../../Types/NotificationSetting/NotificationSettingEventType";
138
+ import ObjectID from "../../../Types/ObjectID";
139
+ import WorkspaceType from "../../../Types/Workspace/WorkspaceType";
140
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
141
+ import IncomingCallPolicy from "../../../Models/DatabaseModels/IncomingCallPolicy";
142
+ import Project from "../../../Models/DatabaseModels/Project";
143
+ import ProjectUserProfile from "../../../Models/DatabaseModels/ProjectUserProfile";
144
+ import TeamMemberCustomField from "../../../Models/DatabaseModels/TeamMemberCustomField";
145
+ import UserCall from "../../../Models/DatabaseModels/UserCall";
146
+ import UserEmail from "../../../Models/DatabaseModels/UserEmail";
147
+ import UserIncomingCallNumber from "../../../Models/DatabaseModels/UserIncomingCallNumber";
148
+ import UserNotificationSetting from "../../../Models/DatabaseModels/UserNotificationSetting";
149
+ import UserSMS from "../../../Models/DatabaseModels/UserSMS";
150
+ import WorkspaceProjectAuthToken from "../../../Models/DatabaseModels/WorkspaceProjectAuthToken";
151
+ import WorkspaceUserAuthToken from "../../../Models/DatabaseModels/WorkspaceUserAuthToken";
152
+ import ProjectUtil from "../../../UI/Utils/Project";
153
+ import UserUtil from "../../../UI/Utils/User";
154
+ import SetupChecklist from "../../../../App/FeatureSet/Dashboard/src/Components/UserSettings/SetupChecklist/SetupChecklist";
155
+ import RouteMap, {
156
+ RouteUtil,
157
+ } from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
158
+ import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
159
+
160
+ const PROJECT_ID: ObjectID = new ObjectID(
161
+ "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
162
+ );
163
+ const USER_ID: ObjectID = new ObjectID("bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb");
164
+
165
+ const SEVERITY_ONE: string = "11111111-1111-4111-8111-111111111111";
166
+ const SEVERITY_TWO: string = "22222222-2222-4222-8222-222222222222";
167
+ const ALERT_SEVERITY: string = "33333333-3333-4333-8333-333333333333";
168
+
169
+ /*
170
+ * The raw values that must never be rendered. They are planted INSIDE the
171
+ * readiness payload next to their masked forms, which is the whole point: the
172
+ * assertion "no email address appears in the DOM" only means something if an
173
+ * email address was available to leak.
174
+ */
175
+ const RAW_EMAIL: string = "ada.lovelace@analytical-engine.example.com";
176
+ const RAW_PHONE: string = "+441632960123";
177
+
178
+ const EMAIL_PATTERN: RegExp = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/;
179
+ const PHONE_PATTERN: RegExp = /\+?\d[\d\s().-]{6,}\d/;
180
+
181
+ type CoverageFunction = (params?: {
182
+ incidentSev2HasRule?: boolean | undefined;
183
+ includeAlerts?: boolean | undefined;
184
+ }) => JSONArray;
185
+
186
+ const coverageJson: CoverageFunction = (params?: {
187
+ incidentSev2HasRule?: boolean | undefined;
188
+ includeAlerts?: boolean | undefined;
189
+ }): JSONArray => {
190
+ const cells: JSONArray = [
191
+ {
192
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT,
193
+ severityId: SEVERITY_ONE,
194
+ severityName: "Sev1",
195
+ hasRule: true,
196
+ isOptOut: false,
197
+ },
198
+ {
199
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT,
200
+ severityId: SEVERITY_TWO,
201
+ severityName: "Sev2",
202
+ hasRule: params?.incidentSev2HasRule ?? true,
203
+ isOptOut: false,
204
+ },
205
+ {
206
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE,
207
+ severityId: SEVERITY_ONE,
208
+ severityName: "Sev1",
209
+ hasRule: true,
210
+ isOptOut: false,
211
+ },
212
+ {
213
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE,
214
+ severityId: SEVERITY_TWO,
215
+ severityName: "Sev2",
216
+ hasRule: true,
217
+ isOptOut: false,
218
+ },
219
+ ];
220
+
221
+ if (params?.includeAlerts ?? true) {
222
+ cells.push({
223
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT,
224
+ severityId: ALERT_SEVERITY,
225
+ severityName: "Warning",
226
+ hasRule: true,
227
+ isOptOut: false,
228
+ });
229
+ cells.push({
230
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT_EPISODE,
231
+ severityId: ALERT_SEVERITY,
232
+ severityName: "Warning",
233
+ hasRule: true,
234
+ isOptOut: false,
235
+ });
236
+ }
237
+
238
+ return cells;
239
+ };
240
+
241
+ type ReadinessJsonFunction = (overrides?: JSONObject | undefined) => JSONObject;
242
+
243
+ const readinessJson: ReadinessJsonFunction = (
244
+ overrides?: JSONObject | undefined,
245
+ ): JSONObject => {
246
+ return {
247
+ userId: USER_ID.toString(),
248
+ userName: "Ada Lovelace",
249
+ /*
250
+ * The login email is deliberately a REAL address here. The server sends it
251
+ * unmasked (it is admin-readable everywhere a user is listed), so it is one
252
+ * of the values this page has to decline to render.
253
+ */
254
+ userEmail: RAW_EMAIL,
255
+ status: "Ready",
256
+ methods: [
257
+ {
258
+ methodId: "method-email",
259
+ methodType: "Email",
260
+ maskedIdentifier: "a•••@•••.com",
261
+ isVerified: true,
262
+ // Not on the real wire; planted so the leak assertion has something to catch.
263
+ email: RAW_EMAIL,
264
+ },
265
+ {
266
+ methodId: "method-sms",
267
+ methodType: "SMS",
268
+ maskedIdentifier: "+44 ••• ••• 0123",
269
+ isVerified: true,
270
+ phone: RAW_PHONE,
271
+ },
272
+ ],
273
+ coverage: coverageJson(),
274
+ reasons: [],
275
+ reachedVia: ["Team"],
276
+ ...overrides,
277
+ } as JSONObject;
278
+ };
279
+
280
+ type RespondWithFunction = (json: JSONObject) => void;
281
+
282
+ const respondWithReadiness: RespondWithFunction = (json: JSONObject): void => {
283
+ apiGetMock.mockImplementation(((): Promise<HTTPResponse<JSONObject>> => {
284
+ return Promise.resolve(new HTTPResponse<JSONObject>(200, json, {}));
285
+ }) as never);
286
+ };
287
+
288
+ /*
289
+ * The probe fixtures. Everything defaults to "nothing configured, nothing to
290
+ * do" so that each test opts in to exactly the state it is about, and a probe
291
+ * a test never mentions cannot quietly produce a row it did not expect.
292
+ */
293
+ interface ProbeState {
294
+ notificationSettings: Array<UserNotificationSetting>;
295
+ customFields: Array<TeamMemberCustomField>;
296
+ userProfiles: Array<ProjectUserProfile>;
297
+ incomingCallPolicyCount: number;
298
+ incomingCallNumberCount: number;
299
+ slackProjectCount: number;
300
+ slackUserCount: number;
301
+ teamsProjectCount: number;
302
+ teamsUserCount: number;
303
+ failingListModels: Array<{ new (): BaseModel }>;
304
+ }
305
+
306
+ let probes: ProbeState;
307
+
308
+ interface SettingChannels {
309
+ eventType: NotificationSettingEventType;
310
+ alertByEmail?: boolean | undefined;
311
+ alertBySMS?: boolean | undefined;
312
+ alertByCall?: boolean | undefined;
313
+ alertByPush?: boolean | undefined;
314
+ alertByWhatsApp?: boolean | undefined;
315
+ alertByTelegram?: boolean | undefined;
316
+ alertByWebhook?: boolean | undefined;
317
+ }
318
+
319
+ type MakeSettingFunction = (params: SettingChannels) => UserNotificationSetting;
320
+
321
+ const makeSetting: MakeSettingFunction = (
322
+ params: SettingChannels,
323
+ ): UserNotificationSetting => {
324
+ const setting: UserNotificationSetting = new UserNotificationSetting();
325
+ setting.eventType = params.eventType;
326
+ setting.alertByEmail = params.alertByEmail ?? false;
327
+ setting.alertBySMS = params.alertBySMS ?? false;
328
+ setting.alertByCall = params.alertByCall ?? false;
329
+ setting.alertByPush = params.alertByPush ?? false;
330
+ setting.alertByWhatsApp = params.alertByWhatsApp ?? false;
331
+ setting.alertByTelegram = params.alertByTelegram ?? false;
332
+ setting.alertByWebhook = params.alertByWebhook ?? false;
333
+
334
+ return setting;
335
+ };
336
+
337
+ type WireProbesFunction = () => void;
338
+
339
+ const wireProbes: WireProbesFunction = (): void => {
340
+ getListMock.mockImplementation((async (data: {
341
+ modelType: { new (): BaseModel };
342
+ }): Promise<unknown> => {
343
+ if (
344
+ probes.failingListModels.some((model: { new (): BaseModel }): boolean => {
345
+ return model === data.modelType;
346
+ })
347
+ ) {
348
+ /*
349
+ * Thrown from inside the async body rather than returned as a
350
+ * pre-built rejected promise: zone.js reports the latter as an
351
+ * unhandled rejection in the microtask between construction and the
352
+ * await that catches it, which fills a passing run with alarming
353
+ * console noise.
354
+ */
355
+ throw new Error("Refused");
356
+ }
357
+
358
+ if (data.modelType === UserNotificationSetting) {
359
+ return Promise.resolve({ data: probes.notificationSettings });
360
+ }
361
+
362
+ if (data.modelType === TeamMemberCustomField) {
363
+ return Promise.resolve({ data: probes.customFields });
364
+ }
365
+
366
+ if (data.modelType === ProjectUserProfile) {
367
+ return Promise.resolve({ data: probes.userProfiles });
368
+ }
369
+
370
+ return Promise.resolve({ data: [] });
371
+ }) as never);
372
+
373
+ countMock.mockImplementation(((data: {
374
+ modelType: { new (): BaseModel };
375
+ query: JSONObject;
376
+ }): Promise<number> => {
377
+ if (data.modelType === IncomingCallPolicy) {
378
+ return Promise.resolve(probes.incomingCallPolicyCount);
379
+ }
380
+
381
+ if (data.modelType === UserIncomingCallNumber) {
382
+ return Promise.resolve(probes.incomingCallNumberCount);
383
+ }
384
+
385
+ if (data.modelType === WorkspaceProjectAuthToken) {
386
+ return Promise.resolve(
387
+ data.query["workspaceType"] === WorkspaceType.Slack
388
+ ? probes.slackProjectCount
389
+ : probes.teamsProjectCount,
390
+ );
391
+ }
392
+
393
+ if (data.modelType === WorkspaceUserAuthToken) {
394
+ return Promise.resolve(
395
+ data.query["workspaceType"] === WorkspaceType.Slack
396
+ ? probes.slackUserCount
397
+ : probes.teamsUserCount,
398
+ );
399
+ }
400
+
401
+ return Promise.resolve(0);
402
+ }) as never);
403
+ };
404
+
405
+ type RenderChecklistFunction = () => void;
406
+
407
+ const renderChecklist: RenderChecklistFunction = (): void => {
408
+ render(<SetupChecklist userId={USER_ID} projectId={PROJECT_ID} />);
409
+ };
410
+
411
+ /*
412
+ * Waits until the checklist has actually RENDERED, not merely until its
413
+ * requests were made. Every negative assertion below has to run after this, or
414
+ * it is an assertion about an empty page and would pass against a component
415
+ * that renders nothing at all.
416
+ */
417
+ /*
418
+ * The project row, whose five switches decide both halves of the copy: the
419
+ * fallback flag picks which consequence sentence is true, and the four channel
420
+ * flags decide which of the reader's verified methods can carry anything. All
421
+ * four channel flags default to FALSE on a real Project, which is why they are
422
+ * spelled out per test rather than assumed.
423
+ */
424
+ type RespondWithProjectFunction = (params: {
425
+ disableFallback?: boolean | undefined;
426
+ enableAllChannels?: boolean | undefined;
427
+ enableSms?: boolean | undefined;
428
+ }) => void;
429
+
430
+ const respondWithProject: RespondWithProjectFunction = (params: {
431
+ disableFallback?: boolean | undefined;
432
+ enableAllChannels?: boolean | undefined;
433
+ enableSms?: boolean | undefined;
434
+ }): void => {
435
+ const project: Project = new Project();
436
+ project.disableOnCallNotificationFallback = params.disableFallback ?? false;
437
+ project.enableSmsNotifications =
438
+ params.enableSms ?? params.enableAllChannels ?? false;
439
+ project.enableCallNotifications = params.enableAllChannels ?? false;
440
+ project.enableWhatsAppNotifications = params.enableAllChannels ?? false;
441
+ project.enableTelegramNotifications = params.enableAllChannels ?? false;
442
+
443
+ getItemMock.mockImplementation((async (): Promise<Project> => {
444
+ return project;
445
+ }) as never);
446
+ };
447
+
448
+ type SettleFunction = () => Promise<void>;
449
+
450
+ const settle: SettleFunction = async (): Promise<void> => {
451
+ await waitFor((): void => {
452
+ expect(screen.getByTestId("setup-checklist")).toBeInTheDocument();
453
+ });
454
+
455
+ await act(async (): Promise<void> => {
456
+ await new Promise((resolve: (value: unknown) => void): void => {
457
+ setTimeout(resolve, 50);
458
+ });
459
+ });
460
+ };
461
+
462
+ beforeEach((): void => {
463
+ probes = {
464
+ notificationSettings: [
465
+ makeSetting({
466
+ eventType:
467
+ NotificationSettingEventType.SEND_WHEN_USER_IS_ON_CALL_ROSTER,
468
+ alertByEmail: true,
469
+ }),
470
+ ],
471
+ customFields: [],
472
+ userProfiles: [],
473
+ incomingCallPolicyCount: 0,
474
+ incomingCallNumberCount: 0,
475
+ slackProjectCount: 0,
476
+ slackUserCount: 0,
477
+ teamsProjectCount: 0,
478
+ teamsUserCount: 0,
479
+ failingListModels: [],
480
+ };
481
+
482
+ apiGetMock.mockReset();
483
+ getCommonHeadersMock.mockReset();
484
+ getListMock.mockReset();
485
+ getItemMock.mockReset();
486
+ countMock.mockReset();
487
+ navigateMock.mockReset();
488
+
489
+ getCommonHeadersMock.mockReturnValue({} as never);
490
+ respondWithReadiness(readinessJson());
491
+
492
+ respondWithProject({});
493
+
494
+ wireProbes();
495
+
496
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
497
+ jest.spyOn(UserUtil, "getUserId").mockReturnValue(USER_ID);
498
+ });
499
+
500
+ afterEach((): void => {
501
+ cleanup();
502
+ jest.restoreAllMocks();
503
+ });
504
+
505
+ describe("setup checklist page - the happy render", () => {
506
+ test("renders the checklist with its sections", async (): Promise<void> => {
507
+ renderChecklist();
508
+ await settle();
509
+
510
+ expect(
511
+ screen.getByTestId("setup-checklist-section-reachability"),
512
+ ).toBeInTheDocument();
513
+ expect(
514
+ screen.getByTestId("setup-checklist-section-paging"),
515
+ ).toBeInTheDocument();
516
+ expect(
517
+ screen.getByTestId("setup-checklist-section-awareness"),
518
+ ).toBeInTheDocument();
519
+ });
520
+
521
+ test("asks the readiness endpoint for the signed-in user, with tenant headers", async (): Promise<void> => {
522
+ renderChecklist();
523
+ await settle();
524
+
525
+ const url: string = String(
526
+ (apiGetMock.mock.calls[0]![0] as { url: unknown }).url,
527
+ );
528
+
529
+ expect(url).toContain(`/on-call-readiness/user/${USER_ID.toString()}`);
530
+ expect(getCommonHeadersMock).toHaveBeenCalled();
531
+ });
532
+
533
+ test("shows the green headline and no warning sentence when everything is done", async (): Promise<void> => {
534
+ renderChecklist();
535
+ await settle();
536
+
537
+ expect(screen.getByTestId("setup-checklist-headline")).toHaveAttribute(
538
+ "data-headline-status",
539
+ "Ready",
540
+ );
541
+ expect(screen.getByText("You are all set")).toBeInTheDocument();
542
+ expect(
543
+ screen.queryByTestId("setup-checklist-consequence"),
544
+ ).not.toBeInTheDocument();
545
+ });
546
+
547
+ /*
548
+ * The states have to be distinguishable on screen. Asserting the attribute
549
+ * rather than a class keeps the test about the SEMANTIC state while leaving
550
+ * the styling free to change.
551
+ */
552
+ test("draws complete, outstanding and not-applicable steps as different states", async (): Promise<void> => {
553
+ respondWithReadiness(
554
+ readinessJson({
555
+ status: "PartiallyReady",
556
+ coverage: coverageJson({
557
+ incidentSev2HasRule: false,
558
+ includeAlerts: false,
559
+ }),
560
+ }),
561
+ );
562
+
563
+ renderChecklist();
564
+ await settle();
565
+
566
+ expect(
567
+ screen.getByTestId("setup-checklist-step-add-method"),
568
+ ).toHaveAttribute("data-status", "Complete");
569
+ expect(
570
+ screen.getByTestId("setup-checklist-step-incident-rules"),
571
+ ).toHaveAttribute("data-status", "Incomplete");
572
+ expect(
573
+ screen.getByTestId("setup-checklist-step-alert-rules"),
574
+ ).toHaveAttribute("data-status", "NotApplicable");
575
+ });
576
+
577
+ test("names the severity that has no rule", async (): Promise<void> => {
578
+ respondWithReadiness(
579
+ readinessJson({
580
+ status: "PartiallyReady",
581
+ coverage: coverageJson({ incidentSev2HasRule: false }),
582
+ }),
583
+ );
584
+
585
+ renderChecklist();
586
+ await settle();
587
+
588
+ expect(
589
+ screen.getByTestId("setup-checklist-detail-incident-rules"),
590
+ ).toHaveTextContent("Sev2 has no rule.");
591
+ });
592
+
593
+ test("warns, in the second person, that gaps still reach you through the fallback", async (): Promise<void> => {
594
+ respondWithReadiness(
595
+ readinessJson({
596
+ status: "PartiallyReady",
597
+ coverage: coverageJson({ incidentSev2HasRule: false }),
598
+ }),
599
+ );
600
+
601
+ renderChecklist();
602
+ await settle();
603
+
604
+ expect(screen.getByTestId("setup-checklist-consequence")).toHaveTextContent(
605
+ "reach you through the fallback",
606
+ );
607
+ });
608
+
609
+ test("says pages are dropped when the project has the fallback switched off", async (): Promise<void> => {
610
+ respondWithProject({ disableFallback: true });
611
+
612
+ respondWithReadiness(
613
+ readinessJson({
614
+ status: "PartiallyReady",
615
+ coverage: coverageJson({ incidentSev2HasRule: false }),
616
+ }),
617
+ );
618
+
619
+ renderChecklist();
620
+ await settle();
621
+
622
+ expect(screen.getByTestId("setup-checklist-consequence")).toHaveTextContent(
623
+ "dropped",
624
+ );
625
+ });
626
+
627
+ /*
628
+ * The reassuring sentence and the alarming one are both plausible, and only
629
+ * one is true. With the project read refused, the page says neither - but it
630
+ * still names the gap.
631
+ */
632
+ test("says nothing about consequences when the project could not be read", async (): Promise<void> => {
633
+ getItemMock.mockImplementation((async (): Promise<never> => {
634
+ throw new Error("Refused");
635
+ }) as never);
636
+
637
+ respondWithReadiness(
638
+ readinessJson({
639
+ status: "PartiallyReady",
640
+ coverage: coverageJson({ incidentSev2HasRule: false }),
641
+ }),
642
+ );
643
+
644
+ renderChecklist();
645
+ await settle();
646
+
647
+ expect(
648
+ screen.queryByTestId("setup-checklist-consequence"),
649
+ ).not.toBeInTheDocument();
650
+ expect(
651
+ screen.getByTestId("setup-checklist-detail-incident-rules"),
652
+ ).toHaveTextContent("Sev2 has no rule.");
653
+ });
654
+ });
655
+
656
+ describe("setup checklist page - acting on a step", () => {
657
+ test("an outstanding step navigates to the page that fixes it", async (): Promise<void> => {
658
+ respondWithReadiness(
659
+ readinessJson({
660
+ status: "PartiallyReady",
661
+ coverage: coverageJson({ incidentSev2HasRule: false }),
662
+ }),
663
+ );
664
+
665
+ renderChecklist();
666
+ await settle();
667
+
668
+ fireEvent.click(screen.getByTestId("setup-checklist-step-incident-rules"));
669
+
670
+ const expected: Route = RouteUtil.populateRouteParams(
671
+ RouteMap[PageMap.USER_SETTINGS_INCIDENT_ON_CALL_RULES] as Route,
672
+ );
673
+
674
+ expect(navigateMock).toHaveBeenCalledTimes(1);
675
+ expect(String(navigateMock.mock.calls[0]![0])).toBe(String(expected));
676
+ });
677
+
678
+ test("the alert rules step goes to the alert page, not the incident page", async (): Promise<void> => {
679
+ const withUncoveredAlert: JSONArray = [
680
+ ...coverageJson({ includeAlerts: false }),
681
+ {
682
+ ruleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT,
683
+ severityId: ALERT_SEVERITY,
684
+ severityName: "Warning",
685
+ hasRule: false,
686
+ isOptOut: false,
687
+ },
688
+ ];
689
+
690
+ respondWithReadiness(
691
+ readinessJson({
692
+ status: "PartiallyReady",
693
+ coverage: withUncoveredAlert,
694
+ }),
695
+ );
696
+
697
+ renderChecklist();
698
+ await settle();
699
+
700
+ fireEvent.click(screen.getByTestId("setup-checklist-step-alert-rules"));
701
+
702
+ const expected: Route = RouteUtil.populateRouteParams(
703
+ RouteMap[PageMap.USER_SETTINGS_ALERT_ON_CALL_RULES] as Route,
704
+ );
705
+
706
+ expect(String(navigateMock.mock.calls[0]![0])).toBe(String(expected));
707
+ });
708
+
709
+ test("a completed step is inert", async (): Promise<void> => {
710
+ renderChecklist();
711
+ await settle();
712
+
713
+ const step: HTMLElement = screen.getByTestId(
714
+ "setup-checklist-step-add-method",
715
+ );
716
+
717
+ expect(step).not.toHaveAttribute("role", "button");
718
+
719
+ fireEvent.click(step);
720
+
721
+ expect(navigateMock).not.toHaveBeenCalled();
722
+ });
723
+
724
+ /*
725
+ * The blocked row's fix is on an admin screen this reader would be refused
726
+ * from. A link that 403s is worse than a sentence naming who to ask.
727
+ */
728
+ test("a blocked step is not clickable and carries no link", async (): Promise<void> => {
729
+ respondWithReadiness(
730
+ readinessJson({
731
+ status: "NotReachable",
732
+ methods: [
733
+ {
734
+ methodId: "method-sms",
735
+ methodType: "SMS",
736
+ maskedIdentifier: "+44 ••• ••• 0123",
737
+ isVerified: true,
738
+ },
739
+ ],
740
+ }),
741
+ );
742
+
743
+ renderChecklist();
744
+ await settle();
745
+
746
+ const step: HTMLElement = screen.getByTestId(
747
+ "setup-checklist-step-channels-enabled",
748
+ );
749
+
750
+ expect(step).toHaveAttribute("data-status", "Blocked");
751
+ expect(step).not.toHaveAttribute("role", "button");
752
+
753
+ fireEvent.click(step);
754
+
755
+ expect(navigateMock).not.toHaveBeenCalled();
756
+ expect(screen.getByText("Needs an admin")).toBeInTheDocument();
757
+ });
758
+
759
+ test("an outstanding step is reachable by keyboard", async (): Promise<void> => {
760
+ respondWithReadiness(
761
+ readinessJson({
762
+ status: "PartiallyReady",
763
+ coverage: coverageJson({ incidentSev2HasRule: false }),
764
+ }),
765
+ );
766
+
767
+ renderChecklist();
768
+ await settle();
769
+
770
+ const step: HTMLElement = screen.getByTestId(
771
+ "setup-checklist-step-incident-rules",
772
+ );
773
+
774
+ expect(step).toHaveAttribute("role", "button");
775
+ expect(step).toHaveAttribute("tabindex", "0");
776
+
777
+ fireEvent.keyDown(step, { key: "Enter" });
778
+
779
+ expect(navigateMock).toHaveBeenCalledTimes(1);
780
+ });
781
+ });
782
+
783
+ describe("setup checklist page - loading and failure", () => {
784
+ test("keeps the card's shape while loading rather than blanking", async (): Promise<void> => {
785
+ apiGetMock.mockImplementation(((): Promise<never> => {
786
+ return new Promise((): void => {
787
+ // never resolves: this test is about the state before the answer.
788
+ });
789
+ }) as never);
790
+
791
+ renderChecklist();
792
+
793
+ await waitFor((): void => {
794
+ expect(screen.getByTestId("setup-checklist-loading")).toBeInTheDocument();
795
+ });
796
+
797
+ expect(screen.queryByTestId("setup-checklist")).not.toBeInTheDocument();
798
+ });
799
+
800
+ test("surfaces the server's own message when readiness cannot be read", async (): Promise<void> => {
801
+ apiGetMock.mockImplementation((async (): Promise<never> => {
802
+ throw new Error("Readiness is having a bad day");
803
+ }) as never);
804
+
805
+ renderChecklist();
806
+
807
+ await waitFor((): void => {
808
+ expect(
809
+ screen.getByText("Readiness is having a bad day"),
810
+ ).toBeInTheDocument();
811
+ });
812
+ });
813
+
814
+ /*
815
+ * The claim this page must never make on partial evidence. A failed read has
816
+ * to look like a failed read, not like a clean bill of health.
817
+ */
818
+ test("never renders an all-clear when readiness failed", async (): Promise<void> => {
819
+ apiGetMock.mockImplementation((async (): Promise<never> => {
820
+ throw new Error("Nope");
821
+ }) as never);
822
+
823
+ renderChecklist();
824
+
825
+ await waitFor((): void => {
826
+ expect(screen.getByText("Nope")).toBeInTheDocument();
827
+ });
828
+
829
+ expect(screen.queryByTestId("setup-checklist")).not.toBeInTheDocument();
830
+ expect(screen.queryByText("You are all set")).not.toBeInTheDocument();
831
+ expect(
832
+ screen.queryByTestId("setup-checklist-step-add-method"),
833
+ ).not.toBeInTheDocument();
834
+ });
835
+
836
+ /*
837
+ * Anchored on the error MESSAGE appearing, not on the checklist being absent.
838
+ * The checklist is absent for the first few frames of every render, so a bare
839
+ * absence assertion here passes while the card is still a skeleton and would
840
+ * go on passing if the guard were deleted.
841
+ */
842
+ test("an HTTP error response is treated as a failure, not as an empty answer", async (): Promise<void> => {
843
+ apiGetMock.mockImplementation((async (): Promise<HTTPErrorResponse> => {
844
+ return new HTTPErrorResponse(500, {}, {});
845
+ }) as never);
846
+
847
+ renderChecklist();
848
+
849
+ await waitFor((): void => {
850
+ expect(screen.getByText("Could not load your setup")).toBeInTheDocument();
851
+ });
852
+
853
+ expect(screen.queryByTestId("setup-checklist")).not.toBeInTheDocument();
854
+ expect(screen.queryByText("You are all set")).not.toBeInTheDocument();
855
+ });
856
+
857
+ /*
858
+ * A 200 whose body is not a readiness payload. Without the userId guard this
859
+ * parses into an empty UserReadiness - no methods, no coverage - which the
860
+ * model would render as a tidy list of green rows: the all-clear, drawn from
861
+ * a response that said nothing at all.
862
+ */
863
+ test("treats a 200 that carries no readiness as a failure", async (): Promise<void> => {
864
+ apiGetMock.mockImplementation((async (): Promise<
865
+ HTTPResponse<JSONObject>
866
+ > => {
867
+ return new HTTPResponse<JSONObject>(200, {} as JSONObject, {});
868
+ }) as never);
869
+
870
+ renderChecklist();
871
+
872
+ await waitFor((): void => {
873
+ expect(
874
+ screen.getByText("Could not read your notification setup."),
875
+ ).toBeInTheDocument();
876
+ });
877
+
878
+ expect(screen.queryByTestId("setup-checklist")).not.toBeInTheDocument();
879
+ expect(screen.queryByText("You are all set")).not.toBeInTheDocument();
880
+ });
881
+
882
+ /*
883
+ * Readiness is cached server-side for 60 seconds. The whole reason somebody
884
+ * presses Recheck is that they have just fixed something, so a Recheck that
885
+ * re-reads a cache computed before the fix reports the stale answer and reads
886
+ * as broken. The automatic load must NOT bypass the cache - there the cache is
887
+ * doing its job.
888
+ */
889
+ test("Recheck bypasses the server cache, and the first load does not", async (): Promise<void> => {
890
+ renderChecklist();
891
+ await settle();
892
+
893
+ const firstUrl: string = String(
894
+ (apiGetMock.mock.calls[0]![0] as { url: unknown }).url,
895
+ );
896
+
897
+ expect(firstUrl).not.toContain("refresh");
898
+
899
+ const callsBefore: number = apiGetMock.mock.calls.length;
900
+
901
+ fireEvent.click(screen.getByTestId("setup-checklist-recheck"));
902
+
903
+ await waitFor((): void => {
904
+ expect(apiGetMock.mock.calls.length).toBeGreaterThan(callsBefore);
905
+ });
906
+
907
+ const recheckUrl: string = String(
908
+ (
909
+ apiGetMock.mock.calls[apiGetMock.mock.calls.length - 1]![0] as {
910
+ url: unknown;
911
+ }
912
+ ).url,
913
+ );
914
+
915
+ expect(recheckUrl).toContain("refresh=true");
916
+ });
917
+
918
+ /*
919
+ * A Recheck must not replace the list with grey blocks and take the button
920
+ * that was just pressed off screen.
921
+ */
922
+ test("Recheck keeps the list on screen instead of collapsing to skeletons", async (): Promise<void> => {
923
+ renderChecklist();
924
+ await settle();
925
+
926
+ fireEvent.click(screen.getByTestId("setup-checklist-recheck"));
927
+
928
+ expect(screen.getByTestId("setup-checklist")).toBeInTheDocument();
929
+ expect(
930
+ screen.queryByTestId("setup-checklist-loading"),
931
+ ).not.toBeInTheDocument();
932
+ });
933
+ });
934
+
935
+ describe("setup checklist page - one probe failing", () => {
936
+ /*
937
+ * Each probe answers exactly one optional row. Losing the whole page over a
938
+ * row the reader may not even need is a worse outcome than omitting it - and
939
+ * omitting it is not the same as claiming they have not done it.
940
+ */
941
+ test("a refused notification-settings read drops its rows and keeps the page", async (): Promise<void> => {
942
+ probes.failingListModels = [UserNotificationSetting];
943
+
944
+ renderChecklist();
945
+ await settle();
946
+
947
+ expect(
948
+ screen.getByTestId("setup-checklist-section-reachability"),
949
+ ).toBeInTheDocument();
950
+ expect(
951
+ screen.queryByTestId("setup-checklist-step-on-call-shift-alerts"),
952
+ ).not.toBeInTheDocument();
953
+ expect(
954
+ screen.queryByTestId("setup-checklist-step-deliverable-settings"),
955
+ ).not.toBeInTheDocument();
956
+ });
957
+
958
+ test("a refused count drops only the row it answered", async (): Promise<void> => {
959
+ countMock.mockImplementation((async (): Promise<number> => {
960
+ throw new Error("Refused");
961
+ }) as never);
962
+
963
+ renderChecklist();
964
+ await settle();
965
+
966
+ expect(
967
+ screen.getByTestId("setup-checklist-step-add-method"),
968
+ ).toBeInTheDocument();
969
+ expect(
970
+ screen.queryByTestId("setup-checklist-step-slack"),
971
+ ).not.toBeInTheDocument();
972
+ expect(
973
+ screen.queryByTestId("setup-checklist-step-incoming-call-number"),
974
+ ).not.toBeInTheDocument();
975
+ });
976
+ });
977
+
978
+ describe("setup checklist page - optional rows appear only when they apply", () => {
979
+ test("shows Slack once the project has connected it", async (): Promise<void> => {
980
+ probes.slackProjectCount = 1;
981
+ probes.slackUserCount = 0;
982
+
983
+ renderChecklist();
984
+ await settle();
985
+
986
+ const step: HTMLElement = screen.getByTestId("setup-checklist-step-slack");
987
+
988
+ expect(step).toHaveAttribute("data-status", "Incomplete");
989
+
990
+ fireEvent.click(step);
991
+
992
+ const expected: Route = RouteUtil.populateRouteParams(
993
+ RouteMap[PageMap.USER_SETTINGS_SLACK_INTEGRATION] as Route,
994
+ );
995
+
996
+ expect(String(navigateMock.mock.calls[0]![0])).toBe(String(expected));
997
+ });
998
+
999
+ test("hides Slack when the project never connected it", async (): Promise<void> => {
1000
+ renderChecklist();
1001
+ await settle();
1002
+
1003
+ expect(
1004
+ screen.queryByTestId("setup-checklist-step-slack"),
1005
+ ).not.toBeInTheDocument();
1006
+ });
1007
+
1008
+ test("shows the incoming call row only where inbound calls are routed", async (): Promise<void> => {
1009
+ probes.incomingCallPolicyCount = 2;
1010
+ probes.incomingCallNumberCount = 0;
1011
+
1012
+ renderChecklist();
1013
+ await settle();
1014
+
1015
+ expect(
1016
+ screen.getByTestId("setup-checklist-step-incoming-call-number"),
1017
+ ).toHaveAttribute("data-status", "Incomplete");
1018
+ });
1019
+
1020
+ test("counts custom fields by value, not by the profile row existing", async (): Promise<void> => {
1021
+ const field: TeamMemberCustomField = new TeamMemberCustomField();
1022
+ field.name = "Desk phone";
1023
+
1024
+ const other: TeamMemberCustomField = new TeamMemberCustomField();
1025
+ other.name = "Timezone";
1026
+
1027
+ const profile: ProjectUserProfile = new ProjectUserProfile();
1028
+ // an empty string is not an answer.
1029
+ profile.customFields = { "Desk phone": " ", Timezone: "Europe/London" };
1030
+
1031
+ probes.customFields = [field, other];
1032
+ probes.userProfiles = [profile];
1033
+
1034
+ renderChecklist();
1035
+ await settle();
1036
+
1037
+ expect(
1038
+ screen.getByTestId("setup-checklist-detail-custom-fields"),
1039
+ ).toHaveTextContent("1 field is still empty.");
1040
+ });
1041
+ });
1042
+
1043
+ describe("setup checklist page - deliverable notification settings", () => {
1044
+ /*
1045
+ * The pairing between a Notification Settings column and the readiness method
1046
+ * type that makes it deliverable, driven end to end.
1047
+ *
1048
+ * Every channel is switched ON and only three have a verified method, so a
1049
+ * single mis-paired row shows up as the wrong name in the sentence. The model
1050
+ * suite cannot catch this: it is handed the finished list of channel names,
1051
+ * so the mapping itself is only exercised here. Webhook is deliberately among
1052
+ * the verified ones - if Telegram were paired to "Webhook" by mistake it would
1053
+ * silently become deliverable, and no fixture without a verified webhook would
1054
+ * notice.
1055
+ */
1056
+ test("names exactly the switched-on channels with no verified method behind them", async (): Promise<void> => {
1057
+ respondWithProject({ enableAllChannels: true });
1058
+
1059
+ respondWithReadiness(
1060
+ readinessJson({
1061
+ methods: [
1062
+ {
1063
+ methodId: "m-email",
1064
+ methodType: "Email",
1065
+ maskedIdentifier: "a•••@•••.com",
1066
+ isVerified: true,
1067
+ },
1068
+ {
1069
+ methodId: "m-webhook",
1070
+ methodType: "Webhook",
1071
+ maskedIdentifier: "•••",
1072
+ isVerified: true,
1073
+ },
1074
+ {
1075
+ methodId: "m-whatsapp",
1076
+ methodType: "WhatsApp",
1077
+ maskedIdentifier: "+44 ••• ••• 0123",
1078
+ isVerified: true,
1079
+ },
1080
+ ],
1081
+ }),
1082
+ );
1083
+
1084
+ probes.notificationSettings = [
1085
+ makeSetting({
1086
+ eventType:
1087
+ NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
1088
+ alertByEmail: true,
1089
+ alertBySMS: true,
1090
+ alertByCall: true,
1091
+ alertByPush: true,
1092
+ alertByWhatsApp: true,
1093
+ alertByTelegram: true,
1094
+ alertByWebhook: true,
1095
+ }),
1096
+ ];
1097
+
1098
+ renderChecklist();
1099
+ await settle();
1100
+
1101
+ expect(
1102
+ screen.getByTestId("setup-checklist-detail-deliverable-settings"),
1103
+ ).toHaveTextContent(
1104
+ "You switched on SMS, Call, Push and Telegram, but have no verified method there, so those updates are not sent.",
1105
+ );
1106
+ });
1107
+
1108
+ /*
1109
+ * A verified method on a channel the PROJECT has switched off delivers
1110
+ * nothing. Readiness still reports it `isVerified: true` - the verification
1111
+ * really did happen - so scoring deliverability on verified alone would print
1112
+ * a clean bill of health to the one person whose SMS updates are going
1113
+ * nowhere.
1114
+ */
1115
+ test("does not count a verified method on a channel the project switched off", async (): Promise<void> => {
1116
+ respondWithProject({ enableAllChannels: false });
1117
+
1118
+ respondWithReadiness(
1119
+ readinessJson({
1120
+ methods: [
1121
+ {
1122
+ methodId: "m-email",
1123
+ methodType: "Email",
1124
+ maskedIdentifier: "a•••@•••.com",
1125
+ isVerified: true,
1126
+ },
1127
+ {
1128
+ methodId: "m-sms",
1129
+ methodType: "SMS",
1130
+ maskedIdentifier: "+44 ••• ••• 0123",
1131
+ isVerified: true,
1132
+ },
1133
+ ],
1134
+ }),
1135
+ );
1136
+
1137
+ probes.notificationSettings = [
1138
+ makeSetting({
1139
+ eventType:
1140
+ NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
1141
+ alertByEmail: true,
1142
+ alertBySMS: true,
1143
+ }),
1144
+ ];
1145
+
1146
+ renderChecklist();
1147
+ await settle();
1148
+
1149
+ expect(
1150
+ screen.getByTestId("setup-checklist-detail-deliverable-settings"),
1151
+ ).toHaveTextContent("You switched on SMS");
1152
+ });
1153
+
1154
+ test("counts the same method once the project switches its channel on", async (): Promise<void> => {
1155
+ respondWithProject({ enableSms: true });
1156
+
1157
+ respondWithReadiness(
1158
+ readinessJson({
1159
+ methods: [
1160
+ {
1161
+ methodId: "m-sms",
1162
+ methodType: "SMS",
1163
+ maskedIdentifier: "+44 ••• ••• 0123",
1164
+ isVerified: true,
1165
+ },
1166
+ ],
1167
+ }),
1168
+ );
1169
+
1170
+ probes.notificationSettings = [
1171
+ makeSetting({
1172
+ eventType:
1173
+ NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
1174
+ alertBySMS: true,
1175
+ }),
1176
+ ];
1177
+
1178
+ renderChecklist();
1179
+ await settle();
1180
+
1181
+ expect(
1182
+ screen.getByTestId("setup-checklist-step-deliverable-settings"),
1183
+ ).toHaveAttribute("data-status", "Complete");
1184
+ });
1185
+
1186
+ /*
1187
+ * An unverified address is the case this row exists for: the switch is green
1188
+ * and nothing arrives.
1189
+ */
1190
+ test("does not count an unverified method as deliverable", async (): Promise<void> => {
1191
+ respondWithProject({ enableAllChannels: true });
1192
+
1193
+ respondWithReadiness(
1194
+ readinessJson({
1195
+ methods: [
1196
+ {
1197
+ methodId: "m-email",
1198
+ methodType: "Email",
1199
+ maskedIdentifier: "a•••@•••.com",
1200
+ isVerified: false,
1201
+ },
1202
+ ],
1203
+ }),
1204
+ );
1205
+
1206
+ probes.notificationSettings = [
1207
+ makeSetting({
1208
+ eventType:
1209
+ NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
1210
+ alertByEmail: true,
1211
+ }),
1212
+ ];
1213
+
1214
+ renderChecklist();
1215
+ await settle();
1216
+
1217
+ expect(
1218
+ screen.getByTestId("setup-checklist-detail-deliverable-settings"),
1219
+ ).toHaveTextContent("You switched on Email");
1220
+ });
1221
+ });
1222
+
1223
+ describe("setup checklist page - workspace rows", () => {
1224
+ /*
1225
+ * Slack and Microsoft Teams are two rows answered by the same two queries
1226
+ * discriminated only by workspaceType. Swapping that argument would light up
1227
+ * the wrong row, and only a fixture where the two ANSWERS differ can tell.
1228
+ */
1229
+ test("keeps Slack and Microsoft Teams apart", async (): Promise<void> => {
1230
+ probes.slackProjectCount = 1;
1231
+ probes.slackUserCount = 1;
1232
+ probes.teamsProjectCount = 1;
1233
+ probes.teamsUserCount = 0;
1234
+
1235
+ renderChecklist();
1236
+ await settle();
1237
+
1238
+ expect(screen.getByTestId("setup-checklist-step-slack")).toHaveAttribute(
1239
+ "data-status",
1240
+ "Complete",
1241
+ );
1242
+ expect(
1243
+ screen.getByTestId("setup-checklist-step-microsoft-teams"),
1244
+ ).toHaveAttribute("data-status", "Incomplete");
1245
+ });
1246
+
1247
+ test("Microsoft Teams links to the Teams page, not the Slack one", async (): Promise<void> => {
1248
+ probes.teamsProjectCount = 1;
1249
+ probes.teamsUserCount = 0;
1250
+
1251
+ renderChecklist();
1252
+ await settle();
1253
+
1254
+ fireEvent.click(screen.getByTestId("setup-checklist-step-microsoft-teams"));
1255
+
1256
+ const expected: Route = RouteUtil.populateRouteParams(
1257
+ RouteMap[PageMap.USER_SETTINGS_MICROSOFT_TEAMS_INTEGRATION] as Route,
1258
+ );
1259
+
1260
+ expect(String(navigateMock.mock.calls[0]![0])).toBe(String(expected));
1261
+ });
1262
+ });
1263
+
1264
+ describe("setup checklist page - blocked steps are reconciled with the bar", () => {
1265
+ /*
1266
+ * Without this note somebody whose only verified method is on a switched-off
1267
+ * channel reads "N of N essential steps done" directly under "Nothing can
1268
+ * reach you yet", with nothing on screen explaining which to believe.
1269
+ */
1270
+ test("explains the steps the progress bar is not counting", async (): Promise<void> => {
1271
+ respondWithReadiness(
1272
+ readinessJson({
1273
+ status: "NotReachable",
1274
+ methods: [
1275
+ {
1276
+ methodId: "m-sms",
1277
+ methodType: "SMS",
1278
+ maskedIdentifier: "+44 ••• ••• 0123",
1279
+ isVerified: true,
1280
+ },
1281
+ ],
1282
+ }),
1283
+ );
1284
+
1285
+ renderChecklist();
1286
+ await settle();
1287
+
1288
+ expect(
1289
+ screen.getByTestId("setup-checklist-blocked-note"),
1290
+ ).toHaveTextContent("1 more step needs a project admin");
1291
+ });
1292
+
1293
+ test("says nothing about blocked steps when there are none", async (): Promise<void> => {
1294
+ renderChecklist();
1295
+ await settle();
1296
+
1297
+ expect(
1298
+ screen.queryByTestId("setup-checklist-blocked-note"),
1299
+ ).not.toBeInTheDocument();
1300
+ });
1301
+ });
1302
+
1303
+ describe("setup checklist page - what it never does", () => {
1304
+ /*
1305
+ * The second barrier. The server masks; this asserts the browser never
1306
+ * un-masks, so a future change that starts rendering a raw field the API
1307
+ * happens to include fails here even with the server-side masking tests
1308
+ * green.
1309
+ */
1310
+ test("renders no raw email address and no raw phone number", async (): Promise<void> => {
1311
+ respondWithReadiness(
1312
+ readinessJson({
1313
+ status: "PartiallyReady",
1314
+ coverage: coverageJson({ incidentSev2HasRule: false }),
1315
+ }),
1316
+ );
1317
+
1318
+ renderChecklist();
1319
+ await settle();
1320
+
1321
+ const markup: string = document.body.innerHTML;
1322
+
1323
+ expect(markup).not.toContain(RAW_EMAIL);
1324
+ expect(markup).not.toContain(RAW_PHONE);
1325
+
1326
+ const text: string = document.body.textContent || "";
1327
+
1328
+ expect(text).not.toMatch(EMAIL_PATTERN);
1329
+ expect(text).not.toMatch(PHONE_PATTERN);
1330
+ });
1331
+
1332
+ /*
1333
+ * Asserted on the REQUEST rather than the response: the readiness payload is
1334
+ * the sanctioned masked source for method information, and a checklist that
1335
+ * started reading UserEmail or UserSMS rows to enrich a tile would be reading
1336
+ * raw identifiers it has no need for.
1337
+ */
1338
+ test("never asks for a notification-method model", async (): Promise<void> => {
1339
+ renderChecklist();
1340
+ await settle();
1341
+
1342
+ const requestedModels: Array<unknown> = [
1343
+ ...getListMock.mock.calls,
1344
+ ...countMock.mock.calls,
1345
+ ].map((call: Array<unknown>): unknown => {
1346
+ return (call[0] as { modelType: unknown }).modelType;
1347
+ });
1348
+
1349
+ expect(requestedModels).not.toContain(UserEmail);
1350
+ expect(requestedModels).not.toContain(UserSMS);
1351
+ expect(requestedModels).not.toContain(UserCall);
1352
+ });
1353
+
1354
+ test("does not ask to verify methods when there are none to verify", async (): Promise<void> => {
1355
+ respondWithReadiness(
1356
+ readinessJson({
1357
+ status: "NotReachable",
1358
+ methods: [],
1359
+ }),
1360
+ );
1361
+
1362
+ renderChecklist();
1363
+ await settle();
1364
+
1365
+ expect(
1366
+ screen.getByTestId("setup-checklist-step-add-method"),
1367
+ ).toHaveAttribute("data-status", "Incomplete");
1368
+ expect(
1369
+ screen.queryByTestId("setup-checklist-step-verify-methods"),
1370
+ ).not.toBeInTheDocument();
1371
+ });
1372
+
1373
+ test("tells somebody with nothing configured that nothing can reach them", async (): Promise<void> => {
1374
+ respondWithReadiness(
1375
+ readinessJson({
1376
+ status: "NotReachable",
1377
+ methods: [],
1378
+ }),
1379
+ );
1380
+
1381
+ renderChecklist();
1382
+ await settle();
1383
+
1384
+ expect(screen.getByTestId("setup-checklist-headline")).toHaveAttribute(
1385
+ "data-headline-status",
1386
+ "NotReachable",
1387
+ );
1388
+ expect(screen.getByText("Nothing can reach you yet")).toBeInTheDocument();
1389
+ });
1390
+ });