@oneuptime/common 12.0.2 → 12.0.4

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 (384) hide show
  1. package/Models/DatabaseModels/CephCluster.ts +14 -0
  2. package/Models/DatabaseModels/CodeRepository.ts +14 -6
  3. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
  4. package/Models/DatabaseModels/DockerHost.ts +14 -0
  5. package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
  6. package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
  7. package/Models/DatabaseModels/Index.ts +2 -0
  8. package/Models/DatabaseModels/IoTFleet.ts +14 -0
  9. package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
  10. package/Models/DatabaseModels/LogDropFilter.ts +9 -20
  11. package/Models/DatabaseModels/NetworkDevice.ts +14 -0
  12. package/Models/DatabaseModels/NetworkInterface.ts +18 -0
  13. package/Models/DatabaseModels/Project.ts +16 -2
  14. package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
  15. package/Models/DatabaseModels/Service.ts +30 -0
  16. package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
  17. package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
  18. package/Models/DatabaseModels/StatusPageResource.ts +73 -0
  19. package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
  20. package/Models/DatabaseModels/User.ts +30 -0
  21. package/Server/API/AIAgentDataAPI.ts +31 -0
  22. package/Server/API/BaseAPI.ts +13 -2
  23. package/Server/API/DashboardAPI.ts +458 -12
  24. package/Server/API/GitHubAPI.ts +119 -283
  25. package/Server/API/UserAPI.ts +263 -1
  26. package/Server/EnvironmentConfig.ts +38 -4
  27. package/Server/Infrastructure/GlobalCache.ts +152 -0
  28. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  36. package/Server/Services/AlertStateTimelineService.ts +20 -0
  37. package/Server/Services/AnalyticsDatabaseService.ts +72 -1
  38. package/Server/Services/CephClusterService.ts +26 -86
  39. package/Server/Services/CloudResourceService.ts +23 -83
  40. package/Server/Services/CodeRepositoryService.ts +105 -2
  41. package/Server/Services/DatabaseService.ts +296 -2
  42. package/Server/Services/DockerHostService.ts +19 -79
  43. package/Server/Services/DockerSwarmClusterService.ts +27 -88
  44. package/Server/Services/HostService.ts +46 -99
  45. package/Server/Services/IncidentStateTimelineService.ts +20 -0
  46. package/Server/Services/Index.ts +2 -0
  47. package/Server/Services/IoTFleetService.ts +19 -79
  48. package/Server/Services/KubernetesClusterService.ts +17 -78
  49. package/Server/Services/LabelService.ts +57 -10
  50. package/Server/Services/MetricTypeService.ts +84 -0
  51. package/Server/Services/MonitorService.ts +89 -14
  52. package/Server/Services/MonitorStatusTimelineService.ts +29 -0
  53. package/Server/Services/MonitorTemplateService.ts +65 -0
  54. package/Server/Services/OpenTelemetryIngestService.ts +230 -26
  55. package/Server/Services/PodmanHostService.ts +19 -79
  56. package/Server/Services/ProxmoxClusterService.ts +23 -83
  57. package/Server/Services/RumApplicationService.ts +19 -80
  58. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
  59. package/Server/Services/ServerlessFunctionService.ts +24 -85
  60. package/Server/Services/ServiceService.ts +299 -73
  61. package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
  62. package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
  63. package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
  64. package/Server/Services/TelemetryEntityService.ts +1 -0
  65. package/Server/Services/UserService.ts +184 -0
  66. package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
  67. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
  68. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
  69. package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
  70. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
  71. package/Server/Utils/Monitor/MonitorResource.ts +63 -36
  72. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
  73. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
  74. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
  75. package/Server/Utils/PasswordHash.ts +306 -0
  76. package/Server/Utils/SingleFlight.ts +83 -0
  77. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
  78. package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
  79. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
  80. package/Server/Utils/Telemetry/Telemetry.ts +351 -122
  81. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
  82. package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
  83. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  84. package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
  85. package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
  86. package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
  87. package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
  88. package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
  89. package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
  90. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
  91. package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
  92. package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
  93. package/Tests/Server/API/Helpers.ts +6 -1
  94. package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
  95. package/Tests/Server/Infrastructure/GlobalCache.test.ts +354 -0
  96. package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
  97. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
  98. package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
  99. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
  100. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +5 -0
  101. package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
  102. package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
  103. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +870 -0
  104. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
  105. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
  106. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +163 -15
  107. package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
  108. package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
  109. package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
  110. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
  111. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +305 -56
  112. package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
  113. package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
  114. package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
  115. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
  116. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
  117. package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
  118. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
  119. package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
  120. package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
  121. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
  122. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
  123. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
  124. package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
  125. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
  126. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
  127. package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
  128. package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
  129. package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
  130. package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
  131. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
  132. package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
  133. package/Tests/Server/Utils/PasswordHash.test.ts +555 -0
  134. package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
  135. package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
  136. package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
  137. package/Tests/Types/Database/ColumnLength.test.ts +7 -1
  138. package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
  139. package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
  140. package/Tests/Types/Decimal.test.ts +37 -0
  141. package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
  142. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
  143. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
  144. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
  145. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
  146. package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
  147. package/Tests/Types/Port.test.ts +38 -0
  148. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
  149. package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
  150. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
  151. package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
  152. package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
  153. package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
  154. package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
  155. package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
  156. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  157. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  158. package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
  159. package/Types/Dashboard/DashboardTemplates.ts +397 -0
  160. package/Types/Database/BigIntColumnTransformer.ts +74 -0
  161. package/Types/Database/ColumnLength.ts +9 -1
  162. package/Types/Database/DatabaseProperty.ts +26 -0
  163. package/Types/Database/NumericColumnValue.ts +128 -0
  164. package/Types/Database/TableColumn.ts +11 -0
  165. package/Types/Database/UnsynchronizedIndex.ts +48 -0
  166. package/Types/Decimal.ts +16 -4
  167. package/Types/HashedString.ts +139 -4
  168. package/Types/Permission.ts +48 -0
  169. package/Types/Port.ts +16 -4
  170. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
  171. package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
  172. package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
  173. package/UI/Components/Navbar/NavBar.tsx +12 -2
  174. package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
  175. package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
  176. package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
  177. package/Utils/Dashboard/Components/Index.ts +7 -0
  178. package/Utils/TeamMembersByProject.ts +237 -0
  179. package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
  180. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
  182. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
  184. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
  186. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
  188. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  189. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
  190. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  191. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  192. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
  194. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  195. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
  196. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
  198. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  199. package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
  200. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
  202. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/Project.js +16 -2
  204. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  205. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
  206. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/Service.js +28 -1
  208. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
  210. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
  211. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
  212. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
  214. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
  216. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/User.js +32 -0
  218. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  219. package/build/dist/Server/API/AIAgentDataAPI.js +21 -2
  220. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  221. package/build/dist/Server/API/BaseAPI.js +11 -1
  222. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  223. package/build/dist/Server/API/DashboardAPI.js +343 -10
  224. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  225. package/build/dist/Server/API/GitHubAPI.js +94 -167
  226. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  227. package/build/dist/Server/API/UserAPI.js +187 -2
  228. package/build/dist/Server/API/UserAPI.js.map +1 -1
  229. package/build/dist/Server/EnvironmentConfig.js +34 -4
  230. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  231. package/build/dist/Server/Infrastructure/GlobalCache.js +120 -0
  232. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
  234. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  249. package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
  250. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  251. package/build/dist/Server/Services/AnalyticsDatabaseService.js +57 -1
  252. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  253. package/build/dist/Server/Services/CephClusterService.js +26 -76
  254. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  255. package/build/dist/Server/Services/CloudResourceService.js +23 -73
  256. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  257. package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
  258. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
  259. package/build/dist/Server/Services/DatabaseService.js +246 -2
  260. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  261. package/build/dist/Server/Services/DockerHostService.js +19 -69
  262. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  263. package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -78
  264. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  265. package/build/dist/Server/Services/HostService.js +58 -102
  266. package/build/dist/Server/Services/HostService.js.map +1 -1
  267. package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
  268. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  269. package/build/dist/Server/Services/Index.js +2 -0
  270. package/build/dist/Server/Services/Index.js.map +1 -1
  271. package/build/dist/Server/Services/IoTFleetService.js +19 -69
  272. package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
  273. package/build/dist/Server/Services/KubernetesClusterService.js +17 -68
  274. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  275. package/build/dist/Server/Services/LabelService.js +42 -7
  276. package/build/dist/Server/Services/LabelService.js.map +1 -1
  277. package/build/dist/Server/Services/MetricTypeService.js +74 -0
  278. package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
  279. package/build/dist/Server/Services/MonitorService.js +81 -9
  280. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  281. package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
  282. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  283. package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
  284. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  285. package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
  286. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  287. package/build/dist/Server/Services/PodmanHostService.js +19 -69
  288. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  289. package/build/dist/Server/Services/ProxmoxClusterService.js +23 -73
  290. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  291. package/build/dist/Server/Services/RumApplicationService.js +19 -70
  292. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  293. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
  294. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  295. package/build/dist/Server/Services/ServerlessFunctionService.js +24 -75
  296. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  297. package/build/dist/Server/Services/ServiceService.js +236 -61
  298. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  299. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
  300. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
  301. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
  302. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
  303. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
  304. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  305. package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
  306. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  307. package/build/dist/Server/Services/UserService.js +165 -0
  308. package/build/dist/Server/Services/UserService.js.map +1 -1
  309. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
  310. package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
  311. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
  312. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  313. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
  314. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  315. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
  316. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
  317. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
  318. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  319. package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
  320. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  321. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
  322. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  323. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
  324. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  325. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
  326. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
  327. package/build/dist/Server/Utils/PasswordHash.js +237 -0
  328. package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
  329. package/build/dist/Server/Utils/SingleFlight.js +76 -0
  330. package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
  331. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
  332. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
  333. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
  334. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  335. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
  336. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
  337. package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
  338. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  339. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  340. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  341. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  342. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  343. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
  344. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
  345. package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
  346. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  347. package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
  348. package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
  349. package/build/dist/Types/Database/ColumnLength.js +9 -1
  350. package/build/dist/Types/Database/ColumnLength.js.map +1 -1
  351. package/build/dist/Types/Database/DatabaseProperty.js +25 -0
  352. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  353. package/build/dist/Types/Database/NumericColumnValue.js +97 -0
  354. package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
  355. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  356. package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
  357. package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
  358. package/build/dist/Types/Decimal.js +14 -3
  359. package/build/dist/Types/Decimal.js.map +1 -1
  360. package/build/dist/Types/HashedString.js +95 -5
  361. package/build/dist/Types/HashedString.js.map +1 -1
  362. package/build/dist/Types/Permission.js +42 -0
  363. package/build/dist/Types/Permission.js.map +1 -1
  364. package/build/dist/Types/Port.js +15 -5
  365. package/build/dist/Types/Port.js.map +1 -1
  366. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
  367. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  368. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
  369. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
  370. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
  371. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
  372. package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
  373. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  374. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
  375. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  376. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
  377. package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
  378. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
  379. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
  380. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  381. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  382. package/build/dist/Utils/TeamMembersByProject.js +145 -0
  383. package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
  384. package/package.json +1 -1
