@oneuptime/common 12.0.4 → 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 (838) hide show
  1. package/Models/DatabaseModels/AIRun.ts +71 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/Dashboard.ts +28 -0
  4. package/Models/DatabaseModels/DataSource.ts +744 -0
  5. package/Models/DatabaseModels/Incident.ts +2 -0
  6. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  7. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  8. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  9. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  10. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  11. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  12. package/Models/DatabaseModels/Index.ts +3 -0
  13. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  14. package/Models/DatabaseModels/Project.ts +231 -9
  15. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
  16. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  17. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  18. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  19. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  20. package/Models/DatabaseModels/StatusPage.ts +28 -0
  21. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  22. package/Models/DatabaseModels/User.ts +2 -0
  23. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  24. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  25. package/Models/DatabaseModels/UserSession.ts +2 -0
  26. package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
  27. package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
  28. package/Server/API/AIAgentDataAPI.ts +44 -55
  29. package/Server/API/AIInsightAPI.ts +47 -4
  30. package/Server/API/AIInvestigationAPI.ts +200 -17
  31. package/Server/API/DashboardAPI.ts +186 -502
  32. package/Server/API/DataSourceAPI.ts +268 -0
  33. package/Server/API/StatusPageAPI.ts +49 -20
  34. package/Server/API/UserAPI.ts +119 -0
  35. package/Server/EnvironmentConfig.ts +16 -0
  36. package/Server/Infrastructure/ClickhouseConfig.ts +74 -1
  37. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
  47. package/Server/Infrastructure/Queue.ts +26 -0
  48. package/Server/Infrastructure/QueueWorker.ts +17 -0
  49. package/Server/Middleware/TelemetryIngest.ts +8 -3
  50. package/Server/Services/AIInsightService.ts +132 -12
  51. package/Server/Services/AIRunService.ts +112 -10
  52. package/Server/Services/AIService.ts +109 -22
  53. package/Server/Services/AlertFeedService.ts +5 -0
  54. package/Server/Services/AlertService.ts +38 -32
  55. package/Server/Services/AnalyticsDatabaseService.ts +37 -4
  56. package/Server/Services/DataSourceService.ts +200 -0
  57. package/Server/Services/DatabaseService.ts +43 -2
  58. package/Server/Services/HostService.ts +92 -0
  59. package/Server/Services/IncidentFeedService.ts +5 -0
  60. package/Server/Services/IncidentService.ts +45 -0
  61. package/Server/Services/Index.ts +2 -0
  62. package/Server/Services/LlmLogService.ts +46 -2
  63. package/Server/Services/MonitorService.ts +49 -0
  64. package/Server/Services/MonitorStatusService.ts +166 -0
  65. package/Server/Services/OpenTelemetryIngestService.ts +255 -184
  66. package/Server/Services/RumSessionPinService.ts +7 -21
  67. package/Server/Services/StatusPageSubscriberService.ts +13 -0
  68. package/Server/Services/UserService.ts +280 -9
  69. package/Server/Static/Vendor/README.md +62 -0
  70. package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
  71. package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
  72. package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
  73. package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
  74. package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
  75. package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
  76. package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
  77. package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
  78. package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
  79. package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
  80. package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
  81. package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
  82. package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
  83. package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
  84. package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
  85. package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
  86. package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
  87. package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
  88. package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
  89. package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
  90. package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
  91. package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
  92. package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
  93. package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
  94. package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
  95. package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
  96. package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
  97. package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
  98. package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
  99. package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
  100. package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
  101. package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
  102. package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
  103. package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
  104. package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
  105. package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
  106. package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
  107. package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
  108. package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
  109. package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
  110. package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
  111. package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
  112. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  113. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  114. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  115. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  116. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  117. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  118. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +311 -31
  119. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +26 -24
  120. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  121. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  122. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +26 -24
  123. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
  124. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
  125. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
  126. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
  127. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  128. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  129. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  130. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  131. package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
  132. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  133. package/Server/Utils/AI/SRE/README.md +1 -1
  134. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  135. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  136. package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
  137. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
  138. package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
  139. package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
  140. package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
  141. package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
  142. package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
  143. package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
  144. package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
  145. package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
  146. package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
  147. package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
  148. package/Server/Utils/DataSource/EgressGuard.ts +446 -0
  149. package/Server/Utils/DataSource/HttpFetch.ts +221 -0
  150. package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
  151. package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
  152. package/Server/Utils/DataSource/Types.ts +93 -0
  153. package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
  154. package/Server/Utils/InProcessMemo.ts +141 -0
  155. package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
  156. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  157. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  158. package/Server/Utils/Monitor/MonitorMetricUtil.ts +104 -0
  159. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  160. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  161. package/Server/Utils/PasswordHash.ts +28 -4
  162. package/Server/Utils/Response.ts +12 -1
  163. package/Server/Utils/SSRFProtection.ts +237 -0
  164. package/Server/Utils/StartServer.ts +8 -0
  165. package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
  166. package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
  167. package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
  168. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
  169. package/Server/Utils/Telemetry/Telemetry.ts +112 -1
  170. package/Server/Utils/Telemetry.ts +104 -3
  171. package/Server/Utils/VendorAssets.ts +165 -0
  172. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
  173. package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
  174. package/Server/Views/Partials/Head.ejs +21 -7
  175. package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
  176. package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
  177. package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
  178. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  179. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
  180. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
  181. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
  182. package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
  183. package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
  184. package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
  185. package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
  186. package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
  187. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  188. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
  189. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  190. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1695 -0
  191. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  192. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  193. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
  194. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
  195. package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
  196. package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
  197. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  198. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  199. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
  200. package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
  201. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  202. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  203. package/Tests/Server/API/AIInvestigationAPI.test.ts +781 -0
  204. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  205. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  206. package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
  207. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
  208. package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
  209. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  210. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
  211. package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
  212. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
  213. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
  214. package/Tests/Server/Services/AIInsightService.test.ts +266 -11
  215. package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
  216. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  217. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  218. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +400 -20
  219. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  220. package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
  221. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
  222. package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
  223. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
  224. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  225. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  226. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  227. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
  228. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
  229. package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
  230. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  231. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  232. package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
  233. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
  234. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
  235. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
  236. package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
  237. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
  238. package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
  239. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  240. package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
  241. package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
  242. package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
  243. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  244. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  245. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  246. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  247. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  248. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  249. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  250. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
  251. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
  252. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  253. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
  254. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  255. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  256. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +605 -20
  257. package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
  258. package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
  259. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  260. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  261. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  262. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  263. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  264. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
  265. package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
  266. package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
  267. package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
  268. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
  269. package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
  270. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
  271. package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
  272. package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
  273. package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
  274. package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
  275. package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
  276. package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
  277. package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
  278. package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
  279. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
  280. package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
  281. package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
  282. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
  283. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  284. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  285. package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
  286. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  287. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
  288. package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
  289. package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
  290. package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
  291. package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
  292. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
  293. package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
  294. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
  295. package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
  296. package/Tests/Server/Utils/Telemetry.test.ts +87 -0
  297. package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
  298. package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
  299. package/Tests/Server/Views/OfflineRender.test.ts +297 -0
  300. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  301. package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
  302. package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
  303. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  304. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  305. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  306. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  307. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  308. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  309. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  310. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  311. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  312. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  313. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  314. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  315. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  316. package/Tests/Types/Password.test.ts +363 -0
  317. package/Tests/Types/Permission.test.ts +137 -0
  318. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  319. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  320. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  321. package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
  322. package/Tests/UI/Components/ErrorBoundary.test.tsx +211 -0
  323. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  324. package/Tests/UI/Components/Modal.test.tsx +281 -1
  325. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  326. package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
  327. package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
  328. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  329. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  330. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  331. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
  332. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  333. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  334. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  335. package/Tests/UI/Utils/Project.test.ts +31 -0
  336. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  337. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  338. package/Tests/Utils/Analytics.test.ts +23 -0
  339. package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
  340. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  341. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  342. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
  343. package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
  344. package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
  345. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  346. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  347. package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
  348. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  349. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  350. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  351. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
  352. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
  353. package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
  354. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  355. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  356. package/Types/AI/AIInsightEvidence.ts +6 -0
  357. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  358. package/Types/AI/CodeFixTaskContext.ts +63 -3
  359. package/Types/AI/CodeFixTaskType.ts +3 -3
  360. package/Types/Analytics/RevenueEvent.ts +31 -0
  361. package/Types/Dashboard/DashboardComponentType.ts +31 -0
  362. package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
  363. package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
  364. package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
  365. package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
  366. package/Types/DataSource/DataSourceLimits.ts +62 -0
  367. package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
  368. package/Types/DataSource/DataSourceTableResult.ts +38 -0
  369. package/Types/DataSource/DataSourceType.ts +213 -0
  370. package/Types/Date.ts +43 -3
  371. package/Types/HashedString.ts +4 -3
  372. package/Types/Monitor/CriteriaFilter.ts +4 -0
  373. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  374. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  375. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  376. package/Types/Monitor/MonitorMetricType.ts +8 -0
  377. package/Types/Monitor/MonitorStep.ts +10 -1
  378. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  379. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  380. package/Types/Password.ts +64 -0
  381. package/Types/Permission.ts +69 -175
  382. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  383. package/Types/UserAuthenticationStatus.ts +34 -0
  384. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  385. package/UI/Components/Button/Button.tsx +1 -1
  386. package/UI/Components/ErrorBoundary.tsx +549 -71
  387. package/UI/Components/Feed/FeedItem.tsx +9 -2
  388. package/UI/Components/Icon/Icon.tsx +10 -9
  389. package/UI/Components/Modal/ConfirmModal.tsx +6 -1
  390. package/UI/Components/Modal/Modal.tsx +267 -35
  391. package/UI/Components/Modal/ModalFooter.tsx +6 -1
  392. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  393. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  394. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  395. package/UI/Components/MoreMenu/MoreMenu.tsx +301 -98
  396. package/UI/Components/MoreMenu/MoreMenuItem.tsx +13 -5
  397. package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
  398. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
  399. package/UI/Components/StatusPage/ResourceList.tsx +570 -0
  400. package/UI/Styles/Theme.css +18 -0
  401. package/UI/Utils/API/RequestOptions.ts +7 -0
  402. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
  403. package/UI/Utils/DownloadFile.ts +16 -8
  404. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  405. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -8
  406. package/UI/Utils/Project.ts +4 -0
  407. package/UI/Utils/StatusPage.ts +8 -2
  408. package/UI/Utils/TestDataSource.ts +61 -0
  409. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  410. package/UI/esbuild-config.js +45 -0
  411. package/Utils/Analytics.ts +15 -0
  412. package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
  413. package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
  414. package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
  415. package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
  416. package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
  417. package/Utils/Dashboard/Components/Index.ts +28 -0
  418. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  419. package/Utils/Dashboard/GridLayout.ts +523 -0
  420. package/Utils/DataSource/DataSourceQueryText.ts +94 -0
  421. package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
  422. package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
  423. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  424. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  425. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
  426. package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
  427. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  428. package/Utils/StatusPage/GroupTree.ts +157 -66
  429. package/Utils/StatusPage/ResourceExplorer.ts +853 -0
  430. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  431. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  432. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  433. package/build/dist/Models/DatabaseModels/AIRun.js +73 -1
  434. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  435. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  436. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  437. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  438. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  439. package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
  440. package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
  441. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  442. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  443. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  444. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  445. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  446. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  447. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  448. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  449. package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
  450. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  451. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  452. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  453. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  454. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  455. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  456. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  457. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  458. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  459. package/build/dist/Models/DatabaseModels/Project.js +241 -11
  460. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  461. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
  462. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  463. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  464. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  465. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  466. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  467. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  468. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  469. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  470. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  471. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  472. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  473. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  474. package/build/dist/Models/DatabaseModels/User.js +2 -0
  475. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  476. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  477. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  478. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  479. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  480. package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
  481. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
  482. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
  483. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  484. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
  485. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  486. package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
  487. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  488. package/build/dist/Server/API/AIInsightAPI.js +34 -4
  489. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  490. package/build/dist/Server/API/AIInvestigationAPI.js +134 -11
  491. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  492. package/build/dist/Server/API/DashboardAPI.js +127 -438
  493. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  494. package/build/dist/Server/API/DataSourceAPI.js +173 -0
  495. package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
  496. package/build/dist/Server/API/StatusPageAPI.js +40 -12
  497. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  498. package/build/dist/Server/API/UserAPI.js +94 -2
  499. package/build/dist/Server/API/UserAPI.js.map +1 -1
  500. package/build/dist/Server/EnvironmentConfig.js +14 -0
  501. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  502. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +61 -1
  503. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  504. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  505. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  506. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  507. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  508. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  509. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  510. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  511. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  512. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
  513. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
  514. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  515. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  516. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  517. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  518. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
  519. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
  520. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
  521. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
  522. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
  523. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  524. package/build/dist/Server/Infrastructure/Queue.js +27 -0
  525. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  526. package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
  527. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  528. package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
  529. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  530. package/build/dist/Server/Services/AIInsightService.js +110 -10
  531. package/build/dist/Server/Services/AIInsightService.js.map +1 -1
  532. package/build/dist/Server/Services/AIRunService.js +92 -12
  533. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  534. package/build/dist/Server/Services/AIService.js +88 -21
  535. package/build/dist/Server/Services/AIService.js.map +1 -1
  536. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  537. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  538. package/build/dist/Server/Services/AlertService.js +28 -35
  539. package/build/dist/Server/Services/AlertService.js.map +1 -1
  540. package/build/dist/Server/Services/AnalyticsDatabaseService.js +37 -5
  541. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  542. package/build/dist/Server/Services/DataSourceService.js +159 -0
  543. package/build/dist/Server/Services/DataSourceService.js.map +1 -0
  544. package/build/dist/Server/Services/DatabaseService.js +21 -2
  545. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  546. package/build/dist/Server/Services/HostService.js +74 -0
  547. package/build/dist/Server/Services/HostService.js.map +1 -1
  548. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  549. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  550. package/build/dist/Server/Services/IncidentService.js +35 -24
  551. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  552. package/build/dist/Server/Services/Index.js +2 -0
  553. package/build/dist/Server/Services/Index.js.map +1 -1
  554. package/build/dist/Server/Services/LlmLogService.js +22 -1
  555. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  556. package/build/dist/Server/Services/MonitorService.js +45 -0
  557. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  558. package/build/dist/Server/Services/MonitorStatusService.js +129 -0
  559. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  560. package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
  561. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  562. package/build/dist/Server/Services/RumSessionPinService.js +7 -15
  563. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  564. package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
  565. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  566. package/build/dist/Server/Services/UserService.js +241 -10
  567. package/build/dist/Server/Services/UserService.js.map +1 -1
  568. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
  569. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  570. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
  571. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
  572. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
  573. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  574. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
  575. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  576. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  577. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  578. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  579. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  580. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  581. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  582. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  583. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  584. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  585. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  586. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  587. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  588. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +222 -34
  589. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  590. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +22 -19
  591. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  592. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  593. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  594. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  595. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  596. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +22 -19
  597. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  598. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
  599. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
  600. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
  601. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  602. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
  603. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  604. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
  605. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
  606. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  607. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  608. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  609. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  610. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  611. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  612. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  613. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  614. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
  615. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
  616. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  617. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  618. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  619. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  620. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  621. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  622. package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
  623. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
  624. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
  625. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
  626. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
  627. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
  628. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
  629. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
  630. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
  631. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
  632. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
  633. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
  634. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
  635. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
  636. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
  637. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
  638. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
  639. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
  640. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
  641. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
  642. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
  643. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
  644. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
  645. package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
  646. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
  647. package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
  648. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
  649. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
  650. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
  651. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
  652. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
  653. package/build/dist/Server/Utils/DataSource/Types.js +2 -0
  654. package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
  655. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
  656. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  657. package/build/dist/Server/Utils/InProcessMemo.js +113 -0
  658. package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
  659. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
  660. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
  661. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  662. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  663. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  664. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  665. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +67 -0
  666. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  667. package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
  668. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  669. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  670. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  671. package/build/dist/Server/Utils/PasswordHash.js +25 -4
  672. package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
  673. package/build/dist/Server/Utils/Response.js +9 -1
  674. package/build/dist/Server/Utils/Response.js.map +1 -1
  675. package/build/dist/Server/Utils/SSRFProtection.js +192 -0
  676. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
  677. package/build/dist/Server/Utils/StartServer.js +7 -0
  678. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  679. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
  680. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  681. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
  682. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  683. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
  684. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
  685. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
  686. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  687. package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
  688. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  689. package/build/dist/Server/Utils/Telemetry.js +93 -6
  690. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  691. package/build/dist/Server/Utils/VendorAssets.js +121 -0
  692. package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
  693. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
  694. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  695. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
  696. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  697. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  698. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  699. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  700. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  701. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  702. package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
  703. package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
  704. package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
  705. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  706. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
  707. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
  708. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
  709. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
  710. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
  711. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
  712. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
  713. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
  714. package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
  715. package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
  716. package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
  717. package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
  718. package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
  719. package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
  720. package/build/dist/Types/DataSource/DataSourceType.js +183 -0
  721. package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
  722. package/build/dist/Types/Date.js +38 -3
  723. package/build/dist/Types/Date.js.map +1 -1
  724. package/build/dist/Types/HashedString.js +4 -3
  725. package/build/dist/Types/HashedString.js.map +1 -1
  726. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  727. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  728. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  729. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  730. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  731. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  732. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  733. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  734. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  735. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  736. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  737. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  738. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  739. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  740. package/build/dist/Types/Password.js +56 -0
  741. package/build/dist/Types/Password.js.map +1 -0
  742. package/build/dist/Types/Permission.js +65 -155
  743. package/build/dist/Types/Permission.js.map +1 -1
  744. package/build/dist/Types/UserAuthenticationStatus.js +2 -0
  745. package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
  746. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  747. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  748. package/build/dist/UI/Components/ErrorBoundary.js +427 -52
  749. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  750. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  751. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  752. package/build/dist/UI/Components/Icon/Icon.js +10 -4
  753. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  754. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  755. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  756. package/build/dist/UI/Components/Modal/Modal.js +178 -19
  757. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  758. package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
  759. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  760. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  761. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  762. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  763. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  764. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  765. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  766. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +197 -66
  767. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  768. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
  769. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  770. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
  771. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
  772. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
  773. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
  774. package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
  775. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
  776. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
  777. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  778. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  779. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  780. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  781. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  782. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +20 -15
  783. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  784. package/build/dist/UI/Utils/Project.js +3 -0
  785. package/build/dist/UI/Utils/Project.js.map +1 -1
  786. package/build/dist/UI/Utils/StatusPage.js +4 -4
  787. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  788. package/build/dist/UI/Utils/TestDataSource.js +39 -0
  789. package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
  790. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  791. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  792. package/build/dist/Utils/Analytics.js +4 -0
  793. package/build/dist/Utils/Analytics.js.map +1 -1
  794. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
  795. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
  796. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
  797. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
  798. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
  799. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
  800. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
  801. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
  802. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
  803. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
  804. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  805. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  806. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  807. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  808. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  809. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  810. package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
  811. package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
  812. package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
  813. package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
  814. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
  815. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
  816. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  817. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  818. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  819. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  820. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
  821. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  822. package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
  823. package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
  824. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  825. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  826. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  827. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  828. package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
  829. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
  830. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  831. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  832. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  833. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  834. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  835. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  836. package/jest.config.json +1 -0
  837. package/package.json +5 -1
  838. package/tsconfig.json +12 -10
