@oneuptime/common 12.0.6 → 12.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/Models/DatabaseModels/AIInsight.ts +1 -1
  2. package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
  3. package/Models/DatabaseModels/DeletedProject.ts +595 -0
  4. package/Models/DatabaseModels/Index.ts +2 -0
  5. package/Models/DatabaseModels/Monitor.ts +111 -0
  6. package/Models/DatabaseModels/Project.ts +3 -3
  7. package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
  8. package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
  9. package/Models/DatabaseModels/WorkflowLog.ts +38 -0
  10. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
  11. package/Server/API/FileAPI.ts +15 -2
  12. package/Server/API/MicrosoftTeamsAPI.ts +6 -1
  13. package/Server/API/ProjectAPI.ts +214 -0
  14. package/Server/API/StatusPageAPI.ts +39 -6
  15. package/Server/API/UserAPI.ts +16 -1
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  22. package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
  23. package/Server/Services/AIAgentService.ts +20 -0
  24. package/Server/Services/DashboardDomainService.ts +73 -28
  25. package/Server/Services/DatabaseService.ts +1 -0
  26. package/Server/Services/DeletedProjectService.ts +138 -0
  27. package/Server/Services/FileService.ts +61 -0
  28. package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
  29. package/Server/Services/IncidentPublicNoteService.ts +18 -0
  30. package/Server/Services/Index.ts +2 -0
  31. package/Server/Services/MonitorService.ts +311 -0
  32. package/Server/Services/ProbeService.ts +20 -0
  33. package/Server/Services/ProjectService.ts +297 -1
  34. package/Server/Services/PushNotificationService.ts +71 -0
  35. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
  36. package/Server/Services/StatusPageAnnouncementService.ts +53 -0
  37. package/Server/Services/StatusPageDomainService.ts +73 -28
  38. package/Server/Services/TeamMemberService.ts +117 -12
  39. package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
  40. package/Server/Services/TelemetryEntityService.ts +114 -1
  41. package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
  42. package/Server/Services/UserWebhookService.ts +34 -109
  43. package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
  44. package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
  45. package/Server/Types/Database/DeleteById.ts +2 -0
  46. package/Server/Types/Database/DeleteOneBy.ts +6 -0
  47. package/Server/Types/Domain.ts +41 -0
  48. package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
  49. package/Server/Types/Workflow/Components/API/Get.ts +2 -1
  50. package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
  51. package/Server/Types/Workflow/Components/API/Post.ts +2 -1
  52. package/Server/Types/Workflow/Components/API/Put.ts +2 -1
  53. package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
  54. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
  55. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
  56. package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
  57. package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
  58. package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
  59. package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
  60. package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
  61. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
  62. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
  63. package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
  64. package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
  65. package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
  66. package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
  67. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
  68. package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
  69. package/Server/Types/Workflow/TriggerCode.ts +12 -0
  70. package/Server/Types/Workflow/Workflow.ts +5 -0
  71. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  72. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
  73. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
  74. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
  75. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  76. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
  77. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
  78. package/Server/Utils/DataSource/EgressGuard.ts +176 -16
  79. package/Server/Utils/DataSource/HttpFetch.ts +6 -45
  80. package/Server/Utils/Execute.ts +8 -0
  81. package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
  82. package/Server/Utils/LLM/LLMService.ts +57 -12
  83. package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
  84. package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
  85. package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
  86. package/Server/Utils/Monitor/MonitorResource.ts +36 -0
  87. package/Server/Utils/Response.ts +142 -6
  88. package/Server/Utils/SSRFProtection.ts +273 -60
  89. package/Server/Utils/StartServer.ts +8 -0
  90. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
  91. package/Server/Utils/VM/VMAPI.ts +56 -8
  92. package/Server/Utils/VM/VMRunner.ts +88 -1
  93. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
  94. package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
  95. package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
  96. package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
  97. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
  98. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
  99. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
  100. package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
  101. package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
  102. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
  103. package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
  104. package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
  105. package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
  106. package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
  107. package/Tests/Server/API/ProjectAPI.test.ts +299 -1
  108. package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
  109. package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
  110. package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
  111. package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
  112. package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
  113. package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
  114. package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
  115. package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
  116. package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
  117. package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
  118. package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
  119. package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
  120. package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
  122. package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
  123. package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
  124. package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
  125. package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
  126. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
  127. package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
  128. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
  129. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
  130. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
  131. package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
  132. package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
  133. package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
  134. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
  135. package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
  136. package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
  137. package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
  138. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
  139. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
  140. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
  141. package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
  142. package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
  143. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
  144. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
  145. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
  146. package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
  147. package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
  148. package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
  149. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
  150. package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
  151. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
  152. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
  153. package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
  154. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
  155. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
  156. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
  157. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
  158. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
  159. package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
  160. package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
  161. package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
  162. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
  163. package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
  164. package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
  165. package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
  166. package/Tests/Types/JSONFunctions.test.ts +252 -1
  167. package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
  168. package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
  169. package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
  170. package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
  171. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
  172. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
  173. package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
  174. package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
  175. package/Tests/Types/Workflow/Templates.test.ts +403 -0
  176. package/Tests/UI/Components/404.test.tsx +1 -1
  177. package/Tests/UI/Components/Alert.test.tsx +1 -1
  178. package/Tests/UI/Components/Badge.test.tsx +1 -1
  179. package/Tests/UI/Components/BasicForm.test.tsx +39 -10
  180. package/Tests/UI/Components/Button.test.tsx +1 -1
  181. package/Tests/UI/Components/Card.test.tsx +1 -1
  182. package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
  183. package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
  184. package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
  185. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
  186. package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
  187. package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
  188. package/Tests/UI/Components/Dropdown.test.tsx +1 -1
  189. package/Tests/UI/Components/FilePicker.test.tsx +1 -1
  190. package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
  191. package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
  192. package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
  193. package/Tests/UI/Components/HiddenText.test.tsx +1 -1
  194. package/Tests/UI/Components/Input.test.tsx +1 -1
  195. package/Tests/UI/Components/Loader.test.tsx +1 -1
  196. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
  197. package/Tests/UI/Components/MasterPage.test.tsx +1 -1
  198. package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
  199. package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
  201. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
  202. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
  203. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
  204. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
  205. package/Tests/UI/Components/NavBar.test.tsx +1 -1
  206. package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
  207. package/Tests/UI/Components/Pagination.test.tsx +1 -1
  208. package/Tests/UI/Components/Pill.test.tsx +1 -1
  209. package/Tests/UI/Components/Probe.test.tsx +1 -1
  210. package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
  211. package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
  212. package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
  213. package/Tests/UI/Components/SideOver.test.tsx +500 -6
  214. package/Tests/UI/Components/Tabs.test.tsx +1 -1
  215. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
  216. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
  217. package/Tests/UI/Components/TextArea.test.tsx +1 -1
  218. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
  219. package/Tests/UI/Components/Toast.test.tsx +1 -1
  220. package/Tests/UI/Components/Toggle.test.tsx +1 -1
  221. package/Tests/UI/Components/TopSection.test.tsx +1 -1
  222. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
  223. package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
  224. package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
  225. package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
  226. package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
  227. package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
  228. package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
  229. package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
  230. package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
  231. package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
  232. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
  233. package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
  234. package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
  235. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
  236. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
  237. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
  238. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
  239. package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
  240. package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
  241. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
  242. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
  243. package/Tests/Utils/Realtime.test.ts +78 -0
  244. package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
  245. package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
  246. package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
  247. package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
  248. package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
  249. package/Types/AI/FixPullRequestCiStatus.ts +1 -1
  250. package/Types/AI/FixVerificationStatus.ts +2 -2
  251. package/Types/API/Hostname.ts +92 -4
  252. package/Types/API/URL.ts +43 -25
  253. package/Types/Billing/BalanceAdjustmentType.ts +14 -0
  254. package/Types/Billing/ProjectBalanceType.ts +13 -0
  255. package/Types/Domain.ts +26 -0
  256. package/Types/File/MimeType.ts +11 -0
  257. package/Types/JSONFunctions.ts +15 -0
  258. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
  259. package/Types/SerializableObjectDictionary.ts +133 -39
  260. package/Types/Telemetry/EntitySource.ts +40 -0
  261. package/Types/Telemetry/EntityType.ts +27 -0
  262. package/Types/Telemetry/EntityTypeGroups.ts +65 -0
  263. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
  264. package/Types/Workflow/Component.ts +29 -0
  265. package/Types/Workflow/Components/API.ts +35 -0
  266. package/Types/Workflow/Components/BaseModel.ts +96 -28
  267. package/Types/Workflow/StepTrace.ts +181 -0
  268. package/Types/Workflow/TemplateSyntax.ts +499 -0
  269. package/Types/Workflow/Templates.ts +316 -0
  270. package/Typings/Index.d.ts +12 -0
  271. package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
  272. package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
  273. package/UI/Components/Dictionary/Dictionary.tsx +23 -6
  274. package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
  275. package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
  276. package/UI/Components/Forms/Types/Field.ts +7 -0
  277. package/UI/Components/Forms/Validation.ts +63 -1
  278. package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
  279. package/UI/Components/Input/Input.tsx +31 -3
  280. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
  281. package/UI/Components/Modal/ConfirmModal.tsx +10 -5
  282. package/UI/Components/Modal/Modal.tsx +64 -51
  283. package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
  284. package/UI/Components/SideOver/SideOver.tsx +195 -68
  285. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
  286. package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
  287. package/UI/Components/Workflow/Component.tsx +28 -26
  288. package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
  289. package/UI/Components/Workflow/GraphLint.ts +591 -0
  290. package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
  291. package/UI/Components/Workflow/ModelSchema.ts +196 -0
  292. package/UI/Components/Workflow/RunForm.tsx +41 -7
  293. package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
  294. package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
  295. package/UI/Components/Workflow/Utils.ts +93 -1
  296. package/UI/Components/Workflow/Workflow.tsx +77 -4
  297. package/UI/Types/LayeredDismissal.ts +31 -0
  298. package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
  299. package/UI/Utils/PageScrollLock.ts +66 -0
  300. package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
  301. package/Utils/Dashboard/VariableInterpolation.ts +19 -1
  302. package/Utils/LegacySerializedArray.ts +60 -0
  303. package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
  304. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
  305. package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
  306. package/Utils/Telemetry/EntityKey.ts +66 -0
  307. package/Utils/Telemetry/SavedViewFilters.ts +88 -0
  308. package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
  309. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
  311. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
  313. package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  315. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
  317. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/Project.js +3 -3
  319. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
  321. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
  323. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
  325. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  327. package/build/dist/Server/API/FileAPI.js +14 -2
  328. package/build/dist/Server/API/FileAPI.js.map +1 -1
  329. package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
  330. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  331. package/build/dist/Server/API/ProjectAPI.js +157 -4
  332. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  333. package/build/dist/Server/API/StatusPageAPI.js +27 -3
  334. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  335. package/build/dist/Server/API/UserAPI.js +16 -1
  336. package/build/dist/Server/API/UserAPI.js.map +1 -1
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  349. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
  350. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  351. package/build/dist/Server/Services/AIAgentService.js +17 -0
  352. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  353. package/build/dist/Server/Services/DashboardDomainService.js +55 -18
  354. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  355. package/build/dist/Server/Services/DatabaseService.js +1 -0
  356. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  357. package/build/dist/Server/Services/DeletedProjectService.js +124 -0
  358. package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
  359. package/build/dist/Server/Services/FileService.js +52 -0
  360. package/build/dist/Server/Services/FileService.js.map +1 -1
  361. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
  362. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  363. package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
  364. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  365. package/build/dist/Server/Services/Index.js +2 -0
  366. package/build/dist/Server/Services/Index.js.map +1 -1
  367. package/build/dist/Server/Services/MonitorService.js +232 -0
  368. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  369. package/build/dist/Server/Services/ProbeService.js +17 -0
  370. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  371. package/build/dist/Server/Services/ProjectService.js +228 -6
  372. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  373. package/build/dist/Server/Services/PushNotificationService.js +56 -0
  374. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  375. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
  376. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  377. package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
  378. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  379. package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
  380. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  381. package/build/dist/Server/Services/TeamMemberService.js +97 -6
  382. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  383. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
  384. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  385. package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
  386. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  387. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
  388. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  389. package/build/dist/Server/Services/UserWebhookService.js +31 -87
  390. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  391. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
  392. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  393. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
  394. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  395. package/build/dist/Server/Types/Domain.js +37 -0
  396. package/build/dist/Server/Types/Domain.js.map +1 -1
  397. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
  398. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  399. package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
  400. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  401. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
  402. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  403. package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
  404. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  405. package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
  406. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  407. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
  408. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  409. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
  410. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  411. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
  412. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  413. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
  414. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
  415. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
  416. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
  417. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
  418. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
  419. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
  420. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
  421. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
  422. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
  423. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
  424. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
  425. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
  426. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  427. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
  428. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
  429. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
  430. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
  431. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
  432. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
  433. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
  434. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
  435. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
  436. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  437. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
  438. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
  439. package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
  440. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  441. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
  442. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
  443. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
  444. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  445. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
  446. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
  447. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
  448. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  449. package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
  450. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  451. package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
  452. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  453. package/build/dist/Server/Utils/Execute.js +2 -2
  454. package/build/dist/Server/Utils/Execute.js.map +1 -1
  455. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
  456. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
  457. package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
  458. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
  460. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  461. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
  462. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
  464. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  465. package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
  466. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  467. package/build/dist/Server/Utils/Response.js +112 -5
  468. package/build/dist/Server/Utils/Response.js.map +1 -1
  469. package/build/dist/Server/Utils/SSRFProtection.js +219 -53
  470. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  471. package/build/dist/Server/Utils/StartServer.js +7 -0
  472. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  473. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
  474. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
  475. package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
  476. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  477. package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
  478. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  479. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
  480. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  481. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
  482. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  483. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  484. package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
  485. package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
  486. package/build/dist/Types/API/Hostname.js +73 -4
  487. package/build/dist/Types/API/Hostname.js.map +1 -1
  488. package/build/dist/Types/API/URL.js +42 -24
  489. package/build/dist/Types/API/URL.js.map +1 -1
  490. package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
  491. package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
  492. package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
  493. package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
  494. package/build/dist/Types/Domain.js +22 -0
  495. package/build/dist/Types/Domain.js.map +1 -1
  496. package/build/dist/Types/File/MimeType.js +11 -0
  497. package/build/dist/Types/File/MimeType.js.map +1 -1
  498. package/build/dist/Types/JSONFunctions.js +14 -0
  499. package/build/dist/Types/JSONFunctions.js.map +1 -1
  500. package/build/dist/Types/SerializableObjectDictionary.js +133 -39
  501. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  502. package/build/dist/Types/Telemetry/EntitySource.js +39 -0
  503. package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
  504. package/build/dist/Types/Telemetry/EntityType.js +27 -0
  505. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  506. package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
  507. package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
  508. package/build/dist/Types/Workflow/Component.js +21 -0
  509. package/build/dist/Types/Workflow/Component.js.map +1 -1
  510. package/build/dist/Types/Workflow/Components/API.js +35 -0
  511. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  512. package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
  513. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  514. package/build/dist/Types/Workflow/StepTrace.js +104 -0
  515. package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
  516. package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
  517. package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
  518. package/build/dist/Types/Workflow/Templates.js +218 -0
  519. package/build/dist/Types/Workflow/Templates.js.map +1 -0
  520. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
  521. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
  522. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
  523. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
  524. package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
  525. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  526. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
  527. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  528. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
  529. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Validation.js +44 -0
  531. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  532. package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
  533. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
  534. package/build/dist/UI/Components/Input/Input.js +12 -4
  535. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  536. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
  537. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  538. package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
  539. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  540. package/build/dist/UI/Components/Modal/Modal.js +55 -39
  541. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  542. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
  543. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  544. package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
  545. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  546. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
  547. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  548. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
  549. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  550. package/build/dist/UI/Components/Workflow/Component.js +20 -19
  551. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  552. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
  553. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  554. package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
  555. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
  556. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
  557. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
  558. package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
  559. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
  560. package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
  561. package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
  562. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
  563. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
  564. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
  565. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
  566. package/build/dist/UI/Components/Workflow/Utils.js +73 -1
  567. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  568. package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
  569. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  570. package/build/dist/UI/Types/LayeredDismissal.js +21 -0
  571. package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
  572. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
  573. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  574. package/build/dist/UI/Utils/PageScrollLock.js +52 -0
  575. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
  576. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
  577. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
  578. package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
  579. package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
  580. package/build/dist/Utils/LegacySerializedArray.js +51 -0
  581. package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
  582. package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
  583. package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
  584. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
  585. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
  586. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
  587. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  588. package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
  589. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  590. package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
  591. package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
  592. package/jest.config.json +3 -0
  593. package/package.json +1 -1
  594. package/tsconfig.json +3 -1
