@oneuptime/common 12.0.3 → 12.0.5

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 (516) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/CephCluster.ts +14 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +14 -6
  5. package/Models/DatabaseModels/Dashboard.ts +28 -0
  6. package/Models/DatabaseModels/DockerHost.ts +14 -0
  7. package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
  8. package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
  9. package/Models/DatabaseModels/Incident.ts +2 -0
  10. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  11. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  12. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  13. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  14. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  15. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +14 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
  18. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  19. package/Models/DatabaseModels/NetworkDevice.ts +14 -0
  20. package/Models/DatabaseModels/NetworkInterface.ts +18 -0
  21. package/Models/DatabaseModels/Project.ts +247 -11
  22. package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
  23. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  24. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  25. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  26. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  27. package/Models/DatabaseModels/Service.ts +30 -0
  28. package/Models/DatabaseModels/StatusPage.ts +28 -0
  29. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  30. package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
  31. package/Models/DatabaseModels/User.ts +30 -0
  32. package/Server/API/AIAgentDataAPI.ts +75 -55
  33. package/Server/API/AIInvestigationAPI.ts +175 -17
  34. package/Server/API/DashboardAPI.ts +429 -22
  35. package/Server/API/GitHubAPI.ts +119 -283
  36. package/Server/API/StatusPageAPI.ts +38 -19
  37. package/Server/API/UserAPI.ts +263 -1
  38. package/Server/EnvironmentConfig.ts +23 -3
  39. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  40. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  41. package/Server/Infrastructure/GlobalCache.ts +37 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  53. package/Server/Services/AIRunService.ts +78 -10
  54. package/Server/Services/AIService.ts +94 -22
  55. package/Server/Services/AlertFeedService.ts +5 -0
  56. package/Server/Services/AnalyticsDatabaseService.ts +101 -1
  57. package/Server/Services/CodeRepositoryService.ts +105 -2
  58. package/Server/Services/DatabaseService.ts +227 -3
  59. package/Server/Services/IncidentFeedService.ts +5 -0
  60. package/Server/Services/LlmLogService.ts +46 -2
  61. package/Server/Services/OpenTelemetryIngestService.ts +230 -26
  62. package/Server/Services/UserService.ts +184 -0
  63. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  65. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  66. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  67. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  68. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  69. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  70. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  71. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  72. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  73. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  74. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  75. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  76. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  77. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  78. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  79. package/Server/Utils/AI/SRE/README.md +1 -1
  80. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  81. package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
  82. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  83. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
  84. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
  85. package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
  86. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  87. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  88. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  89. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  90. package/Server/Utils/PasswordHash.ts +330 -0
  91. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  92. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  93. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  94. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  95. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  96. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
  97. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  98. package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
  99. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  100. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  101. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  102. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  103. package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
  104. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  105. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  106. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  107. package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
  108. package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
  109. package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
  110. package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
  111. package/Tests/Server/API/Helpers.ts +6 -1
  112. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  113. package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
  114. package/Tests/Server/Infrastructure/GlobalCache.test.ts +128 -0
  115. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
  116. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  117. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  118. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  119. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  120. package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
  121. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
  122. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +30 -1
  123. package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
  124. package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
  125. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +880 -0
  126. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  127. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  128. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  129. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  130. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  131. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
  132. package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
  133. package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
  134. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  135. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
  136. package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
  137. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  138. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  139. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  140. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  141. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  142. package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
  143. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
  144. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  145. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  146. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  147. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  148. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  149. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  150. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  151. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  152. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  153. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  154. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  155. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
  156. package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
  157. package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
  158. package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
  159. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  160. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  161. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  162. package/Tests/Server/Utils/PasswordHash.test.ts +585 -0
  163. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  164. package/Tests/Types/Database/ColumnLength.test.ts +7 -1
  165. package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
  166. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  167. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  168. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
  169. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  170. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  171. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
  172. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  173. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
  174. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  175. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  177. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  178. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  179. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
  180. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  181. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  182. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  183. package/Tests/Types/Permission.test.ts +137 -0
  184. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  185. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  186. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  187. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
  188. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  189. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  190. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  191. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  192. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  193. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  194. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  195. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  196. package/Tests/UI/Utils/Project.test.ts +31 -0
  197. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  198. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  199. package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
  200. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  201. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  202. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  203. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  204. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  205. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  206. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  207. package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
  208. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  209. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  210. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  211. package/Types/AI/CodeFixTaskContext.ts +63 -3
  212. package/Types/AI/CodeFixTaskType.ts +3 -3
  213. package/Types/Database/ColumnLength.ts +9 -1
  214. package/Types/Database/TableColumn.ts +11 -0
  215. package/Types/Database/UnsynchronizedIndex.ts +48 -0
  216. package/Types/HashedString.ts +140 -4
  217. package/Types/Monitor/CriteriaFilter.ts +4 -0
  218. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  219. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  220. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  221. package/Types/Monitor/MonitorMetricType.ts +8 -0
  222. package/Types/Monitor/MonitorStep.ts +10 -1
  223. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  224. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  225. package/Types/Permission.ts +23 -175
  226. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  227. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  228. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
  229. package/UI/Components/ErrorBoundary.tsx +138 -11
  230. package/UI/Components/Feed/FeedItem.tsx +9 -2
  231. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  232. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  233. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  234. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  235. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  236. package/UI/Components/Navbar/NavBar.tsx +12 -2
  237. package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
  238. package/UI/Utils/DownloadFile.ts +16 -8
  239. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  240. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  241. package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
  242. package/UI/Utils/Project.ts +4 -0
  243. package/UI/Utils/StatusPage.ts +8 -2
  244. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  245. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  246. package/Utils/Dashboard/GridLayout.ts +523 -0
  247. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  248. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  249. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  250. package/Utils/StatusPage/GroupTree.ts +157 -66
  251. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  252. package/Utils/TeamMembersByProject.ts +237 -0
  253. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  254. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  255. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  256. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  257. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  258. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  259. package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
  260. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
  262. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  264. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
  266. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
  268. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
  270. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  272. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  273. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  274. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  276. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  278. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  279. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  280. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  282. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  284. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
  286. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
  288. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  290. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
  292. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
  294. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/Project.js +257 -13
  296. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
  298. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  300. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  302. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  304. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  306. package/build/dist/Models/DatabaseModels/Service.js +28 -1
  307. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  309. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  311. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
  313. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/User.js +32 -0
  315. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  316. package/build/dist/Server/API/AIAgentDataAPI.js +49 -48
  317. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  318. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  319. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  320. package/build/dist/Server/API/DashboardAPI.js +312 -15
  321. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  322. package/build/dist/Server/API/GitHubAPI.js +94 -167
  323. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  324. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  325. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  326. package/build/dist/Server/API/UserAPI.js +187 -2
  327. package/build/dist/Server/API/UserAPI.js.map +1 -1
  328. package/build/dist/Server/EnvironmentConfig.js +21 -3
  329. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  330. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  331. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  332. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  333. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  334. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  335. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  353. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  354. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  355. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  356. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  358. package/build/dist/Server/Services/AIRunService.js +58 -12
  359. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  360. package/build/dist/Server/Services/AIService.js +74 -21
  361. package/build/dist/Server/Services/AIService.js.map +1 -1
  362. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  363. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  364. package/build/dist/Server/Services/AnalyticsDatabaseService.js +86 -2
  365. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  366. package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
  367. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  368. package/build/dist/Server/Services/DatabaseService.js +180 -3
  369. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  370. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  371. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  372. package/build/dist/Server/Services/LlmLogService.js +22 -1
  373. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  374. package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
  375. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  376. package/build/dist/Server/Services/UserService.js +165 -0
  377. package/build/dist/Server/Services/UserService.js.map +1 -1
  378. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  379. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  380. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  381. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  382. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  383. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  384. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  385. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  386. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  387. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  388. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  389. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  390. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  391. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  392. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  393. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  395. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  397. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  399. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  401. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  403. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  404. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  405. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  406. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  407. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  408. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  409. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  410. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  411. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  412. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
  413. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
  414. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  415. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  416. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
  417. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  418. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
  419. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  420. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
  421. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
  422. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  423. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  424. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  425. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  427. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  430. package/build/dist/Server/Utils/PasswordHash.js +258 -0
  431. package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
  432. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  433. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  434. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  435. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  436. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  437. package/build/dist/Types/Database/ColumnLength.js +9 -1
  438. package/build/dist/Types/Database/ColumnLength.js.map +1 -1
  439. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  440. package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
  441. package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
  442. package/build/dist/Types/HashedString.js +96 -5
  443. package/build/dist/Types/HashedString.js.map +1 -1
  444. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  445. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  446. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  447. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  448. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  449. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  450. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  451. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  452. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  453. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  455. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  456. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  457. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  458. package/build/dist/Types/Permission.js +23 -155
  459. package/build/dist/Types/Permission.js.map +1 -1
  460. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  461. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  462. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
  463. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  464. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  465. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  466. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  467. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  468. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  469. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  470. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  472. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  473. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  474. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  475. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  476. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  477. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  478. package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
  479. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  480. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
  481. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  482. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  483. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  484. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  485. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  486. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  487. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  488. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
  489. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
  490. package/build/dist/UI/Utils/Project.js +3 -0
  491. package/build/dist/UI/Utils/Project.js.map +1 -1
  492. package/build/dist/UI/Utils/StatusPage.js +4 -4
  493. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  494. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  495. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  496. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  497. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  498. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  499. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  500. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  501. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  502. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  503. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  504. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  505. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  506. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  507. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  508. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  509. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  510. package/build/dist/Utils/TeamMembersByProject.js +145 -0
  511. package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
  512. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  513. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  514. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  515. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  516. package/package.json +1 -1