@@ -15,15 +15,15 @@ import Response from "../Utils/Response";
15
15
  import BaseAPI from "./BaseAPI";
16
16
  import BadDataException from "../../Types/Exception/BadDataException";
17
17
  import NotFoundException from "../../Types/Exception/NotFoundException";
18
- import HashedString from "../../Types/HashedString";
19
18
  import ObjectID from "../../Types/ObjectID";
20
19
  import Dashboard from "../../Models/DatabaseModels/Dashboard";
21
20
  import DashboardDomain from "../../Models/DatabaseModels/DashboardDomain";
22
- import { EncryptionSecret } from "../EnvironmentConfig";
23
21
  import { DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE } from "../../Types/Dashboard/MasterPassword";
24
22
  import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
25
23
  import ForbiddenException from "../../Types/Exception/ForbiddenException";
26
24
  import JSONFunctions from "../../Types/JSONFunctions";
25
+ import DashboardViewConfig from "../../Types/Dashboard/DashboardViewConfig";
26
+ import PublicDashboardViewConfig from "../Utils/Dashboard/PublicDashboardViewConfig";
27
27
  import TelemetryAttributeService from "../Services/TelemetryAttributeService";
28
28
  import TelemetryType from "../../Types/Telemetry/TelemetryType";
29
29
  import { JSONObject } from "../../Types/JSON";
