@marinoscar/platform-web 0.0.0-stage → 0.1.0-next.3

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 (356) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +96 -2
  4. package/dist/core/api-client.d.ts +112 -0
  5. package/dist/core/api-client.d.ts.map +1 -0
  6. package/dist/core/api-client.js +24 -0
  7. package/dist/core/api-client.js.map +1 -0
  8. package/dist/core/host.d.ts +74 -0
  9. package/dist/core/host.d.ts.map +1 -0
  10. package/dist/core/host.js +84 -0
  11. package/dist/core/host.js.map +1 -0
  12. package/dist/core/index.d.ts +7 -0
  13. package/dist/core/index.d.ts.map +1 -0
  14. package/dist/core/index.js +5 -0
  15. package/dist/core/index.js.map +1 -0
  16. package/dist/core/settings-page.d.ts +47 -0
  17. package/dist/core/settings-page.d.ts.map +1 -0
  18. package/dist/core/settings-page.js +5 -0
  19. package/dist/core/settings-page.js.map +1 -0
  20. package/dist/core/viewer.d.ts +14 -0
  21. package/dist/core/viewer.d.ts.map +1 -0
  22. package/dist/core/viewer.js +4 -0
  23. package/dist/core/viewer.js.map +1 -0
  24. package/dist/doctor/headless/categories.d.ts +31 -0
  25. package/dist/doctor/headless/categories.d.ts.map +1 -0
  26. package/dist/doctor/headless/categories.js +41 -0
  27. package/dist/doctor/headless/categories.js.map +1 -0
  28. package/dist/doctor/headless/client.d.ts +33 -0
  29. package/dist/doctor/headless/client.d.ts.map +1 -0
  30. package/dist/doctor/headless/client.js +31 -0
  31. package/dist/doctor/headless/client.js.map +1 -0
  32. package/dist/doctor/headless/contract.d.ts +18 -0
  33. package/dist/doctor/headless/contract.d.ts.map +1 -0
  34. package/dist/doctor/headless/contract.js +15 -0
  35. package/dist/doctor/headless/contract.js.map +1 -0
  36. package/dist/doctor/headless/index.d.ts +12 -0
  37. package/dist/doctor/headless/index.d.ts.map +1 -0
  38. package/dist/doctor/headless/index.js +8 -0
  39. package/dist/doctor/headless/index.js.map +1 -0
  40. package/dist/doctor/headless/use-doctor.d.ts +36 -0
  41. package/dist/doctor/headless/use-doctor.d.ts.map +1 -0
  42. package/dist/doctor/headless/use-doctor.js +80 -0
  43. package/dist/doctor/headless/use-doctor.js.map +1 -0
  44. package/dist/doctor/headless/use-support-bundle-download.d.ts +68 -0
  45. package/dist/doctor/headless/use-support-bundle-download.d.ts.map +1 -0
  46. package/dist/doctor/headless/use-support-bundle-download.js +135 -0
  47. package/dist/doctor/headless/use-support-bundle-download.js.map +1 -0
  48. package/dist/doctor/internal/relative-time.d.ts +2 -0
  49. package/dist/doctor/internal/relative-time.d.ts.map +1 -0
  50. package/dist/doctor/internal/relative-time.js +29 -0
  51. package/dist/doctor/internal/relative-time.js.map +1 -0
  52. package/dist/doctor/internal/status-colors.d.ts +5 -0
  53. package/dist/doctor/internal/status-colors.d.ts.map +1 -0
  54. package/dist/doctor/internal/status-colors.js +29 -0
  55. package/dist/doctor/internal/status-colors.js.map +1 -0
  56. package/dist/doctor/internal/use-is-mounted.d.ts +2 -0
  57. package/dist/doctor/internal/use-is-mounted.d.ts.map +1 -0
  58. package/dist/doctor/internal/use-is-mounted.js +15 -0
  59. package/dist/doctor/internal/use-is-mounted.js.map +1 -0
  60. package/dist/doctor/ui/check-row.d.ts +54 -0
  61. package/dist/doctor/ui/check-row.d.ts.map +1 -0
  62. package/dist/doctor/ui/check-row.js +100 -0
  63. package/dist/doctor/ui/check-row.js.map +1 -0
  64. package/dist/doctor/ui/copy.d.ts +3 -0
  65. package/dist/doctor/ui/copy.d.ts.map +1 -0
  66. package/dist/doctor/ui/copy.js +6 -0
  67. package/dist/doctor/ui/copy.js.map +1 -0
  68. package/dist/doctor/ui/doctor-page.d.ts +50 -0
  69. package/dist/doctor/ui/doctor-page.d.ts.map +1 -0
  70. package/dist/doctor/ui/doctor-page.js +152 -0
  71. package/dist/doctor/ui/doctor-page.js.map +1 -0
  72. package/dist/doctor/ui/index.d.ts +8 -0
  73. package/dist/doctor/ui/index.d.ts.map +1 -0
  74. package/dist/doctor/ui/index.js +7 -0
  75. package/dist/doctor/ui/index.js.map +1 -0
  76. package/dist/doctor/ui/settings-page.d.ts +20 -0
  77. package/dist/doctor/ui/settings-page.d.ts.map +1 -0
  78. package/dist/doctor/ui/settings-page.js +32 -0
  79. package/dist/doctor/ui/settings-page.js.map +1 -0
  80. package/dist/doctor/ui/support-bundle-button.d.ts +37 -0
  81. package/dist/doctor/ui/support-bundle-button.d.ts.map +1 -0
  82. package/dist/doctor/ui/support-bundle-button.js +39 -0
  83. package/dist/doctor/ui/support-bundle-button.js.map +1 -0
  84. package/dist/index.d.ts +11 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +11 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts +106 -0
  89. package/dist/telemetry/headless/adapters/TelemetryWebAdapters.d.ts.map +1 -0
  90. package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js +58 -0
  91. package/dist/telemetry/headless/adapters/TelemetryWebAdapters.js.map +1 -0
  92. package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts +43 -0
  93. package/dist/telemetry/headless/context/TelemetryConfigProvider.d.ts.map +1 -0
  94. package/dist/telemetry/headless/context/TelemetryConfigProvider.js +24 -0
  95. package/dist/telemetry/headless/context/TelemetryConfigProvider.js.map +1 -0
  96. package/dist/telemetry/headless/context/telemetryConfig.d.ts +68 -0
  97. package/dist/telemetry/headless/context/telemetryConfig.d.ts.map +1 -0
  98. package/dist/telemetry/headless/context/telemetryConfig.js +119 -0
  99. package/dist/telemetry/headless/context/telemetryConfig.js.map +1 -0
  100. package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts +35 -0
  101. package/dist/telemetry/headless/guards/RequireTelemetryEnabled.d.ts.map +1 -0
  102. package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js +44 -0
  103. package/dist/telemetry/headless/guards/RequireTelemetryEnabled.js.map +1 -0
  104. package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts +40 -0
  105. package/dist/telemetry/headless/hooks/useTelemetryAdmin.d.ts.map +1 -0
  106. package/dist/telemetry/headless/hooks/useTelemetryAdmin.js +111 -0
  107. package/dist/telemetry/headless/hooks/useTelemetryAdmin.js.map +1 -0
  108. package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts +120 -0
  109. package/dist/telemetry/headless/hooks/useTelemetryAssistant.d.ts.map +1 -0
  110. package/dist/telemetry/headless/hooks/useTelemetryAssistant.js +185 -0
  111. package/dist/telemetry/headless/hooks/useTelemetryAssistant.js.map +1 -0
  112. package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts +12 -0
  113. package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.d.ts.map +1 -0
  114. package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js +36 -0
  115. package/dist/telemetry/headless/hooks/useTelemetryAssistantAvailable.js.map +1 -0
  116. package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts +46 -0
  117. package/dist/telemetry/headless/hooks/useTelemetryConnection.d.ts.map +1 -0
  118. package/dist/telemetry/headless/hooks/useTelemetryConnection.js +133 -0
  119. package/dist/telemetry/headless/hooks/useTelemetryConnection.js.map +1 -0
  120. package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +147 -0
  121. package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts.map +1 -0
  122. package/dist/telemetry/headless/hooks/useTelemetryDashboard.js +231 -0
  123. package/dist/telemetry/headless/hooks/useTelemetryDashboard.js.map +1 -0
  124. package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts +95 -0
  125. package/dist/telemetry/headless/hooks/useTelemetryExplorer.d.ts.map +1 -0
  126. package/dist/telemetry/headless/hooks/useTelemetryExplorer.js +197 -0
  127. package/dist/telemetry/headless/hooks/useTelemetryExplorer.js.map +1 -0
  128. package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts +69 -0
  129. package/dist/telemetry/headless/hooks/useTelemetryStack.d.ts.map +1 -0
  130. package/dist/telemetry/headless/hooks/useTelemetryStack.js +129 -0
  131. package/dist/telemetry/headless/hooks/useTelemetryStack.js.map +1 -0
  132. package/dist/telemetry/headless/index.d.ts +34 -0
  133. package/dist/telemetry/headless/index.d.ts.map +1 -0
  134. package/dist/telemetry/headless/index.js +34 -0
  135. package/dist/telemetry/headless/index.js.map +1 -0
  136. package/dist/telemetry/headless/lib/assistantExport.d.ts +12 -0
  137. package/dist/telemetry/headless/lib/assistantExport.d.ts.map +1 -0
  138. package/dist/telemetry/headless/lib/assistantExport.js +116 -0
  139. package/dist/telemetry/headless/lib/assistantExport.js.map +1 -0
  140. package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts +91 -0
  141. package/dist/telemetry/headless/lib/dashboard/assistantPrompt.d.ts.map +1 -0
  142. package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js +246 -0
  143. package/dist/telemetry/headless/lib/dashboard/assistantPrompt.js.map +1 -0
  144. package/dist/telemetry/headless/lib/dashboardState.d.ts +58 -0
  145. package/dist/telemetry/headless/lib/dashboardState.d.ts.map +1 -0
  146. package/dist/telemetry/headless/lib/dashboardState.js +153 -0
  147. package/dist/telemetry/headless/lib/dashboardState.js.map +1 -0
  148. package/dist/telemetry/headless/lib/explorerHandoff.d.ts +62 -0
  149. package/dist/telemetry/headless/lib/explorerHandoff.d.ts.map +1 -0
  150. package/dist/telemetry/headless/lib/explorerHandoff.js +77 -0
  151. package/dist/telemetry/headless/lib/explorerHandoff.js.map +1 -0
  152. package/dist/telemetry/headless/lib/format.d.ts +113 -0
  153. package/dist/telemetry/headless/lib/format.d.ts.map +1 -0
  154. package/dist/telemetry/headless/lib/format.js +280 -0
  155. package/dist/telemetry/headless/lib/format.js.map +1 -0
  156. package/dist/telemetry/headless/lib/metrics/metricSections.d.ts +44 -0
  157. package/dist/telemetry/headless/lib/metrics/metricSections.d.ts.map +1 -0
  158. package/dist/telemetry/headless/lib/metrics/metricSections.js +61 -0
  159. package/dist/telemetry/headless/lib/metrics/metricSections.js.map +1 -0
  160. package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts +15 -0
  161. package/dist/telemetry/headless/lib/metrics/topNPreference.d.ts.map +1 -0
  162. package/dist/telemetry/headless/lib/metrics/topNPreference.js +33 -0
  163. package/dist/telemetry/headless/lib/metrics/topNPreference.js.map +1 -0
  164. package/dist/telemetry/headless/lib/queryHistory.d.ts +20 -0
  165. package/dist/telemetry/headless/lib/queryHistory.d.ts.map +1 -0
  166. package/dist/telemetry/headless/lib/queryHistory.js +53 -0
  167. package/dist/telemetry/headless/lib/queryHistory.js.map +1 -0
  168. package/dist/telemetry/headless/lib/starterQueries.d.ts +48 -0
  169. package/dist/telemetry/headless/lib/starterQueries.d.ts.map +1 -0
  170. package/dist/telemetry/headless/lib/starterQueries.js +84 -0
  171. package/dist/telemetry/headless/lib/starterQueries.js.map +1 -0
  172. package/dist/telemetry/headless/lib/traceLink.d.ts +26 -0
  173. package/dist/telemetry/headless/lib/traceLink.d.ts.map +1 -0
  174. package/dist/telemetry/headless/lib/traceLink.js +32 -0
  175. package/dist/telemetry/headless/lib/traceLink.js.map +1 -0
  176. package/dist/telemetry/headless/lib/unknownRoutes.d.ts +23 -0
  177. package/dist/telemetry/headless/lib/unknownRoutes.d.ts.map +1 -0
  178. package/dist/telemetry/headless/lib/unknownRoutes.js +35 -0
  179. package/dist/telemetry/headless/lib/unknownRoutes.js.map +1 -0
  180. package/dist/telemetry/headless/services/client.d.ts +144 -0
  181. package/dist/telemetry/headless/services/client.d.ts.map +1 -0
  182. package/dist/telemetry/headless/services/client.js +144 -0
  183. package/dist/telemetry/headless/services/client.js.map +1 -0
  184. package/dist/telemetry/headless/services/telemetry.d.ts +483 -0
  185. package/dist/telemetry/headless/services/telemetry.d.ts.map +1 -0
  186. package/dist/telemetry/headless/services/telemetry.js +190 -0
  187. package/dist/telemetry/headless/services/telemetry.js.map +1 -0
  188. package/dist/telemetry/headless/services/telemetryDashboard.d.ts +321 -0
  189. package/dist/telemetry/headless/services/telemetryDashboard.d.ts.map +1 -0
  190. package/dist/telemetry/headless/services/telemetryDashboard.js +103 -0
  191. package/dist/telemetry/headless/services/telemetryDashboard.js.map +1 -0
  192. package/dist/telemetry/internal/useIsMounted.d.ts +9 -0
  193. package/dist/telemetry/internal/useIsMounted.d.ts.map +1 -0
  194. package/dist/telemetry/internal/useIsMounted.js +19 -0
  195. package/dist/telemetry/internal/useIsMounted.js.map +1 -0
  196. package/dist/telemetry/internal/useVisiblePolling.d.ts +55 -0
  197. package/dist/telemetry/internal/useVisiblePolling.d.ts.map +1 -0
  198. package/dist/telemetry/internal/useVisiblePolling.js +96 -0
  199. package/dist/telemetry/internal/useVisiblePolling.js.map +1 -0
  200. package/dist/telemetry/internal/visuallyHidden.d.ts +12 -0
  201. package/dist/telemetry/internal/visuallyHidden.d.ts.map +1 -0
  202. package/dist/telemetry/internal/visuallyHidden.js +15 -0
  203. package/dist/telemetry/internal/visuallyHidden.js.map +1 -0
  204. package/dist/telemetry/theme/augment.d.ts +65 -0
  205. package/dist/telemetry/theme/augment.d.ts.map +1 -0
  206. package/dist/telemetry/theme/augment.js +37 -0
  207. package/dist/telemetry/theme/augment.js.map +1 -0
  208. package/dist/telemetry/theme/telemetryTokens.d.ts +121 -0
  209. package/dist/telemetry/theme/telemetryTokens.d.ts.map +1 -0
  210. package/dist/telemetry/theme/telemetryTokens.js +129 -0
  211. package/dist/telemetry/theme/telemetryTokens.js.map +1 -0
  212. package/dist/telemetry/ui/admin.d.ts +35 -0
  213. package/dist/telemetry/ui/admin.d.ts.map +1 -0
  214. package/dist/telemetry/ui/admin.js +58 -0
  215. package/dist/telemetry/ui/admin.js.map +1 -0
  216. package/dist/telemetry/ui/components/AssistantContainer.d.ts +35 -0
  217. package/dist/telemetry/ui/components/AssistantContainer.d.ts.map +1 -0
  218. package/dist/telemetry/ui/components/AssistantContainer.js +83 -0
  219. package/dist/telemetry/ui/components/AssistantContainer.js.map +1 -0
  220. package/dist/telemetry/ui/components/AssistantPanel.d.ts +22 -0
  221. package/dist/telemetry/ui/components/AssistantPanel.d.ts.map +1 -0
  222. package/dist/telemetry/ui/components/AssistantPanel.js +150 -0
  223. package/dist/telemetry/ui/components/AssistantPanel.js.map +1 -0
  224. package/dist/telemetry/ui/components/AssistantReport.d.ts +13 -0
  225. package/dist/telemetry/ui/components/AssistantReport.d.ts.map +1 -0
  226. package/dist/telemetry/ui/components/AssistantReport.js +89 -0
  227. package/dist/telemetry/ui/components/AssistantReport.js.map +1 -0
  228. package/dist/telemetry/ui/components/AssistantTimeline.d.ts +10 -0
  229. package/dist/telemetry/ui/components/AssistantTimeline.d.ts.map +1 -0
  230. package/dist/telemetry/ui/components/AssistantTimeline.js +84 -0
  231. package/dist/telemetry/ui/components/AssistantTimeline.js.map +1 -0
  232. package/dist/telemetry/ui/components/ResultsGrid.d.ts +10 -0
  233. package/dist/telemetry/ui/components/ResultsGrid.d.ts.map +1 -0
  234. package/dist/telemetry/ui/components/ResultsGrid.js +71 -0
  235. package/dist/telemetry/ui/components/ResultsGrid.js.map +1 -0
  236. package/dist/telemetry/ui/components/SchemaPanel.d.ts +9 -0
  237. package/dist/telemetry/ui/components/SchemaPanel.d.ts.map +1 -0
  238. package/dist/telemetry/ui/components/SchemaPanel.js +42 -0
  239. package/dist/telemetry/ui/components/SchemaPanel.js.map +1 -0
  240. package/dist/telemetry/ui/components/SqlEditor.d.ts +21 -0
  241. package/dist/telemetry/ui/components/SqlEditor.d.ts.map +1 -0
  242. package/dist/telemetry/ui/components/SqlEditor.js +60 -0
  243. package/dist/telemetry/ui/components/SqlEditor.js.map +1 -0
  244. package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts +14 -0
  245. package/dist/telemetry/ui/components/TelemetryConnectionSection.d.ts.map +1 -0
  246. package/dist/telemetry/ui/components/TelemetryConnectionSection.js +243 -0
  247. package/dist/telemetry/ui/components/TelemetryConnectionSection.js.map +1 -0
  248. package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts +12 -0
  249. package/dist/telemetry/ui/components/TelemetryCrossLink.d.ts.map +1 -0
  250. package/dist/telemetry/ui/components/TelemetryCrossLink.js +21 -0
  251. package/dist/telemetry/ui/components/TelemetryCrossLink.js.map +1 -0
  252. package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts +23 -0
  253. package/dist/telemetry/ui/components/TelemetryServicesSection.d.ts.map +1 -0
  254. package/dist/telemetry/ui/components/TelemetryServicesSection.js +138 -0
  255. package/dist/telemetry/ui/components/TelemetryServicesSection.js.map +1 -0
  256. package/dist/telemetry/ui/components/TelemetrySpinner.d.ts +3 -0
  257. package/dist/telemetry/ui/components/TelemetrySpinner.d.ts.map +1 -0
  258. package/dist/telemetry/ui/components/TelemetrySpinner.js +14 -0
  259. package/dist/telemetry/ui/components/TelemetrySpinner.js.map +1 -0
  260. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts +17 -0
  261. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.d.ts.map +1 -0
  262. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js +70 -0
  263. package/dist/telemetry/ui/components/dashboard/ApiTimelineChart.js.map +1 -0
  264. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts +39 -0
  265. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.d.ts.map +1 -0
  266. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js +143 -0
  267. package/dist/telemetry/ui/components/dashboard/DashboardFilterBar.js.map +1 -0
  268. package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts +58 -0
  269. package/dist/telemetry/ui/components/dashboard/DashboardPanel.d.ts.map +1 -0
  270. package/dist/telemetry/ui/components/dashboard/DashboardPanel.js +62 -0
  271. package/dist/telemetry/ui/components/dashboard/DashboardPanel.js.map +1 -0
  272. package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts +21 -0
  273. package/dist/telemetry/ui/components/dashboard/EventsFeed.d.ts.map +1 -0
  274. package/dist/telemetry/ui/components/dashboard/EventsFeed.js +96 -0
  275. package/dist/telemetry/ui/components/dashboard/EventsFeed.js.map +1 -0
  276. package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts +13 -0
  277. package/dist/telemetry/ui/components/dashboard/KpiTiles.d.ts.map +1 -0
  278. package/dist/telemetry/ui/components/dashboard/KpiTiles.js +82 -0
  279. package/dist/telemetry/ui/components/dashboard/KpiTiles.js.map +1 -0
  280. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts +8 -0
  281. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.d.ts.map +1 -0
  282. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js +34 -0
  283. package/dist/telemetry/ui/components/dashboard/LogSeverityChart.js.map +1 -0
  284. package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts +19 -0
  285. package/dist/telemetry/ui/components/dashboard/TopProblems.d.ts.map +1 -0
  286. package/dist/telemetry/ui/components/dashboard/TopProblems.js +61 -0
  287. package/dist/telemetry/ui/components/dashboard/TopProblems.js.map +1 -0
  288. package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts +12 -0
  289. package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.d.ts.map +1 -0
  290. package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js +36 -0
  291. package/dist/telemetry/ui/components/dashboard/UnknownRoutesPanel.js.map +1 -0
  292. package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts +35 -0
  293. package/dist/telemetry/ui/components/dashboard/VerdictBanner.d.ts.map +1 -0
  294. package/dist/telemetry/ui/components/dashboard/VerdictBanner.js +68 -0
  295. package/dist/telemetry/ui/components/dashboard/VerdictBanner.js.map +1 -0
  296. package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts +9 -0
  297. package/dist/telemetry/ui/components/dashboard/ZoomBrush.d.ts.map +1 -0
  298. package/dist/telemetry/ui/components/dashboard/ZoomBrush.js +96 -0
  299. package/dist/telemetry/ui/components/dashboard/ZoomBrush.js.map +1 -0
  300. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +75 -0
  301. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -0
  302. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +247 -0
  303. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -0
  304. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts +19 -0
  305. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.d.ts.map +1 -0
  306. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js +64 -0
  307. package/dist/telemetry/ui/components/dashboard/metrics/MetricSeriesChart.js.map +1 -0
  308. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts +74 -0
  309. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.d.ts.map +1 -0
  310. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js +126 -0
  311. package/dist/telemetry/ui/components/dashboard/metrics/MetricTable.js.map +1 -0
  312. package/dist/telemetry/ui/components/dashboard/severity.d.ts +43 -0
  313. package/dist/telemetry/ui/components/dashboard/severity.d.ts.map +1 -0
  314. package/dist/telemetry/ui/components/dashboard/severity.js +66 -0
  315. package/dist/telemetry/ui/components/dashboard/severity.js.map +1 -0
  316. package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts +11 -0
  317. package/dist/telemetry/ui/components/dashboard/timelineAxis.d.ts.map +1 -0
  318. package/dist/telemetry/ui/components/dashboard/timelineAxis.js +20 -0
  319. package/dist/telemetry/ui/components/dashboard/timelineAxis.js.map +1 -0
  320. package/dist/telemetry/ui/dashboard-page.d.ts +2 -0
  321. package/dist/telemetry/ui/dashboard-page.d.ts.map +1 -0
  322. package/dist/telemetry/ui/dashboard-page.js +6 -0
  323. package/dist/telemetry/ui/dashboard-page.js.map +1 -0
  324. package/dist/telemetry/ui/explorer-page.d.ts +2 -0
  325. package/dist/telemetry/ui/explorer-page.d.ts.map +1 -0
  326. package/dist/telemetry/ui/explorer-page.js +6 -0
  327. package/dist/telemetry/ui/explorer-page.js.map +1 -0
  328. package/dist/telemetry/ui/index.d.ts +6 -0
  329. package/dist/telemetry/ui/index.d.ts.map +1 -0
  330. package/dist/telemetry/ui/index.js +10 -0
  331. package/dist/telemetry/ui/index.js.map +1 -0
  332. package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts +14 -0
  333. package/dist/telemetry/ui/pages/TelemetryDashboardPage.d.ts.map +1 -0
  334. package/dist/telemetry/ui/pages/TelemetryDashboardPage.js +286 -0
  335. package/dist/telemetry/ui/pages/TelemetryDashboardPage.js.map +1 -0
  336. package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts +15 -0
  337. package/dist/telemetry/ui/pages/TelemetryExplorerPage.d.ts.map +1 -0
  338. package/dist/telemetry/ui/pages/TelemetryExplorerPage.js +197 -0
  339. package/dist/telemetry/ui/pages/TelemetryExplorerPage.js.map +1 -0
  340. package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts +28 -0
  341. package/dist/telemetry/ui/pages/TelemetrySettingsPage.d.ts.map +1 -0
  342. package/dist/telemetry/ui/pages/TelemetrySettingsPage.js +278 -0
  343. package/dist/telemetry/ui/pages/TelemetrySettingsPage.js.map +1 -0
  344. package/dist/telemetry/ui/settings-page.d.ts +2 -0
  345. package/dist/telemetry/ui/settings-page.d.ts.map +1 -0
  346. package/dist/telemetry/ui/settings-page.js +6 -0
  347. package/dist/telemetry/ui/settings-page.js.map +1 -0
  348. package/dist/testing/index.d.ts +3 -0
  349. package/dist/testing/index.d.ts.map +1 -0
  350. package/dist/testing/index.js +4 -0
  351. package/dist/testing/index.js.map +1 -0
  352. package/dist/testing/test-platform-host.d.ts +108 -0
  353. package/dist/testing/test-platform-host.d.ts.map +1 -0
  354. package/dist/testing/test-platform-host.js +101 -0
  355. package/dist/testing/test-platform-host.js.map +1 -0
  356. package/package.json +132 -4
