@oneuptime/common 12.0.4 → 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 (374) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/Dashboard.ts +28 -0
  4. package/Models/DatabaseModels/Incident.ts +2 -0
  5. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  7. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  8. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  9. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  10. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  12. package/Models/DatabaseModels/Project.ts +231 -9
  13. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  14. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  15. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  17. package/Models/DatabaseModels/StatusPage.ts +28 -0
  18. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  19. package/Server/API/AIAgentDataAPI.ts +44 -55
  20. package/Server/API/AIInvestigationAPI.ts +175 -17
  21. package/Server/API/DashboardAPI.ts +10 -10
  22. package/Server/API/StatusPageAPI.ts +38 -19
  23. package/Server/EnvironmentConfig.ts +16 -0
  24. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  25. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  32. package/Server/Services/AIRunService.ts +78 -10
  33. package/Server/Services/AIService.ts +94 -22
  34. package/Server/Services/AlertFeedService.ts +5 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +29 -0
  36. package/Server/Services/DatabaseService.ts +43 -2
  37. package/Server/Services/IncidentFeedService.ts +5 -0
  38. package/Server/Services/LlmLogService.ts +46 -2
  39. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  40. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  41. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  42. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  43. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  44. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  45. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  46. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  47. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  48. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  49. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  50. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  51. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  52. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  53. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  54. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  55. package/Server/Utils/AI/SRE/README.md +1 -1
  56. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  57. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  58. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  59. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  60. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  61. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  62. package/Server/Utils/PasswordHash.ts +28 -4
  63. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  64. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  65. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  66. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  67. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  68. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  69. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  70. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  71. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  72. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  73. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  74. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  75. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  76. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  77. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  78. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  79. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  80. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  81. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
  82. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
  83. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  84. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  85. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  86. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  87. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  88. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  89. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  90. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  91. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  92. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  93. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  94. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  95. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  96. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  97. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  98. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  99. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  100. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  101. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  102. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  103. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  104. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  105. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  106. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  107. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  108. package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
  109. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  110. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  111. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  112. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  113. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  114. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  115. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  116. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  117. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  118. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  119. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  120. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  121. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  122. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  123. package/Tests/Types/Permission.test.ts +137 -0
  124. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  125. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  126. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  127. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  128. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  129. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  130. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  131. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  132. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  133. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  134. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  135. package/Tests/UI/Utils/Project.test.ts +31 -0
  136. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  137. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  138. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  139. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  140. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  141. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  142. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  143. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  144. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  145. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  146. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  147. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  148. package/Types/AI/CodeFixTaskContext.ts +63 -3
  149. package/Types/AI/CodeFixTaskType.ts +3 -3
  150. package/Types/HashedString.ts +4 -3
  151. package/Types/Monitor/CriteriaFilter.ts +4 -0
  152. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  153. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  155. package/Types/Monitor/MonitorMetricType.ts +8 -0
  156. package/Types/Monitor/MonitorStep.ts +10 -1
  157. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  158. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  159. package/Types/Permission.ts +23 -175
  160. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  161. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  162. package/UI/Components/ErrorBoundary.tsx +138 -11
  163. package/UI/Components/Feed/FeedItem.tsx +9 -2
  164. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  165. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  166. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  167. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  168. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  169. package/UI/Utils/DownloadFile.ts +16 -8
  170. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  171. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  172. package/UI/Utils/Project.ts +4 -0
  173. package/UI/Utils/StatusPage.ts +8 -2
  174. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  175. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  176. package/Utils/Dashboard/GridLayout.ts +523 -0
  177. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  178. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  179. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  180. package/Utils/StatusPage/GroupTree.ts +157 -66
  181. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  182. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  183. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  184. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  185. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  187. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  189. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  191. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  193. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  195. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  197. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  199. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  201. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  203. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  205. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/Project.js +241 -11
  207. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  211. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  213. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  215. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  216. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  218. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  219. package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
  220. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  221. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  222. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  223. package/build/dist/Server/API/DashboardAPI.js +8 -5
  224. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  225. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  226. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  227. package/build/dist/Server/EnvironmentConfig.js +14 -0
  228. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  229. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  230. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  231. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  232. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  245. package/build/dist/Server/Services/AIRunService.js +58 -12
  246. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  247. package/build/dist/Server/Services/AIService.js +74 -21
  248. package/build/dist/Server/Services/AIService.js.map +1 -1
  249. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  250. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  251. package/build/dist/Server/Services/AnalyticsDatabaseService.js +29 -1
  252. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  253. package/build/dist/Server/Services/DatabaseService.js +21 -2
  254. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  255. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  256. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  257. package/build/dist/Server/Services/LlmLogService.js +22 -1
  258. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  259. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  260. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  261. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  262. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  263. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  264. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  265. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  266. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  267. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  268. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  269. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  270. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  272. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  274. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  276. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  278. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  279. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  280. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  281. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  282. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  283. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  284. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  285. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  286. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  287. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  288. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  290. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  292. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  293. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  294. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  295. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  296. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  297. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  298. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  300. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  302. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  303. package/build/dist/Server/Utils/PasswordHash.js +25 -4
  304. package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
  305. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  306. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  307. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  308. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  309. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  310. package/build/dist/Types/HashedString.js +4 -3
  311. package/build/dist/Types/HashedString.js.map +1 -1
  312. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  313. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  314. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  315. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  316. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  317. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  318. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  319. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  320. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  321. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  322. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  323. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  324. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  325. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  326. package/build/dist/Types/Permission.js +23 -155
  327. package/build/dist/Types/Permission.js.map +1 -1
  328. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  329. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  333. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  334. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  335. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  336. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  338. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  339. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  340. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  343. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  344. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  345. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  346. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  347. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  348. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  349. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  350. package/build/dist/UI/Utils/Project.js +3 -0
  351. package/build/dist/UI/Utils/Project.js.map +1 -1
  352. package/build/dist/UI/Utils/StatusPage.js +4 -4
  353. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  354. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  355. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  356. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  357. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  358. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  359. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  360. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  361. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  362. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  363. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  364. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  365. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  366. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  367. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  368. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  369. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  370. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  371. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  372. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  373. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  374. 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
+ };