@oneuptime/common 12.0.24 → 12.0.26

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 (870) hide show
  1. package/Models/AnalyticsModels/Index.ts +2 -0
  2. package/Models/AnalyticsModels/Span.ts +101 -0
  3. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
  4. package/Models/DatabaseModels/AlertSeverity.ts +4 -1
  5. package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
  6. package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
  7. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
  8. package/Models/DatabaseModels/DetectionRule.ts +9 -3
  9. package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
  10. package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
  11. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
  12. package/Models/DatabaseModels/HostFeed.ts +625 -0
  13. package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
  14. package/Models/DatabaseModels/Index.ts +22 -0
  15. package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
  16. package/Models/DatabaseModels/Monitor.ts +87 -0
  17. package/Models/DatabaseModels/NetworkDevice.ts +96 -5
  18. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
  19. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
  20. package/Models/DatabaseModels/NetworkSite.ts +120 -0
  21. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
  22. package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
  23. package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
  24. package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
  25. package/Models/DatabaseModels/ServiceFeed.ts +625 -0
  26. package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
  28. package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
  29. package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
  30. package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
  31. package/Server/API/AlertAPI.ts +23 -1
  32. package/Server/API/BaseAPI.ts +14 -27
  33. package/Server/API/IncidentAPI.ts +41 -1
  34. package/Server/API/IncidentEpisodeAPI.ts +23 -1
  35. package/Server/API/MicrosoftTeamsAPI.ts +31 -2
  36. package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
  37. package/Server/API/SlackAPI.ts +48 -2
  38. package/Server/API/TelemetryAPI.ts +167 -42
  39. package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
  40. package/Server/API/UserTotpAuthAPI.ts +67 -1
  41. package/Server/API/UserWebAuthnAPI.ts +44 -1
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
  52. package/Server/Middleware/IdentityRateLimit.ts +53 -3
  53. package/Server/Middleware/SlackAuthorization.ts +96 -18
  54. package/Server/Services/AIService.ts +181 -41
  55. package/Server/Services/CephClusterFeedService.ts +99 -0
  56. package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
  57. package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
  58. package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
  59. package/Server/Services/CephClusterOwnerUserService.ts +123 -0
  60. package/Server/Services/CephClusterService.ts +223 -2
  61. package/Server/Services/CloudResourceFeedService.ts +99 -0
  62. package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
  63. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
  64. package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
  65. package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
  66. package/Server/Services/CloudResourceService.ts +227 -2
  67. package/Server/Services/DatabaseService.ts +265 -0
  68. package/Server/Services/DockerHostFeedService.ts +99 -0
  69. package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
  70. package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
  71. package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
  72. package/Server/Services/DockerHostOwnerUserService.ts +123 -0
  73. package/Server/Services/DockerHostService.ts +227 -2
  74. package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
  75. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
  76. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
  77. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
  78. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
  79. package/Server/Services/DockerSwarmClusterService.ts +229 -2
  80. package/Server/Services/EnterpriseLicenseService.ts +15 -7
  81. package/Server/Services/ExceptionAggregationService.ts +12 -2
  82. package/Server/Services/HostFeedService.ts +99 -0
  83. package/Server/Services/HostLabelRuleEngineService.ts +29 -0
  84. package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
  85. package/Server/Services/HostOwnerTeamService.ts +129 -0
  86. package/Server/Services/HostOwnerUserService.ts +123 -0
  87. package/Server/Services/HostService.ts +215 -2
  88. package/Server/Services/IncidentService.ts +11 -0
  89. package/Server/Services/Index.ts +24 -0
  90. package/Server/Services/KubernetesClusterFeedService.ts +99 -0
  91. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
  92. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
  93. package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
  94. package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
  95. package/Server/Services/KubernetesClusterService.ts +231 -2
  96. package/Server/Services/LogAggregationService.ts +23 -280
  97. package/Server/Services/MetricAggregationService.ts +98 -1
  98. package/Server/Services/MonitorService.ts +177 -13
  99. package/Server/Services/MonitorTemplateService.ts +111 -0
  100. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
  101. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
  102. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
  103. package/Server/Services/NetworkDeviceService.ts +750 -4
  104. package/Server/Services/NetworkInterfaceService.ts +415 -0
  105. package/Server/Services/NetworkSiteService.ts +485 -52
  106. package/Server/Services/PodmanHostFeedService.ts +99 -0
  107. package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
  108. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
  109. package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
  110. package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
  111. package/Server/Services/PodmanHostService.ts +227 -2
  112. package/Server/Services/ProjectService.ts +16 -10
  113. package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
  114. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
  115. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
  116. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
  117. package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
  118. package/Server/Services/ProxmoxClusterService.ts +225 -2
  119. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
  120. package/Server/Services/ServiceFeedService.ts +99 -0
  121. package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
  122. package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
  123. package/Server/Services/ServiceOwnerTeamService.ts +129 -0
  124. package/Server/Services/ServiceOwnerUserService.ts +123 -0
  125. package/Server/Services/ServiceService.ts +227 -3
  126. package/Server/Services/StatusPageSubscriberService.ts +7 -0
  127. package/Server/Services/TelemetryAttributeService.ts +13 -3
  128. package/Server/Services/TelemetrySourceMapService.ts +307 -0
  129. package/Server/Services/ThreatIntelFeedService.ts +222 -0
  130. package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
  131. package/Server/Services/TraceAggregationService.ts +101 -11
  132. package/Server/Services/UserService.ts +13 -6
  133. package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
  134. package/Server/Services/UserWebhookService.ts +11 -2
  135. package/Server/Static/Brand/README.md +38 -0
  136. package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
  137. package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
  138. package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
  139. package/Server/Static/Brand/favicons/favicon.ico +0 -0
  140. package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
  141. package/Server/Static/Brand/hou-wb.svg +1 -0
  142. package/Server/Static/Brand/oneuptime-logo.svg +1 -0
  143. package/Server/Static/Brand/ou-wb.svg +1 -0
  144. package/Server/Static/Vendor/README.md +4 -0
  145. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
  146. package/Server/Types/Database/AggregateBy.ts +83 -0
  147. package/Server/Types/Database/AggregateResultUtil.ts +126 -0
  148. package/Server/Types/Database/JSONColumnQuery.ts +18 -0
  149. package/Server/Types/Database/QueryHelper.ts +40 -0
  150. package/Server/Types/Database/QueryUtil.ts +26 -0
  151. package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
  152. package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
  153. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
  154. package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
  155. package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
  156. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
  157. package/Server/Utils/DataSource/HttpFetch.ts +18 -0
  158. package/Server/Utils/Database/RelationIdUtil.ts +42 -0
  159. package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
  160. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
  161. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
  162. package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
  163. package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
  164. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
  165. package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
  166. package/Server/Utils/Monitor/MonitorResource.ts +226 -49
  167. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
  168. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
  169. package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
  170. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
  171. package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
  172. package/Server/Utils/OnCallNotificationContext.ts +686 -0
  173. package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
  174. package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
  175. package/Server/Utils/Response.ts +11 -1
  176. package/Server/Utils/SSRFProtection.ts +230 -60
  177. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
  178. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
  179. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
  180. package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
  181. package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
  182. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
  183. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
  184. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
  185. package/Server/Utils/StartServer.ts +83 -56
  186. package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
  187. package/Server/Utils/Telemetry/LlmMetricSpend.ts +56 -5
  188. package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
  189. package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
  190. package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
  191. package/Server/Utils/VM/VMAPI.ts +3 -0
  192. package/Server/Utils/VM/VMRunner.ts +27 -1
  193. package/Server/Utils/VendorAssets.ts +42 -0
  194. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
  195. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
  196. package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
  197. package/Server/Views/Partials/Head.ejs +9 -9
  198. package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
  199. package/Server/Views/ViewMessage.ejs +11 -9
  200. package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
  201. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
  202. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
  203. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
  204. package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
  205. package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
  206. package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
  207. package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
  208. package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
  209. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
  210. package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
  211. package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
  212. package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
  213. package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
  214. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
  215. package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
  216. package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
  217. package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
  218. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
  219. package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
  220. package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
  221. package/Tests/Server/API/BaseAPI.test.ts +41 -0
  222. package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
  223. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
  224. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
  225. package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
  226. package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
  227. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
  228. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
  229. package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
  230. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
  231. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
  232. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
  233. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
  234. package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
  235. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
  236. package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
  237. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
  238. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
  239. package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
  240. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
  241. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
  242. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
  243. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
  244. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
  245. package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
  246. package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
  247. package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
  248. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
  249. package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
  250. package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
  251. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
  252. package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
  253. package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
  254. package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
  255. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
  256. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
  257. package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
  258. package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
  259. package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
  260. package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
  261. package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
  262. package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
  263. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
  264. package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
  265. package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
  266. package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
  267. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
  268. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
  269. package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
  270. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
  271. package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
  272. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
  273. package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
  274. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
  275. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
  276. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
  277. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
  278. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
  279. package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
  280. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
  281. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
  282. package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
  283. package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
  284. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
  285. package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
  286. package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
  287. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
  288. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
  289. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
  290. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
  291. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
  292. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
  293. package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
  294. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
  295. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
  296. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
  297. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
  298. package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
  299. package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
  300. package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
  301. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +37 -18
  302. package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +143 -2
  303. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
  304. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
  305. package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
  306. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
  307. package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
  308. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
  309. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
  310. package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
  311. package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
  312. package/Tests/Types/API/URLQueryString.test.ts +472 -0
  313. package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
  314. package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
  315. package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
  316. package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
  317. package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
  318. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
  319. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
  320. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
  321. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
  322. package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
  323. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
  324. package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +391 -0
  325. package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
  326. package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
  327. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
  328. package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
  329. package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
  330. package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
  331. package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
  332. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
  333. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
  334. package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
  335. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
  336. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
  337. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
  338. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
  339. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
  340. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
  341. package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
  342. package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
  343. package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
  344. package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
  345. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
  346. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
  347. package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
  348. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
  349. package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +298 -0
  350. package/Types/API/URL.ts +45 -10
  351. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
  352. package/Types/BaseDatabase/NotWildcard.ts +86 -0
  353. package/Types/BaseDatabase/Wildcard.ts +89 -0
  354. package/Types/BaseDatabase/WildcardPattern.ts +176 -0
  355. package/Types/Database/DateColumnValue.ts +184 -0
  356. package/Types/Database/TableColumn.ts +40 -5
  357. package/Types/Date.ts +37 -0
  358. package/Types/Email/EmailTemplateType.ts +1 -0
  359. package/Types/JSON.ts +8 -0
  360. package/Types/Log/LogQueryToFilter.ts +167 -129
  361. package/Types/Monitor/DockerAlertTemplates.ts +43 -12
  362. package/Types/Monitor/HostAlertTemplates.ts +31 -3
  363. package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
  364. package/Types/Monitor/MonitorStep.ts +49 -0
  365. package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
  366. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
  367. package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
  368. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
  369. package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
  370. package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
  371. package/Types/Permission.ts +411 -0
  372. package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
  373. package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
  374. package/Types/SerializableObjectDictionary.ts +8 -0
  375. package/Types/Telemetry/LlmConventions.ts +255 -0
  376. package/Types/Telemetry/LlmMetricConventions.ts +212 -7
  377. package/Types/Telemetry/SourceMap.ts +56 -0
  378. package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
  379. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
  380. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
  381. package/UI/Components/Icon/Icon.tsx +28 -1
  382. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
  383. package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
  384. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
  385. package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
  386. package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
  387. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
  388. package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
  389. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
  390. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
  391. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
  392. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
  393. package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
  394. package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
  395. package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
  396. package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
  397. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
  398. package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
  399. package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
  400. package/Utils/Telemetry/CrossSignalScope.ts +37 -39
  401. package/Utils/Telemetry/LlmMetricQuery.ts +83 -0
  402. package/build/dist/Models/AnalyticsModels/Index.js +2 -0
  403. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  404. package/build/dist/Models/AnalyticsModels/Span.js +89 -0
  405. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  406. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
  407. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
  408. package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
  409. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  410. package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
  411. package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
  412. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
  413. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
  414. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
  415. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  416. package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
  417. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  418. package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
  419. package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
  420. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
  421. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
  422. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
  423. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  424. package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
  425. package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
  426. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
  427. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  428. package/build/dist/Models/DatabaseModels/Index.js +22 -0
  429. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
  431. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
  432. package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
  433. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
  435. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  436. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
  437. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  438. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
  439. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  440. package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
  441. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  442. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
  443. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  444. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
  445. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
  446. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
  447. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
  448. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
  449. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
  451. package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
  452. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
  453. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
  454. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
  455. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
  456. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
  457. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  458. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
  459. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  460. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
  461. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  462. package/build/dist/Server/API/AlertAPI.js +18 -1
  463. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  464. package/build/dist/Server/API/BaseAPI.js +11 -20
  465. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  466. package/build/dist/Server/API/IncidentAPI.js +35 -1
  467. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  468. package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
  469. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  470. package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
  471. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  472. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
  473. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  474. package/build/dist/Server/API/SlackAPI.js +45 -2
  475. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  476. package/build/dist/Server/API/TelemetryAPI.js +100 -35
  477. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  478. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
  479. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  480. package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
  481. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  482. package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
  483. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
  495. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
  496. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
  497. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
  498. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
  499. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
  500. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  504. package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
  505. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  506. package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
  507. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  508. package/build/dist/Server/Services/AIService.js +177 -30
  509. package/build/dist/Server/Services/AIService.js.map +1 -1
  510. package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
  511. package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
  512. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
  513. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  514. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
  515. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  516. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
  517. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
  518. package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
  519. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
  520. package/build/dist/Server/Services/CephClusterService.js +175 -1
  521. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  522. package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
  523. package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
  524. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
  525. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  526. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
  527. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  528. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
  529. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
  530. package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
  531. package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
  532. package/build/dist/Server/Services/CloudResourceService.js +177 -1
  533. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  534. package/build/dist/Server/Services/DatabaseService.js +201 -0
  535. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  536. package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
  537. package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
  538. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
  539. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  540. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
  541. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  542. package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
  543. package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
  544. package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
  545. package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
  546. package/build/dist/Server/Services/DockerHostService.js +177 -1
  547. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  548. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
  549. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
  550. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
  551. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  552. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
  553. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  554. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
  555. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
  556. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
  557. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
  558. package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
  559. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  560. package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
  561. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  562. package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
  563. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  564. package/build/dist/Server/Services/HostFeedService.js +89 -0
  565. package/build/dist/Server/Services/HostFeedService.js.map +1 -0
  566. package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
  567. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  568. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
  569. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  570. package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
  571. package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
  572. package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
  573. package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
  574. package/build/dist/Server/Services/HostService.js +175 -1
  575. package/build/dist/Server/Services/HostService.js.map +1 -1
  576. package/build/dist/Server/Services/IncidentService.js +10 -0
  577. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  578. package/build/dist/Server/Services/Index.js +24 -0
  579. package/build/dist/Server/Services/Index.js.map +1 -1
  580. package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
  581. package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
  582. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
  583. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  584. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
  585. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  586. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
  587. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
  588. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
  589. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
  590. package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
  591. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  592. package/build/dist/Server/Services/LogAggregationService.js +19 -196
  593. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  594. package/build/dist/Server/Services/MetricAggregationService.js +59 -0
  595. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  596. package/build/dist/Server/Services/MonitorService.js +115 -13
  597. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  598. package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
  599. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  600. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
  601. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  602. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
  603. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  604. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
  605. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  606. package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
  607. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  608. package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
  609. package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
  610. package/build/dist/Server/Services/NetworkSiteService.js +408 -47
  611. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  612. package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
  613. package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
  614. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
  615. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  616. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
  617. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  618. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
  619. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
  620. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
  621. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
  622. package/build/dist/Server/Services/PodmanHostService.js +177 -1
  623. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  624. package/build/dist/Server/Services/ProjectService.js +40 -30
  625. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  626. package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
  627. package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
  628. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
  629. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  630. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
  631. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  632. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
  633. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
  634. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
  635. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
  636. package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
  637. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  638. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
  639. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  640. package/build/dist/Server/Services/ServiceFeedService.js +89 -0
  641. package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
  642. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
  643. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  644. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
  645. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  646. package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
  647. package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
  648. package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
  649. package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
  650. package/build/dist/Server/Services/ServiceService.js +173 -2
  651. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  652. package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
  653. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  654. package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
  655. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  656. package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
  657. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
  658. package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
  659. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
  660. package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
  661. package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
  662. package/build/dist/Server/Services/TraceAggregationService.js +62 -6
  663. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  664. package/build/dist/Server/Services/UserService.js +22 -13
  665. package/build/dist/Server/Services/UserService.js.map +1 -1
  666. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
  667. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
  668. package/build/dist/Server/Services/UserWebhookService.js +11 -2
  669. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  670. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
  671. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  672. package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
  673. package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
  674. package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
  675. package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
  676. package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
  677. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
  678. package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
  679. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  680. package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
  681. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  682. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
  683. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  684. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  685. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  686. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
  687. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  688. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
  689. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  690. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
  691. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
  692. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
  693. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  694. package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
  695. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  696. package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
  697. package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
  698. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
  699. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  700. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
  701. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  702. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
  703. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  704. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
  705. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
  706. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
  707. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  708. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
  709. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  710. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
  711. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  712. package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
  713. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  714. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
  715. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  716. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
  717. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  718. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
  719. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
  720. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
  721. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
  722. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
  723. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
  724. package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
  725. package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
  726. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
  727. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
  728. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
  729. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
  730. package/build/dist/Server/Utils/Response.js +12 -1
  731. package/build/dist/Server/Utils/Response.js.map +1 -1
  732. package/build/dist/Server/Utils/SSRFProtection.js +160 -58
  733. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  734. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
  735. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
  736. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
  737. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  738. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
  739. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  740. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
  741. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
  742. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
  743. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
  744. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
  745. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
  746. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
  747. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
  748. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
  749. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
  750. package/build/dist/Server/Utils/StartServer.js +70 -44
  751. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  752. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
  753. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  754. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +52 -3
  755. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -1
  756. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
  757. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  758. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
  759. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
  760. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
  761. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
  762. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  763. package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
  764. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  765. package/build/dist/Server/Utils/VendorAssets.js +29 -0
  766. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  767. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
  768. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  769. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
  770. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  771. package/build/dist/Types/API/URL.js +40 -10
  772. package/build/dist/Types/API/URL.js.map +1 -1
  773. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
  774. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  775. package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
  776. package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
  777. package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
  778. package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
  779. package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
  780. package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
  781. package/build/dist/Types/Database/DateColumnValue.js +125 -0
  782. package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
  783. package/build/dist/Types/Database/TableColumn.js +18 -2
  784. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  785. package/build/dist/Types/Date.js +31 -0
  786. package/build/dist/Types/Date.js.map +1 -1
  787. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  788. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  789. package/build/dist/Types/JSON.js +2 -0
  790. package/build/dist/Types/JSON.js.map +1 -1
  791. package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
  792. package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
  793. package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
  794. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  795. package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
  796. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  797. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
  798. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  799. package/build/dist/Types/Monitor/MonitorStep.js +40 -0
  800. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  801. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
  802. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  803. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
  804. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  805. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
  806. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
  807. package/build/dist/Types/Permission.js +354 -0
  808. package/build/dist/Types/Permission.js.map +1 -1
  809. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
  810. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
  811. package/build/dist/Types/SerializableObjectDictionary.js +8 -0
  812. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  813. package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
  814. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  815. package/build/dist/Types/Telemetry/LlmMetricConventions.js +197 -5
  816. package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -1
  817. package/build/dist/Types/Telemetry/SourceMap.js +9 -0
  818. package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
  819. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
  820. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
  821. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
  822. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  823. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
  824. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  825. package/build/dist/UI/Components/Icon/Icon.js +28 -1
  826. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  827. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
  828. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  829. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
  830. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
  831. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
  832. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  833. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
  834. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  835. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
  836. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
  837. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
  838. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
  839. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
  840. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  841. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
  842. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  843. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  844. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
  845. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  846. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
  847. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
  848. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
  849. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
  850. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
  851. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
  852. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
  853. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
  854. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
  855. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
  856. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
  857. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  858. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
  859. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
  860. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
  861. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
  862. package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
  863. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  864. package/build/dist/Utils/Telemetry/LlmMetricQuery.js +57 -1
  865. package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -1
  866. package/package.json +2 -1
  867. package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
  868. package/Types/Log/LogQueryParser.ts +0 -252
  869. package/build/dist/Types/Log/LogQueryParser.js +0 -200
  870. package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