@@ -70,26 +70,24 @@ import SpanService from "../Services/SpanService";
70
70
  import LogService from "../Services/LogService";
71
71
  import DashboardComponentType from "../../Types/Dashboard/DashboardComponentType";
72
72
  import { DashboardVariableType } from "../../Types/Dashboard/DashboardVariable";
73
- import Includes from "../../Types/BaseDatabase/Includes";
73
+ import PublicDashboardResourceListPolicy, {
74
+ PublicDashboardResourceListPolicyResult,
75
+ } from "../Utils/Dashboard/PublicDashboardResourceListPolicy";
76
+ import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
77
+ import { applyAlertSelfPrivacyFilter } from "../Utils/Alert/AlertPrivacyFilter";
74
78
 
75
79
  /*
76
80
  * Registry of the non-metric widgets a public dashboard may render.
77
81
  *
78
- * Nothing on this endpoint is taken from the client except a narrow set of
79
- * filter values:
80
- *
81
- * - `select` is the FIXED set of columns the corresponding widget displays,
82
- * so an anonymous viewer can only ever read these columns.
83
82
  * - `widgets` lists the dashboard widgets that render this resource, mapped
84
83
  * to the `kind` each one shows (null when the model is not partitioned by
85
84
  * kind). The dashboard must actually contain one of these widgets before
86
85
  * the endpoint will serve the resource at all, and the query is pinned to
87
86
  * the kinds those widgets render. Adding a widget to a public dashboard is
88
87
  * therefore the owner's explicit — and only — opt-in to exposing this data.
89
- * - `allowedQueryKeys` is the set of columns the widget legitimately filters
90
- * on. Every other key in the client-supplied query is dropped, so a public
91
- * viewer cannot turn the endpoint into a generic query API over columns the
92
- * widget never exposes.
88
+ * Query, select, sort and pagination policy are rebuilt from the exact stored
89
+ * widget by PublicDashboardResourceListPolicy. Client copies of those fields
90
+ * are never authoritative on this unauthenticated route.
93
91
  */
