@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,293 @@
1
+ /**
2
+ * NetworkDeviceDiscoveryScan.name column contract (issue #3391).
3
+ *
4
+ * A discovery scan used to be identified in the product by its target alone,
5
+ * so a list of them read as a column of octet ranges. This column is the
6
+ * operator's own sentence about what the scan is FOR, and everything below
7
+ * pins a property that, quietly changed, either loses that sentence or turns
8
+ * an optional label into something that can refuse a write.
9
+ *
10
+ * Three properties matter more than the rest:
11
+ *
12
+ * - OPTIONAL and un-backfilled. Every scan that already existed has no name,
13
+ * and a NOT NULL column (or a backfilled one) would either fail the
14
+ * migration or invent a name nobody wrote.
15
+ * - UPDATABLE. Almost nothing on this model is: the target and the
16
+ * credentials describe a sweep already handed to a probe. A name describes
17
+ * nothing but itself, and a mislabelled scan is worse than an unlabelled
18
+ * one, so it joins the recurrence pair as the third editable column.
19
+ * - NOT unique and NOT slugged. It is a label for humans, never a key: two
20
+ * scans of the same range may legitimately be called the same thing.
21
+ */
22
+
23
+ import NetworkDeviceDiscoveryScan from "../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
24
+ import { TableColumnMetadata } from "../../Types/Database/TableColumn";
25
+ import TableColumnType from "../../Types/Database/TableColumnType";
26
+ import ColumnLength from "../../Types/Database/ColumnLength";
27
+ import Columns from "../../Types/Database/Columns";
28
+ import Permission from "../../Types/Permission";
29
+ import { describe, expect, test } from "@jest/globals";
30
+ import { getMetadataArgsStorage } from "typeorm";
31
+ import { ColumnMetadataArgs } from "typeorm/metadata-args/ColumnMetadataArgs";
32
+ import fs from "fs";
33
+ import path from "path";
34
+
35
+ const COLUMN: string = "name";
36
+
37
+ const MIGRATIONS_DIR: string = path.join(
38
+ __dirname,
39
+ "..",
40
+ "..",
41
+ "Server",
42
+ "Infrastructure",
43
+ "Postgres",
44
+ "SchemaMigrations",
45
+ );
46
+
47
+ const MIGRATION_CLASS: string =
48
+ "AddNameToNetworkDeviceDiscoveryScan1789400000000";
49
+
50
+ const MIGRATION_PATH: string = path.join(
51
+ MIGRATIONS_DIR,
52
+ "1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts",
53
+ );
54
+
55
+ function metadata(): TableColumnMetadata {
56
+ return new NetworkDeviceDiscoveryScan().getTableColumnMetadata(COLUMN);
57
+ }
58
+
59
+ function typeOrmColumn(): ColumnMetadataArgs | undefined {
60
+ return getMetadataArgsStorage().columns.find((column: ColumnMetadataArgs) => {
61
+ return (
62
+ column.target === NetworkDeviceDiscoveryScan &&
63
+ column.propertyName === COLUMN
64
+ );
65
+ });
66
+ }
67
+
68
+ describe("NetworkDeviceDiscoveryScan.name", () => {
69
+ test("exists as a ShortText column", () => {
70
+ expect(metadata()).toBeDefined();
71
+ expect(metadata().type).toBe(TableColumnType.ShortText);
72
+ expect(metadata().title).toBe("Name");
73
+ });
74
+
75
+ /*
76
+ * The whole point of the field. A required name would put a wall in front of
77
+ * the operator sweeping one subnet once, which is the case the Discovery
78
+ * page was built for in the first place.
79
+ */
80
+ test("is optional, so a scan can still be created without one", () => {
81
+ expect(metadata().required).toBeFalsy();
82
+ expect(typeOrmColumn()).toBeDefined();
83
+ expect(typeOrmColumn()?.options.nullable).toBe(true);
84
+ });
85
+
86
+ test("is stored at the width the shared validator caps names at", () => {
87
+ expect(typeOrmColumn()?.options.length).toBe(ColumnLength.ShortText);
88
+ });
89
+
90
+ /*
91
+ * A default would name every unnamed scan the same thing, which is exactly
92
+ * the state the issue describes as unreadable.
93
+ */
94
+ test("has no default value", () => {
95
+ expect(typeOrmColumn()?.options.default).toBeUndefined();
96
+ expect(new NetworkDeviceDiscoveryScan().isDefaultValueColumn(COLUMN)).toBe(
97
+ false,
98
+ );
99
+ });
100
+
101
+ test("is not unique, because a name is a label and not a key", () => {
102
+ expect(typeOrmColumn()?.options.unique).toBeFalsy();
103
+
104
+ const uniqueColumns: Columns =
105
+ new NetworkDeviceDiscoveryScan().getUniqueColumns();
106
+
107
+ expect(uniqueColumns.columns).not.toContain(COLUMN);
108
+ });
109
+
110
+ /*
111
+ * Slugs are opt-in through @SlugifyColumn. A scan is never addressed by
112
+ * name, and slugging one would add a second column to keep in step with a
113
+ * value the operator is expected to rewrite.
114
+ */
115
+ test("is not slugified", () => {
116
+ expect(new NetworkDeviceDiscoveryScan().getSlugifyColumn()).toBeFalsy();
117
+ });
118
+ });
119
+
120
+ describe("NetworkDeviceDiscoveryScan.name migration", () => {
121
+ test("adds a nullable varchar without backfilling existing scans", () => {
122
+ const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
123
+
124
+ expect(migration).toContain('ALTER TABLE "NetworkDeviceDiscoveryScan"');
125
+ expect(migration).toContain(`ADD "${COLUMN}" character varying(100)`);
126
+ /*
127
+ * No NOT NULL, no DEFAULT and no UPDATE: scans created before this column
128
+ * existed stay unnamed, and every surface falls back to their target.
129
+ */
130
+ expect(migration).not.toContain("NOT NULL");
131
+ expect(migration).not.toContain("DEFAULT");
132
+ expect(migration).not.toContain("UPDATE");
133
+ });
134
+
135
+ test("its down() removes the column", () => {
136
+ const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
137
+
138
+ expect(migration).toContain(
139
+ `ALTER TABLE "NetworkDeviceDiscoveryScan" DROP COLUMN "${COLUMN}"`,
140
+ );
141
+ });
142
+
143
+ /*
144
+ * TypeORM records a migration under its `public name` property, not its
145
+ * class name, and nothing else in the suite compares the two. A rename that
146
+ * updates the class and forgets the literal leaves the deployed identity on
147
+ * the old value.
148
+ */
149
+ test("its class name, file name and recorded name all agree", () => {
150
+ const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
151
+
152
+ expect(migration).toContain(`export class ${MIGRATION_CLASS}`);
153
+ expect(migration).toContain(`public name: string = "${MIGRATION_CLASS}"`);
154
+ });
155
+
156
+ test("is registered, so the column actually exists at runtime", () => {
157
+ const index: string = fs.readFileSync(
158
+ path.join(MIGRATIONS_DIR, "Index.ts"),
159
+ "utf8",
160
+ );
161
+
162
+ // Imported AND listed in the exported array - the import alone does nothing.
163
+ expect(index.match(new RegExp(MIGRATION_CLASS, "g"))?.length).toBe(2);
164
+ });
165
+ });
166
+
167
+ describe("NetworkDeviceDiscoveryScan.name access control", () => {
168
+ const CREATORS: Array<Permission> = [
169
+ Permission.ProjectOwner,
170
+ Permission.ProjectAdmin,
171
+ Permission.ProjectMember,
172
+ Permission.SettingsAdmin,
173
+ Permission.SettingsMember,
174
+ Permission.CreateNetworkDeviceDiscoveryScan,
175
+ ];
176
+
177
+ const READERS: Array<Permission> = [
178
+ Permission.ProjectOwner,
179
+ Permission.ProjectAdmin,
180
+ Permission.ProjectMember,
181
+ Permission.Viewer,
182
+ Permission.SettingsAdmin,
183
+ Permission.SettingsMember,
184
+ Permission.SettingsViewer,
185
+ Permission.ReadNetworkDeviceDiscoveryScan,
186
+ ];
187
+
188
+ const EDITORS: Array<Permission> = [
189
+ Permission.ProjectOwner,
190
+ Permission.ProjectAdmin,
191
+ Permission.ProjectMember,
192
+ Permission.SettingsAdmin,
193
+ Permission.SettingsMember,
194
+ Permission.EditNetworkDeviceDiscoveryScan,
195
+ ];
196
+
197
+ test("is set by whoever may create a scan", () => {
198
+ expect(
199
+ new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)
200
+ ?.create,
201
+ ).toEqual(CREATORS);
202
+ });
203
+
204
+ test("is read by everyone who may read a scan, viewers included", () => {
205
+ expect(
206
+ new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)?.read,
207
+ ).toEqual(READERS);
208
+ });
209
+
210
+ /*
211
+ * The Rename dialog on the Discovery page depends on this list being
212
+ * non-empty — ModelForm drops a field whose column grants no update
213
+ * permission, so an empty list here would turn the dialog into a permission
214
+ * error rather than a text box.
215
+ */
216
+ test("can be edited by whoever may edit the scan", () => {
217
+ expect(
218
+ new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)
219
+ ?.update,
220
+ ).toEqual(EDITORS);
221
+ });
222
+
223
+ /*
224
+ * And the sweep itself stays read-only. This is the claim worth pinning:
225
+ * adding an editable column must not have made anything that DESCRIBES a
226
+ * sweep editable with it. A target or a credential changed after a probe
227
+ * took the scan would leave the stored row describing a sweep that never
228
+ * ran, and a status or a result changed by hand would be a lie about one
229
+ * that did.
230
+ *
231
+ * (The recurrence pair is editable, and always was — it describes the NEXT
232
+ * run rather than the one that happened.)
233
+ */
234
+ test("does not make any part of the sweep editable", () => {
235
+ const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
236
+
237
+ const sweepColumns: Array<string> = [
238
+ "cidr",
239
+ "probeId",
240
+ "snmpVersion",
241
+ "snmpCommunityString",
242
+ "snmpPort",
243
+ "snmpV3SecurityLevel",
244
+ "snmpV3Username",
245
+ "snmpV3AuthProtocol",
246
+ "snmpV3AuthKey",
247
+ "snmpV3PrivProtocol",
248
+ "snmpV3PrivKey",
249
+ "status",
250
+ "statusMessage",
251
+ "discoveredDevices",
252
+ "scannedHostCount",
253
+ "respondedHostCount",
254
+ "startedAt",
255
+ "completedAt",
256
+ "nextScanAt",
257
+ ];
258
+
259
+ for (const column of sweepColumns) {
260
+ expect({
261
+ column: column,
262
+ update: scan.getColumnAccessControlFor(column)?.update,
263
+ }).toEqual({ column: column, update: [] });
264
+ }
265
+ });
266
+
267
+ // ...while the two columns that describe a future run stay editable.
268
+ test("leaves the recurrence pair editable, as it already was", () => {
269
+ const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
270
+
271
+ for (const column of ["isRecurring", "rescanIntervalInMinutes"]) {
272
+ expect(scan.getColumnAccessControlFor(column)?.update).toEqual(EDITORS);
273
+ }
274
+ });
275
+
276
+ /*
277
+ * Everything the operator can edit has to be something the table itself
278
+ * accepts an update for, or the row-level check refuses the write before the
279
+ * column-level one is ever consulted.
280
+ */
281
+ test("its editors are editors of the table too", () => {
282
+ const tableUpdatePermissions: Array<Permission> =
283
+ new NetworkDeviceDiscoveryScan().getUpdatePermissions();
284
+
285
+ for (const permission of EDITORS) {
286
+ expect(tableUpdatePermissions).toContain(permission);
287
+ }
288
+ });
289
+
290
+ test("is readable from a relation query, like the target beside it", () => {
291
+ expect(metadata().canReadOnRelationQuery).toBe(true);
292
+ });
293
+ });
@@ -151,6 +151,7 @@ describe("BaseAPI", () => {
151
151
  } as OneUptimeRequest;
152
152
 
153
153
  beforeAll(async () => {
154
+ mockRouter.routes.length = 0;
154
155
  mockRouter.post.mockClear();
155
156
  mockRouter.get.mockClear();
156
157
  mockRouter.put.mockClear();
@@ -208,11 +209,49 @@ describe("BaseAPI", () => {
208
209
  expect.any(Function),
209
210
  );
210
211
 
212
+ expect(Express.getRouter().post).toHaveBeenCalledWith(
213
+ "/mock/:id/update-item",
214
+ UserMiddleware.getUserMiddleware,
215
+ expect.any(Function),
216
+ );
217
+
211
218
  expect(Express.getRouter().delete).toHaveBeenCalledWith(
212
219
  "/mock/:id",
213
220
  UserMiddleware.getUserMiddleware,
214
221
  expect.any(Function),
215
222
  );
223
+
224
+ expect(Express.getRouter().post).toHaveBeenCalledWith(
225
+ "/mock/:id/delete-item",
226
+ UserMiddleware.getUserMiddleware,
227
+ expect.any(Function),
228
+ );
229
+ });
230
+
231
+ it("does not register state-changing GET aliases", () => {
232
+ const registeredGetPaths: Array<string> = mockRouter.routes
233
+ .filter((route: { method: string }) => {
234
+ return route.method === "GET";
235
+ })
236
+ .map((route: { uri: string }) => {
237
+ return route.uri;
238
+ });
239
+
240
+ expect(registeredGetPaths).not.toContain("/mock/:id/update-item");
241
+ expect(registeredGetPaths).not.toContain("/mock/:id/delete-item");
242
+ });
243
+
244
+ it("keeps read-only GET compatibility routes", () => {
245
+ const registeredGetPaths: Array<string> = mockRouter.routes
246
+ .filter((route: { method: string }) => {
247
+ return route.method === "GET";
248
+ })
249
+ .map((route: { uri: string }) => {
250
+ return route.uri;
251
+ });
252
+
253
+ expect(registeredGetPaths).toContain("/mock/get-list");
254
+ expect(registeredGetPaths).toContain("/mock/:id/get-item");
216
255
  });
217
256
  });
