@oneuptime/common 12.0.15 → 12.0.17

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 (718) hide show
  1. package/Models/AnalyticsModels/Index.ts +10 -0
  2. package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
  3. package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
  4. package/Models/AnalyticsModels/Span.ts +29 -1
  5. package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
  6. package/Models/DatabaseModels/Alert.ts +42 -0
  7. package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
  8. package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
  9. package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
  10. package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
  11. package/Models/DatabaseModels/DetectionRule.ts +568 -0
  12. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
  13. package/Models/DatabaseModels/Incident.ts +42 -0
  14. package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
  15. package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
  16. package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
  17. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
  18. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
  19. package/Models/DatabaseModels/Index.ts +20 -0
  20. package/Models/DatabaseModels/Label.ts +11 -0
  21. package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
  22. package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
  23. package/Models/DatabaseModels/LogSavedView.ts +87 -0
  24. package/Models/DatabaseModels/MarketingConversion.ts +210 -8
  25. package/Models/DatabaseModels/MetricSavedView.ts +59 -0
  26. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
  27. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
  28. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
  30. package/Models/DatabaseModels/Probe.ts +21 -0
  31. package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
  32. package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
  33. package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
  34. package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
  35. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
  36. package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
  37. package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
  38. package/Models/DatabaseModels/TableView.ts +15 -0
  39. package/Models/DatabaseModels/Team.ts +13 -0
  40. package/Models/DatabaseModels/TeamMember.ts +8 -0
  41. package/Models/DatabaseModels/TraceSavedView.ts +52 -0
  42. package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
  43. package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
  44. package/Server/API/TelemetryAPI.ts +252 -6
  45. package/Server/API/UserAPI.ts +88 -0
  46. package/Server/EnvironmentConfig.ts +36 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.ts +39 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  55. package/Server/Middleware/IdentityRateLimit.ts +672 -0
  56. package/Server/Services/AccessTokenService.ts +15 -2
  57. package/Server/Services/AlertMeasurementService.ts +302 -0
  58. package/Server/Services/AlertMeasurementValueService.ts +508 -0
  59. package/Server/Services/AlertService.ts +50 -0
  60. package/Server/Services/AlertStateTimelineService.ts +54 -0
  61. package/Server/Services/DetectionRuleService.ts +74 -0
  62. package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
  63. package/Server/Services/IncidentMeasurementService.ts +304 -0
  64. package/Server/Services/IncidentMeasurementValueService.ts +523 -0
  65. package/Server/Services/IncidentService.ts +51 -0
  66. package/Server/Services/IncidentStateTimelineService.ts +54 -0
  67. package/Server/Services/Index.ts +30 -0
  68. package/Server/Services/LlmCostBudgetService.ts +93 -0
  69. package/Server/Services/LlmModelPriceService.ts +202 -0
  70. package/Server/Services/LogAggregationService.ts +1106 -2
  71. package/Server/Services/LogCountBaselineService.ts +163 -0
  72. package/Server/Services/MutableMetricService.ts +30 -9
  73. package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
  74. package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
  75. package/Server/Services/ScheduledMaintenanceService.ts +53 -0
  76. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
  77. package/Server/Services/SecurityEventService.ts +104 -0
  78. package/Server/Services/SpanCountBaselineService.ts +173 -0
  79. package/Server/Services/StatusPageService.ts +4 -3
  80. package/Server/Services/TelemetryUsageBillingService.ts +17 -2
  81. package/Server/Services/UserService.ts +284 -51
  82. package/Server/Services/UserTotpAuthService.ts +27 -86
  83. package/Server/Services/UserWebAuthnService.ts +26 -86
  84. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
  85. package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
  86. package/Server/Types/Database/QueryHelper.ts +1 -1
  87. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  88. package/Server/Utils/AI/Toolbox/Index.ts +6 -0
  89. package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
  90. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
  91. package/Server/Utils/Attribution.ts +130 -34
  92. package/Server/Utils/Marketing/ConversionUploadProvider.ts +98 -16
  93. package/Server/Utils/Marketing/Providers/GoogleAds.ts +70 -7
  94. package/Server/Utils/Marketing/Providers/LinkedIn.ts +54 -16
  95. package/Server/Utils/Marketing/Providers/Meta.ts +52 -18
  96. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +37 -10
  97. package/Server/Utils/Marketing/Providers/Reddit.ts +45 -15
  98. package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
  99. package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
  100. package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
  101. package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
  102. package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
  103. package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
  104. package/Server/Utils/Monitor/DataToProcess.ts +2 -0
  105. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  106. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -0
  107. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
  108. package/Server/Utils/Monitor/MonitorResource.ts +16 -0
  109. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
  110. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
  111. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +805 -0
  112. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
  113. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
  114. package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
  115. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
  116. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
  117. package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
  118. package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
  119. package/Server/Utils/UserPermission/UserPermission.ts +57 -1
  120. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
  121. package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
  122. package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
  123. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
  124. package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
  125. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
  126. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
  127. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +250 -0
  128. package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +106 -0
  129. package/Tests/App/Dashboard/SecurityEventsMonitorsPage.test.tsx +185 -0
  130. package/Tests/App/Dashboard/SecurityEventsSetupGuide.test.tsx +200 -0
  131. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
  132. package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
  133. package/Tests/Models/DetectionRuleCreateContract.test.ts +35 -0
  134. package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
  135. package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
  136. package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
  137. package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
  138. package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
  139. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
  140. package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
  141. package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
  142. package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
  143. package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
  144. package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
  145. package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
  146. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
  147. package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
  148. package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
  149. package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
  150. package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
  151. package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
  152. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
  153. package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
  154. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
  155. package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
  156. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
  157. package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
  158. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
  159. package/Tests/Server/Utils/Attribution.test.ts +228 -1
  160. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +153 -92
  161. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +123 -6
  162. package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
  163. package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
  164. package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
  165. package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
  166. package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
  167. package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
  168. package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
  169. package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
  170. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
  171. package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
  172. package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
  173. package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
  174. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +1098 -0
  175. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
  176. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
  177. package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
  178. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
  179. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
  180. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
  181. package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
  182. package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
  183. package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
  184. package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
  185. package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
  186. package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
  187. package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
  188. package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
  189. package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
  190. package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
  191. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
  192. package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
  193. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
  194. package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
  195. package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
  196. package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
  197. package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
  198. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
  199. package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
  200. package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
  201. package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
  202. package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
  203. package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
  204. package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
  205. package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
  206. package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
  207. package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
  208. package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
  209. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  210. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +285 -0
  211. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
  212. package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
  213. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
  214. package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
  215. package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
  216. package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
  217. package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
  218. package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
  219. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
  220. package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
  221. package/Types/AI/AIChatTypes.ts +1 -0
  222. package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
  223. package/Types/Alerts/AlertStateRole.ts +11 -0
  224. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
  225. package/Types/Dashboard/Chart/ChartType.ts +1 -0
  226. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  227. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
  228. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
  229. package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
  230. package/Types/Incident/IncidentStateRole.ts +14 -0
  231. package/Types/Marketing/Attribution.ts +75 -0
  232. package/Types/Marketing/MarketingConversion.ts +37 -7
  233. package/Types/Measurement/MeasurementAggregationType.ts +43 -0
  234. package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
  235. package/Types/Measurement/MeasurementOccurrence.ts +14 -0
  236. package/Types/Measurement/MeasurementStatus.ts +34 -0
  237. package/Types/MeteredPlan/ProductType.ts +1 -0
  238. package/Types/Monitor/CriteriaFilter.ts +3 -0
  239. package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
  240. package/Types/Monitor/MonitorStep.ts +28 -0
  241. package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
  242. package/Types/Monitor/MonitorType.ts +20 -0
  243. package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
  244. package/Types/Permission.ts +399 -2
  245. package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
  246. package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
  247. package/Types/SecurityEvent/DetectionFindingConstants.ts +24 -0
  248. package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
  249. package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
  250. package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
  251. package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
  252. package/Types/SecurityEvent/SigmaRule.ts +70 -0
  253. package/Types/Telemetry/LlmConventions.ts +20 -1
  254. package/Types/Telemetry/LlmCostCatalog.ts +557 -0
  255. package/Types/Telemetry/ServiceType.ts +1 -0
  256. package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
  257. package/Types/Telemetry/TelemetryType.ts +1 -0
  258. package/Types/TwoFactorAuthStatus.ts +42 -0
  259. package/Types/UserAuthenticationStatus.ts +18 -0
  260. package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
  261. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
  262. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
  263. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
  264. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
  265. package/UI/Components/Button/Button.tsx +37 -2
  266. package/UI/Components/Card/Card.tsx +6 -0
  267. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
  268. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
  269. package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
  270. package/UI/Components/Forms/ModelForm.tsx +54 -2
  271. package/UI/Components/List/ListRow.tsx +6 -0
  272. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
  273. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
  274. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
  275. package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
  276. package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
  277. package/UI/Components/ModelList/ModelList.tsx +21 -2
  278. package/UI/Components/ModelList/StaticModelList.tsx +11 -0
  279. package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
  280. package/UI/Components/ModelTable/ModelTable.tsx +16 -10
  281. package/UI/Components/ModelTable/TableView.tsx +36 -4
  282. package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
  283. package/UI/Components/OrderedStatesList/Item.tsx +6 -0
  284. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
  285. package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
  286. package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
  287. package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
  288. package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
  289. package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
  290. package/UI/Components/Table/TableRow.tsx +12 -0
  291. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
  292. package/UI/Types/UseComponentOutsideClick.ts +47 -0
  293. package/UI/Utils/PermissionGate.ts +277 -0
  294. package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
  295. package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
  296. package/Utils/Dashboard/Components/Index.ts +14 -0
  297. package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
  298. package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
  299. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +93 -11
  300. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
  301. package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
  302. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
  303. package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
  304. package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
  305. package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
  306. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
  307. package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
  308. package/Utils/Telemetry/CrossSignalScope.ts +46 -9
  309. package/Utils/Telemetry/LogErrorPattern.ts +350 -0
  310. package/build/dist/Models/AnalyticsModels/Index.js +10 -0
  311. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  312. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
  313. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
  314. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
  315. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
  316. package/build/dist/Models/AnalyticsModels/Span.js +24 -1
  317. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  318. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
  319. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
  320. package/build/dist/Models/DatabaseModels/Alert.js +43 -0
  321. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
  323. package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
  324. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
  325. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
  326. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
  327. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  328. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
  329. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
  330. package/build/dist/Models/DatabaseModels/DetectionRule.js +598 -0
  331. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
  332. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
  333. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
  334. package/build/dist/Models/DatabaseModels/Incident.js +43 -0
  335. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  336. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
  337. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
  338. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
  339. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
  340. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
  341. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  342. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
  343. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  344. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
  345. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  346. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  347. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  348. package/build/dist/Models/DatabaseModels/Label.js +11 -0
  349. package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
  350. package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
  351. package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
  352. package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
  353. package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
  354. package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
  355. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  356. package/build/dist/Models/DatabaseModels/MarketingConversion.js +224 -8
  357. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  358. package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
  359. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  360. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
  361. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  362. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
  363. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  364. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
  365. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  366. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
  367. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  368. package/build/dist/Models/DatabaseModels/Probe.js +21 -0
  369. package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
  370. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
  371. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  372. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
  373. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  374. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
  375. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
  376. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
  377. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
  378. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
  379. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  380. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
  381. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  382. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
  383. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  384. package/build/dist/Models/DatabaseModels/TableView.js +15 -0
  385. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  386. package/build/dist/Models/DatabaseModels/Team.js +13 -0
  387. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  388. package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
  389. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  390. package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
  391. package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
  393. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
  395. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  396. package/build/dist/Server/API/TelemetryAPI.js +136 -0
  397. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  398. package/build/dist/Server/API/UserAPI.js +75 -2
  399. package/build/dist/Server/API/UserAPI.js.map +1 -1
  400. package/build/dist/Server/EnvironmentConfig.js +29 -1
  401. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  402. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
  403. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
  404. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
  405. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
  406. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
  407. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
  408. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
  409. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
  410. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
  411. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
  412. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
  413. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js.map +1 -0
  414. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.js +24 -0
  415. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.js.map +1 -0
  416. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  417. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  418. package/build/dist/Server/Middleware/IdentityRateLimit.js +491 -0
  419. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
  420. package/build/dist/Server/Services/AccessTokenService.js +13 -2
  421. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  422. package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
  423. package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
  424. package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
  425. package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
  426. package/build/dist/Server/Services/AlertService.js +37 -0
  427. package/build/dist/Server/Services/AlertService.js.map +1 -1
  428. package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
  429. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  430. package/build/dist/Server/Services/DetectionRuleService.js +50 -0
  431. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
  432. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
  433. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
  434. package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
  435. package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
  436. package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
  437. package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
  438. package/build/dist/Server/Services/IncidentService.js +41 -0
  439. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  440. package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
  441. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  442. package/build/dist/Server/Services/Index.js +30 -0
  443. package/build/dist/Server/Services/Index.js.map +1 -1
  444. package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
  445. package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
  446. package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
  447. package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
  448. package/build/dist/Server/Services/LogAggregationService.js +709 -0
  449. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  450. package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
  451. package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
  452. package/build/dist/Server/Services/MutableMetricService.js +28 -9
  453. package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
  454. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
  455. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
  456. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
  457. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
  458. package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
  459. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  460. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
  461. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  462. package/build/dist/Server/Services/SecurityEventService.js +64 -0
  463. package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
  464. package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
  465. package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
  466. package/build/dist/Server/Services/StatusPageService.js +4 -3
  467. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  468. package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
  469. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  470. package/build/dist/Server/Services/UserService.js +262 -42
  471. package/build/dist/Server/Services/UserService.js.map +1 -1
  472. package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
  473. package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
  474. package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
  475. package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
  476. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
  477. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  478. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
  479. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  480. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  481. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  482. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  483. package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
  484. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  485. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
  486. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
  487. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
  488. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  489. package/build/dist/Server/Utils/Attribution.js +77 -33
  490. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  491. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +46 -9
  492. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  493. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +52 -8
  494. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  495. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +41 -17
  496. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  497. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +42 -18
  498. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  499. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +24 -11
  500. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  501. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +34 -15
  502. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  503. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
  504. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
  505. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
  506. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
  507. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
  508. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
  509. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
  510. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
  511. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
  512. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
  513. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
  514. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js.map +1 -1
  515. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  516. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  517. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -0
  518. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  519. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  520. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  521. package/build/dist/Server/Utils/Monitor/MonitorResource.js +10 -0
  522. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
  524. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
  527. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +600 -0
  528. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
  529. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
  530. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  531. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
  532. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
  533. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
  534. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
  535. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
  536. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
  538. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
  539. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
  540. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
  542. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
  543. package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
  544. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  545. package/build/dist/Types/AI/AIChatTypes.js +1 -0
  546. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  547. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
  548. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
  549. package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
  550. package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
  551. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
  552. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  553. package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
  554. package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
  555. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  556. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  557. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
  558. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
  559. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
  560. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
  561. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
  562. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
  563. package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
  564. package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
  565. package/build/dist/Types/Marketing/Attribution.js +68 -0
  566. package/build/dist/Types/Marketing/Attribution.js.map +1 -0
  567. package/build/dist/Types/Marketing/MarketingConversion.js +36 -7
  568. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  569. package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
  570. package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
  571. package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
  572. package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
  573. package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
  574. package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
  575. package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
  576. package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
  577. package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
  578. package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
  579. package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
  580. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  581. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
  582. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  583. package/build/dist/Types/Monitor/MonitorStep.js +17 -0
  584. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  585. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
  586. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
  587. package/build/dist/Types/Monitor/MonitorType.js +19 -0
  588. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  589. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
  590. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
  591. package/build/dist/Types/Permission.js +347 -2
  592. package/build/dist/Types/Permission.js.map +1 -1
  593. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
  594. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
  595. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
  596. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
  597. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +18 -0
  598. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -0
  599. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
  600. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
  601. package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
  602. package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
  603. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
  604. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
  605. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
  606. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
  607. package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
  608. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
  609. package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
  610. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  611. package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
  612. package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
  613. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  614. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  615. package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
  616. package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
  617. package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
  618. package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
  619. package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
  620. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
  621. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  622. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
  623. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  624. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
  625. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  626. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
  627. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  628. package/build/dist/UI/Components/Button/Button.js +22 -1
  629. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  630. package/build/dist/UI/Components/Card/Card.js +1 -1
  631. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  632. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
  633. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  634. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
  635. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  636. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
  637. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
  638. package/build/dist/UI/Components/Forms/ModelForm.js +40 -1
  639. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  640. package/build/dist/UI/Components/List/ListRow.js +4 -1
  641. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  642. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
  643. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  644. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
  645. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  646. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
  647. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  648. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
  649. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  650. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
  651. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  652. package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
  653. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  654. package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
  655. package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
  656. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
  657. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  658. package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
  659. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  660. package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
  661. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  662. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
  663. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  664. package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
  665. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  666. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
  667. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  668. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
  669. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  670. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
  671. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
  672. package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
  673. package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
  674. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
  675. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
  676. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
  677. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
  678. package/build/dist/UI/Components/Table/TableRow.js +8 -2
  679. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  680. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
  681. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  682. package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
  683. package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
  684. package/build/dist/UI/Utils/PermissionGate.js +164 -0
  685. package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
  686. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
  687. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
  688. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
  689. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
  690. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  691. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  692. package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
  693. package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
  694. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
  695. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
  696. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +51 -10
  697. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  698. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
  699. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
  700. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
  701. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
  702. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
  703. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
  704. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
  705. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
  706. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
  707. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
  708. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
  709. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
  710. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
  711. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
  712. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
  713. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
  714. package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
  715. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  716. package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
  717. package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
  718. package/package.json +3 -1