@@ -402,12 +402,24 @@ enum Permission {
402
402
  EditScheduledMaintenanceOwnerUser = "EditScheduledMaintenanceOwnerUser",
403
403
  ReadScheduledMaintenanceOwnerUser = "ReadScheduledMaintenanceOwnerUser",
404
404
 
405
- CreateScheduledMaintenanceTemplateOwnerUser = "CreateScheduledMaintenanceOwnerUser",
405
+ /*
406
+ * The two Create members below shipped with the value of their non-template
407
+ * counterparts (2024-09-09, "Add new migration for ScheduledMaintenanceTemplate"),
408
+ * so `CreateScheduledMaintenanceTemplateOwnerUser === CreateScheduledMaintenanceOwnerUser`
409
+ * at runtime and the two capabilities were one permission wearing two names.
410
+ * Granting either conferred create on BOTH the template owner table and the
411
+ * real scheduled-maintenance owner table — and since owner rows drive the
412
+ * Owned permission scope, that widened access to events the holder did not
413
+ * own. Their Delete/Edit/Read siblings were always correct; only Create was
414
+ * mis-keyed. AddScheduledMaintenanceTemplateOwnerPermissions backfills the
415
+ * stored grants so no install loses access when these values changed.
416
+ */
417
+ CreateScheduledMaintenanceTemplateOwnerUser = "CreateScheduledMaintenanceTemplateOwnerUser",
406
418
  DeleteScheduledMaintenanceTemplateOwnerUser = "DeleteScheduledMaintenanceTemplateOwnerUser",
407
419
  EditScheduledMaintenanceTemplateOwnerUser = "EditScheduledMaintenanceTemplateOwnerUser",
408
420
  ReadScheduledMaintenanceTemplateOwnerUser = "ReadScheduledMaintenanceTemplateOwnerUser",
409
421
 
410
- CreateScheduledMaintenanceTemplateOwnerTeam = "CreateScheduledMaintenanceOwnerTeam",
422
+ CreateScheduledMaintenanceTemplateOwnerTeam = "CreateScheduledMaintenanceTemplateOwnerTeam",
411
423
  DeleteScheduledMaintenanceTemplateOwnerTeam = "DeleteScheduledMaintenanceTemplateOwnerTeam",
412
424
  EditScheduledMaintenanceTemplateOwnerTeam = "EditScheduledMaintenanceTemplateOwnerTeam",
413
425
  ReadScheduledMaintenanceTemplateOwnerTeam = "ReadScheduledMaintenanceTemplateOwnerTeam",
@@ -3287,88 +3299,6 @@ export class PermissionHelper {
3287
3299
  group: PermissionGroup.Monitor,
3288
3300
  },
3289
3301
 
3290
- {
3291
- permission: Permission.CreateStatusPageAnnouncement,
3292
- title: "Create Status Page Announcement",
3293
- description:
3294
- "This permission can create Status Page Announcement this project.",
3295
- isAssignableToTenant: true,
3296
- isAccessControlPermission: false,
3297
- isRolePermission: false,
3298
- group: PermissionGroup.StatusPage,
3299
- },
3300
- {
3301
- permission: Permission.DeleteStatusPageAnnouncement,
3302
- title: "Delete Status Page Announcement",
3303
- description:
3304
- "This permission can delete Status Page Announcement of this project.",
3305
- isAssignableToTenant: true,
3306
- isAccessControlPermission: false,
3307
- isRolePermission: false,
3308
- group: PermissionGroup.StatusPage,
3309
- },
3310
- {
3311
- permission: Permission.EditStatusPageAnnouncement,
3312
- title: "Edit Status Page Announcement",
3313
- description:
3314
- "This permission can edit Status Page Announcement of this project.",
3315
- isAssignableToTenant: true,
3316
- isAccessControlPermission: false,
3317
- isRolePermission: false,
3318
- group: PermissionGroup.StatusPage,
3319
- },
3320
- {
3321
- permission: Permission.ReadStatusPageAnnouncement,
3322
- title: "Read Status Page Announcement",
3323
- description:
3324
- "This permission can read Status Page Announcement of this project.",
3325
- isAssignableToTenant: true,
3326
- isAccessControlPermission: false,
3327
- isRolePermission: false,
3328
- group: PermissionGroup.StatusPage,
3329
- },
3330
-
3331
- {
3332
- permission: Permission.CreateStatusPageAnnouncementTemplate,
3333
- title: "Create Status Page Announcement Template",
3334
- description:
3335
- "This permission can create Status Page Announcement Templates in this project.",
3336
- isAssignableToTenant: true,
3337
- isAccessControlPermission: false,
3338
- isRolePermission: false,
3339
- group: PermissionGroup.StatusPage,
3340
- },
3341
- {
3342
- permission: Permission.DeleteStatusPageAnnouncementTemplate,
3343
- title: "Delete Status Page Announcement Template",
3344
- description:
3345
- "This permission can delete Status Page Announcement Templates of this project.",
3346
- isAssignableToTenant: true,
3347
- isAccessControlPermission: false,
3348
- isRolePermission: false,
3349
- group: PermissionGroup.StatusPage,
3350
- },
3351
- {
3352
- permission: Permission.EditStatusPageAnnouncementTemplate,
3353
- title: "Edit Status Page Announcement Template",
3354
- description:
3355
- "This permission can edit Status Page Announcement Templates of this project.",
3356
- isAssignableToTenant: true,
3357
- isAccessControlPermission: false,
3358
- isRolePermission: false,
3359
- group: PermissionGroup.StatusPage,
3360
- },
3361
- {
3362
- permission: Permission.ReadStatusPageAnnouncementTemplate,
3363
- title: "Read Status Page Announcement Template",
3364
- description:
3365
- "This permission can read Status Page Announcement Templates of this project.",
3366
- isAssignableToTenant: true,
3367
- isAccessControlPermission: false,
3368
- isRolePermission: false,
3369
- group: PermissionGroup.StatusPage,
3370
- },
3371
-
3372
3302
  {
3373
3303
  permission: Permission.CreateStatusPageAnnouncement,
3374
3304
  title: "Create Status Page Announcement",
@@ -4841,47 +4771,6 @@ export class PermissionHelper {
4841
4771
  group: PermissionGroup.Settings,
4842
4772
  },
4843
4773
 
4844
- {
4845
- permission: Permission.CreateStatusPageDomain,
4846
- title: "Create Status Page Domain",
4847
- description:
4848
- "This permission can create Status Page Domain in this project.",
4849
- isAssignableToTenant: true,
4850
- isAccessControlPermission: false,
4851
- isRolePermission: false,
4852
- group: PermissionGroup.StatusPage,
4853
- },
4854
- {
4855
- permission: Permission.DeleteStatusPageDomain,
4856
- title: "Delete Status Page Domain",
4857
- description:
4858
- "This permission can delete Status Page Domain in this project.",
4859
- isAssignableToTenant: true,
4860
- isAccessControlPermission: false,
4861
- isRolePermission: false,
4862
- group: PermissionGroup.StatusPage,
4863
- },
4864
- {
4865
- permission: Permission.EditStatusPageDomain,
4866
- title: "Edit Status Page Domain",
4867
- description:
4868
- "This permission can edit Status Page Domain in this project.",
4869
- isAssignableToTenant: true,
4870
- isAccessControlPermission: false,
4871
- isRolePermission: false,
4872
- group: PermissionGroup.StatusPage,
4873
- },
4874
- {
4875
- permission: Permission.ReadStatusPageDomain,
4876
- title: "Read Status Page Domain",
4877
- description:
4878
- "This permission can read Status Page Domain in this project.",
4879
- isAssignableToTenant: true,
4880
- isAccessControlPermission: false,
4881
- isRolePermission: false,
4882
- group: PermissionGroup.StatusPage,
4883
- },
4884
-
4885
4774
  {
4886
4775
  permission: Permission.CreateIncidentSeverity,
4887
4776
  title: "Create Incident Severity",
@@ -10046,7 +9935,7 @@ export class PermissionHelper {
10046
9935
  permission: Permission.CreateScheduledMaintenanceTemplateOwnerUser,
10047
9936
  title: "Create Scheduled Maintenance Template User Owner",
10048
9937
  description:
10049
- "This permission can create Scheduled Maintenance Template User Owner this project.",
9938
+ "This permission can create Scheduled Maintenance Template User Owner in this project.",
10050
9939
  isAssignableToTenant: true,
10051
9940
  isAccessControlPermission: false,
10052
9941
  isRolePermission: false,
@@ -10085,9 +9974,9 @@ export class PermissionHelper {
10085
9974
 
10086
9975
  {
10087
9976
  permission: Permission.CreateScheduledMaintenanceTemplateOwnerTeam,
10088
- title: "Create Scheduled Maintenance Template User Team",
9977
+ title: "Create Scheduled Maintenance Template Team Owner",
10089
9978
  description:
10090
- "This permission can create Scheduled Maintenance Template User Owner this project.",
9979
+ "This permission can create Scheduled Maintenance Template Team Owner in this project.",
10091
9980
  isAssignableToTenant: true,
10092
9981
  isAccessControlPermission: false,
10093
9982
  isRolePermission: false,
@@ -10095,9 +9984,9 @@ export class PermissionHelper {
10095
9984
  },
10096
9985
  {
10097
9986
  permission: Permission.DeleteScheduledMaintenanceTemplateOwnerTeam,
10098
- title: "Delete Scheduled Maintenance Template User Team",
9987
+ title: "Delete Scheduled Maintenance Template Team Owner",
10099
9988
  description:
10100
- "This permission can delete Scheduled Maintenance Template User Owner of this project.",
9989
+ "This permission can delete Scheduled Maintenance Template Team Owner of this project.",
10101
9990
  isAssignableToTenant: true,
10102
9991
  isAccessControlPermission: false,
10103
9992
  isRolePermission: false,
@@ -10105,9 +9994,9 @@ export class PermissionHelper {
10105
9994
  },
10106
9995
  {
10107
9996
  permission: Permission.EditScheduledMaintenanceTemplateOwnerTeam,
10108
- title: "Edit Scheduled Maintenance Template User Team",
9997
+ title: "Edit Scheduled Maintenance Template Team Owner",
10109
9998
  description:
10110
- "This permission can edit Scheduled Maintenance Template User Owner of this project.",
9999
+ "This permission can edit Scheduled Maintenance Template Team Owner of this project.",
10111
10000
  isAssignableToTenant: true,
10112
10001
  isAccessControlPermission: false,
10113
10002
  isRolePermission: false,
@@ -10115,9 +10004,9 @@ export class PermissionHelper {
10115
10004
  },
10116
10005
  {
10117
10006
  permission: Permission.ReadScheduledMaintenanceTemplateOwnerTeam,
10118
- title: "Read Scheduled Maintenance Template User Team",
10007
+ title: "Read Scheduled Maintenance Template Team Owner",
10119
10008
  description:
10120
- "This permission can read Scheduled Maintenance Template User Owner of this project.",
10009
+ "This permission can read Scheduled Maintenance Template Team Owner of this project.",
10121
10010
  isAssignableToTenant: true,
10122
10011
  isAccessControlPermission: false,
10123
10012
  isRolePermission: false,
@@ -10778,47 +10667,6 @@ export class PermissionHelper {
10778
10667
  group: PermissionGroup.Incident,
10779
10668
  },
10780
10669
 
10781
- {
10782
- permission: Permission.CreateStatusPageOwnerTeam,
10783
- title: "Create Status Page Team Owner",
10784
- description:
10785
- "This permission can create Status Page Team Owner this project.",
10786
- isAssignableToTenant: true,
10787
- isAccessControlPermission: false,
10788
- isRolePermission: false,
10789
- group: PermissionGroup.StatusPage,
10790
- },
10791
- {
10792
- permission: Permission.DeleteStatusPageOwnerTeam,
10793
- title: "Delete Status Page Team Owner",
10794
- description:
10795
- "This permission can delete Status Page Team Owner of this project.",
10796
- isAssignableToTenant: true,
10797
- isAccessControlPermission: false,
10798
- isRolePermission: false,
10799
- group: PermissionGroup.StatusPage,
10800
- },
10801
- {
10802
- permission: Permission.EditStatusPageOwnerTeam,
10803
- title: "Edit Status Page Team Owner",
10804
- description:
10805
- "This permission can edit Status Page Team Owner of this project.",
10806
- isAssignableToTenant: true,
10807
- isAccessControlPermission: false,
10808
- isRolePermission: false,
10809
- group: PermissionGroup.StatusPage,
10810
- },
10811
- {
10812
- permission: Permission.ReadStatusPageOwnerTeam,
10813
- title: "Read Status Page Team Owner",
10814
- description:
10815
- "This permission can read Status Page Team Owner of this project.",
10816
- isAssignableToTenant: true,
10817
- isAccessControlPermission: false,
10818
- isRolePermission: false,
10819
- group: PermissionGroup.StatusPage,
10820
- },
10821
-
10822
10670
  {
10823
10671
  permission: Permission.CreateStatusPageOwnerUser,
10824
10672
  title: "Create Status Page User Owner",
@@ -17,6 +17,7 @@ import ExternalStatusPageMonitorResponse from "../Monitor/ExternalStatusPageMoni
17
17
  import HttpPhaseTimings from "../Monitor/HttpPhaseTimings";
18
18
  import MonitorEvaluationSummary from "../Monitor/MonitorEvaluationSummary";
19
19
  import NetworkPathTrace from "../Monitor/NetworkMonitor/NetworkPathTrace";
20
+ import PortMonitorTimings from "../Monitor/PortMonitor/PortMonitorTimings";
20
21
  import ObjectID from "../ObjectID";
21
22
  import Port from "../Port";
22
23
  import ProbeAttempt from "./ProbeAttempt";
@@ -58,6 +59,11 @@ export default interface ProbeMonitorResponse {
58
59
  * checks. Absent when the request went through a proxy.
59
60
  */
60
61
  httpTimings?: HttpPhaseTimings | undefined;
62
+ /*
63
+ * DNS / TCP / total connection timing for Port checks. DNS is absent for
64
+ * IP literals. Also present when Ping/IP checks use the Port fallback.
65
+ */
66
+ portTimings?: PortMonitorTimings | undefined;
61
67
  dnsResponse?: DnsMonitorResponse | undefined;
62
68
  domainResponse?: DomainMonitorResponse | undefined;
63
69
  dnssecResponse?: DnssecMonitorResponse | undefined;
@@ -201,9 +201,7 @@ const BulkUpdateForm: <T extends GenericObject>(
201
201
  let itemClassName: string = "";
202
202
  let iconClassName: string = "";
203
203
 
204
- if (isDisabled) {
205
- itemClassName = "opacity-50 cursor-not-allowed hover:bg-transparent";
206
- } else if (isDanger) {
204
+ if (!isDisabled && isDanger) {
207
205
  itemClassName = "text-red-700 hover:text-red-800 hover:bg-red-50";
208
206
  iconClassName = "text-red-400 group-hover:text-red-500";
209
207
  }
@@ -215,6 +213,7 @@ const BulkUpdateForm: <T extends GenericObject>(
215
213
  icon={button.icon}
216
214
  className={itemClassName}
217
215
  iconClassName={iconClassName}
216
+ isDisabled={isDisabled}
218
217
  onClick={() => {
219
218
  triggerButtonClick(button);
220
219
  }}
@@ -51,14 +51,41 @@ export interface ComponentProps {
51
51
  customFieldType: DatabaseBaseModelType;
52
52
  projectId: ObjectID;
53
53
  name: string;
54
- isEditable?: boolean;
54
+ isEditable?: boolean | undefined;
55
+ /*
56
+ * For call sites that mount this card unconditionally - the resource
57
+ * overview pages - where most projects have never defined a custom field.
58
+ *
59
+ * With this set the card renders NOTHING until it knows the project has at
60
+ * least one field of this type: no loader flash and no "no custom fields
61
+ * have been added" placeholder occupying a slot on a page the operator
62
+ * opened to look at something else.
63
+ *
64
+ * It also hides on a load failure, because reading the schema is gated on
65
+ * both a permission and a billing plan. Without that, every incident a
66
+ * project below the custom-fields plan opens would carry an error card it
67
+ * can do nothing about. The dedicated Custom Fields page mounts this same
68
+ * component WITHOUT the flag, so anyone who goes looking still sees the
69
+ * real reason.
70
+ */
71
+ hideIfEmpty?: boolean | undefined;
55
72
  }
56
73
 
57
74
  const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
58
75
  props: ComponentProps,
59
76
  ): ReactElement => {
60
77
  const [schemaList, setSchemaList] = useState<Array<BaseModel>>([]);
61
- const [error, setError] = useState<string>("");
78
+ /*
79
+ * Read failures and write failures are kept apart because hideIfEmpty
80
+ * treats them oppositely. Failing to READ the schema is something an
81
+ * overview page swallows - the project may simply not be on a plan that
82
+ * includes custom fields, and there is nothing the operator can do about it
83
+ * on an incident page. Failing to WRITE is the operator's own edit coming
84
+ * back rejected, and must be reported wherever it happens. Sharing one slot
85
+ * meant a rejected save made the whole card disappear.
86
+ */
87
+ const [loadError, setLoadError] = useState<string>("");
88
+ const [saveError, setSaveError] = useState<string>("");
62
89
  const [isLoading, setIsLoading] = useState<boolean>(false);
63
90
  const [model, setModel] = useState<BaseModel | null>(null);
64
91
  const [showModelForm, setShowModelForm] = useState<boolean>(false);
@@ -67,6 +94,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
67
94
  try {
68
95
  // load schema.
69
96
  setIsLoading(true);
97
+ setLoadError("");
70
98
 
71
99
  const schemaList: ListResult<BaseModel> =
72
100
  await ModelAPI.getList<BaseModel>({
@@ -99,7 +127,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
99
127
  setIsLoading(false);
100
128
  } catch (err) {
101
129
  setIsLoading(false);
102
- setError(API.getFriendlyMessage(err));
130
+ setLoadError(API.getFriendlyMessage(err));
103
131
  }
104
132
  };
105
133
 
@@ -109,6 +137,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
109
137
  try {
110
138
  // load schema.
111
139
  setIsLoading(true);
140
+ setSaveError("");
112
141
  setShowModelForm(false);
113
142
 
114
143
  await ModelAPI.updateById({
@@ -122,7 +151,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
122
151
  await onLoad();
123
152
  } catch (err) {
124
153
  setIsLoading(false);
125
- setError(API.getFriendlyMessage(err));
154
+ setSaveError(API.getFriendlyMessage(err));
126
155
  }
127
156
  };
128
157
 
@@ -132,12 +161,45 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
132
161
 
133
162
  const isEditable: boolean = props.isEditable !== false;
134
163
 
164
+ /*
165
+ * schemaList is empty both before the first load finishes and when the
166
+ * project genuinely has no fields of this type, which is exactly when an
167
+ * overview page should show nothing - so one check covers both.
168
+ *
169
+ * `!model` covers the record itself coming back empty. On a page that is
170
+ * plainly displaying that record, a card announcing "Item not found" is a
171
+ * contradiction; showing nothing is the honest version.
172
+ *
173
+ * Deliberately NOT saveError: a rejected save has to stay on screen, and it
174
+ * leaves schemaList and model intact, so the card keeps rendering.
175
+ */
176
+ if (
177
+ props.hideIfEmpty &&
178
+ (Boolean(loadError) || schemaList.length === 0 || !model)
179
+ ) {
180
+ return <></>;
181
+ }
182
+
183
+ /*
184
+ * There has to be something to edit before the button is worth offering:
185
+ * the modal reads its initial values off the record and its inputs off the
186
+ * schema, so opening it mid-load threw on a null record, and opening it
187
+ * with no fields defined produced a form with nothing in it.
188
+ *
189
+ * A failed LOAD needs no term of its own - it leaves schemaList empty and
190
+ * model null, which the checks below already cover. A failed SAVE must not
191
+ * take the button away, or the error message is telling the operator to
192
+ * retry something they can no longer reach.
193
+ */
194
+ const canEdit: boolean =
195
+ isEditable && !isLoading && schemaList.length > 0 && Boolean(model);
196
+
135
197
  return (
136
198
  <Card
137
199
  title={props.title}
138
200
  description={props.description}
139
201
  buttons={
140
- isEditable
202
+ canEdit
141
203
  ? [
142
204
  {
143
205
  title: "Edit Fields",
@@ -152,14 +214,26 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
152
214
  }
153
215
  >
154
216
  <div className="border-t border-gray-200 px-4 py-5 sm:px-6 -m-6 -mt-2">
155
- {isLoading && !error && <ComponentLoader />}
156
- {!isLoading && !error && schemaList.length === 0 && (
217
+ {isLoading && !loadError && <ComponentLoader />}
218
+ {!isLoading && !loadError && schemaList.length === 0 && (
157
219
  <ErrorMessage message="No custom fields have been added for this resource. You may add custom fields in Project Settings." />
158
220
  )}
159
- {error && <ErrorMessage message={error} />}
160
- {!model && <ErrorMessage message={"Item not found"} />}
221
+ {loadError && <ErrorMessage message={loadError} />}
222
+ {/*
223
+ * Above the values, which are still the ones on the record: the save
224
+ * did not happen, so what is on screen below is what is stored.
225
+ */}
226
+ {saveError && <ErrorMessage message={saveError} />}
227
+ {/*
228
+ * Only once the fetch has settled: model is null on the very first
229
+ * render too, and announcing "Item not found" while the request is
230
+ * still in flight reads as a broken record rather than a pending one.
231
+ */}
232
+ {!isLoading && !loadError && schemaList.length > 0 && !model && (
233
+ <ErrorMessage message={"Item not found"} />
234
+ )}
161
235
 
162
- {!isLoading && !error && model && (
236
+ {!isLoading && !loadError && schemaList.length > 0 && model && (
163
237
  <Detail
164
238
  id={props.name}
165
239
  item={(model as any)["customFields"] || {}}
@@ -194,7 +268,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
194
268
  await onSave(data).catch();
195
269
  }}
196
270
  formProps={{
197
- initialValues: (model as any)["customFields"] || {},
271
+ initialValues: (model as any)?.["customFields"] || {},
198
272
  fields: schemaList.map((schemaItem: BaseModel) => {
199
273
  const isDropdown: boolean =
200
274
  (schemaItem as any).customFieldType ===
@@ -1,4 +1,12 @@
1
- import React, { FunctionComponent, ReactElement, ReactNode } from "react";
1
+ import { downloadErrorSupportBundle } from "../Utils/ErrorSupportBundle";
2
+ import React, {
3
+ ErrorInfo,
4
+ FunctionComponent,
5
+ ReactElement,
6
+ ReactNode,
7
+ useRef,
8
+ useState,
9
+ } from "react";
2
10
  import {
3
11
  ErrorBoundary as NativeErrorBoundary,
4
12
  FallbackProps,
@@ -14,7 +22,22 @@ export interface ComponentProps {
14
22
  */
15
23
  resetKey?: string | undefined;
16
24
  /** Notified for every caught error. Used by tests and by callers that report. */
17
- onError?: ((error: Error) => void) | undefined;
25
+ onError?: ((error: Error, errorInfo: ErrorInfo) => void) | undefined;
26
+ }
27
+
28
+ interface CapturedErrorDetails {
29
+ error: unknown;
30
+ componentStack: string | null;
31
+ digest: string | null;
32
+ capturedAt: string;
33
+ }
34
+
35
+ type GetCapturedErrorDetailsFunction = (
36
+ error: unknown,
37
+ ) => CapturedErrorDetails | null;
38
+
39
+ interface FallbackComponentProps extends FallbackProps {
40
+ getCapturedErrorDetails?: GetCapturedErrorDetailsFunction | undefined;
18
41
  }
19
42
 
20
43
  /**
@@ -146,17 +169,45 @@ export const handleChunkLoadError: HandleChunkLoadErrorFunction = (
146
169
  return true;
147
170
  };
148
171
 
149
- export const Fallback: FunctionComponent<FallbackProps> = (
150
- props: FallbackProps,
172
+ export const Fallback: FunctionComponent<FallbackComponentProps> = (
173
+ props: FallbackComponentProps,
151
174
  ): ReactElement => {
175
+ const [supportBundleStatus, setSupportBundleStatus] = useState<string>("");
152
176
  const errorMessage: string =
153
177
  props.error && typeof props.error.message === "string"
154
178
  ? props.error.message
155
179
  : "";
156
180
 
181
+ type DownloadSupportBundleFunction = () => void;
182
+
183
+ const downloadSupportBundle: DownloadSupportBundleFunction = (): void => {
184
+ setSupportBundleStatus("");
185
+
186
+ try {
187
+ const capturedErrorDetails: CapturedErrorDetails | null =
188
+ props.getCapturedErrorDetails?.(props.error) || null;
189
+
190
+ downloadErrorSupportBundle({
191
+ error: props.error,
192
+ componentStack: capturedErrorDetails?.componentStack,
193
+ digest: capturedErrorDetails?.digest,
194
+ capturedAt: capturedErrorDetails?.capturedAt,
195
+ });
196
+
197
+ setSupportBundleStatus(
198
+ "Support bundle downloaded. Review it, then attach it when contacting OneUptime Support.",
199
+ );
200
+ } catch (error) {
201
+ // eslint-disable-next-line no-console
202
+ console.error("Unable to download the error support bundle:", error);
203
+ setSupportBundleStatus(
204
+ "The support bundle could not be downloaded. Please try again.",
205
+ );
206
+ }
207
+ };
208
+
157
209
  return (
158
210
  <div
159
- role="alert"
160
211
  data-testid="error-boundary-fallback"
161
212
  style={{
162
213
  minHeight: "60vh",
@@ -170,8 +221,8 @@ export const Fallback: FunctionComponent<FallbackProps> = (
170
221
  textAlign: "center",
171
222
  }}
172
223
  >
173
- <div style={{ maxWidth: "32rem" }}>
174
- <div style={{ fontWeight: 600, marginBottom: "0.5rem" }}>
224
+ <div style={{ maxWidth: "40rem" }}>
225
+ <div role="alert" style={{ fontWeight: 600, marginBottom: "0.5rem" }}>
175
226
  An unexpected error has occurred. Please reload the page to continue
176
227
  </div>
177
228
  <div
@@ -189,6 +240,7 @@ export const Fallback: FunctionComponent<FallbackProps> = (
189
240
  display: "flex",
190
241
  gap: "0.75rem",
191
242
  justifyContent: "center",
243
+ flexWrap: "wrap",
192
244
  }}
193
245
  >
194
246
  <button
@@ -225,6 +277,45 @@ export const Fallback: FunctionComponent<FallbackProps> = (
225
277
  >
226
278
  Reload page
227
279
  </button>
280
+ <button
281
+ type="button"
282
+ data-testid="error-boundary-download-support-bundle"
283
+ onClick={downloadSupportBundle}
284
+ style={{
285
+ padding: "0.5rem 1rem",
286
+ borderRadius: "0.375rem",
287
+ border: "1px solid var(--ou-border-primary, #d1d5db)",
288
+ backgroundColor: "transparent",
289
+ color: "inherit",
290
+ cursor: "pointer",
291
+ }}
292
+ >
293
+ Download support bundle
294
+ </button>
295
+ </div>
296
+ <div
297
+ style={{
298
+ marginTop: "1rem",
299
+ fontSize: "0.75rem",
300
+ color: "var(--ou-text-secondary, #6b7280)",
301
+ }}
302
+ >
303
+ Download a local diagnostics file with the error stack, component
304
+ stack, scrubbed page URL, browser details, and OneUptime build. It
305
+ never reads cookies, saved browser data, or form contents. Review it
306
+ before sharing it with OneUptime Support.
307
+ </div>
308
+ <div
309
+ role="status"
310
+ data-testid="error-boundary-support-bundle-status"
311
+ style={{
312
+ minHeight: "1rem",
313
+ marginTop: "0.75rem",
314
+ fontSize: "0.75rem",
315
+ color: "var(--ou-text-secondary, #6b7280)",
316
+ }}
317
+ >
318
+ {supportBundleStatus}
228
319
  </div>
229
320
  {errorMessage ? (
230
321
  <div
@@ -249,9 +340,22 @@ export const Fallback: FunctionComponent<FallbackProps> = (
249
340
  const ErrorBoundary: FunctionComponent<ComponentProps> = (
250
341
  props: ComponentProps,
251
342
  ): ReactElement => {
252
- type OnErrorFunction = (error: Error) => void;
343
+ const capturedErrorDetailsRef: React.MutableRefObject<CapturedErrorDetails | null> =
344
+ useRef<CapturedErrorDetails | null>(null);
345
+
346
+ type OnErrorFunction = (error: Error, errorInfo: ErrorInfo) => void;
347
+
348
+ const onError: OnErrorFunction = (
349
+ error: Error,
350
+ errorInfo: ErrorInfo,
351
+ ): void => {
352
+ capturedErrorDetailsRef.current = {
353
+ error: error,
354
+ componentStack: errorInfo.componentStack || null,
355
+ digest: errorInfo.digest || null,
356
+ capturedAt: new Date().toISOString(),
357
+ };
253
358
 
254
- const onError: OnErrorFunction = (error: Error): void => {
255
359
  /*
256
360
  * Surface the error. Without this the only trace of a crash is the blank
257
361
  * screen itself, because the boundary swallows what React would otherwise
@@ -263,13 +367,36 @@ const ErrorBoundary: FunctionComponent<ComponentProps> = (
263
367
  // A stale bundle recovers by reloading, so do that instead of blaming the user.
264
368
  handleChunkLoadError(error);
265
369
 
266
- props.onError?.(error);
370
+ props.onError?.(error, errorInfo);
371
+ };
372
+
373
+ const getCapturedErrorDetails: GetCapturedErrorDetailsFunction = (
374
+ error: unknown,
375
+ ): CapturedErrorDetails | null => {
376
+ if (
377
+ !capturedErrorDetailsRef.current ||
378
+ !Object.is(capturedErrorDetailsRef.current.error, error)
379
+ ) {
380
+ return null;
381
+ }
382
+
383
+ return capturedErrorDetailsRef.current;
267
384
  };
268
385
 
269
386
  return (
270
387
  <NativeErrorBoundary
271
- FallbackComponent={Fallback}
388
+ fallbackRender={(fallbackProps: FallbackProps): ReactElement => {
389
+ return (
390
+ <Fallback
391
+ {...fallbackProps}
392
+ getCapturedErrorDetails={getCapturedErrorDetails}
393
+ />
394
+ );
395
+ }}
272
396
  onError={onError}
397
+ onReset={() => {
398
+ capturedErrorDetailsRef.current = null;
399
+ }}
273
400
  resetKeys={[props.resetKey]}
274
401
  >
275
402
  {props.children}