@@ -0,0 +1,28 @@
1
+ export declare const RETENTION_PRESETS: readonly [7, 30, 90, 180, 365];
2
+ /** `null` when valid, else the message to show under the field. */
3
+ export declare function validateInteger(value: string, limits: {
4
+ min: number;
5
+ max: number;
6
+ }): string | null;
7
+ /**
8
+ * `null` when valid (blank is valid: it follows the default), else the message
9
+ * to show under the field. Mirrors the API's pattern; the API is the gate.
10
+ */
11
+ export declare function validateInstanceId(value: string): string | null;
12
+ /**
13
+ * The Telemetry settings page (`/admin/settings/telemetry`): collection on or
14
+ * off, retention, query limits, the AI assistant's switch and model, the
15
+ * GreptimeDB connection and the telemetry services. Shown to `telemetry:read`;
16
+ * saving needs `telemetry:write` (the controls are disabled without it), the
17
+ * model picker `ai_config:read`, the services section `system_settings:read`
18
+ * (`system_settings:write` to deploy). NOT behind `RequireTelemetryEnabled`:
19
+ * this is where telemetry is switched on. Reads the app through
20
+ * `PlatformHostProvider` and `TelemetryWebAdaptersProvider`.
21
+ *
22
+ * @returns the page.
23
+ *
24
+ * @extensionPoint component
25
+ * @stability experimental
26
+ */
27
+ export default function TelemetrySettingsPage(): import("react").JSX.Element;
28
+ //# sourceMappingURL=TelemetrySettingsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetrySettingsPage.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/pages/TelemetrySettingsPage.tsx"],"names":[],"mappings":"AAwFA,eAAO,MAAM,iBAAiB,gCAAiC,CAAC;AAkDhE,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAMlG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AA0QD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,gCAsZ5C"}
@@ -0,0 +1,278 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Console → Observability → Telemetry — issue #537, epic #528.
4
+ *
5
+ * The deployment's telemetry POLICY: whether it is collected, how long it is
6
+ * kept, how this deployment labels what it exports (`app.instance.id`, #565),
7
+ * how much a single explorer query may return, and whether (and with which
8
+ * model) the AI assistant may help. Plus a live status card so an
9
+ * operator can see whether the store is actually there.
10
+ *
11
+ * The Connection section (#558, `components/telemetry/TelemetryConnectionSection`)
12
+ * is where the API's GreptimeDB host and logins are set. It is a section of
13
+ * this page — the same destination — not a card or a tab of its own, and it
14
+ * saves on its own `If-Match` version, separate from the policy form's.
15
+ *
16
+ * The Telemetry services section (#567, `components/telemetry/TelemetryServicesSection`)
17
+ * sits just above it: the GreptimeDB containers' state and a one-click
18
+ * (re)deploy. Also a section, not a card or tab; it is shown for
19
+ * `system_settings:read` and deploys need `system_settings:write` — what the
20
+ * `/admin/telemetry/stack` routes enforce.
21
+ *
22
+ * Gates: the route requires `telemetry:read` (the card's permission, what
23
+ * `telemetry-admin.controller.ts` enforces on its GETs). Saving needs
24
+ * `telemetry:write`; without it every control is disabled — the API is the
25
+ * real gate either way. Saves send `If-Match: <version>`; a 409 means someone
26
+ * else saved first and the page offers a reload.
27
+ *
28
+ * NOT behind `RequireTelemetryEnabled`: this is where telemetry is switched on.
29
+ */
30
+ import { useContext, useEffect, useMemo, useState } from 'react';
31
+ import { Alert, AlertTitle, Box, Button, Chip, Container, Divider, FormControlLabel, FormHelperText, Link, ListItemText, MenuItem, Paper, Snackbar, Stack, Switch, Table, TableBody, TableCell, TableHead, TableRow, TextField, ToggleButton, ToggleButtonGroup, Typography, useMediaQuery, useTheme, } from '@mui/material';
32
+ import MonitorHeartOutlinedIcon from '@mui/icons-material/MonitorHeartOutlined';
33
+ import { Link as RouterLink, Navigate } from 'react-router-dom';
34
+ import { usePlatformViewer } from '../../../core/index.js';
35
+ import { useTelemetryAdmin } from '../../headless/hooks/useTelemetryAdmin.js';
36
+ import { TelemetryConfigContext, isTelemetryOn, useTelemetryConfig } from '../../headless/context/telemetryConfig.js';
37
+ import { TelemetryCrossLink } from '../components/TelemetryCrossLink.js';
38
+ import { TELEMETRY_DASHBOARD_PATH } from '../../headless/lib/explorerHandoff.js';
39
+ import { useTelemetryWebAdapters } from '../../headless/adapters/TelemetryWebAdapters.js';
40
+ import { TelemetrySpinner } from '../components/TelemetrySpinner.js';
41
+ import { TELEMETRY_CONNECTION_SECTION_ID, TelemetryConnectionSection, } from '../components/TelemetryConnectionSection.js';
42
+ import { TelemetryServicesSection } from '../components/TelemetryServicesSection.js';
43
+ import { telemetryTokens } from '../../theme/telemetryTokens.js';
44
+ import { TELEMETRY_INSTANCE_ID_PATTERN, TELEMETRY_LIMITS, } from '../../headless/services/telemetry.js';
45
+ /** Mirrors the `Telemetry` card in `config/adminSections.tsx`. */
46
+ const PAGE_TITLE = 'Telemetry';
47
+ const PAGE_DESCRIPTION = 'Turn telemetry collection on, choose how long it is kept, set query limits and configure the AI assistant.';
48
+ export const RETENTION_PRESETS = [7, 30, 90, 180, 365];
49
+ const FIELD_LIMITS = {
50
+ retentionDays: TELEMETRY_LIMITS.retentionDays,
51
+ maxRows: TELEMETRY_LIMITS.maxRows,
52
+ timeoutSeconds: TELEMETRY_LIMITS.timeoutSeconds,
53
+ maxResultRowsToModel: TELEMETRY_LIMITS.maxResultRowsToModel,
54
+ maxSteps: TELEMETRY_LIMITS.maxSteps,
55
+ };
56
+ function modelKey(provider, modelId) {
57
+ return provider && modelId ? `${provider}:${modelId}` : '';
58
+ }
59
+ function toFormState(config) {
60
+ const preset = RETENTION_PRESETS.includes(config.retentionDays);
61
+ return {
62
+ enabled: config.enabled,
63
+ instanceId: config.instanceId ?? '',
64
+ retentionMode: preset ? 'preset' : 'custom',
65
+ retentionDays: String(config.retentionDays),
66
+ maxRows: String(config.query.maxRows),
67
+ timeoutSeconds: String(config.query.timeoutSeconds),
68
+ assistantEnabled: config.assistant.enabled,
69
+ model: modelKey(config.assistant.provider, config.assistant.modelId),
70
+ shareResults: config.assistant.shareResults,
71
+ maxResultRowsToModel: String(config.assistant.maxResultRowsToModel),
72
+ maxSteps: String(config.assistant.maxSteps),
73
+ };
74
+ }
75
+ /** `null` when valid, else the message to show under the field. */
76
+ export function validateInteger(value, limits) {
77
+ const trimmed = value.trim();
78
+ if (!/^\d+$/.test(trimmed))
79
+ return `Enter a whole number from ${limits.min} to ${limits.max}.`;
80
+ const n = Number(trimmed);
81
+ if (n < limits.min || n > limits.max)
82
+ return `Must be from ${limits.min} to ${limits.max}.`;
83
+ return null;
84
+ }
85
+ /**
86
+ * `null` when valid (blank is valid: it follows the default), else the message
87
+ * to show under the field. Mirrors the API's pattern; the API is the gate.
88
+ */
89
+ export function validateInstanceId(value) {
90
+ const trimmed = value.trim();
91
+ if (trimmed === '')
92
+ return null;
93
+ if (TELEMETRY_INSTANCE_ID_PATTERN.test(trimmed))
94
+ return null;
95
+ return 'Use 1-63 lowercase letters, digits, ".", "_" or "-", starting with a letter or digit.';
96
+ }
97
+ function validate(form) {
98
+ const errors = {};
99
+ for (const field of Object.keys(FIELD_LIMITS)) {
100
+ const error = validateInteger(form[field], FIELD_LIMITS[field]);
101
+ if (error)
102
+ errors[field] = error;
103
+ }
104
+ const instanceIdError = validateInstanceId(form.instanceId);
105
+ if (instanceIdError)
106
+ errors.instanceId = instanceIdError;
107
+ return errors;
108
+ }
109
+ function toSettings(form) {
110
+ const separator = form.model.indexOf(':');
111
+ const provider = separator > 0 ? form.model.slice(0, separator) : null;
112
+ const modelId = separator > 0 ? form.model.slice(separator + 1) : null;
113
+ const instanceId = form.instanceId.trim();
114
+ return {
115
+ enabled: form.enabled,
116
+ instanceId: instanceId === '' ? null : instanceId,
117
+ retentionDays: Number(form.retentionDays),
118
+ query: { maxRows: Number(form.maxRows), timeoutSeconds: Number(form.timeoutSeconds) },
119
+ assistant: {
120
+ enabled: form.assistantEnabled,
121
+ provider,
122
+ modelId,
123
+ shareResults: form.shareResults,
124
+ maxResultRowsToModel: Number(form.maxResultRowsToModel),
125
+ maxSteps: Number(form.maxSteps),
126
+ },
127
+ };
128
+ }
129
+ function formatRows(rows) {
130
+ return rows === null ? '—' : rows.toLocaleString();
131
+ }
132
+ function Section({ title, children }) {
133
+ return (_jsxs(Paper, { sx: { p: { xs: 2, sm: 3 }, mb: 3 }, component: "section", "aria-label": title, children: [_jsx(Typography, { variant: "h6", component: "h2", gutterBottom: true, children: title }), children] }));
134
+ }
135
+ /** An in-page link to the Connection section. */
136
+ function ConnectionLink({ children }) {
137
+ return _jsx(Link, { href: `#${TELEMETRY_CONNECTION_SECTION_ID}`, children: children });
138
+ }
139
+ function StatusCard({ status, error, onRefresh, }) {
140
+ return (_jsxs(Section, { title: "Status", children: [error && (_jsx(Alert, { severity: "error", sx: { mb: 2 }, children: error })), status && !status.configured && (_jsxs(Alert, { severity: "warning", sx: { mb: 2 }, "data-testid": "telemetry-not-configured", children: [_jsx(AlertTitle, { children: "GreptimeDB not configured" }), "The API has no connection to a telemetry store. Enter the GreptimeDB logins in the ", _jsx(ConnectionLink, { children: "Connection" }), " section and save. GreptimeDB is deployed with this application; settings saved here take effect once it is reachable, with no restart needed."] })), status && (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: 'wrap', mb: 2 }, children: [_jsx(Chip, { size: "small", color: status.configured ? 'success' : 'default', label: status.configured ? 'Configured' : 'Not configured' }), status.configured && (_jsx(Chip, { size: "small", color: status.reachable ? 'success' : 'error', label: status.reachable ? 'Reachable' : 'Unreachable' }))] }), status.configured && status.error && (_jsx(Alert, { severity: status.reachable ? 'warning' : 'error', sx: { mb: 2 }, children: status.error })), _jsxs(Box, { component: "dl", sx: {
141
+ display: 'grid',
142
+ gridTemplateColumns: { xs: '1fr', sm: 'max-content 1fr' },
143
+ columnGap: 3,
144
+ rowGap: 0.5,
145
+ m: 0,
146
+ '& dt': { color: 'text.secondary' },
147
+ '& dd': { m: 0, mb: { xs: 1, sm: 0 }, wordBreak: 'break-word' },
148
+ }, children: [_jsx("dt", { children: "Version" }), _jsx("dd", { children: status.version ?? '—' }), _jsx("dt", { children: "Database" }), _jsx("dd", { children: status.database }), _jsx("dt", { children: "Retention in force" }), _jsxs("dd", { children: [status.ttl
149
+ ? status.ttl.days !== null
150
+ ? `${status.ttl.days} days (${status.ttl.raw})`
151
+ : status.ttl.raw
152
+ : 'None set', status.ttl?.days != null && status.ttl.days !== status.retentionDays && (_jsxs(Typography, { component: "span", variant: "body2", sx: { ml: 1, color: (theme) => telemetryTokens(theme).status.warn }, children: ["(setting is ", status.retentionDays, " days \u2014 the background job has not applied it yet)"] }))] })] }), status.tables.length > 0 && (_jsx(Box, { sx: { mt: 2, overflowX: 'auto' }, children: _jsxs(Table, { size: "small", "aria-label": "Telemetry tables", children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [_jsx(TableCell, { children: "Table" }), _jsx(TableCell, { align: "right", children: "Rows" })] }) }), _jsx(TableBody, { children: status.tables.map((table) => (_jsxs(TableRow, { children: [_jsx(TableCell, { sx: { fontFamily: 'monospace', wordBreak: 'break-all' }, children: table.name }), _jsx(TableCell, { align: "right", children: formatRows(table.rows) })] }, table.name))) })] }) }))] })), _jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { size: "small", onClick: onRefresh, children: "Refresh status" }) })] }));
153
+ }
154
+ function modelLabel(model) {
155
+ return model.label || model.modelId;
156
+ }
157
+ function supportsTools(model) {
158
+ return model.supportsToolCalling;
159
+ }
160
+ /**
161
+ * Provider + model picker over the admin AI catalogue (the app's
162
+ * `useAssistantModels` adapter; enabled models only). Tool-calling models are listed first:
163
+ * the assistant works by calling tools. Mounted only for a holder of
164
+ * `ai_config:read`, which the catalogue route requires.
165
+ */
166
+ function AssistantModelSelect({ value, onChange, disabled, }) {
167
+ const { models, isLoading, error } = useTelemetryWebAdapters().useAssistantModels();
168
+ const sorted = useMemo(() => [...models].sort((a, b) => Number(supportsTools(b)) - Number(supportsTools(a))), [models]);
169
+ const known = sorted.some((model) => modelKey(model.provider, model.modelId) === value);
170
+ return (_jsxs(TextField, { select: true, fullWidth: true, size: "small", label: "Model", value: value, onChange: (event) => onChange(event.target.value), disabled: disabled || isLoading, helperText: error ??
171
+ 'Choose an enabled model. Models that support tool calling are listed first — the assistant needs it.', error: !!error, slotProps: { htmlInput: { 'aria-label': 'Assistant model' } }, children: [_jsx(MenuItem, { value: "", children: _jsx(ListItemText, { primary: "Not set", secondary: "The assistant cannot run until a model is chosen" }) }), !known && value && (_jsx(MenuItem, { value: value, children: _jsx(ListItemText, { primary: value, secondary: "Stored, but not an enabled model" }) })), sorted.map((model) => (_jsx(MenuItem, { value: modelKey(model.provider, model.modelId), children: _jsx(ListItemText, { primary: modelLabel(model), secondary: `${model.provider}${supportsTools(model) ? ' · tool calling' : ' · tool calling not declared'}` }) }, model.id)))] }));
172
+ }
173
+ function NumberInput({ label, field, form, errors, disabled, helper, onChange, }) {
174
+ const limits = FIELD_LIMITS[field];
175
+ return (_jsx(TextField, { label: label, type: "number", size: "small", value: form[field], onChange: (event) => onChange(field, event.target.value), disabled: disabled, error: !!errors[field], helperText: errors[field] ?? helper, slotProps: { htmlInput: { min: limits.min, max: limits.max, step: 1, inputMode: 'numeric' } }, sx: { width: { xs: '100%', sm: 260 } } }));
176
+ }
177
+ /**
178
+ * The Telemetry settings page (`/admin/settings/telemetry`): collection on or
179
+ * off, retention, query limits, the AI assistant's switch and model, the
180
+ * GreptimeDB connection and the telemetry services. Shown to `telemetry:read`;
181
+ * saving needs `telemetry:write` (the controls are disabled without it), the
182
+ * model picker `ai_config:read`, the services section `system_settings:read`
183
+ * (`system_settings:write` to deploy). NOT behind `RequireTelemetryEnabled`:
184
+ * this is where telemetry is switched on. Reads the app through
185
+ * `PlatformHostProvider` and `TelemetryWebAdaptersProvider`.
186
+ *
187
+ * @returns the page.
188
+ *
189
+ * @extensionPoint component
190
+ * @stability experimental
191
+ */
192
+ export default function TelemetrySettingsPage() {
193
+ const { hasPermission } = usePlatformViewer();
194
+ const { config, status, isLoading, loadError, statusError, isSaving, saveError, conflict, reload, refreshStatus, save, } = useTelemetryAdmin();
195
+ const { enabled: aiEnabled } = useTelemetryWebAdapters().useAiEnabled();
196
+ // The shell's shared `GET /telemetry/config`. Refreshed after a save so the
197
+ // hub, the rail and the explorer route learn at once. With no shell above
198
+ // (a test), there is nothing to refresh.
199
+ const sharedTelemetryConfig = useContext(TelemetryConfigContext);
200
+ // "Open dashboard" (#579) follows the dashboard route's own gates: the
201
+ // `telemetry` feature (store deployed AND collecting) and `telemetry:query`.
202
+ const { config: publicTelemetryConfig } = useTelemetryConfig();
203
+ const theme = useTheme();
204
+ const isPhone = useMediaQuery(theme.breakpoints.down('sm'));
205
+ const [form, setForm] = useState(null);
206
+ const [savedMessage, setSavedMessage] = useState(null);
207
+ // Bumped after a telemetry services deploy so the Connection section re-reads.
208
+ const [connectionRefresh, setConnectionRefresh] = useState(0);
209
+ useEffect(() => {
210
+ if (config)
211
+ setForm(toFormState(config));
212
+ }, [config]);
213
+ // Defence, not the gate — `App.tsx` wraps the route in `RequirePermission`.
214
+ if (!hasPermission('telemetry:read')) {
215
+ return _jsx(Navigate, { to: "/", replace: true });
216
+ }
217
+ const canWrite = hasPermission('telemetry:write');
218
+ const canOpenDashboard = isTelemetryOn(publicTelemetryConfig) && hasPermission('telemetry:query');
219
+ const canPickModel = hasPermission('ai_config:read');
220
+ // The Telemetry services section (#567) follows `telemetry-stack` routes,
221
+ // which enforce `system_settings:read` / `system_settings:write`.
222
+ const canViewServices = hasPermission('system_settings:read');
223
+ const canDeployServices = hasPermission('system_settings:write');
224
+ if (isLoading && !form) {
225
+ return _jsx(TelemetrySpinner, {});
226
+ }
227
+ const errors = form ? validate(form) : {};
228
+ const invalid = Object.keys(errors).length > 0;
229
+ const isDirty = !!form && !!config && JSON.stringify(form) !== JSON.stringify(toFormState(config));
230
+ const locked = !canWrite || isSaving;
231
+ const update = (key, value) => {
232
+ setForm((prev) => (prev ? { ...prev, [key]: value } : prev));
233
+ };
234
+ const updateNumber = (field, value) => update(field, value);
235
+ const handleSubmit = async (event) => {
236
+ event.preventDefault();
237
+ if (!form || invalid || !canWrite)
238
+ return;
239
+ const ok = await save(toSettings(form));
240
+ if (ok) {
241
+ setSavedMessage('Telemetry settings saved');
242
+ void sharedTelemetryConfig?.refresh();
243
+ }
244
+ };
245
+ const retentionToggleValue = form?.retentionMode === 'custom' ? 'custom' : (form?.retentionDays ?? '');
246
+ return (_jsx(Container, { maxWidth: "lg", children: _jsxs(Box, { sx: { py: 4 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center', mb: 1 }, children: [_jsx(Typography, { variant: "h4", component: "h1", sx: { flex: 1, minWidth: 0 }, children: PAGE_TITLE }), canOpenDashboard && (_jsx(TelemetryCrossLink, { to: TELEMETRY_DASHBOARD_PATH, label: "Open dashboard", compactLabel: "Open Telemetry Dashboard", icon: _jsx(MonitorHeartOutlinedIcon, {}), compact: isPhone }))] }), _jsxs(Typography, { color: "text.secondary", sx: { mb: 2 }, children: [PAGE_DESCRIPTION, !canWrite && ' (read-only)'] }), config?.updatedBy && config.updatedAt && (_jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 3 }, children: ["Last updated by ", config.updatedBy.email, " on ", new Date(config.updatedAt).toLocaleString()] })), loadError && (_jsx(Alert, { severity: "error", sx: { mb: 3 }, children: loadError })), !canWrite && !loadError && (_jsxs(Alert, { severity: "info", sx: { mb: 3 }, "data-testid": "telemetry-read-only-notice", children: ["You can read this configuration but not change it. Saving needs", ' ', _jsx("code", { children: "telemetry:write" }), "."] })), canViewServices && (_jsx(TelemetryServicesSection, { canDeploy: canDeployServices, onDeployed: () => {
247
+ // A fresh store changes the connection test, `available` and the
248
+ // status — refresh them all, and the shell's shared flag.
249
+ setConnectionRefresh((n) => n + 1);
250
+ void reload();
251
+ void sharedTelemetryConfig?.refresh();
252
+ } })), _jsx(TelemetryConnectionSection, { canWrite: canWrite, refreshToken: connectionRefresh, onChanged: (message) => {
253
+ setSavedMessage(message);
254
+ // The connection decides `available`, `retentionApplicable` and the
255
+ // status, so refresh all three — and the shell's shared flag.
256
+ void reload();
257
+ void sharedTelemetryConfig?.refresh();
258
+ } }), _jsx(StatusCard, { status: status, error: statusError, onRefresh: () => void refreshStatus() }), form && config && (_jsxs(Box, { component: "form", onSubmit: handleSubmit, noValidate: true, children: [_jsxs(Section, { title: "Collection", children: [_jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.enabled, onChange: (event) => update('enabled', event.target.checked), disabled: locked, slotProps: { input: { 'aria-label': 'Collect telemetry' } } }), label: "Collect telemetry" }), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Export of traces, logs and metrics starts or stops within seconds on every instance \u2014 no restart. Nothing is collected while no telemetry store is configured." }), !config.available && (_jsxs(Alert, { severity: "info", sx: { mt: 2 }, children: ["No telemetry store is configured yet, so this switch has no effect until a GreptimeDB connection is saved in the", ' ', _jsx(ConnectionLink, { children: "Connection" }), " section."] })), _jsx(Box, { sx: { mt: 3, maxWidth: { sm: 480 } }, children: _jsx(TextField, { fullWidth: true, size: "small", label: "Instance identifier", value: form.instanceId, onChange: (event) => update('instanceId', event.target.value), disabled: locked, placeholder: config.instanceIdDefault, error: !!errors.instanceId, helperText: _jsxs(_Fragment, { children: [errors.instanceId && (_jsx(Box, { component: "span", sx: { display: 'block' }, children: errors.instanceId })), "Labels every trace, log and metric as ", _jsx("code", { children: "app.instance.id" }), " so dashboards can filter and aggregate across deployments that share a telemetry store. Leave blank to use the default,", ' ', _jsx("code", { children: config.instanceIdDefault }), ". Currently in use:", ' ', _jsx("code", { "data-testid": "telemetry-instance-id-effective", children: config.instanceIdEffective }), "."] }), slotProps: {
259
+ htmlInput: {
260
+ autoCapitalize: 'none',
261
+ autoCorrect: 'off',
262
+ spellCheck: false,
263
+ maxLength: 63,
264
+ },
265
+ } }) })] }), _jsxs(Section, { title: "Retention", children: [_jsxs(ToggleButtonGroup, { exclusive: true, size: "small", value: retentionToggleValue, onChange: (_event, next) => {
266
+ if (next === null)
267
+ return;
268
+ if (next === 'custom') {
269
+ update('retentionMode', 'custom');
270
+ }
271
+ else {
272
+ setForm((prev) => prev ? { ...prev, retentionMode: 'preset', retentionDays: next } : prev);
273
+ }
274
+ }, disabled: locked, "aria-label": "Retention period", sx: { flexWrap: 'wrap', mb: 2 }, children: [RETENTION_PRESETS.map((days) => (_jsxs(ToggleButton, { value: String(days), "aria-label": `${days} days`, children: [days, " days"] }, days))), _jsx(ToggleButton, { value: "custom", "aria-label": "Custom", children: "Custom" })] }), form.retentionMode === 'custom' && (_jsx(Box, { sx: { mb: 2 }, children: _jsx(NumberInput, { label: "Retention (days)", field: "retentionDays", form: form, errors: errors, disabled: locked, helper: "From 1 to 3650 days.", onChange: updateNumber }) })), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Retention is applied to the telemetry store by a background job after each save (and re-asserted nightly), so older data is dropped shortly after, not instantly." }), !config.retentionApplicable && (_jsxs(Alert, { severity: "warning", sx: { mt: 2 }, "data-testid": "retention-not-applicable", children: ["No GreptimeDB admin login is configured, so this retention period is saved but cannot be applied. Add an admin user and password in the", ' ', _jsx(ConnectionLink, { children: "Connection" }), " section."] }))] }), _jsx(Section, { title: "Query limits", children: _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(NumberInput, { label: "Maximum rows per query", field: "maxRows", form: form, errors: errors, disabled: locked, helper: "From 1 to 100000. Larger results are truncated.", onChange: updateNumber }), _jsx(NumberInput, { label: "Query timeout (seconds)", field: "timeoutSeconds", form: form, errors: errors, disabled: locked, helper: "From 1 to 120.", onChange: updateNumber })] }) }), _jsxs(Section, { title: "AI assistant", children: [!aiEnabled && (_jsxs(Alert, { severity: "info", sx: { mb: 2 }, "data-testid": "telemetry-ai-off", children: ["AI is switched off for this deployment. You can configure the assistant here, but it will not run until AI is turned on in", ' ', _jsx(Link, { component: RouterLink, to: "/admin/settings/ai", children: "AI settings" }), "."] })), _jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.assistantEnabled, onChange: (event) => update('assistantEnabled', event.target.checked), disabled: locked, slotProps: { input: { 'aria-label': 'Enable the telemetry assistant' } } }), label: "Enable the telemetry assistant" }), _jsx(FormHelperText, { sx: { mt: 0, mb: 2 }, children: "Lets explorer users ask questions in plain language; the assistant inspects the schema and writes and runs read-only SQL on their behalf." }), _jsxs(Stack, { spacing: 2, children: [_jsx(Box, { sx: { maxWidth: { sm: 480 } }, children: canPickModel ? (_jsx(AssistantModelSelect, { value: form.model, onChange: (key) => update('model', key), disabled: locked })) : (_jsxs(Typography, { variant: "body2", color: "text.secondary", children: ["Model: ", form.model || 'not set', " (choosing one needs", ' ', _jsx("code", { children: "ai_config:read" }), ")"] })) }), _jsxs(Box, { children: [_jsx(FormControlLabel, { control: _jsx(Switch, { checked: form.shareResults, onChange: (event) => update('shareResults', event.target.checked), disabled: locked, slotProps: {
275
+ input: { 'aria-label': 'Share query results with the model' },
276
+ } }), label: "Share query results with the model" }), _jsx(FormHelperText, { sx: { mt: 0 }, children: "Off: the model sees only column names, row counts and errors, never values." })] }), _jsxs(Stack, { direction: { xs: 'column', sm: 'row' }, spacing: 2, children: [_jsx(NumberInput, { label: "Rows shared per query", field: "maxResultRowsToModel", form: form, errors: errors, disabled: locked || !form.shareResults, helper: "From 1 to 100.", onChange: updateNumber }), _jsx(NumberInput, { label: "Maximum steps", field: "maxSteps", form: form, errors: errors, disabled: locked, helper: "Tool calls per question, from 1 to 20. 15 is recommended for investigations.", onChange: updateNumber })] })] })] }), conflict && (_jsx(Alert, { severity: "warning", sx: { mb: 3 }, "data-testid": "telemetry-conflict", action: _jsx(Button, { color: "inherit", size: "small", onClick: () => void reload(), children: "Reload" }), children: "These settings were changed by someone else since you opened this page. Reload to see the current values, then re-apply your changes." })), saveError && (_jsx(Alert, { severity: "error", sx: { mb: 3 }, children: saveError })), _jsx(Divider, { sx: { mb: 3 } }), _jsx(Button, { type: "submit", variant: "contained", disabled: locked || !isDirty || invalid, children: isSaving ? 'Saving...' : 'Save Changes' })] })), _jsx(Snackbar, { open: !!savedMessage, autoHideDuration: 3000, onClose: () => setSavedMessage(null), message: savedMessage })] }) }));
277
+ }
278
+ //# sourceMappingURL=TelemetrySettingsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetrySettingsPage.js","sourceRoot":"","sources":["../../../../src/telemetry/ui/pages/TelemetrySettingsPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { default, default as TelemetrySettingsPage } from './pages/TelemetrySettingsPage.js';
2
+ //# sourceMappingURL=settings-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-page.d.ts","sourceRoot":"","sources":["../../../src/telemetry/ui/settings-page.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,6 @@
1
+ // `@marinoscar/platform-web/telemetry/ui/settings-page`: the TelemetrySettingsPage
2
+ // route component alone (issue #704), as a default and a named export, so
3
+ // the app keeps `lazy(() => import('@marinoscar/platform-web/telemetry/ui/settings-page'))`
4
+ // and the page stays in a chunk of its own. Documented in ../README.md.
5
+ export { default, default as TelemetrySettingsPage } from './pages/TelemetrySettingsPage.js';
6
+ //# sourceMappingURL=settings-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-page.js","sourceRoot":"","sources":["../../../src/telemetry/ui/settings-page.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,0EAA0E;AAC1E,4FAA4F;AAC5F,wEAAwE;AAExE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createTestApiError, createTestBlobResponse, createTestPlatformHost } from './test-platform-host.js';
2
+ export type { TestApiRequest, TestApiResponse, TestPlatformHost, TestPlatformHostOptions, TestSseFrame, } from './test-platform-host.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC7G,YAAY,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,GACb,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // `@marinoscar/platform-web/testing`: test doubles for the web host ports
2
+ // (issue #696). For package tests and app tests; never in production code.
3
+ export { createTestApiError, createTestBlobResponse, createTestPlatformHost } from './test-platform-host.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,108 @@
1
+ import type { PlatformApiError, PlatformBlobResponse, PlatformWebHost } from '../core/index.js';
2
+ /**
3
+ * One request a test host received.
4
+ *
5
+ * @stability experimental
6
+ */
7
+ export interface TestApiRequest {
8
+ /** The HTTP method. */
9
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
10
+ /** The path as the page passed it, query string included. */
11
+ path: string;
12
+ /** The body, for POST, PUT and PATCH. */
13
+ body?: unknown;
14
+ /** The `ifMatch` option of a PUT, PATCH or DELETE. */
15
+ ifMatch?: string;
16
+ }
17
+ /**
18
+ * One frame a canned {@link PlatformApiClient.postSse} answer delivers, in order.
19
+ *
20
+ * @stability experimental
21
+ */
22
+ export interface TestSseFrame {
23
+ /** The frame's `event:` name. */
24
+ event: string;
25
+ /** The frame's parsed `data:`. */
26
+ data: unknown;
27
+ }
28
+ /**
29
+ * A canned answer: a value (resolved as the response data) or a function of
30
+ * the request (which may return a promise, or throw / reject to fail the call,
31
+ * for example with {@link createTestApiError}).
32
+ *
33
+ * @stability experimental
34
+ */
35
+ export type TestApiResponse = unknown | ((request: TestApiRequest) => unknown);
36
+ /**
37
+ * What {@link createTestPlatformHost} takes.
38
+ *
39
+ * @stability experimental
40
+ */
41
+ export interface TestPlatformHostOptions {
42
+ /** The permissions the viewer holds. Default none. */
43
+ permissions?: readonly string[];
44
+ /** The viewer's user id. Default `'test-user'`. */
45
+ userId?: string | null;
46
+ /** Feature switches. Default all off. */
47
+ features?: Readonly<Record<string, boolean>>;
48
+ /**
49
+ * Canned responses, looked up by `"<METHOD> <path with query>"`, then
50
+ * `"<METHOD> <path without query>"`, then `"<path without query>"`. An
51
+ * unmatched request rejects with a 404 {@link PlatformApiError}. A stream
52
+ * (`postSse`) answers from the same table with an array of
53
+ * {@link TestSseFrame}s, delivered in order.
54
+ */
55
+ responses?: Readonly<Record<string, TestApiResponse>>;
56
+ /** The host's relative-time formatter. Default none (the page's fallback). */
57
+ formatRelativeTime?: (iso: string) => string;
58
+ }
59
+ /**
60
+ * A {@link PlatformWebHost} for tests, plus the requests it received.
61
+ *
62
+ * @stability experimental
63
+ */
64
+ export interface TestPlatformHost extends PlatformWebHost {
65
+ /** Every request, oldest first. */
66
+ readonly requests: TestApiRequest[];
67
+ }
68
+ /**
69
+ * A rejection value shaped like the app adapter's errors.
70
+ *
71
+ * @param status - the HTTP status.
72
+ * @param message - the API's message.
73
+ * @param code - the API's error code.
74
+ * @returns an `Error` that is also a {@link PlatformApiError}.
75
+ *
76
+ * @stability experimental
77
+ */
78
+ export declare function createTestApiError(status: number, message: string, code?: string): Error & PlatformApiError;
79
+ /**
80
+ * A canned download for {@link PlatformApiClient.getBlob}: a body and response headers.
81
+ *
82
+ * @param body - the file's text.
83
+ * @param headers - response headers, e.g. `{ 'Content-Disposition': 'attachment; filename="x.json"' }`.
84
+ * @returns the blob response.
85
+ *
86
+ * @stability experimental
87
+ */
88
+ export declare function createTestBlobResponse(body: string, headers?: Readonly<Record<string, string>>): PlatformBlobResponse;
89
+ /**
90
+ * Builds a host for package tests: canned API responses, a viewer with the
91
+ * given permissions and features, and a log of every request.
92
+ *
93
+ * @param options - see {@link TestPlatformHostOptions}.
94
+ * @returns the host; pass it to `PlatformHostProvider`.
95
+ *
96
+ * @example
97
+ * ```tsx
98
+ * const host = createTestPlatformHost({
99
+ * permissions: ['system_settings:read'],
100
+ * responses: { 'GET /admin/doctor': report },
101
+ * });
102
+ * render(<PlatformHostProvider host={host}><DoctorPage /></PlatformHostProvider>);
103
+ * ```
104
+ *
105
+ * @stability experimental
106
+ */
107
+ export declare function createTestPlatformHost(options?: TestPlatformHostOptions): TestPlatformHost;
108
+ //# sourceMappingURL=test-platform-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-platform-host.d.ts","sourceRoot":"","sources":["../../src/testing/test-platform-host.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,gBAAgB,EAChB,oBAAoB,EAEpB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACtD,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,gBAAgB,CAE3G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,oBAAoB,CAMzH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAoD9F"}
@@ -0,0 +1,101 @@
1
+ // A platform host for PACKAGE tests (issue #696). It answers API calls from a
2
+ // table of canned responses and records every request, so a packaged page can
3
+ // be tested without the app, its transport or a mock server.
4
+ /**
5
+ * A rejection value shaped like the app adapter's errors.
6
+ *
7
+ * @param status - the HTTP status.
8
+ * @param message - the API's message.
9
+ * @param code - the API's error code.
10
+ * @returns an `Error` that is also a {@link PlatformApiError}.
11
+ *
12
+ * @stability experimental
13
+ */
14
+ export function createTestApiError(status, message, code) {
15
+ return Object.assign(new Error(message), { name: 'PlatformApiError', status, ...(code === undefined ? {} : { code }) });
16
+ }
17
+ /**
18
+ * A canned download for {@link PlatformApiClient.getBlob}: a body and response headers.
19
+ *
20
+ * @param body - the file's text.
21
+ * @param headers - response headers, e.g. `{ 'Content-Disposition': 'attachment; filename="x.json"' }`.
22
+ * @returns the blob response.
23
+ *
24
+ * @stability experimental
25
+ */
26
+ export function createTestBlobResponse(body, headers = {}) {
27
+ const lower = new Map(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]));
28
+ return {
29
+ blob: new Blob([body], { type: lower.get('content-type') ?? 'application/octet-stream' }),
30
+ headers: { get: (name) => lower.get(name.toLowerCase()) ?? null },
31
+ };
32
+ }
33
+ /**
34
+ * Builds a host for package tests: canned API responses, a viewer with the
35
+ * given permissions and features, and a log of every request.
36
+ *
37
+ * @param options - see {@link TestPlatformHostOptions}.
38
+ * @returns the host; pass it to `PlatformHostProvider`.
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * const host = createTestPlatformHost({
43
+ * permissions: ['system_settings:read'],
44
+ * responses: { 'GET /admin/doctor': report },
45
+ * });
46
+ * render(<PlatformHostProvider host={host}><DoctorPage /></PlatformHostProvider>);
47
+ * ```
48
+ *
49
+ * @stability experimental
50
+ */
51
+ export function createTestPlatformHost(options = {}) {
52
+ const requests = [];
53
+ const responses = options.responses ?? {};
54
+ const permissions = new Set(options.permissions ?? []);
55
+ const features = options.features ?? {};
56
+ const call = async (request) => {
57
+ requests.push(request);
58
+ const bare = request.path.split('?')[0] ?? request.path;
59
+ const keys = [`${request.method} ${request.path}`, `${request.method} ${bare}`, bare];
60
+ const key = keys.find((k) => Object.prototype.hasOwnProperty.call(responses, k));
61
+ if (key === undefined) {
62
+ throw createTestApiError(404, `No test response for ${request.method} ${request.path}`);
63
+ }
64
+ const response = responses[key];
65
+ return (await (typeof response === 'function' ? response(request) : response));
66
+ };
67
+ const withIfMatch = (options) => options?.ifMatch === undefined ? {} : { ifMatch: options.ifMatch };
68
+ const api = {
69
+ get: (path) => call({ method: 'GET', path }),
70
+ post: (path, body) => call({ method: 'POST', path, body }),
71
+ put: (path, body, putOptions) => call({ method: 'PUT', path, body, ...withIfMatch(putOptions) }),
72
+ patch: (path, body, patchOptions) => call({ method: 'PATCH', path, body, ...withIfMatch(patchOptions) }),
73
+ delete: (path, deleteOptions) => call({ method: 'DELETE', path, ...withIfMatch(deleteOptions) }),
74
+ // Downloads answer from the same table (`'GET <path>'`, `'POST <path>'`);
75
+ // the canned value is a `PlatformBlobResponse`, e.g. from `createTestBlobResponse`.
76
+ getBlob: (path) => call({ method: 'GET', path }),
77
+ postBlob: (path, body) => call({ method: 'POST', path, body }),
78
+ // A stream answers with an array of frames; anything else delivers none.
79
+ postSse: async (path, body, sseOptions) => {
80
+ const frames = await call({ method: 'POST', path, body });
81
+ if (!Array.isArray(frames))
82
+ return;
83
+ for (const frame of frames) {
84
+ if (sseOptions.signal?.aborted)
85
+ return;
86
+ sseOptions.onFrame(frame.event, frame.data);
87
+ }
88
+ },
89
+ };
90
+ return {
91
+ api,
92
+ viewer: {
93
+ userId: options.userId === undefined ? 'test-user' : options.userId,
94
+ hasPermission: (permission) => permissions.has(permission),
95
+ isFeatureEnabled: (feature) => features[feature] === true,
96
+ },
97
+ ...(options.formatRelativeTime ? { formatRelativeTime: options.formatRelativeTime } : {}),
98
+ requests,
99
+ };
100
+ }
101
+ //# sourceMappingURL=test-platform-host.js.map