@oneuptime/common 12.0.5 → 12.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/Models/DatabaseModels/AIRun.ts +33 -0
  2. package/Models/DatabaseModels/DataSource.ts +744 -0
  3. package/Models/DatabaseModels/Index.ts +3 -0
  4. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
  5. package/Models/DatabaseModels/User.ts +2 -0
  6. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  7. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  8. package/Models/DatabaseModels/UserSession.ts +2 -0
  9. package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
  10. package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
  11. package/Server/API/AIInsightAPI.ts +47 -4
  12. package/Server/API/AIInvestigationAPI.ts +25 -0
  13. package/Server/API/DashboardAPI.ts +176 -492
  14. package/Server/API/DataSourceAPI.ts +268 -0
  15. package/Server/API/StatusPageAPI.ts +11 -1
  16. package/Server/API/UserAPI.ts +119 -0
  17. package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  22. package/Server/Infrastructure/Queue.ts +26 -0
  23. package/Server/Infrastructure/QueueWorker.ts +17 -0
  24. package/Server/Middleware/TelemetryIngest.ts +8 -3
  25. package/Server/Services/AIInsightService.ts +132 -12
  26. package/Server/Services/AIRunService.ts +34 -0
  27. package/Server/Services/AIService.ts +17 -2
  28. package/Server/Services/AlertService.ts +38 -32
  29. package/Server/Services/AnalyticsDatabaseService.ts +8 -4
  30. package/Server/Services/DataSourceService.ts +200 -0
  31. package/Server/Services/HostService.ts +92 -0
  32. package/Server/Services/IncidentService.ts +45 -0
  33. package/Server/Services/Index.ts +2 -0
  34. package/Server/Services/MonitorService.ts +49 -0
  35. package/Server/Services/MonitorStatusService.ts +166 -0
  36. package/Server/Services/OpenTelemetryIngestService.ts +255 -184
  37. package/Server/Services/RumSessionPinService.ts +7 -21
  38. package/Server/Services/StatusPageSubscriberService.ts +13 -0
  39. package/Server/Services/UserService.ts +280 -9
  40. package/Server/Static/Vendor/README.md +62 -0
  41. package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
  42. package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
  43. package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
  44. package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
  45. package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
  46. package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
  47. package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
  48. package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
  49. package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
  50. package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
  51. package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
  52. package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
  53. package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
  54. package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
  55. package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
  56. package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
  57. package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
  58. package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
  59. package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
  60. package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
  61. package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
  62. package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
  63. package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
  64. package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
  65. package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
  66. package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
  67. package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
  68. package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
  69. package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
  70. package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
  71. package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
  72. package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
  73. package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
  74. package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
  75. package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
  76. package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
  77. package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
  78. package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
  79. package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
  80. package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
  81. package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
  82. package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
  83. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
  84. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
  85. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
  86. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
  87. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
  88. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
  89. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
  90. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
  91. package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
  92. package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
  93. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
  94. package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
  95. package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
  96. package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
  97. package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
  98. package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
  99. package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
  100. package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
  101. package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
  102. package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
  103. package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
  104. package/Server/Utils/DataSource/EgressGuard.ts +446 -0
  105. package/Server/Utils/DataSource/HttpFetch.ts +221 -0
  106. package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
  107. package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
  108. package/Server/Utils/DataSource/Types.ts +93 -0
  109. package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
  110. package/Server/Utils/InProcessMemo.ts +141 -0
  111. package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
  112. package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
  113. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  114. package/Server/Utils/Response.ts +12 -1
  115. package/Server/Utils/SSRFProtection.ts +237 -0
  116. package/Server/Utils/StartServer.ts +8 -0
  117. package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
  118. package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
  119. package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
  120. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
  121. package/Server/Utils/Telemetry/Telemetry.ts +112 -1
  122. package/Server/Utils/Telemetry.ts +104 -3
  123. package/Server/Utils/VendorAssets.ts +165 -0
  124. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
  125. package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
  126. package/Server/Views/Partials/Head.ejs +21 -7
  127. package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
  128. package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
  129. package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
  130. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
  131. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
  132. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
  133. package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
  134. package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
  135. package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
  136. package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
  137. package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
  138. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
  139. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
  140. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
  141. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
  142. package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
  143. package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
  144. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
  145. package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
  146. package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
  147. package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
  148. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
  149. package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
  150. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
  151. package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
  152. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
  153. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
  154. package/Tests/Server/Services/AIInsightService.test.ts +266 -11
  155. package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
  156. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
  157. package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
  158. package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
  159. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
  160. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
  161. package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
  162. package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
  163. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
  165. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
  166. package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
  167. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
  168. package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
  169. package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
  170. package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
  171. package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
  172. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
  173. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
  174. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
  175. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
  176. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
  177. package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
  178. package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
  179. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
  180. package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
  181. package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
  182. package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
  183. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
  184. package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
  185. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
  186. package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
  187. package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
  188. package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
  189. package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
  190. package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
  191. package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
  192. package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
  193. package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
  194. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
  195. package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
  196. package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
  197. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
  198. package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
  199. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
  200. package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
  201. package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
  202. package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
  203. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
  205. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
  206. package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
  207. package/Tests/Server/Utils/Telemetry.test.ts +87 -0
  208. package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
  209. package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
  210. package/Tests/Server/Views/OfflineRender.test.ts +297 -0
  211. package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
  212. package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
  213. package/Tests/Types/Password.test.ts +363 -0
  214. package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
  215. package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
  216. package/Tests/UI/Components/Modal.test.tsx +281 -1
  217. package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
  218. package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
  219. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
  220. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  221. package/Tests/Utils/Analytics.test.ts +23 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
  223. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
  224. package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
  225. package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
  226. package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
  227. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
  228. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
  229. package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
  230. package/Types/AI/AIInsightEvidence.ts +6 -0
  231. package/Types/Analytics/RevenueEvent.ts +31 -0
  232. package/Types/Dashboard/DashboardComponentType.ts +31 -0
  233. package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
  234. package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
  235. package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
  236. package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
  237. package/Types/DataSource/DataSourceLimits.ts +62 -0
  238. package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
  239. package/Types/DataSource/DataSourceTableResult.ts +38 -0
  240. package/Types/DataSource/DataSourceType.ts +213 -0
  241. package/Types/Date.ts +43 -3
  242. package/Types/Password.ts +64 -0
  243. package/Types/Permission.ts +46 -0
  244. package/Types/UserAuthenticationStatus.ts +34 -0
  245. package/UI/Components/Button/Button.tsx +1 -1
  246. package/UI/Components/ErrorBoundary.tsx +459 -108
  247. package/UI/Components/Icon/Icon.tsx +10 -9
  248. package/UI/Components/Modal/ConfirmModal.tsx +6 -1
  249. package/UI/Components/Modal/Modal.tsx +267 -35
  250. package/UI/Components/Modal/ModalFooter.tsx +6 -1
  251. package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
  252. package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
  253. package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
  254. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
  255. package/UI/Components/StatusPage/ResourceList.tsx +570 -0
  256. package/UI/Styles/Theme.css +18 -0
  257. package/UI/Utils/API/RequestOptions.ts +7 -0
  258. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
  259. package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
  260. package/UI/Utils/TestDataSource.ts +61 -0
  261. package/UI/esbuild-config.js +45 -0
  262. package/Utils/Analytics.ts +15 -0
  263. package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
  264. package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
  265. package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
  266. package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
  267. package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
  268. package/Utils/Dashboard/Components/Index.ts +28 -0
  269. package/Utils/DataSource/DataSourceQueryText.ts +94 -0
  270. package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
  271. package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
  272. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
  273. package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
  274. package/Utils/StatusPage/ResourceExplorer.ts +853 -0
  275. package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
  276. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
  278. package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
  279. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  280. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
  282. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/User.js +2 -0
  284. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  286. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  288. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
  290. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
  292. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
  294. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  295. package/build/dist/Server/API/AIInsightAPI.js +34 -4
  296. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  297. package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
  298. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  299. package/build/dist/Server/API/DashboardAPI.js +119 -433
  300. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  301. package/build/dist/Server/API/DataSourceAPI.js +173 -0
  302. package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
  303. package/build/dist/Server/API/StatusPageAPI.js +11 -1
  304. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  305. package/build/dist/Server/API/UserAPI.js +94 -2
  306. package/build/dist/Server/API/UserAPI.js.map +1 -1
  307. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
  308. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  309. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
  310. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
  311. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
  312. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
  313. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
  314. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
  315. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  316. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  317. package/build/dist/Server/Infrastructure/Queue.js +27 -0
  318. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  319. package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
  320. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  321. package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
  322. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  323. package/build/dist/Server/Services/AIInsightService.js +110 -10
  324. package/build/dist/Server/Services/AIInsightService.js.map +1 -1
  325. package/build/dist/Server/Services/AIRunService.js +34 -0
  326. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  327. package/build/dist/Server/Services/AIService.js +16 -2
  328. package/build/dist/Server/Services/AIService.js.map +1 -1
  329. package/build/dist/Server/Services/AlertService.js +28 -35
  330. package/build/dist/Server/Services/AlertService.js.map +1 -1
  331. package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
  332. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  333. package/build/dist/Server/Services/DataSourceService.js +159 -0
  334. package/build/dist/Server/Services/DataSourceService.js.map +1 -0
  335. package/build/dist/Server/Services/HostService.js +74 -0
  336. package/build/dist/Server/Services/HostService.js.map +1 -1
  337. package/build/dist/Server/Services/IncidentService.js +35 -24
  338. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  339. package/build/dist/Server/Services/Index.js +2 -0
  340. package/build/dist/Server/Services/Index.js.map +1 -1
  341. package/build/dist/Server/Services/MonitorService.js +45 -0
  342. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  343. package/build/dist/Server/Services/MonitorStatusService.js +129 -0
  344. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  345. package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
  346. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  347. package/build/dist/Server/Services/RumSessionPinService.js +7 -15
  348. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  349. package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
  350. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  351. package/build/dist/Server/Services/UserService.js +241 -10
  352. package/build/dist/Server/Services/UserService.js.map +1 -1
  353. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
  354. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
  356. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
  358. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
  360. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  361. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
  362. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  363. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
  364. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  365. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
  366. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
  368. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  369. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
  372. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  373. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
  374. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  375. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
  376. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
  377. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
  378. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
  379. package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
  380. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
  381. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
  382. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
  383. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
  384. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
  385. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
  386. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
  387. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
  388. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
  389. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
  390. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
  391. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
  392. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
  393. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
  394. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
  395. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
  396. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
  397. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
  398. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
  399. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
  400. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
  401. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
  402. package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
  403. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
  404. package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
  405. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
  407. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
  408. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
  409. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
  410. package/build/dist/Server/Utils/DataSource/Types.js +2 -0
  411. package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
  412. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
  413. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  414. package/build/dist/Server/Utils/InProcessMemo.js +113 -0
  415. package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
  416. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
  417. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
  418. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
  419. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  420. package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
  421. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  422. package/build/dist/Server/Utils/Response.js +9 -1
  423. package/build/dist/Server/Utils/Response.js.map +1 -1
  424. package/build/dist/Server/Utils/SSRFProtection.js +192 -0
  425. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
  426. package/build/dist/Server/Utils/StartServer.js +7 -0
  427. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  428. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
  429. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  430. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
  431. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  432. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
  433. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
  434. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
  435. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  436. package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
  437. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  438. package/build/dist/Server/Utils/Telemetry.js +93 -6
  439. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  440. package/build/dist/Server/Utils/VendorAssets.js +121 -0
  441. package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
  442. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
  443. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  444. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
  445. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  446. package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
  447. package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
  448. package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
  449. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  450. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
  451. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
  452. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
  453. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
  454. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
  455. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
  456. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
  457. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
  458. package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
  459. package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
  460. package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
  461. package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
  462. package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
  463. package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
  464. package/build/dist/Types/DataSource/DataSourceType.js +183 -0
  465. package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
  466. package/build/dist/Types/Date.js +38 -3
  467. package/build/dist/Types/Date.js.map +1 -1
  468. package/build/dist/Types/Password.js +56 -0
  469. package/build/dist/Types/Password.js.map +1 -0
  470. package/build/dist/Types/Permission.js +42 -0
  471. package/build/dist/Types/Permission.js.map +1 -1
  472. package/build/dist/Types/UserAuthenticationStatus.js +2 -0
  473. package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
  474. package/build/dist/UI/Components/ErrorBoundary.js +388 -72
  475. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  476. package/build/dist/UI/Components/Icon/Icon.js +10 -4
  477. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  478. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  479. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  480. package/build/dist/UI/Components/Modal/Modal.js +178 -19
  481. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  482. package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
  483. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  484. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
  485. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  486. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
  487. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  488. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
  489. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
  490. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
  491. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
  492. package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
  493. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
  494. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
  495. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  496. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
  497. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  498. package/build/dist/UI/Utils/TestDataSource.js +39 -0
  499. package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
  500. package/build/dist/Utils/Analytics.js +4 -0
  501. package/build/dist/Utils/Analytics.js.map +1 -1
  502. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
  503. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
  504. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
  505. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
  506. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
  507. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
  508. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
  509. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
  510. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
  511. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
  512. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  513. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  514. package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
  515. package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
  516. package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
  517. package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
  518. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
  519. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
  520. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
  521. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  522. package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
  523. package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
  524. package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
  525. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
  526. package/jest.config.json +1 -0
  527. package/package.json +5 -1
  528. package/tsconfig.json +12 -10
