@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,597 @@
1
+ import AggregatedModel from "../../../../Types/BaseDatabase/AggregatedModel";
2
+ import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
3
+ import {
4
+ DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
5
+ DATA_SOURCE_MAX_TABLE_ROWS,
6
+ DATA_SOURCE_MAX_TIME_SERIES_ROWS,
7
+ DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
8
+ } from "../../../../Types/DataSource/DataSourceLimits";
9
+ import DataSourceTableResult from "../../../../Types/DataSource/DataSourceTableResult";
10
+ import DataSourceType from "../../../../Types/DataSource/DataSourceType";
11
+ import BadDataException from "../../../../Types/Exception/BadDataException";
12
+ import { JSONValue } from "../../../../Types/JSON";
13
+ import DataSourceEgressGuard from "../EgressGuard";
14
+ import DataSourceHttpFetch, {
15
+ DataSourceHttpRequest,
16
+ DataSourceHttpResponse,
17
+ } from "../HttpFetch";
18
+ import SqlResultShaper from "../SqlResultShaper";
19
+ import {
20
+ DataSourceConnectionSettings,
21
+ DataSourceConnector,
22
+ DataSourceQueryWindow,
23
+ } from "../Types";
24
+
25
+ /*
26
+ * Generic JSON-over-HTTP connector: fetch JSON from any REST endpoint under
27
+ * the data source's configured base URL and map fields into time series or
28
+ * tables.
29
+ *
30
+ * The widget query text is a JSON "request descriptor":
31
+ *
32
+ * {
33
+ * "path": "/api/stats?from=$__startTimeMs", // default "/"
34
+ * "method": "GET" | "POST", // default "GET"
35
+ * "body": { ... } | "raw string", // POST body
36
+ * "rowsPath": "data.items", // dot path to rows array
37
+ * "timestampField": "time", // time-series only
38
+ * "valueField": "count", // time-series only
39
+ * "seriesField": "service", // optional series label
40
+ * "labelFields": ["region", "env"] // optional extra labels
41
+ * }
42
+ *
43
+ * The path must be relative — requests can never leave the configured base
44
+ * URL — and the final URL is validated through the egress guard before any
45
+ * socket opens.
46
+ */
47
+
48
+ export type RestApiMethod = "GET" | "POST";
49
+
50
+ export interface RestApiRequestDescriptor {
51
+ path: string;
52
+ method: RestApiMethod;
53
+ /*
54
+ * POST body normalized to a string at parse time (objects are
55
+ * JSON-encoded) so time macros can be applied uniformly before sending.
56
+ */
57
+ body?: string | undefined;
58
+ rowsPath?: string | undefined;
59
+ timestampField?: string | undefined;
60
+ valueField?: string | undefined;
61
+ seriesField?: string | undefined;
62
+ labelFields?: Array<string> | undefined;
63
+ }
64
+
65
+ // Test seam: lets tests inject a fake transport instead of the HTTP client.
66
+ export type RestApiFetchFunction = (
67
+ request: DataSourceHttpRequest,
68
+ ) => Promise<DataSourceHttpResponse>;
69
+
70
+ const ABSOLUTE_URL_REGEX: RegExp = /^https?:\/\//i;
71
+
72
+ // Pure base-10 index, for traversing arrays in a rowsPath.
73
+ const ARRAY_INDEX_REGEX: RegExp = /^\d+$/;
74
+
75
+ function describeJsonValue(value: unknown): string {
76
+ if (value === undefined) {
77
+ return "undefined (the field is missing)";
78
+ }
79
+ if (value === null) {
80
+ return "null";
81
+ }
82
+ if (Array.isArray(value)) {
83
+ return "an array";
84
+ }
85
+ if (typeof value === "object") {
86
+ return "an object";
87
+ }
88
+ return `a ${typeof value}`;
89
+ }
90
+
91
+ function readOptionalString(
92
+ descriptor: Record<string, unknown>,
93
+ key: string,
94
+ ): string | undefined {
95
+ const value: unknown = descriptor[key];
96
+ if (value === undefined) {
97
+ return undefined;
98
+ }
99
+ if (typeof value !== "string" || value.trim() === "") {
100
+ throw new BadDataException(
101
+ `Request descriptor field "${key}" must be a non-empty string, but found ${describeJsonValue(
102
+ value,
103
+ )}.`,
104
+ );
105
+ }
106
+ return value;
107
+ }
108
+
109
+ function validatePath(value: unknown): string {
110
+ if (value === undefined) {
111
+ return "/";
112
+ }
113
+ if (typeof value !== "string") {
114
+ throw new BadDataException(
115
+ `Request descriptor field "path" must be a string, but found ${describeJsonValue(
116
+ value,
117
+ )}.`,
118
+ );
119
+ }
120
+ if (ABSOLUTE_URL_REGEX.test(value)) {
121
+ throw new BadDataException(
122
+ 'Request descriptor field "path" must be a relative path on the data source base URL — absolute http(s):// URLs are not allowed.',
123
+ );
124
+ }
125
+ if (!value.startsWith("/")) {
126
+ throw new BadDataException(
127
+ `Request descriptor field "path" must start with "/" (got "${value}").`,
128
+ );
129
+ }
130
+ if (value.startsWith("//")) {
131
+ throw new BadDataException(
132
+ 'Request descriptor field "path" must not start with "//" — protocol-relative URLs are not allowed.',
133
+ );
134
+ }
135
+
136
+ /*
137
+ * Reject ".." path segments (including percent-encoded variants that URL
138
+ * normalization would collapse) so the request cannot climb above the
139
+ * configured base URL's path prefix. Backslashes count as segment
140
+ * separators too: WHATWG URL parsing treats "\" as "/" in http(s) URLs,
141
+ * so "/a\..\x" would otherwise smuggle a ".." past a slash-only split.
142
+ */
143
+ const segments: Array<string> = value
144
+ .replace(/%2e/gi, ".")
145
+ .replace(/%5c/gi, "\\")
146
+ .split(/[/\\?#]/);
147
+ if (segments.includes("..")) {
148
+ throw new BadDataException(
149
+ 'Request descriptor field "path" must not contain ".." segments.',
150
+ );
151
+ }
152
+
153
+ return value;
154
+ }
155
+
156
+ function validateMethod(value: unknown): RestApiMethod {
157
+ if (value === undefined) {
158
+ return "GET";
159
+ }
160
+ if (typeof value !== "string") {
161
+ throw new BadDataException(
162
+ `Request descriptor field "method" must be "GET" or "POST", but found ${describeJsonValue(
163
+ value,
164
+ )}.`,
165
+ );
166
+ }
167
+ const normalized: string = value.toUpperCase();
168
+ if (normalized !== "GET" && normalized !== "POST") {
169
+ throw new BadDataException(
170
+ `Request descriptor field "method" must be "GET" or "POST" (got "${value}").`,
171
+ );
172
+ }
173
+ return normalized as RestApiMethod;
174
+ }
175
+
176
+ function normalizeBody(value: unknown): string | undefined {
177
+ if (value === undefined) {
178
+ return undefined;
179
+ }
180
+ if (typeof value === "string") {
181
+ return value;
182
+ }
183
+ if (value !== null && typeof value === "object") {
184
+ return JSON.stringify(value);
185
+ }
186
+ throw new BadDataException(
187
+ `Request descriptor field "body" must be a JSON object or a string, but found ${describeJsonValue(
188
+ value,
189
+ )}.`,
190
+ );
191
+ }
192
+
193
+ function validateLabelFields(value: unknown): Array<string> | undefined {
194
+ if (value === undefined) {
195
+ return undefined;
196
+ }
197
+ if (!Array.isArray(value)) {
198
+ throw new BadDataException(
199
+ `Request descriptor field "labelFields" must be an array of strings, but found ${describeJsonValue(
200
+ value,
201
+ )}.`,
202
+ );
203
+ }
204
+ const fields: Array<unknown> = value;
205
+ for (const field of fields) {
206
+ if (typeof field !== "string" || field.trim() === "") {
207
+ throw new BadDataException(
208
+ `Request descriptor field "labelFields" must contain only non-empty strings, but found ${describeJsonValue(
209
+ field,
210
+ )}.`,
211
+ );
212
+ }
213
+ }
214
+ return fields as Array<string>;
215
+ }
216
+
217
+ /*
218
+ * Parse and validate the widget query text into a request descriptor.
219
+ * Throws BadDataException with the specific field that is wrong.
220
+ */
221
+ export function parseRequestDescriptor(
222
+ queryText: string,
223
+ ): RestApiRequestDescriptor {
224
+ if (!queryText || queryText.trim() === "") {
225
+ throw new BadDataException(
226
+ 'Query is required. Provide a JSON request descriptor like { "path": "/api/stats", "rowsPath": "data.items" }.',
227
+ );
228
+ }
229
+
230
+ let parsed: unknown = undefined;
231
+ try {
232
+ parsed = JSON.parse(queryText);
233
+ } catch (error) {
234
+ throw new BadDataException(
235
+ `Query must be valid JSON (a request descriptor object): ${
236
+ error instanceof Error ? error.message : String(error)
237
+ }`,
238
+ );
239
+ }
240
+
241
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
242
+ throw new BadDataException(
243
+ `Query must be a JSON object describing the request, but found ${describeJsonValue(
244
+ parsed,
245
+ )}.`,
246
+ );
247
+ }
248
+
249
+ const raw: Record<string, unknown> = parsed as Record<string, unknown>;
250
+
251
+ return {
252
+ path: validatePath(raw["path"]),
253
+ method: validateMethod(raw["method"]),
254
+ body: normalizeBody(raw["body"]),
255
+ rowsPath: readOptionalString(raw, "rowsPath"),
256
+ timestampField: readOptionalString(raw, "timestampField"),
257
+ valueField: readOptionalString(raw, "valueField"),
258
+ seriesField: readOptionalString(raw, "seriesField"),
259
+ labelFields: validateLabelFields(raw["labelFields"]),
260
+ };
261
+ }
262
+
263
+ /*
264
+ * Replace dashboard time macros in the request path or body. Unlike the SQL
265
+ * variant, $__startTime / $__endTime interpolate as raw ISO-8601 strings
266
+ * WITHOUT quotes — in a REST descriptor the macro usually sits inside an
267
+ * already-quoted JSON string or a query parameter. Millisecond macros are
268
+ * replaced first so $__startTime cannot corrupt $__startTimeMs.
269
+ */
270
+ export function applyRestTimeMacros(
271
+ text: string,
272
+ startDate: Date,
273
+ endDate: Date,
274
+ ): string {
275
+ return text
276
+ .replace(/\$__startTimeMs\b/g, startDate.getTime().toString())
277
+ .replace(/\$__endTimeMs\b/g, endDate.getTime().toString())
278
+ .replace(/\$__startTime\b/g, startDate.toISOString())
279
+ .replace(/\$__endTime\b/g, endDate.toISOString());
280
+ }
281
+
282
+ /*
283
+ * Navigate the response payload down a dot path ("data.items") to the rows
284
+ * array. Numeric segments index into arrays. The resolved value must be an
285
+ * array whose every element is a JSON object; anything else throws a
286
+ * BadDataException naming what was actually found.
287
+ */
288
+ export function extractRowsByPath(
289
+ payload: unknown,
290
+ rowsPath: string | undefined,
291
+ ): Array<Record<string, unknown>> {
292
+ const pathLabel: string = rowsPath ? `"${rowsPath}"` : "the response root";
293
+
294
+ let current: unknown = payload;
295
+
296
+ if (rowsPath) {
297
+ const segments: Array<string> = rowsPath.split(".");
298
+ for (const segment of segments) {
299
+ if (segment === "") {
300
+ throw new BadDataException(
301
+ `Request descriptor field "rowsPath" (${rowsPath}) contains an empty segment.`,
302
+ );
303
+ }
304
+ if (Array.isArray(current) && ARRAY_INDEX_REGEX.test(segment)) {
305
+ const list: Array<unknown> = current;
306
+ current = list[Number(segment)];
307
+ continue;
308
+ }
309
+ if (
310
+ current === null ||
311
+ typeof current !== "object" ||
312
+ Array.isArray(current)
313
+ ) {
314
+ throw new BadDataException(
315
+ `Could not read "${segment}" of rowsPath ${pathLabel}: expected an object at that point of the response, but found ${describeJsonValue(
316
+ current,
317
+ )}.`,
318
+ );
319
+ }
320
+ current = (current as Record<string, unknown>)[segment];
321
+ }
322
+ }
323
+
324
+ if (!Array.isArray(current)) {
325
+ throw new BadDataException(
326
+ `Expected ${pathLabel} to be an array of rows, but found ${describeJsonValue(
327
+ current,
328
+ )}. Set "rowsPath" to the dot path of the rows array (for example "data.items").`,
329
+ );
330
+ }
331
+
332
+ const rows: Array<unknown> = current;
333
+ for (let index: number = 0; index < rows.length; index++) {
334
+ const row: unknown = rows[index];
335
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
336
+ throw new BadDataException(
337
+ `Expected every row at ${pathLabel} to be a JSON object, but the row at index ${index} is ${describeJsonValue(
338
+ row,
339
+ )}.`,
340
+ );
341
+ }
342
+ }
343
+
344
+ return rows as Array<Record<string, unknown>>;
345
+ }
346
+
347
+ function joinUrl(baseUrl: string, path: string): string {
348
+ // path always starts with "/" (descriptor validation), base loses its "/".
349
+ const trimmedBase: string = baseUrl.replace(/\/+$/, "");
350
+ return `${trimmedBase}${path}`;
351
+ }
352
+
353
+ export default class RestApiConnector implements DataSourceConnector {
354
+ public dataSourceType: DataSourceType = DataSourceType.RestApi;
355
+
356
+ private fetchFunction: RestApiFetchFunction;
357
+
358
+ public constructor(fetchFunction?: RestApiFetchFunction | undefined) {
359
+ this.fetchFunction =
360
+ fetchFunction ||
361
+ ((request: DataSourceHttpRequest): Promise<DataSourceHttpResponse> => {
362
+ return DataSourceHttpFetch.fetch(request);
363
+ });
364
+ }
365
+
366
+ public async testConnection(
367
+ settings: DataSourceConnectionSettings,
368
+ ): Promise<void> {
369
+ const baseUrl: string = this.getBaseUrl(settings);
370
+
371
+ try {
372
+ await DataSourceEgressGuard.assertUrlAllowed(baseUrl);
373
+
374
+ const response: DataSourceHttpResponse = await this.fetchFunction({
375
+ method: "GET",
376
+ url: baseUrl,
377
+ headers: DataSourceHttpFetch.buildAuthHeaders(settings),
378
+ timeoutInMs: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
379
+ });
380
+
381
+ if (response.statusCode < 200 || response.statusCode >= 300) {
382
+ throw new BadDataException(
383
+ `Data source responded with HTTP ${response.statusCode} — expected a 2xx status. Check the URL and credentials.`,
384
+ );
385
+ }
386
+ } catch (error) {
387
+ throw new BadDataException(this.sanitizeThrownError(error, settings));
388
+ }
389
+ }
390
+
391
+ public async queryTimeSeries(
392
+ settings: DataSourceConnectionSettings,
393
+ query: string,
394
+ window: DataSourceQueryWindow,
395
+ ): Promise<AggregatedResult> {
396
+ const descriptor: RestApiRequestDescriptor = parseRequestDescriptor(query);
397
+
398
+ if (!descriptor.timestampField || !descriptor.valueField) {
399
+ throw new BadDataException(
400
+ 'Time-series REST API queries require "timestampField" and "valueField" in the request descriptor so rows can be mapped to chart points.',
401
+ );
402
+ }
403
+
404
+ const payload: unknown = await this.executeRequest(
405
+ settings,
406
+ descriptor,
407
+ window,
408
+ );
409
+
410
+ const allRows: Array<Record<string, unknown>> = extractRowsByPath(
411
+ payload,
412
+ descriptor.rowsPath,
413
+ );
414
+
415
+ const truncated: boolean =
416
+ allRows.length > DATA_SOURCE_MAX_TIME_SERIES_ROWS;
417
+ const rows: Array<Record<string, unknown>> = truncated
418
+ ? allRows.slice(0, DATA_SOURCE_MAX_TIME_SERIES_ROWS)
419
+ : allRows;
420
+
421
+ const data: Array<AggregatedModel> = [];
422
+
423
+ for (const row of rows) {
424
+ const timestamp: Date | null = SqlResultShaper.coerceTimestamp(
425
+ row[descriptor.timestampField],
426
+ );
427
+ const value: number | null = this.coerceFiniteNumber(
428
+ row[descriptor.valueField],
429
+ );
430
+ if (timestamp === null || value === null) {
431
+ continue; // skip unplottable rows rather than failing the chart.
432
+ }
433
+
434
+ const point: AggregatedModel = { timestamp: timestamp, value: value };
435
+
436
+ const attributes: Record<string, string> | undefined =
437
+ this.buildAttributes(descriptor, row);
438
+ if (attributes) {
439
+ point["attributes"] = attributes;
440
+ }
441
+
442
+ data.push(point);
443
+ }
444
+
445
+ return { data: data, truncated: truncated };
446
+ }
447
+
448
+ public async queryTable(
449
+ settings: DataSourceConnectionSettings,
450
+ query: string,
451
+ window: DataSourceQueryWindow,
452
+ ): Promise<DataSourceTableResult> {
453
+ const descriptor: RestApiRequestDescriptor = parseRequestDescriptor(query);
454
+
455
+ const payload: unknown = await this.executeRequest(
456
+ settings,
457
+ descriptor,
458
+ window,
459
+ );
460
+
461
+ const rows: Array<Record<string, unknown>> = extractRowsByPath(
462
+ payload,
463
+ descriptor.rowsPath,
464
+ );
465
+
466
+ /*
467
+ * Rows go through the shared shaper as-is: nested objects become Json
468
+ * columns via coerceCell rather than being flattened.
469
+ */
470
+ return SqlResultShaper.rowsToTable(rows, {
471
+ maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
472
+ });
473
+ }
474
+
475
+ private async executeRequest(
476
+ settings: DataSourceConnectionSettings,
477
+ descriptor: RestApiRequestDescriptor,
478
+ window: DataSourceQueryWindow,
479
+ ): Promise<unknown> {
480
+ const baseUrl: string = this.getBaseUrl(settings);
481
+
482
+ const path: string = applyRestTimeMacros(
483
+ descriptor.path,
484
+ window.startDate,
485
+ window.endDate,
486
+ );
487
+ const body: string | undefined =
488
+ descriptor.body === undefined
489
+ ? undefined
490
+ : applyRestTimeMacros(
491
+ descriptor.body,
492
+ window.startDate,
493
+ window.endDate,
494
+ );
495
+
496
+ const url: string = joinUrl(baseUrl, path);
497
+
498
+ try {
499
+ /*
500
+ * Guard here as well as inside DataSourceHttpFetch: the fetch seam is
501
+ * injectable, and the connector contract requires egress validation
502
+ * before every connection regardless of transport.
503
+ */
504
+ await DataSourceEgressGuard.assertUrlAllowed(url);
505
+
506
+ const request: DataSourceHttpRequest = {
507
+ method: descriptor.method,
508
+ url: url,
509
+ headers: DataSourceHttpFetch.buildAuthHeaders(settings),
510
+ body: body,
511
+ timeoutInMs: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
512
+ };
513
+
514
+ const response: DataSourceHttpResponse =
515
+ await this.fetchFunction(request);
516
+
517
+ if (response.bodyJson === undefined) {
518
+ throw new BadDataException(
519
+ `Data source did not return JSON (HTTP ${
520
+ response.statusCode
521
+ }). Response starts with: ${response.bodyText.substring(0, 200)}`,
522
+ );
523
+ }
524
+
525
+ return response.bodyJson;
526
+ } catch (error) {
527
+ throw new BadDataException(this.sanitizeThrownError(error, settings));
528
+ }
529
+ }
530
+
531
+ private getBaseUrl(settings: DataSourceConnectionSettings): string {
532
+ if (!settings.url || settings.url.trim() === "") {
533
+ throw new BadDataException(
534
+ "REST API data source has no URL configured. Set the base URL in the data source settings.",
535
+ );
536
+ }
537
+ return settings.url.trim();
538
+ }
539
+
540
+ /*
541
+ * Errors can echo credentials (a debug endpoint reflecting the
542
+ * Authorization header into the response body excerpt, a driver message
543
+ * quoting basic-auth) — redact every secret before the message can reach
544
+ * an API response.
545
+ */
546
+ private sanitizeThrownError(
547
+ error: unknown,
548
+ settings: DataSourceConnectionSettings,
549
+ ): string {
550
+ return SqlResultShaper.sanitizeError(
551
+ error,
552
+ SqlResultShaper.collectSecrets(settings),
553
+ );
554
+ }
555
+
556
+ private coerceFiniteNumber(value: unknown): number | null {
557
+ if (typeof value === "number") {
558
+ return Number.isFinite(value) ? value : null;
559
+ }
560
+ if (typeof value === "bigint") {
561
+ const numeric: number = Number(value);
562
+ return Number.isFinite(numeric) ? numeric : null;
563
+ }
564
+ if (typeof value === "string" && value.trim() !== "") {
565
+ const numeric: number = Number(value);
566
+ return Number.isFinite(numeric) ? numeric : null;
567
+ }
568
+ return null;
569
+ }
570
+
571
+ private buildAttributes(
572
+ descriptor: RestApiRequestDescriptor,
573
+ row: Record<string, unknown>,
574
+ ): Record<string, string> | undefined {
575
+ const attributes: Record<string, string> = {};
576
+ let hasAttributes: boolean = false;
577
+
578
+ if (descriptor.seriesField) {
579
+ attributes["series"] = this.formatLabelValue(row[descriptor.seriesField]);
580
+ hasAttributes = true;
581
+ }
582
+
583
+ if (descriptor.labelFields) {
584
+ for (const field of descriptor.labelFields) {
585
+ attributes[field] = this.formatLabelValue(row[field]);
586
+ hasAttributes = true;
587
+ }
588
+ }
589
+
590
+ return hasAttributes ? attributes : undefined;
591
+ }
592
+
593
+ private formatLabelValue(value: unknown): string {
594
+ const cell: JSONValue = SqlResultShaper.coerceCell(value);
595
+ return cell === null ? "(unset)" : String(cell);
596
+ }
597
+ }