@oneuptime/common 12.0.3 → 12.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/CephCluster.ts +14 -0
  4. package/Models/DatabaseModels/CodeRepository.ts +14 -6
  5. package/Models/DatabaseModels/Dashboard.ts +28 -0
  6. package/Models/DatabaseModels/DockerHost.ts +14 -0
  7. package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
  8. package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
  9. package/Models/DatabaseModels/Incident.ts +2 -0
  10. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  11. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  12. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  13. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  14. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  15. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/IoTFleet.ts +14 -0
  17. package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
  18. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  19. package/Models/DatabaseModels/NetworkDevice.ts +14 -0
  20. package/Models/DatabaseModels/NetworkInterface.ts +18 -0
  21. package/Models/DatabaseModels/Project.ts +247 -11
  22. package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
  23. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  24. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  25. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  26. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  27. package/Models/DatabaseModels/Service.ts +30 -0
  28. package/Models/DatabaseModels/StatusPage.ts +28 -0
  29. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  30. package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
  31. package/Models/DatabaseModels/User.ts +30 -0
  32. package/Server/API/AIAgentDataAPI.ts +75 -55
  33. package/Server/API/AIInvestigationAPI.ts +175 -17
  34. package/Server/API/DashboardAPI.ts +429 -22
  35. package/Server/API/GitHubAPI.ts +119 -283
  36. package/Server/API/StatusPageAPI.ts +38 -19
  37. package/Server/API/UserAPI.ts +263 -1
  38. package/Server/EnvironmentConfig.ts +23 -3
  39. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  40. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  41. package/Server/Infrastructure/GlobalCache.ts +37 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  53. package/Server/Services/AIRunService.ts +78 -10
  54. package/Server/Services/AIService.ts +94 -22
  55. package/Server/Services/AlertFeedService.ts +5 -0
  56. package/Server/Services/AnalyticsDatabaseService.ts +101 -1
  57. package/Server/Services/CodeRepositoryService.ts +105 -2
  58. package/Server/Services/DatabaseService.ts +227 -3
  59. package/Server/Services/IncidentFeedService.ts +5 -0
  60. package/Server/Services/LlmLogService.ts +46 -2
  61. package/Server/Services/OpenTelemetryIngestService.ts +230 -26
  62. package/Server/Services/UserService.ts +184 -0
  63. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  64. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  65. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  66. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  67. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  68. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  69. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  70. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  71. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  72. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  73. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  74. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  75. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  76. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  77. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  78. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  79. package/Server/Utils/AI/SRE/README.md +1 -1
  80. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  81. package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
  82. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  83. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
  84. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
  85. package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
  86. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  87. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  88. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  89. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  90. package/Server/Utils/PasswordHash.ts +330 -0
  91. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  92. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  93. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  94. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  95. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  96. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
  97. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  98. package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
  99. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  100. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  101. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  102. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  103. package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
  104. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  105. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  106. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  107. package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
  108. package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
  109. package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
  110. package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
  111. package/Tests/Server/API/Helpers.ts +6 -1
  112. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  113. package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
  114. package/Tests/Server/Infrastructure/GlobalCache.test.ts +128 -0
  115. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
  116. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  117. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  118. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  119. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  120. package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
  121. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
  122. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +30 -1
  123. package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
  124. package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
  125. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +880 -0
  126. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  127. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  128. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  129. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  130. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  131. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
  132. package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
  133. package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
  134. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  135. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
  136. package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
  137. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  138. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  139. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  140. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  141. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  142. package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
  143. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
  144. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  145. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  146. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  147. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  148. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  149. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  150. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  151. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  152. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  153. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  154. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  155. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
  156. package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
  157. package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
  158. package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
  159. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  160. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  161. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  162. package/Tests/Server/Utils/PasswordHash.test.ts +585 -0
  163. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  164. package/Tests/Types/Database/ColumnLength.test.ts +7 -1
  165. package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
  166. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  167. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  168. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
  169. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  170. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  171. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
  172. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  173. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
  174. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  175. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  177. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  178. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  179. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
  180. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  181. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  182. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  183. package/Tests/Types/Permission.test.ts +137 -0
  184. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  185. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  186. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  187. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
  188. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  189. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  190. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  191. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  192. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  193. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  194. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  195. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  196. package/Tests/UI/Utils/Project.test.ts +31 -0
  197. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  198. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  199. package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
  200. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  201. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  202. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  203. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  204. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  205. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  206. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  207. package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
  208. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  209. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  210. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  211. package/Types/AI/CodeFixTaskContext.ts +63 -3
  212. package/Types/AI/CodeFixTaskType.ts +3 -3
  213. package/Types/Database/ColumnLength.ts +9 -1
  214. package/Types/Database/TableColumn.ts +11 -0
  215. package/Types/Database/UnsynchronizedIndex.ts +48 -0
  216. package/Types/HashedString.ts +140 -4
  217. package/Types/Monitor/CriteriaFilter.ts +4 -0
  218. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  219. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  220. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  221. package/Types/Monitor/MonitorMetricType.ts +8 -0
  222. package/Types/Monitor/MonitorStep.ts +10 -1
  223. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  224. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  225. package/Types/Permission.ts +23 -175
  226. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  227. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  228. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
  229. package/UI/Components/ErrorBoundary.tsx +138 -11
  230. package/UI/Components/Feed/FeedItem.tsx +9 -2
  231. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  232. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  233. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  234. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  235. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  236. package/UI/Components/Navbar/NavBar.tsx +12 -2
  237. package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
  238. package/UI/Utils/DownloadFile.ts +16 -8
  239. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  240. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  241. package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
  242. package/UI/Utils/Project.ts +4 -0
  243. package/UI/Utils/StatusPage.ts +8 -2
  244. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  245. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  246. package/Utils/Dashboard/GridLayout.ts +523 -0
  247. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  248. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  249. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  250. package/Utils/StatusPage/GroupTree.ts +157 -66
  251. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  252. package/Utils/TeamMembersByProject.ts +237 -0
  253. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  254. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  255. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  256. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  257. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  258. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  259. package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
  260. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
  262. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  264. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
  266. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
  268. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
  270. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  272. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  273. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  274. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  276. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  278. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  279. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  280. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  282. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  284. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
  286. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
  288. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  290. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
  292. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
  294. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/Project.js +257 -13
  296. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
  298. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  300. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  302. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  304. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  306. package/build/dist/Models/DatabaseModels/Service.js +28 -1
  307. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  309. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  311. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
  313. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/User.js +32 -0
  315. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  316. package/build/dist/Server/API/AIAgentDataAPI.js +49 -48
  317. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  318. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  319. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  320. package/build/dist/Server/API/DashboardAPI.js +312 -15
  321. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  322. package/build/dist/Server/API/GitHubAPI.js +94 -167
  323. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  324. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  325. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  326. package/build/dist/Server/API/UserAPI.js +187 -2
  327. package/build/dist/Server/API/UserAPI.js.map +1 -1
  328. package/build/dist/Server/EnvironmentConfig.js +21 -3
  329. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  330. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  331. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  332. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  333. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  334. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  335. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  353. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  354. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  355. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  356. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  358. package/build/dist/Server/Services/AIRunService.js +58 -12
  359. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  360. package/build/dist/Server/Services/AIService.js +74 -21
  361. package/build/dist/Server/Services/AIService.js.map +1 -1
  362. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  363. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  364. package/build/dist/Server/Services/AnalyticsDatabaseService.js +86 -2
  365. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  366. package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
  367. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  368. package/build/dist/Server/Services/DatabaseService.js +180 -3
  369. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  370. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  371. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  372. package/build/dist/Server/Services/LlmLogService.js +22 -1
  373. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  374. package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
  375. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  376. package/build/dist/Server/Services/UserService.js +165 -0
  377. package/build/dist/Server/Services/UserService.js.map +1 -1
  378. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  379. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  380. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  381. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  382. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  383. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  384. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  385. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  386. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  387. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  388. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  389. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  390. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  391. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  392. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  393. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  395. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  397. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  399. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  401. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  403. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  404. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  405. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  406. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  407. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  408. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  409. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  410. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  411. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  412. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
  413. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
  414. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  415. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  416. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
  417. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  418. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
  419. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  420. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
  421. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
  422. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  423. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  424. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  425. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  427. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  430. package/build/dist/Server/Utils/PasswordHash.js +258 -0
  431. package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
  432. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  433. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  434. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  435. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  436. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  437. package/build/dist/Types/Database/ColumnLength.js +9 -1
  438. package/build/dist/Types/Database/ColumnLength.js.map +1 -1
  439. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  440. package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
  441. package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
  442. package/build/dist/Types/HashedString.js +96 -5
  443. package/build/dist/Types/HashedString.js.map +1 -1
  444. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  445. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  446. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  447. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  448. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  449. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  450. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  451. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  452. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  453. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  455. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  456. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  457. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  458. package/build/dist/Types/Permission.js +23 -155
  459. package/build/dist/Types/Permission.js.map +1 -1
  460. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  461. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  462. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
  463. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  464. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  465. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  466. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  467. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  468. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  469. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  470. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  472. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  473. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  474. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  475. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  476. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  477. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  478. package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
  479. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  480. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
  481. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  482. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  483. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  484. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  485. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  486. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  487. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  488. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
  489. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
  490. package/build/dist/UI/Utils/Project.js +3 -0
  491. package/build/dist/UI/Utils/Project.js.map +1 -1
  492. package/build/dist/UI/Utils/StatusPage.js +4 -4
  493. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  494. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  495. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  496. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  497. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  498. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  499. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  500. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  501. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  502. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  503. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  504. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  505. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  506. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  507. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  508. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  509. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  510. package/build/dist/Utils/TeamMembersByProject.js +145 -0
  511. package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
  512. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  513. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  514. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  515. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  516. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ /*
2
+ * The durable code-fix recommendation for an incident/alert investigation.
3
+ * Stored on AIRun so the dashboard and the manual fix-task endpoint consume
4
+ * the same server-authored decision instead of interpreting analysis prose.
5
+ *
6
+ * Every run starts NotRecommended. The investigation engine atomically moves
7
+ * a winning incident/alert run to Pending with its Completed transition, then
8
+ * settles the posted analysis to a terminal recommendation. This keeps all
9
+ * error, legacy and non-investigation paths fail closed.
10
+ */
11
+ enum AIRunCodeFixRecommendation {
12
+ Pending = "Pending",
13
+ Recommended = "Recommended",
14
+ NotRecommended = "NotRecommended",
15
+ }
16
+
17
+ export default AIRunCodeFixRecommendation;
@@ -1,7 +1,8 @@
1
1
  /*
2
- * The JSON persisted on AIRun.taskContext for CodeFix recipes whose entire
3
- * working context is captured at trigger time rather than referenced by a
4
- * subject id (incident/alert) or a telemetry exception.
2
+ * The JSON persisted on AIRun.taskContext for tasks whose exact working
3
+ * context must survive until a worker claims them. Some recipes have no
4
+ * durable subject record; others, such as FixFromIncident, deliberately pin
5
+ * a snapshot instead of re-reading mutable subject state at execution time.
5
6
  *
6
7
  * First user: the FixPerformance recipe. Its evidence is computed
7
8
  * DETERMINISTICALLY from a trace's span tree when the user clicks "Fix
@@ -74,7 +75,29 @@ export interface PerformanceCodeLocation {
74
75
  lineNumber?: number | undefined;
75
76
  }
76
77
 
78
+ /*
79
+ * The immutable investigation snapshot consumed by FixFromIncident. Both
80
+ * fields travel together: the run id proves which Recommended decision was
81
+ * gated, and the markdown is the exact posted analysis that decision covered.
82
+ */
83
+ export interface InvestigationCodeFixTaskSnapshot {
84
+ investigationRunId: string;
85
+ investigationAnalysisMarkdown: string;
86
+ }
87
+
77
88
  export interface CodeFixTaskContext {
89
+ /*
90
+ * FixFromIncident: the exact investigation whose published RootCause is
91
+ * the task's context. This prevents a later re-investigation from changing
92
+ * the report between the user's click and the worker claiming the task.
93
+ */
94
+ sourceInvestigationRunId?: string | undefined;
95
+ /*
96
+ * Snapshot of that run's published analysis. Fix tasks can wait in the
97
+ * queue, so reading the feed again when the worker claims the task would
98
+ * let a later re-investigation silently change the requested fix.
99
+ */
100
+ sourceInvestigationAnalysisMarkdown?: string | undefined;
78
101
  // FixPerformance: the analyzed trace.
79
102
  traceId?: string | undefined;
80
103
  // Best-effort service attribution resolved from the trace's spans.
@@ -91,4 +114,41 @@ export interface CodeFixTaskContext {
91
114
  telemetryServiceId?: string | undefined;
92
115
  }
93
116
 
117
+ /*
118
+ * Canonical JSON shape persisted for a Recommended investigation. Unlike the
119
+ * normalized snapshot returned below, these names are the established
120
+ * AIRun.taskContext wire contract.
121
+ */
122
+ export type InvestigationCodeFixTaskContext = CodeFixTaskContext & {
123
+ sourceInvestigationRunId: string;
124
+ sourceInvestigationAnalysisMarkdown: string;
125
+ };
126
+
127
+ /*
128
+ * Treat partial, empty and malformed JSON as no snapshot. The same validator
129
+ * is shared by the trigger, claim guard and task-details reader so none of
130
+ * those boundaries can silently fall back to a different investigation.
131
+ */
132
+ export function getInvestigationCodeFixTaskSnapshot(
133
+ taskContext: CodeFixTaskContext | null | undefined,
134
+ ): InvestigationCodeFixTaskSnapshot | null {
135
+ const investigationRunId: unknown = taskContext?.sourceInvestigationRunId;
136
+ const investigationAnalysisMarkdown: unknown =
137
+ taskContext?.sourceInvestigationAnalysisMarkdown;
138
+
139
+ if (
140
+ typeof investigationRunId !== "string" ||
141
+ investigationRunId.trim().length === 0 ||
142
+ typeof investigationAnalysisMarkdown !== "string" ||
143
+ investigationAnalysisMarkdown.trim().length === 0
144
+ ) {
145
+ return null;
146
+ }
147
+
148
+ return {
149
+ investigationRunId,
150
+ investigationAnalysisMarkdown,
151
+ };
152
+ }
153
+
94
154
  export default CodeFixTaskContext;
@@ -26,9 +26,9 @@ enum CodeFixTaskType {
26
26
  * Add the observability an INCONCLUSIVE AI investigation was missing
27
27
  * (structured logs, spans, metric counters on the implicated code paths).
28
28
  * NOT user-triggerable from the exception page — it has its own automatic
29
- * trigger: an inconclusive investigation on a project that opted in via
30
- * Project.enableInstrumentationFixTasks (see Common/Server/Utils/AI/
31
- * AI/InstrumentationTaskTrigger.ts). Its subject is the triggering
29
+ * trigger: an inconclusive investigation on a project that opted in through
30
+ * the incident/alert instrumentation fix setting (see Common/Server/Utils/
31
+ * AI/SRE/InstrumentationTaskTrigger.ts). Its subject is the triggering
32
32
  * incident/alert, NOT a telemetry exception.
33
33
  */
34
34
  ImproveInstrumentation = "ImproveInstrumentation",
@@ -12,7 +12,15 @@ enum ColumnLength {
12
12
  Password = 500,
13
13
  ShortURL = 100,
14
14
  ShortText = 100,
15
- HashedString = 64,
15
+ /*
16
+ * Wide enough for a self-describing password hash, not just a bare digest.
17
+ * User passwords are stored as `scrypt$N=...,r=...,p=...$<64 hex>` (~90
18
+ * characters) so the cost parameters travel with the hash and can be
19
+ * raised later without a migration. The columns that still store a plain
20
+ * SHA-256 digest — session refresh tokens, master passwords — simply do
21
+ * not use the extra room.
22
+ */
23
+ HashedString = 255,
16
24
  Phone = 30,
17
25
  OTP = 8,
18
26
  }
@@ -16,6 +16,17 @@ export interface TableColumnMetadata {
16
16
  unique?: boolean;
17
17
  computed?: boolean;
18
18
  hashed?: boolean;
19
+ /*
20
+ * Name of the sibling column that holds this column's per-record salt.
21
+ *
22
+ * When set, the write path generates a fresh random salt on every write of
23
+ * this column, stores it in the named column, and mixes it into the hash.
24
+ * Two records with the same plaintext then hash to different values, so one
25
+ * precomputed table (or one cracked value) buys an attacker nothing
26
+ * anywhere else. The salt column must be nullable — rows written before the
27
+ * salt existed have none and verify against the legacy unsalted scheme.
28
+ */
29
+ hashSaltColumn?: string;
19
30
  encrypted?: boolean;
20
31
  manyToOneRelationColumn?: string;
21
32
  type: TableColumnType;
@@ -0,0 +1,48 @@
1
+ import { IndexOptions } from "typeorm";
2
+
3
+ /*
4
+ * Options for an index whose definition TypeORM cannot express, and which must
5
+ * therefore be owned by a migration rather than by the schema builder.
6
+ *
7
+ * WHY THIS EXISTS
8
+ *
9
+ * TypeORM's schema builder matches database indexes to entity metadata BY NAME
10
+ * (RdbmsSchemaBuilder.dropOldIndices: `metadata.indices.find((i) => i.name ===
11
+ * tableIndex.name)`) and DROPS every index it cannot find a match for. An index
12
+ * created only in a migration is invisible to entity metadata, so the next
13
+ * `npm run generate-postgres-migration` emits a DROP for it — silently, mixed
14
+ * in with whatever change was actually being made.
15
+ *
16
+ * That is not hypothetical. An audit of every hand-named index ever created by
17
+ * a migration against a fully-migrated database found ten that had been deleted
18
+ * this way and never restored, including the unique guards on six `slug`
19
+ * columns and the LOWER(name) index serving the telemetry ingest hot path.
20
+ * Migration 1775735059360 is a representative example: two unrelated column
21
+ * default changes, plus a DROP of an expression index, plus a down() that
22
+ * "restores" it without the expression.
23
+ *
24
+ * HOW THIS FIXES IT
25
+ *
26
+ * Declaring the index on the entity BY NAME with these options makes the schema
27
+ * builder skip it in both directions: `dropOldIndices` returns early on
28
+ * `synchronize === false`, and `createNewIndices` only considers indexes with
29
+ * `synchronize === true`. The migration stays the single source of truth for
30
+ * the real definition, and the declaration exists purely so TypeORM leaves it
31
+ * alone.
32
+ *
33
+ * The columns passed alongside these options are documentation — the schema
34
+ * builder never reads them for an unsynchronized index. Where the real
35
+ * definition is partial or an expression, say so in a comment at the call site.
36
+ *
37
+ * THE CAST
38
+ *
39
+ * `synchronize` is a real, supported option: the @Index decorator forwards it
40
+ * into IndexMetadataArgs (typeorm/decorator/Index.js), IndexMetadataArgs
41
+ * declares it, and RdbmsSchemaBuilder reads it. Only the public IndexOptions
42
+ * type omits it — a gap in TypeORM's own typings rather than a misuse.
43
+ */
44
+ const UNSYNCHRONIZED_INDEX: IndexOptions = {
45
+ synchronize: false,
46
+ } as IndexOptions;
47
+
48
+ export default UNSYNCHRONIZED_INDEX;
@@ -7,6 +7,30 @@ import ObjectID from "./ObjectID";
7
7
  import CryptoJS from "crypto-js";
8
8
  import { FindOperator } from "typeorm";
9
9
 
10
+ /*
11
+ * SHA-256 hashing for values that are ALREADY high-entropy: session refresh
12
+ * tokens, email verification tokens, reset tokens, permission fingerprints.
13
+ * Those are random values the server minted, so there is nothing to guess and
14
+ * a fast hash is the right tool — it also keeps them searchable by hash,
15
+ * which is how they are looked up.
16
+ *
17
+ * User passwords are NOT hashed here any more. A password is low-entropy and
18
+ * guessable, so it goes through scrypt in Common/Server/Utils/PasswordHash,
19
+ * which is deliberately slow and memory-hard. What remains in this class is
20
+ * the two SHA-256 schemes passwords used to be stored under, kept so those
21
+ * rows still verify (and are then upgraded) at their owner's next login:
22
+ *
23
+ * no salt `SHA256(secret + value)`, from before per-user salts existed.
24
+ * salted `SHA256("v2:" + salt + ":" + secret + ":" + value)`.
25
+ *
26
+ * Neither records its scheme in the digest — it is a bare hex SHA-256 either
27
+ * way — so callers normally select the scheme by whether the row carries a
28
+ * salt. PasswordHash also has a bare-hash fallback for rolling deployments,
29
+ * where an old pod can write the original scheme while leaving a newer salt
30
+ * behind. The "v2" prefix and separators exist for domain separation.
31
+ */
32
+ const SALTED_HASH_SCHEME_VERSION: string = "v2";
33
+
10
34
  export default class HashedString extends DatabaseProperty {
11
35
  private isHashed: boolean = false;
12
36
 
@@ -65,7 +89,62 @@ export default class HashedString extends DatabaseProperty {
65
89
  return this.isHashed;
66
90
  }
67
91
 
68
- public async hashValue(encryptionSecret: ObjectID | null): Promise<string> {
92
+ /**
93
+ * Adopt an already-computed digest.
94
+ *
95
+ * For hashes this class does not compute itself — user passwords go
96
+ * through scrypt in Common/Server/Utils/PasswordHash, which is server-only
97
+ * because this type is also bundled into the browser. The guard is the
98
+ * same one hashValue() carries: a value is hashed once and never re-hashed
99
+ * over the top of itself.
100
+ */
101
+ public setHashedValue(hashedValue: string): void {
102
+ if (this.isHashed) {
103
+ throw new BadOperationException("Value is already hashed");
104
+ }
105
+
106
+ this.isHashed = true;
107
+ this.value = hashedValue;
108
+ }
109
+
110
+ /**
111
+ * The exact byte string fed to SHA-256.
112
+ *
113
+ * The unsalted branch MUST stay byte-for-byte identical forever: every
114
+ * password hashed before per-user salts existed is verified through it.
115
+ */
116
+ private static buildValueToHash(
117
+ value: string,
118
+ encryptionSecret: ObjectID | null,
119
+ salt: string | null,
120
+ ): string {
121
+ if (!salt) {
122
+ return (encryptionSecret || "") + value;
123
+ }
124
+
125
+ return `${SALTED_HASH_SCHEME_VERSION}:${salt}:${
126
+ encryptionSecret || ""
127
+ }:${value}`;
128
+ }
129
+
130
+ public static computeHash(
131
+ value: string,
132
+ encryptionSecret: ObjectID | null,
133
+ salt?: string | null,
134
+ ): string {
135
+ if (!value) {
136
+ return "";
137
+ }
138
+
139
+ return CryptoJS.SHA256(
140
+ HashedString.buildValueToHash(value, encryptionSecret, salt || null),
141
+ ).toString();
142
+ }
143
+
144
+ public async hashValue(
145
+ encryptionSecret: ObjectID | null,
146
+ salt?: string | null,
147
+ ): Promise<string> {
69
148
  if (!this.value) {
70
149
  return "";
71
150
  }
@@ -74,19 +153,76 @@ export default class HashedString extends DatabaseProperty {
74
153
  throw new BadOperationException("Value is already hashed");
75
154
  }
76
155
 
77
- const valueToHash: string = (encryptionSecret || "") + this.value;
78
156
  this.isHashed = true;
79
157
 
80
- this.value = CryptoJS.SHA256(valueToHash).toString();
158
+ this.value = HashedString.computeHash(
159
+ this.value,
160
+ encryptionSecret,
161
+ salt || null,
162
+ );
81
163
  return this.value;
82
164
  }
83
165
 
84
166
  public static async hashValue(
85
167
  value: string,
86
168
  encryptionSecret: ObjectID | null,
169
+ salt?: string | null,
87
170
  ): Promise<string> {
88
171
  const hashstring: HashedString = new HashedString(value, false);
89
- return await hashstring.hashValue(encryptionSecret);
172
+ return await hashstring.hashValue(encryptionSecret, salt || null);
173
+ }
174
+
175
+ /**
176
+ * Compare two already-hashed values without leaking, through timing, how
177
+ * many leading characters matched. Comparing digests with `===` lets an
178
+ * attacker who can measure response time recover a stored hash one
179
+ * character at a time; recovering the hash is what makes offline cracking
180
+ * possible in the first place.
181
+ *
182
+ * Lengths are compared up front. Digests here are always the same length,
183
+ * so an early exit only happens on malformed input, where the length is
184
+ * not the secret.
185
+ */
186
+ public static isEqual(a: string, b: string): boolean {
187
+ if (a.length !== b.length) {
188
+ return false;
189
+ }
190
+
191
+ let difference: number = 0;
192
+
193
+ for (let i: number = 0; i < a.length; i++) {
194
+ difference |= a.charCodeAt(i) ^ b.charCodeAt(i);
195
+ }
196
+
197
+ return difference === 0;
198
+ }
199
+
200
+ /**
201
+ * Verify a plaintext value against a stored hash.
202
+ *
203
+ * Pass the salt stored alongside the hash. Pass null/undefined for records
204
+ * written before per-user salts existed — those verify against the legacy
205
+ * unsalted scheme, and the caller should re-hash them with a fresh salt
206
+ * once the value is known to be correct.
207
+ */
208
+ public static async verifyValue(data: {
209
+ plainValue: string;
210
+ hashedValue: string;
211
+ encryptionSecret: ObjectID | null;
212
+ salt?: string | null | undefined;
213
+ }): Promise<boolean> {
214
+ if (!data.plainValue || !data.hashedValue) {
215
+ return false;
216
+ }
217
+
218
+ return HashedString.isEqual(
219
+ HashedString.computeHash(
220
+ data.plainValue,
221
+ data.encryptionSecret,
222
+ data.salt || null,
223
+ ),
224
+ data.hashedValue,
225
+ );
90
226
  }
91
227
 
92
228
  protected static override fromDatabase(_value: string): HashedString | null {
@@ -5,6 +5,8 @@ export enum CheckOn {
5
5
  ResponseTime = "Response Time (in ms)",
6
6
  PacketLossPercent = "Packet Loss (in %)",
7
7
  Jitter = "Jitter (in ms)",
8
+ PortDnsLookupTime = "Port DNS Lookup Time (in ms)",
9
+ PortTcpConnectTime = "Port TCP Connect Time (in ms)",
8
10
  ResponseStatusCode = "Response Status Code",
9
11
  ResponseHeader = "Response Header",
10
12
  ResponseHeaderValue = "Response Header Value",
@@ -399,6 +401,8 @@ export class CriteriaFilterUtil {
399
401
  checkOn === CheckOn.ResponseTime ||
400
402
  checkOn === CheckOn.PacketLossPercent ||
401
403
  checkOn === CheckOn.Jitter ||
404
+ checkOn === CheckOn.PortDnsLookupTime ||
405
+ checkOn === CheckOn.PortTcpConnectTime ||
402
406
  checkOn === CheckOn.DiskUsagePercent ||
403
407
  checkOn === CheckOn.CPUUsagePercent ||
404
408
  checkOn === CheckOn.MemoryUsagePercent ||
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Which protocol the probe uses to read a domain's registration record.
3
+ *
4
+ * WHOIS is the legacy protocol and its server list is not authoritative:
5
+ * clients ship a static map of TLD -> WHOIS host, and registries move. Every
6
+ * Identity Digital TLD (.digital, .email, .life, .today, .zone, ~290 more)
7
+ * still points at the retired whois.donuts.co in most of those maps, and that
8
+ * host now answers every query with the literal text "TLD is not supported."
9
+ * instead of a record. RDAP (RFC 9083) is the ICANN-mandated replacement and
10
+ * is discovered from the IANA bootstrap registry (RFC 9224), so it stays
11
+ * correct as registries move.
12
+ *
13
+ * Plenty of ccTLDs (.io, .co, .de, .ch, .jp, ...) publish no RDAP service at
14
+ * all, which is why Auto - RDAP when the TLD has one, WHOIS otherwise - is
15
+ * the default rather than RDAP.
16
+ */
17
+ enum DomainLookupMethod {
18
+ Auto = "Auto",
19
+ RDAP = "RDAP",
20
+ WHOIS = "WHOIS",
21
+ }
22
+
23
+ export default DomainLookupMethod;
@@ -1,4 +1,5 @@
1
1
  import ProbeAttempt from "../../Probe/ProbeAttempt";
2
+ import DomainLookupMethod from "./DomainLookupMethod";
2
3
 
3
4
  export default interface DomainMonitorResponse {
4
5
  isOnline: boolean;
@@ -16,4 +17,10 @@ export default interface DomainMonitorResponse {
16
17
  isTimeout?: boolean | undefined;
17
18
  probeAttempts?: Array<ProbeAttempt> | undefined;
18
19
  totalAttempts?: number | undefined;
20
+ /*
21
+ * Which protocol actually produced this record. With the Auto lookup
22
+ * method the answer varies by TLD, so it is worth surfacing rather than
23
+ * leaving the operator to guess.
24
+ */
25
+ lookupMethod?: DomainLookupMethod | undefined;
19
26
  }
@@ -505,6 +505,12 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
505
505
  monitorStatusId: arg.monitorStatusId,
506
506
  filterCondition: FilterCondition.All,
507
507
  filters: [
508
+ // The registration lookup itself has to have worked.
509
+ {
510
+ checkOn: CheckOn.IsOnline,
511
+ filterType: FilterType.True,
512
+ value: undefined,
513
+ },
508
514
  {
509
515
  checkOn: CheckOn.DomainIsExpired,
510
516
  filterType: FilterType.False,
@@ -517,7 +523,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
517
523
  changeMonitorStatus: true,
518
524
  createIncidents: false,
519
525
  name: `Check if ${arg.monitorName} is not expired`,
520
- description: `This criteria checks if the ${arg.monitorName} domain registration is not expired`,
526
+ description: `This criteria checks if the ${arg.monitorName} domain registration was read successfully and is not expired`,
521
527
  };
522
528
 
523
529
  return monitorCriteriaInstance;
@@ -774,11 +780,22 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
774
780
  filterType: FilterType.True,
775
781
  value: undefined,
776
782
  },
783
+ /*
784
+ * Without this, a lookup that returns no registration data at all
785
+ * leaves every Domain* filter unable to decide, and the monitor
786
+ * keeps whatever status it had - so a domain whose registration
787
+ * data cannot be read looks exactly like a healthy one.
788
+ */
789
+ {
790
+ checkOn: CheckOn.IsOnline,
791
+ filterType: FilterType.False,
792
+ value: undefined,
793
+ },
777
794
  ],
778
795
  incidents: [
779
796
  {
780
- title: `${arg.monitorName} domain is expired`,
781
- description: `${arg.monitorName} domain registration has expired.`,
797
+ title: `${arg.monitorName} domain check failed`,
798
+ description: `${arg.monitorName} domain registration has expired, or its registration data could not be retrieved.`,
782
799
  incidentSeverityId: arg.incidentSeverityId,
783
800
  autoResolveIncident: true,
784
801
  id: ObjectID.generate().toString(),
@@ -790,16 +807,16 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
790
807
  createAlerts: false,
791
808
  alerts: [
792
809
  {
793
- title: `${arg.monitorName} domain is expired`,
794
- description: `${arg.monitorName} domain registration has expired.`,
810
+ title: `${arg.monitorName} domain check failed`,
811
+ description: `${arg.monitorName} domain registration has expired, or its registration data could not be retrieved.`,
795
812
  alertSeverityId: arg.alertSeverityId,
796
813
  autoResolveAlert: true,
797
814
  id: ObjectID.generate().toString(),
798
815
  onCallPolicyIds: [],
799
816
  },
800
817
  ],
801
- name: `Check if ${arg.monitorName} domain is expired`,
802
- description: `This criteria checks if the ${arg.monitorName} domain registration has expired`,
818
+ name: `Check if ${arg.monitorName} domain check failed`,
819
+ description: `This criteria checks if the ${arg.monitorName} domain registration has expired or could not be read`,
803
820
  };
804
821
  }
805
822
 
@@ -24,6 +24,14 @@ enum MonitorMetricType {
24
24
  TimeToFirstByte = "oneuptime.monitor.http.time.to.first.byte",
25
25
  DownloadTime = "oneuptime.monitor.http.download.time",
26
26
 
27
+ /*
28
+ * Port-monitor connection phases. These intentionally use a Port-specific
29
+ * namespace instead of the HTTP phase metrics above: Port TCP timing can
30
+ * include automatic address-family fallback and has no HTTP request phase.
31
+ */
32
+ PortDnsLookupTime = "oneuptime.monitor.port.dns.lookup.time",
33
+ PortTcpConnectTime = "oneuptime.monitor.port.tcp.connect.time",
34
+
27
35
  /*
28
36
  * Per-interface SNMP metrics. Emitted when interface monitoring is enabled
29
37
  * on an SNMP monitor; one series per interface (interfaceName attribute).
@@ -1144,8 +1144,17 @@ export default class MonitorStep extends DatabaseProperty {
1144
1144
  dnsMonitor: json["dnsMonitor"]
1145
1145
  ? (json["dnsMonitor"] as JSONObject)
1146
1146
  : undefined,
1147
+ /*
1148
+ * Normalized rather than passed through raw: steps saved before the
1149
+ * lookupMethod option existed carry no such key, and the probe would
1150
+ * otherwise receive a config that does not satisfy its own type.
1151
+ */
1147
1152
  domainMonitor: json["domainMonitor"]
1148
- ? (json["domainMonitor"] as JSONObject)
1153
+ ? MonitorStepDomainMonitorUtil.toJSON(
1154
+ MonitorStepDomainMonitorUtil.fromJSON(
1155
+ json["domainMonitor"] as JSONObject,
1156
+ ),
1157
+ )
1149
1158
  : undefined,
1150
1159
  dnssecMonitor: json["dnssecMonitor"]
1151
1160
  ? (json["dnssecMonitor"] as JSONObject)
@@ -1,7 +1,9 @@
1
1
  import { JSONObject } from "../JSON";
2
+ import DomainLookupMethod from "./DomainMonitor/DomainLookupMethod";
2
3
 
3
4
  export default interface MonitorStepDomainMonitor {
4
5
  domainName: string;
6
+ lookupMethod: DomainLookupMethod;
5
7
  timeout: number;
6
8
  retries: number;
7
9
  }
@@ -10,6 +12,7 @@ export class MonitorStepDomainMonitorUtil {
10
12
  public static getDefault(): MonitorStepDomainMonitor {
11
13
  return {
12
14
  domainName: "",
15
+ lookupMethod: DomainLookupMethod.Auto,
13
16
  timeout: 10000,
14
17
  retries: 3,
15
18
  };
@@ -18,6 +21,13 @@ export class MonitorStepDomainMonitorUtil {
18
21
  public static fromJSON(json: JSONObject): MonitorStepDomainMonitor {
19
22
  return {
20
23
  domainName: (json["domainName"] as string) || "",
24
+ /*
25
+ * Monitors saved before RDAP support existed carry no lookupMethod at
26
+ * all, and Auto is the behaviour they should get.
27
+ */
28
+ lookupMethod: MonitorStepDomainMonitorUtil.parseLookupMethod(
29
+ json["lookupMethod"],
30
+ ),
21
31
  timeout: (json["timeout"] as number) || 10000,
22
32
  retries: (json["retries"] as number) || 3,
23
33
  };
@@ -26,8 +36,19 @@ export class MonitorStepDomainMonitorUtil {
26
36
  public static toJSON(monitor: MonitorStepDomainMonitor): JSONObject {
27
37
  return {
28
38
  domainName: monitor.domainName,
39
+ lookupMethod: monitor.lookupMethod,
29
40
  timeout: monitor.timeout,
30
41
  retries: monitor.retries,
31
42
  };
32
43
  }
44
+
45
+ public static parseLookupMethod(value: unknown): DomainLookupMethod {
46
+ const values: Array<string> = Object.values(DomainLookupMethod);
47
+
48
+ if (typeof value === "string" && values.includes(value)) {
49
+ return value as DomainLookupMethod;
50
+ }
51
+
52
+ return DomainLookupMethod.Auto;
53
+ }
33
54
  }
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Per-phase breakdown of a Port monitor connection, in milliseconds. DNS is
3
+ * absent when the destination is already an IP address. Fields are optional
4
+ * so partial timing evidence can be represented when a connection fails.
5
+ */
6
+ export default interface PortMonitorTimings {
7
+ dnsLookupInMs?: number | undefined;
8
+ tcpConnectInMs?: number | undefined;
9
+ totalConnectionInMs?: number | undefined;
10
+ }