@@ -4,6 +4,14 @@ import LlmSpanUtil, {
4
4
  import { AttributeType } from "../../../../Server/Utils/Telemetry/Telemetry";
5
5
  import Dictionary from "../../../../Types/Dictionary";
6
6
  import { LlmModelPrice } from "../../../../Types/Telemetry/LlmCostCatalog";
7
+ import {
8
+ LlmEndUserAttributeKeys,
9
+ LlmTeamAttributeKeys,
10
+ LlmUserEmailAttributeKeys,
11
+ LlmUserIdAttributeKeys,
12
+ RESOURCE_ATTRIBUTE_KEY_PREFIX,
13
+ withResourcePrefixedKeys,
14
+ } from "../../../../Types/Telemetry/LlmConventions";
7
15
  import { describe, expect, test } from "@jest/globals";
8
16
 
9
17
  type Attrs = Dictionary<AttributeType | Array<AttributeType>>;
@@ -542,3 +550,799 @@ describe("LlmSpanUtil.extract — project price overrides", () => {
542
550
  expect(fields.llmCost).toBe(0);
543
551
  });
544
552
  });
553
+
554
+ /*
555
+ * Employee identity extraction.
556
+ *
557
+ * The class of bug this block prevents is WRONG INTERNAL CHARGEBACK, in three
558
+ * flavours, each of which is silent — the columns are populated, the
559
+ * dashboards render, and the numbers are simply attributed to the wrong
560
+ * person:
561
+ *
562
+ * 1. Preference-order drift. Every list here is ordered preferred-first and
563
+ * the extractor returns the FIRST present key. If someone reorders a
564
+ * list (or the getString loop stops short-circuiting), a span carrying
565
+ * both the semconv key and a vendor fallback flips to the fallback and
566
+ * the same human shows up under two different ids.
567
+ * 2. Customer/employee conflation. gen_ai.user, llm.user and LiteLLM's
568
+ * end_user_id carry the CALLER'S OWN CUSTOMER. Mapping one into the
569
+ * employee columns turns a support bot's 40k customers into 40k phantom
570
+ * employees and zeroes out the engineer who actually owns the spend.
571
+ * 3. Gate erosion. user.id / user.email / team.id are GENERIC OTel keys
572
+ * that RUM and plain HTTP spans carry. If the isLlmSpan gate is dropped,
573
+ * the columns and their skip indexes get stamped onto the entire span
574
+ * fleet — the highest-volume class there is — to serve a reader that
575
+ * only ever queries LLM rows.
576
+ * 4. Tier omission. Ingest flattens RESOURCE attributes with a "resource."
577
+ * prefix, so identity set once per process — which is the only thing
578
+ * OTEL_RESOURCE_ATTRIBUTES can do, and what Cursor documents for
579
+ * cursor.user.id — arrives as `resource.user.id`, never `user.id`. A
580
+ * list of bare keys alone matches nothing at all, and every column is
581
+ * silently empty.
582
+ */
583
+
584
+ /*
585
+ * The FULL expected key order, written out as literals ON PURPOSE.
586
+ *
587
+ * Two tiers, in this order and no other: every SPAN spelling first, then the
588
+ * same list again resource-prefixed. A span attribute describes one call and
589
+ * a resource attribute describes the whole process, so the span attribute is
590
+ * the more specific statement and has to win when both are present.
591
+ */
592
+ const EXPECTED_USER_ID_KEY_ORDER: Array<string> = [
593
+ "user.id",
594
+ "enduser.id",
595
+ "litellm.metadata.user_api_key_user_id",
596
+ "metadata.user_api_key_user_id",
597
+ "traceloop.association.properties.user_id",
598
+ "langfuse.user.id",
599
+ "user.account_uuid",
600
+ "user.account_id",
601
+ "cursor.user.id",
602
+ "resource.user.id",
603
+ "resource.enduser.id",
604
+ "resource.litellm.metadata.user_api_key_user_id",
605
+ "resource.metadata.user_api_key_user_id",
606
+ "resource.traceloop.association.properties.user_id",
607
+ "resource.langfuse.user.id",
608
+ "resource.user.account_uuid",
609
+ "resource.user.account_id",
610
+ "resource.cursor.user.id",
611
+ ];
612
+
613
+ const EXPECTED_USER_EMAIL_KEY_ORDER: Array<string> = [
614
+ "user.email",
615
+ "litellm.metadata.user_api_key_user_email",
616
+ "metadata.user_api_key_user_email",
617
+ "traceloop.association.properties.user_email",
618
+ "enduser.email",
619
+ "resource.user.email",
620
+ "resource.litellm.metadata.user_api_key_user_email",
621
+ "resource.metadata.user_api_key_user_email",
622
+ "resource.traceloop.association.properties.user_email",
623
+ "resource.enduser.email",
624
+ ];
625
+
626
+ const EXPECTED_TEAM_KEY_ORDER: Array<string> = [
627
+ "team.id",
628
+ "team",
629
+ "cost_center",
630
+ "department",
631
+ "litellm.metadata.user_api_key_team_id",
632
+ "litellm.team.id",
633
+ "metadata.user_api_key_team_id",
634
+ "cursor.team.id",
635
+ "resource.team.id",
636
+ "resource.team",
637
+ "resource.cost_center",
638
+ "resource.department",
639
+ "resource.litellm.metadata.user_api_key_team_id",
640
+ "resource.litellm.team.id",
641
+ "resource.metadata.user_api_key_team_id",
642
+ "resource.cursor.team.id",
643
+ ];
644
+
645
+ describe("LlmSpanUtil.extract — employee identity", () => {
646
+ /*
647
+ * Every recognized key, on its own, populates its column. A key that is
648
+ * listed but never read is worse than one that is absent: the list is the
649
+ * documentation, and a reader trusts it.
650
+ */
651
+ test.each(LlmUserIdAttributeKeys)(
652
+ "user id key %s is recognized on its own",
653
+ (key: string) => {
654
+ const attrs: Attrs = {
655
+ "gen_ai.system": "openai",
656
+ [key]: "employee-value",
657
+ };
658
+
659
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("employee-value");
660
+ },
661
+ );
662
+
663
+ test.each(LlmUserEmailAttributeKeys)(
664
+ "user email key %s is recognized on its own",
665
+ (key: string) => {
666
+ const attrs: Attrs = {
667
+ "gen_ai.system": "openai",
668
+ [key]: "engineer@example.com",
669
+ };
670
+
671
+ expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe(
672
+ "engineer@example.com",
673
+ );
674
+ },
675
+ );
676
+
677
+ test.each(LlmTeamAttributeKeys)(
678
+ "team key %s is recognized on its own",
679
+ (key: string) => {
680
+ const attrs: Attrs = {
681
+ "gen_ai.system": "openai",
682
+ [key]: "platform",
683
+ };
684
+
685
+ expect(LlmSpanUtil.extract(attrs).llmTeam).toBe("platform");
686
+ },
687
+ );
688
+
689
+ /*
690
+ * LiteLLM proxy, DEFAULT configuration.
691
+ *
692
+ * This block exists because we shipped the wrong spelling once. The
693
+ * "litellm."-namespaced attributes only appear under LiteLLM's opt-in
694
+ * OpenTelemetry v2 mode (LITELLM_OTEL_V2, which defaults to false). The
695
+ * default `otel` callback stamps its metadata with a bare "metadata."
696
+ * prefix instead — every key in METRIC_METADATA_KEYS, assigned as
697
+ * `common_attrs[f"metadata.{key}"]` in
698
+ * litellm/integrations/opentelemetry.py.
699
+ *
700
+ * The consequence of recognizing only the v2 spelling was silent and total:
701
+ * a stock LiteLLM proxy issuing one virtual key per employee — the exact
702
+ * architecture our AI-gateway guide recommends as the cleanest chargeback
703
+ * setup — produced no attribution at all, with every gateway dollar landing
704
+ * in the Unattributed row and nothing anywhere to explain why.
705
+ *
706
+ * The end-user assertions are the other half: LiteLLM carries the DOWNSTREAM
707
+ * CUSTOMER in the sibling key user_api_key_end_user_id (and, in v2, in the
708
+ * dedicated litellm.end_user.id). Those must never reach an employee column,
709
+ * or a SaaS customer's id gets billed to an engineer.
710
+ */
711
+ test("a default LiteLLM proxy attributes the key owner, not nobody", () => {
712
+ const fields: LlmSpanFields = LlmSpanUtil.extract({
713
+ "gen_ai.system": "openai",
714
+ "gen_ai.request.model": "gpt-4o",
715
+ "metadata.user_api_key_user_id": "user_42",
716
+ "metadata.user_api_key_user_email": "engineer@example.com",
717
+ "metadata.user_api_key_team_id": "team_platform",
718
+ });
719
+
720
+ expect(fields.llmUserId).toBe("user_42");
721
+ expect(fields.llmUserEmail).toBe("engineer@example.com");
722
+ expect(fields.llmTeam).toBe("team_platform");
723
+ });
724
+
725
+ test("a LiteLLM v2 proxy attributes the key owner too", () => {
726
+ const fields: LlmSpanFields = LlmSpanUtil.extract({
727
+ "gen_ai.system": "anthropic",
728
+ "gen_ai.request.model": "claude-sonnet-4",
729
+ "litellm.metadata.user_api_key_user_id": "user_42",
730
+ "litellm.metadata.user_api_key_user_email": "engineer@example.com",
731
+ "litellm.team.id": "team_platform",
732
+ });
733
+
734
+ expect(fields.llmUserId).toBe("user_42");
735
+ expect(fields.llmUserEmail).toBe("engineer@example.com");
736
+ expect(fields.llmTeam).toBe("team_platform");
737
+ });
738
+
739
+ test.each([
740
+ ["metadata.user_api_key_end_user_id", "v1 default spelling"],
741
+ ["litellm.metadata.user_api_key_end_user_id", "v2 metadata spelling"],
742
+ ["litellm.end_user.id", "v2 dedicated attribute"],
743
+ ])(
744
+ "LiteLLM's downstream customer never becomes the employee (%s — %s)",
745
+ (key: string) => {
746
+ const fields: LlmSpanFields = LlmSpanUtil.extract({
747
+ "gen_ai.system": "openai",
748
+ "gen_ai.request.model": "gpt-4o",
749
+ [key]: "customer_abc",
750
+ });
751
+
752
+ expect(fields.llmUserId).toBe("");
753
+ expect(fields.llmUserEmail).toBe("");
754
+ expect(fields.llmTeam).toBe("");
755
+ },
756
+ );
757
+
758
+ test("the key owner is billed even when a customer id rides along", () => {
759
+ /*
760
+ * The realistic shape: a SaaS product routing its own customers' traffic
761
+ * through a per-engineer virtual key. Both ids are present on one span and
762
+ * they must land in different places — the employee in the identity
763
+ * columns, the customer nowhere near them.
764
+ */
765
+ const fields: LlmSpanFields = LlmSpanUtil.extract({
766
+ "gen_ai.system": "openai",
767
+ "gen_ai.request.model": "gpt-4o",
768
+ "metadata.user_api_key_user_id": "user_42",
769
+ "metadata.user_api_key_end_user_id": "customer_abc",
770
+ });
771
+
772
+ expect(fields.llmUserId).toBe("user_42");
773
+ expect(fields.llmUserEmail).toBe("");
774
+ });
775
+
776
+ /*
777
+ * Preference order, pinned to LITERAL key strings in a LITERAL order.
778
+ *
779
+ * The obvious way to write this — derive the fixture and the expectation
780
+ * from the array under test — is worse than no test at all: it passes under
781
+ * ANY reordering of the array, so it certifies a property it cannot
782
+ * actually check while looking like it does. The literal constants above
783
+ * are the expectation; the toEqual tests below bolt each constant to its
784
+ * exported array, and the behavioural tests drive the extractor from the
785
+ * constant. Reorder the array and the toEqual fails; break the extractor's
786
+ * first-match-wins loop and the behavioural test fails.
787
+ */
788
+ test("the user id list is exactly this order", () => {
789
+ expect(LlmUserIdAttributeKeys).toEqual(EXPECTED_USER_ID_KEY_ORDER);
790
+ });
791
+
792
+ test("the user email list is exactly this order", () => {
793
+ expect(LlmUserEmailAttributeKeys).toEqual(EXPECTED_USER_EMAIL_KEY_ORDER);
794
+ });
795
+
796
+ test("the team list is exactly this order", () => {
797
+ expect(LlmTeamAttributeKeys).toEqual(EXPECTED_TEAM_KEY_ORDER);
798
+ });
799
+
800
+ /*
801
+ * For each key, a span carrying it plus every key after it must resolve to
802
+ * that key. Driven off the literal orders above, so a single reorder
803
+ * anywhere fails.
804
+ */
805
+ test.each(
806
+ EXPECTED_USER_ID_KEY_ORDER.map((key: string, index: number) => {
807
+ return [key, index] as [string, number];
808
+ }),
809
+ )("user id key %s beats every key after it", (key: string, index: number) => {
810
+ const attrs: Attrs = { "gen_ai.system": "openai" };
811
+
812
+ for (const lower of EXPECTED_USER_ID_KEY_ORDER.slice(index)) {
813
+ attrs[lower] = `value-of-${lower}`;
814
+ }
815
+
816
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe(`value-of-${key}`);
817
+ });
818
+
819
+ test.each(
820
+ EXPECTED_USER_EMAIL_KEY_ORDER.map((key: string, index: number) => {
821
+ return [key, index] as [string, number];
822
+ }),
823
+ )(
824
+ "user email key %s beats every key after it",
825
+ (key: string, index: number) => {
826
+ const attrs: Attrs = { "gen_ai.system": "openai" };
827
+
828
+ for (const lower of EXPECTED_USER_EMAIL_KEY_ORDER.slice(index)) {
829
+ attrs[lower] = `${lower}@example.com`;
830
+ }
831
+
832
+ expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe(
833
+ `${key}@example.com`,
834
+ );
835
+ },
836
+ );
837
+
838
+ test.each(
839
+ EXPECTED_TEAM_KEY_ORDER.map((key: string, index: number) => {
840
+ return [key, index] as [string, number];
841
+ }),
842
+ )("team key %s beats every key after it", (key: string, index: number) => {
843
+ const attrs: Attrs = { "gen_ai.system": "openai" };
844
+
845
+ for (const lower of EXPECTED_TEAM_KEY_ORDER.slice(index)) {
846
+ attrs[lower] = `team-${lower}`;
847
+ }
848
+
849
+ expect(LlmSpanUtil.extract(attrs).llmTeam).toBe(`team-${key}`);
850
+ });
851
+
852
+ test("the semconv key beats the vendor fallback on a realistic gateway span", () => {
853
+ /*
854
+ * A LiteLLM-proxied call from a Claude Code session carries all three
855
+ * spellings at once. user.id is the key an organization can standardize
856
+ * on across every emitter, so it has to win.
857
+ */
858
+ const attrs: Attrs = {
859
+ "gen_ai.system": "anthropic",
860
+ "gen_ai.request.model": "claude-sonnet-4-6",
861
+ "user.id": "u-semconv",
862
+ "litellm.metadata.user_api_key_user_id": "u-litellm",
863
+ "user.account_uuid": "u-claude-code",
864
+ };
865
+
866
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("u-semconv");
867
+ });
868
+
869
+ test("a full coding-agent span populates all three identity columns", () => {
870
+ const attrs: Attrs = {
871
+ "gen_ai.system": "anthropic",
872
+ "gen_ai.request.model": "claude-opus-4-8",
873
+ "user.email": "ada@example.com",
874
+ "user.account_uuid": "acct-9f2",
875
+ cost_center: "RD-114",
876
+ "gen_ai.usage.input_tokens": 100,
877
+ "gen_ai.usage.output_tokens": 20,
878
+ };
879
+
880
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
881
+
882
+ expect(fields.llmUserId).toBe("acct-9f2");
883
+ expect(fields.llmUserEmail).toBe("ada@example.com");
884
+ expect(fields.llmTeam).toBe("RD-114");
885
+ });
886
+
887
+ /*
888
+ * THE exclusion. These keys carry the caller's own downstream customer, not
889
+ * the employee. A span carrying only them must leave the employee columns
890
+ * empty — silently mapping them would produce chargeback that is wrong
891
+ * rather than merely imprecise.
892
+ */
893
+ test.each(LlmEndUserAttributeKeys)(
894
+ "downstream-customer key %s never populates the employee columns",
895
+ (key: string) => {
896
+ const attrs: Attrs = {
897
+ "gen_ai.system": "openai",
898
+ "gen_ai.request.model": "gpt-4o",
899
+ [key]: "customer-9001",
900
+ };
901
+
902
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
903
+
904
+ expect(fields.isLlmSpan).toBe(true);
905
+ expect(fields.llmUserId).toBe("");
906
+ expect(fields.llmUserEmail).toBe("");
907
+ },
908
+ );
909
+
910
+ test("a span carrying ONLY customer-identity keys yields empty identity", () => {
911
+ const attrs: Attrs = {
912
+ "gen_ai.user": "customer-1",
913
+ "llm.user": "customer-1",
914
+ "litellm.metadata.user_api_key_end_user_id": "customer-1",
915
+ };
916
+
917
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
918
+
919
+ // The llm./gen_ai. namespaces still mark it as an LLM span...
920
+ expect(fields.isLlmSpan).toBe(true);
921
+ // ...but nobody internal is charged for it.
922
+ expect(fields.llmUserId).toBe("");
923
+ expect(fields.llmUserEmail).toBe("");
924
+ expect(fields.llmTeam).toBe("");
925
+ });
926
+
927
+ test("the employee wins when both humans are on the same span", () => {
928
+ /*
929
+ * The realistic SaaS shape: an internal service calls OpenAI on behalf of
930
+ * a customer, passing the customer through as the `user` request param.
931
+ * The engineer's team owns the bill.
932
+ */
933
+ const attrs: Attrs = {
934
+ "gen_ai.system": "openai",
935
+ "gen_ai.request.model": "gpt-4o",
936
+ "user.id": "employee-42",
937
+ "gen_ai.user": "customer-9001",
938
+ "litellm.metadata.user_api_key_user_id": "employee-42",
939
+ "litellm.metadata.user_api_key_end_user_id": "customer-9001",
940
+ };
941
+
942
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
943
+
944
+ expect(fields.llmUserId).toBe("employee-42");
945
+ });
946
+
947
+ /*
948
+ * The isLlmSpan gate. user.id / user.email / team.id are generic keys the
949
+ * RUM and HTTP fleet carries; those spans must stay untouched.
950
+ */
951
+ test("a non-LLM RUM span with user.id gets no identity columns", () => {
952
+ const attrs: Attrs = {
953
+ "http.method": "GET",
954
+ "http.route": "/checkout",
955
+ "user.id": "rum-user-123",
956
+ "user.email": "shopper@example.com",
957
+ "team.id": "frontend",
958
+ };
959
+
960
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
961
+
962
+ expect(fields.isLlmSpan).toBe(false);
963
+ expect(fields.llmUserId).toBe("");
964
+ expect(fields.llmUserEmail).toBe("");
965
+ expect(fields.llmTeam).toBe("");
966
+ });
967
+
968
+ test("a non-LLM backend span with a full identity set stays empty", () => {
969
+ const attrs: Attrs = {
970
+ "db.system": "postgresql",
971
+ "enduser.id": "svc-account",
972
+ cost_center: "RD-114",
973
+ department: "platform",
974
+ };
975
+
976
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
977
+
978
+ expect(fields.isLlmSpan).toBe(false);
979
+ expect(fields).toEqual(LlmSpanUtil.empty());
980
+ });
981
+
982
+ test("absent identity yields empty strings, not undefined", () => {
983
+ const attrs: Attrs = {
984
+ "gen_ai.system": "openai",
985
+ "gen_ai.request.model": "gpt-4o",
986
+ };
987
+
988
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
989
+
990
+ expect(fields.llmUserId).toBe("");
991
+ expect(fields.llmUserEmail).toBe("");
992
+ expect(fields.llmTeam).toBe("");
993
+ });
994
+
995
+ /*
996
+ * Whitespace-only values. An emitter that stamps an unset env var produces
997
+ * "" or " "; treating that as a real identity would create a phantom
998
+ * employee whose name is a space and would shadow the genuine fallback key
999
+ * further down the list.
1000
+ */
1001
+ test("a whitespace-only value yields an empty string, not whitespace", () => {
1002
+ const attrs: Attrs = {
1003
+ "gen_ai.system": "openai",
1004
+ "user.id": " ",
1005
+ "user.email": "\t\n",
1006
+ "team.id": " ",
1007
+ };
1008
+
1009
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1010
+
1011
+ expect(fields.llmUserId).toBe("");
1012
+ expect(fields.llmUserEmail).toBe("");
1013
+ expect(fields.llmTeam).toBe("");
1014
+ });
1015
+
1016
+ test("a whitespace-only preferred key falls through to the next key", () => {
1017
+ const attrs: Attrs = {
1018
+ "gen_ai.system": "openai",
1019
+ "user.id": " ",
1020
+ "enduser.id": "employee-7",
1021
+ };
1022
+
1023
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("employee-7");
1024
+ });
1025
+
1026
+ /*
1027
+ * Array-valued attributes. OTLP array values arrive as JS arrays; String()
1028
+ * on one would produce a comma-joined string that looks like a legitimate
1029
+ * id ("a,b") and would be indexed as one.
1030
+ */
1031
+ test("an array-valued identity attribute is ignored, not stringified", () => {
1032
+ const attrs: Attrs = {
1033
+ "gen_ai.system": "openai",
1034
+ "user.id": ["u-1", "u-2"],
1035
+ "user.email": ["a@example.com"],
1036
+ "team.id": ["platform"],
1037
+ };
1038
+
1039
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1040
+
1041
+ expect(fields.llmUserId).toBe("");
1042
+ expect(fields.llmUserEmail).toBe("");
1043
+ expect(fields.llmTeam).toBe("");
1044
+ });
1045
+
1046
+ test("an array-valued preferred key falls through to the next key", () => {
1047
+ const attrs: Attrs = {
1048
+ "gen_ai.system": "openai",
1049
+ "user.email": ["not", "a", "person"],
1050
+ "traceloop.association.properties.user_email": "grace@example.com",
1051
+ };
1052
+
1053
+ expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe("grace@example.com");
1054
+ });
1055
+
1056
+ test("a numeric identity value is coerced to its string form", () => {
1057
+ // Cursor's user id is an opaque integer, not a string.
1058
+ const attrs: Attrs = {
1059
+ "gen_ai.system": "anthropic",
1060
+ "cursor.user.id": 90210,
1061
+ };
1062
+
1063
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("90210");
1064
+ });
1065
+
1066
+ test("identity does not change cost, tokens or LLM detection", () => {
1067
+ /*
1068
+ * A guard on the blast radius: adding identity must not perturb any
1069
+ * pre-existing column. Same span, with and without the identity keys.
1070
+ */
1071
+ const base: Attrs = {
1072
+ "gen_ai.system": "openai",
1073
+ "gen_ai.request.model": "gpt-4o",
1074
+ "gen_ai.usage.input_tokens": 1_000_000,
1075
+ "gen_ai.usage.output_tokens": 100_000,
1076
+ };
1077
+
1078
+ const withIdentity: Attrs = {
1079
+ ...base,
1080
+ "user.id": "employee-42",
1081
+ "user.email": "ada@example.com",
1082
+ "team.id": "platform",
1083
+ };
1084
+
1085
+ const before: LlmSpanFields = LlmSpanUtil.extract(base);
1086
+ const after: LlmSpanFields = LlmSpanUtil.extract(withIdentity);
1087
+
1088
+ expect({
1089
+ ...after,
1090
+ llmUserId: "",
1091
+ llmUserEmail: "",
1092
+ llmTeam: "",
1093
+ }).toEqual(before);
1094
+ });
1095
+ });
1096
+
1097
+ /*
1098
+ * RESOURCE-attribute identity.
1099
+ *
1100
+ * The failure this block exists to catch is total and silent. All three OTLP
1101
+ * ingest services flatten resource attributes through
1102
+ * `TelemetryUtil.getAttributes({ items, prefixKeysWithString: "resource" })`,
1103
+ * so nothing an operator sets on the resource ever reaches the extractor
1104
+ * under its bare name. Concretely:
1105
+ *
1106
+ * OTEL_RESOURCE_ATTRIBUTES=team.id=platform,cost_center=RD-114
1107
+ *
1108
+ * — the mechanism the coding-agent docs present as THE way to attribute spend
1109
+ * to a cost centre — produces `resource.team.id` and `resource.cost_center`.
1110
+ * Against a bare-key-only list that matches nothing, every team column is
1111
+ * empty, and the AI / LLM Usage view shows a tidy, complete, entirely blank
1112
+ * team breakdown. Cursor is the same story: it documents cursor.user.id and
1113
+ * cursor.team.id as RESOURCE attributes.
1114
+ *
1115
+ * OtelTracesIngestService already hit this trap once with session replay and
1116
+ * fixed it the same way — see its `sessionIdAttributeKeys`, whose comment
1117
+ * notes that reading only the bare key "would look correct in a unit test and
1118
+ * fail in production". These tests are the unit tests that would not have
1119
+ * looked correct.
1120
+ */
1121
+ describe("LlmSpanUtil.extract — resource-prefixed identity", () => {
1122
+ test.each([
1123
+ ["resource.user.id", "employee-42"],
1124
+ ["resource.user.email", "ada@example.com"],
1125
+ ["resource.team.id", "platform"],
1126
+ ["resource.cost_center", "RD-114"],
1127
+ ["resource.cursor.user.id", "90210"],
1128
+ ["resource.cursor.team.id", "team-7"],
1129
+ ["resource.enduser.id", "svc-account"],
1130
+ ["resource.department", "research"],
1131
+ ])(
1132
+ "resource attribute %s is extracted, not ignored",
1133
+ (key: string, value: string) => {
1134
+ const attrs: Attrs = {
1135
+ "gen_ai.system": "anthropic",
1136
+ "gen_ai.request.model": "claude-sonnet-4-6",
1137
+ [key]: value,
1138
+ };
1139
+
1140
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1141
+
1142
+ const populated: string =
1143
+ fields.llmUserId || fields.llmUserEmail || fields.llmTeam;
1144
+
1145
+ expect(populated).toBe(value);
1146
+ },
1147
+ );
1148
+
1149
+ test("OTEL_RESOURCE_ATTRIBUTES team attribution reaches the team column", () => {
1150
+ /*
1151
+ * The literal shape a Claude Code / Gemini CLI fleet produces once the
1152
+ * operator sets OTEL_RESOURCE_ATTRIBUTES and the CLI stamps the signed-in
1153
+ * account onto the resource too.
1154
+ */
1155
+ const attrs: Attrs = {
1156
+ "gen_ai.system": "anthropic",
1157
+ "gen_ai.request.model": "claude-opus-4-8",
1158
+ "resource.team.id": "platform",
1159
+ "resource.cost_center": "RD-114",
1160
+ "resource.user.email": "ada@example.com",
1161
+ "resource.user.account_uuid": "acct-9f2",
1162
+ "gen_ai.usage.input_tokens": 100,
1163
+ "gen_ai.usage.output_tokens": 20,
1164
+ };
1165
+
1166
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1167
+
1168
+ expect(fields.llmTeam).toBe("platform");
1169
+ expect(fields.llmUserEmail).toBe("ada@example.com");
1170
+ expect(fields.llmUserId).toBe("acct-9f2");
1171
+ });
1172
+
1173
+ /*
1174
+ * Tier precedence. A span attribute describes ONE call; a resource
1175
+ * attribute describes the whole process. When both are present the span
1176
+ * attribute is the more specific statement and must win — otherwise a
1177
+ * process-wide default would mask the per-call override that was set
1178
+ * deliberately to correct it.
1179
+ */
1180
+ test.each([
1181
+ ["user.id", "resource.user.id"],
1182
+ ["cursor.user.id", "resource.user.id"],
1183
+ ["user.account_id", "resource.user.id"],
1184
+ ])(
1185
+ "span attribute %s beats resource attribute %s",
1186
+ (spanKey: string, resourceKey: string) => {
1187
+ const attrs: Attrs = {
1188
+ "gen_ai.system": "openai",
1189
+ [spanKey]: "from-span",
1190
+ [resourceKey]: "from-resource",
1191
+ };
1192
+
1193
+ expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("from-span");
1194
+ },
1195
+ );
1196
+
1197
+ test("a span-level email beats a resource-level email", () => {
1198
+ const attrs: Attrs = {
1199
+ "gen_ai.system": "openai",
1200
+ "user.email": "span@example.com",
1201
+ "resource.user.email": "resource@example.com",
1202
+ };
1203
+
1204
+ expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe("span@example.com");
1205
+ });
1206
+
1207
+ test("a span-level team beats a resource-level team", () => {
1208
+ const attrs: Attrs = {
1209
+ "gen_ai.system": "openai",
1210
+ "cursor.team.id": "span-team",
1211
+ "resource.team.id": "resource-team",
1212
+ };
1213
+
1214
+ expect(LlmSpanUtil.extract(attrs).llmTeam).toBe("span-team");
1215
+ });
1216
+
1217
+ test("the resource tier is a suffix block, never interleaved", () => {
1218
+ /*
1219
+ * Pinned as a structural relation as well as by the literal orders above:
1220
+ * every bare key precedes every resource key. If someone "tidies" the
1221
+ * lists by grouping each key next to its own resource twin, a vendor
1222
+ * span attribute would start losing to a resource attribute of a
1223
+ * more-preferred key, silently changing which value lands in the column.
1224
+ */
1225
+ for (const list of [
1226
+ LlmUserIdAttributeKeys,
1227
+ LlmUserEmailAttributeKeys,
1228
+ LlmTeamAttributeKeys,
1229
+ LlmEndUserAttributeKeys,
1230
+ ]) {
1231
+ const firstResourceIndex: number = list.findIndex((key: string) => {
1232
+ return key.startsWith(RESOURCE_ATTRIBUTE_KEY_PREFIX);
1233
+ });
1234
+
1235
+ expect(firstResourceIndex).toBe(list.length / 2);
1236
+
1237
+ for (const key of list.slice(firstResourceIndex)) {
1238
+ expect(key.startsWith(RESOURCE_ATTRIBUTE_KEY_PREFIX)).toBe(true);
1239
+ }
1240
+ }
1241
+ });
1242
+
1243
+ /*
1244
+ * The EXCLUSION has to cover the resource tier too. The employee lists now
1245
+ * carry both spellings, so if the end-user list stopped at the bare ones,
1246
+ * `resource.gen_ai.user` — a downstream CUSTOMER id — could be appended to
1247
+ * an employee list and every exclusion test would still pass.
1248
+ */
1249
+ test.each([
1250
+ "resource.gen_ai.user",
1251
+ "resource.llm.user",
1252
+ "resource.litellm.metadata.user_api_key_end_user_id",
1253
+ ])(
1254
+ "resource-prefixed customer key %s never populates the employee columns",
1255
+ (key: string) => {
1256
+ const attrs: Attrs = {
1257
+ "gen_ai.system": "openai",
1258
+ "gen_ai.request.model": "gpt-4o",
1259
+ [key]: "customer-9001",
1260
+ };
1261
+
1262
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1263
+
1264
+ expect(fields.isLlmSpan).toBe(true);
1265
+ expect(fields.llmUserId).toBe("");
1266
+ expect(fields.llmUserEmail).toBe("");
1267
+ expect(fields.llmTeam).toBe("");
1268
+ },
1269
+ );
1270
+
1271
+ test("the exclusion list itself covers the resource tier", () => {
1272
+ for (const key of [
1273
+ "resource.gen_ai.user",
1274
+ "resource.llm.user",
1275
+ "resource.litellm.metadata.user_api_key_end_user_id",
1276
+ ]) {
1277
+ expect(LlmEndUserAttributeKeys).toContain(key);
1278
+ expect(LlmUserIdAttributeKeys).not.toContain(key);
1279
+ expect(LlmUserEmailAttributeKeys).not.toContain(key);
1280
+ expect(LlmTeamAttributeKeys).not.toContain(key);
1281
+ }
1282
+ });
1283
+
1284
+ test("no employee key is also an end-user key, in either tier", () => {
1285
+ for (const key of LlmEndUserAttributeKeys) {
1286
+ expect(LlmUserIdAttributeKeys).not.toContain(key);
1287
+ expect(LlmUserEmailAttributeKeys).not.toContain(key);
1288
+ expect(LlmTeamAttributeKeys).not.toContain(key);
1289
+ }
1290
+ });
1291
+
1292
+ test("the isLlmSpan gate still applies to resource-level identity", () => {
1293
+ /*
1294
+ * A browser RUM fleet sets user.id on the resource for every single span
1295
+ * it emits. Widening the lists must not widen the gate.
1296
+ */
1297
+ const attrs: Attrs = {
1298
+ "http.method": "GET",
1299
+ "http.route": "/checkout",
1300
+ "resource.user.id": "rum-user-123",
1301
+ "resource.user.email": "shopper@example.com",
1302
+ "resource.team.id": "frontend",
1303
+ };
1304
+
1305
+ const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
1306
+
1307
+ expect(fields.isLlmSpan).toBe(false);
1308
+ expect(fields).toEqual(LlmSpanUtil.empty());
1309
+ });
1310
+ });
1311
+
1312
+ /*
1313
+ * withResourcePrefixedKeys itself. It is the one function standing between an
1314
+ * operator's OTEL_RESOURCE_ATTRIBUTES and a populated column, so its shape is
1315
+ * worth pinning directly rather than only through the lists it produces.
1316
+ */
1317
+ describe("withResourcePrefixedKeys", () => {
1318
+ test("appends the prefixed block after the bare block, order preserved", () => {
1319
+ expect(withResourcePrefixedKeys(["a.b", "c"])).toEqual([
1320
+ "a.b",
1321
+ "c",
1322
+ "resource.a.b",
1323
+ "resource.c",
1324
+ ]);
1325
+ });
1326
+
1327
+ test("does not mutate its input", () => {
1328
+ const input: Array<string> = ["a.b"];
1329
+
1330
+ withResourcePrefixedKeys(input);
1331
+
1332
+ expect(input).toEqual(["a.b"]);
1333
+ });
1334
+
1335
+ test("the prefix is the string ingest actually stamps", () => {
1336
+ /*
1337
+ * TelemetryUtil.getAttributes is called with
1338
+ * prefixKeysWithString: "resource" and joins with a dot, so the key that
1339
+ * arrives is "resource.<key>". A prefix without the dot would match
1340
+ * nothing and no other test here would notice.
1341
+ */
1342
+ expect(RESOURCE_ATTRIBUTE_KEY_PREFIX).toBe("resource.");
1343
+ });
1344
+
1345
+ test("an empty list stays empty", () => {
1346
+ expect(withResourcePrefixedKeys([])).toEqual([]);
1347
+ });
1348
+ });