94
92
  interface PublicDashboardResourceConfig {
95
93
  modelType: { new (): BaseModel | AnalyticsDataModel };
@@ -97,12 +95,8 @@ interface PublicDashboardResourceConfig {
97
95
  findBy: (findBy: any) => Promise<Array<BaseModel | AnalyticsDataModel>>;
98
96
  };
99
97
  widgets: Partial<Record<DashboardComponentType, string | null>>;
100
- allowedQueryKeys: Array<string>;
101
- select: JSONObject;
102
98
  }
103
99
 
104
- const DEFAULT_DASHBOARD_RESOURCE_LIMIT: number = 100;
105
-
106
100
  const PUBLIC_DASHBOARD_RESOURCES: Record<
107
101
  string,
108
102
  PublicDashboardResourceConfig
@@ -113,20 +107,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
113
107
  widgets: {
114
108
  [DashboardComponentType.IncidentList]: null,
115
109
  },
116
- allowedQueryKeys: [
117
- "currentIncidentState",
118
- "currentIncidentStateId",
119
- "incidentSeverityId",
120
- "monitors",
121
- "labels",
122
- ],
123
- select: {
124
- _id: true,
125
- title: true,
126
- createdAt: true,
127
- currentIncidentState: { name: true, color: true },
128
- incidentSeverity: { name: true, color: true },
129
- },
130
110
  },
131
111
  alert: {
132
112
  modelType: Alert,
@@ -134,20 +114,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
134
114
  widgets: {
135
115
  [DashboardComponentType.AlertList]: null,
136
116
  },
137
- allowedQueryKeys: [
138
- "currentAlertState",
139
- "currentAlertStateId",
140
- "alertSeverityId",
141
- "monitorId",
142
- "labels",
143
- ],
144
- select: {
145
- _id: true,
146
- title: true,
147
- createdAt: true,
148
- currentAlertState: { name: true, color: true },
149
- alertSeverity: { name: true, color: true },
150
- },
151
117
  },
152
118
  monitor: {
153
119
  modelType: Monitor,
@@ -155,18 +121,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
155
121
  widgets: {
156
122
  [DashboardComponentType.MonitorList]: null,
157
123
  },
158
- allowedQueryKeys: [
159
- "currentMonitorStatus",
160
- "currentMonitorStatusId",
161
- "monitorType",
162
- "labels",
163
- ],
164
- select: {
165
- _id: true,
166
- name: true,
167
- monitorType: true,
168
- currentMonitorStatus: { name: true, color: true },
169
- },
170
124
  },
171
125
  "network-site": {
172
126
  modelType: NetworkSite,
@@ -174,36 +128,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
174
128
  widgets: {
175
129
  [DashboardComponentType.NetworkMap]: null,
176
130
  },
177
- /*
178
- * The map filters by site type and by whether the rolled-up status is
179
- * operational — nothing else. Notably NOT `parentSiteId` or
180
- * `materializedPath`: the widget draws a flat set of pins rather than
181
- * walking a hierarchy, so exposing the tree shape here would hand an
182
- * anonymous viewer a structure the map never shows them.
183
- */
184
- allowedQueryKeys: [
185
- "networkSiteTypeId",
186
- "currentMonitorStatus",
187
- "currentMonitorStatusId",
188
- ],
189
- select: {
190
- _id: true,
191
- name: true,
192
- /*
193
- * The type NAME comes from the networkSiteType relation. NetworkSite
194
- * .siteType is the deprecated pre-lookup-table string and is dropped
195
- * in a follow-up PR, so it must not be read from new code.
196
- */
197
- networkSiteType: { name: true },
198
- latitude: true,
199
- longitude: true,
200
- currentMonitorStatus: {
201
- name: true,
202
- color: true,
203
- priority: true,
204
- isOperationalState: true,
205
- },
206
- },
207
131
  },
208
132
  host: {
209
133
  modelType: Host,
@@ -211,23 +135,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
211
135
  widgets: {
212
136
  [DashboardComponentType.HostList]: null,
213
137
  },
214
- allowedQueryKeys: [
215
- "name",
216
- "hostIdentifier",
217
- "otelCollectorStatus",
218
- "osType",
219
- ],
220
- select: {
221
- _id: true,
222
- name: true,
223
- hostIdentifier: true,
224
- otelCollectorStatus: true,
225
- osType: true,
226
- osVersion: true,
227
- cpuCores: true,
228
- totalMemoryBytes: true,
229
- lastSeenAt: true,
230
- },
231
138
  },
232
139
  "kubernetes-resource": {
233
140
  modelType: KubernetesResource,
@@ -242,33 +149,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
242
149
  [DashboardComponentType.KubernetesJobList]: "Job",
243
150
  [DashboardComponentType.KubernetesCronJobList]: "CronJob",
244
151
  },
245
- allowedQueryKeys: [
246
- "kubernetesClusterId",
247
- "namespaceKey",
248
- "name",
249
- "phase",
250
- "isReady",
251
- ],
252
- select: {
253
- _id: true,
254
- name: true,
255
- namespaceKey: true,
256
- kind: true,
257
- phase: true,
258
- isReady: true,
259
- hasMemoryPressure: true,
260
- hasDiskPressure: true,
261
- hasPidPressure: true,
262
- containerCount: true,
263
- latestCpuPercent: true,
264
- latestMemoryBytes: true,
265
- controllerDeploymentName: true,
266
- controllerCronJobName: true,
267
- resourceCreationTimestamp: true,
268
- lastSeenAt: true,
269
- kubernetesClusterId: true,
270
- kubernetesCluster: { name: true },
271
- },
272
152
  },
273
153
  "docker-host": {
274
154
  modelType: DockerHost,
@@ -276,17 +156,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
276
156
  widgets: {
277
157
  [DashboardComponentType.DockerHostList]: null,
278
158
  },
279
- allowedQueryKeys: ["name", "otelCollectorStatus"],
280
- select: {
281
- _id: true,
282
- name: true,
283
- otelCollectorStatus: true,
284
- containersRunning: true,
285
- containersStopped: true,
286
- containersPaused: true,
287
- osType: true,
288
- osVersion: true,
289
- },
290
159
  },