@@ -0,0 +1,579 @@
1
+ import AutocompleteTextInput from "../../../UI/Components/AutocompleteTextInput/AutocompleteTextInput";
2
+ import Dropdown, {
3
+ DropdownOption,
4
+ DropdownValue,
5
+ } from "../../../UI/Components/Dropdown/Dropdown";
6
+ import OperatorSelector from "../../../UI/Components/Filters/OperatorSelector";
7
+ import FilterOperator from "../../../UI/Components/Filters/Types/FilterOperator";
8
+ import ColorPicker from "../../../UI/Components/Forms/Fields/ColorPicker";
9
+ import IconPicker from "../../../UI/Components/Forms/Fields/IconPicker";
10
+ import Modal from "../../../UI/Components/Modal/Modal";
11
+ import IconProp from "../../../Types/Icon/IconProp";
12
+ /*
13
+ * The main entry, not "/extend-expect": the latter no longer ships type
14
+ * declarations, so every jest-dom matcher in this file fails to typecheck and
15
+ * the whole suite is skipped before a single assertion runs.
16
+ */
17
+ import "@testing-library/jest-dom";
18
+ import { cleanup, fireEvent, render, screen } from "@testing-library/react";
19
+ import React, { ReactElement } from "react";
20
+ import { createPortal } from "react-dom";
21
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
22
+
23
+ /*
24
+ * The reported bug (issue #3133): in the "Dashboard Variables" modal, clicking
25
+ * a suggested Attribute Key closed the whole modal and dropped the half-filled
26
+ * variable on the floor.
27
+ *
28
+ * The cause is not in the autocomplete. Every dropdown in this codebase portals
29
+ * its menu to document.body so a scroll container cannot clip it, and React
30
+ * dispatches synthetic events through the REACT tree rather than the DOM tree.
31
+ * So a click on a portalled option still bubbles into Modal's backdrop handler
32
+ * — which decided "outside" by asking whether the panel DOM-contains the event
33
+ * target. A portalled option never is, so every such pick read as a backdrop
34
+ * click and dismissed the dialog.
35
+ *
36
+ * That makes this a Modal-level contract rather than a per-dropdown quirk, and
37
+ * these tests state it once for each portalling surface that can appear in a
38
+ * modal body. Crucially they fire mousedown *and* click: Modal only dismisses
39
+ * on a press that both starts and ends outside, so a click-only test passes
40
+ * even with the bug fully present — which is exactly why it went unnoticed.
41
+ */
42
+
43
+ const SUGGESTIONS: Array<string> = [
44
+ "k8s.cluster.name",
45
+ "k8s.namespace.name",
46
+ "service.name",
47
+ ];
48
+
49
+ const TEXT_OPERATORS: Array<FilterOperator> = [
50
+ FilterOperator.Contains,
51
+ FilterOperator.EqualTo,
52
+ FilterOperator.StartsWith,
53
+ ];
54
+
55
+ const DROPDOWN_OPTIONS: Array<DropdownOption> = [
56
+ { value: "production", label: "Production" },
57
+ { value: "staging", label: "Staging" },
58
+ ];
59
+
60
+ /*
61
+ * The layer a user actually presses is the one the panel is centred in — the
62
+ * tinted sheet behind it is aria-hidden and inert.
63
+ */
64
+ type GetBackdropLayerFunction = () => HTMLElement;
65
+
66
+ const getBackdropLayer: GetBackdropLayerFunction = (): HTMLElement => {
67
+ return screen.getByTestId("modal").parentElement!;
68
+ };
69
+
70
+ /*
71
+ * A real pointer press is mousedown-then-click. Modal tracks both ends, so
72
+ * anything that only fires `click` cannot observe this bug at all.
73
+ */
74
+ type PressFunction = (element: HTMLElement) => void;
75
+
76
+ const press: PressFunction = (element: HTMLElement): void => {
77
+ fireEvent.mouseDown(element);
78
+ fireEvent.mouseUp(element);
79
+ fireEvent.click(element);
80
+ };
81
+
82
+ /*
83
+ * A press that begins on one element and ends on another. The browser reports
84
+ * the click against the nearest common ancestor of the two, which for anything
85
+ * inside the dialog is the backdrop layer itself — so the click alone cannot
86
+ * tell a drag from a dismissal, and the modal has to watch both ends.
87
+ */
88
+ type DragPressFunction = (from: HTMLElement, to: HTMLElement) => void;
89
+
90
+ const dragPress: DragPressFunction = (
91
+ from: HTMLElement,
92
+ to: HTMLElement,
93
+ ): void => {
94
+ fireEvent.mouseDown(from);
95
+ fireEvent.mouseUp(to);
96
+ fireEvent.click(getBackdropLayer().parentElement!);
97
+ };
98
+
99
+ interface PortalHarness {
100
+ onClose: () => void;
101
+ }
102
+
103
+ type RenderInModalFunction = (children: ReactElement) => PortalHarness;
104
+
105
+ const renderInModal: RenderInModalFunction = (
106
+ children: ReactElement,
107
+ ): PortalHarness => {
108
+ const onClose: () => void = jest.fn();
109
+
110
+ render(
111
+ <Modal title="Dashboard Variables" onClose={onClose}>
112
+ {children}
113
+ </Modal>,
114
+ );
115
+
116
+ return { onClose: onClose };
117
+ };
118
+
119
+ describe("Modal dismissal and portalled dropdown menus", () => {
120
+ afterEach(() => {
121
+ cleanup();
122
+ });
123
+
124
+ describe("the contract: a portalled pick is not a backdrop press", () => {
125
+ /*
126
+ * States the rule in isolation, with no real dropdown involved: any child
127
+ * a modal body portals out of the panel keeps its clicks to itself. Every
128
+ * component test below is a specific instance of this one.
129
+ */
130
+ test("clicking any child portalled to document.body leaves the modal open", () => {
131
+ const onClose: () => void = jest.fn();
132
+ const onPick: () => void = jest.fn();
133
+
134
+ render(
135
+ <Modal title="Dashboard Variables" onClose={onClose}>
136
+ <div>
137
+ {createPortal(
138
+ <button
139
+ type="button"
140
+ data-testid="portalled-option"
141
+ onClick={onPick}
142
+ >
143
+ pick me
144
+ </button>,
145
+ document.body,
146
+ )}
147
+ </div>
148
+ </Modal>,
149
+ );
150
+
151
+ const option: HTMLElement = screen.getByTestId("portalled-option");
152
+
153
+ // Premise of the bug: the option is genuinely outside the panel's DOM.
154
+ expect(screen.getByTestId("modal").contains(option)).toBe(false);
155
+ expect(option.parentElement).toBe(document.body);
156
+
157
+ press(option);
158
+
159
+ expect(onPick).toHaveBeenCalledTimes(1);
160
+ expect(onClose).not.toHaveBeenCalled();
161
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
162
+ });
163
+
164
+ test("a portalled press does not arm the next backdrop click", () => {
165
+ const onClose: () => void = jest.fn();
166
+
167
+ render(
168
+ <Modal title="Dashboard Variables" onClose={onClose}>
169
+ <div>
170
+ {createPortal(
171
+ <button type="button" data-testid="portalled-option">
172
+ pick me
173
+ </button>,
174
+ document.body,
175
+ )}
176
+ </div>
177
+ </Modal>,
178
+ );
179
+
180
+ /*
181
+ * Modal remembers where a press started so a drag out of the panel is not
182
+ * a dismissal. A portalled mousedown must not leave that memory set to
183
+ * "outside", or the user's very next click anywhere would close the
184
+ * dialog.
185
+ */
186
+ fireEvent.mouseDown(screen.getByTestId("portalled-option"));
187
+ fireEvent.click(screen.getByTestId("modal-title"));
188
+
189
+ expect(onClose).not.toHaveBeenCalled();
190
+ });
191
+ });
192
+
193
+ describe("AutocompleteTextInput — the surface in the reported bug", () => {
194
+ test("picking a suggestion sets the value and keeps the modal open", () => {
195
+ const onChange: (value: string) => void = jest.fn();
196
+ const harness: PortalHarness = renderInModal(
197
+ <AutocompleteTextInput
198
+ dataTestId="attribute-key"
199
+ suggestions={SUGGESTIONS}
200
+ onChange={onChange}
201
+ />,
202
+ );
203
+
204
+ fireEvent.focus(screen.getByTestId("attribute-key"));
205
+
206
+ const option: HTMLElement = screen.getAllByRole("option")[1]!;
207
+
208
+ expect(screen.getByTestId("modal").contains(option)).toBe(false);
209
+
210
+ press(option);
211
+
212
+ // Both halves of the report: the value lands *and* the dialog survives.
213
+ expect(onChange).toHaveBeenCalledWith("k8s.namespace.name");
214
+ expect(screen.getByTestId("attribute-key")).toHaveValue(
215
+ "k8s.namespace.name",
216
+ );
217
+ expect(harness.onClose).not.toHaveBeenCalled();
218
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
219
+ });
220
+
221
+ test("picking several suggestions in a row never closes the modal", () => {
222
+ const values: Array<string> = [];
223
+ const harness: PortalHarness = renderInModal(
224
+ <AutocompleteTextInput
225
+ dataTestId="attribute-key"
226
+ suggestions={SUGGESTIONS}
227
+ onChange={(value: string) => {
228
+ values.push(value);
229
+ }}
230
+ />,
231
+ );
232
+
233
+ /*
234
+ * A user correcting themselves: pick, retype to search again, pick a
235
+ * different one. Retyping is what reopens the menu and widens the list
236
+ * back out, since a picked value filters the suggestions down to itself.
237
+ */
238
+ const input: HTMLElement = screen.getByTestId("attribute-key");
239
+
240
+ fireEvent.focus(input);
241
+ press(screen.getAllByRole("option")[0]!);
242
+
243
+ fireEvent.change(input, { target: { value: "service" } });
244
+ press(screen.getAllByRole("option")[0]!);
245
+
246
+ fireEvent.change(input, { target: { value: "k8s.n" } });
247
+ press(screen.getAllByRole("option")[0]!);
248
+
249
+ expect(values).toEqual([
250
+ "k8s.cluster.name",
251
+ "service",
252
+ "service.name",
253
+ "k8s.n",
254
+ "k8s.namespace.name",
255
+ ]);
256
+ expect(input).toHaveValue("k8s.namespace.name");
257
+ expect(harness.onClose).not.toHaveBeenCalled();
258
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
259
+ });
260
+
261
+ test("the menu closes on pick without taking the dialog with it", () => {
262
+ renderInModal(
263
+ <AutocompleteTextInput
264
+ dataTestId="attribute-key"
265
+ suggestions={SUGGESTIONS}
266
+ />,
267
+ );
268
+
269
+ fireEvent.focus(screen.getByTestId("attribute-key"));
270
+ press(screen.getAllByRole("option")[0]!);
271
+
272
+ expect(screen.queryByTestId("attribute-key-suggestions")).toBeNull();
273
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
274
+ });
275
+
276
+ test("picking the loading row's replacement after suggestions arrive still keeps the modal", () => {
277
+ const onChange: (value: string) => void = jest.fn();
278
+ const onClose: () => void = jest.fn();
279
+
280
+ const { rerender } = render(
281
+ <Modal title="Dashboard Variables" onClose={onClose}>
282
+ <AutocompleteTextInput
283
+ dataTestId="attribute-key"
284
+ suggestions={[]}
285
+ isLoadingSuggestions={true}
286
+ loadingMessage="Loading attributes..."
287
+ onChange={onChange}
288
+ />
289
+ </Modal>,
290
+ );
291
+
292
+ fireEvent.focus(screen.getByTestId("attribute-key"));
293
+ expect(screen.getByTestId("attribute-key-suggestions")).toHaveTextContent(
294
+ "Loading attributes...",
295
+ );
296
+
297
+ // Suggestions land asynchronously in the real dashboard.
298
+ rerender(
299
+ <Modal title="Dashboard Variables" onClose={onClose}>
300
+ <AutocompleteTextInput
301
+ dataTestId="attribute-key"
302
+ suggestions={SUGGESTIONS}
303
+ isLoadingSuggestions={false}
304
+ onChange={onChange}
305
+ />
306
+ </Modal>,
307
+ );
308
+
309
+ press(screen.getAllByRole("option")[0]!);
310
+
311
+ expect(onChange).toHaveBeenCalledWith("k8s.cluster.name");
312
+ expect(onClose).not.toHaveBeenCalled();
313
+ });
314
+ });
315
+
316
+ describe("OperatorSelector", () => {
317
+ test("picking an operator keeps the modal open", () => {
318
+ const onChange: (value: FilterOperator) => void = jest.fn();
319
+ const harness: PortalHarness = renderInModal(
320
+ <OperatorSelector
321
+ value={FilterOperator.Contains}
322
+ options={TEXT_OPERATORS}
323
+ onChange={onChange}
324
+ />,
325
+ );
326
+
327
+ fireEvent.click(screen.getByRole("button", { name: /contains/i }));
328
+
329
+ const option: HTMLElement = screen.getByRole("option", {
330
+ name: "starts with",
331
+ });
332
+
333
+ expect(screen.getByTestId("modal").contains(option)).toBe(false);
334
+
335
+ press(option);
336
+
337
+ expect(onChange).toHaveBeenCalledWith(FilterOperator.StartsWith);
338
+ expect(harness.onClose).not.toHaveBeenCalled();
339
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
340
+ });
341
+ });
342
+
343
+ /*
344
+ * ColorPicker and IconPicker share UseAnchoredFieldPopup, whose own
345
+ * outside-click guard is a native capture-phase document listener — it never
346
+ * touches React propagation, so both were as exposed as the autocomplete.
347
+ * They reach a modal through FormField's Color and Icon schema types, which
348
+ * is to say through every ModelFormModal that edits a label or an incident
349
+ * role: picking a colour used to throw the whole form away.
350
+ */
351
+ describe("ColorPicker", () => {
352
+ test("pressing inside the colour popup keeps the modal open", () => {
353
+ const harness: PortalHarness = renderInModal(
354
+ <ColorPicker
355
+ dataTestId="color-value"
356
+ placeholder="Pick a color"
357
+ onChange={jest.fn()}
358
+ />,
359
+ );
360
+
361
+ fireEvent.click(screen.getByTestId("color-value"));
362
+
363
+ const popup: HTMLElement = screen.getByTestId("color-picker-popup");
364
+
365
+ expect(screen.getByTestId("modal").contains(popup)).toBe(false);
366
+
367
+ // The hex field: the part of the popup a user is most likely to press.
368
+ press(popup.querySelector("input") as HTMLElement);
369
+
370
+ expect(harness.onClose).not.toHaveBeenCalled();
371
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
372
+ expect(screen.getByTestId("color-picker-popup")).toBeInTheDocument();
373
+ });
374
+ });
375
+
376
+ describe("IconPicker", () => {
377
+ test("picking an icon keeps the modal open", () => {
378
+ const onChange: (value: IconProp | null) => void = jest.fn();
379
+ const harness: PortalHarness = renderInModal(
380
+ <IconPicker
381
+ dataTestId="icon-value"
382
+ placeholder="No icon"
383
+ onChange={onChange}
384
+ />,
385
+ );
386
+
387
+ fireEvent.click(screen.getByTestId("icon-value"));
388
+
389
+ const popup: HTMLElement = screen.getByTestId("icon-picker-popup");
390
+ const iconCell: HTMLElement = popup.querySelector(
391
+ `[title="${IconProp.Alert}"]`,
392
+ ) as HTMLElement;
393
+
394
+ expect(screen.getByTestId("modal").contains(popup)).toBe(false);
395
+ expect(iconCell).not.toBeNull();
396
+
397
+ press(iconCell);
398
+
399
+ expect(onChange).toHaveBeenLastCalledWith(IconProp.Alert);
400
+ expect(harness.onClose).not.toHaveBeenCalled();
401
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
402
+ });
403
+ });
404
+
405
+ describe("Dropdown (react-select portalled menu)", () => {
406
+ test("picking an option keeps the modal open", () => {
407
+ const onChange: (
408
+ value: DropdownValue | Array<DropdownValue> | null,
409
+ ) => void = jest.fn();
410
+ const harness: PortalHarness = renderInModal(
411
+ <Dropdown
412
+ options={DROPDOWN_OPTIONS}
413
+ onChange={onChange}
414
+ placeholder="Select an environment"
415
+ />,
416
+ );
417
+
418
+ fireEvent.keyDown(screen.getByRole("combobox"), { key: "ArrowDown" });
419
+
420
+ const option: HTMLElement = screen.getByText("Staging");
421
+
422
+ /*
423
+ * react-select is configured with menuPortalTarget={document.body}, so
424
+ * its option is outside the panel exactly like the hand-rolled menus.
425
+ *
426
+ * This one was never broken: react-select's own `onMenuMouseDown` calls
427
+ * stopPropagation, so the press never armed Modal's backdrop tracking.
428
+ * That immunity is incidental to a third-party implementation detail
429
+ * rather than something this codebase decided, which is precisely why it
430
+ * is worth pinning — a react-select upgrade that drops it would otherwise
431
+ * reintroduce the bug on every dropdown in every modal, silently.
432
+ */
433
+ expect(screen.getByTestId("modal").contains(option)).toBe(false);
434
+
435
+ press(option);
436
+
437
+ expect(onChange).toHaveBeenCalledWith("staging");
438
+ expect(harness.onClose).not.toHaveBeenCalled();
439
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
440
+ });
441
+ });
442
+
443
+ describe("genuine backdrop dismissal still works", () => {
444
+ /*
445
+ * The fix narrows what counts as a backdrop press, so the far more common
446
+ * behaviour it sits next to has to be pinned down just as hard — a fix that
447
+ * made modals undismissable would be a worse bug than the one it replaced.
448
+ */
449
+ test("a press that starts and ends on the backdrop closes the modal", () => {
450
+ const harness: PortalHarness = renderInModal(<div>Modal content</div>);
451
+
452
+ press(getBackdropLayer());
453
+
454
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
455
+ });
456
+
457
+ test("a press on the scroll layer that holds the backdrop closes the modal", () => {
458
+ const harness: PortalHarness = renderInModal(<div>Modal content</div>);
459
+
460
+ // The 'fixed inset-0 overflow-y-auto' layer the handlers are bound to.
461
+ press(getBackdropLayer().parentElement!);
462
+
463
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
464
+ });
465
+
466
+ test("a press inside the panel does not close the modal", () => {
467
+ const harness: PortalHarness = renderInModal(<div>Modal content</div>);
468
+
469
+ press(screen.getByText("Modal content"));
470
+
471
+ expect(harness.onClose).not.toHaveBeenCalled();
472
+ });
473
+
474
+ test("backdrop dismissal still works after a portalled pick", () => {
475
+ const harness: PortalHarness = renderInModal(
476
+ <AutocompleteTextInput
477
+ dataTestId="attribute-key"
478
+ suggestions={SUGGESTIONS}
479
+ />,
480
+ );
481
+
482
+ fireEvent.focus(screen.getByTestId("attribute-key"));
483
+ press(screen.getAllByRole("option")[0]!);
484
+
485
+ expect(harness.onClose).not.toHaveBeenCalled();
486
+
487
+ // The dialog is still dismissable the ordinary way.
488
+ press(getBackdropLayer());
489
+
490
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
491
+ });
492
+
493
+ test("a press that starts on the backdrop and ends on the panel is a drag, not a dismissal", () => {
494
+ const harness: PortalHarness = renderInModal(<div>Modal content</div>);
495
+
496
+ /*
497
+ * Pressing outside and releasing inside — reaching for the backdrop,
498
+ * changing your mind, letting go over the form. The click lands on the
499
+ * backdrop layer either way, so before the modal tracked the release this
500
+ * discarded whatever had been typed.
501
+ */
502
+ dragPress(getBackdropLayer(), screen.getByText("Modal content"));
503
+
504
+ expect(harness.onClose).not.toHaveBeenCalled();
505
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
506
+ });
507
+
508
+ test("a press that starts on the panel and ends on the backdrop is a drag too", () => {
509
+ const harness: PortalHarness = renderInModal(<div>Modal content</div>);
510
+
511
+ // Selecting text in the body and releasing past the panel edge.
512
+ dragPress(screen.getByText("Modal content"), getBackdropLayer());
513
+
514
+ expect(harness.onClose).not.toHaveBeenCalled();
515
+ });
516
+
517
+ test("a release on a portalled menu does not dismiss the dialog either", () => {
518
+ const harness: PortalHarness = renderInModal(
519
+ <div>
520
+ {createPortal(
521
+ <button type="button" data-testid="portalled-option">
522
+ pick me
523
+ </button>,
524
+ document.body,
525
+ )}
526
+ </div>,
527
+ );
528
+
529
+ dragPress(getBackdropLayer(), screen.getByTestId("portalled-option"));
530
+
531
+ expect(harness.onClose).not.toHaveBeenCalled();
532
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
533
+ });
534
+
535
+ test("dismissing an open picker leaves the modal behind it standing", () => {
536
+ const harness: PortalHarness = renderInModal(
537
+ <ColorPicker
538
+ dataTestId="color-value"
539
+ placeholder="Pick a color"
540
+ onChange={jest.fn()}
541
+ />,
542
+ );
543
+
544
+ fireEvent.click(screen.getByTestId("color-value"));
545
+ expect(screen.getByTestId("color-picker-popup")).toBeInTheDocument();
546
+
547
+ /*
548
+ * The popup covers a good part of the backdrop, so "click off it to put
549
+ * it away" is the obvious gesture — and one press used to close the
550
+ * picker and the form behind it together. Dismissal belongs to the
551
+ * topmost layer that is open.
552
+ */
553
+ press(getBackdropLayer());
554
+
555
+ expect(screen.queryByTestId("color-picker-popup")).toBeNull();
556
+ expect(harness.onClose).not.toHaveBeenCalled();
557
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
558
+
559
+ // With the picker gone, the very next backdrop press dismisses as usual.
560
+ press(getBackdropLayer());
561
+
562
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
563
+ });
564
+
565
+ test("the close button still closes a modal holding a portalled menu", () => {
566
+ const harness: PortalHarness = renderInModal(
567
+ <AutocompleteTextInput
568
+ dataTestId="attribute-key"
569
+ suggestions={SUGGESTIONS}
570
+ />,
571
+ );
572
+
573
+ fireEvent.focus(screen.getByTestId("attribute-key"));
574
+ fireEvent.click(screen.getByTestId("close-button"));
575
+
576
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
577
+ });
578
+ });
579
+ });