@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
@@ -1592,9 +1592,9 @@ export default class Project extends TenantModel {
1592
1592
  required: true,
1593
1593
  isDefaultValueColumn: true,
1594
1594
  type: TableColumnType.Boolean,
1595
- title: "Enable Instrumentation Fix Tasks",
1595
+ title: "Enable Incident Instrumentation Fix Tasks",
1596
1596
  description:
1597
- "When enabled, an AI investigation that ends inconclusive (telemetry was insufficient to determine a root cause) automatically queues an AI agent task that opens a pull request adding the missing instrumentation to the implicated code paths. Requires a repository connected through the GitHub App. Pull requests are always human-reviewed — nothing merges automatically.",
1597
+ "When enabled, an incident AI investigation that ends inconclusive (telemetry was insufficient to determine a root cause) automatically queues an AI agent task that opens a pull request adding the missing instrumentation to the implicated code paths. Requires a repository connected through the GitHub App. Pull requests are always human-reviewed — nothing merges automatically.",
1598
1598
  defaultValue: false,
1599
1599
  example: true,
1600
1600
  })
@@ -1603,7 +1603,7 @@ export default class Project extends TenantModel {
1603
1603
  default: false,
1604
1604
  type: ColumnType.Boolean,
1605
1605
  })
1606
- public enableInstrumentationFixTasks?: boolean = undefined;
1606
+ public enableIncidentInstrumentationFixTasks?: boolean = undefined;
1607
1607
 
1608
1608
  @ColumnAccessControl({
1609
1609
  create: [],
@@ -1622,9 +1622,9 @@ export default class Project extends TenantModel {
1622
1622
  required: true,
1623
1623
  isDefaultValueColumn: true,
1624
1624
  type: TableColumnType.Boolean,
1625
- title: "Enable Automatic Code Fixes",
1625
+ title: "Enable Alert Instrumentation Fix Tasks",
1626
1626
  description:
1627
- "When enabled, an AI investigation that ends with a confident, evidenced root cause analysis automatically queues an AI agent task that opens a draft fix pull request from that analysis — the automatic form of the 'Open Fix PR from this analysis' button. Requires a repository connected through the GitHub App and a Runner with the code-fix capability. Pull requests are always human-reviewed — nothing merges automatically.",
1627
+ "When enabled, an alert AI investigation that ends inconclusive (telemetry was insufficient to determine a root cause) automatically queues an AI agent task that opens a pull request adding the missing instrumentation to the implicated code paths. Requires a repository connected through the GitHub App. Pull requests are always human-reviewed — nothing merges automatically.",
1628
1628
  defaultValue: false,
1629
1629
  example: true,
1630
1630
  })
@@ -1633,7 +1633,67 @@ export default class Project extends TenantModel {
1633
1633
  default: false,
1634
1634
  type: ColumnType.Boolean,
1635
1635
  })
