@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
@@ -0,0 +1,935 @@
1
+ import { afterEach, describe, expect, test } from "@jest/globals";
2
+ import { ConnectionOptions } from "mysql2/promise";
3
+ import MySqlConnector, {
4
+ MySqlConnectionFactory,
5
+ MySqlConnectionLike,
6
+ } from "../../../../Server/Utils/DataSource/Connectors/MySqlConnector";
7
+ import DataSourceEgressGuard from "../../../../Server/Utils/DataSource/EgressGuard";
8
+ import {
9
+ DataSourceConnectionSettings,
10
+ DataSourceQueryWindow,
11
+ } from "../../../../Server/Utils/DataSource/Types";
12
+ import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
13
+ import {
14
+ DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
15
+ DATA_SOURCE_MAX_TABLE_ROWS,
16
+ DATA_SOURCE_MAX_TIME_SERIES_ROWS,
17
+ DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
18
+ } from "../../../../Types/DataSource/DataSourceLimits";
19
+ import DataSourceTableResult from "../../../../Types/DataSource/DataSourceTableResult";
20
+ import DataSourceType from "../../../../Types/DataSource/DataSourceType";
21
+ import BadDataException from "../../../../Types/Exception/BadDataException";
22
+
23
+ /*
24
+ * Fake mysql2 connection harness. Records every SQL string in order,
25
+ * counts end()/destroy() calls, and lets individual statements be scripted
26
+ * to fail so teardown paths can be exercised.
27
+ */
28
+ interface FakeConnectionScript {
29
+ /* Result tuple element [0] returned for every query (default []). */
30
+ result?: unknown;
31
+ /* Return an Error for a given SQL string to make that statement reject. */
32
+ failOn?: (sql: string) => Error | null;
33
+ endError?: Error;
34
+ destroyError?: Error;
35
+ }
36
+
37
+ interface FakeConnectionHarness {
38
+ connection: MySqlConnectionLike;
39
+ executedQueries: Array<string>;
40
+ state: { endCalls: number; destroyCalls: number };
41
+ }
42
+
43
+ type CreateFakeConnectionFunction = (
44
+ script?: FakeConnectionScript,
45
+ ) => FakeConnectionHarness;
46
+
47
+ const createFakeConnection: CreateFakeConnectionFunction = (
48
+ script?: FakeConnectionScript,
49
+ ): FakeConnectionHarness => {
50
+ const executedQueries: Array<string> = [];
51
+ const state: { endCalls: number; destroyCalls: number } = {
52
+ endCalls: 0,
53
+ destroyCalls: 0,
54
+ };
55
+
56
+ const connection: MySqlConnectionLike = {
57
+ query: (sql: string): Promise<[unknown, unknown]> => {
58
+ executedQueries.push(sql);
59
+ const error: Error | null = script?.failOn ? script.failOn(sql) : null;
60
+ if (error) {
61
+ return Promise.reject(error);
62
+ }
63
+ return Promise.resolve([script?.result ?? [], []] as [unknown, unknown]);
64
+ },
65
+ end: (): Promise<void> => {
66
+ state.endCalls += 1;
67
+ if (script?.endError) {
68
+ return Promise.reject(script.endError);
69
+ }
70
+ return Promise.resolve();
71
+ },
72
+ destroy: (): void => {
73
+ state.destroyCalls += 1;
74
+ if (script?.destroyError) {
75
+ throw script.destroyError;
76
+ }
77
+ },
78
+ };
79
+
80
+ return {
81
+ connection: connection,
82
+ executedQueries: executedQueries,
83
+ state: state,
84
+ };
85
+ };
86
+
87
+ interface FakeFactoryHarness {
88
+ factory: MySqlConnectionFactory;
89
+ calls: Array<ConnectionOptions>;
90
+ }
91
+
92
+ type CreateFactoryFunction = (
93
+ harness: FakeConnectionHarness,
94
+ events?: Array<string>,
95
+ ) => FakeFactoryHarness;
96
+
97
+ const createFactory: CreateFactoryFunction = (
98
+ harness: FakeConnectionHarness,
99
+ events?: Array<string>,
100
+ ): FakeFactoryHarness => {
101
+ const calls: Array<ConnectionOptions> = [];
102
+ const factory: MySqlConnectionFactory = (
103
+ options: ConnectionOptions,
104
+ ): Promise<MySqlConnectionLike> => {
105
+ calls.push(options);
106
+ if (events) {
107
+ events.push("connect");
108
+ }
109
+ return Promise.resolve(harness.connection);
110
+ };
111
+ return { factory: factory, calls: calls };
112
+ };
113
+
114
+ const PASSWORD: string = "sup3r-s3cret-pw";
115
+
116
+ type BuildSettingsFunction = (
117
+ overrides?: Partial<DataSourceConnectionSettings>,
118
+ ) => DataSourceConnectionSettings;
119
+
120
+ const buildSettings: BuildSettingsFunction = (
121
+ overrides?: Partial<DataSourceConnectionSettings>,
122
+ ): DataSourceConnectionSettings => {
123
+ return {
124
+ dataSourceType: DataSourceType.MySQL,
125
+ databaseHost: "db.example.com",
126
+ databasePort: 3307,
127
+ databaseName: "metrics",
128
+ username: "reader",
129
+ password: PASSWORD,
130
+ ...overrides,
131
+ };
132
+ };
133
+
134
+ const WINDOW: DataSourceQueryWindow = {
135
+ startDate: new Date("2025-01-01T00:00:00.000Z"),
136
+ endDate: new Date("2025-01-02T00:00:00.000Z"),
137
+ };
138
+
139
+ type MockEgressAllowedFunction = (events?: Array<string>) => jest.SpyInstance;
140
+
141
+ const mockEgressAllowed: MockEgressAllowedFunction = (
142
+ events?: Array<string>,
143
+ ): jest.SpyInstance => {
144
+ const spy: jest.SpyInstance = jest.spyOn(
145
+ DataSourceEgressGuard,
146
+ "assertHostnameAllowed",
147
+ );
148
+ spy.mockImplementation(() => {
149
+ if (events) {
150
+ events.push("egress");
151
+ }
152
+ return Promise.resolve([{ address: "203.0.113.10", family: 4 }]);
153
+ });
154
+ return spy;
155
+ };
156
+
157
+ afterEach(() => {
158
+ jest.restoreAllMocks();
159
+ });
160
+
161
+ describe("MySqlConnector", () => {
162
+ describe("testConnection", () => {
163
+ test("connects, runs SELECT 1 and closes the connection", async () => {
164
+ const egressSpy: jest.SpyInstance = mockEgressAllowed();
165
+ const harness: FakeConnectionHarness = createFakeConnection();
166
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
167
+ const connector: MySqlConnector = new MySqlConnector(
168
+ factoryHarness.factory,
169
+ );
170
+
171
+ await connector.testConnection(buildSettings());
172
+
173
+ expect(egressSpy).toHaveBeenCalledWith("db.example.com");
174
+ expect(harness.executedQueries).toEqual(["SELECT 1", "ROLLBACK"]);
175
+ expect(harness.state.endCalls).toBe(1);
176
+ expect(harness.state.destroyCalls).toBe(0);
177
+ });
178
+
179
+ test("validates egress before opening a connection", async () => {
180
+ const events: Array<string> = [];
181
+ mockEgressAllowed(events);
182
+ const harness: FakeConnectionHarness = createFakeConnection();
183
+ const factoryHarness: FakeFactoryHarness = createFactory(harness, events);
184
+ const connector: MySqlConnector = new MySqlConnector(
185
+ factoryHarness.factory,
186
+ );
187
+
188
+ await connector.testConnection(buildSettings());
189
+
190
+ expect(events).toEqual(["egress", "connect"]);
191
+ });
192
+
193
+ test("throws without connecting when databaseHost is missing", async () => {
194
+ const egressSpy: jest.SpyInstance = mockEgressAllowed();
195
+ const harness: FakeConnectionHarness = createFakeConnection();
196
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
197
+ const connector: MySqlConnector = new MySqlConnector(
198
+ factoryHarness.factory,
199
+ );
200
+
201
+ await expect(
202
+ connector.testConnection(buildSettings({ databaseHost: undefined })),
203
+ ).rejects.toThrow(BadDataException);
204
+
205
+ expect(egressSpy).not.toHaveBeenCalled();
206
+ expect(factoryHarness.calls).toHaveLength(0);
207
+ });
208
+
209
+ test("propagates an egress guard rejection without connecting", async () => {
210
+ const egressSpy: jest.SpyInstance = jest.spyOn(
211
+ DataSourceEgressGuard,
212
+ "assertHostnameAllowed",
213
+ );
214
+ egressSpy.mockRejectedValue(
215
+ new BadDataException(
216
+ "Data source host 169.254.169.254 is not allowed: link-local address (cloud metadata range).",
217
+ ),
218
+ );
219
+ const harness: FakeConnectionHarness = createFakeConnection();
220
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
221
+ const connector: MySqlConnector = new MySqlConnector(
222
+ factoryHarness.factory,
223
+ );
224
+
225
+ await expect(connector.testConnection(buildSettings())).rejects.toThrow(
226
+ "not allowed",
227
+ );
228
+
229
+ expect(factoryHarness.calls).toHaveLength(0);
230
+ expect(harness.executedQueries).toHaveLength(0);
231
+ });
232
+
233
+ test("sanitizes connection failures so secrets never leak", async () => {
234
+ mockEgressAllowed();
235
+ const factory: MySqlConnectionFactory =
236
+ (): Promise<MySqlConnectionLike> => {
237
+ return Promise.reject(
238
+ new Error(
239
+ `Access denied for user 'reader'@'10.0.0.5' (using password: ${PASSWORD})`,
240
+ ),
241
+ );
242
+ };
243
+ const connector: MySqlConnector = new MySqlConnector(factory);
244
+
245
+ let thrown: Error | null = null;
246
+ try {
247
+ await connector.testConnection(buildSettings());
248
+ } catch (error) {
249
+ thrown = error as Error;
250
+ }
251
+
252
+ expect(thrown).toBeInstanceOf(BadDataException);
253
+ expect(thrown!.message).not.toContain(PASSWORD);
254
+ expect(thrown!.message).toContain("***");
255
+ });
256
+
257
+ test("sanitizes SELECT 1 failures and still closes the connection", async () => {
258
+ mockEgressAllowed();
259
+ const harness: FakeConnectionHarness = createFakeConnection({
260
+ failOn: (sql: string): Error | null => {
261
+ if (sql === "SELECT 1") {
262
+ return new Error(`server exploded for reader:${PASSWORD}`);
263
+ }
264
+ return null;
265
+ },
266
+ });
267
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
268
+ const connector: MySqlConnector = new MySqlConnector(
269
+ factoryHarness.factory,
270
+ );
271
+
272
+ let thrown: Error | null = null;
273
+ try {
274
+ await connector.testConnection(buildSettings());
275
+ } catch (error) {
276
+ thrown = error as Error;
277
+ }
278
+
279
+ expect(thrown).toBeInstanceOf(BadDataException);
280
+ expect(thrown!.message).not.toContain(PASSWORD);
281
+ expect(harness.state.endCalls).toBe(1);
282
+ });
283
+ });
284
+
285
+ describe("connection options", () => {
286
+ test("passes host, port, credentials, timeout and multipleStatements:false to the driver", async () => {
287
+ mockEgressAllowed();
288
+ const harness: FakeConnectionHarness = createFakeConnection();
289
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
290
+ const connector: MySqlConnector = new MySqlConnector(
291
+ factoryHarness.factory,
292
+ );
293
+
294
+ await connector.testConnection(buildSettings());
295
+
296
+ expect(factoryHarness.calls).toHaveLength(1);
297
+ const options: ConnectionOptions = factoryHarness.calls[0]!;
298
+ expect(options.host).toBe("db.example.com");
299
+ expect(options.port).toBe(3307);
300
+ expect(options.database).toBe("metrics");
301
+ expect(options.user).toBe("reader");
302
+ expect(options.password).toBe(PASSWORD);
303
+ expect(options.connectTimeout).toBe(DATA_SOURCE_CONNECT_TIMEOUT_IN_MS);
304
+ expect(options.multipleStatements).toBe(false);
305
+ expect(options.ssl).toBeUndefined();
306
+ });
307
+
308
+ test("defaults the port to 3306 when none is configured", async () => {
309
+ mockEgressAllowed();
310
+ const harness: FakeConnectionHarness = createFakeConnection();
311
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
312
+ const connector: MySqlConnector = new MySqlConnector(
313
+ factoryHarness.factory,
314
+ );
315
+
316
+ await connector.testConnection(
317
+ buildSettings({ databasePort: undefined }),
318
+ );
319
+
320
+ expect(factoryHarness.calls[0]!.port).toBe(3306);
321
+ });
322
+
323
+ test("enables TLS with certificate verification on by default", async () => {
324
+ mockEgressAllowed();
325
+ const harness: FakeConnectionHarness = createFakeConnection();
326
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
327
+ const connector: MySqlConnector = new MySqlConnector(
328
+ factoryHarness.factory,
329
+ );
330
+
331
+ await connector.testConnection(
332
+ buildSettings({ additionalOptions: { sslEnabled: true } }),
333
+ );
334
+
335
+ expect(factoryHarness.calls[0]!.ssl).toEqual({
336
+ rejectUnauthorized: true,
337
+ });
338
+ });
339
+
340
+ test("disables certificate verification only on explicit opt-out", async () => {
341
+ mockEgressAllowed();
342
+ const harness: FakeConnectionHarness = createFakeConnection();
343
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
344
+ const connector: MySqlConnector = new MySqlConnector(
345
+ factoryHarness.factory,
346
+ );
347
+
348
+ await connector.testConnection(
349
+ buildSettings({
350
+ additionalOptions: {
351
+ sslEnabled: true,
352
+ sslRejectUnauthorized: false,
353
+ },
354
+ }),
355
+ );
356
+
357
+ expect(factoryHarness.calls[0]!.ssl).toEqual({
358
+ rejectUnauthorized: false,
359
+ });
360
+ });
361
+ });
362
+
363
+ describe("queryTimeSeries", () => {
364
+ test("runs the session setup, read-only transaction and query in order", async () => {
365
+ mockEgressAllowed();
366
+ const harness: FakeConnectionHarness = createFakeConnection({
367
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 5 }],
368
+ });
369
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
370
+ const connector: MySqlConnector = new MySqlConnector(
371
+ factoryHarness.factory,
372
+ );
373
+
374
+ await connector.queryTimeSeries(
375
+ buildSettings(),
376
+ "SELECT created_at AS time, COUNT(*) AS value FROM orders GROUP BY 1",
377
+ WINDOW,
378
+ );
379
+
380
+ expect(harness.executedQueries).toEqual([
381
+ `SET SESSION MAX_EXECUTION_TIME = ${DATA_SOURCE_QUERY_TIMEOUT_IN_MS}`,
382
+ `SET SESSION SQL_SELECT_LIMIT = ${DATA_SOURCE_MAX_TIME_SERIES_ROWS + 1}`,
383
+ "START TRANSACTION READ ONLY",
384
+ "SELECT created_at AS time, COUNT(*) AS value FROM orders GROUP BY 1",
385
+ "ROLLBACK",
386
+ ]);
387
+ expect(harness.state.endCalls).toBe(1);
388
+ expect(harness.state.destroyCalls).toBe(0);
389
+ });
390
+
391
+ test("validates egress before connecting for queries", async () => {
392
+ const events: Array<string> = [];
393
+ mockEgressAllowed(events);
394
+ const harness: FakeConnectionHarness = createFakeConnection({
395
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 1 }],
396
+ });
397
+ const factoryHarness: FakeFactoryHarness = createFactory(harness, events);
398
+ const connector: MySqlConnector = new MySqlConnector(
399
+ factoryHarness.factory,
400
+ );
401
+
402
+ await connector.queryTimeSeries(
403
+ buildSettings(),
404
+ "SELECT 1 AS time, 2 AS value",
405
+ WINDOW,
406
+ );
407
+
408
+ expect(events).toEqual(["egress", "connect"]);
409
+ });
410
+
411
+ test("applies time macros and strips a trailing semicolon before executing", async () => {
412
+ mockEgressAllowed();
413
+ const harness: FakeConnectionHarness = createFakeConnection({
414
+ result: [],
415
+ });
416
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
417
+ const connector: MySqlConnector = new MySqlConnector(
418
+ factoryHarness.factory,
419
+ );
420
+
421
+ await connector.queryTimeSeries(
422
+ buildSettings(),
423
+ "SELECT t AS time, v AS value FROM m WHERE t BETWEEN $__startTime AND $__endTime AND r = $__rangeSeconds ;",
424
+ WINDOW,
425
+ );
426
+
427
+ const executedUserQuery: string = harness.executedQueries[3]!;
428
+ expect(executedUserQuery).toBe(
429
+ "SELECT t AS time, v AS value FROM m WHERE t BETWEEN '2025-01-01 00:00:00' AND '2025-01-02 00:00:00' AND r = 86400 ",
430
+ );
431
+ });
432
+
433
+ test("rejects write queries before any connection is opened", async () => {
434
+ const egressSpy: jest.SpyInstance = mockEgressAllowed();
435
+ const harness: FakeConnectionHarness = createFakeConnection();
436
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
437
+ const connector: MySqlConnector = new MySqlConnector(
438
+ factoryHarness.factory,
439
+ );
440
+
441
+ await expect(
442
+ connector.queryTimeSeries(
443
+ buildSettings(),
444
+ "DELETE FROM orders",
445
+ WINDOW,
446
+ ),
447
+ ).rejects.toThrow(BadDataException);
448
+
449
+ expect(egressSpy).not.toHaveBeenCalled();
450
+ expect(factoryHarness.calls).toHaveLength(0);
451
+ expect(harness.executedQueries).toHaveLength(0);
452
+ });
453
+
454
+ test("rejects stacked statements before any connection is opened", async () => {
455
+ mockEgressAllowed();
456
+ const harness: FakeConnectionHarness = createFakeConnection();
457
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
458
+ const connector: MySqlConnector = new MySqlConnector(
459
+ factoryHarness.factory,
460
+ );
461
+
462
+ await expect(
463
+ connector.queryTimeSeries(
464
+ buildSettings(),
465
+ "SELECT 1; SELECT 2",
466
+ WINDOW,
467
+ ),
468
+ ).rejects.toThrow("single SQL statement");
469
+
470
+ expect(factoryHarness.calls).toHaveLength(0);
471
+ });
472
+
473
+ test("shapes rows into AggregatedResult with labels under attributes", async () => {
474
+ mockEgressAllowed();
475
+ const harness: FakeConnectionHarness = createFakeConnection({
476
+ result: [
477
+ {
478
+ time: new Date("2025-01-01T10:00:00.000Z"),
479
+ value: 5,
480
+ host: "web-1",
481
+ },
482
+ {
483
+ time: new Date("2025-01-01T10:01:00.000Z"),
484
+ value: 7,
485
+ host: "web-2",
486
+ },
487
+ ],
488
+ });
489
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
490
+ const connector: MySqlConnector = new MySqlConnector(
491
+ factoryHarness.factory,
492
+ );
493
+
494
+ const result: AggregatedResult = await connector.queryTimeSeries(
495
+ buildSettings(),
496
+ "SELECT t AS time, v AS value, host FROM m",
497
+ WINDOW,
498
+ );
499
+
500
+ expect(result.data).toHaveLength(2);
501
+ expect(result.truncated).toBe(false);
502
+ expect(result.data[0]!.timestamp).toEqual(
503
+ new Date("2025-01-01T10:00:00.000Z"),
504
+ );
505
+ expect(result.data[0]!.value).toBe(5);
506
+ expect(result.data[0]!["attributes"]).toEqual({ host: "web-1" });
507
+ expect(result.data[1]!["attributes"]).toEqual({ host: "web-2" });
508
+ });
509
+
510
+ test("omits attributes when the query returns only time and value", async () => {
511
+ mockEgressAllowed();
512
+ const harness: FakeConnectionHarness = createFakeConnection({
513
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 5 }],
514
+ });
515
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
516
+ const connector: MySqlConnector = new MySqlConnector(
517
+ factoryHarness.factory,
518
+ );
519
+
520
+ const result: AggregatedResult = await connector.queryTimeSeries(
521
+ buildSettings(),
522
+ "SELECT t AS time, v AS value FROM m",
523
+ WINDOW,
524
+ );
525
+
526
+ expect(result.data).toHaveLength(1);
527
+ expect(result.data[0]!["attributes"]).toBeUndefined();
528
+ });
529
+
530
+ test("returns an empty result for zero rows", async () => {
531
+ mockEgressAllowed();
532
+ const harness: FakeConnectionHarness = createFakeConnection({
533
+ result: [],
534
+ });
535
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
536
+ const connector: MySqlConnector = new MySqlConnector(
537
+ factoryHarness.factory,
538
+ );
539
+
540
+ const result: AggregatedResult = await connector.queryTimeSeries(
541
+ buildSettings(),
542
+ "SELECT t AS time, v AS value FROM m",
543
+ WINDOW,
544
+ );
545
+
546
+ expect(result).toEqual({ data: [], truncated: false });
547
+ });
548
+
549
+ test("treats a non-array driver result as zero rows", async () => {
550
+ mockEgressAllowed();
551
+ const harness: FakeConnectionHarness = createFakeConnection({
552
+ result: { affectedRows: 0 },
553
+ });
554
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
555
+ const connector: MySqlConnector = new MySqlConnector(
556
+ factoryHarness.factory,
557
+ );
558
+
559
+ const result: AggregatedResult = await connector.queryTimeSeries(
560
+ buildSettings(),
561
+ "SELECT t AS time, v AS value FROM m",
562
+ WINDOW,
563
+ );
564
+
565
+ expect(result).toEqual({ data: [], truncated: false });
566
+ });
567
+
568
+ test("throws an actionable error when no time column is present", async () => {
569
+ mockEgressAllowed();
570
+ const harness: FakeConnectionHarness = createFakeConnection({
571
+ result: [{ foo: 1, value: 2 }],
572
+ });
573
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
574
+ const connector: MySqlConnector = new MySqlConnector(
575
+ factoryHarness.factory,
576
+ );
577
+
578
+ await expect(
579
+ connector.queryTimeSeries(
580
+ buildSettings(),
581
+ "SELECT foo, v AS value FROM m",
582
+ WINDOW,
583
+ ),
584
+ ).rejects.toThrow("time column");
585
+ });
586
+
587
+ test("skips rows with unparseable timestamps instead of failing", async () => {
588
+ mockEgressAllowed();
589
+ const harness: FakeConnectionHarness = createFakeConnection({
590
+ result: [
591
+ { time: "not-a-date", value: 1 },
592
+ { time: new Date("2025-01-01T10:00:00.000Z"), value: 2 },
593
+ ],
594
+ });
595
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
596
+ const connector: MySqlConnector = new MySqlConnector(
597
+ factoryHarness.factory,
598
+ );
599
+
600
+ const result: AggregatedResult = await connector.queryTimeSeries(
601
+ buildSettings(),
602
+ "SELECT t AS time, v AS value FROM m",
603
+ WINDOW,
604
+ );
605
+
606
+ expect(result.data).toHaveLength(1);
607
+ expect(result.data[0]!.value).toBe(2);
608
+ });
609
+
610
+ test("clamps at the time-series cap and flags truncation", async () => {
611
+ mockEgressAllowed();
612
+ const rows: Array<Record<string, unknown>> = [];
613
+ for (
614
+ let index: number = 0;
615
+ index < DATA_SOURCE_MAX_TIME_SERIES_ROWS + 1;
616
+ index++
617
+ ) {
618
+ rows.push({
619
+ time: new Date(WINDOW.startDate.getTime() + index * 1000),
620
+ value: index,
621
+ });
622
+ }
623
+ const harness: FakeConnectionHarness = createFakeConnection({
624
+ result: rows,
625
+ });
626
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
627
+ const connector: MySqlConnector = new MySqlConnector(
628
+ factoryHarness.factory,
629
+ );
630
+
631
+ const result: AggregatedResult = await connector.queryTimeSeries(
632
+ buildSettings(),
633
+ "SELECT t AS time, v AS value FROM m",
634
+ WINDOW,
635
+ );
636
+
637
+ expect(result.data).toHaveLength(DATA_SOURCE_MAX_TIME_SERIES_ROWS);
638
+ expect(result.truncated).toBe(true);
639
+ });
640
+
641
+ test("continues when SET SESSION MAX_EXECUTION_TIME is unsupported (MariaDB)", async () => {
642
+ mockEgressAllowed();
643
+ const harness: FakeConnectionHarness = createFakeConnection({
644
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 1 }],
645
+ failOn: (sql: string): Error | null => {
646
+ if (sql.startsWith("SET SESSION MAX_EXECUTION_TIME")) {
647
+ return new Error("Unknown system variable 'MAX_EXECUTION_TIME'");
648
+ }
649
+ return null;
650
+ },
651
+ });
652
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
653
+ const connector: MySqlConnector = new MySqlConnector(
654
+ factoryHarness.factory,
655
+ );
656
+
657
+ const result: AggregatedResult = await connector.queryTimeSeries(
658
+ buildSettings(),
659
+ "SELECT t AS time, v AS value FROM m",
660
+ WINDOW,
661
+ );
662
+
663
+ expect(result.data).toHaveLength(1);
664
+ expect(harness.executedQueries).toContain(
665
+ `SET SESSION SQL_SELECT_LIMIT = ${DATA_SOURCE_MAX_TIME_SERIES_ROWS + 1}`,
666
+ );
667
+ expect(harness.executedQueries).toContain("START TRANSACTION READ ONLY");
668
+ });
669
+
670
+ test("wraps a failing START TRANSACTION READ ONLY and still tears down", async () => {
671
+ mockEgressAllowed();
672
+ const harness: FakeConnectionHarness = createFakeConnection({
673
+ failOn: (sql: string): Error | null => {
674
+ if (sql === "START TRANSACTION READ ONLY") {
675
+ return new Error(`txn refused for ${PASSWORD}`);
676
+ }
677
+ return null;
678
+ },
679
+ });
680
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
681
+ const connector: MySqlConnector = new MySqlConnector(
682
+ factoryHarness.factory,
683
+ );
684
+
685
+ let thrown: Error | null = null;
686
+ try {
687
+ await connector.queryTimeSeries(
688
+ buildSettings(),
689
+ "SELECT t AS time, v AS value FROM m",
690
+ WINDOW,
691
+ );
692
+ } catch (error) {
693
+ thrown = error as Error;
694
+ }
695
+
696
+ expect(thrown).toBeInstanceOf(BadDataException);
697
+ expect(thrown!.message).not.toContain(PASSWORD);
698
+ expect(harness.executedQueries).toContain("ROLLBACK");
699
+ expect(harness.state.endCalls).toBe(1);
700
+ });
701
+
702
+ test("sanitizes user-query driver errors and rolls back", async () => {
703
+ mockEgressAllowed();
704
+ const harness: FakeConnectionHarness = createFakeConnection({
705
+ failOn: (sql: string): Error | null => {
706
+ if (sql.startsWith("SELECT t AS time")) {
707
+ return new Error(
708
+ `You have an error near 'reader'@'db.example.com', password ${PASSWORD}`,
709
+ );
710
+ }
711
+ return null;
712
+ },
713
+ });
714
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
715
+ const connector: MySqlConnector = new MySqlConnector(
716
+ factoryHarness.factory,
717
+ );
718
+
719
+ let thrown: Error | null = null;
720
+ try {
721
+ await connector.queryTimeSeries(
722
+ buildSettings(),
723
+ "SELECT t AS time, v AS value FROM m",
724
+ WINDOW,
725
+ );
726
+ } catch (error) {
727
+ thrown = error as Error;
728
+ }
729
+
730
+ expect(thrown).toBeInstanceOf(BadDataException);
731
+ expect(thrown!.message).not.toContain(PASSWORD);
732
+ expect(thrown!.message).not.toContain("db.example.com");
733
+ expect(thrown!.message).not.toContain("reader");
734
+ expect(harness.executedQueries).toContain("ROLLBACK");
735
+ expect(harness.state.endCalls).toBe(1);
736
+ });
737
+
738
+ test("falls back to destroy() when end() fails", async () => {
739
+ mockEgressAllowed();
740
+ const harness: FakeConnectionHarness = createFakeConnection({
741
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 1 }],
742
+ endError: new Error("socket already half-closed"),
743
+ });
744
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
745
+ const connector: MySqlConnector = new MySqlConnector(
746
+ factoryHarness.factory,
747
+ );
748
+
749
+ const result: AggregatedResult = await connector.queryTimeSeries(
750
+ buildSettings(),
751
+ "SELECT t AS time, v AS value FROM m",
752
+ WINDOW,
753
+ );
754
+
755
+ expect(result.data).toHaveLength(1);
756
+ expect(harness.state.endCalls).toBe(1);
757
+ expect(harness.state.destroyCalls).toBe(1);
758
+ });
759
+
760
+ test("swallows a destroy() failure after a failed end()", async () => {
761
+ mockEgressAllowed();
762
+ const harness: FakeConnectionHarness = createFakeConnection({
763
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 1 }],
764
+ endError: new Error("end failed"),
765
+ destroyError: new Error("destroy failed"),
766
+ });
767
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
768
+ const connector: MySqlConnector = new MySqlConnector(
769
+ factoryHarness.factory,
770
+ );
771
+
772
+ const result: AggregatedResult = await connector.queryTimeSeries(
773
+ buildSettings(),
774
+ "SELECT t AS time, v AS value FROM m",
775
+ WINDOW,
776
+ );
777
+
778
+ expect(result.data).toHaveLength(1);
779
+ expect(harness.state.destroyCalls).toBe(1);
780
+ });
781
+
782
+ test("swallows a ROLLBACK failure and still closes the connection", async () => {
783
+ mockEgressAllowed();
784
+ const harness: FakeConnectionHarness = createFakeConnection({
785
+ result: [{ time: new Date("2025-01-01T10:00:00.000Z"), value: 1 }],
786
+ failOn: (sql: string): Error | null => {
787
+ if (sql === "ROLLBACK") {
788
+ return new Error("rollback failed");
789
+ }
790
+ return null;
791
+ },
792
+ });
793
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
794
+ const connector: MySqlConnector = new MySqlConnector(
795
+ factoryHarness.factory,
796
+ );
797
+
798
+ const result: AggregatedResult = await connector.queryTimeSeries(
799
+ buildSettings(),
800
+ "SELECT t AS time, v AS value FROM m",
801
+ WINDOW,
802
+ );
803
+
804
+ expect(result.data).toHaveLength(1);
805
+ expect(harness.state.endCalls).toBe(1);
806
+ });
807
+ });
808
+
809
+ describe("queryTable", () => {
810
+ test("uses the table row cap (+1) in SQL_SELECT_LIMIT", async () => {
811
+ mockEgressAllowed();
812
+ const harness: FakeConnectionHarness = createFakeConnection({
813
+ result: [{ id: 1, name: "a" }],
814
+ });
815
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
816
+ const connector: MySqlConnector = new MySqlConnector(
817
+ factoryHarness.factory,
818
+ );
819
+
820
+ await connector.queryTable(
821
+ buildSettings(),
822
+ "SELECT id, name FROM users",
823
+ WINDOW,
824
+ );
825
+
826
+ expect(harness.executedQueries).toContain(
827
+ `SET SESSION SQL_SELECT_LIMIT = ${DATA_SOURCE_MAX_TABLE_ROWS + 1}`,
828
+ );
829
+ });
830
+
831
+ test("shapes rows into columns and JSON-safe cells", async () => {
832
+ mockEgressAllowed();
833
+ const harness: FakeConnectionHarness = createFakeConnection({
834
+ result: [
835
+ {
836
+ id: 1,
837
+ name: "alpha",
838
+ created_at: new Date("2025-01-01T10:00:00.000Z"),
839
+ active: true,
840
+ blob: Buffer.from([1, 2, 3]),
841
+ },
842
+ ],
843
+ });
844
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
845
+ const connector: MySqlConnector = new MySqlConnector(
846
+ factoryHarness.factory,
847
+ );
848
+
849
+ const result: DataSourceTableResult = await connector.queryTable(
850
+ buildSettings(),
851
+ "SELECT id, name, created_at, active, blob FROM users",
852
+ WINDOW,
853
+ );
854
+
855
+ expect(
856
+ result.columns.map((column: { key: string }) => {
857
+ return column.key;
858
+ }),
859
+ ).toEqual(["id", "name", "created_at", "active", "blob"]);
860
+ expect(result.rows).toEqual([
861
+ {
862
+ id: 1,
863
+ name: "alpha",
864
+ created_at: "2025-01-01T10:00:00.000Z",
865
+ active: true,
866
+ blob: "[binary]",
867
+ },
868
+ ]);
869
+ expect(result.truncated).toBe(false);
870
+ });
871
+
872
+ test("returns an empty table for zero rows", async () => {
873
+ mockEgressAllowed();
874
+ const harness: FakeConnectionHarness = createFakeConnection({
875
+ result: [],
876
+ });
877
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
878
+ const connector: MySqlConnector = new MySqlConnector(
879
+ factoryHarness.factory,
880
+ );
881
+
882
+ const result: DataSourceTableResult = await connector.queryTable(
883
+ buildSettings(),
884
+ "SELECT id FROM users",
885
+ WINDOW,
886
+ );
887
+
888
+ expect(result).toEqual({ columns: [], rows: [], truncated: false });
889
+ });
890
+
891
+ test("clamps at the table cap and flags truncation", async () => {
892
+ mockEgressAllowed();
893
+ const rows: Array<Record<string, unknown>> = [];
894
+ for (
895
+ let index: number = 0;
896
+ index < DATA_SOURCE_MAX_TABLE_ROWS + 1;
897
+ index++
898
+ ) {
899
+ rows.push({ id: index });
900
+ }
901
+ const harness: FakeConnectionHarness = createFakeConnection({
902
+ result: rows,
903
+ });
904
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
905
+ const connector: MySqlConnector = new MySqlConnector(
906
+ factoryHarness.factory,
907
+ );
908
+
909
+ const result: DataSourceTableResult = await connector.queryTable(
910
+ buildSettings(),
911
+ "SELECT id FROM users",
912
+ WINDOW,
913
+ );
914
+
915
+ expect(result.rows).toHaveLength(DATA_SOURCE_MAX_TABLE_ROWS);
916
+ expect(result.truncated).toBe(true);
917
+ });
918
+
919
+ test("rejects write queries without connecting", async () => {
920
+ mockEgressAllowed();
921
+ const harness: FakeConnectionHarness = createFakeConnection();
922
+ const factoryHarness: FakeFactoryHarness = createFactory(harness);
923
+ const connector: MySqlConnector = new MySqlConnector(
924
+ factoryHarness.factory,
925
+ );
926
+
927
+ await expect(
928
+ connector.queryTable(buildSettings(), "DROP TABLE users", WINDOW),
929
+ ).rejects.toThrow(BadDataException);
930
+
931
+ expect(factoryHarness.calls).toHaveLength(0);
932
+ expect(harness.executedQueries).toHaveLength(0);
933
+ });
934
+ });
935
+ });