@oneuptime/common 12.0.23 → 12.0.24

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 (294) hide show
  1. package/Models/DatabaseModels/DetectionRule.ts +55 -0
  2. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +27 -7
  3. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +67 -0
  4. package/Models/DatabaseModels/Project.ts +68 -0
  5. package/Models/DatabaseModels/User.ts +68 -0
  6. package/Server/API/TelemetryAPI.ts +29 -0
  7. package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  11. package/Server/Middleware/GzipRequestBody.ts +311 -0
  12. package/Server/Middleware/MultipartFormData.ts +87 -3
  13. package/Server/Services/DetectionRuleService.ts +73 -6
  14. package/Server/Services/Index.ts +205 -0
  15. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
  16. package/Server/Services/NetworkDeviceService.ts +148 -0
  17. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
  18. package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
  19. package/Server/Services/ProjectService.ts +29 -19
  20. package/Server/Services/SecurityEventService.ts +90 -13
  21. package/Server/Services/StatusPageResourceService.ts +223 -0
  22. package/Server/Services/TelemetryAttributeService.ts +17 -0
  23. package/Server/Services/UserService.ts +4 -6
  24. package/Server/Types/Markdown.ts +161 -67
  25. package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
  26. package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
  27. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
  28. package/Server/Utils/Attribution.ts +4 -0
  29. package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
  30. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
  31. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
  32. package/Server/Utils/StartServer.ts +12 -32
  33. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
  34. package/Server/Utils/Telemetry/LlmMetricSpend.ts +130 -0
  35. package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
  36. package/Server/Views/Partials/Head.ejs +2 -1
  37. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
  38. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
  39. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
  40. package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
  41. package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
  42. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
  43. package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
  44. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
  45. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
  46. package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
  47. package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
  48. package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
  49. package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
  50. package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
  51. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
  52. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
  53. package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
  54. package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
  55. package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
  56. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
  57. package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
  58. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
  59. package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
  60. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
  61. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
  62. package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
  63. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
  64. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
  65. package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
  66. package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
  67. package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
  68. package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
  69. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
  70. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
  71. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
  72. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
  73. package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
  74. package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
  75. package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
  76. package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
  77. package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
  78. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
  79. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
  80. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
  81. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
  82. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
  83. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +368 -4
  84. package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +245 -0
  85. package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
  86. package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
  87. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
  88. package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
  89. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
  90. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
  91. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
  92. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
  93. package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +193 -0
  94. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
  95. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
  96. package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
  97. package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
  98. package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
  99. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
  100. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
  101. package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
  102. package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
  103. package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
  104. package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
  105. package/Tests/UI/Components/SideOver.test.tsx +1 -1
  106. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
  107. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
  108. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
  109. package/Tests/UI/Components/Toggle.test.tsx +25 -0
  110. package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
  111. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
  112. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
  113. package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
  114. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
  115. package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +472 -0
  116. package/Types/Code/YamlSyntax.ts +396 -0
  117. package/Types/Exception/ExceptionCode.ts +1 -0
  118. package/Types/Exception/PayloadTooLargeException.ts +8 -0
  119. package/Types/Marketing/Attribution.ts +10 -0
  120. package/Types/Marketing/MarketingEvent.ts +4 -0
  121. package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
  122. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
  123. package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
  124. package/Types/Telemetry/LlmMetricConventions.ts +124 -0
  125. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
  126. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
  127. package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
  128. package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
  129. package/UI/Components/Detail/Detail.tsx +10 -0
  130. package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
  131. package/UI/Components/Forms/Fields/FormField.tsx +31 -0
  132. package/UI/Components/Forms/Types/Field.ts +8 -0
  133. package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
  134. package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
  135. package/UI/Components/Forms/Validation.ts +46 -0
  136. package/UI/Components/Input/Input.tsx +3 -0
  137. package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
  138. package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
  139. package/UI/Components/ModelTable/Column.ts +8 -0
  140. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
  141. package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
  142. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
  143. package/UI/Components/SideOver/SideOver.tsx +5 -5
  144. package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
  145. package/UI/Components/StatusPage/ResourceList.tsx +197 -38
  146. package/UI/Components/Toggle/Toggle.tsx +9 -1
  147. package/UI/Components/Types/FieldType.ts +1 -0
  148. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
  149. package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
  150. package/Utils/StatusPage/ResourceExplorer.ts +258 -0
  151. package/Utils/Telemetry/LlmMetricQuery.ts +204 -0
  152. package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
  153. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  154. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +27 -7
  155. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  156. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +69 -0
  157. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  158. package/build/dist/Models/DatabaseModels/Project.js +76 -0
  159. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/User.js +76 -0
  161. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  162. package/build/dist/Server/API/TelemetryAPI.js +17 -0
  163. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  164. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
  165. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
  166. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
  167. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
  168. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
  169. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js.map +1 -0
  170. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  171. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  172. package/build/dist/Server/Middleware/GzipRequestBody.js +224 -0
  173. package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
  174. package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
  175. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  176. package/build/dist/Server/Services/DetectionRuleService.js +49 -4
  177. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  178. package/build/dist/Server/Services/Index.js +204 -0
  179. package/build/dist/Server/Services/Index.js.map +1 -1
  180. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
  181. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  182. package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
  183. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  184. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
  185. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  186. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
  187. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
  188. package/build/dist/Server/Services/ProjectService.js +25 -45
  189. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  190. package/build/dist/Server/Services/SecurityEventService.js +57 -5
  191. package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
  192. package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
  193. package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
  194. package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
  195. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  196. package/build/dist/Server/Services/UserService.js +2 -12
  197. package/build/dist/Server/Services/UserService.js.map +1 -1
  198. package/build/dist/Server/Types/Markdown.js +147 -61
  199. package/build/dist/Server/Types/Markdown.js.map +1 -1
  200. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
  201. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
  202. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
  203. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  204. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
  205. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  206. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  207. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
  208. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  209. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
  210. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  211. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
  212. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  213. package/build/dist/Server/Utils/StartServer.js +12 -21
  214. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  215. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
  216. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
  217. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +102 -0
  218. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
  219. package/build/dist/Types/Code/YamlSyntax.js +212 -0
  220. package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
  221. package/build/dist/Types/Exception/ExceptionCode.js +1 -0
  222. package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
  223. package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
  224. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
  225. package/build/dist/Types/Marketing/Attribution.js +10 -0
  226. package/build/dist/Types/Marketing/Attribution.js.map +1 -1
  227. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
  228. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  229. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
  230. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  231. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
  232. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  233. package/build/dist/Types/Telemetry/LlmMetricConventions.js +98 -0
  234. package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
  235. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
  236. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  237. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
  238. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  239. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
  240. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  241. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
  242. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
  243. package/build/dist/UI/Components/Detail/Detail.js +9 -0
  244. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  245. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
  246. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  247. package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
  248. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  249. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  250. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
  251. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
  252. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
  253. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
  254. package/build/dist/UI/Components/Forms/Validation.js +27 -0
  255. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  256. package/build/dist/UI/Components/Input/Input.js +1 -1
  257. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  258. package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
  259. package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
  260. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
  261. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  262. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
  263. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  264. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
  265. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
  266. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
  267. package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
  268. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
  269. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  270. package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
  271. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  272. package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
  273. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  274. package/build/dist/UI/Components/Types/FieldType.js +1 -0
  275. package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
  276. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
  277. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  278. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
  279. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
  280. package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
  281. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
  282. package/build/dist/Utils/Telemetry/LlmMetricQuery.js +119 -0
  283. package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
  284. package/jest.config.json +2 -0
  285. package/package.json +1 -1
  286. package/tsconfig.json +2 -1
  287. package/Tests/UI/Components/Toast.test.tsx +0 -197
  288. package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
  289. package/UI/Components/Toast/Toast.tsx +0 -189
  290. package/UI/Components/Toast/ToastInit.tsx +0 -110
  291. package/build/dist/UI/Components/Toast/Toast.js +0 -123
  292. package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
  293. package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
  294. package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
