@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,1261 @@
1
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
2
+ import Includes from "../../../Types/BaseDatabase/Includes";
3
+ import Search from "../../../Types/BaseDatabase/Search";
4
+ import SortOrder from "../../../Types/BaseDatabase/SortOrder";
5
+ import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
6
+ import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
7
+ import { DashboardVariableType, } from "../../../Types/Dashboard/DashboardVariable";
8
+ import BadDataException from "../../../Types/Exception/BadDataException";
9
+ import JSONFunctions from "../../../Types/JSONFunctions";
10
+ import { queryStringToFilter, } from "../../../Types/Log/LogQueryToFilter";
11
+ import DashboardModelQueryInterpolation from "../../../Utils/Dashboard/ModelQueryVariableInterpolation";
12
+ import DashboardVariableInterpolation from "../../../Utils/Dashboard/VariableInterpolation";
13
+ const DEFAULT_LIST_LIMIT = 25;
14
+ const DEFAULT_TELEMETRY_LIMIT = 50;
15
+ const DEFAULT_NETWORK_MAP_MAX_SITES = 250;
16
+ /*
17
+ * These bounds are deliberately much smaller than the request-body limit.
18
+ * Variable values can become IN-list parameters, so a public request must not
19
+ * be able to turn one dashboard refresh into an unbounded query compilation.
20
+ */
21
+ const MAX_REQUESTED_VARIABLES = 50;
22
+ const MAX_SELECTED_VALUES_PER_VARIABLE = 100;
23
+ const MAX_TOTAL_SELECTED_VALUES = 200;
24
+ const MAX_VARIABLE_ID_LENGTH = 256;
25
+ const MAX_VARIABLE_VALUE_LENGTH = 1024;
26
+ const HOST_ATTRIBUTE_TO_COLUMN = {
27
+ "host.name": "name",
28
+ "host.id": "hostIdentifier",
29
+ "resource.host.name": "name",
30
+ "resource.host.id": "hostIdentifier",
31
+ };
32
+ const CONTAINER_ATTRIBUTE_TO_COLUMN = {
33
+ "container.name": "name",
34
+ "container.image.name": "imageName",
35
+ };
36
+ const IMAGE_ATTRIBUTE_TO_COLUMN = {
37
+ "container.image.name": "name",
38
+ };
39
+ const HOST_NAME_ATTRIBUTE_TO_COLUMN = {
40
+ "host.name": "name",
41
+ };
42
+ const KUBERNETES_POD_ATTRIBUTE_TO_COLUMN = {
43
+ "k8s.pod.name": "name",
44
+ "k8s.namespace.name": "namespaceKey",
45
+ "resource.k8s.pod.name": "name",
46
+ "resource.k8s.namespace.name": "namespaceKey",
47
+ };
48
+ const KUBERNETES_NODE_ATTRIBUTE_TO_COLUMN = {
49
+ "k8s.node.name": "name",
50
+ "resource.k8s.node.name": "name",
51
+ };
52
+ const KUBERNETES_NAMESPACE_ATTRIBUTE_TO_COLUMN = {
53
+ "k8s.namespace.name": "name",
54
+ "resource.k8s.namespace.name": "name",
55
+ };
56
+ const KUBERNETES_DEPLOYMENT_ATTRIBUTE_TO_COLUMN = {
57
+ "k8s.deployment.name": "name",
58
+ "k8s.namespace.name": "namespaceKey",
59
+ "resource.k8s.deployment.name": "name",
60
+ "resource.k8s.namespace.name": "namespaceKey",
61
+ };
62
+ const KUBERNETES_STATEFUL_SET_ATTRIBUTE_TO_COLUMN = {
63
+ "k8s.statefulset.name": "name",
64
+ "k8s.namespace.name": "namespaceKey",
65
+ "resource.k8s.statefulset.name": "name",
66
+ "resource.k8s.namespace.name": "namespaceKey",
67
+ };
68
+ const KUBERNETES_DAEMON_SET_ATTRIBUTE_TO_COLUMN = {
69
+ "k8s.daemonset.name": "name",
70
+ "k8s.namespace.name": "namespaceKey",
71
+ "resource.k8s.daemonset.name": "name",
72
+ "resource.k8s.namespace.name": "namespaceKey",
73
+ };
74
+ const KUBERNETES_JOB_ATTRIBUTE_TO_COLUMN = {
75
+ "k8s.job.name": "name",
76
+ "k8s.namespace.name": "namespaceKey",
77
+ "resource.k8s.job.name": "name",
78
+ "resource.k8s.namespace.name": "namespaceKey",
79
+ };
80
+ const KUBERNETES_CRON_JOB_ATTRIBUTE_TO_COLUMN = {
81
+ "k8s.cronjob.name": "name",
82
+ "k8s.namespace.name": "namespaceKey",
83
+ "resource.k8s.cronjob.name": "name",
84
+ "resource.k8s.namespace.name": "namespaceKey",
85
+ };
86
+ const PROXMOX_NODE_ATTRIBUTE_TO_COLUMN = {
87
+ "pve.id": "name",
88
+ };
89
+ const CEPH_OSD_ATTRIBUTE_TO_COLUMN = {
90
+ ceph_daemon: "externalId",
91
+ };
92
+ const CEPH_POOL_ATTRIBUTE_TO_COLUMN = {
93
+ pool_id: "externalId",
94
+ };
95
+ /*
96
+ * Produces the complete server-owned policy for one already-selected public
97
+ * dashboard widget. No caller-supplied project, kind, filter, sort, or limit is
98
+ * copied. The route adds the dashboard's projectId after this policy returns.
99
+ */
100
+ export default class PublicDashboardResourceListPolicy {
101
+ static build(data) {
102
+ const widget = PublicDashboardResourceListPolicy.requireObject(data.widget, "Dashboard widget");
103
+ const argumentsObject = PublicDashboardResourceListPolicy.requireObject(widget["arguments"], "Dashboard widget arguments");
104
+ const componentType = widget["componentType"];
105
+ if (typeof componentType !== "string" || componentType.length === 0) {
106
+ throw new BadDataException("Dashboard widget has no component type.");
107
+ }
108
+ const variables = PublicDashboardResourceListPolicy.resolveDashboardVariableSelections({
109
+ dashboardViewConfig: data.dashboardViewConfig,
110
+ requestedVariables: data.requestedVariables,
111
+ });
112
+ const draft = PublicDashboardResourceListPolicy.buildDraft({
113
+ componentType: componentType,
114
+ argumentsObject,
115
+ requestedQuery: data.requestedQuery,
116
+ });
117
+ let query = draft.query;
118
+ if (draft.attributeToColumn) {
119
+ query = DashboardModelQueryInterpolation.applyToQuery(query, variables, draft.attributeToColumn);
120
+ }
121
+ if (draft.interpolateAttributeMap) {
122
+ const currentAttributes = query["attributes"];
123
+ const baseAttributes = currentAttributes === undefined
124
+ ? undefined
125
+ : PublicDashboardResourceListPolicy.requireObject(currentAttributes, "Log attributes filter");
126
+ const interpolatedAttributes = DashboardVariableInterpolation.applyToAttributes(baseAttributes, variables);
127
+ if (Object.keys(interpolatedAttributes).length > 0) {
128
+ query["attributes"] = interpolatedAttributes;
129
+ }
130
+ else {
131
+ delete query["attributes"];
132
+ }
133
+ }
134
+ return {
135
+ resourceType: draft.resourceType,
136
+ query: query,
137
+ select: PublicDashboardResourceListPolicy.selectForComponent(componentType),
138
+ sort: draft.sort,
139
+ limit: draft.limit,
140
+ };
141
+ }
142
+ /*
143
+ * Public list responses are projected to the fields consumed by the exact
144
+ * stored widget. Resource models shared by several widget kinds must never
145
+ * inherit a union of their siblings' fields.
146
+ */
147
+ static selectForComponent(componentType) {
148
+ switch (componentType) {
149
+ case DashboardComponentType.IncidentList:
150
+ return {
151
+ _id: true,
152
+ title: true,
153
+ createdAt: true,
154
+ currentIncidentState: { name: true, color: true },
155
+ incidentSeverity: { name: true, color: true },
156
+ };
157
+ case DashboardComponentType.AlertList:
158
+ return {
159
+ _id: true,
160
+ title: true,
161
+ createdAt: true,
162
+ currentAlertState: { name: true, color: true },
163
+ alertSeverity: { name: true, color: true },
164
+ };
165
+ case DashboardComponentType.MonitorList:
166
+ return {
167
+ _id: true,
168
+ name: true,
169
+ monitorType: true,
170
+ currentMonitorStatus: { name: true, color: true },
171
+ };
172
+ case DashboardComponentType.NetworkMap:
173
+ return {
174
+ _id: true,
175
+ name: true,
176
+ networkSiteType: { name: true },
177
+ latitude: true,
178
+ longitude: true,
179
+ currentMonitorStatus: {
180
+ name: true,
181
+ color: true,
182
+ priority: true,
183
+ isOperationalState: true,
184
+ },
185
+ };
186
+ case DashboardComponentType.HostList:
187
+ return {
188
+ _id: true,
189
+ name: true,
190
+ otelCollectorStatus: true,
191
+ osType: true,
192
+ osVersion: true,
193
+ cpuCores: true,
194
+ totalMemoryBytes: true,
195
+ lastSeenAt: true,
196
+ };
197
+ case DashboardComponentType.KubernetesPodList:
198
+ return {
199
+ _id: true,
200
+ name: true,
201
+ namespaceKey: true,
202
+ phase: true,
203
+ kubernetesClusterId: true,
204
+ kubernetesCluster: { name: true },
205
+ };
206
+ case DashboardComponentType.KubernetesNodeList:
207
+ return {
208
+ _id: true,
209
+ name: true,
210
+ namespaceKey: true,
211
+ isReady: true,
212
+ hasMemoryPressure: true,
213
+ hasDiskPressure: true,
214
+ hasPidPressure: true,
215
+ kubernetesClusterId: true,
216
+ kubernetesCluster: { name: true },
217
+ };
218
+ case DashboardComponentType.KubernetesNamespaceList:
219
+ return {
220
+ _id: true,
221
+ name: true,
222
+ phase: true,
223
+ kubernetesClusterId: true,
224
+ kubernetesCluster: { name: true },
225
+ };
226
+ case DashboardComponentType.KubernetesDeploymentList:
227
+ case DashboardComponentType.KubernetesStatefulSetList:
228
+ case DashboardComponentType.KubernetesDaemonSetList:
229
+ case DashboardComponentType.KubernetesJobList:
230
+ case DashboardComponentType.KubernetesCronJobList:
231
+ return {
232
+ _id: true,
233
+ name: true,
234
+ namespaceKey: true,
235
+ isReady: true,
236
+ kubernetesClusterId: true,
237
+ kubernetesCluster: { name: true },
238
+ };
239
+ case DashboardComponentType.DockerHostList:
240
+ case DashboardComponentType.PodmanHostList:
241
+ return {
242
+ _id: true,
243
+ name: true,
244
+ otelCollectorStatus: true,
245
+ containersRunning: true,
246
+ containersStopped: true,
247
+ containersPaused: true,
248
+ osType: true,
249
+ osVersion: true,
250
+ };
251
+ case DashboardComponentType.DockerContainerList:
252
+ return {
253
+ _id: true,
254
+ name: true,
255
+ imageName: true,
256
+ state: true,
257
+ latestCpuPercent: true,
258
+ latestMemoryBytes: true,
259
+ dockerHostId: true,
260
+ dockerHost: { name: true },
261
+ };
262
+ case DashboardComponentType.DockerImageList:
263
+ return {
264
+ _id: true,
265
+ name: true,
266
+ containerId: true,
267
+ dockerHost: { name: true },
268
+ };
269
+ case DashboardComponentType.DockerNetworkList:
270
+ case DashboardComponentType.DockerVolumeList:
271
+ return {
272
+ _id: true,
273
+ name: true,
274
+ state: true,
275
+ dockerHost: { name: true },
276
+ };
277
+ case DashboardComponentType.PodmanContainerList:
278
+ return {
279
+ _id: true,
280
+ name: true,
281
+ imageName: true,
282
+ state: true,
283
+ latestCpuPercent: true,
284
+ latestMemoryBytes: true,
285
+ podmanHostId: true,
286
+ podmanHost: { name: true },
287
+ };
288
+ case DashboardComponentType.PodmanImageList:
289
+ return {
290
+ _id: true,
291
+ name: true,
292
+ containerId: true,
293
+ podmanHost: { name: true },
294
+ };
295
+ case DashboardComponentType.PodmanNetworkList:
296
+ case DashboardComponentType.PodmanVolumeList:
297
+ return {
298
+ _id: true,
299
+ name: true,
300
+ state: true,
301
+ podmanHost: { name: true },
302
+ };
303
+ case DashboardComponentType.ProxmoxNodeList:
304
+ return {
305
+ _id: true,
306
+ name: true,
307
+ externalId: true,
308
+ isUp: true,
309
+ latestCpuPercent: true,
310
+ latestMemoryPercent: true,
311
+ proxmoxClusterId: true,
312
+ proxmoxCluster: { name: true },
313
+ };
314
+ case DashboardComponentType.ProxmoxGuestList:
315
+ return {
316
+ _id: true,
317
+ name: true,
318
+ externalId: true,
319
+ vmid: true,
320
+ guestType: true,
321
+ parentNodeName: true,
322
+ isUp: true,
323
+ haState: true,
324
+ proxmoxClusterId: true,
325
+ proxmoxCluster: { name: true },
326
+ };
327
+ case DashboardComponentType.CephOsdList:
328
+ return {
329
+ _id: true,
330
+ name: true,
331
+ externalId: true,
332
+ hostname: true,
333
+ deviceClass: true,
334
+ isUp: true,
335
+ isIn: true,
336
+ statBytes: true,
337
+ statBytesUsed: true,
338
+ cephClusterId: true,
339
+ cephCluster: { name: true },
340
+ };
341
+ case DashboardComponentType.CephPoolList:
342
+ return {
343
+ _id: true,
344
+ name: true,
345
+ externalId: true,
346
+ storedBytes: true,
347
+ maxAvailBytes: true,
348
+ objects: true,
349
+ cephClusterId: true,
350
+ cephCluster: { name: true },
351
+ };
352
+ case DashboardComponentType.DockerSwarmNodeList:
353
+ return {
354
+ _id: true,
355
+ name: true,
356
+ externalId: true,
357
+ role: true,
358
+ state: true,
359
+ isReady: true,
360
+ latestCpuPercent: true,
361
+ latestMemoryPercent: true,
362
+ dockerSwarmClusterId: true,
363
+ dockerSwarmCluster: { name: true },
364
+ };
365
+ case DashboardComponentType.DockerSwarmServiceList:
366
+ return {
367
+ _id: true,
368
+ name: true,
369
+ externalId: true,
370
+ serviceMode: true,
371
+ desiredReplicas: true,
372
+ runningReplicas: true,
373
+ image: true,
374
+ isReady: true,
375
+ dockerSwarmClusterId: true,
376
+ dockerSwarmCluster: { name: true },
377
+ };
378
+ case DashboardComponentType.TraceList:
379
+ return {
380
+ startTime: true,
381
+ name: true,
382
+ statusCode: true,
383
+ durationUnixNano: true,
384
+ };
385
+ case DashboardComponentType.LogStream:
386
+ return {
387
+ time: true,
388
+ severityText: true,
389
+ body: true,
390
+ };
391
+ default:
392
+ throw new BadDataException("This dashboard widget cannot list public resources.");
393
+ }
394
+ }
395
+ static buildDraft(data) {
396
+ const { componentType, argumentsObject, requestedQuery } = data;
397
+ switch (componentType) {
398
+ case DashboardComponentType.IncidentList:
399
+ return PublicDashboardResourceListPolicy.buildIncidentPolicy(argumentsObject);
400
+ case DashboardComponentType.AlertList:
401
+ return PublicDashboardResourceListPolicy.buildAlertPolicy(argumentsObject);
402
+ case DashboardComponentType.MonitorList:
403
+ return PublicDashboardResourceListPolicy.buildMonitorPolicy(argumentsObject);
404
+ case DashboardComponentType.NetworkMap:
405
+ return PublicDashboardResourceListPolicy.buildNetworkMapPolicy(argumentsObject);
406
+ case DashboardComponentType.HostList:
407
+ return PublicDashboardResourceListPolicy.buildHostPolicy(argumentsObject);
408
+ case DashboardComponentType.KubernetesPodList:
409
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
410
+ argumentsObject,
411
+ kind: "Pod",
412
+ attributeToColumn: KUBERNETES_POD_ATTRIBUTE_TO_COLUMN,
413
+ includeNamespaces: true,
414
+ componentType,
415
+ });
416
+ case DashboardComponentType.KubernetesNodeList:
417
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
418
+ argumentsObject,
419
+ kind: "Node",
420
+ attributeToColumn: KUBERNETES_NODE_ATTRIBUTE_TO_COLUMN,
421
+ includeNamespaces: false,
422
+ componentType,
423
+ });
424
+ case DashboardComponentType.KubernetesNamespaceList:
425
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
426
+ argumentsObject,
427
+ kind: "Namespace",
428
+ attributeToColumn: KUBERNETES_NAMESPACE_ATTRIBUTE_TO_COLUMN,
429
+ includeNamespaces: false,
430
+ componentType,
431
+ });
432
+ case DashboardComponentType.KubernetesDeploymentList:
433
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
434
+ argumentsObject,
435
+ kind: "Deployment",
436
+ attributeToColumn: KUBERNETES_DEPLOYMENT_ATTRIBUTE_TO_COLUMN,
437
+ includeNamespaces: true,
438
+ componentType,
439
+ });
440
+ case DashboardComponentType.KubernetesStatefulSetList:
441
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
442
+ argumentsObject,
443
+ kind: "StatefulSet",
444
+ attributeToColumn: KUBERNETES_STATEFUL_SET_ATTRIBUTE_TO_COLUMN,
445
+ includeNamespaces: true,
446
+ componentType,
447
+ });
448
+ case DashboardComponentType.KubernetesDaemonSetList:
449
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
450
+ argumentsObject,
451
+ kind: "DaemonSet",
452
+ attributeToColumn: KUBERNETES_DAEMON_SET_ATTRIBUTE_TO_COLUMN,
453
+ includeNamespaces: true,
454
+ componentType,
455
+ });
456
+ case DashboardComponentType.KubernetesJobList:
457
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
458
+ argumentsObject,
459
+ kind: "Job",
460
+ attributeToColumn: KUBERNETES_JOB_ATTRIBUTE_TO_COLUMN,
461
+ includeNamespaces: true,
462
+ componentType,
463
+ });
464
+ case DashboardComponentType.KubernetesCronJobList:
465
+ return PublicDashboardResourceListPolicy.buildKubernetesPolicy({
466
+ argumentsObject,
467
+ kind: "CronJob",
468
+ attributeToColumn: KUBERNETES_CRON_JOB_ATTRIBUTE_TO_COLUMN,
469
+ includeNamespaces: true,
470
+ componentType,
471
+ });
472
+ case DashboardComponentType.DockerHostList:
473
+ return PublicDashboardResourceListPolicy.buildContainerHostPolicy({
474
+ argumentsObject,
475
+ resourceType: "docker-host",
476
+ });
477
+ case DashboardComponentType.DockerContainerList:
478
+ return PublicDashboardResourceListPolicy.buildContainerPolicy({
479
+ argumentsObject,
480
+ resourceType: "docker-container",
481
+ hostIdKey: "dockerHostId",
482
+ storedHostIdsKey: "dockerHostIds",
483
+ });
484
+ case DashboardComponentType.DockerImageList:
485
+ return PublicDashboardResourceListPolicy.buildImagePolicy({
486
+ argumentsObject,
487
+ resourceType: "docker-image",
488
+ hostIdKey: "dockerHostId",
489
+ storedHostIdsKey: "dockerHostIds",
490
+ });
491
+ case DashboardComponentType.DockerNetworkList:
492
+ return PublicDashboardResourceListPolicy.buildContainerInventoryPolicy({
493
+ argumentsObject,
494
+ resourceType: "docker-network",
495
+ kind: "Network",
496
+ hostIdKey: "dockerHostId",
497
+ storedHostIdsKey: "dockerHostIds",
498
+ });
499
+ case DashboardComponentType.DockerVolumeList:
500
+ return PublicDashboardResourceListPolicy.buildContainerInventoryPolicy({
501
+ argumentsObject,
502
+ resourceType: "docker-volume",
503
+ kind: "Volume",
504
+ hostIdKey: "dockerHostId",
505
+ storedHostIdsKey: "dockerHostIds",
506
+ });
507
+ case DashboardComponentType.PodmanHostList:
508
+ return PublicDashboardResourceListPolicy.buildContainerHostPolicy({
509
+ argumentsObject,
510
+ resourceType: "podman-host",
511
+ });
512
+ case DashboardComponentType.PodmanContainerList:
513
+ return PublicDashboardResourceListPolicy.buildContainerPolicy({
514
+ argumentsObject,
515
+ resourceType: "podman-container",
516
+ hostIdKey: "podmanHostId",
517
+ storedHostIdsKey: "podmanHostIds",
518
+ });
519
+ case DashboardComponentType.PodmanImageList:
520
+ return PublicDashboardResourceListPolicy.buildImagePolicy({
521
+ argumentsObject,
522
+ resourceType: "podman-image",
523
+ hostIdKey: "podmanHostId",
524
+ storedHostIdsKey: "podmanHostIds",
525
+ });
526
+ case DashboardComponentType.PodmanNetworkList:
527
+ return PublicDashboardResourceListPolicy.buildContainerInventoryPolicy({
528
+ argumentsObject,
529
+ resourceType: "podman-network",
530
+ kind: "Network",
531
+ hostIdKey: "podmanHostId",
532
+ storedHostIdsKey: "podmanHostIds",
533
+ });
534
+ case DashboardComponentType.PodmanVolumeList:
535
+ return PublicDashboardResourceListPolicy.buildContainerInventoryPolicy({
536
+ argumentsObject,
537
+ resourceType: "podman-volume",
538
+ kind: "Volume",
539
+ hostIdKey: "podmanHostId",
540
+ storedHostIdsKey: "podmanHostIds",
541
+ });
542
+ case DashboardComponentType.ProxmoxNodeList:
543
+ return PublicDashboardResourceListPolicy.buildProxmoxNodePolicy(argumentsObject);
544
+ case DashboardComponentType.ProxmoxGuestList:
545
+ return PublicDashboardResourceListPolicy.buildProxmoxGuestPolicy(argumentsObject);
546
+ case DashboardComponentType.CephOsdList:
547
+ return PublicDashboardResourceListPolicy.buildCephOsdPolicy(argumentsObject);
548
+ case DashboardComponentType.CephPoolList:
549
+ return PublicDashboardResourceListPolicy.buildCephPoolPolicy(argumentsObject);
550
+ case DashboardComponentType.DockerSwarmNodeList:
551
+ return PublicDashboardResourceListPolicy.buildDockerSwarmNodePolicy(argumentsObject);
552
+ case DashboardComponentType.DockerSwarmServiceList:
553
+ return PublicDashboardResourceListPolicy.buildDockerSwarmServicePolicy(argumentsObject);
554
+ case DashboardComponentType.TraceList:
555
+ return PublicDashboardResourceListPolicy.buildTracePolicy({
556
+ argumentsObject,
557
+ requestedQuery,
558
+ });
559
+ case DashboardComponentType.LogStream:
560
+ return PublicDashboardResourceListPolicy.buildLogPolicy({
561
+ argumentsObject,
562
+ requestedQuery,
563
+ });
564
+ default:
565
+ throw new BadDataException(`Unsupported public dashboard resource widget: ${componentType}`);
566
+ }
567
+ }
568
+ static buildIncidentPolicy(argumentsObject) {
569
+ const query = {};
570
+ const stateFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "stateFilter", ["unresolved", "resolved", "acknowledged"]);
571
+ if (stateFilter === "unresolved") {
572
+ query["currentIncidentState"] = { isResolvedState: false };
573
+ }
574
+ else if (stateFilter === "resolved") {
575
+ query["currentIncidentState"] = { isResolvedState: true };
576
+ }
577
+ else if (stateFilter === "acknowledged") {
578
+ query["currentIncidentState"] = { isAcknowledgedState: true };
579
+ }
580
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
581
+ query,
582
+ queryKey: "incidentSeverityId",
583
+ argumentsObject,
584
+ argumentKey: "severityIds",
585
+ });
586
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
587
+ query,
588
+ queryKey: "currentIncidentStateId",
589
+ argumentsObject,
590
+ argumentKey: "stateIds",
591
+ });
592
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
593
+ query,
594
+ queryKey: "monitors",
595
+ argumentsObject,
596
+ argumentKey: "monitorIds",
597
+ });
598
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
599
+ query,
600
+ queryKey: "labels",
601
+ argumentsObject,
602
+ argumentKey: "labelIds",
603
+ });
604
+ return PublicDashboardResourceListPolicy.listDraft({
605
+ resourceType: "incident",
606
+ query,
607
+ sort: { createdAt: SortOrder.Descending },
608
+ argumentsObject,
609
+ });
610
+ }
611
+ static buildAlertPolicy(argumentsObject) {
612
+ const query = {};
613
+ const stateFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "stateFilter", ["unresolved", "resolved", "acknowledged"]);
614
+ if (stateFilter === "unresolved") {
615
+ query["currentAlertState"] = { isResolvedState: false };
616
+ }
617
+ else if (stateFilter === "resolved") {
618
+ query["currentAlertState"] = { isResolvedState: true };
619
+ }
620
+ else if (stateFilter === "acknowledged") {
621
+ query["currentAlertState"] = { isAcknowledgedState: true };
622
+ }
623
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
624
+ query,
625
+ queryKey: "alertSeverityId",
626
+ argumentsObject,
627
+ argumentKey: "severityIds",
628
+ });
629
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
630
+ query,
631
+ queryKey: "currentAlertStateId",
632
+ argumentsObject,
633
+ argumentKey: "stateIds",
634
+ });
635
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
636
+ query,
637
+ queryKey: "monitorId",
638
+ argumentsObject,
639
+ argumentKey: "monitorIds",
640
+ });
641
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
642
+ query,
643
+ queryKey: "labels",
644
+ argumentsObject,
645
+ argumentKey: "labelIds",
646
+ });
647
+ return PublicDashboardResourceListPolicy.listDraft({
648
+ resourceType: "alert",
649
+ query,
650
+ sort: { createdAt: SortOrder.Descending },
651
+ argumentsObject,
652
+ });
653
+ }
654
+ static buildMonitorPolicy(argumentsObject) {
655
+ const query = {};
656
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["operational", "non-operational"]);
657
+ if (statusFilter === "operational") {
658
+ query["currentMonitorStatus"] = { isOperationalState: true };
659
+ }
660
+ else if (statusFilter === "non-operational") {
661
+ query["currentMonitorStatus"] = { isOperationalState: false };
662
+ }
663
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
664
+ query,
665
+ queryKey: "currentMonitorStatusId",
666
+ argumentsObject,
667
+ argumentKey: "monitorStatusIds",
668
+ });
669
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
670
+ query,
671
+ queryKey: "monitorType",
672
+ argumentsObject,
673
+ argumentKey: "monitorTypes",
674
+ });
675
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
676
+ query,
677
+ queryKey: "labels",
678
+ argumentsObject,
679
+ argumentKey: "labelIds",
680
+ });
681
+ return PublicDashboardResourceListPolicy.listDraft({
682
+ resourceType: "monitor",
683
+ query,
684
+ sort: { name: SortOrder.Ascending },
685
+ argumentsObject,
686
+ });
687
+ }
688
+ static buildNetworkMapPolicy(argumentsObject) {
689
+ const query = {};
690
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["down", "operational"]);
691
+ if (statusFilter === "down") {
692
+ query["currentMonitorStatus"] = { isOperationalState: false };
693
+ }
694
+ else if (statusFilter === "operational") {
695
+ query["currentMonitorStatus"] = { isOperationalState: true };
696
+ }
697
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
698
+ query,
699
+ queryKey: "networkSiteTypeId",
700
+ argumentsObject,
701
+ argumentKey: "networkSiteTypeIds",
702
+ });
703
+ const maxSites = PublicDashboardResourceListPolicy.storedLimit({
704
+ value: argumentsObject["maxSites"],
705
+ fallback: DEFAULT_NETWORK_MAP_MAX_SITES,
706
+ ceiling: LIMIT_PER_PROJECT - 1,
707
+ });
708
+ return {
709
+ resourceType: "network-site",
710
+ query,
711
+ sort: { name: SortOrder.Ascending },
712
+ // The map fetches one sentinel row to tell whether its display is capped.
713
+ limit: Math.min(maxSites + 1, LIMIT_PER_PROJECT),
714
+ };
715
+ }
716
+ static buildHostPolicy(argumentsObject) {
717
+ const query = {};
718
+ PublicDashboardResourceListPolicy.addCollectorStatusFilter(query, argumentsObject);
719
+ const osType = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "osTypeFilter", ["linux", "darwin", "windows"]);
720
+ if (osType) {
721
+ query["osType"] = osType;
722
+ }
723
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
724
+ resourceType: "host",
725
+ query,
726
+ sort: { name: SortOrder.Ascending },
727
+ argumentsObject,
728
+ })), { attributeToColumn: HOST_ATTRIBUTE_TO_COLUMN });
729
+ }
730
+ static buildKubernetesPolicy(data) {
731
+ const { argumentsObject } = data;
732
+ const query = { kind: data.kind };
733
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
734
+ query,
735
+ queryKey: "kubernetesClusterId",
736
+ argumentsObject,
737
+ argumentKey: "kubernetesClusterIds",
738
+ });
739
+ if (data.includeNamespaces) {
740
+ const namespaces = PublicDashboardResourceListPolicy.optionalString(argumentsObject, "namespaces", true);
741
+ if (namespaces) {
742
+ const parsedNamespaces = namespaces
743
+ .split(",")
744
+ .map((namespace) => {
745
+ return namespace.trim();
746
+ })
747
+ .filter((namespace) => {
748
+ return namespace.length > 0;
749
+ });
750
+ if (parsedNamespaces.length > 0) {
751
+ query["namespaceKey"] = new Includes(parsedNamespaces);
752
+ }
753
+ }
754
+ }
755
+ if (data.componentType === DashboardComponentType.KubernetesPodList) {
756
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
757
+ query,
758
+ queryKey: "phase",
759
+ argumentsObject,
760
+ argumentKey: "podPhases",
761
+ });
762
+ }
763
+ if (data.componentType === DashboardComponentType.KubernetesNodeList) {
764
+ const readinessFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "readinessFilter", ["ready", "not-ready"]);
765
+ if (readinessFilter === "ready") {
766
+ query["isReady"] = true;
767
+ }
768
+ else if (readinessFilter === "not-ready") {
769
+ query["isReady"] = false;
770
+ }
771
+ }
772
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
773
+ resourceType: "kubernetes-resource",
774
+ query,
775
+ sort: {
776
+ namespaceKey: SortOrder.Ascending,
777
+ name: SortOrder.Ascending,
778
+ },
779
+ argumentsObject,
780
+ })), { attributeToColumn: data.attributeToColumn });
781
+ }
782
+ static buildContainerHostPolicy(data) {
783
+ const query = {};
784
+ PublicDashboardResourceListPolicy.addCollectorStatusFilter(query, data.argumentsObject);
785
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
786
+ resourceType: data.resourceType,
787
+ query,
788
+ sort: { name: SortOrder.Ascending },
789
+ argumentsObject: data.argumentsObject,
790
+ })), { attributeToColumn: HOST_NAME_ATTRIBUTE_TO_COLUMN });
791
+ }
792
+ static buildContainerPolicy(data) {
793
+ const query = { kind: "Container" };
794
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
795
+ query,
796
+ queryKey: data.hostIdKey,
797
+ argumentsObject: data.argumentsObject,
798
+ argumentKey: data.storedHostIdsKey,
799
+ });
800
+ const imageName = PublicDashboardResourceListPolicy.optionalString(data.argumentsObject, "imageName", true);
801
+ if (imageName) {
802
+ query["imageName"] = new Search(imageName);
803
+ }
804
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
805
+ resourceType: data.resourceType,
806
+ query,
807
+ sort: { name: SortOrder.Ascending },
808
+ argumentsObject: data.argumentsObject,
809
+ })), { attributeToColumn: CONTAINER_ATTRIBUTE_TO_COLUMN });
810
+ }
811
+ static buildImagePolicy(data) {
812
+ const query = { kind: "Image" };
813
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
814
+ query,
815
+ queryKey: data.hostIdKey,
816
+ argumentsObject: data.argumentsObject,
817
+ argumentKey: data.storedHostIdsKey,
818
+ });
819
+ const nameSearch = PublicDashboardResourceListPolicy.optionalString(data.argumentsObject, "nameSearch", true);
820
+ if (nameSearch) {
821
+ query["name"] = new Search(nameSearch);
822
+ }
823
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
824
+ resourceType: data.resourceType,
825
+ query,
826
+ sort: { name: SortOrder.Ascending },
827
+ argumentsObject: data.argumentsObject,
828
+ })), { attributeToColumn: IMAGE_ATTRIBUTE_TO_COLUMN });
829
+ }
830
+ static buildContainerInventoryPolicy(data) {
831
+ const query = { kind: data.kind };
832
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
833
+ query,
834
+ queryKey: data.hostIdKey,
835
+ argumentsObject: data.argumentsObject,
836
+ argumentKey: data.storedHostIdsKey,
837
+ });
838
+ return PublicDashboardResourceListPolicy.listDraft({
839
+ resourceType: data.resourceType,
840
+ query,
841
+ sort: { name: SortOrder.Ascending },
842
+ argumentsObject: data.argumentsObject,
843
+ });
844
+ }
845
+ static buildProxmoxNodePolicy(argumentsObject) {
846
+ const query = { kind: "Node" };
847
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
848
+ query,
849
+ queryKey: "proxmoxClusterId",
850
+ argumentsObject,
851
+ argumentKey: "proxmoxClusterIds",
852
+ });
853
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["online", "offline"]);
854
+ if (statusFilter === "online") {
855
+ query["isUp"] = true;
856
+ }
857
+ else if (statusFilter === "offline") {
858
+ query["isUp"] = false;
859
+ }
860
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
861
+ resourceType: "proxmox-resource",
862
+ query,
863
+ sort: { name: SortOrder.Ascending },
864
+ argumentsObject,
865
+ })), { attributeToColumn: PROXMOX_NODE_ATTRIBUTE_TO_COLUMN });
866
+ }
867
+ static buildProxmoxGuestPolicy(argumentsObject) {
868
+ const query = { kind: "Guest" };
869
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
870
+ query,
871
+ queryKey: "proxmoxClusterId",
872
+ argumentsObject,
873
+ argumentKey: "proxmoxClusterIds",
874
+ });
875
+ const guestType = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "guestTypeFilter", ["qemu", "lxc"]);
876
+ if (guestType) {
877
+ query["guestType"] = guestType;
878
+ }
879
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["running", "stopped"]);
880
+ if (statusFilter === "running") {
881
+ query["isUp"] = true;
882
+ }
883
+ else if (statusFilter === "stopped") {
884
+ query["isUp"] = false;
885
+ }
886
+ return PublicDashboardResourceListPolicy.listDraft({
887
+ resourceType: "proxmox-resource",
888
+ query,
889
+ sort: { name: SortOrder.Ascending },
890
+ argumentsObject,
891
+ });
892
+ }
893
+ static buildCephOsdPolicy(argumentsObject) {
894
+ const query = { kind: "Osd" };
895
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
896
+ query,
897
+ queryKey: "cephClusterId",
898
+ argumentsObject,
899
+ argumentKey: "cephClusterIds",
900
+ });
901
+ const stateFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "stateFilter", ["up", "down", "out"]);
902
+ if (stateFilter === "up") {
903
+ query["isUp"] = true;
904
+ }
905
+ else if (stateFilter === "down") {
906
+ query["isUp"] = false;
907
+ }
908
+ else if (stateFilter === "out") {
909
+ query["isIn"] = false;
910
+ }
911
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
912
+ resourceType: "ceph-resource",
913
+ query,
914
+ sort: { externalId: SortOrder.Ascending },
915
+ argumentsObject,
916
+ })), { attributeToColumn: CEPH_OSD_ATTRIBUTE_TO_COLUMN });
917
+ }
918
+ static buildCephPoolPolicy(argumentsObject) {
919
+ const query = { kind: "Pool" };
920
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
921
+ query,
922
+ queryKey: "cephClusterId",
923
+ argumentsObject,
924
+ argumentKey: "cephClusterIds",
925
+ });
926
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
927
+ resourceType: "ceph-resource",
928
+ query,
929
+ sort: { name: SortOrder.Ascending },
930
+ argumentsObject,
931
+ })), { attributeToColumn: CEPH_POOL_ATTRIBUTE_TO_COLUMN });
932
+ }
933
+ static buildDockerSwarmNodePolicy(argumentsObject) {
934
+ const query = { kind: "Node" };
935
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
936
+ query,
937
+ queryKey: "dockerSwarmClusterId",
938
+ argumentsObject,
939
+ argumentKey: "dockerSwarmClusterIds",
940
+ });
941
+ const role = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "roleFilter", ["manager", "worker"]);
942
+ if (role) {
943
+ query["role"] = role;
944
+ }
945
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["ready", "notready"]);
946
+ if (statusFilter === "ready") {
947
+ query["isReady"] = true;
948
+ }
949
+ else if (statusFilter === "notready") {
950
+ query["isReady"] = false;
951
+ }
952
+ return PublicDashboardResourceListPolicy.listDraft({
953
+ resourceType: "docker-swarm-resource",
954
+ query,
955
+ sort: { name: SortOrder.Ascending },
956
+ argumentsObject,
957
+ });
958
+ }
959
+ static buildDockerSwarmServicePolicy(argumentsObject) {
960
+ const query = { kind: "Service" };
961
+ PublicDashboardResourceListPolicy.addIncludesFromArgument({
962
+ query,
963
+ queryKey: "dockerSwarmClusterId",
964
+ argumentsObject,
965
+ argumentKey: "dockerSwarmClusterIds",
966
+ });
967
+ const serviceMode = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "serviceModeFilter", ["replicated", "global"]);
968
+ if (serviceMode) {
969
+ query["serviceMode"] = serviceMode;
970
+ }
971
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["converged", "notconverged"]);
972
+ if (statusFilter === "converged") {
973
+ query["isReady"] = true;
974
+ }
975
+ else if (statusFilter === "notconverged") {
976
+ query["isReady"] = false;
977
+ }
978
+ return PublicDashboardResourceListPolicy.listDraft({
979
+ resourceType: "docker-swarm-resource",
980
+ query,
981
+ sort: { name: SortOrder.Ascending },
982
+ argumentsObject,
983
+ });
984
+ }
985
+ static buildTracePolicy(data) {
986
+ const query = {
987
+ startTime: PublicDashboardResourceListPolicy.requiredTimeRange(data.requestedQuery, "startTime"),
988
+ };
989
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(data.argumentsObject, "statusFilter", ["0", "1", "2"]);
990
+ if (statusFilter !== undefined) {
991
+ query["statusCode"] = parseInt(statusFilter, 10);
992
+ }
993
+ return PublicDashboardResourceListPolicy.listDraft({
994
+ resourceType: "span",
995
+ query,
996
+ sort: { startTime: SortOrder.Descending },
997
+ argumentsObject: data.argumentsObject,
998
+ fallbackLimit: DEFAULT_TELEMETRY_LIMIT,
999
+ });
1000
+ }
1001
+ static buildLogPolicy(data) {
1002
+ const query = {
1003
+ time: PublicDashboardResourceListPolicy.requiredTimeRange(data.requestedQuery, "time"),
1004
+ };
1005
+ const severity = PublicDashboardResourceListPolicy.optionalEnum(data.argumentsObject, "severityFilter", ["Trace", "Debug", "Information", "Warning", "Error", "Fatal"]);
1006
+ if (severity) {
1007
+ query["severityText"] = severity;
1008
+ }
1009
+ const bodyContains = PublicDashboardResourceListPolicy.optionalString(data.argumentsObject, "bodyContains", true);
1010
+ if (bodyContains) {
1011
+ query["body"] = bodyContains;
1012
+ }
1013
+ const attributeFilterQuery = PublicDashboardResourceListPolicy.optionalString(data.argumentsObject, "attributeFilterQuery", true);
1014
+ if (attributeFilterQuery) {
1015
+ const parsedFilter = queryStringToFilter(attributeFilterQuery);
1016
+ if (parsedFilter.attributes &&
1017
+ Object.keys(parsedFilter.attributes).length > 0) {
1018
+ query["attributes"] = parsedFilter.attributes;
1019
+ }
1020
+ }
1021
+ return Object.assign(Object.assign({}, PublicDashboardResourceListPolicy.listDraft({
1022
+ resourceType: "log",
1023
+ query,
1024
+ sort: { time: SortOrder.Descending },
1025
+ argumentsObject: data.argumentsObject,
1026
+ fallbackLimit: DEFAULT_TELEMETRY_LIMIT,
1027
+ })), { interpolateAttributeMap: true });
1028
+ }
1029
+ static listDraft(data) {
1030
+ return {
1031
+ resourceType: data.resourceType,
1032
+ query: data.query,
1033
+ sort: data.sort,
1034
+ limit: PublicDashboardResourceListPolicy.storedLimit({
1035
+ value: data.argumentsObject["maxRows"],
1036
+ fallback: data.fallbackLimit || DEFAULT_LIST_LIMIT,
1037
+ ceiling: LIMIT_PER_PROJECT,
1038
+ }),
1039
+ };
1040
+ }
1041
+ static addCollectorStatusFilter(query, argumentsObject) {
1042
+ const statusFilter = PublicDashboardResourceListPolicy.optionalEnum(argumentsObject, "statusFilter", ["connected", "disconnected"]);
1043
+ if (statusFilter) {
1044
+ query["otelCollectorStatus"] = statusFilter;
1045
+ }
1046
+ }
1047
+ static addIncludesFromArgument(data) {
1048
+ const values = PublicDashboardResourceListPolicy.optionalStringArray(data.argumentsObject, data.argumentKey);
1049
+ if (values && values.length > 0) {
1050
+ data.query[data.queryKey] = new Includes(values);
1051
+ }
1052
+ }
1053
+ static optionalStringArray(object, key) {
1054
+ const value = object[key];
1055
+ if (value === undefined || value === null) {
1056
+ return undefined;
1057
+ }
1058
+ if (!Array.isArray(value)) {
1059
+ throw new BadDataException(`Dashboard widget ${key} must be an array.`);
1060
+ }
1061
+ const values = [];
1062
+ for (const item of value) {
1063
+ if (typeof item !== "string" || item.length === 0) {
1064
+ throw new BadDataException(`Dashboard widget ${key} contains an invalid value.`);
1065
+ }
1066
+ values.push(item);
1067
+ }
1068
+ return values;
1069
+ }
1070
+ static optionalString(object, key, trim) {
1071
+ const value = object[key];
1072
+ if (value === undefined || value === null || value === "") {
1073
+ return undefined;
1074
+ }
1075
+ if (typeof value !== "string") {
1076
+ throw new BadDataException(`Dashboard widget ${key} must be a string.`);
1077
+ }
1078
+ const normalized = trim ? value.trim() : value;
1079
+ return normalized.length > 0 ? normalized : undefined;
1080
+ }
1081
+ static optionalEnum(object, key, allowedValues) {
1082
+ const value = object[key];
1083
+ if (value === undefined || value === null || value === "") {
1084
+ return undefined;
1085
+ }
1086
+ if (typeof value !== "string" || !allowedValues.includes(value)) {
1087
+ throw new BadDataException(`Dashboard widget ${key} is invalid.`);
1088
+ }
1089
+ return value;
1090
+ }
1091
+ static storedLimit(data) {
1092
+ const parsed = Number(typeof data.value === "string" ? data.value.trim() : data.value);
1093
+ if (!Number.isFinite(parsed) || parsed < 1) {
1094
+ return data.fallback;
1095
+ }
1096
+ return Math.min(Math.floor(parsed), data.ceiling);
1097
+ }
1098
+ static requiredTimeRange(requestedQuery, key) {
1099
+ const query = PublicDashboardResourceListPolicy.requireObject(requestedQuery, "Public dashboard telemetry query");
1100
+ if (!Object.prototype.hasOwnProperty.call(query, key)) {
1101
+ throw new BadDataException(`Public dashboard telemetry query requires ${key}.`);
1102
+ }
1103
+ const deserialized = JSONFunctions.deserializeValue(query[key]);
1104
+ if (!(deserialized instanceof InBetween)) {
1105
+ throw new BadDataException(`Public dashboard telemetry ${key} must be an InBetween range.`);
1106
+ }
1107
+ const start = PublicDashboardResourceListPolicy.validDate(deserialized.startValue, key);
1108
+ const end = PublicDashboardResourceListPolicy.validDate(deserialized.endValue, key);
1109
+ if (start.getTime() >= end.getTime()) {
1110
+ throw new BadDataException(`Public dashboard telemetry ${key} range is invalid.`);
1111
+ }
1112
+ return new InBetween(start, end);
1113
+ }
1114
+ static validDate(value, key) {
1115
+ if (value instanceof Date && Number.isFinite(value.getTime())) {
1116
+ return new Date(value.getTime());
1117
+ }
1118
+ if (typeof value === "string" && value.length <= 128) {
1119
+ const date = new Date(value);
1120
+ if (Number.isFinite(date.getTime())) {
1121
+ return date;
1122
+ }
1123
+ }
1124
+ throw new BadDataException(`Public dashboard telemetry ${key} range contains an invalid date.`);
1125
+ }
1126
+ static resolveDashboardVariableSelections(data) {
1127
+ const dashboardViewConfig = PublicDashboardResourceListPolicy.requireObject(data.dashboardViewConfig, "Dashboard view config");
1128
+ const storedVariablesValue = dashboardViewConfig["variables"];
1129
+ const storedVariables = storedVariablesValue === undefined || storedVariablesValue === null
1130
+ ? []
1131
+ : Array.isArray(storedVariablesValue)
1132
+ ? storedVariablesValue
1133
+ : (() => {
1134
+ throw new BadDataException("Dashboard view config variables must be an array.");
1135
+ })();
1136
+ const requestedSelections = PublicDashboardResourceListPolicy.validateRequestedVariableSelections(data.requestedVariables);
1137
+ const variables = [];
1138
+ const storedIds = new Set();
1139
+ for (const storedValue of storedVariables) {
1140
+ const stored = PublicDashboardResourceListPolicy.requireObject(storedValue, "Stored dashboard variable");
1141
+ if (stored["type"] !== DashboardVariableType.TelemetryAttribute) {
1142
+ continue;
1143
+ }
1144
+ const id = stored["id"];
1145
+ const attributeKey = stored["attributeKey"];
1146
+ if (typeof id !== "string" ||
1147
+ id.length === 0 ||
1148
+ id.length > MAX_VARIABLE_ID_LENGTH ||
1149
+ typeof attributeKey !== "string" ||
1150
+ attributeKey.trim().length === 0 ||
1151
+ attributeKey.length > MAX_VARIABLE_VALUE_LENGTH) {
1152
+ throw new BadDataException("Stored dashboard variable is malformed.");
1153
+ }
1154
+ if (storedIds.has(id)) {
1155
+ throw new BadDataException("Dashboard variable IDs must be unique.");
1156
+ }
1157
+ storedIds.add(id);
1158
+ const isMultiSelect = stored["isMultiSelect"];
1159
+ if (isMultiSelect !== undefined &&
1160
+ isMultiSelect !== null &&
1161
+ typeof isMultiSelect !== "boolean") {
1162
+ throw new BadDataException("Stored dashboard variable is malformed.");
1163
+ }
1164
+ const defaultValue = stored["defaultValue"];
1165
+ if (defaultValue !== undefined &&
1166
+ defaultValue !== null &&
1167
+ (typeof defaultValue !== "string" ||
1168
+ defaultValue.length > MAX_VARIABLE_VALUE_LENGTH)) {
1169
+ throw new BadDataException("Stored dashboard variable is malformed.");
1170
+ }
1171
+ const selection = requestedSelections.get(id);
1172
+ const selectedValue = selection === null || selection === void 0 ? void 0 : selection["selectedValue"];
1173
+ const selectedValues = selection === null || selection === void 0 ? void 0 : selection["selectedValues"];
1174
+ const name = stored["name"];
1175
+ const storedIsMultiSelect = isMultiSelect === true;
1176
+ variables.push({
1177
+ id,
1178
+ name: typeof name === "string" ? name : "",
1179
+ type: DashboardVariableType.TelemetryAttribute,
1180
+ attributeKey: attributeKey.trim(),
1181
+ isMultiSelect: storedIsMultiSelect,
1182
+ defaultValue: typeof defaultValue === "string" ? defaultValue : undefined,
1183
+ selectedValue: !storedIsMultiSelect && typeof selectedValue === "string"
1184
+ ? selectedValue
1185
+ : undefined,
1186
+ selectedValues: storedIsMultiSelect && Array.isArray(selectedValues)
1187
+ ? selectedValues
1188
+ : undefined,
1189
+ });
1190
+ }
1191
+ return variables;
1192
+ }
1193
+ static validateRequestedVariableSelections(requestedVariables) {
1194
+ const selections = new Map();
1195
+ if (requestedVariables === undefined || requestedVariables === null) {
1196
+ return selections;
1197
+ }
1198
+ if (!Array.isArray(requestedVariables)) {
1199
+ throw new BadDataException("Public dashboard variable selections must be an array.");
1200
+ }
1201
+ if (requestedVariables.length > MAX_REQUESTED_VARIABLES) {
1202
+ throw new BadDataException("Too many public dashboard variable selections.");
1203
+ }
1204
+ let totalSelectedValues = 0;
1205
+ for (const requestedValue of requestedVariables) {
1206
+ const requested = PublicDashboardResourceListPolicy.requireObject(requestedValue, "Public dashboard variable selection");
1207
+ const id = requested["id"];
1208
+ if (typeof id !== "string" ||
1209
+ id.length === 0 ||
1210
+ id.length > MAX_VARIABLE_ID_LENGTH) {
1211
+ throw new BadDataException("Public dashboard variable selection has an invalid id.");
1212
+ }
1213
+ if (selections.has(id)) {
1214
+ throw new BadDataException("Public dashboard variable selections contain a duplicate id.");
1215
+ }
1216
+ const selectedValue = requested["selectedValue"];
1217
+ if (selectedValue !== undefined &&
1218
+ selectedValue !== null &&
1219
+ (typeof selectedValue !== "string" ||
1220
+ selectedValue.length > MAX_VARIABLE_VALUE_LENGTH)) {
1221
+ throw new BadDataException("Public dashboard variable selection has an invalid value.");
1222
+ }
1223
+ const selectedValues = requested["selectedValues"];
1224
+ if (selectedValues !== undefined &&
1225
+ selectedValues !== null &&
1226
+ !Array.isArray(selectedValues)) {
1227
+ throw new BadDataException("Public dashboard variable selection values must be an array.");
1228
+ }
1229
+ if (Array.isArray(selectedValues) &&
1230
+ selectedValues.length > MAX_SELECTED_VALUES_PER_VARIABLE) {
1231
+ throw new BadDataException("Too many values in a public dashboard variable selection.");
1232
+ }
1233
+ if (Array.isArray(selectedValues)) {
1234
+ totalSelectedValues += selectedValues.length;
1235
+ if (totalSelectedValues > MAX_TOTAL_SELECTED_VALUES) {
1236
+ throw new BadDataException("Too many public dashboard variable selection values.");
1237
+ }
1238
+ for (const value of selectedValues) {
1239
+ if (typeof value !== "string" ||
1240
+ value.length > MAX_VARIABLE_VALUE_LENGTH) {
1241
+ throw new BadDataException("Public dashboard variable selection has an invalid value.");
1242
+ }
1243
+ }
1244
+ }
1245
+ selections.set(id, {
1246
+ selectedValue: typeof selectedValue === "string" ? selectedValue : undefined,
1247
+ selectedValues: Array.isArray(selectedValues)
1248
+ ? selectedValues
1249
+ : undefined,
1250
+ });
1251
+ }
1252
+ return selections;
1253
+ }
1254
+ static requireObject(value, label) {
1255
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
1256
+ throw new BadDataException(`${label} must be an object.`);
1257
+ }
1258
+ return value;
1259
+ }
1260
+ }
1261
+ //# sourceMappingURL=PublicDashboardResourceListPolicy.js.map