@oneuptime/common 12.0.23 → 12.0.25

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 (323) hide show
  1. package/Models/AnalyticsModels/Span.ts +101 -0
  2. package/Models/DatabaseModels/DetectionRule.ts +55 -0
  3. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +27 -7
  4. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +67 -0
  5. package/Models/DatabaseModels/Project.ts +68 -0
  6. package/Models/DatabaseModels/User.ts +68 -0
  7. package/Server/API/BaseAPI.ts +0 -24
  8. package/Server/API/SlackAPI.ts +0 -2
  9. package/Server/API/TelemetryAPI.ts +29 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  14. package/Server/Middleware/GzipRequestBody.ts +311 -0
  15. package/Server/Middleware/MultipartFormData.ts +87 -3
  16. package/Server/Middleware/SlackAuthorization.ts +96 -18
  17. package/Server/Services/DetectionRuleService.ts +73 -6
  18. package/Server/Services/Index.ts +205 -0
  19. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
  20. package/Server/Services/NetworkDeviceService.ts +148 -0
  21. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
  22. package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
  23. package/Server/Services/ProjectService.ts +29 -19
  24. package/Server/Services/SecurityEventService.ts +90 -13
  25. package/Server/Services/StatusPageResourceService.ts +223 -0
  26. package/Server/Services/TelemetryAttributeService.ts +17 -0
  27. package/Server/Services/UserService.ts +4 -6
  28. package/Server/Types/Markdown.ts +161 -67
  29. package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
  30. package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
  31. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
  32. package/Server/Utils/Attribution.ts +4 -0
  33. package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
  34. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
  35. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
  36. package/Server/Utils/StartServer.ts +12 -32
  37. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
  38. package/Server/Utils/Telemetry/LlmMetricSpend.ts +181 -0
  39. package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
  40. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
  41. package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
  42. package/Server/Views/Partials/Head.ejs +2 -1
  43. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
  44. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
  45. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
  46. package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
  47. package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
  48. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
  49. package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
  50. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
  51. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
  52. package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
  53. package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
  54. package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
  55. package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
  56. package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
  57. package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
  58. package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
  59. package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
  60. package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
  61. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
  62. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
  63. package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
  64. package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
  65. package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
  66. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
  67. package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
  68. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
  69. package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
  70. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
  71. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
  72. package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
  73. package/Tests/Server/API/BaseAPI.test.ts +41 -0
  74. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
  75. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
  76. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
  77. package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
  78. package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
  79. package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
  80. package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
  81. package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
  82. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
  83. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
  84. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
  85. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
  86. package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
  87. package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
  88. package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
  89. package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
  90. package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
  91. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
  92. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
  93. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
  94. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
  95. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
  96. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +387 -4
  97. package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +386 -0
  98. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
  99. package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
  100. package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
  101. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
  102. package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
  103. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
  104. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
  105. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
  106. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
  107. package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +584 -0
  108. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
  109. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
  110. package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
  111. package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
  112. package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
  113. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
  114. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
  115. package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
  116. package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
  117. package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
  118. package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
  119. package/Tests/UI/Components/SideOver.test.tsx +1 -1
  120. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
  121. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
  122. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
  123. package/Tests/UI/Components/Toggle.test.tsx +25 -0
  124. package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
  125. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
  126. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
  127. package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
  128. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
  129. package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +770 -0
  130. package/Types/Code/YamlSyntax.ts +396 -0
  131. package/Types/Exception/ExceptionCode.ts +1 -0
  132. package/Types/Exception/PayloadTooLargeException.ts +8 -0
  133. package/Types/Marketing/Attribution.ts +10 -0
  134. package/Types/Marketing/MarketingEvent.ts +4 -0
  135. package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
  136. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
  137. package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
  138. package/Types/Telemetry/LlmConventions.ts +255 -0
  139. package/Types/Telemetry/LlmMetricConventions.ts +329 -0
  140. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
  141. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
  142. package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
  143. package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
  144. package/UI/Components/Detail/Detail.tsx +10 -0
  145. package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
  146. package/UI/Components/Forms/Fields/FormField.tsx +31 -0
  147. package/UI/Components/Forms/Types/Field.ts +8 -0
  148. package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
  149. package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
  150. package/UI/Components/Forms/Validation.ts +46 -0
  151. package/UI/Components/Input/Input.tsx +3 -0
  152. package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
  153. package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
  154. package/UI/Components/ModelTable/Column.ts +8 -0
  155. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
  156. package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
  157. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
  158. package/UI/Components/SideOver/SideOver.tsx +5 -5
  159. package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
  160. package/UI/Components/StatusPage/ResourceList.tsx +197 -38
  161. package/UI/Components/Toggle/Toggle.tsx +9 -1
  162. package/UI/Components/Types/FieldType.ts +1 -0
  163. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
  164. package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
  165. package/Utils/StatusPage/ResourceExplorer.ts +258 -0
  166. package/Utils/Telemetry/LlmMetricQuery.ts +287 -0
  167. package/build/dist/Models/AnalyticsModels/Span.js +89 -0
  168. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
  170. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +27 -7
  172. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  173. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +69 -0
  174. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/Project.js +76 -0
  176. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/User.js +76 -0
  178. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  179. package/build/dist/Server/API/BaseAPI.js +3 -19
  180. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  181. package/build/dist/Server/API/SlackAPI.js +0 -2
  182. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  183. package/build/dist/Server/API/TelemetryAPI.js +17 -0
  184. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  185. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
  190. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js.map +1 -0
  191. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  192. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  193. package/build/dist/Server/Middleware/GzipRequestBody.js +224 -0
  194. package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
  195. package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
  196. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  197. package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
  198. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  199. package/build/dist/Server/Services/DetectionRuleService.js +49 -4
  200. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  201. package/build/dist/Server/Services/Index.js +204 -0
  202. package/build/dist/Server/Services/Index.js.map +1 -1
  203. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
  204. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  205. package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
  206. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  207. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
  208. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  209. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
  210. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
  211. package/build/dist/Server/Services/ProjectService.js +25 -45
  212. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  213. package/build/dist/Server/Services/SecurityEventService.js +57 -5
  214. package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
  215. package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
  216. package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
  217. package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
  218. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  219. package/build/dist/Server/Services/UserService.js +2 -12
  220. package/build/dist/Server/Services/UserService.js.map +1 -1
  221. package/build/dist/Server/Types/Markdown.js +147 -61
  222. package/build/dist/Server/Types/Markdown.js.map +1 -1
  223. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
  224. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
  225. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
  226. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  227. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
  228. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  229. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  230. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
  231. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  232. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
  233. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  234. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
  235. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  236. package/build/dist/Server/Utils/StartServer.js +12 -21
  237. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  238. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
  239. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
  240. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +151 -0
  241. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
  242. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
  243. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  244. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
  245. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  246. package/build/dist/Types/Code/YamlSyntax.js +212 -0
  247. package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
  248. package/build/dist/Types/Exception/ExceptionCode.js +1 -0
  249. package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
  250. package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
  251. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
  252. package/build/dist/Types/Marketing/Attribution.js +10 -0
  253. package/build/dist/Types/Marketing/Attribution.js.map +1 -1
  254. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
  255. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  256. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
  257. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  258. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
  259. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  260. package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
  261. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  262. package/build/dist/Types/Telemetry/LlmMetricConventions.js +290 -0
  263. package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
  264. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
  265. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  266. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
  267. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  268. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
  269. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  270. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
  271. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
  272. package/build/dist/UI/Components/Detail/Detail.js +9 -0
  273. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  274. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
  275. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  276. package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
  277. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  278. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  279. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
  280. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
  281. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
  282. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
  283. package/build/dist/UI/Components/Forms/Validation.js +27 -0
  284. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  285. package/build/dist/UI/Components/Input/Input.js +1 -1
  286. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  287. package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
  288. package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
  289. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
  290. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  291. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
  292. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  293. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
  294. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
  295. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
  296. package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
  297. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
  298. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  299. package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
  300. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  301. package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
  302. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  303. package/build/dist/UI/Components/Types/FieldType.js +1 -0
  304. package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
  305. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
  306. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  307. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
  308. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
  309. package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
  310. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
  311. package/build/dist/Utils/Telemetry/LlmMetricQuery.js +175 -0
  312. package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
  313. package/jest.config.json +2 -0
  314. package/package.json +1 -1
  315. package/tsconfig.json +2 -1
  316. package/Tests/UI/Components/Toast.test.tsx +0 -197
  317. package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
  318. package/UI/Components/Toast/Toast.tsx +0 -189
  319. package/UI/Components/Toast/ToastInit.tsx +0 -110
  320. package/build/dist/UI/Components/Toast/Toast.js +0 -123
  321. package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
  322. package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
  323. package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