291
160
  "docker-container": {
292
161
  modelType: DockerResource,
@@ -294,17 +163,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
294
163
  widgets: {
295
164
  [DashboardComponentType.DockerContainerList]: "Container",
296
165
  },
297
- allowedQueryKeys: ["dockerHostId", "name", "imageName"],
298
- select: {
299
- _id: true,
300
- name: true,
301
- imageName: true,
302
- state: true,
303
- latestCpuPercent: true,
304
- latestMemoryBytes: true,
305
- dockerHostId: true,
306
- dockerHost: { name: true },
307
- },
308
166
  },
309
167
  "docker-image": {
310
168
  modelType: DockerResource,
@@ -312,14 +170,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
312
170
  widgets: {
313
171
  [DashboardComponentType.DockerImageList]: "Image",
314
172
  },
315
- allowedQueryKeys: ["dockerHostId", "name"],
316
- select: {
317
- _id: true,
318
- name: true,
319
- containerId: true,
320
- dockerHostId: true,
321
- dockerHost: { name: true },
322
- },
323
173
  },
324
174
  "docker-network": {
325
175
  modelType: DockerResource,
@@ -327,14 +177,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
327
177
  widgets: {
328
178
  [DashboardComponentType.DockerNetworkList]: "Network",
329
179
  },
330
- allowedQueryKeys: ["dockerHostId"],
331
- select: {
332
- _id: true,
333
- name: true,
334
- state: true,
335
- dockerHostId: true,
336
- dockerHost: { name: true },
337
- },
338
180
  },
339
181
  "docker-volume": {
340
182
  modelType: DockerResource,
@@ -342,14 +184,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
342
184
  widgets: {
343
185
  [DashboardComponentType.DockerVolumeList]: "Volume",
344
186
  },
345
- allowedQueryKeys: ["dockerHostId"],
346
- select: {
347
- _id: true,
348
- name: true,
349
- state: true,
350
- dockerHostId: true,
351
- dockerHost: { name: true },
352
- },
353
187
  },
354
188
  "podman-host": {
355
189
  modelType: PodmanHost,
@@ -357,17 +191,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
357
191
  widgets: {
358
192
  [DashboardComponentType.PodmanHostList]: null,
359
193
  },
360
- allowedQueryKeys: ["name", "otelCollectorStatus"],
361
- select: {
362
- _id: true,
363
- name: true,
364
- otelCollectorStatus: true,
365
- containersRunning: true,
366
- containersStopped: true,
367
- containersPaused: true,
368
- osType: true,
369
- osVersion: true,
370
- },
371
194
  },
372
195
  "podman-container": {
373
196
  modelType: PodmanResource,
@@ -375,17 +198,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
375
198
  widgets: {
376
199
  [DashboardComponentType.PodmanContainerList]: "Container",
377
200
  },
378
- allowedQueryKeys: ["podmanHostId", "name", "imageName"],
379
- select: {
380
- _id: true,
381
- name: true,
382
- imageName: true,
383
- state: true,
384
- latestCpuPercent: true,
385
- latestMemoryBytes: true,
386
- podmanHostId: true,
387
- podmanHost: { name: true },
388
- },
389
201
  },
390
202
  "podman-image": {
391
203
  modelType: PodmanResource,
@@ -393,14 +205,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
393
205
  widgets: {
394
206
  [DashboardComponentType.PodmanImageList]: "Image",
395
207
  },
396
- allowedQueryKeys: ["podmanHostId", "name"],
397
- select: {
398
- _id: true,
399
- name: true,
400
- containerId: true,
401
- podmanHostId: true,
402
- podmanHost: { name: true },
403
- },
404
208
  },
405
209
  "podman-network": {
406
210
  modelType: PodmanResource,
@@ -408,14 +212,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
408
212
  widgets: {
409
213
  [DashboardComponentType.PodmanNetworkList]: "Network",
410
214
  },
411
- allowedQueryKeys: ["podmanHostId"],
412
- select: {
413
- _id: true,
414
- name: true,
415
- state: true,
416
- podmanHostId: true,
417
- podmanHost: { name: true },
418
- },
419
215
  },
420
216
  "podman-volume": {
421
217
  modelType: PodmanResource,
@@ -423,14 +219,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
423
219
  widgets: {
424
220
  [DashboardComponentType.PodmanVolumeList]: "Volume",
425
221
  },
426
- allowedQueryKeys: ["podmanHostId"],
427
- select: {
428
- _id: true,
429
- name: true,
430
- state: true,
431
- podmanHostId: true,
432
- podmanHost: { name: true },
433
- },
434
222
  },
435
223
  "proxmox-resource": {
436
224
  modelType: ProxmoxResource,
@@ -439,23 +227,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
439
227
  [DashboardComponentType.ProxmoxNodeList]: "Node",
440
228
  [DashboardComponentType.ProxmoxGuestList]: "Guest",
441
229
  },
442
- allowedQueryKeys: ["proxmoxClusterId", "guestType", "isUp", "name"],
443
- select: {
444
- _id: true,
445
- name: true,
446
- externalId: true,
447
- kind: true,
448
- vmid: true,
449
- guestType: true,
450
- parentNodeName: true,
451
- isUp: true,
452
- haState: true,
453
- latestCpuPercent: true,
454
- latestMemoryPercent: true,
455
- lastSeenAt: true,
456
- proxmoxClusterId: true,
457
- proxmoxCluster: { name: true },
458
- },
459
230
  },
460
231
  "ceph-resource": {
461
232
  modelType: CephResource,
@@ -464,25 +235,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
464
235
  [DashboardComponentType.CephOsdList]: "Osd",
465
236
  [DashboardComponentType.CephPoolList]: "Pool",
466
237
  },
467
- allowedQueryKeys: ["cephClusterId", "isUp", "isIn", "externalId"],
468
- select: {
469
- _id: true,
470
- name: true,
471
- externalId: true,
472
- kind: true,
473
- hostname: true,
474
- deviceClass: true,
475
- isUp: true,
476
- isIn: true,
477
- statBytes: true,
478
- statBytesUsed: true,
479
- storedBytes: true,
480
- maxAvailBytes: true,
481
- objects: true,
482
- lastSeenAt: true,
483
- cephClusterId: true,
484
- cephCluster: { name: true },
485
- },
486
238
  },
487
239
  "docker-swarm-resource": {
488
240
  modelType: DockerSwarmResource,
@@ -491,30 +243,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
491
243
  [DashboardComponentType.DockerSwarmNodeList]: "Node",
492
244
  [DashboardComponentType.DockerSwarmServiceList]: "Service",
493
245
  },
494
- allowedQueryKeys: [
495
- "dockerSwarmClusterId",
496
- "role",
497
- "serviceMode",
498
- "isReady",
499
- ],
500
- select: {
501
- _id: true,
502
- name: true,
503
- externalId: true,
504
- kind: true,
505
- role: true,
506
- state: true,
507
- serviceMode: true,
508
- desiredReplicas: true,
509
- runningReplicas: true,
510
- image: true,
511
- isReady: true,
512
- latestCpuPercent: true,
513
- latestMemoryPercent: true,
514
- lastSeenAt: true,
515
- dockerSwarmClusterId: true,
516
- dockerSwarmCluster: { name: true },
517
- },
518
246
  },