1636
- public enableAutomaticCodeFixes?: boolean = undefined;
1636
+ public enableAlertInstrumentationFixTasks?: boolean = undefined;
1637
+
1638
+ @ColumnAccessControl({
1639
+ create: [],
1640
+ read: [
1641
+ Permission.ProjectOwner,
1642
+ Permission.ProjectAdmin,
1643
+ Permission.ProjectMember,
1644
+ Permission.Viewer,
1645
+ Permission.ReadProject,
1646
+ Permission.UnAuthorizedSsoUser,
1647
+ Permission.ProjectUser,
1648
+ ],
1649
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1650
+ })
1651
+ @TableColumn({
1652
+ required: true,
1653
+ isDefaultValueColumn: true,
1654
+ type: TableColumnType.Boolean,
1655
+ title: "Enable Automatic Incident Code Fixes",
1656
+ description:
1657
+ "When enabled, an incident AI investigation that ends with a confident, evidenced root cause analysis and recommends a repository code change automatically queues an AI agent task that opens a draft fix pull request from that analysis — the automatic form of the 'Open Fix PR from this analysis' button. Operational, infrastructure, external, user-error and inconclusive findings do not offer or open code-fix pull requests. Requires a repository connected through the GitHub App and a Runner with the code-fix capability. Pull requests are always human-reviewed — nothing merges automatically.",
1658
+ defaultValue: false,
1659
+ example: true,
1660
+ })
1661
+ @Column({
1662
+ nullable: false,
1663
+ default: false,
1664
+ type: ColumnType.Boolean,
1665
+ })
1666
+ public enableAutomaticIncidentCodeFixes?: boolean = undefined;
1667
+
1668
+ @ColumnAccessControl({
1669
+ create: [],
1670
+ read: [
1671
+ Permission.ProjectOwner,
1672
+ Permission.ProjectAdmin,
1673
+ Permission.ProjectMember,
1674
+ Permission.Viewer,
1675
+ Permission.ReadProject,
1676
+ Permission.UnAuthorizedSsoUser,
1677
+ Permission.ProjectUser,
1678
+ ],
1679
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1680
+ })
1681
+ @TableColumn({
1682
+ required: true,
1683
+ isDefaultValueColumn: true,
1684
+ type: TableColumnType.Boolean,
1685
+ title: "Enable Automatic Alert Code Fixes",
1686
+ description:
1687
+ "When enabled, an alert AI investigation that ends with a confident, evidenced root cause analysis and recommends a repository code change automatically queues an AI agent task that opens a draft fix pull request from that analysis — the automatic form of the 'Open Fix PR from this analysis' button. Operational, infrastructure, external, user-error and inconclusive findings do not offer or open code-fix pull requests. Requires a repository connected through the GitHub App and a Runner with the code-fix capability. Pull requests are always human-reviewed — nothing merges automatically.",
1688
+ defaultValue: false,
1689
+ example: true,
1690
+ })
1691
+ @Column({
1692
+ nullable: false,
1693
+ default: false,
1694
+ type: ColumnType.Boolean,
1695
+ })
1696
+ public enableAutomaticAlertCodeFixes?: boolean = undefined;
1637
1697
 