@@ -80,6 +80,20 @@ import {
80
80
  */
81
81
  @Index(["projectId", "name"], { unique: true })
82
82
  @Index(["projectId", "isArchived"])
83
+ /*
84
+ * Restores a UNIQUE index that an autogenerated migration deleted.
85
+ *
86
+ * Declared natively and NAMED. TypeORM's schema builder matches database
87
+ * indexes to entity metadata by name and drops every one it cannot find, which
88
+ * is how the original was lost: it existed only in a migration, so entity
89
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
90
+ * it here keeps the original index name and lets the builder match, compare
91
+ * uniqueness and columns, and keep it.
92
+ */
93
+ @Index("IDX_ceph_cluster_slug", ["slug"], {
94
+ unique: true,
95
+ where: '"deletedAt" IS NULL',
96
+ })
83
97
  @TableMetadata({
84
98
  tableName: "CephCluster",
85
99
  singularName: "Ceph Cluster",
@@ -649,13 +649,21 @@ export default class CodeRepository extends BaseModel {
649
649
  })
650
650
  public repositoryUrl?: URL = undefined;
651
651
 
652
- // GitHub App specific fields
652
+ /*
653
+ * GitHub App specific fields.
654
+ *
655
+ * `create` is empty on purpose. This column decides which GitHub App
656
+ * installation a repository token is minted from, so a caller who could set
657
+ * it could name ANOTHER tenant's installation, put the row in a project they
658
+ * own, and pass every "is this row in your project?" check on the way to a
659
+ * live `ghs_` token. It is assigned server-side only — by the install
660
+ * callback and the installation webhooks, which write with `isRoot` after
661
+ * GitHub has confirmed the installation belongs to the project.
662
+ * CodeRepositoryService.onBeforeCreate/onBeforeUpdate enforce the same rule
663
+ * a second time, in case a future route writes as root.
664
+ */
653
665
  @ColumnAccessControl({
654
- create: [
655
- Permission.ProjectOwner,
656
- Permission.ProjectAdmin,
657
- Permission.CreateCodeRepository,
658
- ],
666
+ create: [],
659
667
  read: [
660
668
  Permission.ProjectOwner,
661
669
  Permission.ProjectAdmin,
@@ -17,6 +17,10 @@ import TableColumn, {
17
17
  getTableColumns,
18
18
  } from "../../../Types/Database/TableColumn";
19
19
  import TableColumnType from "../../../Types/Database/TableColumnType";
20
+ import {
21
+ coerceNumericColumnValue,
22
+ isNumericTableColumnType,
23
+ } from "../../../Types/Database/NumericColumnValue";
20
24
  import { getFirstColorFieldColumn } from "../../../Types/Database/ColorField";
21
25
  import Dictionary from "../../../Types/Dictionary";
22
26
  import Email from "../../../Types/Email";
@@ -727,6 +731,16 @@ export default class DatabaseBaseModel extends BaseEntity {
727
731
  json[key] as JSONArray,
728
732
  tableColumnMetadata.modelType,
729
733
  );
734
+ } else if (isNumericTableColumnType(tableColumnMetadata.type)) {
735
+ /*
736
+ * An `<input type="number">` hands back a string, so the dashboard
737
+ * posts "10" for a number column. This is the one place that knows
738
+ * the column's declared type, and it runs on both sides of the
739
+ * wire — ModelForm on the way out, BaseAPI on the way in — so a
740
+ * number column holds a number before any hook or validator reads
741
+ * it. See Types/Database/NumericColumnValue.
742
+ */
743
+ (baseModel as any)[key] = coerceNumericColumnValue(json[key]);
730
744
  } else {
731
745
  (baseModel as any)[key] = json[key];
732
746
  }
@@ -72,6 +72,20 @@ import {
72
72
  @CrudApiEndpoint(new Route("/docker-host"))
73
73
  @SlugifyColumn("name", "slug")
74
74
  @Index(["projectId", "isArchived"])
75
+ /*
76
+ * Restores a UNIQUE index that an autogenerated migration deleted.
77
+ *
78
+ * Declared natively and NAMED. TypeORM's schema builder matches database
79
+ * indexes to entity metadata by name and drops every one it cannot find, which
80
+ * is how the original was lost: it existed only in a migration, so entity
81
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
82
+ * it here keeps the original index name and lets the builder match, compare
83
+ * uniqueness and columns, and keep it.
84
+ */
85
+ @Index("IDX_docker_host_slug", ["slug"], {
86
+ unique: true,
87
+ where: '"deletedAt" IS NULL',
88
+ })
75
89
  @TableMetadata({
76
90
  tableName: "DockerHost",
77
91
  singularName: "Docker Host",
@@ -39,6 +39,24 @@ import {
39
39
  update: [],
40
40
  })
41
41
  @CrudApiEndpoint(new Route("/global-oidc-project"))
42
+ /*
43
+ * Restores a UNIQUE index that an autogenerated migration deleted.
44
+ *
45
+ * Declared natively and NAMED. TypeORM's schema builder matches database
46
+ * indexes to entity metadata by name and drops every one it cannot find, which
47
+ * is how the original was lost: it existed only in a migration, so entity
48
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
49
+ * it here keeps the original index name and lets the builder match, compare
50
+ * uniqueness and columns, and keep it.
51
+ */
52
+ @Index(
53
+ "IDX_GlobalOIDCProject_globalOidcId_projectId",
54
+ ["globalOidcId", "projectId"],
55
+ {
56
+ unique: true,
57
+ where: '"deletedAt" IS NULL',
58
+ },
59
+ )
42
60
  @TableMetadata({
43
61
  tableName: "GlobalOIDCProject",
44
62
  singularName: "Global OIDC Project",
@@ -42,6 +42,24 @@ import {
42
42
  update: [],
43
43
  })
44
44
  @CrudApiEndpoint(new Route("/global-sso-project"))
45
+ /*
46
+ * Restores a UNIQUE index that an autogenerated migration deleted.
47
+ *
48
+ * Declared natively and NAMED. TypeORM's schema builder matches database
49
+ * indexes to entity metadata by name and drops every one it cannot find, which
50
+ * is how the original was lost: it existed only in a migration, so entity
51
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
52
+ * it here keeps the original index name and lets the builder match, compare
53
+ * uniqueness and columns, and keep it.
54
+ */
55
+ @Index(
56
+ "IDX_GlobalSSOProject_globalSsoId_projectId",
57
+ ["globalSsoId", "projectId"],
58
+ {
59
+ unique: true,
60
+ where: '"deletedAt" IS NULL',
61
+ },
62
+ )
45
63
  @TableMetadata({
46
64
  tableName: "GlobalSSOProject",
47
65
  singularName: "Global SSO Project",
@@ -375,6 +375,7 @@ import MonitorOwnerRule from "./MonitorOwnerRule";
375
375
  import MonitorLabelRule from "./MonitorLabelRule";
376
376
  import StatusPageOwnerRule from "./StatusPageOwnerRule";
377
377
  import StatusPageLabelRule from "./StatusPageLabelRule";
378
+ import StatusPageMonitorRule from "./StatusPageMonitorRule";
378
379
  import HostOwnerRule from "./HostOwnerRule";
379
380
  import HostLabelRule from "./HostLabelRule";
380
381
  import ServiceOwnerRule from "./ServiceOwnerRule";
@@ -559,6 +560,7 @@ const AllModelTypes: Array<{
559
560
  MonitorLabelRule,
560
561
  StatusPageOwnerRule,
561
562
  StatusPageLabelRule,
563
+ StatusPageMonitorRule,
562
564
  HostOwnerRule,
563
565
  HostLabelRule,
564
566
  ServiceOwnerRule,
@@ -80,6 +80,20 @@ import {
80
80
  */
81
81
  @Index(["projectId", "name"], { unique: true })
82
82
  @Index(["projectId", "isArchived"])
83
+ /*
84
+ * Restores a UNIQUE index that an autogenerated migration deleted.
85
+ *
86
+ * Declared natively and NAMED. TypeORM's schema builder matches database
87
+ * indexes to entity metadata by name and drops every one it cannot find, which
88
+ * is how the original was lost: it existed only in a migration, so entity
89
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
90
+ * it here keeps the original index name and lets the builder match, compare
91
+ * uniqueness and columns, and keep it.
92
+ */
93
+ @Index("IDX_iot_fleet_slug", ["slug"], {
94
+ unique: true,
95
+ where: '"deletedAt" IS NULL',
96
+ })
83
97
  @TableMetadata({
84
98
  tableName: "IoTFleet",
85
99
  singularName: "IoT Fleet",
@@ -79,6 +79,20 @@ import {
79
79
  */
80
80
  @Index(["projectId", "clusterIdentifier"], { unique: true })
81
81
  @Index(["projectId", "isArchived"])
82
+ /*
83
+ * Restores a UNIQUE index that an autogenerated migration deleted.
84
+ *
85
+ * Declared natively and NAMED. TypeORM's schema builder matches database
86
+ * indexes to entity metadata by name and drops every one it cannot find, which
87
+ * is how the original was lost: it existed only in a migration, so entity
88
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
89
+ * it here keeps the original index name and lets the builder match, compare
90
+ * uniqueness and columns, and keep it.
91
+ */
92
+ @Index("IDX_kubernetes_cluster_slug", ["slug"], {
93
+ unique: true,
94
+ where: '"deletedAt" IS NULL',
95
+ })
82
96
  @TableMetadata({
83
97
  tableName: "KubernetesCluster",
84
98
  singularName: "Kubernetes Cluster",
@@ -7,6 +7,7 @@ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessCo
7
7
  import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
8
8
  import ColumnLength from "../../Types/Database/ColumnLength";
9
9
  import ColumnType from "../../Types/Database/ColumnType";
10
+ import { getBigIntDatabaseTransformer } from "../../Types/Database/BigIntColumnTransformer";
10
11
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
12
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
12
13
  import TableColumn from "../../Types/Database/TableColumn";
@@ -436,26 +437,14 @@ export default class LogDropFilter extends BaseModel {
436
437
  type: ColumnType.BigPositiveNumber,
437
438
  nullable: false,
438
439
  default: 0,
439
- transformer: {
440
- to: (value: number | null | undefined): string | null => {
441
- if (value === null || value === undefined) {
442
- return null;
443
- }
444
- return Math.trunc(value).toString();
445
- },
446
- /*
447
- * Postgres bigint comes back from the driver as a string. The UI
448
- * renders this as a number, so normalize here rather than making
449
- * every reader remember.
450
- */
451
- from: (value: string | null | undefined): number | null => {
452
- if (value === null || value === undefined) {
453
- return null;
454
- }
455
- const parsed: number = parseInt(value, 10);
456
- return isNaN(parsed) ? null : parsed;
457
- },
458
- },
440
+ /*
441
+ * Shared transformer, not an inline one: it has to preserve `undefined`
442
+ * so this NOT NULL column's DEFAULT 0 is what a create actually gets.
443
+ * An inline transformer that mapped `undefined` to `null` made every
444
+ * drop-filter insert fail the not-null constraint. See
445
+ * Types/Database/BigIntColumnTransformer.
446
+ */
447
+ transformer: getBigIntDatabaseTransformer(),
459
448
  })
460
449
  public droppedCount?: number = undefined;
461
450
 
@@ -78,6 +78,20 @@ import {
78
78
  @CrudApiEndpoint(new Route("/network-device"))
79
79
  @SlugifyColumn("name", "slug")
80
80
  @Index(["projectId", "isArchived"])
81
+ /*
82
+ * Restores a UNIQUE index that an autogenerated migration deleted.
83
+ *
84
+ * Declared natively and NAMED. TypeORM's schema builder matches database
85
+ * indexes to entity metadata by name and drops every one it cannot find, which
86
+ * is how the original was lost: it existed only in a migration, so entity
87
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
88
+ * it here keeps the original index name and lets the builder match, compare
89
+ * uniqueness and columns, and keep it.
90
+ */
91
+ @Index("IDX_network_device_slug", ["slug"], {
92
+ unique: true,
93
+ where: '"deletedAt" IS NULL',
94
+ })
81
95
  @TableMetadata({
82
96
  tableName: "NetworkDevice",
83
97
  singularName: "Network Device",
@@ -72,6 +72,24 @@ const decimalTransformer: ValueTransformer = {
72
72
  })
73
73
  @CrudApiEndpoint(new Route("/network-interface"))
74
74
  @Index(["projectId", "networkDeviceId"])
75
+ /*
76
+ * Restores a UNIQUE index that an autogenerated migration deleted.
77
+ *
78
+ * Declared natively and NAMED. TypeORM's schema builder matches database
79
+ * indexes to entity metadata by name and drops every one it cannot find, which
80
+ * is how the original was lost: it existed only in a migration, so entity
81
+ * metadata never mentioned it and `migration:generate` emitted a DROP. Naming
82
+ * it here keeps the original index name and lets the builder match, compare
83
+ * uniqueness and columns, and keep it.
84
+ */
85
+ @Index(
86
+ "IDX_network_interface_device_ifindex",
87
+ ["networkDeviceId", "interfaceIndex"],
88
+ {
89
+ unique: true,
90
+ where: '"deletedAt" IS NULL',
91
+ },
92
+ )
75
93
  @TableMetadata({
76
94
  tableName: "NetworkInterface",
77
95
  singularName: "Network Interface",
@@ -2583,7 +2583,21 @@ export default class Project extends TenantModel {
2583
2583
  })
2584
2584
  public doNotAddGlobalProbesByDefaultOnNewMonitors?: boolean = undefined;
2585
2585
 
2586
- // GitHub App Installation ID for this project
2586
+ /*
2587
+ * GitHub App Installation ID for this project.
2588
+ *
2589
+ * This column IS the authority on which GitHub App installation a project
2590
+ * owns — every path that mints a repository token re-derives the binding
2591
+ * from it (see GitHubInstallationBinding). That makes it security state, not
2592
+ * project configuration, so `update` is empty: a Project Owner who could PUT
2593
+ * an arbitrary installation ID here would simply be writing their own
2594
+ * permission slip to another tenant's repositories.
2595
+ *
2596
+ * It is written server-side only, with `isRoot`, by the GitHub App install
2597
+ * callback — and only after the OAuth user-to-server round trip has proved
2598
+ * to GitHub's satisfaction that the installer controls that installation —
2599
+ * and cleared again by the `installation.deleted` webhook.
2600
+ */
2587
2601
  @ColumnAccessControl({
2588
2602
  create: [],
2589
2603
  read: [
@@ -2593,7 +2607,7 @@ export default class Project extends TenantModel {
2593
2607
  Permission.Viewer,
2594
2608
  Permission.ReadProject,
2595
2609
  ],
2596
- update: [Permission.ProjectOwner, Permission.ProjectAdmin],
2610
+ update: [],
2597
2611
  })
2598
2612
  @TableColumn({
2599
2613
  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",
@@ -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",