@oneuptime/common 12.0.5 → 12.0.6

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 (528) hide show
  1. package/Models/DatabaseModels/AIRun.ts +33 -0
  2. package/Models/DatabaseModels/DataSource.ts +744 -0
  3. package/Models/DatabaseModels/Index.ts +3 -0
  4. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
  5. package/Models/DatabaseModels/User.ts +2 -0
  6. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  7. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  8. package/Models/DatabaseModels/UserSession.ts +2 -0
  9. package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
  10. package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
  11. package/Server/API/AIInsightAPI.ts +47 -4
  12. package/Server/API/AIInvestigationAPI.ts +25 -0
  13. package/Server/API/DashboardAPI.ts +176 -492
  14. package/Server/API/DataSourceAPI.ts +268 -0
  15. package/Server/API/StatusPageAPI.ts +11 -1
  16. package/Server/API/UserAPI.ts +119 -0
  17. package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  22. package/Server/Infrastructure/Queue.ts +26 -0
  23. package/Server/Infrastructure/QueueWorker.ts +17 -0
  24. package/Server/Middleware/TelemetryIngest.ts +8 -3
  25. package/Server/Services/AIInsightService.ts +132 -12
  26. package/Server/Services/AIRunService.ts +34 -0
  27. package/Server/Services/AIService.ts +17 -2
  28. package/Server/Services/AlertService.ts +38 -32
  29. package/Server/Services/AnalyticsDatabaseService.ts +8 -4
  30. package/Server/Services/DataSourceService.ts +200 -0
  31. package/Server/Services/HostService.ts +92 -0
  32. package/Server/Services/IncidentService.ts +45 -0
  33. package/Server/Services/Index.ts +2 -0
  34. package/Server/Services/MonitorService.ts +49 -0
  35. package/Server/Services/MonitorStatusService.ts +166 -0
  36. package/Server/Services/OpenTelemetryIngestService.ts +255 -184
  37. package/Server/Services/RumSessionPinService.ts +7 -21
  38. package/Server/Services/StatusPageSubscriberService.ts +13 -0
  39. package/Server/Services/UserService.ts +280 -9
  40. package/Server/Static/Vendor/README.md +62 -0
  41. package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
  42. package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
  43. package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
  44. package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
  45. package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
  46. package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
  47. package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
  48. package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
  49. package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
  50. package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
  51. package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
  52. package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
  53. package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
  54. package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
  55. package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
  56. package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
  57. package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
  58. package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
  59. package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
  60. package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
  61. package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
  62. package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
  63. package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
  64. package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
  65. package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
  66. package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
  67. package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
  68. package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
  69. package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
  70. package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
  71. package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
  72. package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
  73. package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
  74. package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
  75. package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
  76. package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
  77. package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
  78. package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
  79. package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
  80. package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
  81. package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
  82. package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
  83. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
  84. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
  85. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
  86. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
  87. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
  88. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
  89. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
  90. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
  91. package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
  92. package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
  93. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
  94. package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
  95. package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
  96. package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
  97. package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
  98. package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
  99. package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
  100. package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
  101. package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
  102. package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
  103. package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
  104. package/Server/Utils/DataSource/EgressGuard.ts +446 -0
  105. package/Server/Utils/DataSource/HttpFetch.ts +221 -0
  106. package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
  107. package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
  108. package/Server/Utils/DataSource/Types.ts +93 -0
  109. package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
  110. package/Server/Utils/InProcessMemo.ts +141 -0
  111. package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
  112. package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
  113. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  114. package/Server/Utils/Response.ts +12 -1
  115. package/Server/Utils/SSRFProtection.ts +237 -0
  116. package/Server/Utils/StartServer.ts +8 -0
  117. package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
  118. package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
  119. package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
  120. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
  121. package/Server/Utils/Telemetry/Telemetry.ts +112 -1
  122. package/Server/Utils/Telemetry.ts +104 -3
  123. package/Server/Utils/VendorAssets.ts +165 -0
  124. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
  125. package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
  126. package/Server/Views/Partials/Head.ejs +21 -7
  127. package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
  128. package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
  129. package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
  130. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
  131. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
  132. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
  133. package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
  134. package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
  135. package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
  136. package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
  137. package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
  138. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
  139. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
  140. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
  141. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
  142. package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
  143. package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
  144. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
  145. package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
  146. package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
  147. package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
  148. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
  149. package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
  150. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
  151. package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
  152. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
  153. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
  154. package/Tests/Server/Services/AIInsightService.test.ts +266 -11
  155. package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
  156. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
  157. package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
  158. package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
  159. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
  160. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
  161. package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
  162. package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
  163. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
  165. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
  166. package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
  167. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
  168. package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
  169. package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
  170. package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
  171. package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
  172. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
  173. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
  174. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
  175. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
  176. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
  177. package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
  178. package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
  179. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
  180. package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
  181. package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
  182. package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
  183. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
  184. package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
  185. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
  186. package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
  187. package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
  188. package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
  189. package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
  190. package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
  191. package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
  192. package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
  193. package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
  194. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
  195. package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
  196. package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
  197. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
  198. package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
  199. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
  200. package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
  201. package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
  202. package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
  203. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
  205. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
  206. package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
  207. package/Tests/Server/Utils/Telemetry.test.ts +87 -0
  208. package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
  209. package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
  210. package/Tests/Server/Views/OfflineRender.test.ts +297 -0
  211. package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
  212. package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
  213. package/Tests/Types/Password.test.ts +363 -0
  214. package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
  215. package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
  216. package/Tests/UI/Components/Modal.test.tsx +281 -1
  217. package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
  218. package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
  219. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
  220. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  221. package/Tests/Utils/Analytics.test.ts +23 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
  223. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
  224. package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
  225. package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
  226. package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
  227. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
  228. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
  229. package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
  230. package/Types/AI/AIInsightEvidence.ts +6 -0
  231. package/Types/Analytics/RevenueEvent.ts +31 -0
  232. package/Types/Dashboard/DashboardComponentType.ts +31 -0
  233. package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
  234. package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
  235. package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
  236. package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
  237. package/Types/DataSource/DataSourceLimits.ts +62 -0
  238. package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
  239. package/Types/DataSource/DataSourceTableResult.ts +38 -0
  240. package/Types/DataSource/DataSourceType.ts +213 -0
  241. package/Types/Date.ts +43 -3
  242. package/Types/Password.ts +64 -0
  243. package/Types/Permission.ts +46 -0
  244. package/Types/UserAuthenticationStatus.ts +34 -0
  245. package/UI/Components/Button/Button.tsx +1 -1
  246. package/UI/Components/ErrorBoundary.tsx +459 -108
  247. package/UI/Components/Icon/Icon.tsx +10 -9
  248. package/UI/Components/Modal/ConfirmModal.tsx +6 -1
  249. package/UI/Components/Modal/Modal.tsx +267 -35
  250. package/UI/Components/Modal/ModalFooter.tsx +6 -1
  251. package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
  252. package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
  253. package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
  254. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
  255. package/UI/Components/StatusPage/ResourceList.tsx +570 -0
  256. package/UI/Styles/Theme.css +18 -0
  257. package/UI/Utils/API/RequestOptions.ts +7 -0
  258. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
  259. package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
  260. package/UI/Utils/TestDataSource.ts +61 -0
  261. package/UI/esbuild-config.js +45 -0
  262. package/Utils/Analytics.ts +15 -0
  263. package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
  264. package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
  265. package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
  266. package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
  267. package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
  268. package/Utils/Dashboard/Components/Index.ts +28 -0
  269. package/Utils/DataSource/DataSourceQueryText.ts +94 -0
  270. package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
  271. package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
  272. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
  273. package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
  274. package/Utils/StatusPage/ResourceExplorer.ts +853 -0
  275. package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
  276. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
  278. package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
  279. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  280. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
  282. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/User.js +2 -0
  284. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  286. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  288. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
  290. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
  292. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
  294. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  295. package/build/dist/Server/API/AIInsightAPI.js +34 -4
  296. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  297. package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
  298. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  299. package/build/dist/Server/API/DashboardAPI.js +119 -433
  300. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  301. package/build/dist/Server/API/DataSourceAPI.js +173 -0
  302. package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
  303. package/build/dist/Server/API/StatusPageAPI.js +11 -1
  304. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  305. package/build/dist/Server/API/UserAPI.js +94 -2
  306. package/build/dist/Server/API/UserAPI.js.map +1 -1
  307. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
  308. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  309. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
  310. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
  311. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
  312. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
  313. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
  314. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
  315. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  316. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  317. package/build/dist/Server/Infrastructure/Queue.js +27 -0
  318. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  319. package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
  320. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  321. package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
  322. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  323. package/build/dist/Server/Services/AIInsightService.js +110 -10
  324. package/build/dist/Server/Services/AIInsightService.js.map +1 -1
  325. package/build/dist/Server/Services/AIRunService.js +34 -0
  326. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  327. package/build/dist/Server/Services/AIService.js +16 -2
  328. package/build/dist/Server/Services/AIService.js.map +1 -1
  329. package/build/dist/Server/Services/AlertService.js +28 -35
  330. package/build/dist/Server/Services/AlertService.js.map +1 -1
  331. package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
  332. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  333. package/build/dist/Server/Services/DataSourceService.js +159 -0
  334. package/build/dist/Server/Services/DataSourceService.js.map +1 -0
  335. package/build/dist/Server/Services/HostService.js +74 -0
  336. package/build/dist/Server/Services/HostService.js.map +1 -1
  337. package/build/dist/Server/Services/IncidentService.js +35 -24
  338. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  339. package/build/dist/Server/Services/Index.js +2 -0
  340. package/build/dist/Server/Services/Index.js.map +1 -1
  341. package/build/dist/Server/Services/MonitorService.js +45 -0
  342. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  343. package/build/dist/Server/Services/MonitorStatusService.js +129 -0
  344. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  345. package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
  346. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  347. package/build/dist/Server/Services/RumSessionPinService.js +7 -15
  348. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  349. package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
  350. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  351. package/build/dist/Server/Services/UserService.js +241 -10
  352. package/build/dist/Server/Services/UserService.js.map +1 -1
  353. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
  354. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
  356. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
  358. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
  360. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  361. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
  362. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  363. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
  364. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  365. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
  366. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
  368. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  369. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
  372. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  373. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
  374. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  375. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
  376. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
  377. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
  378. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
  379. package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
  380. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
  381. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
  382. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
  383. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
  384. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
  385. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
  386. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
  387. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
  388. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
  389. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
  390. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
  391. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
  392. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
  393. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
  394. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
  395. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
  396. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
  397. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
  398. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
  399. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
  400. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
  401. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
  402. package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
  403. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
  404. package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
  405. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
  407. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
  408. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
  409. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
  410. package/build/dist/Server/Utils/DataSource/Types.js +2 -0
  411. package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
  412. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
  413. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  414. package/build/dist/Server/Utils/InProcessMemo.js +113 -0
  415. package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
  416. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
  417. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
  418. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
  419. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  420. package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
  421. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  422. package/build/dist/Server/Utils/Response.js +9 -1
  423. package/build/dist/Server/Utils/Response.js.map +1 -1
  424. package/build/dist/Server/Utils/SSRFProtection.js +192 -0
  425. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
  426. package/build/dist/Server/Utils/StartServer.js +7 -0
  427. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  428. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
  429. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  430. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
  431. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  432. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
  433. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
  434. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
  435. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  436. package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
  437. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  438. package/build/dist/Server/Utils/Telemetry.js +93 -6
  439. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  440. package/build/dist/Server/Utils/VendorAssets.js +121 -0
  441. package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
  442. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
  443. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  444. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
  445. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  446. package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
  447. package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
  448. package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
  449. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  450. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
  451. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
  452. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
  453. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
  454. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
  455. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
  456. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
  457. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
  458. package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
  459. package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
  460. package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
  461. package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
  462. package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
  463. package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
  464. package/build/dist/Types/DataSource/DataSourceType.js +183 -0
  465. package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
  466. package/build/dist/Types/Date.js +38 -3
  467. package/build/dist/Types/Date.js.map +1 -1
  468. package/build/dist/Types/Password.js +56 -0
  469. package/build/dist/Types/Password.js.map +1 -0
  470. package/build/dist/Types/Permission.js +42 -0
  471. package/build/dist/Types/Permission.js.map +1 -1
  472. package/build/dist/Types/UserAuthenticationStatus.js +2 -0
  473. package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
  474. package/build/dist/UI/Components/ErrorBoundary.js +388 -72
  475. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  476. package/build/dist/UI/Components/Icon/Icon.js +10 -4
  477. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  478. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  479. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  480. package/build/dist/UI/Components/Modal/Modal.js +178 -19
  481. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  482. package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
  483. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  484. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
  485. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  486. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
  487. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  488. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
  489. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
  490. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
  491. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
  492. package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
  493. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
  494. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
  495. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  496. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
  497. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  498. package/build/dist/UI/Utils/TestDataSource.js +39 -0
  499. package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
  500. package/build/dist/Utils/Analytics.js +4 -0
  501. package/build/dist/Utils/Analytics.js.map +1 -1
  502. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
  503. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
  504. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
  505. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
  506. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
  507. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
  508. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
  509. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
  510. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
  511. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
  512. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  513. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  514. package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
  515. package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
  516. package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
  517. package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
  518. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
  519. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
  520. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
  521. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  522. package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
  523. package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
  524. package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
  525. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
  526. package/jest.config.json +1 -0
  527. package/package.json +5 -1
  528. package/tsconfig.json +12 -10