519
247
  span: {
520
248
  modelType: Span,
@@ -522,17 +250,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
522
250
  widgets: {
523
251
  [DashboardComponentType.TraceList]: null,
524
252
  },
525
- allowedQueryKeys: ["startTime", "statusCode"],
526
- select: {
527
- startTime: true,
528
- name: true,
529
- statusCode: true,
530
- durationUnixNano: true,
531
- traceId: true,
532
- spanId: true,
533
- kind: true,
534
- primaryEntityId: true,
535
- },
536
253
  },
537
254
  log: {
538
255
  modelType: Log,
@@ -540,16 +257,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
540
257
  widgets: {
541
258
  [DashboardComponentType.LogStream]: null,
542
259
  },
543
- allowedQueryKeys: ["time", "severityText", "body", "attributes"],
544
- select: {
545
- time: true,
546
- severityText: true,
547
- body: true,
548
- primaryEntityId: true,
549
- traceId: true,
550
- spanId: true,
551
- attributes: true,
552
- },
553
260
  },
554
261
  };
555
262
 
@@ -765,24 +472,25 @@ export default class DashboardAPI extends BaseAPI<
765
472
  /*
766
473
  * Everything below is derived from columns the public /metadata and
767
474
  * /view-config endpoints already serve to anonymous viewers — the
768
- * overview only reshapes them into a single GET-able document.
475
+ * overview only reshapes them into a single GET-able document, and
476
+ * applies the same external-Data-Source strip /view-config does.
769
477
  */
478
+ const publicViewConfig: DashboardViewConfig | null =
479
+ PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
480
+
770
481
  return Response.sendJsonObjectResponse(req, res, {
771
482
  _id: dashboard._id?.toString() || "",
772
483
  name: dashboard.name || "Dashboard",
773
484
  description: dashboard.description || "",
774
485
  pageTitle: dashboard.pageTitle || "",
775
486
  pageDescription: dashboard.pageDescription || "",
776
- components: DashboardAPI.buildPublicComponentSummaries(
777
- dashboard.dashboardViewConfig,
778
- ),
487
+ components:
488
+ DashboardAPI.buildPublicComponentSummaries(publicViewConfig),
779
489
  metricsUsed: Array.from(
780
- DashboardAPI.collectDashboardMetricNames(
781
- dashboard.dashboardViewConfig,
782
- ),
490
+ DashboardAPI.collectDashboardMetricNames(publicViewConfig),
783
491
  ).sort(),
784
- dashboardViewConfig: dashboard.dashboardViewConfig
785
- ? JSONFunctions.serialize(dashboard.dashboardViewConfig as any)
492
+ dashboardViewConfig: publicViewConfig
493
+ ? JSONFunctions.serialize(publicViewConfig as any)
786
494
  : null,
787
495
  });
788
496
  } catch (err) {
@@ -968,6 +676,9 @@ export default class DashboardAPI extends BaseAPI<
968
676
  throw new NotFoundException("Dashboard not found");
969
677
  }
970
678
 
679
+ const publicViewConfig: DashboardViewConfig | null =
680
+ PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
681
+
971
682
  return Response.sendJsonObjectResponse(req, res, {
972
683
  _id: dashboard._id?.toString() || "",
973
684
  name: dashboard.name || "Dashboard",
@@ -977,8 +688,19 @@ export default class DashboardAPI extends BaseAPI<
977
688
  logoFile: DashboardAPI.getFileAsBase64JSONObject(
978
689
  dashboard.logoFile,
979
690
  ),
980
- dashboardViewConfig: dashboard.dashboardViewConfig
981
- ? JSONFunctions.serialize(dashboard.dashboardViewConfig as any)
691
+ /*
692
+ * External Data Source widgets are stripped: they cannot render
693
+ * for an anonymous viewer, and their config IS the query — raw
694
+ * SQL / PromQL naming internal tables, jobs, and instances.
695
+ *
696
+ * The null stays null. JSONFunctions.serialize(null) returns
697
+ * `{}`, and the public page falls back to a default config only
698
+ * on a FALSY value — an empty object is truthy, so it would sail
699
+ * through and the canvas would read `.components.length` off
700
+ * undefined.
701
+ */
702
+ dashboardViewConfig: publicViewConfig
703
+ ? JSONFunctions.serialize(publicViewConfig as any)
982
704
  : null,
983
705
  });
984
706
  } catch (err) {
@@ -1496,8 +1218,8 @@ export default class DashboardAPI extends BaseAPI<
1496
1218
  * Public resource lists for non-metric dashboard widgets (incident /
1497
1219
  * alert / monitor / trace / log / kubernetes / docker / host lists).
1498
1220
  *
1499
- * Each widget renders a fixed set of columns; the server pins the select
1500
- * to exactly those columns (see PUBLIC_DASHBOARD_RESOURCES) and forces the
1221
+ * Each widget renders a fixed set of columns; the server-owned widget
1222
+ * policy pins the select to exactly those columns and forces the
1501
1223
  * project scope to the dashboard's project, so a public viewer can only
1502
1224
  * read the data the widget was built to show, for this dashboard's
1503
1225
  * project. Authorization reuses DashboardService.hasReadAccess.
@@ -1541,10 +1263,9 @@ export default class DashboardAPI extends BaseAPI<
1541
1263
  req.params["dashboardId"] as string,
1542
1264
  );
1543
1265
 
1544
- const password: string | undefined =
1545
- req.body && (req.body["password"] as string);
1266
+ const password: unknown = req.body && req.body["password"];
1546
1267
 
1547
- if (!password) {
1268
+ if (typeof password !== "string" || !password) {
1548
1269
  throw new BadDataException("Master password is required.");
1549
1270
  }
1550
1271
 
@@ -1556,6 +1277,7 @@ export default class DashboardAPI extends BaseAPI<
1556
1277
  projectId: true,
1557
1278
  enableMasterPassword: true,
1558
1279
  masterPassword: true,
1280
+ masterPasswordSalt: true,
1559
1281
  isPublicDashboard: true,
1560
1282
  },
1561
1283
  props: {
@@ -1579,12 +1301,14 @@ export default class DashboardAPI extends BaseAPI<
1579
1301
  );
1580
1302
  }
1581
1303
 
1582
- const hashedInput: string = await HashedString.hashValue(
1583
- password,
1584
- EncryptionSecret,
1585
- );
1304
+ const isMasterPasswordValid: boolean =
1305
+ await DashboardService.verifyHashedColumnValue({
1306
+ item: dashboard,
1307
+ columnName: "masterPassword",
1308
+ plainValue: password,
1309
+ });
1586
1310
 