1638
1698
  @ColumnAccessControl({
1639
1699
  create: [],
@@ -1806,7 +1866,7 @@ export default class Project extends TenantModel {
1806
1866
  type: TableColumnType.Number,
1807
1867
  title: "Daily Autonomous AI Token Limit",
1808
1868
  description:
1809
- "Maximum tokens per UTC day that autonomous AI investigations may consume for this project. When the limit is reached, new autonomous investigations are skipped until the next day — interactive AI chat is never blocked. Unset means no limit.",
1869
+ "Fallback maximum tokens per UTC day for autonomous AI work that is not associated with an incident or alert. When the limit is reached, new autonomous work is skipped until the next day — interactive AI chat is never blocked. Unset means no limit.",
1810
1870
  example: 500000,
1811
1871
  })
1812
1872
  @Column({
@@ -1815,6 +1875,60 @@ export default class Project extends TenantModel {
1815
1875
  })
1816
1876
  public aiDailyAutonomousTokenLimit?: number = undefined;
1817
1877
 
1878
+ @ColumnAccessControl({
1879
+ create: [],
1880
+ read: [
1881
+ Permission.ProjectOwner,
1882
+ Permission.ProjectAdmin,
1883
+ Permission.ProjectMember,
1884
+ Permission.Viewer,
1885
+ Permission.ReadProject,
1886
+ Permission.UnAuthorizedSsoUser,
1887
+ Permission.ProjectUser,
1888
+ ],
1889
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1890
+ })
1891
+ @TableColumn({
1892
+ required: false,
1893
+ type: TableColumnType.Number,
1894
+ title: "Daily Incident AI Token Limit",
1895
+ description:
1896
+ "Maximum tokens per UTC day that autonomous incident-linked AI work may consume for this project, including investigations, remediation, and follow-up fix tasks. When the limit is reached, new incident-linked AI work is skipped until the next day — interactive AI chat is never blocked. Unset means no limit.",
1897
+ example: 500000,
1898
+ })
1899
+ @Column({
1900
+ nullable: true,
1901
+ type: ColumnType.Number,
1902
+ })
1903
+ public incidentAiDailyAutonomousTokenLimit?: number = undefined;
1904
+
1905
+ @ColumnAccessControl({
1906
+ create: [],
1907
+ read: [
1908
+ Permission.ProjectOwner,
1909
+ Permission.ProjectAdmin,
1910
+ Permission.ProjectMember,
1911
+ Permission.Viewer,
1912
+ Permission.ReadProject,
1913
+ Permission.UnAuthorizedSsoUser,
1914
+ Permission.ProjectUser,
1915
+ ],
1916
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1917
+ })
1918
+ @TableColumn({
1919
+ required: false,
1920
+ type: TableColumnType.Number,
1921
+ title: "Daily Alert AI Token Limit",
1922
+ description:
1923
+ "Maximum tokens per UTC day that autonomous alert-linked AI work may consume for this project, including investigations, remediation, and follow-up fix tasks. When the limit is reached, new alert-linked AI work is skipped until the next day — interactive AI chat is never blocked. Unset means no limit.",
1924
+ example: 500000,
1925
+ })
1926
+ @Column({
1927
+ nullable: true,
1928
+ type: ColumnType.Number,
1929
+ })
1930
+ public alertAiDailyAutonomousTokenLimit?: number = undefined;
1931
+
1818
1932
  @ColumnAccessControl({
1819
1933
  create: [],
1820
1934
  read: [
@@ -1833,7 +1947,7 @@ export default class Project extends TenantModel {
1833
1947
  type: TableColumnType.Number,
1834
1948
  title: "Daily AI Fix Task Limit",
1835
1949
  description:
1836
- "Maximum AI fix tasks (agent runs that open pull requests) that may be created per UTC day for this project, across every fix recipe and trigger. Unset means the default of 25 per day; 0 pauses AI fix tasks entirely.",
1950
+ "Fallback maximum AI fix tasks (agent runs that open pull requests) that may be created per UTC day for work not associated with an incident or alert, across every fix recipe and trigger. Unset means the default of 25 per day; 0 pauses these AI fix tasks entirely.",
1837
1951
  example: 25,
1838
1952
  })
1839
1953
  @Column({
@@ -1842,6 +1956,60 @@ export default class Project extends TenantModel {
1842
1956
  })
1843
1957
  public aiDailyFixTaskLimit?: number = undefined;
1844
1958
 
1959
+ @ColumnAccessControl({
1960
+ create: [],
1961
+ read: [
1962
+ Permission.ProjectOwner,
1963
+ Permission.ProjectAdmin,
1964
+ Permission.ProjectMember,
1965
+ Permission.Viewer,
1966
+ Permission.ReadProject,
1967
+ Permission.UnAuthorizedSsoUser,
1968
+ Permission.ProjectUser,
1969
+ ],
1970
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1971
+ })
1972
+ @TableColumn({
1973
+ required: false,
1974
+ type: TableColumnType.Number,
1975
+ title: "Daily Incident AI Fix Task Limit",
1976
+ description:
1977
+ "Maximum AI fix tasks derived from incidents that may be created per UTC day for this project. Unset means the default of 25 per day; 0 pauses incident AI fix tasks entirely.",
1978
+ example: 25,
1979
+ })
1980
+ @Column({
1981
+ nullable: true,
1982
+ type: ColumnType.Number,
1983
+ })
1984
+ public incidentAiDailyFixTaskLimit?: number = undefined;
1985
+
1986
+ @ColumnAccessControl({
1987
+ create: [],
1988
+ read: [
1989
+ Permission.ProjectOwner,
1990
+ Permission.ProjectAdmin,
1991
+ Permission.ProjectMember,
1992
+ Permission.Viewer,
1993
+ Permission.ReadProject,
1994
+ Permission.UnAuthorizedSsoUser,
1995
+ Permission.ProjectUser,
1996
+ ],
1997
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
1998
+ })
1999
+ @TableColumn({
2000
+ required: false,
2001
+ type: TableColumnType.Number,
2002
+ title: "Daily Alert AI Fix Task Limit",
2003
+ description:
2004
+ "Maximum AI fix tasks derived from alerts that may be created per UTC day for this project. Unset means the default of 25 per day; 0 pauses alert AI fix tasks entirely.",
2005
+ example: 25,
2006
+ })
2007
+ @Column({
2008
+ nullable: true,
2009
+ type: ColumnType.Number,
2010
+ })
2011
+ public alertAiDailyFixTaskLimit?: number = undefined;
2012
+
1845
2013
  @ColumnAccessControl({
1846
2014
  create: [],
1847
2015
  read: [
@@ -1976,7 +2144,7 @@ export default class Project extends TenantModel {
1976
2144
  type: TableColumnType.Number,
1977
2145
  title: "Max Concurrent Investigations",
1978
2146
  description:
1979
- "How many AI investigations may run at the same time for this project, shared across incidents and alerts. Unset means the default of 3. Minimum 1 — pause investigations with the opt-in toggles or a daily token limit of 0 instead.",
2147
+ "Fallback maximum number of non-incident and non-alert AI investigations that may run at the same time for this project. Unset means the default of 3. Minimum 1 — pause autonomous work with its opt-in toggle or a daily token limit of 0 instead.",
1980
2148
  example: 3,
1981
2149
  })
1982
2150
  @Column({
@@ -1985,6 +2153,60 @@ export default class Project extends TenantModel {
1985
2153
  })
1986
2154
  public aiMaxConcurrentInvestigations?: number = undefined;
1987
2155
 
2156
+ @ColumnAccessControl({
2157
+ create: [],
2158
+ read: [
2159
+ Permission.ProjectOwner,
2160
+ Permission.ProjectAdmin,
2161
+ Permission.ProjectMember,
2162
+ Permission.Viewer,
2163
+ Permission.ReadProject,
2164
+ Permission.UnAuthorizedSsoUser,
2165
+ Permission.ProjectUser,
2166
+ ],
2167
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
2168
+ })
2169
+ @TableColumn({
2170
+ required: false,
2171
+ type: TableColumnType.Number,
2172
+ title: "Max Concurrent Incident Investigations",
2173
+ description:
2174
+ "How many incident AI investigations may run at the same time for this project. Unset means the default of 3. Minimum 1 — pause incident investigations with the opt-in toggle or a daily token limit of 0 instead.",
2175
+ example: 3,
2176
+ })
2177
+ @Column({
2178
+ nullable: true,
2179
+ type: ColumnType.Number,
2180
+ })
2181
+ public incidentAiMaxConcurrentInvestigations?: number = undefined;
2182
+
2183
+ @ColumnAccessControl({
2184
+ create: [],
2185
+ read: [
2186
+ Permission.ProjectOwner,
2187
+ Permission.ProjectAdmin,
2188
+ Permission.ProjectMember,
2189
+ Permission.Viewer,
2190
+ Permission.ReadProject,
2191
+ Permission.UnAuthorizedSsoUser,
2192
+ Permission.ProjectUser,
2193
+ ],
2194
+ update: [Permission.ProjectOwner, Permission.ProjectAdmin],
2195
+ })
2196
+ @TableColumn({
2197
+ required: false,
2198
+ type: TableColumnType.Number,
2199
+ title: "Max Concurrent Alert Investigations",
2200
+ description:
2201
+ "How many alert AI investigations may run at the same time for this project. Unset means the default of 3. Minimum 1 — pause alert investigations with the opt-in toggle or a daily token limit of 0 instead.",
2202
+ example: 3,
2203
+ })
2204
+ @Column({
2205
+ nullable: true,
2206
+ type: ColumnType.Number,
2207
+ })
2208
+ public alertAiMaxConcurrentInvestigations?: number = undefined;
2209
+
1988
2210
  @ColumnAccessControl({
1989
2211
  create: [],
1990
2212
  read: [
@@ -2583,7 +2805,21 @@ export default class Project extends TenantModel {
2583
2805
  })
2584
2806
  public doNotAddGlobalProbesByDefaultOnNewMonitors?: boolean = undefined;
2585
2807
 
2586
- // GitHub App Installation ID for this project
2808
+ /*
2809
+ * GitHub App Installation ID for this project.
2810
+ *
2811
+ * This column IS the authority on which GitHub App installation a project
2812
+ * owns — every path that mints a repository token re-derives the binding
2813
+ * from it (see GitHubInstallationBinding). That makes it security state, not
2814
+ * project configuration, so `update` is empty: a Project Owner who could PUT
2815
+ * an arbitrary installation ID here would simply be writing their own
2816
+ * permission slip to another tenant's repositories.
2817
+ *
2818
+ * It is written server-side only, with `isRoot`, by the GitHub App install
2819
+ * callback — and only after the OAuth user-to-server round trip has proved
2820
+ * to GitHub's satisfaction that the installer controls that installation —
2821
+ * and cleared again by the `installation.deleted` webhook.
2822
+ */
2587
2823
  @ColumnAccessControl({
2588
2824
  create: [],
2589
2825
  read: [
@@ -2593,7 +2829,7 @@ export default class Project extends TenantModel {
2593
2829
  Permission.Viewer,
2594
2830
  Permission.ReadProject,
2595
2831
  ],
2596
- update: [Permission.ProjectOwner, Permission.ProjectAdmin],
2832
+ update: [],
2597
2833
  })
2598
2834
  @TableColumn({
2599
2835
  required: false,
@@ -81,6 +81,20 @@ import {
81
81
  */
82
82
  @Index(["projectId", "name"], { unique: true })
83
83
  @Index(["projectId", "isArchived"])
84
+ /*
85
+ * Restores a UNIQUE index that an autogenerated migration deleted.
86
+ *
87
+ * Declared natively and NAMED. TypeORM's schema builder matches database
88
+ * indexes to entity metadata by name and drops every one it cannot find, which
89
+ * is how the original was lost: it existed only in a migration, so entity
90
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
91
+ * it here keeps the original index name and lets the builder match, compare
92
+ * uniqueness and columns, and keep it.
93
+ */
94
+ @Index("IDX_proxmox_cluster_slug", ["slug"], {
95
+ unique: true,
96
+ where: '"deletedAt" IS NULL',
97
+ })
84
98
  @TableMetadata({
85
99
  tableName: "ProxmoxCluster",
86
100
  singularName: "Proxmox Cluster",
@@ -1426,6 +1426,7 @@ export default class ScheduledMaintenance extends BaseModel {
1426
1426
  ],
1427
1427
  })
1428
1428
  @TableColumn({
1429
+ computed: true,
1429
1430
  type: TableColumnType.VeryLongText,
1430
1431
  title: "Notification Status Message On Event Scheduled",
1431
1432
  description:
@@ -544,6 +544,7 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
544
544
  ],
545
545
  })
546
546
  @TableColumn({
547
+ computed: true,
547
548
  type: TableColumnType.VeryLongText,
548
549
  title: "Notification Status Message",
549
550
  description:
@@ -541,6 +541,7 @@ export default class ScheduledMaintenanceStateTimeline extends BaseModel {
541
541
  ],
542
542
  })
543
543
  @TableColumn({
544
+ computed: true,
544
545
  type: TableColumnType.VeryLongText,
545
546
  title: "Notification Status Message",
546
547
  description:
@@ -239,7 +239,7 @@ export default class ScheduledMaintenanceTemplateOwnerUser extends BaseModel {
239
239
  Permission.ProjectMember,
240
240
  Permission.ScheduledMaintenanceAdmin,
241
241
  Permission.ScheduledMaintenanceMember,
242
- Permission.CreateScheduledMaintenanceTemplateOwnerTeam,
242
+ Permission.CreateScheduledMaintenanceTemplateOwnerUser,
243
243
  ],
244
244
  read: [
245
245
  Permission.ProjectOwner,
@@ -249,7 +249,7 @@ export default class ScheduledMaintenanceTemplateOwnerUser extends BaseModel {
249
249
  Permission.ScheduledMaintenanceAdmin,
250
250
  Permission.ScheduledMaintenanceMember,
251
251
  Permission.ScheduledMaintenanceViewer,
252
- Permission.ReadScheduledMaintenanceTemplateOwnerTeam,
252
+ Permission.ReadScheduledMaintenanceTemplateOwnerUser,
253
253
  ],
254
254
  update: [],
255
255
  })
@@ -283,7 +283,7 @@ export default class ScheduledMaintenanceTemplateOwnerUser extends BaseModel {
283
283
  Permission.ProjectMember,
284
284
  Permission.ScheduledMaintenanceAdmin,
285
285
  Permission.ScheduledMaintenanceMember,
286
- Permission.CreateScheduledMaintenanceTemplateOwnerTeam,
286
+ Permission.CreateScheduledMaintenanceTemplateOwnerUser,
287
287
  ],
288
288
  read: [
289
289
  Permission.ProjectOwner,
@@ -293,7 +293,7 @@ export default class ScheduledMaintenanceTemplateOwnerUser extends BaseModel {
293
293
  Permission.ScheduledMaintenanceAdmin,
294
294
  Permission.ScheduledMaintenanceMember,
295
295
  Permission.ScheduledMaintenanceViewer,
296
- Permission.ReadScheduledMaintenanceTemplateOwnerTeam,
296
+ Permission.ReadScheduledMaintenanceTemplateOwnerUser,
297
297
  ],
298
298
  update: [],
299
299
  })
@@ -26,6 +26,7 @@ import Permission from "../../Types/Permission";
26
26
  import TechStack from "../../Types/Service/TechStack";
27
27
  import MetricDownsamplingRetentionDays from "../../Types/Metrics/MetricDownsamplingRetentionDays";
28
28
  import TelemetryRetentionConfig from "../../Types/Telemetry/TelemetryRetentionConfig";
29
+ import UNSYNCHRONIZED_INDEX from "../../Types/Database/UnsynchronizedIndex";
29
30
  import {
30
31
  Column,
31
32
  Entity,
@@ -101,6 +102,35 @@ import {
101
102
  */
102
103
  @Index(["projectId", "name"], { unique: true })
103
104
  @Index(["projectId", "isArchived"])
105
+ /*
106
+ * Serves the hottest read on the telemetry ingest path: OTLP resource
107
+ * resolution looks a service up by `service.name` case-insensitively, so
108
+ * `QueryHelper.findWithSameText` emits `LOWER("Service"."name") = $2`. The
109
+ * unique index above is over the RAW name column and cannot satisfy that
110
+ * predicate — Postgres can only use its `projectId` prefix as an index qual and
111
+ * must then heap-fetch and filter every service in the project. The real
112
+ * definition is an EXPRESSION index and lives in migration
113
+ * 1786100000000-RestoreServiceLowerNameIndex; `@Index()` cannot express
114
+ * `LOWER(...)`.
115
+ *
116
+ * `synchronize: false` is the load-bearing part of this declaration, and it is
117
+ * why the index is declared here at all rather than only in the migration.
118
+ * TypeORM's schema builder matches database indexes to entity metadata BY NAME
119
+ * and drops every one it cannot find (RdbmsSchemaBuilder.dropOldIndices). An
120
+ * index created only in a migration is therefore invisible to it and gets
121
+ * emitted as a DROP by the next autogenerated migration. That is not
122
+ * hypothetical: this exact index existed once, as
123
+ * IDX_SERVICE_PROJECT_NAME_UNIQUE in migration 1774559064921, and migration
124
+ * 1775735059360 dropped it as collateral damage — its down() even "restores"
125
+ * it without the LOWER(), so the round-trip silently loses the expression.
126
+ * Naming it here with synchronize:false makes the builder skip it in both
127
+ * directions: it will never drop it, and it will never try to create it.
128
+ */
129
+ @Index(
130
+ "IDX_SERVICE_PROJECT_LOWER_NAME",
131
+ ["projectId", "name"],
132
+ UNSYNCHRONIZED_INDEX,
133
+ )
104
134
  @TableMetadata({
105
135
  tableName: "Service",
106
136
  singularName: "Service",
@@ -1183,6 +1183,7 @@ export default class StatusPage extends BaseModel {
1183
1183
  description:
1184
1184
  "Password required to unlock a private status page. This value is stored as a secure hash.",
1185
1185
  hashed: true,
1186
+ hashSaltColumn: "masterPasswordSalt",
1186
1187
  type: TableColumnType.HashedString,
1187
1188
  placeholder: "Enter a new master password",
1188
1189
  })
@@ -1194,6 +1195,33 @@ export default class StatusPage extends BaseModel {
1194
1195
  })
1195
1196
  public masterPassword?: HashedString = undefined;
1196
1197
 
1198
+ /*
1199
+ * Per-status-page salt mixed into `masterPassword`. Written by the database
1200
+ * write path on every master-password write and never exposed to API
1201
+ * callers. Nullable so existing unsalted hashes can be verified and
1202
+ * upgraded after a successful unlock.
1203
+ */
1204
+ @ColumnAccessControl({
1205
+ create: [],
1206
+ read: [],
1207
+ update: [],
1208
+ })
1209
+ @TableColumn({
1210
+ title: "Master Password Salt",
1211
+ description:
1212
+ "Per-status-page random salt mixed into this status page's master password hash.",
1213
+ computed: true,
1214
+ type: TableColumnType.ShortText,
1215
+ hideColumnInDocumentation: true,
1216
+ })
1217
+ @Column({
1218
+ type: ColumnType.ShortText,
1219
+ length: ColumnLength.ShortText,
1220
+ unique: false,
1221
+ nullable: true,
1222
+ })
1223
+ public masterPasswordSalt?: string = undefined;
1224
+
1197
1225
  @ColumnAccessControl({
1198
1226
  create: [
1199
1227
  Permission.ProjectOwner,
@@ -713,6 +713,7 @@ export default class StatusPageAnnouncement extends BaseModel {
713
713
  ],
714
714
  })
715
715
  @TableColumn({
716
+ computed: true,
716
717
  type: TableColumnType.VeryLongText,
717
718
  title: "Notification Status Message",
718
719
  description:
@@ -319,6 +319,7 @@ export default class StatusPagePrivateUser extends BaseModel {
319
319
  @TableColumn({
320
320
  title: "Password",
321
321
  hashed: true,
322
+ hashSaltColumn: "passwordSalt",
322
323
  type: TableColumnType.HashedString,
323
324
  })
324
325
  @Column({
@@ -330,6 +331,35 @@ export default class StatusPagePrivateUser extends BaseModel {
330
331
  })
331
332
  public password?: HashedString = undefined;
332
333
 
334
+ /*
335
+ * Per-user salt mixed into `password`'s hash. Written by the database
336
+ * write path on every password write — never by an API caller, hence the
337
+ * empty access control and `computed: true`.
338
+ *
339
+ * Nullable on purpose: rows that predate per-user salts have none, and are
340
+ * verified against the legacy unsalted scheme until the next successful
341
+ * login re-hashes them with a fresh salt.
342
+ */
343
+ @ColumnAccessControl({
344
+ create: [],
345
+ read: [],
346
+ update: [],
347
+ })
348
+ @TableColumn({
349
+ title: "Password Salt",
350
+ description: "Per-user random salt mixed into this user's password hash.",
351
+ computed: true,
352
+ type: TableColumnType.ShortText,
353
+ hideColumnInDocumentation: true,
354
+ })
355
+ @Column({
356
+ type: ColumnType.ShortText,
357
+ length: ColumnLength.ShortText,
358
+ unique: false,
359
+ nullable: true,
360
+ })
361
+ public passwordSalt?: string = undefined;
362
+
333
363
  @ColumnAccessControl({
334
364
  create: [],
335
365
  read: [],
@@ -140,6 +140,7 @@ class User extends UserModel {
140
140
  @TableColumn({
141
141
  title: "Password",
142
142
  hashed: true,
143
+ hashSaltColumn: "passwordSalt",
143
144
  type: TableColumnType.HashedString,
144
145
  })
145
146
  @Column({
@@ -151,6 +152,35 @@ class User extends UserModel {
151
152
  })
152
153
  public password?: HashedString = undefined;
153
154
 
155
+ /*
156
+ * Per-user salt mixed into `password`'s hash. Written by the database
157
+ * write path on every password write — never by an API caller, hence the
158
+ * empty access control and `computed: true`.
159
+ *
160
+ * Nullable on purpose: rows that predate per-user salts have none, and are
161
+ * verified against the legacy unsalted scheme until the next successful
162
+ * login re-hashes them with a fresh salt.
163
+ */
164
+ @ColumnAccessControl({
165
+ create: [],
166
+ read: [],
167
+ update: [],
168
+ })
169
+ @TableColumn({
170
+ title: "Password Salt",
171
+ description: "Per-user random salt mixed into this user's password hash.",
172
+ computed: true,
173
+ type: TableColumnType.ShortText,
174
+ hideColumnInDocumentation: true,
175
+ })
176
+ @Column({
177
+ type: ColumnType.ShortText,
178
+ length: ColumnLength.ShortText,
179
+ unique: false,
180
+ nullable: true,
181
+ })
182
+ public passwordSalt?: string = undefined;
183
+
154
184
  @ColumnAccessControl({
155
185
  create: [],
156
186
  read: [Permission.CurrentUser],