@@ -0,0 +1,386 @@
1
+ import Metric from "../../../../Models/AnalyticsModels/Metric";
2
+ import AggregationInterval from "../../../../Types/BaseDatabase/AggregationInterval";
3
+ import AggregationType from "../../../../Types/BaseDatabase/AggregationType";
4
+ import Includes from "../../../../Types/BaseDatabase/Includes";
5
+ import ObjectID from "../../../../Types/ObjectID";
6
+ import {
7
+ LlmCostMetricNames,
8
+ LlmMicroUsdCostMetricNames,
9
+ LlmTokenTypeAttributeKeys,
10
+ LlmTokenUsageMetricNames,
11
+ } from "../../../../Types/Telemetry/LlmMetricConventions";
12
+ import AggregateBy from "../../../../Server/Types/AnalyticsDatabase/AggregateBy";
13
+ import MetricService from "../../../../Server/Services/MetricService";
14
+ import LlmMetricSpend from "../../../../Server/Utils/Telemetry/LlmMetricSpend";
15
+ import { LlmMetricScope } from "../../../../Utils/Telemetry/LlmMetricQuery";
16
+ /*
17
+ * `jest` deliberately comes from the global scope, not @jest/globals — the
18
+ * imported value would shadow the global `jest` NAMESPACE and break the
19
+ * `jest.Mock` type annotations below (house convention).
20
+ */
21
+ import { beforeEach, describe, expect, test } from "@jest/globals";
22
+
23
+ jest.mock("../../../../Server/Services/MetricService", () => {
24
+ return {
25
+ __esModule: true,
26
+ default: {
27
+ aggregateBy: jest.fn(),
28
+ },
29
+ };
30
+ });
31
+
32
+ type MockedFn = jest.Mock;
33
+
34
+ const mockedMetricService: { aggregateBy: MockedFn } =
35
+ MetricService as unknown as {
36
+ aggregateBy: MockedFn;
37
+ };
38
+
39
+ const PROJECT_ID: ObjectID = ObjectID.generate();
40
+ const SERVICE_ID: ObjectID = ObjectID.generate();
41
+ const START: Date = new Date("2026-08-26T00:00:00.000Z");
42
+ const END: Date = new Date("2026-08-26T09:30:00.000Z");
43
+
44
+ function scope(overrides?: Partial<LlmMetricScope>): LlmMetricScope {
45
+ return {
46
+ projectId: PROJECT_ID,
47
+ startTime: START,
48
+ endTime: END,
49
+ ...overrides,
50
+ };
51
+ }
52
+
53
+ describe("LlmMetricSpend", () => {
54
+ beforeEach(() => {
55
+ mockedMetricService.aggregateBy.mockReset();
56
+ });
57
+
58
+ describe("buildCostAggregateBy", () => {
59
+ test("sums the value column over the whole window", () => {
60
+ const aggregate: AggregateBy<Metric> =
61
+ LlmMetricSpend.buildCostAggregateBy(scope());
62
+
63
+ expect(aggregate.aggregationType).toBe(AggregationType.Sum);
64
+ expect(aggregate.aggregateColumnName).toBe("value");
65
+ expect(aggregate.aggregationTimestampColumnName).toBe("time");
66
+ expect(aggregate.aggregationInterval).toBe(AggregationInterval.Total);
67
+ expect(aggregate.startTimestamp).toBe(START);
68
+ expect(aggregate.endTimestamp).toBe(END);
69
+ });
70
+
71
+ /*
72
+ * The figure feeds budget monitors. The default 'break' overflow mode
73
+ * returns silently-partial sums on a query timeout, which would understate
74
+ * spend and suppress a real breach.
75
+ */
76
+ test("fails loud on query timeout rather than returning a partial sum", () => {
77
+ expect(
78
+ LlmMetricSpend.buildCostAggregateBy(scope()).timeoutOverflowMode,
79
+ ).toBe("throw");
80
+ });
81
+
82
+ test("runs with root props — the worker has no user context", () => {
83
+ expect(LlmMetricSpend.buildCostAggregateBy(scope()).props).toEqual({
84
+ isRoot: true,
85
+ });
86
+ });
87
+
88
+ test("selects the cost metric names", () => {
89
+ const query: Record<string, unknown> =
90
+ LlmMetricSpend.buildCostAggregateBy(scope()).query as unknown as Record<
91
+ string,
92
+ unknown
93
+ >;
94
+
95
+ expect((query["name"] as Includes).values).toEqual(LlmCostMetricNames);
96
+ });
97
+
98
+ test("is not grouped — cost needs one scalar total", () => {
99
+ expect(
100
+ LlmMetricSpend.buildCostAggregateBy(scope()).groupByAttributeKeys,
101
+ ).toBeUndefined();
102
+ });
103
+
104
+ test("carries the caller's scoping into the query", () => {
105
+ const query: Record<string, unknown> =
106
+ LlmMetricSpend.buildCostAggregateBy(
107
+ scope({ serviceId: SERVICE_ID, llmSystem: "openai" }),
108
+ ).query as unknown as Record<string, unknown>;
109
+
110
+ expect(query["primaryEntityId"]).toBe(SERVICE_ID);
111
+ expect(query["attributes"]).toEqual({ "gen_ai.system": "openai" });
112
+ });
113
+ });
114
+
115
+ /*
116
+ * The micro-USD aggregate. It exists as a SECOND query for one reason: the
117
+ * recognized cost metrics come in two units, and a single Sum over both
118
+ * would add millionths of a dollar to dollars with no way to recover the
119
+ * unit afterwards. A $3 Codex turn would reach a budget as $3,000,000.
120
+ */
121
+ describe("buildMicroUsdCostAggregateBy", () => {
122
+ test("selects the micro-USD metric names", () => {
123
+ const query: Record<string, unknown> =
124
+ LlmMetricSpend.buildMicroUsdCostAggregateBy(scope())
125
+ .query as unknown as Record<string, unknown>;
126
+
127
+ expect((query["name"] as Includes).values).toEqual(
128
+ LlmMicroUsdCostMetricNames,
129
+ );
130
+ });
131
+
132
+ test("never selects a USD cost metric name", () => {
133
+ const query: Record<string, unknown> =
134
+ LlmMetricSpend.buildMicroUsdCostAggregateBy(scope())
135
+ .query as unknown as Record<string, unknown>;
136
+
137
+ const names: Array<string> = (query["name"] as Includes)
138
+ .values as Array<string>;
139
+
140
+ for (const name of names) {
141
+ expect(LlmCostMetricNames).not.toContain(name);
142
+ }
143
+ });
144
+
145
+ test("sums the value column over the whole window, like the USD query", () => {
146
+ const aggregate: AggregateBy<Metric> =
147
+ LlmMetricSpend.buildMicroUsdCostAggregateBy(scope());
148
+
149
+ expect(aggregate.aggregationType).toBe(AggregationType.Sum);
150
+ expect(aggregate.aggregateColumnName).toBe("value");
151
+ expect(aggregate.aggregationInterval).toBe(AggregationInterval.Total);
152
+ expect(aggregate.startTimestamp).toBe(START);
153
+ expect(aggregate.endTimestamp).toBe(END);
154
+ });
155
+
156
+ test("fails loud on query timeout", () => {
157
+ expect(
158
+ LlmMetricSpend.buildMicroUsdCostAggregateBy(scope())
159
+ .timeoutOverflowMode,
160
+ ).toBe("throw");
161
+ });
162
+
163
+ test("carries the caller's scoping into the query", () => {
164
+ const query: Record<string, unknown> =
165
+ LlmMetricSpend.buildMicroUsdCostAggregateBy(
166
+ scope({ serviceId: SERVICE_ID, llmSystem: "openai" }),
167
+ ).query as unknown as Record<string, unknown>;
168
+
169
+ expect(query["primaryEntityId"]).toBe(SERVICE_ID);
170
+ expect(query["attributes"]).toEqual({ "gen_ai.system": "openai" });
171
+ });
172
+ });
173
+
174
+ describe("buildTokenAggregateBy", () => {
175
+ test("selects the token usage metric names", () => {
176
+ const query: Record<string, unknown> =
177
+ LlmMetricSpend.buildTokenAggregateBy(scope())
178
+ .query as unknown as Record<string, unknown>;
179
+
180
+ expect((query["name"] as Includes).values).toEqual(
181
+ LlmTokenUsageMetricNames,
182
+ );
183
+ });
184
+
185
+ /*
186
+ * Grouping by every candidate token-type key in ONE query is what keeps
187
+ * the fold both complete and free of double counting — a query per key
188
+ * would double-count any datapoint carrying two of them.
189
+ */
190
+ test("groups by every recognized token type attribute key", () => {
191
+ expect(
192
+ LlmMetricSpend.buildTokenAggregateBy(scope()).groupByAttributeKeys,
193
+ ).toEqual(LlmTokenTypeAttributeKeys);
194
+ });
195
+
196
+ test("does not alias the shared conventions array", () => {
197
+ const keys: Array<string> = LlmMetricSpend.buildTokenAggregateBy(scope())
198
+ .groupByAttributeKeys as Array<string>;
199
+
200
+ keys.push("mutation");
201
+
202
+ expect(LlmTokenTypeAttributeKeys).not.toContain("mutation");
203
+ });
204
+
205
+ test("fails loud on query timeout", () => {
206
+ expect(
207
+ LlmMetricSpend.buildTokenAggregateBy(scope()).timeoutOverflowMode,
208
+ ).toBe("throw");
209
+ });
210
+ });
211
+
212
+ describe("getCostInUSD", () => {
213
+ test("sums the returned buckets", async () => {
214
+ mockedMetricService.aggregateBy.mockResolvedValue({
215
+ data: [
216
+ { timestamp: START, value: 1.25 },
217
+ { timestamp: START, value: 2.75 },
218
+ ],
219
+ });
220
+
221
+ await expect(LlmMetricSpend.getCostInUSD(scope())).resolves.toBeCloseTo(
222
+ 4,
223
+ );
224
+ });
225
+
226
+ test("returns 0 when nothing matched", async () => {
227
+ mockedMetricService.aggregateBy.mockResolvedValue({ data: [] });
228
+
229
+ await expect(LlmMetricSpend.getCostInUSD(scope())).resolves.toBe(0);
230
+ });
231
+
232
+ test("returns 0 when the result has no data field", async () => {
233
+ mockedMetricService.aggregateBy.mockResolvedValue({});
234
+
235
+ await expect(LlmMetricSpend.getCostInUSD(scope())).resolves.toBe(0);
236
+ });
237
+
238
+ test("propagates a query failure instead of reporting zero spend", async () => {
239
+ mockedMetricService.aggregateBy.mockRejectedValue(
240
+ new Error("clickhouse timeout"),
241
+ );
242
+
243
+ await expect(LlmMetricSpend.getCostInUSD(scope())).rejects.toThrow(
244
+ "clickhouse timeout",
245
+ );
246
+ });
247
+
248
+ /*
249
+ * TWO aggregates, not one — this count changed deliberately when the
250
+ * micro-USD emitters (the Codex CLI) were recognized. The two name lists
251
+ * carry different UNITS, so they cannot share a Sum; see
252
+ * buildMicroUsdCostAggregateBy above.
253
+ */
254
+ test("issues one aggregate per cost unit", async () => {
255
+ mockedMetricService.aggregateBy.mockResolvedValue({ data: [] });
256
+
257
+ await LlmMetricSpend.getCostInUSD(scope());
258
+
259
+ expect(mockedMetricService.aggregateBy).toHaveBeenCalledTimes(2);
260
+ });
261
+
262
+ test("the two cost aggregates select disjoint metric names", async () => {
263
+ mockedMetricService.aggregateBy.mockResolvedValue({ data: [] });
264
+
265
+ await LlmMetricSpend.getCostInUSD(scope());
266
+
267
+ const selected: Array<Array<string>> =
268
+ mockedMetricService.aggregateBy.mock.calls.map(
269
+ (call: Array<unknown>): Array<string> => {
270
+ const aggregate: AggregateBy<Metric> =
271
+ call[0] as AggregateBy<Metric>;
272
+ const query: Record<string, unknown> =
273
+ aggregate.query as unknown as Record<string, unknown>;
274
+
275
+ return (query["name"] as Includes).values as Array<string>;
276
+ },
277
+ );
278
+
279
+ expect(selected).toHaveLength(2);
280
+ expect(selected[0]).toEqual(LlmCostMetricNames);
281
+ expect(selected[1]).toEqual(LlmMicroUsdCostMetricNames);
282
+
283
+ const overlap: Array<string> = selected[0]!.filter((name: string) => {
284
+ return selected[1]!.includes(name);
285
+ });
286
+
287
+ expect(overlap).toEqual([]);
288
+ });
289
+
290
+ /*
291
+ * The million-fold regression, end to end: a Codex turn reported as
292
+ * 1,500,000 micro-USD must reach a budget as $1.50, not $1,500,000.
293
+ */
294
+ test("scales micro-USD spend by 1e-6 before adding it to USD spend", async () => {
295
+ mockedMetricService.aggregateBy
296
+ .mockResolvedValueOnce({ data: [{ timestamp: START, value: 0.5 }] })
297
+ .mockResolvedValueOnce({
298
+ data: [{ timestamp: START, value: 1_500_000 }],
299
+ });
300
+
301
+ await expect(LlmMetricSpend.getCostInUSD(scope())).resolves.toBeCloseTo(
302
+ 2,
303
+ 10,
304
+ );
305
+ });
306
+
307
+ test("micro-USD-only spend is still reported rather than lost", async () => {
308
+ // The metrics-only Codex fleet: no USD cost metric exists at all.
309
+ mockedMetricService.aggregateBy
310
+ .mockResolvedValueOnce({ data: [] })
311
+ .mockResolvedValueOnce({
312
+ data: [{ timestamp: START, value: 2_250_000 }],
313
+ });
314
+
315
+ await expect(LlmMetricSpend.getCostInUSD(scope())).resolves.toBeCloseTo(
316
+ 2.25,
317
+ 10,
318
+ );
319
+ });
320
+
321
+ test("a micro-USD query failure is not swallowed into a low total", async () => {
322
+ /*
323
+ * Both aggregates run in parallel; a failure in EITHER must propagate.
324
+ * Silently treating the failed one as zero would understate spend and
325
+ * suppress a real budget breach — the same reasoning as the
326
+ * timeoutOverflowMode: "throw" above.
327
+ */
328
+ mockedMetricService.aggregateBy
329
+ .mockResolvedValueOnce({ data: [{ timestamp: START, value: 1 }] })
330
+ .mockRejectedValueOnce(new Error("clickhouse timeout"));
331
+
332
+ await expect(LlmMetricSpend.getCostInUSD(scope())).rejects.toThrow(
333
+ "clickhouse timeout",
334
+ );
335
+ });
336
+ });
337
+
338
+ describe("getTokenTotals", () => {
339
+ test("folds grouped rows into input and output totals", async () => {
340
+ mockedMetricService.aggregateBy.mockResolvedValue({
341
+ data: [
342
+ {
343
+ timestamp: START,
344
+ value: 900,
345
+ attributes: { "gen_ai.token.type": "input" },
346
+ },
347
+ {
348
+ timestamp: START,
349
+ value: 300,
350
+ attributes: { "gen_ai.token.type": "output" },
351
+ },
352
+ ],
353
+ });
354
+
355
+ await expect(LlmMetricSpend.getTokenTotals(scope())).resolves.toEqual({
356
+ inputTokens: 900,
357
+ outputTokens: 300,
358
+ });
359
+ });
360
+
361
+ test("returns zeros when nothing matched", async () => {
362
+ mockedMetricService.aggregateBy.mockResolvedValue({ data: [] });
363
+
364
+ await expect(LlmMetricSpend.getTokenTotals(scope())).resolves.toEqual({
365
+ inputTokens: 0,
366
+ outputTokens: 0,
367
+ });
368
+ });
369
+
370
+ test("propagates a query failure", async () => {
371
+ mockedMetricService.aggregateBy.mockRejectedValue(new Error("boom"));
372
+
373
+ await expect(LlmMetricSpend.getTokenTotals(scope())).rejects.toThrow(
374
+ "boom",
375
+ );
376
+ });
377
+
378
+ test("issues exactly one aggregate for both directions", async () => {
379
+ mockedMetricService.aggregateBy.mockResolvedValue({ data: [] });
380
+
381
+ await LlmMetricSpend.getTokenTotals(scope());
382
+
383
+ expect(mockedMetricService.aggregateBy).toHaveBeenCalledTimes(1);
384
+ });
385
+ });
386
+ });