218
257
 
@@ -226,7 +265,9 @@ describe("BaseAPI", () => {
226
265
  ["POST", "/mock/:id/get-item", "getItem"],
227
266
  ["GET", "/mock/:id/get-item", "getItem"],
228
267
  ["PUT", "/mock/:id", "updateItem"],
268
+ ["POST", "/mock/:id/update-item", "updateItem"],
229
269
  ["DELETE", "/mock/:id", "deleteItem"],
270
+ ["POST", "/mock/:id/delete-item", "deleteItem"],
230
271
  ] as [string, string, string][];
231
272
 
232
273
  for (const [method, uri, shouldBeCalled] of checkRoutes) {
@@ -261,11 +261,7 @@ describe("BaseAPI.updateItem payload validation", () => {
261
261
  });
262
262
  });
263
263
 
264
- /*
265
- * PUT /:id, POST /:id/update-item and GET /:id/update-item all land on this
266
- * one handler, so none of them can be left answering 200 to a payload that
267
- * writes nothing. GET carries no body at all.
268
- */
264
+ /* PUT /:id and POST /:id/update-item both land on this one handler. */
269
265
  describe("across every route that reaches updateItem", () => {
270
266
  it("refuses the flat body on the POST update-item route", async () => {
271
267
  const request: OneUptimeRequest = requestWithBody({
@@ -278,15 +274,7 @@ describe("BaseAPI.updateItem payload validation", () => {
278
274
  );
279
275
  });
280
276
 
281
- it("refuses the bodyless GET update-item route instead of quietly writing nothing", async () => {
282
- await expect(
283
- api.updateItem(requestWithBody({}), response),
284
- ).rejects.toThrow(BadDataException);
285
-
286
- expect(service.updateOneById).not.toHaveBeenCalled();
287
- });
288
-
289
- it("registers all three update routes", () => {
277
+ it("registers only non-GET update routes", () => {
290
278
  const crudPath: string = new Probe().getCrudApiPath()!.toString();
291
279
 
292
280
  expect(mockRouter.match("PUT", `${crudPath}/:id`)).toBeTruthy();
@@ -294,8 +282,13 @@ describe("BaseAPI.updateItem payload validation", () => {
294
282
  mockRouter.match("POST", `${crudPath}/:id/update-item`),
295
283
  ).toBeTruthy();
296
284
  expect(
297
- mockRouter.match("GET", `${crudPath}/:id/update-item`),
298
- ).toBeTruthy();
285
+ mockRouter.routes.some((route: { method: string; uri: string }) => {
286
+ return (
287
+ route.method === "GET" &&
288
+ route.uri === `${crudPath}/:id/update-item`
289
+ );
290
+ }),
291
+ ).toBe(false);
299
292
  });
300
293
  });
301
294