@oneuptime/common 14.0.2 → 14.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (765) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/AlertFeed.ts +2 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
  4. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
  5. package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
  6. package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
  7. package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
  8. package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
  9. package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
  10. package/Models/DatabaseModels/Incident.ts +55 -0
  11. package/Models/DatabaseModels/IncidentAlert.ts +540 -0
  12. package/Models/DatabaseModels/IncidentFeed.ts +2 -0
  13. package/Models/DatabaseModels/Index.ts +18 -0
  14. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
  15. package/Models/DatabaseModels/Project.ts +60 -0
  16. package/Models/DatabaseModels/RumApplication.ts +52 -1
  17. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  18. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  19. package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.ts +28 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.ts +89 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  25. package/Server/Middleware/MultipartFormData.ts +1 -1
  26. package/Server/Middleware/TelemetryIngest.ts +15 -8
  27. package/Server/Services/AlertReminderRuleService.ts +100 -24
  28. package/Server/Services/DatabaseServerEndpointService.ts +895 -0
  29. package/Server/Services/DatabaseServerFeedService.ts +128 -0
  30. package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
  31. package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
  32. package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
  33. package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
  34. package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
  35. package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
  36. package/Server/Services/DatabaseServerService.ts +4546 -0
  37. package/Server/Services/DatabaseService.ts +14 -8
  38. package/Server/Services/DockerResourceService.ts +43 -2
  39. package/Server/Services/IncidentAlertService.ts +1811 -0
  40. package/Server/Services/IncidentReminderRuleService.ts +103 -23
  41. package/Server/Services/IncidentService.ts +210 -10
  42. package/Server/Services/IncidentStateTimelineService.ts +24 -0
  43. package/Server/Services/Index.ts +18 -0
  44. package/Server/Services/InventoryItemService.ts +113 -5
  45. package/Server/Services/IoTDeviceService.ts +145 -37
  46. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  47. package/Server/Services/PodmanResourceService.ts +43 -2
  48. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  49. package/Server/Services/ServiceService.ts +1 -1
  50. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  51. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  52. package/Server/Services/UserService.ts +14 -1
  53. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  54. package/Server/Types/Database/QueryHelper.ts +30 -1
  55. package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
  56. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  57. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
  58. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  59. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
  60. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  61. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  62. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  63. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  64. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  65. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  66. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  67. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  69. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +24 -2
  70. package/Server/Utils/StartServer.ts +26 -6
  71. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  72. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  73. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  74. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  75. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  76. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  77. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  78. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  79. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  80. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  81. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  83. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  84. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  85. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  86. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  87. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  88. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  89. package/Tests/App/Dashboard/BulkIncidentLinkActions.test.tsx +869 -0
  90. package/Tests/App/Dashboard/CephMetricTooltips.test.tsx +1777 -0
  91. package/Tests/App/Dashboard/CloudFleetSummary.test.ts +8 -0
  92. package/Tests/App/Dashboard/CloudMetricTooltips.test.tsx +887 -0
  93. package/Tests/App/Dashboard/ContainerHostMetricTooltips.test.tsx +1309 -0
  94. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  95. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  96. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  97. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  98. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  99. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  100. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  101. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  102. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  103. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  104. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  105. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  106. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  107. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  108. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  109. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  110. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  111. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  112. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  113. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  114. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  115. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  116. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  117. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  118. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  119. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  120. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  121. package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +39 -0
  122. package/Tests/App/Dashboard/DockerSwarmClustersListTooltips.test.tsx +414 -0
  123. package/Tests/App/Dashboard/DockerSwarmMetricTooltips.test.ts +796 -0
  124. package/Tests/App/Dashboard/DockerSwarmOverviewTooltips.test.tsx +747 -0
  125. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  126. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  127. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +38 -18
  128. package/Tests/App/Dashboard/HostDetailViewTooltips.test.tsx +725 -0
  129. package/Tests/App/Dashboard/HostListColumnTooltips.test.tsx +472 -0
  130. package/Tests/App/Dashboard/HostMetricTooltips.test.ts +709 -0
  131. package/Tests/App/Dashboard/HostOverviewTooltips.test.tsx +698 -0
  132. package/Tests/App/Dashboard/HostTooltipHarness.ts +124 -0
  133. package/Tests/App/Dashboard/HostsListTooltips.test.tsx +395 -0
  134. package/Tests/App/Dashboard/IncidentAlertLinkDialog.test.tsx +691 -0
  135. package/Tests/App/Dashboard/IncidentAlertLinkHelpers.test.ts +458 -0
  136. package/Tests/App/Dashboard/IncidentAlertLinkPages.test.tsx +828 -0
  137. package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +231 -0
  138. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +689 -0
  139. package/Tests/App/Dashboard/IoTMetricTooltips.test.tsx +1123 -0
  140. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +837 -0
  141. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +699 -0
  142. package/Tests/App/Dashboard/KubernetesContainersTabTooltips.test.tsx +320 -0
  143. package/Tests/App/Dashboard/KubernetesCostTooltips.test.tsx +502 -0
  144. package/Tests/App/Dashboard/KubernetesInsightsTooltips.test.tsx +222 -0
  145. package/Tests/App/Dashboard/KubernetesResourceMetricTooltips.test.ts +561 -0
  146. package/Tests/App/Dashboard/KubernetesResourcePagesTooltips.test.tsx +1168 -0
  147. package/Tests/App/Dashboard/LinkIncidentAlertModal.test.tsx +154 -0
  148. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  149. package/Tests/App/Dashboard/MetricDescriptionRules.ts +170 -0
  150. package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +206 -0
  151. package/Tests/App/Dashboard/MetricDescriptionsConsistency.test.ts +275 -0
  152. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  153. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  154. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  155. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  156. package/Tests/App/Dashboard/NetworkDeviceTooltips.test.tsx +852 -0
  157. package/Tests/App/Dashboard/NetworkDiagnosticsTooltips.test.tsx +556 -0
  158. package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +1348 -0
  159. package/Tests/App/Dashboard/NetworkSiteTooltips.test.tsx +679 -0
  160. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  161. package/Tests/App/Dashboard/ProxmoxMetricTooltips.test.ts +592 -0
  162. package/Tests/App/Dashboard/ProxmoxOverviewTooltips.test.tsx +1002 -0
  163. package/Tests/App/Dashboard/ProxmoxResourcePageTooltips.test.tsx +923 -0
  164. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  165. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  166. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  167. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  168. package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +1066 -0
  169. package/Tests/App/Dashboard/RumOverviewPage.test.tsx +1195 -0
  170. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  171. package/Tests/App/Dashboard/ServerlessMetricTooltips.test.tsx +474 -0
  172. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  173. package/Tests/App/Dashboard/ServiceMetricTooltips.test.tsx +772 -0
  174. package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +56 -1
  175. package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +1207 -0
  176. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  177. package/Tests/App/Dashboard/TelemetryResourceTabTooltips.test.tsx +437 -0
  178. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  179. package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +801 -0
  180. package/Tests/App/Dashboard/VMwareOverviewTooltips.test.tsx +601 -0
  181. package/Tests/App/Dashboard/VMwareResourcePagesTooltips.test.tsx +646 -0
  182. package/Tests/App/Dashboard/VMwareTooltipHarness.ts +145 -0
  183. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  184. package/Tests/ClassStrings.ts +178 -0
  185. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  186. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  187. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  188. package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +554 -0
  189. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  190. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +117 -0
  191. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  192. package/Tests/RenderedMarkup.ts +518 -0
  193. package/Tests/ResponsiveVisibility.test.ts +490 -4
  194. package/Tests/ResponsiveVisibility.ts +505 -52
  195. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  196. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  197. package/Tests/Server/Infrastructure/Postgres/AddIncidentAlertMigration.test.ts +341 -0
  198. package/Tests/Server/Infrastructure/Postgres/AddSessionReplaySameOriginTracePropagationMigration.test.ts +247 -0
  199. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  200. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  201. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  202. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  203. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  204. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  205. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  206. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  207. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  208. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  209. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  210. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  211. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  212. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +903 -0
  213. package/Tests/Server/Services/IncidentAlertRegistration.test.ts +96 -0
  214. package/Tests/Server/Services/IncidentAlertService.test.ts +2225 -0
  215. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  216. package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +970 -0
  217. package/Tests/Server/Services/IncidentCreateFromAlerts.test.ts +1284 -0
  218. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  219. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  220. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  221. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  222. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  223. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  224. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  225. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  226. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  227. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  228. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  229. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  230. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  231. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  232. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  233. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  234. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  235. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  236. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  237. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  238. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  239. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  240. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  241. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  242. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  243. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  244. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  245. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  246. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  247. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  248. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  249. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  250. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  251. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  252. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
  253. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  254. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  255. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  256. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  257. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  258. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  259. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  260. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  261. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  262. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  263. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  264. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  265. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  266. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  267. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  268. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  269. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  270. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  271. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +103 -0
  272. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  273. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  274. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  275. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  276. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  277. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  278. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  279. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  280. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  281. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  282. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  283. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  284. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  285. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  286. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  287. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  288. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  289. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  290. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  291. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  292. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  293. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
  294. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
  295. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  296. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  297. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  298. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  299. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  300. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  301. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
  302. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  303. package/Tests/Types/Rum/WebVitals.test.ts +173 -0
  304. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  305. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  306. package/Tests/UI/Components/Card.test.tsx +93 -2
  307. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  308. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  309. package/Tests/UI/Components/FieldLabelInfoCardTooltip.test.tsx +413 -0
  310. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  311. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  312. package/Tests/UI/Components/InfoTooltip.test.tsx +242 -0
  313. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  314. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  315. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +207 -3
  316. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDeleteVerb.test.tsx +367 -0
  317. package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +275 -0
  318. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  319. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  320. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  321. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  322. package/Tests/UI/Components/TableHeaderTooltip.test.tsx +662 -0
  323. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  324. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  325. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +166 -9
  326. package/Tests/UI/Rum/RecordingHealthTooltips.test.tsx +447 -0
  327. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +164 -0
  328. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +6750 -0
  329. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  330. package/Tests/UI/Rum/ReplayRail.test.tsx +723 -12
  331. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +86 -0
  332. package/Tests/UI/Rum/ReplayScreenshot.test.ts +2124 -0
  333. package/Tests/UI/Rum/ReplayScreenshotActions.test.tsx +3288 -0
  334. package/Tests/UI/Rum/ReplayStage.test.tsx +62 -0
  335. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +983 -2
  336. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  337. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +149 -0
  338. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +107 -6
  339. package/Tests/UI/Rum/SessionReplayUsersTableTooltips.test.tsx +330 -0
  340. package/Tests/UI/Rum/UserFlowTooltips.test.tsx +886 -0
  341. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  342. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  343. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +80 -0
  344. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +23 -0
  345. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  346. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  347. package/Tests/UI/Utils/PermissionGate.test.ts +76 -0
  348. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  349. package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +696 -0
  350. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  351. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  352. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  353. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  354. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  355. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  356. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  357. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  358. package/Tests/Utils/Rum/SessionTraceState.test.ts +239 -0
  359. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  360. package/Tests/tsconfig.json +16 -0
  361. package/Types/AI/AIResourceContext.ts +7 -0
  362. package/Types/Dashboard/DashboardTemplates.ts +2 -1
  363. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  364. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  365. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  366. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  367. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  368. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  369. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  370. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  371. package/Types/Email/EmailTemplateType.ts +1 -0
  372. package/Types/Incident/IncidentAlertLink.ts +38 -0
  373. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  374. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  375. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  376. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  377. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  378. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  379. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  380. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  381. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  382. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  383. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  384. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  385. package/Types/Permission.ts +315 -0
  386. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  387. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  388. package/Types/Rules/RuleRun.ts +12 -0
  389. package/Types/Rum/SessionReplay.ts +25 -6
  390. package/Types/Rum/WebVitals.ts +52 -0
  391. package/Types/Telemetry/EntityType.ts +23 -0
  392. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  393. package/Types/Telemetry/ServiceType.ts +8 -0
  394. package/UI/Components/Banner/Banner.tsx +1 -1
  395. package/UI/Components/Card/Card.tsx +1 -1
  396. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  397. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  398. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  399. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  400. package/UI/Components/Detail/FieldLabel.tsx +8 -0
  401. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  402. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  403. package/UI/Components/Forms/BasicForm.tsx +1 -1
  404. package/UI/Components/Header/Header.tsx +1 -1
  405. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  406. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  407. package/UI/Components/InfoCard/InfoCard.tsx +47 -1
  408. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  409. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  410. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  411. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  412. package/UI/Components/ModelTable/BaseModelTable.tsx +99 -21
  413. package/UI/Components/ModelTable/Column.ts +5 -0
  414. package/UI/Components/Navbar/NavBar.tsx +9 -2
  415. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  416. package/UI/Components/Page/Page.tsx +1 -1
  417. package/UI/Components/Pagination/Pagination.tsx +3 -3
  418. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  419. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  420. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  421. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  422. package/UI/Components/Table/TableHeader.tsx +47 -2
  423. package/UI/Components/Table/Types/Column.ts +7 -0
  424. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  425. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  426. package/UI/Components/Tooltip/InfoTooltip.tsx +78 -0
  427. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  428. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  429. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  430. package/UI/Styles/Theme.css +8 -1
  431. package/UI/Utils/Navigation.ts +89 -42
  432. package/UI/Utils/PermissionGate.ts +11 -2
  433. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  434. package/UI/Utils/TelemetryService.ts +4 -3
  435. package/Utils/Incident/IncidentFromAlerts.ts +516 -0
  436. package/Utils/LabelRuleImportExport.ts +2 -0
  437. package/Utils/MetricUnitUtil.ts +103 -11
  438. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  439. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  440. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  441. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  442. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  443. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  444. package/Utils/Rum/SessionTraceState.ts +212 -0
  445. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  446. package/Utils/Telemetry/EntityKey.ts +176 -0
  447. package/Utils/ValueFormatter.ts +16 -0
  448. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  449. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/AlertFeed.js +2 -0
  451. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  452. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  453. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  454. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  455. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  456. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  457. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  458. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  459. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  460. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  461. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  462. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  463. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  464. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  465. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  466. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  467. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  468. package/build/dist/Models/DatabaseModels/IncidentAlert.js +553 -0
  469. package/build/dist/Models/DatabaseModels/IncidentAlert.js.map +1 -0
  470. package/build/dist/Models/DatabaseModels/IncidentFeed.js +2 -0
  471. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/Index.js +18 -0
  473. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/Project.js +62 -0
  476. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/RumApplication.js +53 -1
  478. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  480. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  482. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  484. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js +20 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js.map +1 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js +42 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js.map +1 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  495. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  496. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  497. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  498. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  499. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  500. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  501. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  502. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  503. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  504. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  505. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  506. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  507. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  508. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  509. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  510. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  511. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  512. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  513. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  514. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  515. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  516. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  517. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  518. package/build/dist/Server/Services/DatabaseService.js +8 -4
  519. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  520. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  521. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  522. package/build/dist/Server/Services/IncidentAlertService.js +1370 -0
  523. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -0
  524. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  525. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  526. package/build/dist/Server/Services/IncidentService.js +164 -12
  527. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  528. package/build/dist/Server/Services/IncidentStateTimelineService.js +21 -0
  529. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  530. package/build/dist/Server/Services/Index.js +18 -0
  531. package/build/dist/Server/Services/Index.js.map +1 -1
  532. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  533. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  534. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  535. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  536. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  537. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  538. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  539. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  540. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  541. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  542. package/build/dist/Server/Services/ServiceService.js +1 -1
  543. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  544. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  545. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  546. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  547. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  548. package/build/dist/Server/Services/UserService.js +13 -1
  549. package/build/dist/Server/Services/UserService.js.map +1 -1
  550. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  551. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  552. package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
  553. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  554. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
  555. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  556. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  557. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  558. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
  559. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  560. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  561. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  562. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  563. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  564. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  565. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  566. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  567. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  568. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  569. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  570. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  571. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  572. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  573. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  574. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  575. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  576. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  577. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  578. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  579. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  580. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  581. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  582. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +8 -0
  583. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  584. package/build/dist/Server/Utils/StartServer.js +20 -4
  585. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  586. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  587. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  588. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  589. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  590. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  591. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  592. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  593. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  594. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  595. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  596. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  597. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  598. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  599. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  600. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  601. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  602. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  603. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  604. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  605. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  606. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  607. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  608. package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
  609. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  610. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  611. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  612. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  613. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  614. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  615. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  616. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  617. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  618. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  619. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  620. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  621. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  622. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  623. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  624. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  625. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  626. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  627. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  628. package/build/dist/Types/Incident/IncidentAlertLink.js +34 -0
  629. package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -0
  630. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  631. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  632. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  633. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  634. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  635. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  636. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  637. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  638. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  639. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  640. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  641. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  642. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  643. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  644. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  645. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  646. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  647. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  648. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  649. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  650. package/build/dist/Types/Permission.js +276 -0
  651. package/build/dist/Types/Permission.js.map +1 -1
  652. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  653. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  654. package/build/dist/Types/Rules/RuleRun.js +4 -0
  655. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  656. package/build/dist/Types/Rum/WebVitals.js +25 -0
  657. package/build/dist/Types/Rum/WebVitals.js.map +1 -1
  658. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  659. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  660. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  661. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  662. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  663. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  664. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  665. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  666. package/build/dist/UI/Components/Card/Card.js +1 -1
  667. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  668. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  669. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  670. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  671. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  672. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  673. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  674. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  675. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  676. package/build/dist/UI/Components/Detail/FieldLabel.js +2 -0
  677. package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
  678. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  679. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  680. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  681. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  682. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  683. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  684. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  685. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  686. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  687. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  688. package/build/dist/UI/Components/InfoCard/InfoCard.js +22 -1
  689. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  690. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  691. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  692. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  693. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  694. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  695. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  696. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  697. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  698. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +70 -18
  699. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  700. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  701. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  702. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  703. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  704. package/build/dist/UI/Components/Page/Page.js +1 -1
  705. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  706. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  707. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  708. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  709. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  710. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  711. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  712. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  713. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  714. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  715. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  716. package/build/dist/UI/Components/Table/TableHeader.js +18 -2
  717. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  718. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  719. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  720. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  721. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  722. package/build/dist/UI/Components/Tooltip/InfoTooltip.js +28 -0
  723. package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -0
  724. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  725. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  726. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  727. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  728. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  729. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  730. package/build/dist/UI/Utils/Navigation.js +66 -33
  731. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  732. package/build/dist/UI/Utils/PermissionGate.js +4 -2
  733. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  734. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  735. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  736. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  737. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  738. package/build/dist/Utils/Incident/IncidentFromAlerts.js +306 -0
  739. package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -0
  740. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  741. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  742. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  743. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  744. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  745. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  746. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  747. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  748. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  749. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  750. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  751. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  752. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  753. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  754. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  755. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  756. package/build/dist/Utils/Rum/SessionTraceState.js +154 -0
  757. package/build/dist/Utils/Rum/SessionTraceState.js.map +1 -0
  758. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  759. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  760. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  761. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  762. package/build/dist/Utils/ValueFormatter.js +15 -0
  763. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  764. package/package.json +1 -1
  765. package/tsconfig.tests.json +7 -5