@@ -0,0 +1,399 @@
1
+ import { DATA_SOURCE_CONNECT_TIMEOUT_IN_MS, DATA_SOURCE_MAX_SERIES, DATA_SOURCE_MAX_TABLE_ROWS, DATA_SOURCE_MAX_TIME_SERIES_ROWS, DATA_SOURCE_QUERY_TIMEOUT_IN_MS, DataSourceLimitsUtil, } from "../../../../Types/DataSource/DataSourceLimits";
2
+ import DataSourceType from "../../../../Types/DataSource/DataSourceType";
3
+ import BadDataException from "../../../../Types/Exception/BadDataException";
4
+ import DataSourceHttpFetch from "../HttpFetch";
5
+ import SqlResultShaper from "../SqlResultShaper";
6
+ const NANOSECONDS_PER_MILLISECOND = BigInt(1000000);
7
+ // Optionally-signed base-10 integer string, the shape BigInt() accepts.
8
+ const INTEGER_STRING_REGEX = /^-?\d+$/;
9
+ /*
10
+ * Exact unix-nanosecond string for a Date. BigInt math keeps every digit:
11
+ * 1699999999999 ms * 1e6 is above 2^53, where float multiplication would
12
+ * round the tail off.
13
+ */
14
+ export function toLokiNanoseconds(date) {
15
+ return (BigInt(date.getTime()) * NANOSECONDS_PER_MILLISECOND).toString();
16
+ }
17
+ /*
18
+ * Parse a Loki nanosecond timestamp (string in stream entries; tolerate a
19
+ * number for robustness). Returns null when unparseable. Strings are kept
20
+ * out of Number() entirely — 19-digit nanosecond epochs do not fit in a
21
+ * float.
22
+ */
23
+ export function parseLokiNanoseconds(raw) {
24
+ if (typeof raw === "number" && Number.isFinite(raw)) {
25
+ return BigInt(Math.trunc(raw));
26
+ }
27
+ if (typeof raw !== "string") {
28
+ return null;
29
+ }
30
+ const trimmed = raw.trim();
31
+ if (!INTEGER_STRING_REGEX.test(trimmed)) {
32
+ return null;
33
+ }
34
+ return BigInt(trimmed);
35
+ }
36
+ /*
37
+ * Nanosecond epoch -> Date (millisecond precision; sub-millisecond digits
38
+ * are truncated). Division happens in BigInt space BEFORE converting to a
39
+ * Number so the millisecond value is exact.
40
+ */
41
+ export function lokiNanosecondsToDate(raw) {
42
+ const nanoseconds = parseLokiNanoseconds(raw);
43
+ if (nanoseconds === null) {
44
+ return null;
45
+ }
46
+ const date = new Date(Number(nanoseconds / NANOSECONDS_PER_MILLISECOND));
47
+ return isNaN(date.getTime()) ? null : date;
48
+ }
49
+ /*
50
+ * Validate the Loki response envelope ({ status: "success", data:
51
+ * { resultType, result } }) and return the data section. Throws
52
+ * operator-actionable BadDataExceptions for every malformed shape.
53
+ */
54
+ export function parseLokiResponseData(bodyJson) {
55
+ if (bodyJson === null ||
56
+ bodyJson === undefined ||
57
+ typeof bodyJson !== "object" ||
58
+ Array.isArray(bodyJson)) {
59
+ throw new BadDataException("Loki did not return a JSON object. Check that the data source URL points at a Grafana Loki endpoint.");
60
+ }
61
+ const body = bodyJson;
62
+ if (body["status"] !== "success") {
63
+ const errorDetail = typeof body["error"] === "string" ? `: ${body["error"]}` : ".";
64
+ throw new BadDataException(`Loki query failed with status "${String(body["status"])}"${errorDetail}`);
65
+ }
66
+ const dataRaw = body["data"];
67
+ if (dataRaw === null ||
68
+ dataRaw === undefined ||
69
+ typeof dataRaw !== "object" ||
70
+ Array.isArray(dataRaw)) {
71
+ throw new BadDataException("Loki response is missing the data object. Check that the data source URL points at a Grafana Loki endpoint.");
72
+ }
73
+ const data = dataRaw;
74
+ const resultType = data["resultType"];
75
+ const result = data["result"];
76
+ if (typeof resultType !== "string" || !Array.isArray(result)) {
77
+ throw new BadDataException("Loki response is missing data.resultType or data.result.");
78
+ }
79
+ return { resultType: resultType, result: result };
80
+ }
81
+ /*
82
+ * Extract string labels from a metric/stream label object, skipping the
83
+ * given keys. Non-object inputs yield an empty label set.
84
+ */
85
+ function extractLabels(raw, excludeKeys) {
86
+ const labels = {};
87
+ if (raw === null ||
88
+ raw === undefined ||
89
+ typeof raw !== "object" ||
90
+ Array.isArray(raw)) {
91
+ return labels;
92
+ }
93
+ const rawRecord = raw;
94
+ for (const key of Object.keys(rawRecord)) {
95
+ if (excludeKeys.includes(key)) {
96
+ continue;
97
+ }
98
+ const value = rawRecord[key];
99
+ if (value === null || value === undefined) {
100
+ continue;
101
+ }
102
+ labels[key] = String(value);
103
+ }
104
+ return labels;
105
+ }
106
+ /*
107
+ * One matrix sample: [unixSeconds (may be fractional), "value"]. Returns
108
+ * null for malformed or unplottable (NaN/Inf) samples so single bad points
109
+ * do not fail the whole chart.
110
+ */
111
+ export function parseLokiMatrixPoint(raw) {
112
+ if (!Array.isArray(raw) || raw.length < 2) {
113
+ return null;
114
+ }
115
+ const timestampRaw = raw[0];
116
+ const valueRaw = raw[1];
117
+ let seconds = null;
118
+ if (typeof timestampRaw === "number" && Number.isFinite(timestampRaw)) {
119
+ seconds = timestampRaw;
120
+ }
121
+ else if (typeof timestampRaw === "string" &&
122
+ timestampRaw.trim() !== "" &&
123
+ Number.isFinite(Number(timestampRaw))) {
124
+ seconds = Number(timestampRaw);
125
+ }
126
+ if (seconds === null || seconds <= 0) {
127
+ return null;
128
+ }
129
+ let value = null;
130
+ if (typeof valueRaw === "number") {
131
+ value = valueRaw;
132
+ }
133
+ else if (typeof valueRaw === "string" && valueRaw.trim() !== "") {
134
+ value = Number(valueRaw);
135
+ }
136
+ if (value === null || !Number.isFinite(value)) {
137
+ return null;
138
+ }
139
+ return { timestamp: new Date(Math.round(seconds * 1000)), value: value };
140
+ }
141
+ /*
142
+ * "matrix" result -> AggregatedResult. Labels (minus __name__) become the
143
+ * per-point `attributes` object the chart layer groups series on; series
144
+ * without labels omit `attributes` entirely (single unnamed series).
145
+ * Applies the series cap and the total-point cap, flagging `truncated`.
146
+ */
147
+ export function lokiMatrixToTimeSeries(result) {
148
+ const data = [];
149
+ let truncated = false;
150
+ let seriesUsed = 0;
151
+ let rowCapHit = false;
152
+ for (const rawSeries of result) {
153
+ if (rawSeries === null ||
154
+ typeof rawSeries !== "object" ||
155
+ Array.isArray(rawSeries)) {
156
+ continue;
157
+ }
158
+ if (seriesUsed >= DATA_SOURCE_MAX_SERIES) {
159
+ truncated = true;
160
+ break;
161
+ }
162
+ seriesUsed += 1;
163
+ const series = rawSeries;
164
+ const labels = extractLabels(series["metric"], [
165
+ "__name__",
166
+ ]);
167
+ const values = series["values"];
168
+ if (!Array.isArray(values)) {
169
+ continue;
170
+ }
171
+ for (const rawPoint of values) {
172
+ const parsed = parseLokiMatrixPoint(rawPoint);
173
+ if (!parsed) {
174
+ continue;
175
+ }
176
+ if (data.length >= DATA_SOURCE_MAX_TIME_SERIES_ROWS) {
177
+ truncated = true;
178
+ rowCapHit = true;
179
+ break;
180
+ }
181
+ const point = {
182
+ timestamp: parsed.timestamp,
183
+ value: parsed.value,
184
+ };
185
+ if (Object.keys(labels).length > 0) {
186
+ point["attributes"] = Object.assign({}, labels);
187
+ }
188
+ data.push(point);
189
+ }
190
+ if (rowCapHit) {
191
+ break;
192
+ }
193
+ }
194
+ return { data: data, truncated: truncated };
195
+ }
196
+ /*
197
+ * "streams" result -> flat table rows { timestamp: Date, line, ...stream
198
+ * labels }, sorted newest-first (interleaved across streams, the way a log
199
+ * table reads). The `timestamp` and `line` cells always hold the entry's
200
+ * real values — stream labels that happen to use those names are dropped
201
+ * rather than allowed to clobber them. Rows are NOT capped here; the caller
202
+ * clamps via SqlResultShaper so cap+1 fetches surface `truncated`.
203
+ */
204
+ export function lokiStreamsToTableRows(result) {
205
+ const entries = [];
206
+ for (const rawStream of result) {
207
+ if (rawStream === null ||
208
+ typeof rawStream !== "object" ||
209
+ Array.isArray(rawStream)) {
210
+ continue;
211
+ }
212
+ const stream = rawStream;
213
+ const labels = extractLabels(stream["stream"], []);
214
+ const values = stream["values"];
215
+ if (!Array.isArray(values)) {
216
+ continue;
217
+ }
218
+ for (const rawEntry of values) {
219
+ if (!Array.isArray(rawEntry) || rawEntry.length < 2) {
220
+ continue;
221
+ }
222
+ const nanoseconds = parseLokiNanoseconds(rawEntry[0]);
223
+ if (nanoseconds === null) {
224
+ continue;
225
+ }
226
+ const timestamp = new Date(Number(nanoseconds / NANOSECONDS_PER_MILLISECOND));
227
+ if (isNaN(timestamp.getTime())) {
228
+ continue;
229
+ }
230
+ const lineRaw = rawEntry[1];
231
+ const row = {
232
+ timestamp: timestamp,
233
+ line: typeof lineRaw === "string" ? lineRaw : String(lineRaw !== null && lineRaw !== void 0 ? lineRaw : ""),
234
+ };
235
+ for (const key of Object.keys(labels)) {
236
+ if (key !== "timestamp" && key !== "line") {
237
+ row[key] = labels[key];
238
+ }
239
+ }
240
+ entries.push({ order: nanoseconds, row: row });
241
+ }
242
+ }
243
+ entries.sort((a, b) => {
244
+ if (a.order === b.order) {
245
+ return 0;
246
+ }
247
+ return a.order < b.order ? 1 : -1;
248
+ });
249
+ return entries.map((entry) => {
250
+ return entry.row;
251
+ });
252
+ }
253
+ /*
254
+ * "matrix" result -> flat table rows { timestamp: Date, value, ...labels }.
255
+ * As with streams, the reserved `timestamp`/`value` cells win over labels
256
+ * with the same name, and capping is left to the caller's SqlResultShaper
257
+ * pass.
258
+ */
259
+ export function lokiMatrixToTableRows(result) {
260
+ const rows = [];
261
+ for (const rawSeries of result) {
262
+ if (rawSeries === null ||
263
+ typeof rawSeries !== "object" ||
264
+ Array.isArray(rawSeries)) {
265
+ continue;
266
+ }
267
+ const series = rawSeries;
268
+ const labels = extractLabels(series["metric"], [
269
+ "__name__",
270
+ ]);
271
+ const values = series["values"];
272
+ if (!Array.isArray(values)) {
273
+ continue;
274
+ }
275
+ for (const rawPoint of values) {
276
+ const parsed = parseLokiMatrixPoint(rawPoint);
277
+ if (!parsed) {
278
+ continue;
279
+ }
280
+ const row = {
281
+ timestamp: parsed.timestamp,
282
+ value: parsed.value,
283
+ };
284
+ for (const key of Object.keys(labels)) {
285
+ if (key !== "timestamp" && key !== "value") {
286
+ row[key] = labels[key];
287
+ }
288
+ }
289
+ rows.push(row);
290
+ }
291
+ }
292
+ return rows;
293
+ }
294
+ export default class LokiConnector {
295
+ /*
296
+ * The optional fetchFunction is a DI seam for tests. The default wrapper
297
+ * resolves DataSourceHttpFetch.fetch at CALL time so jest.spyOn on the
298
+ * static method also intercepts connectors constructed earlier.
299
+ */
300
+ constructor(fetchFunction) {
301
+ this.dataSourceType = DataSourceType.Loki;
302
+ this.fetchFunction =
303
+ fetchFunction ||
304
+ ((request) => {
305
+ return DataSourceHttpFetch.fetch(request);
306
+ });
307
+ }
308
+ getBaseUrl(settings) {
309
+ if (!settings.url || settings.url.trim() === "") {
310
+ throw new BadDataException("Loki data source requires a URL (e.g. http://loki.example.com:3100).");
311
+ }
312
+ return settings.url.trim().replace(/\/+$/, "");
313
+ }
314
+ /*
315
+ * All egress goes through DataSourceHttpFetch, which runs the SSRF egress
316
+ * guard and pins validated addresses before dialing. Errors are
317
+ * sanitized so credentials can never surface in an API response.
318
+ */
319
+ async fetchSanitized(settings, request) {
320
+ try {
321
+ return await this.fetchFunction(request);
322
+ }
323
+ catch (error) {
324
+ throw new BadDataException(SqlResultShaper.sanitizeError(error, SqlResultShaper.collectSecrets(settings)));
325
+ }
326
+ }
327
+ async testConnection(settings) {
328
+ const baseUrl = this.getBaseUrl(settings);
329
+ const endDate = new Date();
330
+ const startDate = new Date(endDate.getTime() - 60 * 60 * 1000);
331
+ const params = new URLSearchParams();
332
+ params.set("start", toLokiNanoseconds(startDate));
333
+ params.set("end", toLokiNanoseconds(endDate));
334
+ const headers = DataSourceHttpFetch.buildAuthHeaders(settings);
335
+ const response = await this.fetchSanitized(settings, {
336
+ method: "GET",
337
+ url: `${baseUrl}/loki/api/v1/labels?${params.toString()}`,
338
+ headers: headers,
339
+ timeoutInMs: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
340
+ });
341
+ const body = response.bodyJson;
342
+ if (body === null ||
343
+ body === undefined ||
344
+ typeof body !== "object" ||
345
+ Array.isArray(body) ||
346
+ body["status"] !== "success") {
347
+ throw new BadDataException('Connected to the host, but it did not respond like a Grafana Loki API (expected { "status": "success" } from /loki/api/v1/labels). Check the URL — it should be the Loki base URL, e.g. http://loki.example.com:3100.');
348
+ }
349
+ }
350
+ async runRangeQuery(settings, query, window, limit) {
351
+ var _a;
352
+ if (!query || query.trim() === "") {
353
+ throw new BadDataException("Query is required.");
354
+ }
355
+ const baseUrl = this.getBaseUrl(settings);
356
+ const stepInSeconds = (_a = window.stepInSeconds) !== null && _a !== void 0 ? _a : DataSourceLimitsUtil.getStepInSeconds(window.startDate, window.endDate);
357
+ const params = new URLSearchParams();
358
+ params.set("query", query);
359
+ params.set("start", toLokiNanoseconds(window.startDate));
360
+ params.set("end", toLokiNanoseconds(window.endDate));
361
+ params.set("step", `${stepInSeconds}s`);
362
+ params.set("limit", limit.toString());
363
+ const headers = DataSourceHttpFetch.buildAuthHeaders(settings);
364
+ const response = await this.fetchSanitized(settings, {
365
+ method: "GET",
366
+ url: `${baseUrl}/loki/api/v1/query_range?${params.toString()}`,
367
+ headers: headers,
368
+ timeoutInMs: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
369
+ });
370
+ return parseLokiResponseData(response.bodyJson);
371
+ }
372
+ async queryTimeSeries(settings, query, window) {
373
+ const data = await this.runRangeQuery(settings, query, window, DATA_SOURCE_MAX_TIME_SERIES_ROWS + 1);
374
+ if (data.resultType === "streams") {
375
+ throw new BadDataException('This LogQL query returns raw log streams, which cannot be charted. Wrap it in a LogQL metric function such as rate() or count_over_time() — e.g. sum(rate({app="api"} [5m])) — or use the Table widget to view the log lines.');
376
+ }
377
+ if (data.resultType !== "matrix") {
378
+ throw new BadDataException(`Loki returned an unexpected result type "${data.resultType}" for a range query. Charts require a LogQL metric query that produces a matrix result.`);
379
+ }
380
+ return lokiMatrixToTimeSeries(data.result);
381
+ }
382
+ async queryTable(settings, query, window) {
383
+ const data = await this.runRangeQuery(settings, query, window, DATA_SOURCE_MAX_TABLE_ROWS + 1);
384
+ let rows;
385
+ if (data.resultType === "streams") {
386
+ rows = lokiStreamsToTableRows(data.result);
387
+ }
388
+ else if (data.resultType === "matrix") {
389
+ rows = lokiMatrixToTableRows(data.result);
390
+ }
391
+ else {
392
+ throw new BadDataException(`Loki returned an unexpected result type "${data.resultType}" for a range query. Expected "streams" (raw logs) or "matrix" (metric query).`);
393
+ }
394
+ return SqlResultShaper.rowsToTable(rows, {
395
+ maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
396
+ });
397
+ }
398
+ }
399
+ //# sourceMappingURL=LokiConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LokiConnector.js","sourceRoot":"","sources":["../../../../../../Server/Utils/DataSource/Connectors/LokiConnector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ import { createConnection, } from "mysql2/promise";
2
+ import { DATA_SOURCE_CONNECT_TIMEOUT_IN_MS, DATA_SOURCE_MAX_TABLE_ROWS, DATA_SOURCE_MAX_TIME_SERIES_ROWS, DATA_SOURCE_QUERY_TIMEOUT_IN_MS, } from "../../../../Types/DataSource/DataSourceLimits";
3
+ import DataSourceType from "../../../../Types/DataSource/DataSourceType";
4
+ import BadDataException from "../../../../Types/Exception/BadDataException";
5
+ import DataSourceEgressGuard from "../EgressGuard";
6
+ import SqlQueryGuard from "../SqlQueryGuard";
7
+ import SqlResultShaper from "../SqlResultShaper";
8
+ const defaultConnectionFactory = async (options) => {
9
+ const connection = await createConnection(options);
10
+ return {
11
+ query: async (sql) => {
12
+ const result = (await connection.query(sql));
13
+ return result;
14
+ },
15
+ end: () => {
16
+ return connection.end();
17
+ },
18
+ destroy: () => {
19
+ connection.destroy();
20
+ },
21
+ };
22
+ };
23
+ export default class MySqlConnector {
24
+ constructor(connectionFactory) {
25
+ this.dataSourceType = DataSourceType.MySQL;
26
+ this.connectionFactory = connectionFactory || defaultConnectionFactory;
27
+ }
28
+ async testConnection(settings) {
29
+ const connection = await this.connect(settings);
30
+ try {
31
+ await connection.query("SELECT 1");
32
+ }
33
+ catch (error) {
34
+ throw new BadDataException(SqlResultShaper.sanitizeError(error, this.getSecrets(settings)));
35
+ }
36
+ finally {
37
+ await this.closeConnection(connection);
38
+ }
39
+ }
40
+ async queryTimeSeries(settings, query, window) {
41
+ const rows = await this.runReadOnlyQuery(settings, query, window, DATA_SOURCE_MAX_TIME_SERIES_ROWS);
42
+ return SqlResultShaper.rowsToTimeSeries(rows, {
43
+ maxRows: DATA_SOURCE_MAX_TIME_SERIES_ROWS,
44
+ });
45
+ }
46
+ async queryTable(settings, query, window) {
47
+ const rows = await this.runReadOnlyQuery(settings, query, window, DATA_SOURCE_MAX_TABLE_ROWS);
48
+ return SqlResultShaper.rowsToTable(rows, {
49
+ maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
50
+ });
51
+ }
52
+ getSecrets(settings) {
53
+ return [
54
+ settings.password,
55
+ settings.apiToken,
56
+ settings.databaseHost,
57
+ settings.username,
58
+ ];
59
+ }
60
+ buildConnectionOptions(settings) {
61
+ var _a, _b, _c;
62
+ const options = {
63
+ host: settings.databaseHost,
64
+ port: (_a = settings.databasePort) !== null && _a !== void 0 ? _a : 3306,
65
+ connectTimeout: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
66
+ /*
67
+ * NEVER true: stacked statements ("SELECT 1; DROP TABLE x") must be
68
+ * impossible at the driver level, as defense in depth beneath the
69
+ * SqlQueryGuard classifier and the read-only transaction.
70
+ */
71
+ multipleStatements: false,
72
+ };
73
+ if (settings.databaseName !== undefined) {
74
+ options.database = settings.databaseName;
75
+ }
76
+ if (settings.username !== undefined) {
77
+ options.user = settings.username;
78
+ }
79
+ if (settings.password !== undefined) {
80
+ options.password = settings.password;
81
+ }
82
+ if (((_b = settings.additionalOptions) === null || _b === void 0 ? void 0 : _b["sslEnabled"]) === true) {
83
+ /*
84
+ * Certificate verification stays ON by default; only an explicit
85
+ * sslRejectUnauthorized === false disables it.
86
+ */
87
+ options.ssl = {
88
+ rejectUnauthorized: ((_c = settings.additionalOptions) === null || _c === void 0 ? void 0 : _c["sslRejectUnauthorized"]) !== false,
89
+ };
90
+ }
91
+ return options;
92
+ }
93
+ /*
94
+ * Egress-validate the host, then open a driver connection. Called only
95
+ * after the query (when there is one) has already passed the read-only
96
+ * guard, so a rejected query never even dials the server.
97
+ */
98
+ async connect(settings) {
99
+ if (!settings.databaseHost) {
100
+ throw new BadDataException("MySQL data source is missing a database host. Set the host in the data source settings.");
101
+ }
102
+ /*
103
+ * SSRF guard — must pass BEFORE any socket is opened towards the
104
+ * configured host.
105
+ */
106
+ await DataSourceEgressGuard.assertHostnameAllowed(settings.databaseHost);
107
+ const options = this.buildConnectionOptions(settings);
108
+ try {
109
+ return await this.connectionFactory(options);
110
+ }
111
+ catch (error) {
112
+ throw new BadDataException(SqlResultShaper.sanitizeError(error, this.getSecrets(settings)));
113
+ }
114
+ }
115
+ /*
116
+ * Teardown: roll the read-only transaction back (harmless when none is
117
+ * open), then close. Every step is guarded — a wedged server must not
118
+ * turn cleanup into an unhandled rejection — with destroy() as the
119
+ * hard fallback when a graceful end() fails.
120
+ */
121
+ async closeConnection(connection) {
122
+ try {
123
+ await connection.query("ROLLBACK");
124
+ }
125
+ catch (_a) {
126
+ /* Best effort — the transaction may already be gone. */
127
+ }
128
+ try {
129
+ await connection.end();
130
+ }
131
+ catch (_b) {
132
+ try {
133
+ connection.destroy();
134
+ }
135
+ catch (_c) {
136
+ /* Best effort — the socket may already be gone. */
137
+ }
138
+ }
139
+ }
140
+ async runReadOnlyQuery(settings, query, window, maxRows) {
141
+ const withMacros = SqlQueryGuard.applyTimeMacros(query, window.startDate, window.endDate);
142
+ /*
143
+ * The read-only classifier runs on the USER's query only. The session
144
+ * SET statements issued below are our own fixed strings and never pass
145
+ * through this guard — the guard's ban on the SET keyword applies to
146
+ * user queries, not to the connector's session setup.
147
+ */
148
+ SqlQueryGuard.assertReadOnlyQuery(withMacros);
149
+ /* Drop a trailing semicolon; the statement runs bare. */
150
+ const finalSql = withMacros.replace(/;\s*$/, "");
151
+ const connection = await this.connect(settings);
152
+ try {
153
+ /*
154
+ * Best-effort server-side statement timeout. MAX_EXECUTION_TIME
155
+ * (milliseconds, SELECT-only) exists on MySQL 5.7.8+; MariaDB uses
156
+ * max_statement_time in seconds instead, so this statement can fail
157
+ * there — swallow the error and rely on the engine defaults rather
158
+ * than failing the query.
159
+ */
160
+ try {
161
+ await connection.query(`SET SESSION MAX_EXECUTION_TIME = ${DATA_SOURCE_QUERY_TIMEOUT_IN_MS}`);
162
+ }
163
+ catch (_a) {
164
+ /* Non-fatal — variable unknown on MariaDB and older MySQL. */
165
+ }
166
+ /*
167
+ * Server-side row bound at cap+1 so the shaper can detect truncation.
168
+ * An explicit LIMIT in the user's query takes precedence over
169
+ * SQL_SELECT_LIMIT; the shaper's maxRows clamp is the authoritative
170
+ * cap either way.
171
+ */
172
+ await connection.query(`SET SESSION SQL_SELECT_LIMIT = ${maxRows + 1}`);
173
+ /*
174
+ * Server-enforced read-only guarantee, independent of the query text
175
+ * classifier.
176
+ */
177
+ await connection.query("START TRANSACTION READ ONLY");
178
+ const result = await connection.query(finalSql);
179
+ const rows = result[0];
180
+ return Array.isArray(rows)
181
+ ? rows
182
+ : [];
183
+ }
184
+ catch (error) {
185
+ if (error instanceof BadDataException) {
186
+ throw error;
187
+ }
188
+ throw new BadDataException(SqlResultShaper.sanitizeError(error, this.getSecrets(settings)));
189
+ }
190
+ finally {
191
+ await this.closeConnection(connection);
192
+ }
193
+ }
194
+ }
195
+ //# sourceMappingURL=MySqlConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MySqlConnector.js","sourceRoot":"","sources":["../../../../../../Server/Utils/DataSource/Connectors/MySqlConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GAEjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC1B,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,+CAA+C,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,gBAAgB,MAAM,8CAA8C,CAAC;AAC5E,OAAO,qBAAqB,MAAM,gBAAgB,CAAC;AACnD,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,eAAe,MAAM,oBAAoB,CAAC;AAkCjD,MAAM,wBAAwB,GAA2B,KAAK,EAC5D,OAA0B,EACI,EAAE;IAChC,MAAM,UAAU,GAAe,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO;QACL,KAAK,EAAE,KAAK,EAAE,GAAW,EAA+B,EAAE;YACxD,MAAM,MAAM,GAAuB,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAG9D,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,GAAG,EAAE,GAAkB,EAAE;YACvB,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,GAAS,EAAE;YAClB,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,cAAc;IAKjC,YAAmB,iBAA0C;QAJtD,mBAAc,GAAmB,cAAc,CAAC,KAAK,CAAC;QAK3D,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,IAAI,wBAAwB,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,QAAsC;QAEtC,MAAM,UAAU,GAAwB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,gBAAgB,CACxB,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,QAAsC,EACtC,KAAa,EACb,MAA6B;QAE7B,MAAM,IAAI,GAAmC,MAAM,IAAI,CAAC,gBAAgB,CACtE,QAAQ,EACR,KAAK,EACL,MAAM,EACN,gCAAgC,CACjC,CAAC;QACF,OAAO,eAAe,CAAC,gBAAgB,CAAC,IAAI,EAAE;YAC5C,OAAO,EAAE,gCAAgC;SAC1C,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,UAAU,CACrB,QAAsC,EACtC,KAAa,EACb,MAA6B;QAE7B,MAAM,IAAI,GAAmC,MAAM,IAAI,CAAC,gBAAgB,CACtE,QAAQ,EACR,KAAK,EACL,MAAM,EACN,0BAA0B,CAC3B,CAAC;QACF,OAAO,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,0BAA0B;SACpC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAChB,QAAsC;QAEtC,OAAO;YACL,QAAQ,CAAC,QAAQ;YACjB,QAAQ,CAAC,QAAQ;YACjB,QAAQ,CAAC,YAAY;YACrB,QAAQ,CAAC,QAAQ;SAClB,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAC5B,QAAsC;;QAEtC,MAAM,OAAO,GAAsB;YACjC,IAAI,EAAE,QAAQ,CAAC,YAAa;YAC5B,IAAI,EAAE,MAAA,QAAQ,CAAC,YAAY,mCAAI,IAAI;YACnC,cAAc,EAAE,iCAAiC;YACjD;;;;eAIG;YACH,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QAEF,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3C,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACvC,CAAC;QAED,IAAI,CAAA,MAAA,QAAQ,CAAC,iBAAiB,0CAAG,YAAY,CAAC,MAAK,IAAI,EAAE,CAAC;YACxD;;;eAGG;YACH,OAAO,CAAC,GAAG,GAAG;gBACZ,kBAAkB,EAChB,CAAA,MAAA,QAAQ,CAAC,iBAAiB,0CAAG,uBAAuB,CAAC,MAAK,KAAK;aAClE,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,OAAO,CACnB,QAAsC;QAEtC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,IAAI,gBAAgB,CACxB,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QAED;;;WAGG;QACH,MAAM,qBAAqB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAsB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAEzE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,gBAAgB,CACxB,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,eAAe,CAC3B,UAA+B;QAE/B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAAC,WAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;QAAC,WAAM,CAAC;YACP,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YAAC,WAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,QAAsC,EACtC,KAAa,EACb,MAA6B,EAC7B,OAAe;QAEf,MAAM,UAAU,GAAW,aAAa,CAAC,eAAe,CACtD,KAAK,EACL,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,CACf,CAAC;QAEF;;;;;WAKG;QACH,aAAa,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAE9C,yDAAyD;QACzD,MAAM,QAAQ,GAAW,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAwB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErE,IAAI,CAAC;YACH;;;;;;eAMG;YACH,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,KAAK,CACpB,oCAAoC,+BAA+B,EAAE,CACtE,CAAC;YACJ,CAAC;YAAC,WAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YAED;;;;;eAKG;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,kCAAkC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YAExE;;;eAGG;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAuB,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpE,MAAM,IAAI,GAAY,MAAM,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAE,IAAuC;gBAC1C,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAChE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}