@@ -0,0 +1,857 @@
1
+ import PublicDashboardResourceListPolicy, {
2
+ PublicDashboardResourceListPolicyResult,
3
+ } from "../../../../Server/Utils/Dashboard/PublicDashboardResourceListPolicy";
4
+ import InBetween from "../../../../Types/BaseDatabase/InBetween";
5
+ import Includes from "../../../../Types/BaseDatabase/Includes";
6
+ import Search from "../../../../Types/BaseDatabase/Search";
7
+ import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
8
+ import { LIMIT_PER_PROJECT } from "../../../../Types/Database/LimitMax";
9
+ import DashboardComponentType from "../../../../Types/Dashboard/DashboardComponentType";
10
+ import { DashboardVariableType } from "../../../../Types/Dashboard/DashboardVariable";
11
+ import BadDataException from "../../../../Types/Exception/BadDataException";
12
+ import { JSONObject } from "../../../../Types/JSON";
13
+
14
+ const RANGE_START: Date = new Date("2026-08-09T10:00:00.000Z");
15
+ const RANGE_END: Date = new Date("2026-08-09T11:00:00.000Z");
16
+
17
+ function range(): InBetween<Date> {
18
+ return new InBetween<Date>(RANGE_START, RANGE_END);
19
+ }
20
+
21
+ function widget(
22
+ componentType: DashboardComponentType,
23
+ argumentsObject: JSONObject = {},
24
+ ): JSONObject {
25
+ return {
26
+ componentType,
27
+ arguments: argumentsObject,
28
+ };
29
+ }
30
+
31
+ function build(data: {
32
+ componentType: DashboardComponentType;
33
+ argumentsObject?: JSONObject | undefined;
34
+ requestedQuery?: JSONObject | undefined;
35
+ requestedVariables?: Array<JSONObject> | undefined;
36
+ storedVariables?: Array<JSONObject> | undefined;
37
+ }): PublicDashboardResourceListPolicyResult {
38
+ return PublicDashboardResourceListPolicy.build({
39
+ widget: widget(data.componentType, data.argumentsObject || {}),
40
+ dashboardViewConfig: {
41
+ components: [],
42
+ variables: data.storedVariables || [],
43
+ },
44
+ requestedVariables: data.requestedVariables || [],
45
+ requestedQuery: data.requestedQuery || {},
46
+ });
47
+ }
48
+
49
+ interface MappingCase {
50
+ name: string;
51
+ componentType: DashboardComponentType;
52
+ resourceType: string;
53
+ argumentsObject: JSONObject;
54
+ expectedQuery: JSONObject;
55
+ expectedSort: JSONObject;
56
+ expectedLimit: number;
57
+ requestedQuery?: JSONObject | undefined;
58
+ }
59
+
60
+ const MAPPING_CASES: Array<MappingCase> = [
61
+ {
62
+ name: "incident",
63
+ componentType: DashboardComponentType.IncidentList,
64
+ resourceType: "incident",
65
+ argumentsObject: {
66
+ maxRows: 11,
67
+ stateFilter: "resolved",
68
+ severityIds: ["severity"],
69
+ stateIds: ["state"],
70
+ monitorIds: ["monitor"],
71
+ labelIds: ["label"],
72
+ },
73
+ expectedQuery: {
74
+ currentIncidentState: { isResolvedState: true },
75
+ incidentSeverityId: new Includes(["severity"]),
76
+ currentIncidentStateId: new Includes(["state"]),
77
+ monitors: new Includes(["monitor"]),
78
+ labels: new Includes(["label"]),
79
+ },
80
+ expectedSort: { createdAt: SortOrder.Descending },
81
+ expectedLimit: 11,
82
+ },
83
+ {
84
+ name: "alert",
85
+ componentType: DashboardComponentType.AlertList,
86
+ resourceType: "alert",
87
+ argumentsObject: {
88
+ stateFilter: "acknowledged",
89
+ severityIds: ["severity"],
90
+ stateIds: ["state"],
91
+ monitorIds: ["monitor"],
92
+ labelIds: ["label"],
93
+ },
94
+ expectedQuery: {
95
+ currentAlertState: { isAcknowledgedState: true },
96
+ alertSeverityId: new Includes(["severity"]),
97
+ currentAlertStateId: new Includes(["state"]),
98
+ monitorId: new Includes(["monitor"]),
99
+ labels: new Includes(["label"]),
100
+ },
101
+ expectedSort: { createdAt: SortOrder.Descending },
102
+ expectedLimit: 25,
103
+ },
104
+ {
105
+ name: "monitor",
106
+ componentType: DashboardComponentType.MonitorList,
107
+ resourceType: "monitor",
108
+ argumentsObject: {
109
+ statusFilter: "non-operational",
110
+ monitorStatusIds: ["status"],
111
+ monitorTypes: ["Ping"],
112
+ labelIds: ["label"],
113
+ },
114
+ expectedQuery: {
115
+ currentMonitorStatus: { isOperationalState: false },
116
+ currentMonitorStatusId: new Includes(["status"]),
117
+ monitorType: new Includes(["Ping"]),
118
+ labels: new Includes(["label"]),
119
+ },
120
+ expectedSort: { name: SortOrder.Ascending },
121
+ expectedLimit: 25,
122
+ },
123
+ {
124
+ name: "network map",
125
+ componentType: DashboardComponentType.NetworkMap,
126
+ resourceType: "network-site",
127
+ argumentsObject: {
128
+ maxSites: "7",
129
+ statusFilter: "down",
130
+ networkSiteTypeIds: ["store"],
131
+ },
132
+ expectedQuery: {
133
+ currentMonitorStatus: { isOperationalState: false },
134
+ networkSiteTypeId: new Includes(["store"]),
135
+ },
136
+ expectedSort: { name: SortOrder.Ascending },
137
+ expectedLimit: 8,
138
+ },
139
+ {
140
+ name: "host",
141
+ componentType: DashboardComponentType.HostList,
142
+ resourceType: "host",
143
+ argumentsObject: {
144
+ statusFilter: "connected",
145
+ osTypeFilter: "linux",
146
+ },
147
+ expectedQuery: {
148
+ otelCollectorStatus: "connected",
149
+ osType: "linux",
150
+ },
151
+ expectedSort: { name: SortOrder.Ascending },
152
+ expectedLimit: 25,
153
+ },
154
+ {
155
+ name: "kubernetes pod",
156
+ componentType: DashboardComponentType.KubernetesPodList,
157
+ resourceType: "kubernetes-resource",
158
+ argumentsObject: {
159
+ kubernetesClusterIds: ["cluster"],
160
+ namespaces: " default, oneuptime ",
161
+ podPhases: ["Running"],
162
+ },
163
+ expectedQuery: {
164
+ kind: "Pod",
165
+ kubernetesClusterId: new Includes(["cluster"]),
166
+ namespaceKey: new Includes(["default", "oneuptime"]),
167
+ phase: new Includes(["Running"]),
168
+ },
169
+ expectedSort: {
170
+ namespaceKey: SortOrder.Ascending,
171
+ name: SortOrder.Ascending,
172
+ },
173
+ expectedLimit: 25,
174
+ },
175
+ {
176
+ name: "kubernetes node",
177
+ componentType: DashboardComponentType.KubernetesNodeList,
178
+ resourceType: "kubernetes-resource",
179
+ argumentsObject: {
180
+ kubernetesClusterIds: ["cluster"],
181
+ readinessFilter: "not-ready",
182
+ },
183
+ expectedQuery: {
184
+ kind: "Node",
185
+ kubernetesClusterId: new Includes(["cluster"]),
186
+ isReady: false,
187
+ },
188
+ expectedSort: {
189
+ namespaceKey: SortOrder.Ascending,
190
+ name: SortOrder.Ascending,
191
+ },
192
+ expectedLimit: 25,
193
+ },
194
+ {
195
+ name: "kubernetes namespace",
196
+ componentType: DashboardComponentType.KubernetesNamespaceList,
197
+ resourceType: "kubernetes-resource",
198
+ argumentsObject: { kubernetesClusterIds: ["cluster"] },
199
+ expectedQuery: {
200
+ kind: "Namespace",
201
+ kubernetesClusterId: new Includes(["cluster"]),
202
+ },
203
+ expectedSort: {
204
+ namespaceKey: SortOrder.Ascending,
205
+ name: SortOrder.Ascending,
206
+ },
207
+ expectedLimit: 25,
208
+ },
209
+ ...[
210
+ {
211
+ name: "kubernetes deployment",
212
+ componentType: DashboardComponentType.KubernetesDeploymentList,
213
+ kind: "Deployment",
214
+ },
215
+ {
216
+ name: "kubernetes stateful set",
217
+ componentType: DashboardComponentType.KubernetesStatefulSetList,
218
+ kind: "StatefulSet",
219
+ },
220
+ {
221
+ name: "kubernetes daemon set",
222
+ componentType: DashboardComponentType.KubernetesDaemonSetList,
223
+ kind: "DaemonSet",
224
+ },
225
+ {
226
+ name: "kubernetes job",
227
+ componentType: DashboardComponentType.KubernetesJobList,
228
+ kind: "Job",
229
+ },
230
+ {
231
+ name: "kubernetes cron job",
232
+ componentType: DashboardComponentType.KubernetesCronJobList,
233
+ kind: "CronJob",
234
+ },
235
+ ].map(
236
+ (data: {
237
+ name: string;
238
+ componentType: DashboardComponentType;
239
+ kind: string;
240
+ }): MappingCase => {
241
+ return {
242
+ name: data.name,
243
+ componentType: data.componentType,
244
+ resourceType: "kubernetes-resource",
245
+ argumentsObject: {
246
+ kubernetesClusterIds: ["cluster"],
247
+ namespaces: "namespace",
248
+ },
249
+ expectedQuery: {
250
+ kind: data.kind,
251
+ kubernetesClusterId: new Includes(["cluster"]),
252
+ namespaceKey: new Includes(["namespace"]),
253
+ },
254
+ expectedSort: {
255
+ namespaceKey: SortOrder.Ascending,
256
+ name: SortOrder.Ascending,
257
+ },
258
+ expectedLimit: 25,
259
+ };
260
+ },
261
+ ),
262
+ {
263
+ name: "docker host",
264
+ componentType: DashboardComponentType.DockerHostList,
265
+ resourceType: "docker-host",
266
+ argumentsObject: { statusFilter: "disconnected" },
267
+ expectedQuery: { otelCollectorStatus: "disconnected" },
268
+ expectedSort: { name: SortOrder.Ascending },
269
+ expectedLimit: 25,
270
+ },
271
+ {
272
+ name: "docker container",
273
+ componentType: DashboardComponentType.DockerContainerList,
274
+ resourceType: "docker-container",
275
+ argumentsObject: {
276
+ dockerHostIds: ["host"],
277
+ imageName: " nginx ",
278
+ },
279
+ expectedQuery: {
280
+ kind: "Container",
281
+ dockerHostId: new Includes(["host"]),
282
+ imageName: new Search("nginx"),
283
+ },
284
+ expectedSort: { name: SortOrder.Ascending },
285
+ expectedLimit: 25,
286
+ },
287
+ {
288
+ name: "docker image",
289
+ componentType: DashboardComponentType.DockerImageList,
290
+ resourceType: "docker-image",
291
+ argumentsObject: { dockerHostIds: ["host"], nameSearch: " api " },
292
+ expectedQuery: {
293
+ kind: "Image",
294
+ dockerHostId: new Includes(["host"]),
295
+ name: new Search("api"),
296
+ },
297
+ expectedSort: { name: SortOrder.Ascending },
298
+ expectedLimit: 25,
299
+ },
300
+ {
301
+ name: "docker network",
302
+ componentType: DashboardComponentType.DockerNetworkList,
303
+ resourceType: "docker-network",
304
+ argumentsObject: { dockerHostIds: ["host"] },
305
+ expectedQuery: {
306
+ kind: "Network",
307
+ dockerHostId: new Includes(["host"]),
308
+ },
309
+ expectedSort: { name: SortOrder.Ascending },
310
+ expectedLimit: 25,
311
+ },
312
+ {
313
+ name: "docker volume",
314
+ componentType: DashboardComponentType.DockerVolumeList,
315
+ resourceType: "docker-volume",
316
+ argumentsObject: { dockerHostIds: ["host"] },
317
+ expectedQuery: {
318
+ kind: "Volume",
319
+ dockerHostId: new Includes(["host"]),
320
+ },
321
+ expectedSort: { name: SortOrder.Ascending },
322
+ expectedLimit: 25,
323
+ },
324
+ {
325
+ name: "podman host",
326
+ componentType: DashboardComponentType.PodmanHostList,
327
+ resourceType: "podman-host",
328
+ argumentsObject: { statusFilter: "connected" },
329
+ expectedQuery: { otelCollectorStatus: "connected" },
330
+ expectedSort: { name: SortOrder.Ascending },
331
+ expectedLimit: 25,
332
+ },
333
+ {
334
+ name: "podman container",
335
+ componentType: DashboardComponentType.PodmanContainerList,
336
+ resourceType: "podman-container",
337
+ argumentsObject: { podmanHostIds: ["host"], imageName: "redis" },
338
+ expectedQuery: {
339
+ kind: "Container",
340
+ podmanHostId: new Includes(["host"]),
341
+ imageName: new Search("redis"),
342
+ },
343
+ expectedSort: { name: SortOrder.Ascending },
344
+ expectedLimit: 25,
345
+ },
346
+ {
347
+ name: "podman image",
348
+ componentType: DashboardComponentType.PodmanImageList,
349
+ resourceType: "podman-image",
350
+ argumentsObject: { podmanHostIds: ["host"], nameSearch: "worker" },
351
+ expectedQuery: {
352
+ kind: "Image",
353
+ podmanHostId: new Includes(["host"]),
354
+ name: new Search("worker"),
355
+ },
356
+ expectedSort: { name: SortOrder.Ascending },
357
+ expectedLimit: 25,
358
+ },
359
+ {
360
+ name: "podman network",
361
+ componentType: DashboardComponentType.PodmanNetworkList,
362
+ resourceType: "podman-network",
363
+ argumentsObject: { podmanHostIds: ["host"] },
364
+ expectedQuery: {
365
+ kind: "Network",
366
+ podmanHostId: new Includes(["host"]),
367
+ },
368
+ expectedSort: { name: SortOrder.Ascending },
369
+ expectedLimit: 25,
370
+ },
371
+ {
372
+ name: "podman volume",
373
+ componentType: DashboardComponentType.PodmanVolumeList,
374
+ resourceType: "podman-volume",
375
+ argumentsObject: { podmanHostIds: ["host"] },
376
+ expectedQuery: {
377
+ kind: "Volume",
378
+ podmanHostId: new Includes(["host"]),
379
+ },
380
+ expectedSort: { name: SortOrder.Ascending },
381
+ expectedLimit: 25,
382
+ },
383
+ {
384
+ name: "proxmox node",
385
+ componentType: DashboardComponentType.ProxmoxNodeList,
386
+ resourceType: "proxmox-resource",
387
+ argumentsObject: {
388
+ proxmoxClusterIds: ["cluster"],
389
+ statusFilter: "offline",
390
+ },
391
+ expectedQuery: {
392
+ kind: "Node",
393
+ proxmoxClusterId: new Includes(["cluster"]),
394
+ isUp: false,
395
+ },
396
+ expectedSort: { name: SortOrder.Ascending },
397
+ expectedLimit: 25,
398
+ },
399
+ {
400
+ name: "proxmox guest",
401
+ componentType: DashboardComponentType.ProxmoxGuestList,
402
+ resourceType: "proxmox-resource",
403
+ argumentsObject: {
404
+ proxmoxClusterIds: ["cluster"],
405
+ guestTypeFilter: "lxc",
406
+ statusFilter: "running",
407
+ },
408
+ expectedQuery: {
409
+ kind: "Guest",
410
+ proxmoxClusterId: new Includes(["cluster"]),
411
+ guestType: "lxc",
412
+ isUp: true,
413
+ },
414
+ expectedSort: { name: SortOrder.Ascending },
415
+ expectedLimit: 25,
416
+ },
417
+ {
418
+ name: "ceph OSD",
419
+ componentType: DashboardComponentType.CephOsdList,
420
+ resourceType: "ceph-resource",
421
+ argumentsObject: { cephClusterIds: ["cluster"], stateFilter: "out" },
422
+ expectedQuery: {
423
+ kind: "Osd",
424
+ cephClusterId: new Includes(["cluster"]),
425
+ isIn: false,
426
+ },
427
+ expectedSort: { externalId: SortOrder.Ascending },
428
+ expectedLimit: 25,
429
+ },
430
+ {
431
+ name: "ceph pool",
432
+ componentType: DashboardComponentType.CephPoolList,
433
+ resourceType: "ceph-resource",
434
+ argumentsObject: { cephClusterIds: ["cluster"] },
435
+ expectedQuery: {
436
+ kind: "Pool",
437
+ cephClusterId: new Includes(["cluster"]),
438
+ },
439
+ expectedSort: { name: SortOrder.Ascending },
440
+ expectedLimit: 25,
441
+ },
442
+ {
443
+ name: "docker swarm node",
444
+ componentType: DashboardComponentType.DockerSwarmNodeList,
445
+ resourceType: "docker-swarm-resource",
446
+ argumentsObject: {
447
+ dockerSwarmClusterIds: ["cluster"],
448
+ roleFilter: "manager",
449
+ statusFilter: "notready",
450
+ },
451
+ expectedQuery: {
452
+ kind: "Node",
453
+ dockerSwarmClusterId: new Includes(["cluster"]),
454
+ role: "manager",
455
+ isReady: false,
456
+ },
457
+ expectedSort: { name: SortOrder.Ascending },
458
+ expectedLimit: 25,
459
+ },
460
+ {
461
+ name: "docker swarm service",
462
+ componentType: DashboardComponentType.DockerSwarmServiceList,
463
+ resourceType: "docker-swarm-resource",
464
+ argumentsObject: {
465
+ dockerSwarmClusterIds: ["cluster"],
466
+ serviceModeFilter: "global",
467
+ statusFilter: "converged",
468
+ },
469
+ expectedQuery: {
470
+ kind: "Service",
471
+ dockerSwarmClusterId: new Includes(["cluster"]),
472
+ serviceMode: "global",
473
+ isReady: true,
474
+ },
475
+ expectedSort: { name: SortOrder.Ascending },
476
+ expectedLimit: 25,
477
+ },
478
+ {
479
+ name: "trace list",
480
+ componentType: DashboardComponentType.TraceList,
481
+ resourceType: "span",
482
+ argumentsObject: { statusFilter: "2", maxRows: "31" },
483
+ requestedQuery: { startTime: range() },
484
+ expectedQuery: { startTime: range(), statusCode: 2 },
485
+ expectedSort: { startTime: SortOrder.Descending },
486
+ expectedLimit: 31,
487
+ },
488
+ {
489
+ name: "log stream",
490
+ componentType: DashboardComponentType.LogStream,
491
+ resourceType: "log",
492
+ argumentsObject: {
493
+ severityFilter: "Error",
494
+ bodyContains: " failed ",
495
+ attributeFilterQuery: "@service.name:api",
496
+ },
497
+ requestedQuery: { time: range() },
498
+ expectedQuery: {
499
+ time: range(),
500
+ severityText: "Error",
501
+ body: "failed",
502
+ attributes: { "service.name": "api" },
503
+ },
504
+ expectedSort: { time: SortOrder.Descending },
505
+ expectedLimit: 50,
506
+ },
507
+ ];
508
+
509
+ describe("PublicDashboardResourceListPolicy", () => {
510
+ describe("component mappings", () => {
511
+ it.each(MAPPING_CASES)(
512
+ "builds the complete stored policy for $name",
513
+ (testCase: MappingCase) => {
514
+ const result: PublicDashboardResourceListPolicyResult = build({
515
+ componentType: testCase.componentType,
516
+ argumentsObject: testCase.argumentsObject,
517
+ requestedQuery: testCase.requestedQuery,
518
+ });
519
+
520
+ expect(result.resourceType).toBe(testCase.resourceType);
521
+ expect(result.query).toEqual(testCase.expectedQuery);
522
+ expect(result.select).toEqual(expect.any(Object));
523
+ expect(Object.keys(result.select).length).toBeGreaterThan(0);
524
+ expect(result.sort).toEqual(testCase.expectedSort);
525
+ expect(result.limit).toBe(testCase.expectedLimit);
526
+ expect(result.query["projectId"]).toBeUndefined();
527
+ },
528
+ );
529
+
530
+ it("keeps projections exact for widgets that share a resource model", () => {
531
+ const proxmoxNode: JSONObject = build({
532
+ componentType: DashboardComponentType.ProxmoxNodeList,
533
+ }).select;
534
+ const proxmoxGuest: JSONObject = build({
535
+ componentType: DashboardComponentType.ProxmoxGuestList,
536
+ }).select;
537
+ const swarmNode: JSONObject = build({
538
+ componentType: DashboardComponentType.DockerSwarmNodeList,
539
+ }).select;
540
+ const swarmService: JSONObject = build({
541
+ componentType: DashboardComponentType.DockerSwarmServiceList,
542
+ }).select;
543
+
544
+ expect(proxmoxNode["latestCpuPercent"]).toBe(true);
545
+ expect(proxmoxNode["vmid"]).toBeUndefined();
546
+ expect(proxmoxGuest["vmid"]).toBe(true);
547
+ expect(proxmoxGuest["latestCpuPercent"]).toBeUndefined();
548
+ expect(swarmNode["latestCpuPercent"]).toBe(true);
549
+ expect(swarmNode["desiredReplicas"]).toBeUndefined();
550
+ expect(swarmService["desiredReplicas"]).toBe(true);
551
+ expect(swarmService["latestCpuPercent"]).toBeUndefined();
552
+ });
553
+
554
+ it("does not expose sibling-only Kubernetes fields", () => {
555
+ const pod: JSONObject = build({
556
+ componentType: DashboardComponentType.KubernetesPodList,
557
+ }).select;
558
+ const node: JSONObject = build({
559
+ componentType: DashboardComponentType.KubernetesNodeList,
560
+ }).select;
561
+ const deployment: JSONObject = build({
562
+ componentType: DashboardComponentType.KubernetesDeploymentList,
563
+ }).select;
564
+
565
+ expect(pod["phase"]).toBe(true);
566
+ expect(pod["hasMemoryPressure"]).toBeUndefined();
567
+ expect(node["hasMemoryPressure"]).toBe(true);
568
+ expect(node["phase"]).toBeUndefined();
569
+ expect(deployment["isReady"]).toBe(true);
570
+ expect(deployment["phase"]).toBeUndefined();
571
+ });
572
+ });
573
+
574
+ describe("telemetry range ownership", () => {
575
+ it("copies only time from the log request and keeps stored filters", () => {
576
+ const result: PublicDashboardResourceListPolicyResult = build({
577
+ componentType: DashboardComponentType.LogStream,
578
+ argumentsObject: { severityFilter: "Error", bodyContains: "stored" },
579
+ requestedQuery: {
580
+ time: range(),
581
+ severityText: "Debug",
582
+ body: "attacker",
583
+ attributes: { secret: "probe" },
584
+ projectId: "other-project",
585
+ },
586
+ });
587
+
588
+ expect(result.query).toEqual({
589
+ time: range(),
590
+ severityText: "Error",
591
+ body: "stored",
592
+ });
593
+ });
594
+
595
+ it("accepts a serialized InBetween range and canonicalizes its dates", () => {
596
+ const result: PublicDashboardResourceListPolicyResult = build({
597
+ componentType: DashboardComponentType.LogStream,
598
+ requestedQuery: { time: range().toJSON() },
599
+ });
600
+
601
+ expect(result.query["time"]).toEqual(range());
602
+ });
603
+
604
+ it.each([
605
+ {},
606
+ { time: "not-a-range" },
607
+ { time: new InBetween("invalid", "still-invalid") },
608
+ { time: new InBetween(RANGE_START, RANGE_START) },
609
+ { time: new InBetween(RANGE_END, RANGE_START) },
610
+ ])(
611
+ "rejects an invalid or missing log time range",
612
+ (requestedQuery: unknown) => {
613
+ expect(() => {
614
+ return build({
615
+ componentType: DashboardComponentType.LogStream,
616
+ requestedQuery: requestedQuery as JSONObject,
617
+ });
618
+ }).toThrow(BadDataException);
619
+ },
620
+ );
621
+
622
+ it("requires a valid startTime range for spans", () => {
623
+ expect(() => {
624
+ return build({ componentType: DashboardComponentType.TraceList });
625
+ }).toThrow(BadDataException);
626
+
627
+ expect(
628
+ build({
629
+ componentType: DashboardComponentType.TraceList,
630
+ requestedQuery: { startTime: range(), time: "ignored" },
631
+ }).query,
632
+ ).toEqual({ startTime: range() });
633
+ });
634
+ });
635
+
636
+ describe("dashboard variables", () => {
637
+ const imageVariable: JSONObject = {
638
+ id: "image",
639
+ name: "Image",
640
+ type: DashboardVariableType.TelemetryAttribute,
641
+ attributeKey: "container.image.name",
642
+ defaultValue: "nginx",
643
+ };
644
+
645
+ it("uses a stored default when the requested scalar is null", () => {
646
+ const result: PublicDashboardResourceListPolicyResult = build({
647
+ componentType: DashboardComponentType.DockerContainerList,
648
+ argumentsObject: { imageName: "stored-image" },
649
+ storedVariables: [imageVariable],
650
+ requestedVariables: [
651
+ { id: "image", selectedValue: null, selectedValues: [] },
652
+ ],
653
+ });
654
+
655
+ expect(result.query["imageName"]).toBe("nginx");
656
+ });
657
+
658
+ it("preserves an explicit empty scalar as All and removes the base filter", () => {
659
+ const result: PublicDashboardResourceListPolicyResult = build({
660
+ componentType: DashboardComponentType.DockerContainerList,
661
+ argumentsObject: { imageName: "stored-image" },
662
+ storedVariables: [imageVariable],
663
+ requestedVariables: [
664
+ { id: "image", selectedValue: "", selectedValues: [] },
665
+ ],
666
+ });
667
+
668
+ expect(result.query).toEqual({ kind: "Container" });
669
+ });
670
+
671
+ it("applies bounded multi-select values through the shared interpolation", () => {
672
+ const result: PublicDashboardResourceListPolicyResult = build({
673
+ componentType: DashboardComponentType.KubernetesPodList,
674
+ storedVariables: [
675
+ {
676
+ id: "namespace",
677
+ name: "Namespace",
678
+ type: DashboardVariableType.TelemetryAttribute,
679
+ attributeKey: "k8s.namespace.name",
680
+ isMultiSelect: true,
681
+ },
682
+ ],
683
+ requestedVariables: [
684
+ {
685
+ id: "namespace",
686
+ selectedValue: null,
687
+ selectedValues: ["prod", "staging"],
688
+ },
689
+ ],
690
+ });
691
+
692
+ expect(result.query["namespaceKey"]).toEqual(
693
+ new Includes(["prod", "staging"]),
694
+ );
695
+ });
696
+
697
+ it("ignores a forged scalar All value for a stored multi-select", () => {
698
+ const storedVariables: Array<JSONObject> = [
699
+ {
700
+ id: "namespace",
701
+ name: "Namespace",
702
+ type: DashboardVariableType.TelemetryAttribute,
703
+ attributeKey: "k8s.namespace.name",
704
+ isMultiSelect: true,
705
+ defaultValue: "production",
706
+ },
707
+ ];
708
+
709
+ const forgedScalar: PublicDashboardResourceListPolicyResult = build({
710
+ componentType: DashboardComponentType.KubernetesPodList,
711
+ storedVariables,
712
+ requestedVariables: [
713
+ {
714
+ id: "namespace",
715
+ selectedValue: "",
716
+ selectedValues: [],
717
+ },
718
+ ],
719
+ });
720
+ expect(forgedScalar.query["namespaceKey"]).toBe("production");
721
+
722
+ const compatiblePlaceholder: PublicDashboardResourceListPolicyResult =
723
+ build({
724
+ componentType: DashboardComponentType.KubernetesPodList,
725
+ storedVariables,
726
+ requestedVariables: [
727
+ {
728
+ id: "namespace",
729
+ selectedValue: null,
730
+ selectedValues: [],
731
+ },
732
+ ],
733
+ });
734
+ expect(compatiblePlaceholder.query["namespaceKey"]).toBe("production");
735
+ });
736
+
737
+ it("ignores stale multi-value input for a stored single-select", () => {
738
+ const result: PublicDashboardResourceListPolicyResult = build({
739
+ componentType: DashboardComponentType.DockerContainerList,
740
+ storedVariables: [imageVariable],
741
+ requestedVariables: [
742
+ {
743
+ id: "image",
744
+ selectedValue: "redis",
745
+ selectedValues: ["nginx"],
746
+ },
747
+ ],
748
+ });
749
+
750
+ expect(result.query["imageName"]).toBe("redis");
751
+ });
752
+
753
+ it("applies log variables to stored attributes and supports explicit All", () => {
754
+ const storedVariables: Array<JSONObject> = [
755
+ {
756
+ id: "service",
757
+ name: "Service",
758
+ type: DashboardVariableType.TelemetryAttribute,
759
+ attributeKey: "service.name",
760
+ defaultValue: "worker",
761
+ },
762
+ ];
763
+
764
+ const withDefault: PublicDashboardResourceListPolicyResult = build({
765
+ componentType: DashboardComponentType.LogStream,
766
+ argumentsObject: { attributeFilterQuery: "@service.name:api" },
767
+ requestedQuery: { time: range() },
768
+ storedVariables,
769
+ requestedVariables: [
770
+ { id: "service", selectedValue: null, selectedValues: [] },
771
+ ],
772
+ });
773
+ expect(withDefault.query["attributes"]).toEqual({
774
+ "service.name": "worker",
775
+ });
776
+
777
+ const withAll: PublicDashboardResourceListPolicyResult = build({
778
+ componentType: DashboardComponentType.LogStream,
779
+ argumentsObject: { attributeFilterQuery: "@service.name:api" },
780
+ requestedQuery: { time: range() },
781
+ storedVariables,
782
+ requestedVariables: [
783
+ { id: "service", selectedValue: "", selectedValues: [] },
784
+ ],
785
+ });
786
+ expect(withAll.query["attributes"]).toBeUndefined();
787
+ });
788
+
789
+ it("rejects unbounded or malformed requested selections", () => {
790
+ const tooMany: Array<JSONObject> = Array.from(
791
+ { length: 51 },
792
+ (_value: unknown, index: number): JSONObject => {
793
+ return { id: `variable-${index}`, selectedValue: "value" };
794
+ },
795
+ );
796
+
797
+ expect(() => {
798
+ return build({
799
+ componentType: DashboardComponentType.IncidentList,
800
+ requestedVariables: tooMany,
801
+ });
802
+ }).toThrow(BadDataException);
803
+
804
+ expect(() => {
805
+ return build({
806
+ componentType: DashboardComponentType.IncidentList,
807
+ requestedVariables: [
808
+ { id: "variable", selectedValues: Array(101).fill("value") },
809
+ ],
810
+ });
811
+ }).toThrow(BadDataException);
812
+ });
813
+ });
814
+
815
+ describe("fixed limits and malformed widgets", () => {
816
+ it("clamps stored list and map limits to the project ceiling", () => {
817
+ expect(
818
+ build({
819
+ componentType: DashboardComponentType.MonitorList,
820
+ argumentsObject: { maxRows: LIMIT_PER_PROJECT + 100 },
821
+ }).limit,
822
+ ).toBe(LIMIT_PER_PROJECT);
823
+
824
+ expect(
825
+ build({
826
+ componentType: DashboardComponentType.NetworkMap,
827
+ argumentsObject: { maxSites: LIMIT_PER_PROJECT + 100 },
828
+ }).limit,
829
+ ).toBe(LIMIT_PER_PROJECT);
830
+ });
831
+
832
+ it("fails closed for unsupported and malformed components", () => {
833
+ expect(() => {
834
+ return build({ componentType: DashboardComponentType.Chart });
835
+ }).toThrow(BadDataException);
836
+
837
+ expect(() => {
838
+ return PublicDashboardResourceListPolicy.build({
839
+ widget: {
840
+ componentType: DashboardComponentType.IncidentList,
841
+ arguments: "invalid",
842
+ },
843
+ dashboardViewConfig: { components: [] },
844
+ requestedVariables: [],
845
+ requestedQuery: {},
846
+ });
847
+ }).toThrow(BadDataException);
848
+
849
+ expect(() => {
850
+ return build({
851
+ componentType: DashboardComponentType.IncidentList,
852
+ argumentsObject: { severityIds: "not-an-array" },
853
+ });
854
+ }).toThrow(BadDataException);
855
+ });
856
+ });
857
+ });