@@ -7,6 +7,7 @@ import React, {
7
7
  FunctionComponent,
8
8
  ReactElement,
9
9
  useEffect,
10
+ useMemo,
10
11
  useRef,
11
12
  useState,
12
13
  } from "react";
@@ -30,6 +31,12 @@ export interface ComponentProps {
30
31
  showLineNumbers?: boolean | undefined;
31
32
  disableSpellCheck?: boolean | undefined;
32
33
  ariaLabelledby?: string | undefined;
34
+ /** Ids of the elements describing this control (hint, status, error). */
35
+ ariaDescribedby?: string | undefined;
36
+ /** Marks the control invalid to assistive technology. */
37
+ ariaInvalid?: boolean | undefined;
38
+ /** CSS height handed to Monaco. Defaults to "30vh". */
39
+ height?: string | undefined;
33
40
  }
34
41
 
35
42
  /*
@@ -106,6 +113,17 @@ const CodeEditor: FunctionComponent<ComponentProps> = (
106
113
  if (props.type === CodeType.CSS) {
107
114
  setPlaceholder(`/* ${props.placeholder}. This is in CSS. */`);
108
115
  }
116
+
117
+ /*
118
+ * Help text, never `setPlaceholder`: whatever setPlaceholder holds is
119
+ * rendered into `defaultValue` below, i.e. it becomes real document
120
+ * text. The JS and CSS arms above get away with it because they wrap
121
+ * the hint in a comment; an unwrapped YAML hint would be content the
122
+ * user can accidentally save, and the server would reject it.
123
+ */
124
+ if (props.type === CodeType.YAML) {
125
+ setHelpText(`${props.placeholder}`);
126
+ }
109
127
  }
110
128
  }, [props.placeholder, props.type]);
111
129
 
@@ -121,21 +139,222 @@ const CodeEditor: FunctionComponent<ComponentProps> = (
121
139
  "block w-full rounded-md border bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-red-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-red-500 sm:text-sm border-red-300 pr-10 text-red-900 placeholder-red-300 focus:border-red-500 focus:outline-none focus:ring-red-500";
122
140
  }
123
141
 
142
+ const isYaml: boolean = props.type === CodeType.YAML;
143
+
144
+ type GetInputAreaFunction = (editor: any) => HTMLTextAreaElement | null;
145
+
146
+ /*
147
+ * Monaco's real focusable control. The wrapper <div> this component returns
148
+ * has no role, and ARIA forbids naming a role=generic element - so every
149
+ * accessibility attribute has to land here instead.
150
+ */
151
+ const getInputArea: GetInputAreaFunction = (
152
+ editor: any,
153
+ ): HTMLTextAreaElement | null => {
154
+ const domNode: HTMLElement | null = editor?.getDomNode?.() || null;
155
+
156
+ if (!domNode) {
157
+ return null;
158
+ }
159
+
160
+ return domNode.querySelector("textarea");
161
+ };
162
+
163
+ type ApplyAriaFunction = (editor: any) => void;
164
+
165
+ const applyAria: ApplyAriaFunction = (editor: any): void => {
166
+ const inputArea: HTMLTextAreaElement | null = getInputArea(editor);
167
+
168
+ if (!inputArea) {
169
+ return;
170
+ }
171
+
172
+ /*
173
+ * aria-labelledby wins over the aria-label Monaco puts here itself
174
+ * ("Editor content"), so the field's own label names the editor.
175
+ */
176
+ if (props.ariaLabelledby) {
177
+ inputArea.setAttribute("aria-labelledby", props.ariaLabelledby);
178
+ } else {
179
+ inputArea.removeAttribute("aria-labelledby");
180
+ }
181
+
182
+ if (props.ariaDescribedby) {
183
+ inputArea.setAttribute("aria-describedby", props.ariaDescribedby);
184
+ } else {
185
+ inputArea.removeAttribute("aria-describedby");
186
+ }
187
+
188
+ if (props.ariaInvalid) {
189
+ inputArea.setAttribute("aria-invalid", "true");
190
+ } else {
191
+ inputArea.removeAttribute("aria-invalid");
192
+ }
193
+ };
194
+
195
+ type ApplyModelOptionsFunction = (editor: any) => void;
196
+
197
+ /*
198
+ * Per-model, not per-editor and emphatically not global: a literal tab is
199
+ * illegal as YAML indentation, and Monaco's model defaults are four spaces
200
+ * with indentation detected from the initial content - so a rule pasted in
201
+ * tab-indented would keep emitting tabs the parser rejects.
202
+ */
203
+ const applyModelOptions: ApplyModelOptionsFunction = (editor: any): void => {
204
+ if (!isYaml) {
205
+ return;
206
+ }
207
+
208
+ const model: any = editor?.getModel?.();
209
+
210
+ if (!model || typeof model.updateOptions !== "function") {
211
+ return;
212
+ }
213
+
214
+ model.updateOptions({ tabSize: 2, insertSpaces: true });
215
+ };
216
+
217
+ /*
218
+ * Markdown is prose, so it follows the caller's preference. YAML is code:
219
+ * red squiggles under every key name in a Sigma rule are pure noise, so
220
+ * spell check is off for it regardless of what the caller asked for.
221
+ */
222
+ const shouldSpellCheck: boolean = isYaml ? false : !props.disableSpellCheck;
223
+ const managesSpellCheck: boolean = props.type === CodeType.Markdown || isYaml;
224
+
225
+ type ApplySpellCheckFunction = (editor: any) => void;
226
+
227
+ const applySpellCheck: ApplySpellCheckFunction = (editor: any): void => {
228
+ if (!editor || !managesSpellCheck) {
229
+ return;
230
+ }
231
+
232
+ const domNode: HTMLElement | null = editor.getDomNode();
233
+
234
+ if (!domNode) {
235
+ return;
236
+ }
237
+
238
+ const textareaElement: HTMLTextAreaElement | null =
239
+ domNode.querySelector("textarea");
240
+
241
+ if (textareaElement) {
242
+ textareaElement.spellcheck = shouldSpellCheck;
243
+ }
244
+ };
245
+
124
246
  // Handle spell check configuration for Monaco Editor
125
247
  useEffect(() => {
126
- if (editorRef.current && props.type === CodeType.Markdown) {
127
- const editor: any = editorRef.current;
128
- const domNode: HTMLElement | null = editor.getDomNode();
129
- if (domNode) {
130
- const textareaElement: HTMLTextAreaElement | null =
131
- domNode.querySelector("textarea");
132
- if (textareaElement) {
133
- textareaElement.spellcheck = !props.disableSpellCheck;
134
- }
135
- }
136
- }
248
+ applySpellCheck(editorRef.current);
249
+ applyModelOptions(editorRef.current);
250
+ // eslint-disable-next-line
137
251
  }, [props.disableSpellCheck, props.type]);
138
252
 
253
+ useEffect(() => {
254
+ applyAria(editorRef.current);
255
+ // eslint-disable-next-line
256
+ }, [props.ariaLabelledby, props.ariaDescribedby, props.ariaInvalid]);
257
+
258
+ /*
259
+ * Memoised: @monaco-editor/react calls editor.updateOptions() whenever this
260
+ * object's identity changes, so an inline literal reconfigured the editor on
261
+ * every parent re-render - which for the indentation options below would
262
+ * reset them mid-keystroke.
263
+ */
264
+ const editorOptions: Record<string, unknown> = useMemo(() => {
265
+ return {
266
+ acceptSuggestionOnCommitCharacter: false,
267
+ acceptSuggestionOnEnter: "off",
268
+ accessibilitySupport: "auto",
269
+ fontSize: 14,
270
+ automaticLayout: true,
271
+ codeLens: false,
272
+ colorDecorators: true,
273
+ contextmenu: false,
274
+ cursorBlinking: "blink",
275
+ tabIndex: props.tabIndex || 0,
276
+ minimap: { enabled: false },
277
+ cursorStyle: "line",
278
+ disableLayerHinting: false,
279
+ disableMonospaceOptimizations: false,
280
+ dragAndDrop: false,
281
+ fixedOverflowWidgets: false,
282
+ folding: true,
283
+ foldingStrategy: "auto",
284
+ fontLigatures: false,
285
+ formatOnPaste: false,
286
+ formatOnType: false,
287
+
288
+ hideCursorInOverviewRuler: false,
289
+ links: true,
290
+ mouseWheelZoom: false,
291
+ multiCursorMergeOverlapping: true,
292
+ multiCursorModifier: "alt",
293
+ overviewRulerBorder: true,
294
+ overviewRulerLanes: 2,
295
+ quickSuggestions: false,
296
+ quickSuggestionsDelay: 100,
297
+ readOnly: props.readOnly || false,
298
+ renderControlCharacters: false,
299
+ /*
300
+ * Long scalars - a URL, a base64 blob, a Sigma `condition:` line - run
301
+ * off the right edge, and with wordWrap off for code there is no other
302
+ * way to reach them. Wrapping YAML instead is not an option: the
303
+ * indentation IS the syntax, and a wrapped line reads as a deeper one.
304
+ */
305
+ scrollbar: {
306
+ horizontal: isYaml ? "auto" : "hidden",
307
+ },
308
+ renderLineHighlight: "all",
309
+ suggestOnTriggerCharacters: false,
310
+ /*
311
+ * In YAML whitespace is the syntax. Rendering it at the boundaries makes
312
+ * the indentation depth countable and, more importantly, makes a literal
313
+ * tab visible - tabs are illegal as YAML indentation and are otherwise
314
+ * indistinguishable from spaces.
315
+ */
316
+ renderWhitespace: isYaml ? "boundary" : "none",
317
+ revealHorizontalRightPadding: 30,
318
+ roundedSelection: true,
319
+ rulers: [],
320
+ scrollBeyondLastColumn: 5,
321
+ // Half a short editor as blank runway is wasted space in a form field.
322
+ scrollBeyondLastLine: !isYaml,
323
+ selectOnLineNumbers: true,
324
+ /*
325
+ * Every YAML parse error - ours and the server's - is reported as a
326
+ * line and column, so the gutter is what makes the message actionable.
327
+ */
328
+ lineNumbers: props.showLineNumbers || isYaml ? "on" : "off",
329
+ selectionClipboard: true,
330
+ selectionHighlight: true,
331
+ showFoldingControls: "mouseover",
332
+ smoothScrolling: false,
333
+ wordBasedSuggestions: "off",
334
+ wordWrap: props.type === CodeType.Markdown ? "on" : "off",
335
+ tabCompletion: "off",
336
+ // The YAML chrome owns the padding, so the editor supplies its own.
337
+ padding: isYaml ? { top: 10, bottom: 10 } : undefined,
338
+ /*
339
+ * tabSize / insertSpaces / detectIndentation deliberately do NOT belong
340
+ * here. They are IGlobalEditorOptions: monaco's standalone editor pipes
341
+ * whatever it is constructed with through updateConfigurationService,
342
+ * which writes every registered `editor.*` key into a PROCESS-WIDE
343
+ * config service - and those three are exactly the ones ModelService
344
+ * reads back, pushing them onto every model on the page. Setting them
345
+ * here would mean the last editor to mount dictates the indentation of
346
+ * all the others. They are applied to this editor's own model instead,
347
+ * in applyModelOptions below.
348
+ */
349
+ };
350
+ }, [
351
+ props.tabIndex,
352
+ props.readOnly,
353
+ props.showLineNumbers,
354
+ props.type,
355
+ isYaml,
356
+ ]);
357
+
139
358
  return (
140
359
  <div
141
360
  data-testid={props.dataTestId}
@@ -159,7 +378,13 @@ const CodeEditor: FunctionComponent<ComponentProps> = (
159
378
  <Editor
160
379
  theme={theme === Theme.Dark ? "vs-dark" : "light"}
161
380
  defaultLanguage={props.type}
162
- height="30vh"
381
+ /*
382
+ * `defaultLanguage` is applied only when the model is created, so a
383
+ * caller that swaps CodeType after mount keeps the old grammar.
384
+ * `language` is the prop that drives setModelLanguage afterwards.
385
+ */
386
+ language={props.type}
387
+ height={props.height || "30vh"}
163
388
  value={value}
164
389
  onChange={(code: string | undefined) => {
165
390
  if (code === undefined) {
@@ -176,76 +401,13 @@ const CodeEditor: FunctionComponent<ComponentProps> = (
176
401
  }}
177
402
  onMount={(editor: any, _monaco: any) => {
178
403
  editorRef.current = editor;
179
-
180
- // Configure spell check for Markdown
181
- if (props.type === CodeType.Markdown) {
182
- const domNode: HTMLElement | null = editor.getDomNode();
183
- if (domNode) {
184
- const textareaElement: HTMLTextAreaElement | null =
185
- domNode.querySelector("textarea");
186
- if (textareaElement) {
187
- textareaElement.spellcheck = !props.disableSpellCheck;
188
- }
189
- }
190
- }
404
+ applySpellCheck(editor);
405
+ applyModelOptions(editor);
406
+ applyAria(editor);
191
407
  }}
192
408
  defaultValue={value || placeholder || ""}
193
409
  className={className}
194
- options={{
195
- acceptSuggestionOnCommitCharacter: false,
196
- acceptSuggestionOnEnter: "off",
197
- accessibilitySupport: "auto",
198
- fontSize: 14,
199
- automaticLayout: true,
200
- codeLens: false,
201
- colorDecorators: true,
202
- contextmenu: false,
203
- cursorBlinking: "blink",
204
- tabIndex: props.tabIndex || 0,
205
- minimap: { enabled: false },
206
- cursorStyle: "line",
207
- disableLayerHinting: false,
208
- disableMonospaceOptimizations: false,
209
- dragAndDrop: false,
210
- fixedOverflowWidgets: false,
211
- folding: true,
212
- foldingStrategy: "auto",
213
- fontLigatures: false,
214
- formatOnPaste: false,
215
- formatOnType: false,
216
-
217
- hideCursorInOverviewRuler: false,
218
- links: true,
219
- mouseWheelZoom: false,
220
- multiCursorMergeOverlapping: true,
221
- multiCursorModifier: "alt",
222
- overviewRulerBorder: true,
223
- overviewRulerLanes: 2,
224
- quickSuggestions: false,
225
- quickSuggestionsDelay: 100,
226
- readOnly: props.readOnly || false,
227
- renderControlCharacters: false,
228
- scrollbar: {
229
- horizontal: "hidden",
230
- },
231
- renderLineHighlight: "all",
232
- suggestOnTriggerCharacters: false,
233
- renderWhitespace: "none",
234
- revealHorizontalRightPadding: 30,
235
- roundedSelection: true,
236
- rulers: [],
237
- scrollBeyondLastColumn: 5,
238
- scrollBeyondLastLine: true,
239
- selectOnLineNumbers: true,
240
- lineNumbers: props.showLineNumbers ? "on" : "off",
241
- selectionClipboard: true,
242
- selectionHighlight: true,
243
- showFoldingControls: "mouseover",
244
- smoothScrolling: false,
245
- wordBasedSuggestions: "off",
246
- wordWrap: props.type === CodeType.Markdown ? "on" : "off",
247
- tabCompletion: "off",
248
- }}
410
+ options={editorOptions}
249
411
  />
250
412
  {props.error && (
251
413
  <p className="mt-1 text-sm text-red-400">{props.error}</p>