@oneuptime/common 11.6.1 → 11.7.0

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 (420) hide show
  1. package/Models/AnalyticsModels/Index.ts +4 -0
  2. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  3. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  4. package/Models/AnalyticsModels/SloHistory.ts +243 -0
  5. package/Models/DatabaseModels/Index.ts +20 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  8. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  9. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  10. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  11. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  13. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  14. package/Models/DatabaseModels/ServiceLevelObjective.ts +1115 -0
  15. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  16. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  17. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.ts +30 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  25. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  26. package/Server/Services/Index.ts +24 -0
  27. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  28. package/Server/Services/MetricService.ts +21 -2
  29. package/Server/Services/MonitorService.ts +22 -0
  30. package/Server/Services/NetworkDeviceService.ts +438 -2
  31. package/Server/Services/NetworkEndpointService.ts +414 -0
  32. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  33. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  34. package/Server/Services/NetworkSiteService.ts +1254 -0
  35. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  36. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  37. package/Server/Services/ProjectService.ts +122 -2
  38. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  41. package/Server/Services/ServiceLevelObjectiveService.ts +685 -0
  42. package/Server/Services/SloHistoryService.ts +101 -0
  43. package/Server/Services/UserNotificationSettingService.ts +37 -0
  44. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  45. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  46. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  47. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  48. package/Server/Utils/Memory.ts +9 -1
  49. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  50. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  51. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  52. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  53. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  54. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  55. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  56. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  57. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  58. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  59. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  60. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  61. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  62. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  63. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  64. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  65. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  66. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  67. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  68. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  70. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  72. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  73. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  74. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  75. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  76. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  77. package/Tests/Server/Utils/Memory.test.ts +213 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  79. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  80. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  82. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  83. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  84. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  85. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  86. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  87. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  88. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  89. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  90. package/Tests/Server/Utils/Stream.test.ts +87 -0
  91. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  92. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  93. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  94. package/Tests/Types/Email.test.ts +198 -0
  95. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  96. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  97. package/Tests/Types/Monitor/MonitorCriteria.test.ts +155 -0
  98. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +465 -0
  99. package/Tests/Types/Monitor/MonitorStep.test.ts +183 -0
  100. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  101. package/Tests/Types/Monitor/MonitorSteps.test.ts +183 -0
  102. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  103. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  104. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  105. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  106. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  107. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  108. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  109. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  110. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  111. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  112. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  113. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  114. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  115. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  116. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  117. package/Tests/Utils/Base64.test.ts +51 -0
  118. package/Tests/Utils/Boolean.test.ts +76 -0
  119. package/Tests/Utils/Crypto.test.ts +48 -0
  120. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  121. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  122. package/Tests/Utils/Enum.test.ts +54 -0
  123. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  124. package/Tests/Utils/Memory.test.ts +44 -0
  125. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  126. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  127. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  128. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  129. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  130. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  131. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  132. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  133. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  134. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +124 -0
  135. package/Tests/Utils/Slo/SloDuration.test.ts +148 -0
  136. package/Tests/Utils/Slo/SloHealth.test.ts +334 -0
  137. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  138. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  139. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  140. package/Tests/Utils/TechStack.test.ts +50 -0
  141. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  142. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  143. package/Types/BaseDatabase/EqualTo.ts +9 -1
  144. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  145. package/Types/BaseDatabase/NotEqual.ts +9 -1
  146. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  147. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  148. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  149. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  150. package/Types/Email/EmailTemplateType.ts +2 -0
  151. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  152. package/Types/Monitor/CriteriaFilter.ts +9 -0
  153. package/Types/Monitor/MonitorStep.ts +5 -8
  154. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  155. package/Types/Monitor/MonitorType.ts +15 -5
  156. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  157. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  158. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  159. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  160. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  161. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  162. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  163. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  164. package/Types/Permission.ts +449 -0
  165. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  166. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  167. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  168. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  169. package/Types/Telemetry/ServiceType.ts +1 -0
  170. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  171. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  172. package/UI/Components/List/List.tsx +8 -0
  173. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  174. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  175. package/UI/Components/Navbar/NavBar.tsx +16 -2
  176. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  177. package/UI/Utils/Navigation.ts +10 -0
  178. package/UI/Utils/TableFilterUrlState.ts +204 -17
  179. package/UI/Utils/TableViewUrlState.ts +165 -0
  180. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  181. package/Utils/Dashboard/Components/Index.ts +7 -0
  182. package/Utils/IpCanonicalUtil.ts +134 -0
  183. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  184. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  185. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  186. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  187. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  188. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  189. package/Utils/Slo/SloBurnRateRuleState.ts +91 -0
  190. package/Utils/Slo/SloDuration.ts +165 -0
  191. package/Utils/Slo/SloEvaluation.ts +22 -0
  192. package/Utils/Slo/SloHealth.ts +302 -0
  193. package/Utils/Slo/SloStatusColor.ts +54 -0
  194. package/Utils/Slo/SloUtil.ts +637 -0
  195. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  196. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  197. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  198. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  199. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  200. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  201. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  202. package/build/dist/Models/AnalyticsModels/SloHistory.js +218 -0
  203. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  204. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  205. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  207. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  209. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  211. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  213. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  215. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  217. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  219. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  221. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1134 -0
  223. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  224. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  225. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  226. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  227. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  228. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  229. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js +21 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  245. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  246. package/build/dist/Server/Services/Index.js +24 -0
  247. package/build/dist/Server/Services/Index.js.map +1 -1
  248. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  249. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  250. package/build/dist/Server/Services/MetricService.js +21 -3
  251. package/build/dist/Server/Services/MetricService.js.map +1 -1
  252. package/build/dist/Server/Services/MonitorService.js +19 -0
  253. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  254. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  255. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  256. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  257. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  258. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  259. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  260. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  261. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  262. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  263. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  264. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  265. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  266. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  267. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  268. package/build/dist/Server/Services/ProjectService.js +98 -2
  269. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  270. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  271. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  272. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  273. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  274. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  275. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  276. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +588 -0
  277. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  278. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  279. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  280. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  281. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  282. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  283. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  284. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  285. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  286. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  287. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  288. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  289. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  290. package/build/dist/Server/Utils/Memory.js +9 -1
  291. package/build/dist/Server/Utils/Memory.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  293. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  294. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  295. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  296. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  297. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  298. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  300. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  302. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  303. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  304. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  305. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  306. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  308. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  309. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  310. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  311. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  312. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  313. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  314. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  315. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  316. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  317. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  318. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  319. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  320. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  321. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  322. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  323. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  324. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  325. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  326. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  327. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  328. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  329. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  330. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  331. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  332. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  333. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  334. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  335. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  336. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  337. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  338. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  339. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  340. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  341. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  342. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  343. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  344. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  345. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  346. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  347. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  348. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  349. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  350. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  351. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  352. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  353. package/build/dist/Types/Permission.js +409 -0
  354. package/build/dist/Types/Permission.js.map +1 -1
  355. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  356. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  357. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  358. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  359. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  360. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  361. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  362. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  363. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  364. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  365. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  366. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  367. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  368. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  369. package/build/dist/UI/Components/List/List.js +1 -1
  370. package/build/dist/UI/Components/List/List.js.map +1 -1
  371. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  373. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  374. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  375. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  376. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  377. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  378. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  379. package/build/dist/UI/Utils/Navigation.js +9 -0
  380. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  381. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  382. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  383. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  384. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  385. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  386. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  387. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  388. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  389. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  390. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  391. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  392. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  393. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  394. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  395. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  396. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  397. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  398. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  399. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  400. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  401. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  402. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  403. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +35 -0
  404. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -0
  405. package/build/dist/Utils/Slo/SloDuration.js +87 -0
  406. package/build/dist/Utils/Slo/SloDuration.js.map +1 -0
  407. package/build/dist/Utils/Slo/SloEvaluation.js +21 -0
  408. package/build/dist/Utils/Slo/SloEvaluation.js.map +1 -0
  409. package/build/dist/Utils/Slo/SloHealth.js +179 -0
  410. package/build/dist/Utils/Slo/SloHealth.js.map +1 -0
  411. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  412. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  413. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  414. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  415. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  416. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  417. package/package.json +2 -2
  418. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  419. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  420. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -0,0 +1,222 @@