@@ -0,0 +1,801 @@
1
+ /*
2
+ * "Does this container run the database server, or something else that
3
+ * happens to use a database image?" — read from the program a Kubernetes
4
+ * container starts (`command` followed by `args`).
5
+ *
6
+ * It fails OPEN: a container is a possible server unless its command line
7
+ * proves otherwise. Proof is
8
+ * - a client, dump or admin tool as the program itself (`psql`,
9
+ * `redis-cli`, `pg_dump`, `mongosh`) — "client";
10
+ * - a keep-alive as the program itself (`sleep infinity`, `tail -f
11
+ * /dev/null`, `cat`), or a shell with no script to run (`bash`,
12
+ * `sh -i`) — "keep-alive";
13
+ * - a Redis-family Sentinel (`redis-sentinel`, `redis-server … --sentinel`)
14
+ * — "companion";
15
+ * - a `sh -c` script EVERY command of which is one of those, a shell
16
+ * keyword or builtin, or a plain utility (`echo`, `set -x`, `until …; do
17
+ * sleep 1; done`, `cp`) — so a script that starts anything else
18
+ * (`exec postgres`, a start script, `"$@"`, a nested shell) is a possible
19
+ * server however it begins.
20
+ * A launcher that runs the rest of its arguments as the command — `env`
21
+ * (with its flags and `NAME=value` words), `nohup`, `setsid`, `tini [--]`,
22
+ * `dumb-init [--]`, or an official image's `docker-entrypoint.sh` followed by
23
+ * a program — is looked through to the program it starts, at most
24
+ * MAX_WRAPPER_WORDS words deep; inside a script, `exec`, `env` and `nohup`
25
+ * (and `NAME=value` prefixes) are looked through the same way.
26
+ * `docker-entrypoint.sh -c …` starts the image's server with those flags.
27
+ * Whatever cannot be read — a script FILE (`bash /start.sh`), a launcher
28
+ * whose program is not a plain word (`gosu user …`, `timeout 30 …`), a
29
+ * heredoc, a script longer than MAX_SCRIPT_CHARACTERS, a script the
30
+ * projection lost — is a possible server: a false positive auto-archives
31
+ * later, a server that is never discovered is never seen at all.
32
+ *
33
+ * The rules read a REDUCED command line, which Postgres computes before a
34
+ * pod spec leaves the database (containerCommandProjectionSql) and
35
+ * reduceContainerCommand, its JavaScript twin, computes from a full spec:
36
+ * the launchers dropped, then the program's first word; for a shell, each of its first
37
+ * MAX_SHELL_ARGUMENTS arguments as either a flag or the set of command names
38
+ * it would run — each one on CONTAINER_COMMAND_KNOWN_WORDS or replaced by
39
+ * "?". Argument values, environment variables and every other word stay in
40
+ * Postgres. classifyContainerCommand always reduces first, and reducing a
41
+ * reduction changes nothing, so a full spec and a projected one classify
42
+ * alike by construction. Both twins are built from the same regular
43
+ * expression sources, written in the subset JavaScript and Postgres ARE
44
+ * read the same way (no `\s`, `.` or POSIX classes; whitespace spelled out),
45
+ * and DatabaseContainerCommandPostgres.test.ts holds them together.
46
+ */
47
+
48
+ export type ContainerCommandRole =
49
+ // The image's own entrypoint, or anything not proven to be something else.
50
+ | "server"
51
+ // A client, dump, restore or admin tool — or a script that runs only those.
52
+ | "client"
53
+ // A sleep / tail / cat, an interactive shell, or a script that only waits.
54
+ | "keep-alive"
55
+ // Part of the deployment but never the database (Redis-family Sentinel).
56
+ | "companion";
57
+
58
+ export interface ContainerCommandLike {
59
+ command?: Array<string | null> | undefined;
60
+ args?: Array<string | null> | undefined;
61
+ }
62
+
63
+ // The engines' clients, dump / restore / admin tools and benchmarks.
64
+ const CLIENT_PROGRAMS: ReadonlySet<string> = new Set<string>([
65
+ "arangodump",
66
+ "arangoexport",
67
+ "arangoimport",
68
+ "arangorestore",
69
+ "arangosh",
70
+ "bsondump",
71
+ "cassandra-stress",
72
+ "cbq",
73
+ "clickhouse-benchmark",
74
+ "clickhouse-client",
75
+ "clusterdb",
76
+ "cqlsh",
77
+ "createdb",
78
+ "createuser",
79
+ "cypher-shell",
80
+ "dropdb",
81
+ "dropuser",
82
+ "etcdctl",
83
+ "influx",
84
+ "keydb-benchmark",
85
+ "keydb-cli",
86
+ "mariabackup",
87
+ "mariadb",
88
+ "mariadb-admin",
89
+ "mariadb-backup",
90
+ "mariadb-binlog",
91
+ "mariadb-check",
92
+ "mariadb-dump",
93
+ "mariadb-import",
94
+ "mariadb-slap",
95
+ "memtier_benchmark",
96
+ "mongo",
97
+ "mongodump",
98
+ "mongoexport",
99
+ "mongofiles",
100
+ "mongoimport",
101
+ "mongorestore",
102
+ "mongosh",
103
+ "mongostat",
104
+ "mongotop",
105
+ "mysql",
106
+ "mysqladmin",
107
+ "mysqlbinlog",
108
+ "mysqlcheck",
109
+ "mysqldump",
110
+ "mysqlimport",
111
+ "mysqlpump",
112
+ "mysqlsh",
113
+ "mysqlslap",
114
+ "nodetool",
115
+ "pg_amcheck",
116
+ "pg_basebackup",
117
+ "pg_dump",
118
+ "pg_dumpall",
119
+ "pg_isready",
120
+ "pg_receivewal",
121
+ "pg_restore",
122
+ "pg_verifybackup",
123
+ "pgbench",
124
+ "psql",
125
+ "redis-benchmark",
126
+ "redis-check-aof",
127
+ "redis-check-rdb",
128
+ "redis-cli",
129
+ "reindexdb",
130
+ "sqlcmd",
131
+ "sqlplus",
132
+ "vacuumdb",
133
+ "valkey-benchmark",
134
+ "valkey-check-aof",
135
+ "valkey-check-rdb",
136
+ "valkey-cli",
137
+ "xtrabackup",
138
+ "ycqlsh",
139
+ "ysqlsh",
140
+ ]);
141
+
142
+ // Commands that only hold a debug pod open.
143
+ const KEEP_ALIVE_PROGRAMS: ReadonlySet<string> = new Set<string>([
144
+ "cat",
145
+ "sleep",
146
+ "tail",
147
+ "true",
148
+ ]);
149
+
150
+ const COMPANION_PROGRAMS: ReadonlySet<string> = new Set<string>([
151
+ "keydb-sentinel",
152
+ "redis-sentinel",
153
+ "valkey-sentinel",
154
+ ]);
155
+
156
+ // Servers that run as a Sentinel when given this flag.
157
+ const SENTINEL_FLAG: string = "--sentinel";
158
+ const SENTINEL_CAPABLE_SERVERS: ReadonlySet<string> = new Set<string>([
159
+ "keydb-server",
160
+ "redis-server",
161
+ "valkey-server",
162
+ ]);
163
+
164
+ /*
165
+ * Shell keywords, builtins and utilities that never start a server. Nothing
166
+ * here may run another program: `env`, `exec`, `eval`, `source` / `.`,
167
+ * `xargs`, `find`, `timeout`, `nohup`, `su`, `gosu` and the shells
168
+ * themselves are absent on purpose.
169
+ */
170
+ const SCRIPT_UTILITIES: ReadonlySet<string> = new Set<string>([
171
+ "!",
172
+ ":",
173
+ "[",
174
+ "[[",
175
+ "{",
176
+ "}",
177
+ "awk",
178
+ "base64",
179
+ "basename",
180
+ "break",
181
+ "case",
182
+ "cd",
183
+ "chmod",
184
+ "chown",
185
+ "continue",
186
+ "cp",
187
+ "curl",
188
+ "cut",
189
+ "date",
190
+ "declare",
191
+ "dirname",
192
+ "do",
193
+ "done",
194
+ "echo",
195
+ "elif",
196
+ "else",
197
+ "envsubst",
198
+ "esac",
199
+ "exit",
200
+ "export",
201
+ "expr",
202
+ "false",
203
+ "fi",
204
+ "for",
205
+ "getent",
206
+ "grep",
207
+ "gzip",
208
+ "head",
209
+ "hostname",
210
+ "id",
211
+ "if",
212
+ "in",
213
+ "install",
214
+ "jq",
215
+ "kill",
216
+ "ln",
217
+ "local",
218
+ "ls",
219
+ "mkdir",
220
+ "mktemp",
221
+ "mv",
222
+ "nslookup",
223
+ "printf",
224
+ "pwd",
225
+ "read",
226
+ "readonly",
227
+ "return",
228
+ "rm",
229
+ "sed",
230
+ "seq",
231
+ "set",
232
+ "shift",
233
+ "shopt",
234
+ "sort",
235
+ "tee",
236
+ "test",
237
+ "then",
238
+ "touch",
239
+ "tr",
240
+ "trap",
241
+ "typeset",
242
+ "ulimit",
243
+ "umask",
244
+ "uniq",
245
+ "unset",
246
+ "until",
247
+ "wait",
248
+ "wc",
249
+ "wget",
250
+ "while",
251
+ ]);
252
+
253
+ const SHELL_PROGRAMS: ReadonlySet<string> = new Set<string>([
254
+ "ash",
255
+ "bash",
256
+ "dash",
257
+ "sh",
258
+ "zsh",
259
+ ]);
260
+
261
+ /*
262
+ * Launchers that run the rest of their arguments as the command, after
263
+ * their own flags (`env -i`, `tini -g --`, `dumb-init --single-child`) and,
264
+ * for `env`, `NAME=value` words. A flag that takes a separate value
265
+ * (`env -u NAME`, `tini -e 143`) leaves that value as the "program", which
266
+ * reads as a possible server — never as a client.
267
+ */
268
+ const WRAPPER_PROGRAMS: ReadonlyArray<string> = [
269
+ "dumb-init",
270
+ "env",
271
+ "nohup",
272
+ "setsid",
273
+ "tini",
274
+ "tini-static",
275
+ ];
276
+
277
+ /*
278
+ * An official image's entrypoint: it runs its first argument as the
279
+ * command, unless that argument is a flag — then it starts the image's own
280
+ * server with those flags (`docker-entrypoint.sh -c max_connections=200`).
281
+ */
282
+ const ENTRYPOINT_PROGRAMS: ReadonlyArray<string> = ["docker-entrypoint.sh"];
283
+
284
+ // Launcher words read before the program; a longer chain is unreadable.
285
+ const MAX_WRAPPER_WORDS: number = 8;
286
+
287
+ /*
288
+ * The command names that may leave Postgres as themselves; any other
289
+ * command name leaves it as UNKNOWN_WORD. None of them can start a server.
290
+ */
291
+ export const CONTAINER_COMMAND_KNOWN_WORDS: ReadonlyArray<string> = Array.from(
292
+ new Set<string>([
293
+ ...Array.from(CLIENT_PROGRAMS),
294
+ ...Array.from(KEEP_ALIVE_PROGRAMS),
295
+ ...Array.from(COMPANION_PROGRAMS),
296
+ ...Array.from(SCRIPT_UTILITIES),
297
+ ]),
298
+ ).sort();
299
+
300
+ const KNOWN_WORDS: ReadonlySet<string> = new Set<string>(
301
+ CONTAINER_COMMAND_KNOWN_WORDS,
302
+ );
303
+
304
+ // A command name that is not a known word (or text that cannot be read).
305
+ const UNKNOWN_WORD: string = "?";
306
+
307
+ // A shell's arguments read after its program; more are marked UNKNOWN_WORD.
308
+ const MAX_SHELL_ARGUMENTS: number = 8;
309
+
310
+ /*
311
+ * A longer shell argument is not read (it reduces to "?"): it bounds what
312
+ * the candidate-pod query spends per container on a pathological inline
313
+ * script. Counted in characters (code points), as Postgres length() counts.
314
+ */
315
+ const MAX_SCRIPT_CHARACTERS: number = 16384;
316
+
317
+ // ---- the shared regular expressions ----------------------------------------
318
+
319
+ // Whitespace, spelled out: `\s` and [[:space:]] do not agree.
320
+ const WS: string = " \\t\\n\\r\\f\\v";
321
+
322
+ // The first word of argv[0], after any leading whitespace.
323
+ const PROGRAM_SOURCE: string = `^[${WS}]*([^${WS};&|=]+)`;
324
+
325
+ const SHELL_PROGRAM_SOURCE: string = "(^|/)(sh|bash|ash|dash|zsh)$";
326
+
327
+ // `-ecx`, `+o`, `--`, `--noprofile`: a shell argument kept verbatim.
328
+ const SHELL_OPTION_SOURCE: string =
329
+ "^([-+][A-Za-z]{0,8}|--|--[A-Za-z][A-Za-z-]{0,23})$";
330
+
331
+ // A launcher's flag (`-i`, `--`, `--single-child`) and an `env` NAME=value word.
332
+ const FLAG_WORD_SOURCE: string = "^-";
333
+ const ASSIGNMENT_WORD_SOURCE: string = "^[A-Za-z_][A-Za-z0-9_]*=";
334
+
335
+ /*
336
+ * A script is cleaned in this order, then its command names are read:
337
+ * line continuations → a space; backslash escapes → "?"; comments (outside
338
+ * quotes) dropped; quoted strings and `$( )` / `${ }` / backquote
339
+ * substitutions → "?"; redirections → a space; `NAME=value` words dropped.
340
+ */
341
+ const LINE_CONTINUATION_SOURCE: string = "\\\\\\r?\\n";
342
+ const ESCAPED_CHARACTER_SOURCE: string = "\\\\[^\\n]";
343
+ const COMMENT_SOURCE: string = `('[^']*'|"[^"]*")|(^|[${WS};&|()])#[^\\n]*`;
344
+ const QUOTED_SOURCE: string =
345
+ "'[^']*'|\"[^\"]*\"|`[^`]*`|\\$\\([^()]*\\)|\\$\\{[^}]*\\}";
346
+ const REDIRECTION_SOURCE: string = "&?[0-9]*[<>]+&?[0-9]*-?";
347
+ const ASSIGNMENT_SOURCE: string = `(^|[${WS};&|()])[A-Za-z_][A-Za-z0-9_]*=[^${WS};&|()]*`;
348
+
349
+ /*
350
+ * A command name: the first word after the start, a newline or one of
351
+ * `; & | ( )`, past any keyword that is followed by a command (`then`, `do`,
352
+ * `!`, `exec` …) or launcher that runs one (`env`, `nohup`; `NAME=value`
353
+ * words are already gone).
354
+ */
355
+ const COMMAND_WORD_SOURCE: string = `(?:^|[;&|()\\n])[${WS}]*(?:(?:if|then|else|elif|do|while|until|exec|time|env|nohup|!|\\{)[${WS}]+)*([^${WS};&|()]+)`;
356
+
357
+ const PROGRAM_REGEX: RegExp = new RegExp(PROGRAM_SOURCE);
358
+ const SHELL_PROGRAM_REGEX: RegExp = new RegExp(SHELL_PROGRAM_SOURCE, "i");
359
+ const SHELL_OPTION_REGEX: RegExp = new RegExp(SHELL_OPTION_SOURCE);
360
+ const FLAG_WORD_REGEX: RegExp = new RegExp(FLAG_WORD_SOURCE);
361
+ const ASSIGNMENT_WORD_REGEX: RegExp = new RegExp(ASSIGNMENT_WORD_SOURCE);
362
+ const WRAPPER_PROGRAM_SET: ReadonlySet<string> = new Set<string>(
363
+ WRAPPER_PROGRAMS,
364
+ );
365
+ const ENTRYPOINT_PROGRAM_SET: ReadonlySet<string> = new Set<string>(
366
+ ENTRYPOINT_PROGRAMS,
367
+ );
368
+ const LINE_CONTINUATION_REGEX: RegExp = new RegExp(
369
+ LINE_CONTINUATION_SOURCE,
370
+ "g",
371
+ );
372
+ const ESCAPED_CHARACTER_REGEX: RegExp = new RegExp(
373
+ ESCAPED_CHARACTER_SOURCE,
374
+ "g",
375
+ );
376
+ const COMMENT_REGEX: RegExp = new RegExp(COMMENT_SOURCE, "g");
377
+ const QUOTED_REGEX: RegExp = new RegExp(QUOTED_SOURCE, "g");
378
+ const REDIRECTION_REGEX: RegExp = new RegExp(REDIRECTION_SOURCE, "g");
379
+ const ASSIGNMENT_REGEX: RegExp = new RegExp(ASSIGNMENT_SOURCE, "g");
380
+
381
+ // A single-dash flag cluster with `c`: the shell runs its operand as a script.
382
+ const SCRIPT_FLAG_REGEX: RegExp = /^-[A-Za-z]*c/;
383
+ // `-o` / `+o` / `-O` / `+O` last in a cluster: the next argument is its value.
384
+ const VALUED_FLAG_REGEX: RegExp = /^[-+][A-Za-z]*[oO]$/;
385
+
386
+ // ---- the JavaScript twin -----------------------------------------------------
387
+
388
+ // A JSON array element as Postgres `->>` reads it.
389
+ function toText(value: unknown): string | null {
390
+ if (typeof value === "string") {
391
+ return value;
392
+ }
393
+ if (typeof value === "number" || typeof value === "boolean") {
394
+ return String(value);
395
+ }
396
+ return null;
397
+ }
398
+
399
+ function isLongerThan(value: string, characters: number): boolean {
400
+ // UTF-16 length is an upper bound on the code point count.
401
+ return value.length > characters && Array.from(value).length > characters;
402
+ }
403
+
404
+ function baseName(value: string): string {
405
+ return value.substring(value.lastIndexOf("/") + 1).toLowerCase();
406
+ }
407
+
408
+ // The command names a script runs, as a sorted "\n"-joined set.
409
+ function reduceScript(script: string): string {
410
+ const cleaned: string = script
411
+ .replace(LINE_CONTINUATION_REGEX, " ")
412
+ .replace(ESCAPED_CHARACTER_REGEX, "?")
413
+ .replace(COMMENT_REGEX, "$1$2")
414
+ .replace(QUOTED_REGEX, "?")
415
+ .replace(REDIRECTION_REGEX, " ")
416
+ .replace(ASSIGNMENT_REGEX, "$1");
417
+
418
+ const names: Set<string> = new Set<string>();
419
+ const commandWords: RegExp = new RegExp(COMMAND_WORD_SOURCE, "g");
420
+ let match: RegExpExecArray | null = commandWords.exec(cleaned);
421
+ while (match) {
422
+ const name: string = baseName(match[1]!);
423
+ names.add(KNOWN_WORDS.has(name) ? name : UNKNOWN_WORD);
424
+ match = commandWords.exec(cleaned);
425
+ }
426
+
427
+ return Array.from(names).sort().join("\n");
428
+ }
429
+
430
+ type LauncherWordKind =
431
+ | "wrapper"
432
+ | "entrypoint"
433
+ | "flag"
434
+ | "assignment"
435
+ | "other";
436
+
437
+ // What one argv word is to the launcher walk (the Postgres twin's CASE, in order).
438
+ function launcherWordKind(value: unknown): LauncherWordKind {
439
+ const text: string | null = toText(value);
440
+ if (text === null) {
441
+ return "other";
442
+ }
443
+ if (FLAG_WORD_REGEX.test(text)) {
444
+ return "flag";
445
+ }
446
+ if (ASSIGNMENT_WORD_REGEX.test(text)) {
447
+ return "assignment";
448
+ }
449
+ const program: RegExpExecArray | null = PROGRAM_REGEX.exec(text);
450
+ if (!program) {
451
+ return "other";
452
+ }
453
+ const name: string = baseName(program[1]!);
454
+ if (WRAPPER_PROGRAM_SET.has(name)) {
455
+ return "wrapper";
456
+ }
457
+ return ENTRYPOINT_PROGRAM_SET.has(name) ? "entrypoint" : "other";
458
+ }
459
+
460
+ /*
461
+ * `command ++ args` from the program a chain of launchers starts: the whole
462
+ * argv when it starts with no launcher; from the first word that is not a
463
+ * launcher, a launcher's flag or an `env` assignment; just the first
464
+ * launcher (a possible server) when that program is out of reach — more
465
+ * than MAX_WRAPPER_WORDS words deep, missing, or a flag handed to an
466
+ * image's entrypoint (which then starts the server with it).
467
+ */
468
+ function unwrapLaunchers(argv: ReadonlyArray<unknown>): ReadonlyArray<unknown> {
469
+ let previous: LauncherWordKind | null = null;
470
+ const last: number = Math.min(argv.length - 1, MAX_WRAPPER_WORDS);
471
+
472
+ for (let index: number = 0; index <= last; index++) {
473
+ const kind: LauncherWordKind = launcherWordKind(argv[index]);
474
+ const skipped: boolean =
475
+ kind === "wrapper" ||
476
+ kind === "entrypoint" ||
477
+ ((kind === "flag" || kind === "assignment") &&
478
+ (previous === "wrapper" ||
479
+ previous === "flag" ||
480
+ previous === "assignment"));
481
+
482
+ if (!skipped) {
483
+ if (index === 0) {
484
+ return argv;
485
+ }
486
+ return kind === "flag" || kind === "assignment"
487
+ ? argv.slice(0, 1)
488
+ : argv.slice(index);
489
+ }
490
+ previous = kind;
491
+ }
492
+
493
+ return argv.slice(0, 1);
494
+ }
495
+
496
+ /**
497
+ * The reduced command line containerCommandProjectionSql computes in
498
+ * Postgres, from a full `command ++ args`: launchers dropped (see
499
+ * unwrapLaunchers), then [] when there is no program; `[program]` (plus
500
+ * "--sentinel" when present) for anything but a shell; for a shell,
501
+ * `[program, …]` with each of its first MAX_SHELL_ARGUMENTS arguments kept
502
+ * when it is a flag and reduced to the command names it runs otherwise ("?"
503
+ * when longer than MAX_SCRIPT_CHARACTERS), and "?" appended when there are
504
+ * more.
505
+ */
506
+ export function reduceContainerCommand(
507
+ argv: ReadonlyArray<unknown>,
508
+ ): Array<string | null> {
509
+ return reduceProgramCommand(unwrapLaunchers(argv));
510
+ }
511
+
512
+ // reduceContainerCommand once the launchers are gone.
513
+ function reduceProgramCommand(
514
+ argv: ReadonlyArray<unknown>,
515
+ ): Array<string | null> {
516
+ const first: string | null = toText(argv[0]);
517
+ const program: RegExpExecArray | null =
518
+ first === null ? null : PROGRAM_REGEX.exec(first);
519
+ if (!program) {
520
+ return [];
521
+ }
522
+ const name: string = program[1]!;
523
+
524
+ if (!SHELL_PROGRAM_REGEX.test(name)) {
525
+ return argv.includes(SENTINEL_FLAG) ? [name, SENTINEL_FLAG] : [name];
526
+ }
527
+
528
+ const reduced: Array<string | null> = [name];
529
+ const last: number = Math.min(argv.length - 1, MAX_SHELL_ARGUMENTS);
530
+ for (let index: number = 1; index <= last; index++) {
531
+ const word: string | null = toText(argv[index]);
532
+ if (word === null) {
533
+ reduced.push(null);
534
+ } else if (SHELL_OPTION_REGEX.test(word)) {
535
+ reduced.push(word);
536
+ } else if (isLongerThan(word, MAX_SCRIPT_CHARACTERS)) {
537
+ reduced.push(UNKNOWN_WORD);
538
+ } else {
539
+ reduced.push(reduceScript(word));
540
+ }
541
+ }
542
+ if (argv.length > MAX_SHELL_ARGUMENTS + 1) {
543
+ reduced.push(UNKNOWN_WORD);
544
+ }
545
+ return reduced;
546
+ }
547
+
548
+ // ---- the rules ----------------------------------------------------------------
549
+
550
+ function roleOfScript(script: string): ContainerCommandRole {
551
+ let runsClient: boolean = false;
552
+ let runsCompanion: boolean = false;
553
+
554
+ for (const name of reduceScript(script).split("\n")) {
555
+ if (!name) {
556
+ continue;
557
+ }
558
+ if (COMPANION_PROGRAMS.has(name)) {
559
+ runsCompanion = true;
560
+ } else if (CLIENT_PROGRAMS.has(name)) {
561
+ runsClient = true;
562
+ } else if (!KEEP_ALIVE_PROGRAMS.has(name) && !SCRIPT_UTILITIES.has(name)) {
563
+ // Anything else, a nested shell or an unreadable word included.
564
+ return "server";
565
+ }
566
+ }
567
+
568
+ if (runsCompanion) {
569
+ return "companion";
570
+ }
571
+ return runsClient ? "client" : "keep-alive";
572
+ }
573
+
574
+ function roleOfReducedCommand(
575
+ reduced: ReadonlyArray<string | null>,
576
+ ): ContainerCommandRole {
577
+ // A gap (null) ends what can be trusted about the command line.
578
+ const words: Array<string> = [];
579
+ for (const word of reduced) {
580
+ if (typeof word !== "string") {
581
+ break;
582
+ }
583
+ words.push(word);
584
+ }
585
+
586
+ if (words.length === 0) {
587
+ // Neither command nor args: the image's entrypoint, i.e. the server.
588
+ return "server";
589
+ }
590
+
591
+ const program: string = baseName(words[0]!);
592
+
593
+ if (!SHELL_PROGRAMS.has(program)) {
594
+ if (
595
+ COMPANION_PROGRAMS.has(program) ||
596
+ (SENTINEL_CAPABLE_SERVERS.has(program) && words.includes(SENTINEL_FLAG))
597
+ ) {
598
+ return "companion";
599
+ }
600
+ if (CLIENT_PROGRAMS.has(program)) {
601
+ return "client";
602
+ }
603
+ if (KEEP_ALIVE_PROGRAMS.has(program) || SCRIPT_UTILITIES.has(program)) {
604
+ return "keep-alive";
605
+ }
606
+ return "server";
607
+ }
608
+
609
+ // A shell: walk its flags to its operand.
610
+ let runsScript: boolean = false;
611
+ let index: number = 1;
612
+ while (index < words.length) {
613
+ const word: string = words[index]!;
614
+ if (word === "--" || word === "-") {
615
+ index++;
616
+ break;
617
+ }
618
+ if (!SHELL_OPTION_REGEX.test(word)) {
619
+ break;
620
+ }
621
+ if (SCRIPT_FLAG_REGEX.test(word)) {
622
+ runsScript = true;
623
+ }
624
+ index += VALUED_FLAG_REGEX.test(word) ? 2 : 1;
625
+ }
626
+
627
+ const operand: string | undefined = words[index];
628
+ if (operand === undefined) {
629
+ // `bash`, `sh -i` are interactive; `sh -c` with its script lost is unreadable.
630
+ return runsScript ? "server" : "keep-alive";
631
+ }
632
+ if (!runsScript) {
633
+ // A script FILE: whatever it starts cannot be read here.
634
+ return "server";
635
+ }
636
+ return roleOfScript(operand);
637
+ }
638
+
639
+ /**
640
+ * What a Kubernetes container runs, from its `command` and `args` — a full
641
+ * spec's or the reduction CANDIDATE_PODS_SQL projects (pass that as
642
+ * `command`). See the file header for the rules.
643
+ */
644
+ export function classifyContainerCommand(
645
+ container: ContainerCommandLike,
646
+ ): ContainerCommandRole {
647
+ const command: unknown = container?.command;
648
+ const args: unknown = container?.args;
649
+ const argv: Array<unknown> = [
650
+ ...(Array.isArray(command) ? command : []),
651
+ ...(Array.isArray(args) ? args : []),
652
+ ];
653
+ return roleOfReducedCommand(reduceContainerCommand(argv));
654
+ }
655
+
656
+ // True when the container is proven to run a client, keep-alive or Sentinel — not a server.
657
+ export function isNonServerCommand(container: ContainerCommandLike): boolean {
658
+ return classifyContainerCommand(container) !== "server";
659
+ }
660
+
661
+ // ---- the Postgres twin ------------------------------------------------------
662
+
663
+ // A dollar-quoted literal: read verbatim whatever standard_conforming_strings is.
664
+ function sqlLiteral(value: string): string {
665
+ if (value.includes("$re$")) {
666
+ throw new Error("a projection literal cannot contain its own quote tag");
667
+ }
668
+ return `$re$${value}$re$`;
669
+ }
670
+
671
+ function sqlTextArray(values: ReadonlyArray<string>): string {
672
+ return `ARRAY[${values.map(sqlLiteral).join(", ")}]::text[]`;
673
+ }
674
+
675
+ /**
676
+ * The Postgres expression reduceContainerCommand is the twin of: a jsonb
677
+ * array computed from `argv` (a SQL expression for the jsonb array
678
+ * `command || args`), with `knownWords` (a SQL expression for a text[]
679
+ * holding CONTAINER_COMMAND_KNOWN_WORDS) deciding which command names may
680
+ * leave as themselves.
681
+ */
682
+ export function containerCommandProjectionSql(data: {
683
+ argv: string;
684
+ knownWords: string;
685
+ }): string {
686
+ const argv: string = data.argv;
687
+ const launcherName: string = `lower(regexp_replace(substring(lw.word from ${sqlLiteral(PROGRAM_SOURCE)}), '^.*/', ''))`;
688
+
689
+ // unwrapLaunchers' twin: the argv from the program a chain of launchers starts.
690
+ return `(
691
+ SELECT ${programCommandProjectionSql({
692
+ argv: "lu.argv",
693
+ knownWords: data.knownWords,
694
+ })}
695
+ FROM (
696
+ SELECT CASE
697
+ WHEN lf.position = 1 THEN ${argv}
698
+ WHEN lf.position IS NULL OR lf.kind IN ('flag', 'assignment')
699
+ THEN jsonb_build_array(${argv} -> 0)
700
+ ELSE (
701
+ SELECT jsonb_agg(le.value ORDER BY le.position)
702
+ FROM jsonb_array_elements(${argv}) WITH ORDINALITY AS le(value, position)
703
+ WHERE le.position >= lf.position
704
+ )
705
+ END AS argv
706
+ FROM (SELECT 1) AS lone
707
+ LEFT JOIN LATERAL (
708
+ SELECT lk.position, lk.kind
709
+ FROM (
710
+ SELECT lc.position, lc.kind,
711
+ lag(lc.kind) OVER (ORDER BY lc.position) AS previous
712
+ FROM (
713
+ SELECT lw.position,
714
+ CASE
715
+ WHEN lw.word ~ ${sqlLiteral(FLAG_WORD_SOURCE)} THEN 'flag'
716
+ WHEN lw.word ~ ${sqlLiteral(ASSIGNMENT_WORD_SOURCE)} THEN 'assignment'
717
+ WHEN ${launcherName} = ANY(${sqlTextArray(WRAPPER_PROGRAMS)}) THEN 'wrapper'
718
+ WHEN ${launcherName} = ANY(${sqlTextArray(ENTRYPOINT_PROGRAMS)}) THEN 'entrypoint'
719
+ ELSE 'other'
720
+ END AS kind
721
+ FROM jsonb_array_elements_text(${argv}) WITH ORDINALITY AS lw(word, position)
722
+ WHERE lw.position <= ${MAX_WRAPPER_WORDS + 1}
723
+ ) AS lc
724
+ ) AS lk
725
+ WHERE NOT (
726
+ lk.kind IN ('wrapper', 'entrypoint')
727
+ OR (
728
+ lk.kind IN ('flag', 'assignment')
729
+ AND COALESCE(lk.previous IN ('wrapper', 'flag', 'assignment'), false)
730
+ )
731
+ )
732
+ ORDER BY lk.position
733
+ LIMIT 1
734
+ ) AS lf ON true
735
+ ) AS lu
736
+ )`;
737
+ }
738
+
739
+ // reduceProgramCommand's twin: `argv` has no launcher in front any more.
740
+ function programCommandProjectionSql(data: {
741
+ argv: string;
742
+ knownWords: string;
743
+ }): string {
744
+ const argv: string = data.argv;
745
+
746
+ const cleanedScript: string = [
747
+ [LINE_CONTINUATION_SOURCE, " "],
748
+ [ESCAPED_CHARACTER_SOURCE, "?"],
749
+ [COMMENT_SOURCE, "\\1\\2"],
750
+ [QUOTED_SOURCE, "?"],
751
+ [REDIRECTION_SOURCE, " "],
752
+ [ASSIGNMENT_SOURCE, "\\1"],
753
+ ].reduce((expression: string, step: Array<string>): string => {
754
+ return `regexp_replace(${expression}, ${sqlLiteral(step[0]!)}, ${sqlLiteral(step[1]!)}, 'g')`;
755
+ }, "w.word");
756
+
757
+ return `(
758
+ SELECT CASE
759
+ WHEN p.program IS NULL THEN '[]'::jsonb
760
+ WHEN p.program !~* ${sqlLiteral(SHELL_PROGRAM_SOURCE)}
761
+ THEN jsonb_build_array(p.program)
762
+ || CASE WHEN ${argv} ? '${SENTINEL_FLAG}'
763
+ THEN '["${SENTINEL_FLAG}"]'::jsonb ELSE '[]'::jsonb END
764
+ ELSE jsonb_build_array(p.program)
765
+ || COALESCE((
766
+ SELECT jsonb_agg(
767
+ CASE
768
+ WHEN w.word IS NULL THEN NULL
769
+ WHEN w.word ~ ${sqlLiteral(SHELL_OPTION_SOURCE)} THEN w.word
770
+ WHEN length(w.word) > ${MAX_SCRIPT_CHARACTERS} THEN '${UNKNOWN_WORD}'
771
+ ELSE COALESCE((
772
+ SELECT string_agg(DISTINCT n.name COLLATE "C", chr(10) ORDER BY n.name COLLATE "C")
773
+ FROM (
774
+ SELECT CASE
775
+ WHEN b.name = ANY(${data.knownWords}) THEN b.name
776
+ ELSE '${UNKNOWN_WORD}'
777
+ END AS name
778
+ FROM regexp_matches(
779
+ ${cleanedScript},
780
+ ${sqlLiteral(COMMAND_WORD_SOURCE)},
781
+ 'g'
782
+ ) AS m(parts)
783
+ CROSS JOIN LATERAL (
784
+ SELECT lower(regexp_replace(m.parts[1], '^.*/', '')) AS name
785
+ ) AS b
786
+ ) AS n
787
+ ), '')
788
+ END
789
+ ORDER BY w.position
790
+ )
791
+ FROM jsonb_array_elements_text(${argv}) WITH ORDINALITY AS w(word, position)
792
+ WHERE w.position BETWEEN 2 AND ${MAX_SHELL_ARGUMENTS + 1}
793
+ ), '[]'::jsonb)
794
+ || CASE WHEN jsonb_array_length(${argv}) > ${MAX_SHELL_ARGUMENTS + 1}
795
+ THEN '["${UNKNOWN_WORD}"]'::jsonb ELSE '[]'::jsonb END
796
+ END
797
+ FROM (
798
+ SELECT substring(${argv} ->> 0 from ${sqlLiteral(PROGRAM_SOURCE)}) AS program
799
+ ) AS p
800
+ )`;
801
+ }