@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
@@ -0,0 +1,805 @@
1
+ import UrlScrubber from "../../Utils/Rum/UrlScrubber";
2
+ import { AppVersion, GitSha, IS_ENTERPRISE_EDITION, env } from "../Config";
3
+ import downloadFile from "./DownloadFile";
4
+ import React from "react";
5
+
6
+ export const ERROR_SUPPORT_BUNDLE_SCHEMA_VERSION: number = 1;
7
+ export const MAX_SUPPORT_ERROR_MESSAGE_LENGTH: number = 4000;
8
+ export const MAX_SUPPORT_ERROR_STACK_LENGTH: number = 16000;
9
+ export const MAX_SUPPORT_COMPONENT_STACK_LENGTH: number = 16000;
10
+
11
+ const MAX_DOCUMENT_TITLE_LENGTH: number = 500;
12
+ const MAX_DIAGNOSTIC_PROPERTY_LENGTH: number = 500;
13
+ const MAX_PAGE_URL_LENGTH: number = 4000;
14
+ const MAX_RUNTIME_STRING_LENGTH: number = 2000;
15
+ const MAX_ERROR_CAUSE_DEPTH: number = 3;
16
+ const TRUNCATED_MARKER: string = "\n...[truncated]";
17
+
18
+ /*
19
+ * Stack traces sometimes contain the document URL (including reset or login
20
+ * tokens) when an inline script throws. Scrub those URLs before the bundle is
21
+ * written. This deliberately mirrors the session-replay error recorder.
22
+ */
23
+ const URL_IN_TEXT: RegExp = /https?:\/\/[^\s)'"]+/gi;
24
+
25
+ interface SensitiveTextRedactionRule {
26
+ regex: RegExp;
27
+ replacement: string;
28
+ }
29
+
30
+ /*
31
+ * Error messages are application-authored free-form text and occasionally
32
+ * quote request headers, credentials, or customer identifiers. These patterns
33
+ * are intentionally best-effort: the bundle still asks the user to review it,
34
+ * but common high-risk values should never survive by default.
35
+ */
36
+ const SENSITIVE_TEXT_REDACTION_RULES: Array<SensitiveTextRedactionRule> = [
37
+ {
38
+ regex:
39
+ /-----BEGIN (?:[A-Z0-9]+ )*PRIVATE KEY-----[\s\S]*?(?:-----END (?:[A-Z0-9]+ )*PRIVATE KEY-----|$)/g,
40
+ replacement: "[redacted-private-key]",
41
+ },
42
+ {
43
+ regex: /\beyJ[A-Za-z0-9_-]{3,}(?:\.[A-Za-z0-9_-]*){0,2}\b/g,
44
+ replacement: "[redacted-jwt]",
45
+ },
46
+ {
47
+ regex: /\bBearer\s+[A-Za-z0-9._~+/=-]+/gi,
48
+ replacement: "Bearer [redacted-token]",
49
+ },
50
+ {
51
+ regex:
52
+ /\b(authorization|proxy-authorization|x-api-key|x-auth-token|x-functions-key|api[-_]?key|access[-_]?token)\b(\s*[:=]\s*)(bearer\s+|basic\s+|token\s+)?([^\s,;"']+)/gi,
53
+ replacement: "$1$2$3[redacted]",
54
+ },
55
+ {
56
+ regex:
57
+ /\b(password|passwd|secret|token|auth[_-]?token|credential|set[-_]?cookie|cookie|signature|client[_-]?secret|private[_-]?key|session[_-]?id)\b(\s*[:=]\s*)("[^"]+"|'[^']+'|[^\s,;&]+)/gi,
58
+ replacement: "$1$2[redacted]",
59
+ },
60
+ {
61
+ regex: /([a-z][a-z0-9+.-]{0,31}:\/\/[^:@\s/]+):[^\s/]+@/gi,
62
+ replacement: "$1:[redacted]@",
63
+ },
64
+ {
65
+ regex: /\b(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[0-9A-Z]{4,}\b/g,
66
+ replacement: "[redacted-aws-key]",
67
+ },
68
+ {
69
+ regex:
70
+ /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{4,}\b|\bgithub_pat_[A-Za-z0-9_]{4,}\b/g,
71
+ replacement: "[redacted-github-token]",
72
+ },
73
+ {
74
+ regex: /\bxox[baprs]-[A-Za-z0-9-]{4,}\b/g,
75
+ replacement: "[redacted-slack-token]",
76
+ },
77
+ {
78
+ regex: /\bAIza[0-9A-Za-z_-]{4,}\b/g,
79
+ replacement: "[redacted-google-api-key]",
80
+ },
81
+ {
82
+ regex: /[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{1,253}\.[A-Za-z]{2,63}/g,
83
+ replacement: "[redacted-email]",
84
+ },
85
+ {
86
+ regex: /\b\d{4}[ -]\d{4}[ -]\d{4}[ -]\d{4}\b/g,
87
+ replacement: "[redacted-card]",
88
+ },
89
+ ];
90
+
91
+ type DiagnosticPrimitive = string | number | boolean | null;
92
+
93
+ export interface SerializedSupportError {
94
+ name: string;
95
+ message: string;
96
+ stack: string | null;
97
+ code: DiagnosticPrimitive;
98
+ status: DiagnosticPrimitive;
99
+ statusCode: DiagnosticPrimitive;
100
+ cause: SerializedSupportError | null;
101
+ causeTruncated: boolean;
102
+ }
103
+
104
+ export interface ErrorSupportBundleApplicationDetails {
105
+ appVersion: string;
106
+ gitSha: string;
107
+ edition: "Community" | "Enterprise";
108
+ nodeEnvironment: string;
109
+ reactVersion: string;
110
+ }
111
+
112
+ export interface ErrorSupportBundlePageDetails {
113
+ url: string;
114
+ pathname: string;
115
+ documentTitle: string;
116
+ hadQueryString: boolean;
117
+ hadFragment: boolean;
118
+ visibilityState: string;
119
+ documentReadyState: string;
120
+ historyLength: number;
121
+ }
122
+
123
+ export interface ErrorSupportBundleBrowserDetails {
124
+ userAgent: string;
125
+ platform: string;
126
+ vendor: string;
127
+ language: string;
128
+ languages: Array<string>;
129
+ onLine: boolean;
130
+ cookieEnabled: boolean;
131
+ hardwareConcurrency: number;
132
+ maxTouchPoints: number;
133
+ timeZone: string;
134
+ timeZoneOffsetMinutes: number;
135
+ }
136
+
137
+ export interface ErrorSupportBundleDisplayDetails {
138
+ viewportWidth: number;
139
+ viewportHeight: number;
140
+ screenWidth: number;
141
+ screenHeight: number;
142
+ availableScreenWidth: number;
143
+ availableScreenHeight: number;
144
+ devicePixelRatio: number;
145
+ colorDepth: number;
146
+ pixelDepth: number;
147
+ }
148
+
149
+ export interface ErrorSupportBundleServiceWorkerDetails {
150
+ isSupported: boolean;
151
+ isControlled: boolean;
152
+ scriptUrl: string | null;
153
+ state: string | null;
154
+ }
155
+
156
+ export interface ErrorSupportBundleNavigationDetails {
157
+ type: string;
158
+ durationInMilliseconds: number;
159
+ domContentLoadedInMilliseconds: number;
160
+ pageLoadInMilliseconds: number;
161
+ transferSizeInBytes: number;
162
+ encodedBodySizeInBytes: number;
163
+ decodedBodySizeInBytes: number;
164
+ serviceWorkerStartInMilliseconds: number;
165
+ }
166
+
167
+ export interface ErrorSupportBundleRuntimeDetails {
168
+ application: ErrorSupportBundleApplicationDetails;
169
+ page: ErrorSupportBundlePageDetails;
170
+ browser: ErrorSupportBundleBrowserDetails;
171
+ display: ErrorSupportBundleDisplayDetails;
172
+ serviceWorker: ErrorSupportBundleServiceWorkerDetails;
173
+ navigation: ErrorSupportBundleNavigationDetails | null;
174
+ }
175
+
176
+ export interface ErrorSupportBundle {
177
+ schemaVersion: number;
178
+ type: "oneuptime-browser-error";
179
+ generatedAt: string;
180
+ errorCapturedAt: string;
181
+ application: ErrorSupportBundleApplicationDetails;
182
+ error: SerializedSupportError;
183
+ react: {
184
+ component: string | null;
185
+ componentStack: string | null;
186
+ digest: string | null;
187
+ };
188
+ page: ErrorSupportBundlePageDetails;
189
+ browser: ErrorSupportBundleBrowserDetails;
190
+ display: ErrorSupportBundleDisplayDetails;
191
+ serviceWorker: ErrorSupportBundleServiceWorkerDetails;
192
+ navigation: ErrorSupportBundleNavigationDetails | null;
193
+ privacy: {
194
+ reviewBeforeSharing: string;
195
+ urlHandling: string;
196
+ excluded: Array<string>;
197
+ };
198
+ }
199
+
200
+ export interface CreateErrorSupportBundleOptions {
201
+ error: unknown;
202
+ componentStack?: string | null | undefined;
203
+ digest?: string | null | undefined;
204
+ capturedAt?: string | undefined;
205
+ generatedAt?: Date | undefined;
206
+ runtimeDetails?: ErrorSupportBundleRuntimeDetails | undefined;
207
+ }
208
+
209
+ type ReadSafelyFunction = <T>(reader: () => T, fallback: T) => T;
210
+
211
+ const readSafely: ReadSafelyFunction = <T>(reader: () => T, fallback: T): T => {
212
+ try {
213
+ return reader();
214
+ } catch {
215
+ return fallback;
216
+ }
217
+ };
218
+
219
+ type TruncateFunction = (value: string, maximumLength: number) => string;
220
+
221
+ const truncate: TruncateFunction = (
222
+ value: string,
223
+ maximumLength: number,
224
+ ): string => {
225
+ if (value.length <= maximumLength) {
226
+ return value;
227
+ }
228
+
229
+ return `${value.slice(0, maximumLength - TRUNCATED_MARKER.length)}${TRUNCATED_MARKER}`;
230
+ };
231
+
232
+ export type ScrubUrlsInSupportTextFunction = (value: string) => string;
233
+
234
+ export const scrubUrlsInSupportText: ScrubUrlsInSupportTextFunction = (
235
+ value: string,
236
+ ): string => {
237
+ URL_IN_TEXT.lastIndex = 0;
238
+
239
+ return value.replace(URL_IN_TEXT, (url: string): string => {
240
+ return UrlScrubber.scrub(url);
241
+ });
242
+ };
243
+
244
+ export type RedactSensitiveSupportTextFunction = (value: string) => string;
245
+
246
+ export const redactSensitiveSupportText: RedactSensitiveSupportTextFunction = (
247
+ value: string,
248
+ ): string => {
249
+ let redacted: string = value;
250
+
251
+ for (const rule of SENSITIVE_TEXT_REDACTION_RULES) {
252
+ rule.regex.lastIndex = 0;
253
+ redacted = redacted.replace(rule.regex, rule.replacement);
254
+ }
255
+
256
+ return redacted;
257
+ };
258
+
259
+ type SanitizeSupportTextFunction = (
260
+ value: string,
261
+ maximumLength: number,
262
+ ) => string;
263
+
264
+ const sanitizeSupportText: SanitizeSupportTextFunction = (
265
+ value: string,
266
+ maximumLength: number,
267
+ ): string => {
268
+ return truncate(
269
+ redactSensitiveSupportText(scrubUrlsInSupportText(value)),
270
+ maximumLength,
271
+ );
272
+ };
273
+
274
+ type ReadErrorPropertyFunction = (
275
+ error: unknown,
276
+ propertyName: string,
277
+ ) => unknown;
278
+
279
+ const readErrorProperty: ReadErrorPropertyFunction = (
280
+ error: unknown,
281
+ propertyName: string,
282
+ ): unknown => {
283
+ if (
284
+ error === null ||
285
+ (typeof error !== "object" && typeof error !== "function")
286
+ ) {
287
+ return undefined;
288
+ }
289
+
290
+ return readSafely<unknown>(() => {
291
+ return (error as { [key: string]: unknown })[propertyName];
292
+ }, undefined);
293
+ };
294
+
295
+ type GetDiagnosticPrimitiveFunction = (value: unknown) => DiagnosticPrimitive;
296
+
297
+ const getDiagnosticPrimitive: GetDiagnosticPrimitiveFunction = (
298
+ value: unknown,
299
+ ): DiagnosticPrimitive => {
300
+ if (typeof value === "string") {
301
+ return sanitizeSupportText(value, MAX_DIAGNOSTIC_PROPERTY_LENGTH);
302
+ }
303
+
304
+ if (typeof value === "number") {
305
+ return Number.isFinite(value) ? value : null;
306
+ }
307
+
308
+ if (typeof value === "boolean") {
309
+ return value;
310
+ }
311
+
312
+ return null;
313
+ };
314
+
315
+ type DescribeThrownValueFunction = (error: unknown) => string;
316
+
317
+ const describeThrownValue: DescribeThrownValueFunction = (
318
+ error: unknown,
319
+ ): string => {
320
+ if (error === null) {
321
+ return "A null value was thrown.";
322
+ }
323
+
324
+ if (error === undefined) {
325
+ return "An undefined value was thrown.";
326
+ }
327
+
328
+ if (
329
+ typeof error === "string" ||
330
+ typeof error === "number" ||
331
+ typeof error === "boolean" ||
332
+ typeof error === "bigint"
333
+ ) {
334
+ return String(error);
335
+ }
336
+
337
+ return "A non-Error value was thrown.";
338
+ };
339
+
340
+ type SerializeSupportErrorInternalFunction = (
341
+ error: unknown,
342
+ depth: number,
343
+ seen: Set<unknown>,
344
+ ) => SerializedSupportError;
345
+
346
+ const serializeSupportErrorInternal: SerializeSupportErrorInternalFunction = (
347
+ error: unknown,
348
+ depth: number,
349
+ seen: Set<unknown>,
350
+ ): SerializedSupportError => {
351
+ const isObjectLike: boolean =
352
+ error !== null &&
353
+ (typeof error === "object" || typeof error === "function");
354
+
355
+ if (isObjectLike && seen.has(error)) {
356
+ return {
357
+ name: "CircularErrorCause",
358
+ message: "The error cause referred back to an earlier error.",
359
+ stack: null,
360
+ code: null,
361
+ status: null,
362
+ statusCode: null,
363
+ cause: null,
364
+ causeTruncated: false,
365
+ };
366
+ }
367
+
368
+ if (isObjectLike) {
369
+ seen.add(error);
370
+ }
371
+
372
+ const nameProperty: unknown = readErrorProperty(error, "name");
373
+ const messageProperty: unknown = readErrorProperty(error, "message");
374
+ const stackProperty: unknown = readErrorProperty(error, "stack");
375
+
376
+ const name: string =
377
+ typeof nameProperty === "string" && nameProperty
378
+ ? sanitizeSupportText(nameProperty, 200)
379
+ : error instanceof Error
380
+ ? "Error"
381
+ : "NonErrorThrownValue";
382
+
383
+ const rawMessage: string =
384
+ typeof messageProperty === "string" && messageProperty
385
+ ? messageProperty
386
+ : describeThrownValue(error);
387
+
388
+ const message: string = sanitizeSupportText(
389
+ rawMessage,
390
+ MAX_SUPPORT_ERROR_MESSAGE_LENGTH,
391
+ );
392
+
393
+ const stack: string | null =
394
+ typeof stackProperty === "string" && stackProperty
395
+ ? sanitizeSupportText(stackProperty, MAX_SUPPORT_ERROR_STACK_LENGTH)
396
+ : null;
397
+
398
+ const causeValue: unknown = readErrorProperty(error, "cause");
399
+ const hasCause: boolean = causeValue !== null && causeValue !== undefined;
400
+ const causeTruncated: boolean = hasCause && depth >= MAX_ERROR_CAUSE_DEPTH;
401
+ const cause: SerializedSupportError | null =
402
+ hasCause && !causeTruncated
403
+ ? serializeSupportErrorInternal(causeValue, depth + 1, seen)
404
+ : null;
405
+
406
+ return {
407
+ name: name,
408
+ message: message,
409
+ stack: stack,
410
+ code: getDiagnosticPrimitive(readErrorProperty(error, "code")),
411
+ status: getDiagnosticPrimitive(readErrorProperty(error, "status")),
412
+ statusCode: getDiagnosticPrimitive(readErrorProperty(error, "statusCode")),
413
+ cause: cause,
414
+ causeTruncated: causeTruncated,
415
+ };
416
+ };
417
+
418
+ export type SerializeSupportErrorFunction = (
419
+ error: unknown,
420
+ ) => SerializedSupportError;
421
+
422
+ export const serializeSupportError: SerializeSupportErrorFunction = (
423
+ error: unknown,
424
+ ): SerializedSupportError => {
425
+ return serializeSupportErrorInternal(error, 0, new Set<unknown>());
426
+ };
427
+
428
+ export type GetComponentFromStackFunction = (
429
+ componentStack: string | null | undefined,
430
+ ) => string | null;
431
+
432
+ export const getComponentFromStack: GetComponentFromStackFunction = (
433
+ componentStack: string | null | undefined,
434
+ ): string | null => {
435
+ if (!componentStack) {
436
+ return null;
437
+ }
438
+
439
+ const match: RegExpMatchArray | null = componentStack.match(
440
+ /^\s*(?:at|in)\s+([^\s(]+)/m,
441
+ );
442
+
443
+ return match?.[1] || null;
444
+ };
445
+
446
+ type GetNavigationDetailsFunction =
447
+ () => ErrorSupportBundleNavigationDetails | null;
448
+
449
+ const getNavigationDetails: GetNavigationDetailsFunction =
450
+ (): ErrorSupportBundleNavigationDetails | null => {
451
+ if (typeof performance === "undefined") {
452
+ return null;
453
+ }
454
+
455
+ const navigationEntry: PerformanceNavigationTiming | undefined = readSafely<
456
+ PerformanceNavigationTiming | undefined
457
+ >(() => {
458
+ return performance.getEntriesByType(
459
+ "navigation",
460
+ )[0] as PerformanceNavigationTiming;
461
+ }, undefined);
462
+
463
+ if (!navigationEntry) {
464
+ return null;
465
+ }
466
+
467
+ return {
468
+ type: navigationEntry.type || "unknown",
469
+ durationInMilliseconds: navigationEntry.duration || 0,
470
+ domContentLoadedInMilliseconds:
471
+ navigationEntry.domContentLoadedEventEnd || 0,
472
+ pageLoadInMilliseconds: navigationEntry.loadEventEnd || 0,
473
+ transferSizeInBytes: navigationEntry.transferSize || 0,
474
+ encodedBodySizeInBytes: navigationEntry.encodedBodySize || 0,
475
+ decodedBodySizeInBytes: navigationEntry.decodedBodySize || 0,
476
+ serviceWorkerStartInMilliseconds: navigationEntry.workerStart || 0,
477
+ };
478
+ };
479
+
480
+ export type CollectErrorSupportBundleRuntimeDetailsFunction =
481
+ () => ErrorSupportBundleRuntimeDetails;
482
+
483
+ export const collectErrorSupportBundleRuntimeDetails: CollectErrorSupportBundleRuntimeDetailsFunction =
484
+ (): ErrorSupportBundleRuntimeDetails => {
485
+ const hasWindow: boolean = typeof window !== "undefined";
486
+ const hasDocument: boolean = typeof document !== "undefined";
487
+ const hasNavigator: boolean = typeof navigator !== "undefined";
488
+
489
+ const rawUrl: string = hasWindow
490
+ ? readSafely<string>(() => {
491
+ return window.location.href;
492
+ }, "")
493
+ : "";
494
+
495
+ const serviceWorkerController: ServiceWorker | null = hasNavigator
496
+ ? readSafely<ServiceWorker | null>(() => {
497
+ return navigator.serviceWorker?.controller || null;
498
+ }, null)
499
+ : null;
500
+
501
+ const serviceWorkerScriptUrl: string | null = serviceWorkerController
502
+ ? readSafely<string | null>(() => {
503
+ return serviceWorkerController.scriptURL
504
+ ? truncate(
505
+ UrlScrubber.scrub(serviceWorkerController.scriptURL),
506
+ MAX_PAGE_URL_LENGTH,
507
+ )
508
+ : null;
509
+ }, null)
510
+ : null;
511
+
512
+ const serviceWorkerState: string | null = serviceWorkerController
513
+ ? readSafely<string | null>(() => {
514
+ return serviceWorkerController.state
515
+ ? sanitizeSupportText(
516
+ serviceWorkerController.state,
517
+ MAX_RUNTIME_STRING_LENGTH,
518
+ )
519
+ : null;
520
+ }, null)
521
+ : null;
522
+
523
+ const timeZone: string = readSafely<string>(() => {
524
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || "unknown";
525
+ }, "unknown");
526
+
527
+ return {
528
+ application: {
529
+ appVersion: sanitizeSupportText(
530
+ AppVersion || env("VERSION") || "unknown",
531
+ MAX_RUNTIME_STRING_LENGTH,
532
+ ),
533
+ gitSha: sanitizeSupportText(
534
+ GitSha || "unknown",
535
+ MAX_RUNTIME_STRING_LENGTH,
536
+ ),
537
+ edition: IS_ENTERPRISE_EDITION ? "Enterprise" : "Community",
538
+ nodeEnvironment: sanitizeSupportText(
539
+ env("NODE_ENV") || "unknown",
540
+ MAX_RUNTIME_STRING_LENGTH,
541
+ ),
542
+ reactVersion: sanitizeSupportText(
543
+ React.version || "unknown",
544
+ MAX_RUNTIME_STRING_LENGTH,
545
+ ),
546
+ },
547
+ page: {
548
+ url: truncate(UrlScrubber.scrub(rawUrl), MAX_PAGE_URL_LENGTH),
549
+ pathname: truncate(
550
+ UrlScrubber.getScrubbedPathname(rawUrl),
551
+ MAX_PAGE_URL_LENGTH,
552
+ ),
553
+ documentTitle: hasDocument
554
+ ? sanitizeSupportText(
555
+ readSafely<string>(() => {
556
+ return document.title || "";
557
+ }, ""),
558
+ MAX_DOCUMENT_TITLE_LENGTH,
559
+ )
560
+ : "",
561
+ hadQueryString: hasWindow
562
+ ? readSafely<boolean>(() => {
563
+ return Boolean(window.location.search);
564
+ }, false)
565
+ : false,
566
+ hadFragment: hasWindow
567
+ ? readSafely<boolean>(() => {
568
+ return Boolean(window.location.hash);
569
+ }, false)
570
+ : false,
571
+ visibilityState: hasDocument
572
+ ? readSafely<string>(() => {
573
+ return document.visibilityState || "unknown";
574
+ }, "unknown")
575
+ : "unknown",
576
+ documentReadyState: hasDocument
577
+ ? readSafely<string>(() => {
578
+ return document.readyState || "unknown";
579
+ }, "unknown")
580
+ : "unknown",
581
+ historyLength: hasWindow
582
+ ? readSafely<number>(() => {
583
+ return window.history.length || 0;
584
+ }, 0)
585
+ : 0,
586
+ },
587
+ browser: {
588
+ userAgent: hasNavigator
589
+ ? sanitizeSupportText(
590
+ readSafely<string>(() => {
591
+ return navigator.userAgent || "unknown";
592
+ }, "unknown"),
593
+ MAX_RUNTIME_STRING_LENGTH,
594
+ )
595
+ : "unknown",
596
+ platform: hasNavigator
597
+ ? sanitizeSupportText(
598
+ readSafely<string>(() => {
599
+ return navigator.platform || "unknown";
600
+ }, "unknown"),
601
+ MAX_RUNTIME_STRING_LENGTH,
602
+ )
603
+ : "unknown",
604
+ vendor: hasNavigator
605
+ ? sanitizeSupportText(
606
+ readSafely<string>(() => {
607
+ return navigator.vendor || "unknown";
608
+ }, "unknown"),
609
+ MAX_RUNTIME_STRING_LENGTH,
610
+ )
611
+ : "unknown",
612
+ language: hasNavigator
613
+ ? sanitizeSupportText(
614
+ readSafely<string>(() => {
615
+ return navigator.language || "unknown";
616
+ }, "unknown"),
617
+ MAX_RUNTIME_STRING_LENGTH,
618
+ )
619
+ : "unknown",
620
+ languages: hasNavigator
621
+ ? readSafely<Array<string>>(() => {
622
+ return Array.from(navigator.languages || [])
623
+ .slice(0, 20)
624
+ .map((language: string): string => {
625
+ return sanitizeSupportText(
626
+ language,
627
+ MAX_RUNTIME_STRING_LENGTH,
628
+ );
629
+ });
630
+ }, [])
631
+ : [],
632
+ onLine: hasNavigator
633
+ ? readSafely<boolean>(() => {
634
+ return navigator.onLine;
635
+ }, false)
636
+ : false,
637
+ cookieEnabled: hasNavigator
638
+ ? readSafely<boolean>(() => {
639
+ return navigator.cookieEnabled;
640
+ }, false)
641
+ : false,
642
+ hardwareConcurrency: hasNavigator
643
+ ? readSafely<number>(() => {
644
+ return navigator.hardwareConcurrency || 0;
645
+ }, 0)
646
+ : 0,
647
+ maxTouchPoints: hasNavigator
648
+ ? readSafely<number>(() => {
649
+ return navigator.maxTouchPoints || 0;
650
+ }, 0)
651
+ : 0,
652
+ timeZone: sanitizeSupportText(timeZone, MAX_RUNTIME_STRING_LENGTH),
653
+ timeZoneOffsetMinutes: new Date().getTimezoneOffset(),
654
+ },
655
+ display: {
656
+ viewportWidth: hasWindow
657
+ ? readSafely<number>(() => {
658
+ return window.innerWidth || 0;
659
+ }, 0)
660
+ : 0,
661
+ viewportHeight: hasWindow
662
+ ? readSafely<number>(() => {
663
+ return window.innerHeight || 0;
664
+ }, 0)
665
+ : 0,
666
+ screenWidth: hasWindow
667
+ ? readSafely<number>(() => {
668
+ return window.screen?.width || 0;
669
+ }, 0)
670
+ : 0,
671
+ screenHeight: hasWindow
672
+ ? readSafely<number>(() => {
673
+ return window.screen?.height || 0;
674
+ }, 0)
675
+ : 0,
676
+ availableScreenWidth: hasWindow
677
+ ? readSafely<number>(() => {
678
+ return window.screen?.availWidth || 0;
679
+ }, 0)
680
+ : 0,
681
+ availableScreenHeight: hasWindow
682
+ ? readSafely<number>(() => {
683
+ return window.screen?.availHeight || 0;
684
+ }, 0)
685
+ : 0,
686
+ devicePixelRatio: hasWindow
687
+ ? readSafely<number>(() => {
688
+ return window.devicePixelRatio || 1;
689
+ }, 1)
690
+ : 1,
691
+ colorDepth: hasWindow
692
+ ? readSafely<number>(() => {
693
+ return window.screen?.colorDepth || 0;
694
+ }, 0)
695
+ : 0,
696
+ pixelDepth: hasWindow
697
+ ? readSafely<number>(() => {
698
+ return window.screen?.pixelDepth || 0;
699
+ }, 0)
700
+ : 0,
701
+ },
702
+ serviceWorker: {
703
+ isSupported: hasNavigator
704
+ ? readSafely<boolean>(() => {
705
+ return "serviceWorker" in navigator;
706
+ }, false)
707
+ : false,
708
+ isControlled: Boolean(serviceWorkerController),
709
+ scriptUrl: serviceWorkerScriptUrl,
710
+ state: serviceWorkerState,
711
+ },
712
+ navigation: getNavigationDetails(),
713
+ };
714
+ };
715
+
716
+ export type CreateErrorSupportBundleFunction = (
717
+ options: CreateErrorSupportBundleOptions,
718
+ ) => ErrorSupportBundle;
719
+
720
+ export const createErrorSupportBundle: CreateErrorSupportBundleFunction = (
721
+ options: CreateErrorSupportBundleOptions,
722
+ ): ErrorSupportBundle => {
723
+ const generatedAt: Date = options.generatedAt || new Date();
724
+ const generatedAtIso: string = generatedAt.toISOString();
725
+ const runtimeDetails: ErrorSupportBundleRuntimeDetails =
726
+ options.runtimeDetails || collectErrorSupportBundleRuntimeDetails();
727
+ const componentStack: string | null = options.componentStack
728
+ ? sanitizeSupportText(
729
+ options.componentStack,
730
+ MAX_SUPPORT_COMPONENT_STACK_LENGTH,
731
+ )
732
+ : null;
733
+
734
+ return {
735
+ schemaVersion: ERROR_SUPPORT_BUNDLE_SCHEMA_VERSION,
736
+ type: "oneuptime-browser-error",
737
+ generatedAt: generatedAtIso,
738
+ errorCapturedAt: options.capturedAt || generatedAtIso,
739
+ application: runtimeDetails.application,
740
+ error: serializeSupportError(options.error),
741
+ react: {
742
+ component: getComponentFromStack(componentStack),
743
+ componentStack: componentStack,
744
+ digest: options.digest
745
+ ? sanitizeSupportText(options.digest, MAX_DIAGNOSTIC_PROPERTY_LENGTH)
746
+ : null,
747
+ },
748
+ page: runtimeDetails.page,
749
+ browser: runtimeDetails.browser,
750
+ display: runtimeDetails.display,
751
+ serviceWorker: runtimeDetails.serviceWorker,
752
+ navigation: runtimeDetails.navigation,
753
+ privacy: {
754
+ reviewBeforeSharing:
755
+ "Review this diagnostics file before sharing it with OneUptime Support because error messages and the page title can contain application data.",
756
+ urlHandling:
757
+ "Query strings and fragments are removed, identifier-like path segments are redacted, URLs inside error stacks are scrubbed, and common credential or personal-data patterns are masked.",
758
+ excluded: [
759
+ "Direct reads of cookie contents or browser authentication state",
760
+ "Direct reads of local storage or session storage contents",
761
+ "Direct reads of the page body or form values",
762
+ "Direct reads of request or response headers and bodies",
763
+ "Direct reads of console history",
764
+ "Raw environment-variable collection",
765
+ "Direct user or project identity collection",
766
+ ],
767
+ },
768
+ };
769
+ };
770
+
771
+ export type GetErrorSupportBundleFilenameFunction = (
772
+ generatedAt: Date,
773
+ ) => string;
774
+
775
+ export const getErrorSupportBundleFilename: GetErrorSupportBundleFilenameFunction =
776
+ (generatedAt: Date): string => {
777
+ const timestamp: string = generatedAt
778
+ .toISOString()
779
+ .replace(/[:.]/g, "-")
780
+ .slice(0, 19);
781
+
782
+ return `oneuptime-error-support-bundle-${timestamp}.json`;
783
+ };
784
+
785
+ export type DownloadErrorSupportBundleFunction = (
786
+ options: CreateErrorSupportBundleOptions,
787
+ ) => ErrorSupportBundle;
788
+
789
+ export const downloadErrorSupportBundle: DownloadErrorSupportBundleFunction = (
790
+ options: CreateErrorSupportBundleOptions,
791
+ ): ErrorSupportBundle => {
792
+ const generatedAt: Date = options.generatedAt || new Date();
793
+ const bundle: ErrorSupportBundle = createErrorSupportBundle({
794
+ ...options,
795
+ generatedAt: generatedAt,
796
+ });
797
+
798
+ downloadFile({
799
+ content: `${JSON.stringify(bundle, null, 2)}\n`,
800
+ filename: getErrorSupportBundleFilename(generatedAt),
801
+ mimeType: "application/json;charset=utf-8;",
802
+ });
803
+
804
+ return bundle;
805
+ };