@@ -0,0 +1,317 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import MetricType from "../../../Models/DatabaseModels/MetricType";
11
+ import { MetricPointType } from "../../../Models/AnalyticsModels/Metric";
12
+ import AggregationInterval from "../../../Types/BaseDatabase/AggregationInterval";
13
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
14
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
15
+ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
16
+ import OneUptimeDate from "../../../Types/Date";
17
+ import ObjectID from "../../../Types/ObjectID";
18
+ import ServiceType from "../../../Types/Telemetry/ServiceType";
19
+ import LlmCostBudgetService from "../../Services/LlmCostBudgetService";
20
+ import MetricService from "../../Services/MetricService";
21
+ import SpanService from "../../Services/SpanService";
22
+ import logger from "../Logger";
23
+ import CaptureSpan from "../Telemetry/CaptureSpan";
24
+ import TelemetryUtil from "./Telemetry";
25
+ /*
26
+ * Evaluates LLM cost budgets against the day's LLM span spend.
27
+ *
28
+ * The worker job (App/FeatureSet/Workers/Jobs/Llm/EvaluateLlmCostBudgets.ts)
29
+ * calls evaluateAllBudgets() on a 15-minute tick. For each enabled budget it
30
+ * sums the UTC day's llmCost from ClickHouse (scoped by the budget's optional
31
+ * service / provider / model filters), stamps the spend back onto the budget
32
+ * row for the dashboard, and publishes two gauge metrics:
33
+ *
34
+ * oneuptime.llm.budget.spend.usd — the day's spend so far, in USD
35
+ * oneuptime.llm.budget.percent.used — spend as a percent of the budget
36
+ *
37
+ * Budgets do NOT alert directly. Alerting is a Metrics monitor on these
38
+ * series — filter by the oneuptime.llm.budget.id attribute (stable across
39
+ * renames; the name attribute is for charts and changes when the budget is
40
+ * renamed) — which brings thresholds, formulas, anomaly baselines, incidents
41
+ * and on-call routing without a parallel alerting pipeline here.
42
+ *
43
+ * The series gets ONE point per budget per 15-minute sweep. A monitor on it
44
+ * must use a rolling window of at least 15 minutes (30 recommended): the
45
+ * 1-minute default would see an empty series between sweeps and flap.
46
+ */
47
+ export const LLM_BUDGET_SPEND_METRIC_NAME = "oneuptime.llm.budget.spend.usd";
48
+ export const LLM_BUDGET_PERCENT_METRIC_NAME = "oneuptime.llm.budget.percent.used";
49
+ // Attribute keys carried by both budget metrics, for monitor/chart filtering.
50
+ export const LLM_BUDGET_ID_ATTRIBUTE = "oneuptime.llm.budget.id";
51
+ export const LLM_BUDGET_NAME_ATTRIBUTE = "oneuptime.llm.budget.name";
52
+ export const LLM_BUDGET_PROVIDER_ATTRIBUTE = "oneuptime.llm.budget.provider";
53
+ export const LLM_BUDGET_MODEL_ATTRIBUTE = "oneuptime.llm.budget.model";
54
+ export const LLM_BUDGET_SERVICE_ID_ATTRIBUTE = "oneuptime.llm.budget.service.id";
55
+ /*
56
+ * Matches the derived-metric retention the trace/metric recording rules use.
57
+ * The series exists for monitors and short-range charts; long-range spend
58
+ * history belongs to the spans themselves.
59
+ */
60
+ const BUDGET_METRIC_RETENTION_IN_DAYS = 15;
61
+ export default class LlmCostBudgetEvaluator {
62
+ /**
63
+ * Percent of the daily budget consumed. 0 when the budget is missing or
64
+ * invalid — never NaN/Infinity, since these values feed monitors.
65
+ */
66
+ static computePercentUsed(data) {
67
+ if (!isFinite(data.dailyBudgetInUSD) ||
68
+ data.dailyBudgetInUSD <= 0 ||
69
+ !isFinite(data.spendInUSD) ||
70
+ data.spendInUSD < 0) {
71
+ return 0;
72
+ }
73
+ const percent = (data.spendInUSD / data.dailyBudgetInUSD) * 100;
74
+ // Trim float noise; hundredth-of-a-percent resolution is plenty.
75
+ return Math.round(percent * 100) / 100;
76
+ }
77
+ /**
78
+ * Start of the UTC day `now` falls in. UTC-explicit (not process-zone) so
79
+ * the budget day is the same day everywhere OneUptime runs.
80
+ */
81
+ static getUtcDayStart(now) {
82
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
83
+ }
84
+ /**
85
+ * Build the ClickHouse span filter for a budget: the UTC day so far,
86
+ * LLM spans only, narrowed by the budget's optional service / provider /
87
+ * model scoping.
88
+ */
89
+ static buildSpanQuery(data) {
90
+ const query = {
91
+ projectId: data.budget.projectId,
92
+ isLlmSpan: true,
93
+ /*
94
+ * Bound rows to the window — aggregateBy's startTimestamp/endTimestamp
95
+ * only pick the bucket grid, they do not filter rows.
96
+ */
97
+ startTime: new InBetween(data.dayStart, data.now),
98
+ };
99
+ if (data.budget.serviceId) {
100
+ query["primaryEntityId"] =
101
+ data.budget.serviceId;
102
+ }
103
+ if (data.budget.llmSystem) {
104
+ query["llmSystem"] = data.budget.llmSystem;
105
+ }
106
+ if (data.budget.llmModel) {
107
+ query["llmRequestModel"] =
108
+ data.budget.llmModel;
109
+ }
110
+ return query;
111
+ }
112
+ /**
113
+ * Build the two metric rows one evaluation publishes for one budget.
114
+ * Pure — mirrors the derived-metric row shape the trace recording rules
115
+ * write — so the series shape is unit-testable.
116
+ */
117
+ static buildBudgetMetricRows(data) {
118
+ var _a;
119
+ const attributes = {
120
+ [LLM_BUDGET_ID_ATTRIBUTE]: ((_a = data.budget.id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
121
+ [LLM_BUDGET_NAME_ATTRIBUTE]: data.budget.name || "",
122
+ };
123
+ if (data.budget.serviceId) {
124
+ attributes[LLM_BUDGET_SERVICE_ID_ATTRIBUTE] =
125
+ data.budget.serviceId.toString();
126
+ }
127
+ if (data.budget.llmSystem) {
128
+ attributes[LLM_BUDGET_PROVIDER_ATTRIBUTE] = data.budget.llmSystem;
129
+ }
130
+ if (data.budget.llmModel) {
131
+ attributes[LLM_BUDGET_MODEL_ATTRIBUTE] = data.budget.llmModel;
132
+ }
133
+ const retentionDate = OneUptimeDate.addRemoveDays(data.now, BUDGET_METRIC_RETENTION_IN_DAYS);
134
+ const buildRow = (name, value) => {
135
+ return {
136
+ _id: ObjectID.generateTimeOrdered().toString(),
137
+ projectId: data.budget.projectId.toString(),
138
+ createdAt: OneUptimeDate.toClickhouseDateTime(data.now),
139
+ time: OneUptimeDate.toClickhouseDateTime(data.now),
140
+ timeUnixNano: (data.now.getTime() * 1000000).toString(),
141
+ primaryEntityType: ServiceType.OpenTelemetry,
142
+ name: name,
143
+ metricPointType: MetricPointType.Gauge,
144
+ value: value,
145
+ attributes: attributes,
146
+ attributeKeys: Object.keys(attributes).sort(),
147
+ retentionDate: OneUptimeDate.toClickhouseDateTime(retentionDate),
148
+ };
149
+ };
150
+ return [
151
+ buildRow(LLM_BUDGET_SPEND_METRIC_NAME, data.spendInUSD),
152
+ buildRow(LLM_BUDGET_PERCENT_METRIC_NAME, data.percentUsed),
153
+ ];
154
+ }
155
+ /**
156
+ * Evaluate every enabled budget. One bad budget never aborts the sweep.
157
+ */
158
+ static async evaluateAllBudgets() {
159
+ var _a, _b, _c, _d;
160
+ const budgets = await LlmCostBudgetService.findBy({
161
+ query: {
162
+ isEnabled: true,
163
+ },
164
+ select: {
165
+ _id: true,
166
+ projectId: true,
167
+ name: true,
168
+ dailyBudgetInUSD: true,
169
+ serviceId: true,
170
+ llmSystem: true,
171
+ llmModel: true,
172
+ },
173
+ limit: LIMIT_MAX,
174
+ skip: 0,
175
+ props: {
176
+ isRoot: true,
177
+ },
178
+ });
179
+ if (budgets.length === 0) {
180
+ return;
181
+ }
182
+ logger.debug(`Llm:EvaluateLlmCostBudgets: evaluating ${budgets.length} enabled budget(s)`);
183
+ const now = new Date();
184
+ for (const budget of budgets) {
185
+ try {
186
+ await this.evaluateBudget({ budget, now });
187
+ }
188
+ catch (err) {
189
+ logger.error(`LLM cost budget ${(_a = budget.id) === null || _a === void 0 ? void 0 : _a.toString()} for project ${(_c = (_b = budget.projectId) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : "?"} failed: ${err instanceof Error ? err.message : String(err)}`, { projectId: (_d = budget.projectId) === null || _d === void 0 ? void 0 : _d.toString() });
190
+ }
191
+ }
192
+ }
193
+ /**
194
+ * Evaluate one budget: sum the day's spend, stamp it on the row, and
195
+ * publish the spend / percent-used metric points.
196
+ */
197
+ static async evaluateBudget(data) {
198
+ const budget = data.budget;
199
+ if (!budget.id || !budget.projectId || !budget.dailyBudgetInUSD) {
200
+ return;
201
+ }
202
+ const dayStart = this.getUtcDayStart(data.now);
203
+ const spendInUSD = await this.getSpendInUSD({
204
+ budget: budget,
205
+ dayStart: dayStart,
206
+ now: data.now,
207
+ });
208
+ const percentUsed = this.computePercentUsed({
209
+ spendInUSD: spendInUSD,
210
+ dailyBudgetInUSD: budget.dailyBudgetInUSD,
211
+ });
212
+ // Stamp the spend for the dashboard's Budgets tab.
213
+ await LlmCostBudgetService.updateOneById({
214
+ id: budget.id,
215
+ data: {
216
+ currentDaySpendInUSD: spendInUSD,
217
+ spendLastEvaluatedAt: data.now,
218
+ },
219
+ props: {
220
+ isRoot: true,
221
+ },
222
+ });
223
+ await this.writeBudgetMetrics({
224
+ budget: budget,
225
+ spendInUSD: spendInUSD,
226
+ percentUsed: percentUsed,
227
+ now: data.now,
228
+ });
229
+ }
230
+ /**
231
+ * Sum the day's llmCost for the budget's scope from ClickHouse.
232
+ */
233
+ static async getSpendInUSD(data) {
234
+ const aggregateBy = {
235
+ query: this.buildSpanQuery(data),
236
+ aggregationType: AggregationType.Sum,
237
+ aggregateColumnName: "llmCost",
238
+ aggregationTimestampColumnName: "startTime",
239
+ startTimestamp: data.dayStart,
240
+ endTimestamp: data.now,
241
+ // One total over the whole window — no time bucketing.
242
+ aggregationInterval: AggregationInterval.Total,
243
+ /*
244
+ * The sum feeds monitors: fail loud on a query timeout — the default
245
+ * 'break' overflow mode returns silently-partial sums, which would
246
+ * understate spend and suppress a real budget breach downstream.
247
+ */
248
+ timeoutOverflowMode: "throw",
249
+ limit: LIMIT_PER_PROJECT,
250
+ skip: 0,
251
+ props: {
252
+ isRoot: true,
253
+ },
254
+ };
255
+ const result = await SpanService.aggregateBy(aggregateBy);
256
+ return (result.data || []).reduce((acc, row) => {
257
+ return acc + Number(row.value || 0);
258
+ }, 0);
259
+ }
260
+ /**
261
+ * Publish the budget's spend and percent-used gauge points, and register
262
+ * the metric names so they appear in the dashboard's metric picker and the
263
+ * Metrics-monitor builder.
264
+ */
265
+ static async writeBudgetMetrics(data) {
266
+ const rows = this.buildBudgetMetricRows(data);
267
+ await MetricService.insertJsonRows(rows);
268
+ const spendType = new MetricType();
269
+ spendType.name = LLM_BUDGET_SPEND_METRIC_NAME;
270
+ spendType.description =
271
+ "LLM spend accrued so far in the current UTC day for an LLM cost budget, in USD. One point per budget every 15 minutes; filter by the oneuptime.llm.budget.id attribute.";
272
+ spendType.unit = "USD";
273
+ const percentType = new MetricType();
274
+ percentType.name = LLM_BUDGET_PERCENT_METRIC_NAME;
275
+ percentType.description =
276
+ "LLM spend as a percent of an LLM cost budget's daily limit. One point per budget every 15 minutes — alert with a Metrics monitor (e.g. value >= 80) using a rolling window of 30 minutes, filtered by oneuptime.llm.budget.id.";
277
+ percentType.unit = "%";
278
+ /*
279
+ * Registration is what makes the names show up in the metric picker —
280
+ * fire-and-forget, a registration failure must not fail the sweep.
281
+ */
282
+ TelemetryUtil.indexMetricNameServiceNameMap({
283
+ metricNameServiceNameMap: {
284
+ [LLM_BUDGET_SPEND_METRIC_NAME]: spendType,
285
+ [LLM_BUDGET_PERCENT_METRIC_NAME]: percentType,
286
+ },
287
+ projectId: data.budget.projectId,
288
+ }).catch((err) => {
289
+ logger.error(err);
290
+ });
291
+ }
292
+ }
293
+ __decorate([
294
+ CaptureSpan(),
295
+ __metadata("design:type", Function),
296
+ __metadata("design:paramtypes", []),
297
+ __metadata("design:returntype", Promise)
298
+ ], LlmCostBudgetEvaluator, "evaluateAllBudgets", null);
299
+ __decorate([
300
+ CaptureSpan(),
301
+ __metadata("design:type", Function),
302
+ __metadata("design:paramtypes", [Object]),
303
+ __metadata("design:returntype", Promise)
304
+ ], LlmCostBudgetEvaluator, "evaluateBudget", null);
305
+ __decorate([
306
+ CaptureSpan(),
307
+ __metadata("design:type", Function),
308
+ __metadata("design:paramtypes", [Object]),
309
+ __metadata("design:returntype", Promise)
310
+ ], LlmCostBudgetEvaluator, "getSpendInUSD", null);
311
+ __decorate([
312
+ CaptureSpan(),
313
+ __metadata("design:type", Function),
314
+ __metadata("design:paramtypes", [Object]),
315
+ __metadata("design:returntype", Promise)
316
+ ], LlmCostBudgetEvaluator, "writeBudgetMetrics", null);
317
+ //# sourceMappingURL=LlmCostBudgetEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LlmCostBudgetEvaluator.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { LlmAgentNameAttributeKeys, LlmAttributeNamespacePrefixes, LlmCostAttributeKeys, LlmInputTokenAttributeKeys, LlmOperationAttributeKeys, LlmOutputTokenAttributeKeys, LlmRequestModelAttributeKeys, LlmResponseModelAttributeKeys, LlmSystemAttributeKeys, LlmToolNameAttributeKeys, LlmTotalTokenAttributeKeys, } from "../../../Types/Telemetry/LlmConventions";
1
+ import { LlmCostCatalogUtil, } from "../../../Types/Telemetry/LlmCostCatalog";
2
+ import { LlmAgentNameAttributeKeys, LlmAttributeNamespacePrefixes, LlmConversationIdAttributeKeys, LlmCostAttributeKeys, LlmInputTokenAttributeKeys, LlmOperationAttributeKeys, LlmOutputTokenAttributeKeys, LlmRequestModelAttributeKeys, LlmResponseModelAttributeKeys, LlmSystemAttributeKeys, LlmToolNameAttributeKeys, LlmTotalTokenAttributeKeys, } from "../../../Types/Telemetry/LlmConventions";
2
3
  export default class LlmSpanUtil {
3
4
  /**
4
5
  * Return the empty/default LLM field set (non-LLM span).
@@ -16,13 +17,18 @@ export default class LlmSpanUtil {
16
17
  llmCost: 0,
17
18
  llmAgentName: "",
18
19
  llmToolName: "",
20
+ llmConversationId: "",
19
21
  };
20
22
  }
21
23
  /**
22
24
  * Extract first-class LLM fields from a flattened span attribute dictionary.
23
25
  * Pure + side-effect free so it can be unit tested in isolation.
26
+ *
27
+ * `projectPriceOverrides` are the project's custom model prices (loaded by
28
+ * the ingest pipeline); they take part in the cost fallback below with
29
+ * longest-prefix-wins semantics against the built-in catalog.
24
30
  */
25
- static extract(attributes) {
31
+ static extract(attributes, projectPriceOverrides) {
26
32
  const fields = this.empty();
27
33
  if (!attributes || typeof attributes !== "object") {
28
34
  return fields;
@@ -52,10 +58,47 @@ export default class LlmSpanUtil {
52
58
  (fields.llmInputTokens > 0 || fields.llmOutputTokens > 0)) {
53
59
  fields.llmTotalTokens = fields.llmInputTokens + fields.llmOutputTokens;
54
60
  }
55
- fields.llmCost = this.getNumber(attributes, LlmCostAttributeKeys);
61
+ /*
62
+ * Cost must distinguish "reported as 0" from "not reported at all": a
63
+ * gateway fronting a free local model (or a fully-cached call) reports an
64
+ * explicit cost of 0, and that 0 must win over any catalog estimate.
65
+ */
66
+ const reportedCost = this.getNumberOrNull(attributes, LlmCostAttributeKeys);
67
+ fields.llmCost = reportedCost !== null && reportedCost !== void 0 ? reportedCost : 0;
56
68
  fields.llmAgentName = this.getString(attributes, LlmAgentNameAttributeKeys);
57
69
  fields.llmToolName = this.getString(attributes, LlmToolNameAttributeKeys);
58
70
  fields.isLlmSpan = this.detectIsLlmSpan(keys, fields);
71
+ /*
72
+ * Conversation id is gated on isLlmSpan because one of its candidate keys
73
+ * ("session.id") is the generic OTel key RUM browser spans carry — those
74
+ * already denormalize it into the sessionId column, and stamping it here
75
+ * too would duplicate it (and its bloom-filter index) across the
76
+ * highest-volume span class for no reader.
77
+ */
78
+ if (fields.isLlmSpan) {
79
+ fields.llmConversationId = this.getString(attributes, LlmConversationIdAttributeKeys);
80
+ }
81
+ /*
82
+ * Cost fallback: the SDK-reported cost always wins — including an
83
+ * explicit 0 — but most instrumentations only report token counts. Price
84
+ * those against the project's custom price overrides and the built-in
85
+ * list-price catalog (longest prefix wins across both, project entries
86
+ * beat built-ins on ties) so spend shows up in dashboards and cost
87
+ * budgets without per-SDK pricing math. The response model is priced in
88
+ * preference to the request model — it names what the provider actually
89
+ * served (e.g. an alias like "gpt-4o" resolved to a dated snapshot).
90
+ */
91
+ if (fields.isLlmSpan && reportedCost === null) {
92
+ const computedCost = LlmCostCatalogUtil.computeCostInUSD({
93
+ model: fields.llmResponseModel || fields.llmRequestModel,
94
+ inputTokens: fields.llmInputTokens,
95
+ outputTokens: fields.llmOutputTokens,
96
+ projectPriceOverrides: projectPriceOverrides,
97
+ });
98
+ if (computedCost !== null) {
99
+ fields.llmCost = computedCost;
100
+ }
101
+ }
59
102
  return fields;
60
103
  }
61
104
  static detectIsLlmSpan(keys, fields) {
@@ -92,6 +135,15 @@ export default class LlmSpanUtil {
92
135
  return "";
93
136
  }
94
137
  static getNumber(attributes, candidateKeys) {
138
+ var _a;
139
+ return (_a = this.getNumberOrNull(attributes, candidateKeys)) !== null && _a !== void 0 ? _a : 0;
140
+ }
141
+ /**
142
+ * Like getNumber but null when no candidate key carries a parseable number
143
+ * — callers that must distinguish "reported as 0" from "absent" (cost) use
144
+ * this directly.
145
+ */
146
+ static getNumberOrNull(attributes, candidateKeys) {
95
147
  for (const key of candidateKeys) {
96
148
  const value = attributes[key];
97
149
  if (value === undefined || value === null || Array.isArray(value)) {
@@ -107,7 +159,7 @@ export default class LlmSpanUtil {
107
159
  }
108
160
  }
109
161
  }
110
- return 0;
162
+ return null;
111
163
  }
112
164
  }
113
165
  //# sourceMappingURL=LlmSpan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LlmSpan.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/LlmSpan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LlmSpan.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/LlmSpan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import TableColumnType from "../../../Types/AnalyticsDatabase/TableColumnType";
2
+ import { SQL, Statement } from "../AnalyticsDatabase/Statement";
3
+ import { LOG_ERROR_PATTERN_MAX_LENGTH, LOG_ERROR_PATTERN_RULES, } from "../../../Utils/Telemetry/LogErrorPattern";
4
+ /*
5
+ * Compiles the shared error-pattern rules (Common/Utils/Telemetry/
6
+ * LogErrorPattern) into the ClickHouse expression that does the grouping.
7
+ *
8
+ * The grouping has to happen in the database. Normalizing client-side would
9
+ * mean shipping a page of raw bodies to the browser and counting those,
10
+ * which answers "what are the top errors in the 5000 rows I happened to
11
+ * fetch" — a different, and much less useful, question than "what are the
12
+ * top errors in this window".
13
+ *
14
+ * Shape of the emitted expression, for rules r0..rN in order:
15
+ *
16
+ * trimBoth(substringUTF8(trimBoth(
17
+ * replaceRegexpAll(...replaceRegexpAll(ifNull(body,''), p0, x0)..., pN, xN)
18
+ * ), 1, 300))
19
+ *
20
+ * The innermost call is the FIRST rule, matching the sequential application
21
+ * order `normalizeLogBodyToErrorPattern` uses, and the trim/truncate/trim
22
+ * tail mirrors its `.trim()` -> `.slice()` -> `.trim()`. The shape is pinned
23
+ * by Common/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts.
24
+ *
25
+ * Truncation uses substringUTF8, NOT substring. ClickHouse's `substring`
26
+ * counts BYTES, so a 300-byte cut through a Japanese message or an emoji
27
+ * lands mid-sequence and the group key ends in a broken UTF-8 fragment. The
28
+ * UTF8 variant counts characters, which is also what the JavaScript
29
+ * normalizer's `.slice()` approximates. The two are not bit-identical for
30
+ * astral-plane characters (JS slices UTF-16 code units, so an emoji costs it
31
+ * two) — that only shifts where a very long pattern is cut, never what it
32
+ * groups, and is deliberately not claimed as exact parity.
33
+ *
34
+ * Patterns and replacements ride as bound query parameters rather than
35
+ * being interpolated. ClickHouse substitutes parameters into the AST as
36
+ * constant literals during parsing, so `replaceRegexpAll` still sees the
37
+ * constant regexp argument it requires (the same shape the Sigma compiler
38
+ * already relies on for `match(expr, {p:String})`), and no rule text ever
39
+ * reaches the SQL text itself.
40
+ */
41
+ /**
42
+ * The column expression the pattern is computed from.
43
+ *
44
+ * `body` is Nullable(String) on the Log table, and `replaceRegexpAll(NULL,
45
+ * ...)` is NULL — which would collapse every body-less row into one NULL
46
+ * group. Coalescing first turns those into the empty pattern, which the
47
+ * callers exclude with a `!= ''` predicate.
48
+ */
49
+ export const LOG_ERROR_PATTERN_SOURCE_EXPRESSION = "ifNull(body, '')";
50
+ /**
51
+ * Build the pattern expression over `sourceExpression`.
52
+ *
53
+ * `sourceExpression` is appended to the statement as trusted SQL — it must
54
+ * be a literal owned by this codebase (in practice always
55
+ * LOG_ERROR_PATTERN_SOURCE_EXPRESSION), never anything derived from a
56
+ * request.
57
+ */
58
+ export function buildLogErrorPatternExpression(sourceExpression = LOG_ERROR_PATTERN_SOURCE_EXPRESSION) {
59
+ const statement = new Statement();
60
+ statement.append("trimBoth(substringUTF8(trimBoth(");
61
+ // One open paren per rule; the arguments below close them inside-out.
62
+ statement.append("replaceRegexpAll(".repeat(LOG_ERROR_PATTERN_RULES.length));
63
+ statement.append(sourceExpression);
64
+ /*
65
+ * Ascending order: rule 0's arguments close the innermost call, so it is
66
+ * applied first — exactly as the JavaScript normalizer iterates.
67
+ */
68
+ for (const rule of LOG_ERROR_PATTERN_RULES) {
69
+ statement.append(SQL `, ${{
70
+ type: TableColumnType.Text,
71
+ value: rule.pattern,
72
+ }}, ${{
73
+ type: TableColumnType.Text,
74
+ value: rule.replacement,
75
+ }})`);
76
+ }
77
+ statement.append(SQL `), 1, ${{
78
+ type: TableColumnType.Number,
79
+ value: LOG_ERROR_PATTERN_MAX_LENGTH,
80
+ }}))`);
81
+ return statement;
82
+ }
83
+ /**
84
+ * How many bound parameters `buildLogErrorPatternExpression` contributes.
85
+ * Exported so callers reasoning about parameter budgets (and the tests that
86
+ * pin statement shapes) do not have to count rules by hand.
87
+ */
88
+ export function getLogErrorPatternParameterCount() {
89
+ return LOG_ERROR_PATTERN_RULES.length * 2 + 1;
90
+ }
91
+ /**
92
+ * Guard for a caller-supplied pattern value (the detail endpoints echo one
93
+ * back to scope their queries), bounding the parameter without changing
94
+ * which rows it matches.
95
+ *
96
+ * Counted in CODE POINTS, because that is what the expression above cuts
97
+ * by. Measuring in JavaScript's UTF-16 code units instead would mangle a
98
+ * legitimate key: a 300-code-point pattern containing one emoji has
99
+ * `.length === 301`, so the clamp would fire on a value the database
100
+ * considers exactly at the limit and slice it — leaving a lone surrogate at
101
+ * the tail when the emoji sits there. The bind would then match zero rows
102
+ * and, since nothing throws, every drill-down panel would come back
103
+ * cheerfully empty for a Top Errors row showing a real count.
104
+ */
105
+ export function clampLogErrorPattern(pattern) {
106
+ const codePoints = Array.from(pattern);
107
+ if (codePoints.length <= LOG_ERROR_PATTERN_MAX_LENGTH) {
108
+ return pattern;
109
+ }
110
+ return codePoints.slice(0, LOG_ERROR_PATTERN_MAX_LENGTH).join("");
111
+ }
112
+ //# sourceMappingURL=LogErrorPatternSql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogErrorPatternSql.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/LogErrorPatternSql.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,kDAAkD,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,GAExB,MAAM,0CAA0C,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAW,kBAAkB,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,mBAA2B,mCAAmC;IAE9D,MAAM,SAAS,GAAc,IAAI,SAAS,EAAE,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAErD,sEAAsE;IACtE,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7E,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEnC;;;OAGG;IACH,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,CAAC;QAC3C,SAAS,CAAC,MAAM,CACd,GAAG,CAAA,KAAK;YACN,IAAI,EAAE,eAAe,CAAC,IAAI;YAC1B,KAAK,EAAE,IAAI,CAAC,OAAO;SACpB,KAAK;YACJ,IAAI,EAAE,eAAe,CAAC,IAAI;YAC1B,KAAK,EAAE,IAAI,CAAC,WAAW;SACxB,GAAG,CACL,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,MAAM,CACd,GAAG,CAAA,SAAS;QACV,IAAI,EAAE,eAAe,CAAC,MAAM;QAC5B,KAAK,EAAE,4BAA4B;KACpC,IAAI,CACN,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC;IAC9C,OAAO,uBAAuB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,UAAU,GAAkB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,UAAU,CAAC,MAAM,IAAI,4BAA4B,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -25,6 +25,48 @@ export default class UserPermissionUtil {
25
25
  static buildTenantPermissionCacheKey(userId, projectId) {
26
26
  return `${userId.toString()}:${projectId.toString()}`;
27
27
  }
28
+ /*
29
+ * Adds the implicit `ProjectUser` grant to a member's permission set.
30
+ *
31
+ * `ProjectUser` is not stored on any TeamPermission row - it is what being a
32
+ * member of the project means, and it is what shared workspace resources
33
+ * (saved table views, labels, teams, member profiles) are read through. A
34
+ * user whose teams only grant a domain role such as `MonitorViewer` holds no
35
+ * project-wide role, so without this the dashboard refuses to render the very
36
+ * pages that role exists to give them.
37
+ *
38
+ * Applied on the way out of the cache as well as at refresh time. A snapshot
39
+ * written before this existed would otherwise keep a signed-in member locked
40
+ * out until something invalidated it, and the cache entry lives for 30 days
41
+ * (GlobalCache.setString's default) unless a team or membership change
42
+ * rewrites it first.
43
+ *
44
+ * Deliberately NOT part of `getDefaultUserTenantAccessPermission`: that is
45
+ * also the permission set handed to a user who has not satisfied a project's
46
+ * SSO requirement, and such a user is not yet a member for this purpose.
47
+ */
48
+ static withProjectUserPermission(permission) {
49
+ const alreadyGranted = permission.permissions.some((userPermission) => {
50
+ return userPermission.permission === Permission.ProjectUser;
51
+ });
52
+ if (alreadyGranted) {
53
+ return permission;
54
+ }
55
+ /*
56
+ * A new object rather than a push. The caller may be holding a snapshot
57
+ * that came out of a cache and is shared with something else; appending in
58
+ * place would grow that array once per read.
59
+ */
60
+ return Object.assign(Object.assign({}, permission), { permissions: [
61
+ ...permission.permissions,
62
+ {
63
+ permission: Permission.ProjectUser,
64
+ labelIds: [],
65
+ isBlockPermission: false,
66
+ _type: "UserPermission",
67
+ },
68
+ ] });
69
+ }
28
70
  static async getUserTenantAccessPermissionFromCache(userId, projectId) {
29
71
  const json = (await GlobalCache.getJSONObject(PermissionNamespace.ProjectPermission, this.buildTenantPermissionCacheKey(userId, projectId)));
30
72
  if (json) {
@@ -33,7 +75,10 @@ export default class UserPermissionUtil {
33
75
  if (!json) {
34
76
  return null;
35
77
  }
36
- return json;
78
+ if (!json.permissions) {
79
+ json.permissions = [];
80
+ }
81
+ return this.withProjectUserPermission(json);
37
82
  }
38
83
  static async getUserGlobalAccessPermissionFromCache(userId) {
39
84
  const json = await GlobalCache.getJSONObject("user", userId.toString());
@@ -1 +1 @@
1
- {"version":3,"file":"UserPermission.js","sourceRoot":"","sources":["../../../../../Server/Utils/UserPermission/UserPermission.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,UAIN,MAAM,2BAA2B,CAAC;AACnC,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,mBAAmB,MAAM,4CAA4C,CAAC;AAC7E,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC;;;;;;;;OAQG;IACI,MAAM,CAAC,6BAA6B,CACzC,MAAgB,EAChB,SAAmB;QAEnB,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC;IACxD,CAAC;IAGmB,AAAb,MAAM,CAAC,KAAK,CAAC,sCAAsC,CACxD,MAAgB,EAChB,SAAmB;QAEnB,MAAM,IAAI,GACR,CAAC,MAAM,WAAW,CAAC,aAAa,CAC9B,mBAAmB,CAAC,iBAAiB,EACrC,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,SAAS,CAAC,CACtD,CAA+B,CAAC;QAEnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,4BAA4B,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAGmB,AAAb,MAAM,CAAC,KAAK,CAAC,sCAAsC,CACxD,MAAgB;QAEhB,MAAM,IAAI,GAAsB,MAAM,WAAW,CAAC,aAAa,CAC7D,MAAM,EACN,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,gBAAgB,GACpB,IAAkC,CAAC;QAErC,gBAAgB,CAAC,KAAK,GAAG,4BAA4B,CAAC;QAEtD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAGa,AAAP,MAAM,CAAC,oCAAoC,CAChD,SAAmB;QAEnB,MAAM,eAAe,GAA0B,EAAE,CAAC;QAElD,eAAe,CAAC,IAAI,CAAC;YACnB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,QAAQ,EAAE,EAAE;YACZ,iBAAiB,EAAE,KAAK;YACxB,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,eAAe,CAAC,IAAI,CAAC;YACnB,UAAU,EAAE,UAAU,CAAC,mBAAmB;YAC1C,QAAQ,EAAE,EAAE;YACZ,iBAAiB,EAAE,KAAK;YACxB,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,MAAM,UAAU,GAA+B;YAC7C,SAAS;YACT,WAAW,EAAE,eAAe;YAC5B,iBAAiB,EAAE,KAAK;YACxB,KAAK,EAAE,4BAA4B;SACpC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAvEqB;IADnB,WAAW,EAAE;;qCAEJ,QAAQ;QACL,QAAQ;;sEAiBpB;AAGmB;IADnB,WAAW,EAAE;;qCAEJ,QAAQ;;sEAiBjB;AAGa;IADb,WAAW,EAAE;;qCAED,QAAQ;;oEA0BpB"}
1
+ {"version":3,"file":"UserPermission.js","sourceRoot":"","sources":["../../../../../Server/Utils/UserPermission/UserPermission.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ export var AIChatCitationTargetType;
34
34
  AIChatCitationTargetType["WorkflowView"] = "WorkflowView";
35
35
  AIChatCitationTargetType["Probes"] = "Probes";
36
36
  AIChatCitationTargetType["Teams"] = "Teams";
37
+ AIChatCitationTargetType["SecurityEvents"] = "SecurityEvents";
37
38
  })(AIChatCitationTargetType || (AIChatCitationTargetType = {}));
38
39
  /*
39
40
  * ---------------------------------------------------------------------------