1587
- if (hashedInput !== dashboard.masterPassword.toString()) {
1311
+ if (!isMasterPasswordValid) {
1588
1312
  throw new BadDataException(
1589
1313
  DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE,
1590
1314
  );
@@ -1926,119 +1650,130 @@ export default class DashboardAPI extends BaseAPI<
1926
1650
  }
1927
1651
 
1928
1652
  /*
1929
- * Walk a stored dashboard view config and collect every widget type it
1930
- * renders. Used to build an allowlist for the public resource-list
1931
- * endpoint so an anonymous viewer can only read the resources this
1932
- * dashboard was actually built to show — a dashboard with a monitor list
1933
- * on it must not double as a project-wide log or incident reader.
1653
+ * Read only the real, top-level dashboard components. Recursively scanning
1654
+ * arbitrary widget arguments would let a nested object carrying a
1655
+ * `componentType` masquerade as a widget and become an authorization input.
1934
1656
  */
1935
- private static collectDashboardComponentTypes(
1657
+ private static collectDashboardWidgets(
1936
1658
  dashboardViewConfig: unknown,
1937
- ): Set<string> {
1938
- const componentTypes: Set<string> = new Set<string>();
1939
-
1940
- const walk: (node: unknown) => void = (node: unknown): void => {
1941
- if (!node || typeof node !== "object") {
1942
- return;
1943
- }
1944
-
1945
- if (Array.isArray(node)) {
1946
- for (const item of node) {
1947
- walk(item);
1948
- }
1949
- return;
1950
- }
1951
-
1952
- const obj: Record<string, unknown> = node as Record<string, unknown>;
1953
-
1954
- const componentType: unknown = obj["componentType"];
1955
- if (typeof componentType === "string" && componentType.length > 0) {
1956
- componentTypes.add(componentType);
1957
- }
1659
+ ): Array<JSONObject> {
1660
+ if (
1661
+ !dashboardViewConfig ||
1662
+ typeof dashboardViewConfig !== "object" ||
1663
+ Array.isArray(dashboardViewConfig)
1664
+ ) {
1665
+ return [];
1666
+ }
1958
1667
 
1959
- for (const key of Object.keys(obj)) {
1960
- walk(obj[key]);
1961
- }
1962
- };
1668
+ const components: unknown = (
1669
+ dashboardViewConfig as Record<string, unknown>
1670
+ )["components"];
1963
1671
 
1964
- walk(dashboardViewConfig);
1672
+ if (!Array.isArray(components)) {
1673
+ return [];
1674
+ }
1965
1675
 
1966
- return componentTypes;
1676
+ return components.filter((component: unknown): component is JSONObject => {
1677
+ return Boolean(
1678
+ component && typeof component === "object" && !Array.isArray(component),
1679
+ );
1680
+ });
1967
1681
  }
1968
1682
 
1969
- /*
1970
- * Reduce a client-supplied query to the filter keys the widget is allowed
1971
- * to narrow by. Anything else the client sends — a foreign projectId, a
1972
- * filter on a column the widget never renders, an operator on a secret
1973
- * column used as a blind oracle — is dropped rather than merged.
1974
- */
1975
- private static sanitizePublicResourceQuery(data: {
1976
- query: unknown;
1977
- allowedQueryKeys: Array<string>;
1978
- }): JSONObject {
1979
- const { query, allowedQueryKeys } = data;
1683
+ private static readDashboardWidgetComponentId(
1684
+ widget: JSONObject,
1685
+ ): string | null {
1686
+ const componentId: unknown = widget["componentId"];
1980
1687
 
1981
- const sanitized: Record<string, unknown> = {};
1688
+ if (componentId instanceof ObjectID) {
1689
+ return componentId.toString();
1690
+ }
1982
1691
 
1983
- if (!query || typeof query !== "object" || Array.isArray(query)) {
1984
- return sanitized as JSONObject;
1692
+ if (typeof componentId === "string" && componentId.length > 0) {
1693
+ return componentId;
1985
1694
  }
1986
1695
 
1987
- const queryObject: Record<string, unknown> = query as Record<
1988
- string,
1989
- unknown
1990
- >;
1991
-
1992
- for (const key of allowedQueryKeys) {
1993
- if (
1994
- Object.prototype.hasOwnProperty.call(queryObject, key) &&
1995
- queryObject[key] !== undefined
1996
- ) {
1997
- sanitized[key] = queryObject[key];
1696
+ if (
1697
+ componentId &&
1698
+ typeof componentId === "object" &&
1699
+ !Array.isArray(componentId)
1700
+ ) {
1701
+ const value: unknown = (componentId as Record<string, unknown>)["value"];
1702
+
1703
+ if (typeof value === "string" && value.length > 0) {
1704
+ return value;
1998
1705
  }
1999
1706
  }
2000
1707
 
2001
- return sanitized as JSONObject;
1708
+ return null;
2002
1709
  }
2003
1710
 
2004
1711
  /*
2005
- * Reduce a client-supplied sort to the columns the widget already renders
2006
- * (the registry's fixed select). Sorting by a column the viewer cannot see
2007
- * would otherwise order rows by a hidden value and leak it.
1712
+ * Select the exact stored widget whose policy will be executed. A legacy
1713
+ * caller may omit componentId only when there is exactly one matching
1714
+ * widget, so two differently-filtered widgets are never conflated.
2008
1715
  */
2009
- private static sanitizePublicResourceSort(data: {
2010
- sort: unknown;
2011
- select: JSONObject;
1716
+ private static selectPublicResourceWidget(data: {
1717
+ dashboardViewConfig: unknown;
1718
+ config: PublicDashboardResourceConfig;
1719
+ requestedComponentId: unknown;
2012
1720
  }): JSONObject {
2013
- const { sort, select } = data;
1721
+ const matchingWidgets: Array<JSONObject> =
1722
+ DashboardAPI.collectDashboardWidgets(data.dashboardViewConfig).filter(
1723
+ (widget: JSONObject): boolean => {
1724
+ const componentType: unknown = widget["componentType"];
1725
+
1726
+ return (
1727
+ typeof componentType === "string" &&
1728
+ Object.prototype.hasOwnProperty.call(
1729
+ data.config.widgets,
1730
+ componentType,
1731
+ )
1732
+ );
1733
+ },
1734
+ );
1735
+
1736
+ if (matchingWidgets.length === 0) {
1737
+ throw new BadDataException(
1738
+ "This resource is not part of this dashboard.",
1739
+ );
1740
+ }
2014
1741
 
2015
- const sanitized: JSONObject = {};
1742
+ if (
1743
+ data.requestedComponentId === undefined ||
1744
+ data.requestedComponentId === null
1745
+ ) {
1746
+ if (matchingWidgets.length === 1) {
1747
+ return matchingWidgets[0] as JSONObject;
1748
+ }
2016
1749
 
2017
- if (!sort || typeof sort !== "object" || Array.isArray(sort)) {
2018
- return sanitized;
1750
+ throw new BadDataException(
1751
+ "A componentId is required to read this resource from this dashboard.",
1752
+ );
2019
1753
  }
2020
1754
 
2021
- const sortObject: Record<string, unknown> = sort as Record<string, unknown>;
1755
+ if (typeof data.requestedComponentId !== "string") {
1756
+ throw new BadDataException("componentId must be a string UUID.");
1757
+ }
2022
1758
 
2023
- for (const key of Object.keys(sortObject)) {
2024
- // Only scalar columns of the fixed select are sortable.
2025
- if (select[key] !== true) {
2026
- continue;
2027
- }
1759
+ ObjectID.validateUUID(data.requestedComponentId);
2028
1760
 
2029
- const order: unknown = sortObject[key];
1761
+ const selectedWidget: JSONObject | undefined = matchingWidgets.find(
1762
+ (widget: JSONObject): boolean => {
1763
+ return (
1764
+ DashboardAPI.readDashboardWidgetComponentId(widget) ===
1765
+ data.requestedComponentId
1766
+ );
1767
+ },
1768
+ );
2030
1769
 
2031
- if (
2032
- typeof order === "string" &&
2033
- order.toUpperCase() === SortOrder.Descending
2034
- ) {
2035
- sanitized[key] = SortOrder.Descending;
2036
- } else {
2037
- sanitized[key] = SortOrder.Ascending;
2038
- }
1770
+ if (!selectedWidget) {
1771
+ throw new BadDataException(
1772
+ "This resource is not part of this dashboard.",
1773
+ );
2039
1774
  }
2040
1775
 
2041
- return sanitized;
1776
+ return selectedWidget;
2042
1777
  }
2043
1778
 
2044
1779
  /*
@@ -2087,117 +1822,66 @@ export default class DashboardAPI extends BaseAPI<
2087
1822
  throw new NotFoundException("Dashboard not found");
2088
1823
  }
2089
1824
 
2090
- /*
2091
- * Security: the dashboard must actually contain a widget that renders
2092
- * this resource. Without this check, knowing any public dashboard ID
2093
- * would be enough to read every resource type in its project — the
2094
- * dashboard's own widgets are the owner's opt-in, so they are the
2095
- * allowlist.
2096
- */
2097
- const dashboardComponentTypes: Set<string> =
2098
- DashboardAPI.collectDashboardComponentTypes(
2099
- dashboard.dashboardViewConfig,
2100
- );
2101
-
2102
- const presentWidgets: Array<string> = Object.keys(config.widgets).filter(
2103
- (componentType: string) => {
2104
- return dashboardComponentTypes.has(componentType);
2105
- },
2106
- );
2107
-
2108
- if (presentWidgets.length === 0) {
2109
- throw new BadDataException(
2110
- "This resource is not part of this dashboard.",
2111
- );
2112
- }
1825
+ const widget: JSONObject = DashboardAPI.selectPublicResourceWidget({
1826
+ dashboardViewConfig: dashboard.dashboardViewConfig,
1827
+ config,
1828
+ requestedComponentId: req.body ? req.body["componentId"] : undefined,
1829
+ });
2113
1830
 
2114
- const clientQuery: JSONObject =
1831
+ const requestedQuery: JSONObject =
2115
1832
  req.body && req.body["query"]
2116
1833
  ? (JSONFunctions.deserialize(
2117
1834
  req.body["query"] as JSONObject,
2118
1835
  ) as JSONObject)
2119
1836
  : {};
2120
1837
 
2121
- const query: JSONObject = DashboardAPI.sanitizePublicResourceQuery({
2122
- query: clientQuery,
2123
- allowedQueryKeys: config.allowedQueryKeys,
2124
- });
2125
-
2126
- /*
2127
- * Security: pin to the dashboard's project; never trust a client-supplied
2128
- * projectId on a public, unauthenticated endpoint.
2129
- */
2130
- (query as Record<string, unknown>)["projectId"] = dashboard.projectId;
2131
-
2132
- /*
2133
- * Models that pack several resource kinds into one table (Kubernetes,
2134
- * Docker, Podman, Proxmox, Ceph, Swarm) are constrained to the kinds the
2135
- * dashboard's widgets render, so a "volumes" widget cannot be used to
2136
- * list containers. A widget may pick one of those kinds; anything else is
2137
- * rejected, and a request that names no kind gets all of them.
2138
- */
2139
- const allowedKinds: Array<string> = presentWidgets
2140
- .map((componentType: string) => {
2141
- return config.widgets[componentType as DashboardComponentType];
2142
- })
2143
- .filter((kind: string | null | undefined): kind is string => {
2144
- return Boolean(kind);
1838
+ const policy: PublicDashboardResourceListPolicyResult =
1839
+ PublicDashboardResourceListPolicy.build({
1840
+ widget,
1841
+ dashboardViewConfig: dashboard.dashboardViewConfig,
1842
+ requestedVariables: req.body ? req.body["variables"] : undefined,
1843
+ requestedQuery,
2145
1844
  });
2146
1845
 
2147
- if (allowedKinds.length > 0) {
2148
- const requestedKind: unknown = (clientQuery as Record<string, unknown>)[
2149
- "kind"
2150
- ];
2151
-
2152
- if (requestedKind !== undefined && requestedKind !== null) {
2153
- if (
2154
- typeof requestedKind !== "string" ||
2155
- !allowedKinds.includes(requestedKind)
2156
- ) {
2157
- throw new BadDataException(
2158
- "This resource is not part of this dashboard.",
2159
- );
2160
- }
1846
+ const requestedResourceType: string = req.params["resourceType"] as string;
2161
1847
 
2162
- (query as Record<string, unknown>)["kind"] = requestedKind;
2163
- } else if (allowedKinds.length === 1) {
2164
- (query as Record<string, unknown>)["kind"] = allowedKinds[0];
2165
- } else {
2166
- (query as Record<string, unknown>)["kind"] = new Includes(allowedKinds);
2167
- }
1848
+ if (policy.resourceType !== requestedResourceType) {
1849
+ throw new BadDataException(
1850
+ "This resource is not part of this dashboard.",
1851
+ );
2168
1852
  }
2169
1853
 
2170
- const sort: JSONObject = DashboardAPI.sanitizePublicResourceSort({
2171
- sort:
2172
- req.body && req.body["sort"]
2173
- ? JSONFunctions.deserialize(req.body["sort"] as JSONObject)
2174
- : {},
2175
- select: config.select,
2176
- });
1854
+ let query: JSONObject = {
1855
+ ...policy.query,
1856
+ };
2177
1857
 
2178
- const requestedLimit: number = req.query["limit"]
2179
- ? parseInt(req.query["limit"] as string, 10)
2180
- : DEFAULT_DASHBOARD_RESOURCE_LIMIT;
2181
- const limit: number = Math.min(
2182
- Number.isFinite(requestedLimit) && requestedLimit > 0
2183
- ? requestedLimit
2184
- : DEFAULT_DASHBOARD_RESOURCE_LIMIT,
2185
- LIMIT_PER_PROJECT,
2186
- );
1858
+ /*
1859
+ * IncidentService and AlertService normally apply privacy in their
1860
+ * onBeforeFind hooks. The root read below intentionally bypasses those
1861
+ * hooks' user context, so apply the anonymous form explicitly first:
1862
+ * public dashboards may show public rows, never private tenant rows.
1863
+ */
1864
+ if (requestedResourceType === "incident") {
1865
+ query = applyIncidentSelfPrivacyFilter(query, {});
1866
+ } else if (requestedResourceType === "alert") {
1867
+ query = applyAlertSelfPrivacyFilter(query, {});
1868
+ }
2187
1869
 
2188
- const requestedSkip: number = req.query["skip"]
2189
- ? parseInt(req.query["skip"] as string, 10)
2190
- : 0;
2191
- const skip: number =
2192
- Number.isFinite(requestedSkip) && requestedSkip > 0 ? requestedSkip : 0;
1870
+ /*
1871
+ * Project scope is the final query invariant. Neither the request nor a
1872
+ * future policy builder may redirect this root read to another project.
1873
+ * Resource kind, where applicable, comes solely from the selected
1874
+ * widget's policy query.
1875
+ */
1876
+ query["projectId"] = dashboard.projectId;
2193
1877
 
2194
1878
  const list: Array<BaseModel | AnalyticsDataModel> =
2195
1879
  await config.service.findBy({
2196
1880
  query: query,
2197
- select: config.select,
2198
- sort: sort,
2199
- limit: limit,
2200
- skip: skip,
1881
+ select: policy.select,
1882
+ sort: policy.sort,
1883
+ limit: policy.limit,
1884
+ skip: 0,
2201
1885
  props: {
2202
1886
  isRoot: true,
2203
1887
  },