1
+ /*
2
+ * Matching helpers for NetworkSite auto-assignment rules: IPv4 CIDR
3
+ * containment, case-insensitive '*' wildcard hostname patterns, and the
4
+ * highest-priority-wins rule picker. Pure and dependency-free so the rule
5
+ * engine's decisions are unit-testable.
6
+ */
7
+ export class CidrMatchUtil {
8
+ /*
9
+ * True when the IPv4 address `ip` falls inside `cidr` ('10.0.0.0/8').
10
+ * Prefixes /0 through /32 are supported; a bare address is treated as /32.
11
+ * Any invalid input returns false instead of throwing.
12
+ */
13
+ static ipInCidr(ip, cidr) {
14
+ const ipValue = CidrMatchUtil.parseIpv4(ip);
15
+ if (ipValue === null) {
16
+ return false;
17
+ }
18
+ if (typeof cidr !== "string" || cidr.trim().length === 0) {
19
+ return false;
20
+ }
21
+ const parts = cidr.trim().split("/");
22
+ if (parts.length > 2) {
23
+ return false;
24
+ }
25
+ const baseValue = CidrMatchUtil.parseIpv4(parts[0] || "");
26
+ if (baseValue === null) {
27
+ return false;
28
+ }
29
+ let prefixLength = 32;
30
+ if (parts.length === 2) {
31
+ const prefixText = parts[1] || "";
32
+ if (!CidrMatchUtil.PREFIX_LENGTH_PATTERN.test(prefixText)) {
33
+ return false;
34
+ }
35
+ prefixLength = parseInt(prefixText, 10);
36
+ if (prefixLength < 0 || prefixLength > 32) {
37
+ return false;
38
+ }
39
+ }
40
+ /*
41
+ * JS bitwise ops are 32-bit signed; >>> 0 keeps the mask and the masked
42
+ * addresses unsigned. A shift by 32 is a no-op in JS, so /0 is special
43
+ * cased to the all-zero mask (matches everything).
44
+ */
45
+ const mask = prefixLength === 0 ? 0 : (0xffffffff << (32 - prefixLength)) >>> 0;
46
+ return (ipValue & mask) >>> 0 === (baseValue & mask) >>> 0;
47
+ }
48
+ // True when `cidr` is a well-formed IPv4 CIDR (or bare address == /32).
49
+ static isValidCidr(cidr) {
50
+ if (typeof cidr !== "string" || cidr.trim().length === 0) {
51
+ return false;
52
+ }
53
+ const parts = cidr.trim().split("/");
54
+ if (parts.length > 2) {
55
+ return false;
56
+ }
57
+ if (CidrMatchUtil.parseIpv4(parts[0] || "") === null) {
58
+ return false;
59
+ }
60
+ if (parts.length === 2) {
61
+ const prefixText = parts[1] || "";
62
+ if (!CidrMatchUtil.PREFIX_LENGTH_PATTERN.test(prefixText)) {
63
+ return false;
64
+ }
65
+ const prefixLength = parseInt(prefixText, 10);
66
+ if (prefixLength < 0 || prefixLength > 32) {
67
+ return false;
68
+ }
69
+ }
70
+ return true;
71
+ }
72
+ /*
73
+ * Case-insensitive wildcard match where '*' matches any run of characters
74
+ * (including none) and every other character is literal. The pattern must
75
+ * cover the whole hostname. Non-string or missing inputs never match, and
76
+ * so does an over-long pattern.
77
+ *
78
+ * Deliberately NOT a regex: compiling a user-authored pattern into
79
+ * /^.*a.*a.*a...$/ makes the backtracking engine explore an exponential
80
+ * number of split points on a long homogeneous input, which blocks the
81
+ * event loop for minutes. This matcher is O(hostname x pattern) worst case
82
+ * with no recursion, so a hostile rule cannot hang the process.
83
+ */
84
+ static hostnameMatchesWildcard(hostname, pattern) {
85
+ if (typeof hostname !== "string" || typeof pattern !== "string") {
86
+ return false;
87
+ }
88
+ const text = hostname.trim().toLowerCase();
89
+ const glob = pattern.trim().toLowerCase();
90
+ if (glob.length > CidrMatchUtil.MAX_HOSTNAME_PATTERN_LENGTH) {
91
+ return false;
92
+ }
93
+ /*
94
+ * Greedy two-pointer glob match. On a mismatch we rewind only to the
95
+ * most recent '*' and advance the character it consumed by one, so each
96
+ * character of the hostname is revisited at most once per '*'.
97
+ */
98
+ let textIndex = 0;
99
+ let globIndex = 0;
100
+ let lastStarIndex = -1;
101
+ let textIndexAtLastStar = 0;
102
+ while (textIndex < text.length) {
103
+ if (globIndex < glob.length && glob[globIndex] === "*") {
104
+ lastStarIndex = globIndex;
105
+ textIndexAtLastStar = textIndex;
106
+ globIndex++;
107
+ }
108
+ else if (globIndex < glob.length &&
109
+ glob[globIndex] === text[textIndex]) {
110
+ globIndex++;
111
+ textIndex++;
112
+ }
113
+ else if (lastStarIndex !== -1) {
114
+ globIndex = lastStarIndex + 1;
115
+ textIndexAtLastStar++;
116
+ textIndex = textIndexAtLastStar;
117
+ }
118
+ else {
119
+ return false;
120
+ }
121
+ }
122
+ // Any trailing '*' in the pattern can still match the empty remainder.
123
+ while (globIndex < glob.length && glob[globIndex] === "*") {
124
+ globIndex++;
125
+ }
126
+ return globIndex === glob.length;
127
+ }
128
+ /*
129
+ * True when the rule's populated criteria all match the target. A CIDR
130
+ * criterion matches the target's ip; a hostname pattern matches either the
131
+ * hostname or the SNMP sysName. A rule with no criteria never matches.
132
+ */
133
+ static ruleMatches(rule, target) {
134
+ const hasCidr = Boolean(rule.subnetCidr && rule.subnetCidr.trim().length > 0);
135
+ const hasPattern = Boolean(rule.hostnamePattern && rule.hostnamePattern.trim().length > 0);
136
+ if (!hasCidr && !hasPattern) {
137
+ return false;
138
+ }
139
+ if (hasCidr) {
140
+ if (!target.ip || !CidrMatchUtil.ipInCidr(target.ip, rule.subnetCidr)) {
141
+ return false;
142
+ }
143
+ }
144
+ if (hasPattern) {
145
+ const matchesHostname = Boolean(target.hostname &&
146
+ CidrMatchUtil.hostnameMatchesWildcard(target.hostname, rule.hostnamePattern));
147
+ const matchesSysName = Boolean(target.sysName &&
148
+ CidrMatchUtil.hostnameMatchesWildcard(target.sysName, rule.hostnamePattern));
149
+ if (!matchesHostname && !matchesSysName) {
150
+ return false;
151
+ }
152
+ }
153
+ return true;
154
+ }
155
+ /*
156
+ * Picks the winning rule for a target: among matching rules the highest
157
+ * priority number wins; ties go to the earlier createdAt when both rows
158
+ * carry one, otherwise the earlier rule in the input order (stable).
159
+ * Returns null when nothing matches.
160
+ */
161
+ static pickRule(rules, target) {
162
+ let best = null;
163
+ for (const rule of rules) {
164
+ if (!CidrMatchUtil.ruleMatches(rule, target)) {
165
+ continue;
166
+ }
167
+ if (!best) {
168
+ best = rule;
169
+ continue;
170
+ }
171
+ const bestPriority = best.priority || 0;
172
+ const rulePriority = rule.priority || 0;
173
+ if (rulePriority > bestPriority) {
174
+ best = rule;
175
+ continue;
176
+ }
177
+ if (rulePriority === bestPriority &&
178
+ rule.createdAt &&
179
+ best.createdAt &&
180
+ rule.createdAt.getTime() < best.createdAt.getTime()) {
181
+ best = rule;
182
+ }
183
+ }
184
+ return best;
185
+ }
186
+ // '10.0.0.1' -> unsigned 32-bit value; anything malformed -> null.
187
+ static parseIpv4(ip) {
188
+ if (typeof ip !== "string") {
189
+ return null;
190
+ }
191
+ const octets = ip.trim().split(".");
192
+ if (octets.length !== 4) {
193
+ return null;
194
+ }
195
+ let value = 0;
196
+ for (const octetText of octets) {
197
+ if (!CidrMatchUtil.OCTET_PATTERN.test(octetText)) {
198
+ return null;
199
+ }
200
+ const octet = parseInt(octetText, 10);
201
+ if (octet > 255) {
202
+ return null;
203
+ }
204
+ value = (value * 256 + octet) >>> 0;
205
+ }
206
+ return value;
207
+ }
208
+ }
209
+ /*
210
+ * Longest hostname pattern we will evaluate. The column itself is
211
+ * ShortText (100), and a DNS name tops out at 253 characters, so anything
212
+ * longer is either a mistake or an attempt to make matching expensive.
213
+ */
214
+ CidrMatchUtil.MAX_HOSTNAME_PATTERN_LENGTH = 253;
215
+ /*
216
+ * Hoisted out of the call sites so the literals are not the object of a
217
+ * member expression, which `wrap-regex` and Prettier cannot agree on.
218
+ */
219
+ CidrMatchUtil.PREFIX_LENGTH_PATTERN = /^\d{1,2}$/;
220
+ CidrMatchUtil.OCTET_PATTERN = /^\d{1,3}$/;
221
+ export default CidrMatchUtil;
222
+ //# sourceMappingURL=CidrMatchUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CidrMatchUtil.js","sourceRoot":"","sources":["../../../../Utils/NetworkSite/CidrMatchUtil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /*
2
+ * Materialized-path helpers for the NetworkSite hierarchy.
3
+ *
4
+ * A site's path is the slash-separated list of its ancestor IDs ending with
5
+ * its own ID, in '/rootId/childId/.../ownId/' form. Root sites have the path
6
+ * '/ownId/'. All helpers are pure string operations so the tree math is
7
+ * unit-testable without a database.
8
+ */
9
+ export class MaterializedPathUtil {
10
+ /*
11
+ * Builds the path for a site given its parent's path (null/undefined/empty
12
+ * for root sites). Tolerates a parent path missing its leading or trailing
13
+ * slash so a hand-edited row cannot poison every child path built from it.
14
+ */
15
+ static buildPath(parentPath, siteId) {
16
+ const normalizedParent = MaterializedPathUtil.normalizePath(parentPath || "");
17
+ return `${normalizedParent || "/"}${siteId}/`;
18
+ }
19
+ // '/a/b/' -> ['a', 'b']; invalid/empty input -> [].
20
+ static segmentsOf(path) {
21
+ if (!path || typeof path !== "string") {
22
+ return [];
23
+ }
24
+ return path.split("/").filter((segment) => {
25
+ return segment.length > 0;
26
+ });
27
+ }
28
+ /*
29
+ * Number of ancestors above the site this path belongs to: '/a/' -> 0,
30
+ * '/a/b/' -> 1. Empty/invalid paths report 0.
31
+ */
32
+ static depthOf(path) {
33
+ const segments = MaterializedPathUtil.segmentsOf(path);
34
+ return segments.length > 0 ? segments.length - 1 : 0;
35
+ }
36
+ /*
37
+ * True when `path` belongs to a strict descendant of the site that owns
38
+ * `ancestorPath` (a site is not its own descendant).
39
+ */
40
+ static isDescendant(path, ancestorPath) {
41
+ if (!path || !ancestorPath) {
42
+ return false;
43
+ }
44
+ const normalizedPath = MaterializedPathUtil.normalizePath(path);
45
+ const normalizedAncestor = MaterializedPathUtil.normalizePath(ancestorPath);
46
+ return (normalizedPath.startsWith(normalizedAncestor) &&
47
+ normalizedPath !== normalizedAncestor);
48
+ }
49
+ /*
50
+ * True when making the site with `siteId` a child of the site whose path is
51
+ * `newParentPath` would create a cycle - i.e. the proposed parent is the
52
+ * site itself or one of its descendants (its own ID appears anywhere in the
53
+ * parent's path). A null/empty parent path (becoming a root) can never
54
+ * create a cycle.
55
+ */
56
+ static wouldCreateCycle(siteId, newParentPath) {
57
+ if (!siteId || !newParentPath) {
58
+ return false;
59
+ }
60
+ const segments = MaterializedPathUtil.segmentsOf(newParentPath);
61
+ return segments.includes(siteId);
62
+ }
63
+ /*
64
+ * Rewrites subtree paths for a move: every affected path that starts with
65
+ * `oldParentPath` gets that prefix replaced with `newParentPath`. Paths
66
+ * outside the moved subtree are returned unchanged, in input order.
67
+ */
68
+ static rebasePaths(oldParentPath, newParentPath, affectedPaths) {
69
+ const oldPrefix = MaterializedPathUtil.normalizePath(oldParentPath);
70
+ const newPrefix = MaterializedPathUtil.normalizePath(newParentPath);
71
+ return affectedPaths.map((path) => {
72
+ const normalized = MaterializedPathUtil.normalizePath(path);
73
+ if (!oldPrefix || !normalized.startsWith(oldPrefix)) {
74
+ return path;
75
+ }
76
+ return `${newPrefix}${normalized.slice(oldPrefix.length)}`;
77
+ });
78
+ }
79
+ // Ensures '/a/b/' form: leading + trailing slash, no empty segments.
80
+ static normalizePath(path) {
81
+ const segments = MaterializedPathUtil.segmentsOf(path);
82
+ if (segments.length === 0) {
83
+ return "";
84
+ }
85
+ return `/${segments.join("/")}/`;
86
+ }
87
+ }
88
+ export default MaterializedPathUtil;
89
+ //# sourceMappingURL=MaterializedPathUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaterializedPathUtil.js","sourceRoot":"","sources":["../../../../Utils/NetworkSite/MaterializedPathUtil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /*
2
+ * Worst-of health rollup for a NetworkSite's device subtree.
3
+ *
4
+ * Each device contributes one MonitorStatus candidate and the highest
5
+ * priority number wins - MonitorStatus.priority is HIGHER = WORSE per the
6
+ * seeded rows (Operational 1 ... Offline 3), regardless of what the column
7
+ * docstring claims. Pure so the whole decision matrix is unit-testable.
8
+ */
9
+ export class SiteStatusRollupUtil {
10
+ /*
11
+ * Returns the winning MonitorStatus id for a set of devices, or null when
12
+ * no device contributes anything (empty subtree, or freshness fallbacks
13
+ * unavailable because the project has no operational/offline rows) - the
14
+ * caller treats null as "leave the site's status untouched".
15
+ *
16
+ * Per device: a stamped monitor status (with a known priority) wins;
17
+ * otherwise lastSeenAt within the freshness window maps to the project's
18
+ * isOperationalState row and anything staler (or never seen) maps to the
19
+ * isOfflineState row. Priority ties keep the first contributor (stable).
20
+ */
21
+ static worstStatus(data) {
22
+ var _a;
23
+ const now = data.now || new Date();
24
+ const windowInMinutes = (_a = data.freshnessWindowInMinutes) !== null && _a !== void 0 ? _a : SiteStatusRollupUtil.DEFAULT_FRESHNESS_WINDOW_IN_MINUTES;
25
+ const windowInMs = windowInMinutes * 60 * 1000;
26
+ let winner = null;
27
+ for (const device of data.deviceStates) {
28
+ let candidate = null;
29
+ if (device.currentMonitorStatusId &&
30
+ typeof device.monitorStatusPriority === "number" &&
31
+ Number.isFinite(device.monitorStatusPriority)) {
32
+ candidate = {
33
+ monitorStatusId: device.currentMonitorStatusId,
34
+ priority: device.monitorStatusPriority,
35
+ };
36
+ }
37
+ else {
38
+ const lastSeenAtInMs = device.lastSeenAt
39
+ ? new Date(device.lastSeenAt).getTime()
40
+ : null;
41
+ const isFresh = lastSeenAtInMs !== null &&
42
+ now.getTime() - lastSeenAtInMs <= windowInMs;
43
+ candidate = isFresh
44
+ ? data.operationalStatus || null
45
+ : data.offlineStatus || null;
46
+ }
47
+ if (!candidate) {
48
+ continue;
49
+ }
50
+ if (!winner || candidate.priority > winner.priority) {
51
+ winner = candidate;
52
+ }
53
+ }
54
+ return winner ? winner.monitorStatusId : null;
55
+ }
56
+ }
57
+ // A device is considered alive when SNMP data arrived within this window.
58
+ SiteStatusRollupUtil.DEFAULT_FRESHNESS_WINDOW_IN_MINUTES = 15;
59
+ export default SiteStatusRollupUtil;
60
+ //# sourceMappingURL=SiteStatusRollupUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteStatusRollupUtil.js","sourceRoot":"","sources":["../../../../Utils/NetworkSite/SiteStatusRollupUtil.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH,MAAM,OAAO,oBAAoB;IAI/B;;;;;;;;;;OAUG;IACI,MAAM,CAAC,WAAW,CAAC,IAMzB;;QACC,MAAM,GAAG,GAAS,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACzC,MAAM,eAAe,GACnB,MAAA,IAAI,CAAC,wBAAwB,mCAC7B,oBAAoB,CAAC,mCAAmC,CAAC;QAC3D,MAAM,UAAU,GAAW,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;QAEvD,IAAI,MAAM,GAA8B,IAAI,CAAC;QAE7C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,SAAS,GAA8B,IAAI,CAAC;YAEhD,IACE,MAAM,CAAC,sBAAsB;gBAC7B,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ;gBAChD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAC7C,CAAC;gBACD,SAAS,GAAG;oBACV,eAAe,EAAE,MAAM,CAAC,sBAAsB;oBAC9C,QAAQ,EAAE,MAAM,CAAC,qBAAqB;iBACvC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAkB,MAAM,CAAC,UAAU;oBACrD,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;oBACvC,CAAC,CAAC,IAAI,CAAC;gBACT,MAAM,OAAO,GACX,cAAc,KAAK,IAAI;oBACvB,GAAG,CAAC,OAAO,EAAE,GAAG,cAAc,IAAI,UAAU,CAAC;gBAE/C,SAAS,GAAG,OAAO;oBACjB,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI;oBAChC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpD,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;;AAhED,0EAA0E;AACnD,wDAAmC,GAAW,EAAE,CAAC;AAkE1E,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Uptime percentage over a NetworkSiteStatusTimeline window.
3
+ *
4
+ * Every row whose status is not flagged operational counts as downtime.
5
+ * Rows are clamped to the window, an open row (endsAt null) extends to the
6
+ * window end, and overlapping down rows are merged so no second is counted
7
+ * twice. Time not covered by any row counts as up - the timeline only gains
8
+ * rows once a rollup has run, and absence of evidence is not an outage.
9
+ */
10
+ export class SiteUptimeUtil {
11
+ /*
12
+ * Percent of [windowStart, windowEnd) the site was NOT in a
13
+ * non-operational status. Returns 100 for an empty or inverted window.
14
+ * The result is exact (not rounded) and clamped to 0..100.
15
+ */
16
+ static calculateUptimePercent(rows, windowStart, windowEnd) {
17
+ const windowStartInMs = windowStart.getTime();
18
+ const windowEndInMs = windowEnd.getTime();
19
+ const windowInMs = windowEndInMs - windowStartInMs;
20
+ if (!Number.isFinite(windowInMs) || windowInMs <= 0) {
21
+ return 100;
22
+ }
23
+ const downIntervals = [];
24
+ for (const row of rows) {
25
+ if (row.isOperationalState) {
26
+ continue;
27
+ }
28
+ const rowStartInMs = new Date(row.startsAt).getTime();
29
+ const rowEndInMs = row.endsAt
30
+ ? new Date(row.endsAt).getTime()
31
+ : windowEndInMs;
32
+ if (!Number.isFinite(rowStartInMs) || !Number.isFinite(rowEndInMs)) {
33
+ continue;
34
+ }
35
+ const clampedStartInMs = Math.max(rowStartInMs, windowStartInMs);
36
+ const clampedEndInMs = Math.min(rowEndInMs, windowEndInMs);
37
+ if (clampedEndInMs <= clampedStartInMs) {
38
+ continue;
39
+ }
40
+ downIntervals.push({
41
+ startInMs: clampedStartInMs,
42
+ endInMs: clampedEndInMs,
43
+ });
44
+ }
45
+ const downInMs = SiteUptimeUtil.totalCoveredMs(downIntervals);
46
+ const uptimePercent = ((windowInMs - downInMs) / windowInMs) * 100;
47
+ return Math.min(100, Math.max(0, uptimePercent));
48
+ }
49
+ // Sum of interval lengths after merging overlaps.
50
+ static totalCoveredMs(intervals) {
51
+ if (intervals.length === 0) {
52
+ return 0;
53
+ }
54
+ const sorted = [...intervals].sort((a, b) => {
55
+ return a.startInMs - b.startInMs;
56
+ });
57
+ let totalInMs = 0;
58
+ let currentStartInMs = sorted[0].startInMs;
59
+ let currentEndInMs = sorted[0].endInMs;
60
+ for (let i = 1; i < sorted.length; i++) {
61
+ const interval = sorted[i];
62
+ if (interval.startInMs <= currentEndInMs) {
63
+ currentEndInMs = Math.max(currentEndInMs, interval.endInMs);
64
+ }
65
+ else {
66
+ totalInMs += currentEndInMs - currentStartInMs;
67
+ currentStartInMs = interval.startInMs;
68
+ currentEndInMs = interval.endInMs;
69
+ }
70
+ }
71
+ totalInMs += currentEndInMs - currentStartInMs;
72
+ return totalInMs;
73
+ }
74
+ }
75
+ export default SiteUptimeUtil;
76
+ //# sourceMappingURL=SiteUptimeUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteUptimeUtil.js","sourceRoot":"","sources":["../../../../Utils/NetworkSite/SiteUptimeUtil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Whether a burn rate rule currently has an alert open.
3
+ *
4
+ * `lastAlertCreatedAt` / `lastAlertResolvedAt` are stamped by the
5
+ * evaluation worker every time it fires or resolves a rule's alert, and
6
+ * together they are the only record of the rule's lifecycle — but nothing
7
+ * read them outside the worker, so the Burn Rate Rules table could not
8
+ * tell the user whether a rule was paging someone right now, had ever
9
+ * fired, or had never once triggered.
10
+ *
11
+ * The predicate is the worker's own (EvaluateSlos.evaluateBurnRateRule's
12
+ * `hasUnresolvedFiringState`), lifted here so the table and the worker can
13
+ * never disagree about what "firing" means.
14
+ *
15
+ * Kept free of React and of the database model so both can import it and
16
+ * so the ordering edges are unit-testable without a DOM.
17
+ */
18
+ import SloStatus from "../../Types/ServiceLevelObjective/SloStatus";
19
+ export const isBurnRateRuleFiring = (rule) => {
20
+ if (!rule.lastAlertCreatedAt) {
21
+ return false;
22
+ }
23
+ if (!rule.lastAlertResolvedAt) {
24
+ return true;
25
+ }
26
+ return rule.lastAlertResolvedAt.getTime() < rule.lastAlertCreatedAt.getTime();
27
+ };
28
+ export const canSloFireBurnRateAlerts = (slo) => {
29
+ if (slo.isEnabled === false) {
30
+ return false;
31
+ }
32
+ return (slo.sloStatus !== SloStatus.Misconfigured &&
33
+ slo.sloStatus !== SloStatus.Paused);
34
+ };
35
+ //# sourceMappingURL=SloBurnRateRuleState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SloBurnRateRuleState.js","sourceRoot":"","sources":["../../../../Utils/Slo/SloBurnRateRuleState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,SAAS,MAAM,6CAA6C,CAAC;AAoBpE,MAAM,CAAC,MAAM,oBAAoB,GAAiC,CAChE,IAA+B,EACtB,EAAE;IACX,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;AAChF,CAAC,CAAC;AA6BF,MAAM,CAAC,MAAM,wBAAwB,GAAqC,CACxE,GAA6B,EACpB,EAAE;IACX,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,MAAM,CACnC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Compact duration rendering for error budgets.
3
+ *
4
+ * Error budgets span four orders of magnitude — a 99.99% / 7-day SLO gets
5
+ * 60 seconds, a 99% / 90-day SLO gets 21.6 hours — so the "minutes only"
6
+ * rendering the SLO pages started with reads badly at both ends: a
7
+ * one-minute budget shows as "1 min", and a 90-day budget shows as
8
+ * "1296 min of 1296 min". The docs quote budgets the way an SRE says them
9
+ * out loud ("43m 12s", "2h 9m"), and this is the helper that produces
10
+ * exactly that.
11
+ *
12
+ * Kept free of React (and of the database models) so the SLO pages, the
13
+ * dashboard SLO widget and any future status-page surface can all share
14
+ * one rendering, and so every rounding edge is unit-testable without a
15
+ * DOM.
16
+ */
17
+ /** U+2212 MINUS SIGN — reads as a minus rather than a hyphen at tile sizes. */
18
+ const MINUS_SIGN = "−";
19
+ /**
20
+ * Seconds per unit, largest first. Only the two most significant non-zero
21
+ * units are rendered: "2d 5h" is what an on-call engineer needs, "2d 5h
22
+ * 13m 7s" is noise, and truncating rather than rounding up keeps the
23
+ * remaining budget from ever reading larger than it is.
24
+ */
25
+ const UNITS = [
26
+ { suffix: "d", seconds: 86400 },
27
+ { suffix: "h", seconds: 3600 },
28
+ { suffix: "m", seconds: 60 },
29
+ { suffix: "s", seconds: 1 },
30
+ ];
31
+ const MAX_UNITS_SHOWN = 2;
32
+ const toFiniteNumber = (value) => {
33
+ if (typeof value !== "number" || !isFinite(value)) {
34
+ return null;
35
+ }
36
+ return value;
37
+ };
38
+ export const formatDurationCompact = (seconds) => {
39
+ let remainingSeconds = Math.floor(Math.abs(seconds));
40
+ const parts = [];
41
+ for (const unit of UNITS) {
42
+ if (parts.length >= MAX_UNITS_SHOWN) {
43
+ break;
44
+ }
45
+ const count = Math.floor(remainingSeconds / unit.seconds);
46
+ /*
47
+ * Skip leading zero units ("0d 5h"), but once a larger unit has been
48
+ * emitted a zero is still skipped rather than padded — "2d" is
49
+ * correct for exactly 48 hours, "2d 0h" is not how anyone says it.
50
+ */
51
+ if (count <= 0) {
52
+ continue;
53
+ }
54
+ parts.push(`${count}${unit.suffix}`);
55
+ remainingSeconds -= count * unit.seconds;
56
+ }
57
+ if (parts.length === 0) {
58
+ return "0s";
59
+ }
60
+ return parts.join(" ");
61
+ };
62
+ export const formatErrorBudgetRemaining = (seconds) => {
63
+ const numericSeconds = toFiniteNumber(seconds);
64
+ if (numericSeconds === null) {
65
+ return null;
66
+ }
67
+ if (numericSeconds < 0) {
68
+ return `${MINUS_SIGN}${formatDurationCompact(numericSeconds)} over budget`;
69
+ }
70
+ return `${formatDurationCompact(numericSeconds)} left`;
71
+ };
72
+ export const formatErrorBudgetRemainingOfTotal = (data) => {
73
+ const remainingText = formatErrorBudgetRemaining(data.remainingSeconds);
74
+ if (remainingText === null) {
75
+ return null;
76
+ }
77
+ const totalSeconds = toFiniteNumber(data.totalSeconds);
78
+ /*
79
+ * A zero total is a real state for a brand-new SLO (no elapsed window
80
+ * yet). "of 0s" adds nothing, so drop the suffix rather than print it.
81
+ */
82
+ if (totalSeconds === null || totalSeconds <= 0) {
83
+ return remainingText;
84
+ }
85
+ return `${remainingText} of ${formatDurationCompact(totalSeconds)}`;
86
+ };
87
+ //# sourceMappingURL=SloDuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SloDuration.js","sourceRoot":"","sources":["../../../../Utils/Slo/SloDuration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,+EAA+E;AAC/E,MAAM,UAAU,GAAW,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,KAAK,GAA+C;IACxD,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;IAC9B,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;IAC5B,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;CAC5B,CAAC;AAEF,MAAM,eAAe,GAAW,CAAC,CAAC;AAYlC,MAAM,cAAc,GAA2B,CAC7C,KAAgC,EACjB,EAAE;IACjB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,qBAAqB,GAAkC,CAClE,OAAe,EACP,EAAE;IACV,IAAI,gBAAgB,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAElE;;;;WAIG;QACH,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrC,gBAAgB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAgBF,MAAM,CAAC,MAAM,0BAA0B,GAAuC,CAC5E,OAAkC,EACnB,EAAE;IACjB,MAAM,cAAc,GAAkB,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9D,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,UAAU,GAAG,qBAAqB,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,CAAC;IAED,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC;AACzD,CAAC,CAAC;AAaF,MAAM,CAAC,MAAM,iCAAiC,GAC5C,CAAC,IAGA,EAAiB,EAAE;IAClB,MAAM,aAAa,GAAkB,0BAA0B,CAC7D,IAAI,CAAC,gBAAgB,CACtB,CAAC;IAEF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAkB,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEtE;;;OAGG;IACH,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,GAAG,aAAa,OAAO,qBAAqB,CAAC,YAAY,CAAC,EAAE,CAAC;AACtE,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Cadence constants shared by the SLO evaluation worker and every UI
3
+ * surface that describes what the worker produced.
4
+ *
5
+ * These numbers were previously duplicated as prose: the worker owned
6
+ * them, and the dashboard said "evaluated every few minutes" and "1×
7
+ * spends the budget exactly over the window" without ever naming the
8
+ * lookback the headline burn rate is actually measured over. A reader who
9
+ * compared the tile against a burn rate rule had no way to know they were
10
+ * measuring different spans. Naming them once here keeps the copy and the
11
+ * computation from drifting.
12
+ */
13
+ /** How often a due SLO is re-evaluated, and how far ahead the worker schedules the next run. */
14
+ export const SLO_EVALUATION_CADENCE_MINUTES = 5;
15
+ /**
16
+ * Lookback for the "current burn rate" column shown on the SLO overview
17
+ * and the dashboard SLO widget. Deliberately equal to the default
18
+ * fast-burn rule's long window, so the tile and that rule move together.
19
+ */
20
+ export const SLO_CURRENT_BURN_RATE_WINDOW_MINUTES = 60;
21
+ //# sourceMappingURL=SloEvaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SloEvaluation.js","sourceRoot":"","sources":["../../../../Utils/Slo/SloEvaluation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,gGAAgG;AAChG,MAAM,CAAC,MAAM,8BAA8B,GAAW,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAW,EAAE,CAAC"}