@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
@@ -6,7 +6,7 @@ import StatusPageResource from "../../Models/DatabaseModels/StatusPageResource";
6
6
  import Dictionary from "../../Types/Dictionary";
7
7
  import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
8
8
  import StatusPageGroup from "../../Models/DatabaseModels/StatusPageGroup";
9
- import StatusPageGroupTreeUtil from "./GroupTree";
9
+ import StatusPageGroupTreeUtil, { StatusPageGroupTreeIndex } from "./GroupTree";
10
10
  import UptimeUtil, { UptimeWindow } from "../Uptime/UptimeUtil";
11
11
 
12
12
  export default class StatusPageResourceUptimeUtil {
@@ -81,6 +81,12 @@ export default class StatusPageResourceUptimeUtil {
81
81
  * (or pass only this group) to look at the group's own resources.
82
82
  */
83
83
  allStatusPageGroups?: Array<StatusPageGroup> | undefined;
84
+ /*
85
+ * A prebuilt parent -> children index over allStatusPageGroups. Optional,
86
+ * and worth passing from any caller that asks this per group: without it
87
+ * every call re-buckets the whole group list.
88
+ */
89
+ statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
84
90
  }): MonitorStatus {
85
91
  let currentStatus: MonitorStatus = new MonitorStatus();
86
92
  currentStatus.name = "Operational";
@@ -91,6 +97,7 @@ export default class StatusPageResourceUptimeUtil {
91
97
  statusPageGroup: data.statusPageGroup,
92
98
  statusPageResources: data.statusPageResources,
93
99
  allStatusPageGroups: data.allStatusPageGroups,
100
+ statusPageGroupTreeIndex: data.statusPageGroupTreeIndex,
94
101
  });
95
102
 
96
103
  for (const resource of resourcesInGroup) {
@@ -187,6 +194,8 @@ export default class StatusPageResourceUptimeUtil {
187
194
  * makes each level of the hierarchy show a rolled up availability.
188
195
  */
189
196
  allStatusPageGroups?: Array<StatusPageGroup> | undefined;
197
+ /* See getCurrentStatusPageGroupStatus. */
198
+ statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
190
199
  }): number | null {
191
200
  if (!data.statusPageGroup.showUptimePercent) {
192
201
  return null;
@@ -197,6 +206,7 @@ export default class StatusPageResourceUptimeUtil {
197
206
  statusPageGroup: data.statusPageGroup,
198
207
  statusPageResources: data.statusPageResources,
199
208
  allStatusPageGroups: data.allStatusPageGroups,
209
+ statusPageGroupTreeIndex: data.statusPageGroupTreeIndex,
200
210
  });
201
211
 
202
212
  if (resourcesInGroup.length === 0) {
@@ -276,11 +286,24 @@ export default class StatusPageResourceUptimeUtil {
276
286
  statusPageGroup: StatusPageGroup;
277
287
  statusPageResources: Array<StatusPageResource>;
278
288
  allStatusPageGroups?: Array<StatusPageGroup> | undefined;
289
+ /* See getCurrentStatusPageGroupStatus. */
290
+ statusPageGroupTreeIndex?: StatusPageGroupTreeIndex | undefined;
279
291
  }): Array<StatusPageResource> {
292
+ const statusPageGroups: Array<StatusPageGroup> =
293
+ data.allStatusPageGroups || [data.statusPageGroup];
294
+
280
295
  const groupsToInclude: Array<StatusPageGroup> =
281
296
  StatusPageGroupTreeUtil.getGroupAndDescendants({
282
297
  statusPageGroup: data.statusPageGroup,
283
- statusPageGroups: data.allStatusPageGroups || [data.statusPageGroup],
298
+ statusPageGroups: statusPageGroups,
299
+ /*
300
+ * An index built over a different list than the one in play would
301
+ * answer for the wrong hierarchy, and allStatusPageGroups is what the
302
+ * caller's index is built from.
303
+ */
304
+ index: data.allStatusPageGroups
305
+ ? data.statusPageGroupTreeIndex
306
+ : undefined,
284
307
  });
285
308
 
286
309
  const groupIds: Set<string> = new Set<string>(
@@ -319,6 +342,15 @@ export default class StatusPageResourceUptimeUtil {
319
342
 
320
343
  const allUptimePercent: Array<number> = [];
321
344
 
345
+ /*
346
+ * One index for the whole descent below, rather than one re-bucketing of
347
+ * the group list per level and per reporting group.
348
+ */
349
+ const groupTreeIndex: StatusPageGroupTreeIndex =
350
+ StatusPageGroupTreeUtil.buildIndex({
351
+ statusPageGroups: data.resourceGroups,
352
+ });
353
+
322
354
  /*
323
355
  * Calculate for groups first. Groups nest, and a group that reports uptime
324
356
  * already averages its whole subtree - so descend only until the first
@@ -341,6 +373,7 @@ export default class StatusPageResourceUptimeUtil {
341
373
  monitorsInGroup: data.monitorsInGroup,
342
374
  uptimeWindow: data.uptimeWindow,
343
375
  allStatusPageGroups: data.resourceGroups,
376
+ statusPageGroupTreeIndex: groupTreeIndex,
344
377
  });
345
378
 
346
379
  if (groupUptimePercent !== null) {
@@ -354,6 +387,7 @@ export default class StatusPageResourceUptimeUtil {
354
387
  StatusPageGroupTreeUtil.getChildGroups({
355
388
  statusPageGroupId: group._id?.toString() || "",
356
389
  statusPageGroups: data.resourceGroups,
390
+ index: groupTreeIndex,
357
391
  }),
358
392
  );
359
393
  }
@@ -362,6 +396,7 @@ export default class StatusPageResourceUptimeUtil {
362
396
  collectGroupUptime(
363
397
  StatusPageGroupTreeUtil.getRootGroups({
364
398
  statusPageGroups: data.resourceGroups,
399
+ index: groupTreeIndex,
365
400
  }),
366
401
  );
367
402
 
@@ -0,0 +1,114 @@
1
+ import InBetween from "../../Types/BaseDatabase/InBetween";
2
+ import { TelemetrySavedViewTimeRange } from "../../Types/Telemetry/TelemetrySavedViewState";
3
+ import RangeStartAndEndDateTime from "../../Types/Time/RangeStartAndEndDateTime";
4
+ import TimeRange from "../../Types/Time/TimeRange";
5
+
6
+ /*
7
+ * Saved views (logs, metrics, traces) must remember the time *selection*, not
8
+ * the window that selection happened to resolve to when the view was saved.
9
+ * "Past 1 Hour" saved today has to still mean the last hour next week, so only
10
+ * a Custom range carries absolute timestamps; every rolling range is stored as
11
+ * its token alone and re-resolved against the clock each time it is applied.
12
+ */
13
+
14
+ export const DEFAULT_SAVED_VIEW_TIME_RANGE: TimeRange = TimeRange.PAST_ONE_HOUR;
15
+
16
+ export function serializeSavedViewTimeRange(
17
+ timeRange: RangeStartAndEndDateTime,
18
+ ): TelemetrySavedViewTimeRange {
19
+ const serialized: TelemetrySavedViewTimeRange = { range: timeRange.range };
20
+
21
+ if (timeRange.range === TimeRange.CUSTOM && timeRange.startAndEndDate) {
22
+ serialized.startValue = toIsoString(timeRange.startAndEndDate.startValue);
23
+ serialized.endValue = toIsoString(timeRange.startAndEndDate.endValue);
24
+ }
25
+
26
+ return serialized;
27
+ }
28
+
29
+ /*
30
+ * Read a stored time selection, or undefined when there is nothing usable
31
+ * there. The input is whatever came back out of a JSON column, so nothing
32
+ * about its shape is guaranteed. Callers that have another source to fall
33
+ * back on (e.g. a legacy absolute window) use this; callers that do not use
34
+ * deserializeSavedViewTimeRange below, which substitutes the default.
35
+ */
36
+ export function readSavedViewTimeRange(
37
+ saved: TelemetrySavedViewTimeRange | unknown,
38
+ ): RangeStartAndEndDateTime | undefined {
39
+ if (!saved || typeof saved !== "object") {
40
+ return undefined;
41
+ }
42
+
43
+ const rawRange: unknown = (saved as Record<string, unknown>)["range"];
44
+
45
+ if (typeof rawRange !== "string") {
46
+ return undefined;
47
+ }
48
+
49
+ const knownRanges: Array<string> = Object.values(TimeRange);
50
+
51
+ if (!knownRanges.includes(rawRange)) {
52
+ return undefined;
53
+ }
54
+
55
+ const range: TimeRange = rawRange as TimeRange;
56
+
57
+ if (range !== TimeRange.CUSTOM) {
58
+ return { range: range };
59
+ }
60
+
61
+ const start: Date | null = toDate(
62
+ (saved as Record<string, unknown>)["startValue"],
63
+ );
64
+ const end: Date | null = toDate(
65
+ (saved as Record<string, unknown>)["endValue"],
66
+ );
67
+
68
+ if (!start || !end) {
69
+ // A Custom range without a usable window says nothing about when to look.
70
+ return undefined;
71
+ }
72
+
73
+ return {
74
+ range: TimeRange.CUSTOM,
75
+ startAndEndDate: new InBetween<Date>(start, end),
76
+ };
77
+ }
78
+
79
+ /*
80
+ * Rebuild a RangeStartAndEndDateTime from saved state. Unknown or malformed
81
+ * values fall back to the default (past one hour) rather than throwing or
82
+ * producing a nonsensical window.
83
+ */
84
+ export function deserializeSavedViewTimeRange(
85
+ saved: TelemetrySavedViewTimeRange | unknown,
86
+ ): RangeStartAndEndDateTime {
87
+ return (
88
+ readSavedViewTimeRange(saved) || { range: DEFAULT_SAVED_VIEW_TIME_RANGE }
89
+ );
90
+ }
91
+
92
+ function toIsoString(value: Date | string): string {
93
+ if (value instanceof Date) {
94
+ return value.toISOString();
95
+ }
96
+
97
+ // Dates round-tripped through JSON come back as strings.
98
+ const parsed: Date = new Date(value);
99
+ return isNaN(parsed.getTime()) ? String(value) : parsed.toISOString();
100
+ }
101
+
102
+ function toDate(value: unknown): Date | null {
103
+ if (value instanceof Date) {
104
+ return isNaN(value.getTime()) ? null : value;
105
+ }
106
+
107
+ if (typeof value !== "string" || value.length === 0) {
108
+ return null;
109
+ }
110
+
111
+ const parsed: Date = new Date(value);
112
+
113
+ return isNaN(parsed.getTime()) ? null : parsed;
114
+ }
@@ -0,0 +1,334 @@
1
+ import InBetween from "../../Types/BaseDatabase/InBetween";
2
+ import Query from "../../Types/BaseDatabase/Query";
3
+ import { JSONObject, ObjectType } from "../../Types/JSON";
4
+ import MetricViewData from "../../Types/Metrics/MetricViewData";
5
+ import { TelemetryQuery } from "../../Types/Telemetry/TelemetryQuery";
6
+ import TelemetryType from "../../Types/Telemetry/TelemetryType";
7
+ import RangeStartAndEndDateTime from "../../Types/Time/RangeStartAndEndDateTime";
8
+ import TimeRange from "../../Types/Time/TimeRange";
9
+
10
+ /*
11
+ * The snapshot window that a telemetry monitor evaluated over is stamped onto
12
+ * the query it stores on the Incident / Alert row: logs and exceptions carry
13
+ * it as `time`, spans as `startTime`, metrics as `metricViewData.startAndEndDate`.
14
+ *
15
+ * Two things make that window awkward to consume on the client.
16
+ *
17
+ * 1. It does not survive the store/load round trip as Dates. The blob is
18
+ * persisted through `JSON.stringify`, which calls `InBetween.toJSON()` and
19
+ * then flattens each bound to an ISO string. On the way back
20
+ * `InBetween.fromJSON()` reconstructs the operator but hands those strings
21
+ * to the constructor untouched, so `startValue` is a `string` even though
22
+ * the static type says `Date`. Anything guarding on `instanceof Date`
23
+ * silently no-ops on an incident page.
24
+ *
25
+ * 2. Viewers that own a time-range picker (the logs viewer) need the window as
26
+ * a `RangeStartAndEndDateTime`, not as a query filter, because the picker
27
+ * state — not the query — is what drives the histogram and facet requests.
28
+ *
29
+ * These helpers are the single place that knows both shapes. They are pure so
30
+ * they can be unit tested without mounting a viewer.
31
+ */
32
+ export default class TelemetryQueryTimeRange {
33
+ /*
34
+ * Field on the telemetry query that carries the snapshot window, per type.
35
+ * Metrics keep theirs on metricViewData instead, and profiles do not store a
36
+ * query at all, so both return null.
37
+ */
38
+ public static getWindowFieldName(
39
+ telemetryType: TelemetryType | undefined | null,
40
+ ): string | null {
41
+ if (telemetryType === TelemetryType.Log) {
42
+ return "time";
43
+ }
44
+
45
+ if (telemetryType === TelemetryType.Exception) {
46
+ return "time";
47
+ }
48
+
49
+ if (telemetryType === TelemetryType.Trace) {
50
+ return "startTime";
51
+ }
52
+
53
+ return null;
54
+ }
55
+
56
+ /*
57
+ * Coerce a stored window into an InBetween whose bounds are real Dates.
58
+ *
59
+ * Accepts an `InBetween` instance (bounds may be Dates, ISO strings or epoch
60
+ * numbers, depending on whether the value was just built or came back from
61
+ * storage) and the plain `{ _type: "InBetween", startValue, endValue }`
62
+ * object that a caller sees when it skipped `JSONFunctions.deserialize`.
63
+ *
64
+ * Returns null for anything unparseable so callers can fall back to their own
65
+ * default. An inverted window (start after end) is returned as-is rather than
66
+ * rejected: it renders as a visibly odd range the user can see and report,
67
+ * which beats silently swapping back to a rolling default that shows
68
+ * unrelated data under an incident's heading.
69
+ */
70
+ public static toDateWindow(value: unknown): InBetween<Date> | null {
71
+ if (!value || typeof value !== "object") {
72
+ return null;
73
+ }
74
+
75
+ let rawStart: unknown = undefined;
76
+ let rawEnd: unknown = undefined;
77
+
78
+ if (value instanceof InBetween) {
79
+ /*
80
+ * Already in the target shape — hand back the same instance rather than
81
+ * an equal copy. Callers use identity to decide whether anything changed,
82
+ * and a fresh-but-equal object would churn React state on every load.
83
+ */
84
+ if (
85
+ this.toDate(value.startValue) === value.startValue &&
86
+ this.toDate(value.endValue) === value.endValue
87
+ ) {
88
+ return value as InBetween<Date>;
89
+ }
90
+
91
+ rawStart = value.startValue;
92
+ rawEnd = value.endValue;
93
+ } else if ((value as JSONObject)["_type"] === ObjectType.InBetween) {
94
+ rawStart = (value as JSONObject)["startValue"];
95
+ rawEnd = (value as JSONObject)["endValue"];
96
+ } else {
97
+ return null;
98
+ }
99
+
100
+ const startDate: Date | null = this.toDate(rawStart);
101
+ const endDate: Date | null = this.toDate(rawEnd);
102
+
103
+ if (!startDate || !endDate) {
104
+ return null;
105
+ }
106
+
107
+ return new InBetween<Date>(startDate, endDate);
108
+ }
109
+
110
+ private static toDate(value: unknown): Date | null {
111
+ if (value === null || value === undefined) {
112
+ return null;
113
+ }
114
+
115
+ if (value instanceof Date) {
116
+ return Number.isNaN(value.getTime()) ? null : value;
117
+ }
118
+
119
+ if (typeof value !== "string" && typeof value !== "number") {
120
+ return null;
121
+ }
122
+
123
+ /*
124
+ * `new Date("")` is the current time, not an Invalid Date, so an empty
125
+ * bound would silently become "now" and quietly widen the window instead
126
+ * of being reported as missing.
127
+ */
128
+ if (typeof value === "string" && value.trim() === "") {
129
+ return null;
130
+ }
131
+
132
+ const parsed: Date = new Date(value);
133
+
134
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
135
+ }
136
+
137
+ /*
138
+ * Pull the snapshot window out of a telemetry query record, whatever its
139
+ * telemetry type. Returns null when the monitor stored no window (older
140
+ * incidents, or a log monitor configured with no lastXSecondsOfLogs).
141
+ */
142
+ public static getSnapshotWindow(
143
+ telemetryQuery: TelemetryQuery | null | undefined,
144
+ ): InBetween<Date> | null {
145
+ if (!telemetryQuery) {
146
+ return null;
147
+ }
148
+
149
+ if (telemetryQuery.metricViewData) {
150
+ const metricWindow: InBetween<Date> | null = this.toDateWindow(
151
+ telemetryQuery.metricViewData.startAndEndDate,
152
+ );
153
+
154
+ if (metricWindow) {
155
+ return metricWindow;
156
+ }
157
+ }
158
+
159
+ return this.getQueryWindow(
160
+ telemetryQuery.telemetryQuery,
161
+ telemetryQuery.telemetryType,
162
+ );
163
+ }
164
+
165
+ /*
166
+ * Same, for a bare query. `telemetryType` picks the field to read; when it is
167
+ * unknown both known field names are tried so a caller holding only a query
168
+ * (e.g. the logs viewer, which is handed a Query<Log> and nothing else) still
169
+ * finds the window.
170
+ */
171
+ public static getQueryWindow(
172
+ query: Query<Record<string, unknown>> | JSONObject | null | undefined,
173
+ telemetryType?: TelemetryType | undefined,
174
+ ): InBetween<Date> | null {
175
+ if (!query) {
176
+ return null;
177
+ }
178
+
179
+ const fieldName: string | null = this.getWindowFieldName(telemetryType);
180
+ const fieldNames: Array<string> = fieldName
181
+ ? [fieldName]
182
+ : ["time", "startTime"];
183
+
184
+ for (const candidate of fieldNames) {
185
+ const window: InBetween<Date> | null = this.toDateWindow(
186
+ (query as JSONObject)[candidate],
187
+ );
188
+
189
+ if (window) {
190
+ return window;
191
+ }
192
+ }
193
+
194
+ return null;
195
+ }
196
+
197
+ /*
198
+ * Present a snapshot window as a picker value. Always CUSTOM: the window is
199
+ * an absolute instant in the past, so it must never re-anchor to "now" the
200
+ * way a relative range like "Past 1 Hour" does.
201
+ */
202
+ public static toRangeStartAndEndDateTime(
203
+ window: InBetween<Date> | null | undefined,
204
+ ): RangeStartAndEndDateTime | null {
205
+ if (!window) {
206
+ return null;
207
+ }
208
+
209
+ return {
210
+ range: TimeRange.CUSTOM,
211
+ startAndEndDate: window,
212
+ };
213
+ }
214
+
215
+ /*
216
+ * Convenience for viewers: resolve the pinned picker value for a query, or
217
+ * null when the query carries no window and the viewer should keep its own
218
+ * rolling default.
219
+ */
220
+ public static getPinnedRangeForQuery(
221
+ query: Query<Record<string, unknown>> | JSONObject | null | undefined,
222
+ telemetryType?: TelemetryType | undefined,
223
+ ): RangeStartAndEndDateTime | null {
224
+ return this.toRangeStartAndEndDateTime(
225
+ this.getQueryWindow(query, telemetryType),
226
+ );
227
+ }
228
+
229
+ /*
230
+ * Value equality for two picker values. Hosts that rebuild their query on
231
+ * every render produce an equal-but-new window each time, so state updates
232
+ * have to be gated on the value rather than on object identity or a
233
+ * re-render loop follows.
234
+ */
235
+ public static isSameRange(
236
+ a: RangeStartAndEndDateTime | null | undefined,
237
+ b: RangeStartAndEndDateTime | null | undefined,
238
+ ): boolean {
239
+ if (!a || !b) {
240
+ return !a && !b;
241
+ }
242
+
243
+ if (a.range !== b.range) {
244
+ return false;
245
+ }
246
+
247
+ const aWindow: InBetween<Date> | null = this.toDateWindow(
248
+ a.startAndEndDate,
249
+ );
250
+ const bWindow: InBetween<Date> | null = this.toDateWindow(
251
+ b.startAndEndDate,
252
+ );
253
+
254
+ if (!aWindow || !bWindow) {
255
+ return !aWindow && !bWindow;
256
+ }
257
+
258
+ return (
259
+ aWindow.startValue.getTime() === bWindow.startValue.getTime() &&
260
+ aWindow.endValue.getTime() === bWindow.endValue.getTime()
261
+ );
262
+ }
263
+
264
+ /*
265
+ * Rewrite a stored telemetry query so every window bound is a real Date.
266
+ *
267
+ * Consumers downstream gate real behaviour on `instanceof Date` — the metric
268
+ * chart skips aggregation-bucket alignment and never fetches exemplars when
269
+ * the bounds are strings — so hydrating once at the page's deserialize
270
+ * boundary is what makes those paths work on an incident.
271
+ *
272
+ * Returns the input unchanged (same reference) when there is nothing to fix,
273
+ * so callers can hydrate unconditionally without churning React state.
274
+ */
275
+ public static hydrate(
276
+ telemetryQuery: TelemetryQuery | null | undefined,
277
+ ): TelemetryQuery | null {
278
+ if (!telemetryQuery) {
279
+ return null;
280
+ }
281
+
282
+ let didChange: boolean = false;
283
+
284
+ let metricViewData: MetricViewData | null =
285
+ telemetryQuery.metricViewData || null;
286
+
287
+ if (metricViewData) {
288
+ const metricWindow: InBetween<Date> | null = this.toDateWindow(
289
+ metricViewData.startAndEndDate,
290
+ );
291
+
292
+ if (metricWindow && metricWindow !== metricViewData.startAndEndDate) {
293
+ metricViewData = {
294
+ ...metricViewData,
295
+ startAndEndDate: metricWindow,
296
+ };
297
+ didChange = true;
298
+ }
299
+ }
300
+
301
+ let query: TelemetryQuery["telemetryQuery"] =
302
+ telemetryQuery.telemetryQuery || null;
303
+
304
+ if (query) {
305
+ const fieldName: string | null = this.getWindowFieldName(
306
+ telemetryQuery.telemetryType,
307
+ );
308
+
309
+ if (fieldName) {
310
+ const window: InBetween<Date> | null = this.toDateWindow(
311
+ (query as JSONObject)[fieldName],
312
+ );
313
+
314
+ if (window && window !== (query as JSONObject)[fieldName]) {
315
+ query = {
316
+ ...(query as JSONObject),
317
+ [fieldName]: window,
318
+ } as TelemetryQuery["telemetryQuery"];
319
+ didChange = true;
320
+ }
321
+ }
322
+ }
323
+
324
+ if (!didChange) {
325
+ return telemetryQuery;
326
+ }
327
+
328
+ return {
329
+ ...telemetryQuery,
330
+ telemetryQuery: query,
331
+ metricViewData: metricViewData,
332
+ };
333
+ }
334
+ }
@@ -30,6 +30,7 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
30
30
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
31
31
  import AIRunType from "../../Types/AI/AIRunType";
32
32
  import AIRunStatus from "../../Types/AI/AIRunStatus";
33
+ import AIRunCodeFixRecommendation from "../../Types/AI/AIRunCodeFixRecommendation";
33
34
  import AIRunHumanVerdict from "../../Types/AI/AIRunHumanVerdict";
34
35
  import AIRunAutoGrade from "../../Types/AI/AIRunAutoGrade";
35
36
  import CodeFixTaskType from "../../Types/AI/CodeFixTaskType";
@@ -57,6 +58,15 @@ let AIRun = class AIRun extends BaseModel {
57
58
  */
58
59
  this.taskNumber = undefined;
59
60
  this.status = undefined;
61
+ /*
62
+ * The server-authored decision that controls whether an incident/alert
63
+ * investigation may be turned into a FixFromIncident task. New subject
64
+ * investigations move to Pending in the atomic Completed transition; the
65
+ * investigation engine settles the value after its structured
66
+ * classification and analysis post. Other lifecycle paths and legacy rows
67
+ * default to NotRecommended so a missing decision never creates a PR.
68
+ */
69
+ this.codeFixRecommendation = undefined;
60
70
  this.user = undefined;
61
71
  this.userId = undefined;
62
72
  this.conversation = undefined;
@@ -294,6 +304,34 @@ __decorate([
294
304
  }),
295
305
  __metadata("design:type", String)
296
306
  ], AIRun.prototype, "status", void 0);
307
+ __decorate([
308
+ ColumnAccessControl({
309
+ create: [],
310
+ read: [
311
+ Permission.ProjectOwner,
312
+ Permission.ProjectAdmin,
313
+ Permission.ProjectMember,
314
+ Permission.Viewer,
315
+ ],
316
+ update: [],
317
+ }),
318
+ TableColumn({
319
+ required: true,
320
+ type: TableColumnType.ShortText,
321
+ title: "Code Fix Recommendation",
322
+ description: "For incident/alert investigations: whether the structured investigation outcome recommends opening a code-fix pull request.",
323
+ defaultValue: AIRunCodeFixRecommendation.NotRecommended,
324
+ isDefaultValueColumn: true,
325
+ canReadOnRelationQuery: true,
326
+ }),
327
+ Column({
328
+ nullable: false,
329
+ type: ColumnType.ShortText,
330
+ length: ColumnLength.ShortText,
331
+ default: AIRunCodeFixRecommendation.NotRecommended,
332
+ }),
333
+ __metadata("design:type", String)
334
+ ], AIRun.prototype, "codeFixRecommendation", void 0);
297
335
  __decorate([
298
336
  ColumnAccessControl({
299
337
  create: [],
@@ -832,7 +870,7 @@ __decorate([
832
870
  required: false,
833
871
  type: TableColumnType.JSON,
834
872
  title: "Task Context",
835
- description: "Internal: trigger-time context for code-fix recipes without a subject row (e.g. FixPerformance trace evidence).",
873
+ description: "Internal: immutable trigger-time context for code-fix recipes, including pinned investigation analyses and FixPerformance trace evidence.",
836
874
  }),
837
875
  Column({
838
876
  nullable: true,