@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,58 @@
1
+ // The telemetry slice's admin registry cards (issue #704). Data only: the
2
+ // app places them in its own registry (`apps/web/src/config/adminSections.tsx`,
3
+ // the Observability section) where its three literal cards were, so the hub,
4
+ // the Console rail and the AppBar title resolver show them in the same order
5
+ // with the same permissions and features. No component is referenced here,
6
+ // so importing the cards never pulls a page into the app's main chunk.
7
+ import InsightsOutlinedIcon from '@mui/icons-material/InsightsOutlined';
8
+ import MonitorHeartOutlinedIcon from '@mui/icons-material/MonitorHeartOutlined';
9
+ import TerminalOutlinedIcon from '@mui/icons-material/TerminalOutlined';
10
+ import { TELEMETRY_DASHBOARD_PATH, TELEMETRY_EXPLORER_PATH, TELEMETRY_SETTINGS_PATH } from '../headless/lib/explorerHandoff.js';
11
+ /**
12
+ * The three Observability cards of the telemetry slice, in registry order:
13
+ *
14
+ * - `Telemetry` (`/admin/settings/telemetry`, `telemetry:read`): NO `feature`,
15
+ * deliberately; it is where telemetry is switched on. Saving needs
16
+ * `telemetry:write`, which the page gates.
17
+ * - `Telemetry Explorer` (`…/explorer`, `telemetry:query`, `feature: 'telemetry'`).
18
+ * - `Telemetry Dashboard` (`…/dashboard`, `telemetry:query`, `feature: 'telemetry'`).
19
+ *
20
+ * The permissions are the exact strings the telemetry controllers enforce.
21
+ * Both nested pages sit under the Telemetry route, so a longest-prefix title
22
+ * resolver names them correctly.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // apps/web/src/config/adminSections.tsx, the Observability section
27
+ * cards: [...telemetryAdminCards, { ...doctorSettingsPage.card, Icon: doctorSettingsPage.Icon }],
28
+ * ```
29
+ *
30
+ * @extensionPoint component
31
+ * @stability experimental
32
+ */
33
+ export const telemetryAdminCards = Object.freeze([
34
+ {
35
+ title: 'Telemetry',
36
+ description: 'Turn telemetry collection on, choose how long it is kept, set query limits and configure the AI assistant.',
37
+ Icon: InsightsOutlinedIcon,
38
+ path: TELEMETRY_SETTINGS_PATH,
39
+ permission: 'telemetry:read',
40
+ },
41
+ {
42
+ title: 'Telemetry Explorer',
43
+ description: 'Query traces, logs and metrics with SQL, export the results, and ask the AI assistant for help.',
44
+ Icon: TerminalOutlinedIcon,
45
+ path: TELEMETRY_EXPLORER_PATH,
46
+ permission: 'telemetry:query',
47
+ feature: 'telemetry',
48
+ },
49
+ {
50
+ title: 'Telemetry Dashboard',
51
+ description: 'See at a glance whether anything is wrong: error rate, latency, error logs and the top failing routes.',
52
+ Icon: MonitorHeartOutlinedIcon,
53
+ path: TELEMETRY_DASHBOARD_PATH,
54
+ permission: 'telemetry:query',
55
+ feature: 'telemetry',
56
+ },
57
+ ]);
58
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/telemetry/ui/admin.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,uEAAuE;AAEvE,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;AACxE,OAAO,wBAAwB,MAAM,0CAA0C,CAAC;AAChF,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;AAGxE,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAahI;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAkC,MAAM,CAAC,MAAM,CAAC;IAC9E;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,4GAA4G;QAC9G,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,gBAAgB;KAC7B;IACD;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,iGAAiG;QAC9G,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,WAAW;KACrB;IACD;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,wGAAwG;QAC1G,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,WAAW;KACrB;CACF,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The frame the telemetry assistant (`AssistantPanel`) lives in — issue #579
3
+ * (extracted from the Telemetry Explorer, #537), epic #576.
4
+ *
5
+ * Shared by the Telemetry Explorer and the Telemetry Dashboard so both show
6
+ * the assistant the same way. Which frame is the CALLER's decision, by size:
7
+ *
8
+ * - `docked` a persistent right drawer below the AppBar,
9
+ * {@link ASSISTANT_WIDTH} wide. It does not cover the page:
10
+ * the caller pads its content by that width.
11
+ * - `overlay` a temporary right drawer over the page, with a backdrop
12
+ * (Escape or a backdrop click closes it).
13
+ * - `fullscreen` a full-screen dialog (phones).
14
+ *
15
+ * Focus: the modal frames (`overlay`, `fullscreen`) trap focus while open and,
16
+ * by default, MUI restores it on close. A caller that knows better where focus
17
+ * belongs (the control that opened the assistant may have been inside a menu
18
+ * that no longer exists) passes `returnFocus`; the frame then disables MUI's
19
+ * restore and focuses what `returnFocus()` returns once it closes — for the
20
+ * non-modal `docked` frame too.
21
+ */
22
+ import { type ReactNode } from 'react';
23
+ /** The docked / overlay drawer's width; a docked caller pads its content by it. */
24
+ export declare const ASSISTANT_WIDTH = 400;
25
+ export type AssistantContainerVariant = 'docked' | 'overlay' | 'fullscreen';
26
+ export interface AssistantContainerProps {
27
+ open: boolean;
28
+ onClose: () => void;
29
+ variant: AssistantContainerVariant;
30
+ /** Where focus goes once the frame closes. Omitted: MUI's default. */
31
+ returnFocus?: () => HTMLElement | null;
32
+ children: ReactNode;
33
+ }
34
+ export declare function AssistantContainer({ open, onClose, variant, returnFocus, children }: AssistantContainerProps): import("react").JSX.Element;
35
+ //# sourceMappingURL=AssistantContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantContainer.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantContainer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI1D,mFAAmF;AACnF,eAAO,MAAM,eAAe,MAAM,CAAC;AAKnC,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAE5E,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,yBAAyB,CAAC;IACnC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACvC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAoBD,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,uBAAuB,+BA0F5G"}
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The frame the telemetry assistant (`AssistantPanel`) lives in — issue #579
4
+ * (extracted from the Telemetry Explorer, #537), epic #576.
5
+ *
6
+ * Shared by the Telemetry Explorer and the Telemetry Dashboard so both show
7
+ * the assistant the same way. Which frame is the CALLER's decision, by size:
8
+ *
9
+ * - `docked` a persistent right drawer below the AppBar,
10
+ * {@link ASSISTANT_WIDTH} wide. It does not cover the page:
11
+ * the caller pads its content by that width.
12
+ * - `overlay` a temporary right drawer over the page, with a backdrop
13
+ * (Escape or a backdrop click closes it).
14
+ * - `fullscreen` a full-screen dialog (phones).
15
+ *
16
+ * Focus: the modal frames (`overlay`, `fullscreen`) trap focus while open and,
17
+ * by default, MUI restores it on close. A caller that knows better where focus
18
+ * belongs (the control that opened the assistant may have been inside a menu
19
+ * that no longer exists) passes `returnFocus`; the frame then disables MUI's
20
+ * restore and focuses what `returnFocus()` returns once it closes — for the
21
+ * non-modal `docked` frame too.
22
+ */
23
+ import { useEffect, useRef } from 'react';
24
+ import { Dialog, DialogContent, DialogTitle, Divider, Drawer, IconButton, Stack, Typography } from '@mui/material';
25
+ import CloseIcon from '@mui/icons-material/Close';
26
+ /** The docked / overlay drawer's width; a docked caller pads its content by it. */
27
+ export const ASSISTANT_WIDTH = 400;
28
+ /** The AppBar's height from `sm` up — the docked drawer sits below it. */
29
+ const APP_BAR_HEIGHT = 64;
30
+ const TITLE_ID = 'telemetry-assistant-title';
31
+ function DrawerHeader({ onClose }) {
32
+ return (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", sx: { alignItems: 'center', justifyContent: 'space-between', mb: 1 }, children: [_jsx(Typography, { variant: "h6", component: "h2", children: "Assistant" }), _jsx(IconButton, { "aria-label": "Close assistant", onClick: onClose, children: _jsx(CloseIcon, {}) })] }), _jsx(Divider, { sx: { mb: 1 } })] }));
33
+ }
34
+ export function AssistantContainer({ open, onClose, variant, returnFocus, children }) {
35
+ const returnFocusRef = useRef(returnFocus);
36
+ returnFocusRef.current = returnFocus;
37
+ const wasOpen = useRef(open);
38
+ // Closing (open → false): hand focus back to where the caller says.
39
+ useEffect(() => {
40
+ if (wasOpen.current && !open && returnFocusRef.current) {
41
+ const target = returnFocusRef.current();
42
+ // After the frame's own close handling has run.
43
+ const timer = setTimeout(() => target?.focus(), 0);
44
+ wasOpen.current = open;
45
+ return () => clearTimeout(timer);
46
+ }
47
+ wasOpen.current = open;
48
+ return undefined;
49
+ }, [open]);
50
+ const customFocus = returnFocus !== undefined;
51
+ if (variant === 'fullscreen') {
52
+ return (_jsxs(Dialog, { fullScreen: true, open: open, onClose: onClose, "aria-labelledby": TITLE_ID, disableRestoreFocus: customFocus, children: [_jsxs(DialogTitle, { id: TITLE_ID, sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, children: ["Assistant", _jsx(IconButton, { "aria-label": "Close assistant", onClick: onClose, children: _jsx(CloseIcon, {}) })] }), _jsx(DialogContent, { sx: { display: 'flex', flexDirection: 'column' }, children: children })] }));
53
+ }
54
+ if (variant === 'overlay') {
55
+ return (_jsxs(Drawer, { anchor: "right", open: open, onClose: onClose, disableRestoreFocus: customFocus, slotProps: {
56
+ paper: {
57
+ sx: {
58
+ width: ASSISTANT_WIDTH,
59
+ maxWidth: '90vw',
60
+ p: 2,
61
+ boxSizing: 'border-box',
62
+ display: 'flex',
63
+ flexDirection: 'column',
64
+ },
65
+ role: 'dialog',
66
+ 'aria-label': 'Telemetry assistant',
67
+ },
68
+ }, children: [_jsx(DrawerHeader, { onClose: onClose }), _jsx(Stack, { sx: { flex: 1, minHeight: 0 }, children: children })] }));
69
+ }
70
+ return (_jsxs(Drawer, { anchor: "right", variant: "persistent", open: open, slotProps: {
71
+ paper: {
72
+ sx: {
73
+ width: ASSISTANT_WIDTH,
74
+ top: APP_BAR_HEIGHT,
75
+ height: `calc(100% - ${APP_BAR_HEIGHT}px)`,
76
+ p: 2,
77
+ boxSizing: 'border-box',
78
+ },
79
+ 'aria-label': 'Telemetry assistant',
80
+ },
81
+ }, children: [_jsx(DrawerHeader, { onClose: onClose }), children] }));
82
+ }
83
+ //# sourceMappingURL=AssistantContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantContainer.js","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantContainer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type AssistantMessage } from '../../headless/hooks/useTelemetryAssistant.js';
2
+ export declare const ASSISTANT_EXAMPLE_PROMPTS: readonly ["Are there any errors in the last hour?", "Why is the API slow?", "Is telemetry being ingested correctly?"];
3
+ export interface AssistantPanelProps {
4
+ messages: AssistantMessage[];
5
+ isStreaming: boolean;
6
+ onAsk: (question: string) => void;
7
+ onStop: () => void;
8
+ onInsert: (sql: string) => void;
9
+ onInsertAndRun: (sql: string) => void;
10
+ /** e.g. `openai · gpt-5-mini`, when the viewer may read the settings. */
11
+ modelCaption?: string | null;
12
+ /** Starts over: aborts any in-flight turn and forgets the conversation (#574). */
13
+ onNewChat?: () => void;
14
+ /**
15
+ * Prefills the question box — NOT sent; the reader edits it and presses Ask
16
+ * (#579, the dashboard's "Ask assistant"). Read when the panel mounts: a
17
+ * caller that prefills again gives the panel a new `key`.
18
+ */
19
+ initialQuestion?: string;
20
+ }
21
+ export declare function AssistantPanel({ messages, isStreaming, onAsk, onStop, onInsert, onInsertAndRun, modelCaption, onNewChat, initialQuestion, }: AssistantPanelProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=AssistantPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantPanel.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantPanel.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,+CAA+C,CAAC;AAmDvD,eAAO,MAAM,yBAAyB,uHAI5B,CAAC;AA0GX,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,SAAS,EACT,eAAe,GAChB,EAAE,mBAAmB,+BA4MrB"}
@@ -0,0 +1,150 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The Telemetry Explorer's assistant conversation — issue #537, epic #528;
4
+ * the troubleshooting agent — issue #571.
5
+ *
6
+ * A local renderer rather than `AiChatThread`: that thread renders the
7
+ * playground's `AiChatMessage` (text deltas, reasoning, hosted-tool output),
8
+ * while a telemetry turn is an investigation (TOOL STEPS, with the model's
9
+ * interim thoughts) plus one structured answer: an analysed report, or on an
10
+ * older API `{ sql, explanation }`. The look follows `AiChatThread` — user
11
+ * bubbles on the right, outlined assistant cards, a `role="log"` region, plain
12
+ * text only (nothing the model says is interpreted as HTML).
13
+ *
14
+ * "New chat" (issue #574) sits in the top row beside the model caption, so the
15
+ * desktop drawer and the phone dialog share it; it calls `onNewChat` (the
16
+ * hook's `clear()`, which aborts any in-flight turn) and empties the input.
17
+ */
18
+ import { useCallback, useEffect, useRef, useState } from 'react';
19
+ import { Alert, Box, Button, Chip, IconButton, Paper, Stack, TextField, Tooltip, Typography, useMediaQuery, useTheme, } from '@mui/material';
20
+ import StopIcon from '@mui/icons-material/Stop';
21
+ import SendIcon from '@mui/icons-material/Send';
22
+ import AddCommentOutlinedIcon from '@mui/icons-material/AddCommentOutlined';
23
+ import ContentCopyIcon from '@mui/icons-material/ContentCopy';
24
+ import CheckIcon from '@mui/icons-material/Check';
25
+ import DownloadIcon from '@mui/icons-material/Download';
26
+ import { ASSISTANT_QUESTION_MAX, } from '../../headless/hooks/useTelemetryAssistant.js';
27
+ import { AssistantTimeline } from './AssistantTimeline.js';
28
+ import { LegacyAnswer, ReportCard } from './AssistantReport.js';
29
+ import { assistantExportFilename, conversationToMarkdown, replyToMarkdown } from '../../headless/lib/assistantExport.js';
30
+ import { downloadBlob } from '../../headless/services/telemetry.js';
31
+ const COPY_FEEDBACK_MS = 2000;
32
+ const visuallyHidden = {
33
+ position: 'absolute',
34
+ width: 1,
35
+ height: 1,
36
+ overflow: 'hidden',
37
+ clip: 'rect(0 0 0 0)',
38
+ whiteSpace: 'nowrap',
39
+ };
40
+ /** Clipboard write with a 2s "Copied" / "Copy failed" feedback state. */
41
+ function useCopy() {
42
+ const [state, setState] = useState('idle');
43
+ const timer = useRef(null);
44
+ useEffect(() => () => {
45
+ if (timer.current)
46
+ clearTimeout(timer.current);
47
+ }, []);
48
+ const copy = useCallback(async (text) => {
49
+ let next;
50
+ try {
51
+ await navigator.clipboard.writeText(text);
52
+ next = 'copied';
53
+ }
54
+ catch {
55
+ next = 'failed';
56
+ }
57
+ setState(next);
58
+ if (timer.current)
59
+ clearTimeout(timer.current);
60
+ timer.current = setTimeout(() => setState('idle'), COPY_FEEDBACK_MS);
61
+ }, []);
62
+ return [state, copy];
63
+ }
64
+ function CopyStatus({ state }) {
65
+ return (_jsx(Box, { component: "span", role: "status", "aria-live": "polite", sx: visuallyHidden, children: state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed' : '' }));
66
+ }
67
+ export const ASSISTANT_EXAMPLE_PROMPTS = [
68
+ 'Are there any errors in the last hour?',
69
+ 'Why is the API slow?',
70
+ 'Is telemetry being ingested correctly?',
71
+ ];
72
+ function Reply({ message, onInsert, onInsertAndRun, }) {
73
+ const ref = useRef(null);
74
+ const hasAnswer = message.answer !== null;
75
+ // When the report lands, bring its top into view (not the bottom of a long
76
+ // report) — on a phone the summary is what matters first.
77
+ useEffect(() => {
78
+ if (hasAnswer)
79
+ ref.current?.scrollIntoView?.({ block: 'start' });
80
+ }, [hasAnswer]);
81
+ const answer = message.answer;
82
+ const [copyState, copy] = useCopy();
83
+ const canCopy = message.status !== 'streaming' && (message.answer !== null || message.error !== null);
84
+ return (_jsxs(Paper, { ref: ref, variant: "outlined", "data-testid": "assistant-reply", "data-status": message.status, "aria-busy": message.status === 'streaming', sx: { px: 1.5, py: 1, minWidth: 0, overflowWrap: 'anywhere' }, children: [_jsx(AssistantTimeline, { steps: message.steps, isInvestigating: message.status === 'streaming' && !answer, collapsible: hasAnswer }), answer && (_jsx(Box, { sx: { mt: message.steps.length > 0 ? 0.5 : 0 }, children: answer.report ? (_jsx(ReportCard, { report: answer.report, onInsert: onInsert, onInsertAndRun: onInsertAndRun })) : (_jsx(LegacyAnswer, { answer: answer, onInsert: onInsert, onInsertAndRun: onInsertAndRun })) })), message.error && (_jsxs(Alert, { severity: "error", sx: { mt: 1 }, children: [message.error.message, message.error.code && (_jsx(Typography, { variant: "caption", component: "div", children: message.error.code }))] })), message.status === 'stopped' && _jsx(Chip, { size: "small", label: "Stopped", sx: { mt: 1 } }), canCopy && (_jsxs(Box, { sx: { display: 'flex', justifyContent: 'flex-end', mt: 0.5 }, children: [_jsx(Tooltip, { title: copyState === 'copied' ? 'Copied' : copyState === 'failed' ? 'Copy failed' : 'Copy this reply', children: _jsx(IconButton, { size: "small", "aria-label": "Copy this reply", "data-testid": "assistant-copy-reply", color: copyState === 'failed' ? 'error' : 'default', onClick: () => void copy(replyToMarkdown(message)), children: copyState === 'copied' ? _jsx(CheckIcon, { fontSize: "small" }) : _jsx(ContentCopyIcon, { fontSize: "small" }) }) }), _jsx(CopyStatus, { state: copyState })] }))] }));
85
+ }
86
+ function EmptyState({ disabled, onAsk }) {
87
+ return (_jsxs(Box, { children: [_jsx(Typography, { variant: "body2", color: "text.secondary", children: "Describe a problem or ask a question. The assistant investigates on its own \u2014 it checks the app's configuration, overall health, errors and traces by running read-only queries \u2014 and reports what it found, the likely cause and what to do next." }), _jsx(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: 'wrap', mt: 1.5 }, children: ASSISTANT_EXAMPLE_PROMPTS.map((prompt) => (_jsx(Chip, { label: prompt, variant: "outlined", clickable: true, disabled: disabled, onClick: () => onAsk(prompt), sx: { maxWidth: '100%', height: 'auto', '& .MuiChip-label': { whiteSpace: 'normal', py: 0.5 } } }, prompt))) })] }));
88
+ }
89
+ export function AssistantPanel({ messages, isStreaming, onAsk, onStop, onInsert, onInsertAndRun, modelCaption, onNewChat, initialQuestion, }) {
90
+ const [question, setQuestion] = useState(() => (initialQuestion ?? '').slice(0, ASSISTANT_QUESTION_MAX));
91
+ const endRef = useRef(null);
92
+ const last = messages[messages.length - 1];
93
+ // Follow the investigation as it streams; once a reply has its answer, that
94
+ // reply scrolls its own top into view instead.
95
+ useEffect(() => {
96
+ if (last?.role === 'assistant' && last.answer)
97
+ return;
98
+ endRef.current?.scrollIntoView?.({ block: 'end' });
99
+ }, [messages.length, last]);
100
+ const submit = (event) => {
101
+ event?.preventDefault();
102
+ if (!question.trim() || isStreaming)
103
+ return;
104
+ onAsk(question);
105
+ setQuestion('');
106
+ };
107
+ const isCompact = useMediaQuery(useTheme().breakpoints.down('sm'));
108
+ const hasMessages = messages.length > 0;
109
+ const showNewChat = Boolean(onNewChat) && hasMessages;
110
+ const [copyState, copy] = useCopy();
111
+ const copyConversation = () => void copy(conversationToMarkdown(messages, { exportedAt: new Date(), modelCaption }));
112
+ const downloadConversation = () => {
113
+ const now = new Date();
114
+ const markdown = conversationToMarkdown(messages, { exportedAt: now, modelCaption });
115
+ downloadBlob(new Blob([markdown], { type: 'text/markdown;charset=utf-8' }), assistantExportFilename(now));
116
+ };
117
+ const copyLabel = copyState === 'copied' ? 'Copied' : copyState === 'failed' ? 'Copy failed' : 'Copy';
118
+ const copyIcon = copyState === 'copied' ? _jsx(CheckIcon, {}) : _jsx(ContentCopyIcon, {});
119
+ const newChat = () => {
120
+ setQuestion('');
121
+ onNewChat?.();
122
+ };
123
+ const onKeyDown = (event) => {
124
+ if (event.key === 'Enter' && !event.shiftKey) {
125
+ event.preventDefault();
126
+ submit();
127
+ }
128
+ };
129
+ return (_jsxs(Box, { sx: { display: 'flex', flexDirection: 'column', height: '100%', minHeight: 0 }, children: [(modelCaption || showNewChat || hasMessages) && (_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 1, minWidth: 0 }, children: [_jsx(Typography, { variant: "caption", color: "text.secondary", noWrap: true, title: modelCaption ?? undefined, sx: { flex: 1, minWidth: 0 }, "data-testid": modelCaption ? 'assistant-model' : undefined, children: modelCaption }), hasMessages && (_jsxs(_Fragment, { children: [isCompact ? (_jsxs(Box, { sx: { display: 'flex', flexShrink: 0 }, children: [_jsx(Tooltip, { title: copyLabel === 'Copy' ? 'Copy conversation' : copyLabel, children: _jsx("span", { children: _jsx(IconButton, { size: "small", "aria-label": "Copy conversation", "data-testid": "assistant-copy-conversation", disabled: isStreaming, color: copyState === 'failed' ? 'error' : 'default', onClick: copyConversation, children: copyIcon }) }) }), _jsx(Tooltip, { title: "Download conversation", children: _jsx("span", { children: _jsx(IconButton, { size: "small", "aria-label": "Download conversation", "data-testid": "assistant-download-conversation", disabled: isStreaming, onClick: downloadConversation, children: _jsx(DownloadIcon, {}) }) }) })] })) : (_jsxs(Box, { sx: { display: 'flex', flexShrink: 0 }, children: [_jsx(Button, { size: "small", startIcon: copyIcon, "aria-label": "Copy conversation", "data-testid": "assistant-copy-conversation", disabled: isStreaming, color: copyState === 'failed' ? 'error' : 'primary', onClick: copyConversation, children: copyLabel }), _jsx(Button, { size: "small", startIcon: _jsx(DownloadIcon, {}), "aria-label": "Download conversation", "data-testid": "assistant-download-conversation", disabled: isStreaming, onClick: downloadConversation, children: "Download" })] })), _jsx(CopyStatus, { state: copyState })] })), showNewChat && (_jsx(Button, { size: "small", onClick: newChat, startIcon: _jsx(AddCommentOutlinedIcon, {}), "aria-label": "Start a new chat", "data-testid": "assistant-new-chat", sx: { flexShrink: 0 }, children: "New chat" }))] })), _jsxs(Box, { role: "log", "aria-label": "Assistant conversation", "aria-live": "polite", sx: {
130
+ flex: 1,
131
+ overflowY: 'auto',
132
+ overflowX: 'hidden',
133
+ display: 'flex',
134
+ flexDirection: 'column',
135
+ gap: 1.5,
136
+ minHeight: 0,
137
+ minWidth: 0,
138
+ pb: 1,
139
+ }, children: [messages.length === 0 && _jsx(EmptyState, { disabled: isStreaming, onAsk: onAsk }), messages.map((message) => message.role === 'user' ? (_jsx(Paper, { elevation: 0, "data-testid": "assistant-question", sx: {
140
+ alignSelf: 'flex-end',
141
+ maxWidth: '90%',
142
+ px: 1.5,
143
+ py: 1,
144
+ bgcolor: 'primary.main',
145
+ color: 'primary.contrastText',
146
+ whiteSpace: 'pre-wrap',
147
+ wordBreak: 'break-word',
148
+ }, children: message.text }, message.id)) : (_jsx(Reply, { message: message, onInsert: onInsert, onInsertAndRun: onInsertAndRun }, message.id))), _jsx("div", { ref: endRef })] }), _jsxs(Box, { component: "form", onSubmit: submit, sx: { pt: 1, display: 'flex', gap: 1, alignItems: 'flex-end' }, children: [_jsx(TextField, { fullWidth: true, multiline: true, maxRows: 6, autoFocus: Boolean(initialQuestion), size: "small", placeholder: "Describe a problem or ask a question\u2026", value: question, onChange: (event) => setQuestion(event.target.value), onKeyDown: onKeyDown, slotProps: { htmlInput: { 'aria-label': 'Ask the assistant', maxLength: ASSISTANT_QUESTION_MAX } } }), isStreaming ? (_jsx(Button, { variant: "outlined", color: "inherit", onClick: onStop, startIcon: _jsx(StopIcon, {}), children: "Stop" })) : (_jsx(Button, { type: "submit", variant: "contained", disabled: !question.trim(), startIcon: _jsx(SendIcon, {}), children: "Ask" }))] })] }));
149
+ }
150
+ //# sourceMappingURL=AssistantPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantPanel.js","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { TelemetryAssistantAnswer, TelemetryAssistantReport } from '../../headless/services/telemetry.js';
2
+ export interface SqlActions {
3
+ onInsert: (sql: string) => void;
4
+ onInsertAndRun: (sql: string) => void;
5
+ }
6
+ /** The pre-#571 answer: the explanation, and the one SQL block when there is one. */
7
+ export declare function LegacyAnswer({ answer, onInsert, onInsertAndRun }: {
8
+ answer: TelemetryAssistantAnswer;
9
+ } & SqlActions): import("react").JSX.Element;
10
+ export declare function ReportCard({ report, onInsert, onInsertAndRun }: {
11
+ report: TelemetryAssistantReport;
12
+ } & SqlActions): import("react").JSX.Element;
13
+ //# sourceMappingURL=AssistantReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantReport.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantReport.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EAIzB,MAAM,sCAAsC,CAAC;AA2B9C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AA8CD,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE;IAAE,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAAG,UAAU,+BAcnH;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE;IAAE,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAAG,UAAU,+BA0JjH"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The troubleshooting agent's analysed report — issue #571.
4
+ *
5
+ * `ReportCard` renders `answer.report`: a status and confidence, the summary,
6
+ * findings with severity, the likely root cause, numbered next steps, and the
7
+ * supporting queries (collapsed SQL with Insert / Insert & run). `LegacyAnswer`
8
+ * is the pre-#571 rendering (explanation + one SQL block), used whenever the
9
+ * API sent no report (an older API, or a model reply that did not parse).
10
+ *
11
+ * Plain text only: every string here came from a model and is rendered as a
12
+ * React text node, never as HTML or markdown. Mobile-first: chips wrap, long
13
+ * words break, and SQL scrolls inside its own box.
14
+ */
15
+ import { useEffect, useRef, useState } from 'react';
16
+ import { Accordion, AccordionDetails, AccordionSummary, Box, Button, Chip, Link, Stack, Typography, } from '@mui/material';
17
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
18
+ const STATUS_CHIPS = {
19
+ issue_found: { label: 'Issue found', color: 'error' },
20
+ no_issue_found: { label: 'No issue found', color: 'success' },
21
+ inconclusive: { label: 'Inconclusive', color: 'warning' },
22
+ no_data: { label: 'No data', color: 'default' },
23
+ };
24
+ const SEVERITY_COLORS = {
25
+ critical: 'error',
26
+ high: 'error',
27
+ medium: 'warning',
28
+ low: 'info',
29
+ info: 'default',
30
+ };
31
+ const CONFIDENCE_LABELS = {
32
+ high: 'High confidence',
33
+ medium: 'Medium confidence',
34
+ low: 'Low confidence',
35
+ };
36
+ const TEXT_SX = { whiteSpace: 'pre-wrap', wordBreak: 'break-word' };
37
+ function SqlBlock({ sql, testId }) {
38
+ return (_jsx(Box, { component: "pre", "data-testid": testId, sx: {
39
+ m: 0,
40
+ p: 1,
41
+ borderRadius: 1,
42
+ bgcolor: 'action.hover',
43
+ fontFamily: 'monospace',
44
+ fontSize: 12,
45
+ whiteSpace: 'pre-wrap',
46
+ wordBreak: 'break-word',
47
+ maxHeight: 240,
48
+ overflow: 'auto',
49
+ }, children: sql }));
50
+ }
51
+ function QueryButtons({ sql, onInsert, onInsertAndRun }) {
52
+ return (_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { mt: 1, flexWrap: 'wrap' }, children: [_jsx(Button, { size: "small", onClick: () => onInsert(sql), children: "Insert into editor" }), _jsx(Button, { size: "small", variant: "outlined", onClick: () => onInsertAndRun(sql), children: "Insert & run" })] }));
53
+ }
54
+ function SectionHeading({ children }) {
55
+ return (_jsx(Typography, { variant: "subtitle2", component: "h3", sx: { mt: 1.5, mb: 0.5 }, children: children }));
56
+ }
57
+ /** The pre-#571 answer: the explanation, and the one SQL block when there is one. */
58
+ export function LegacyAnswer({ answer, onInsert, onInsertAndRun }) {
59
+ return (_jsxs(_Fragment, { children: [_jsx(Typography, { variant: "body2", component: "div", "data-testid": "assistant-explanation", sx: TEXT_SX, children: answer.explanation }), answer.sql && (_jsxs(Box, { sx: { mt: 1 }, children: [_jsx(SqlBlock, { sql: answer.sql, testId: "assistant-sql" }), _jsx(QueryButtons, { sql: answer.sql, onInsert: onInsert, onInsertAndRun: onInsertAndRun })] }))] }));
60
+ }
61
+ export function ReportCard({ report, onInsert, onInsertAndRun }) {
62
+ const status = STATUS_CHIPS[report.status] ?? { label: report.status, color: 'default' };
63
+ const [expanded, setExpanded] = useState(() => new Set());
64
+ const [scrollTarget, setScrollTarget] = useState(null);
65
+ const queryRefs = useRef([]);
66
+ useEffect(() => {
67
+ if (scrollTarget === null)
68
+ return;
69
+ queryRefs.current[scrollTarget]?.scrollIntoView?.({ block: 'nearest', behavior: 'smooth' });
70
+ setScrollTarget(null);
71
+ }, [scrollTarget]);
72
+ const setQueryExpanded = (index, open) => setExpanded((prev) => {
73
+ const next = new Set(prev);
74
+ if (open)
75
+ next.add(index);
76
+ else
77
+ next.delete(index);
78
+ return next;
79
+ });
80
+ const viewQuery = (index) => {
81
+ setQueryExpanded(index, true);
82
+ setScrollTarget(index);
83
+ };
84
+ const hasQuery = (index) => typeof index === 'number' && Number.isInteger(index) && index >= 0 && index < report.queries.length;
85
+ return (_jsxs(Box, { "data-testid": "assistant-report", sx: { minWidth: 0 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { flexWrap: 'wrap', mb: 1 }, children: [_jsx(Chip, { size: "small", label: status.label, color: status.color, "data-testid": "assistant-report-status", "data-status": report.status }), _jsx(Chip, { size: "small", variant: "outlined", label: CONFIDENCE_LABELS[report.confidence] ?? report.confidence })] }), _jsx(Typography, { variant: "body2", component: "div", "data-testid": "assistant-explanation", sx: TEXT_SX, children: report.summary }), report.findings.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionHeading, { children: "Findings" }), _jsx(Stack, { component: "ul", spacing: 1, sx: { listStyle: 'none', m: 0, p: 0 }, children: report.findings.map((finding, i) => (_jsxs(Box, { component: "li", "data-testid": "assistant-finding", "data-severity": finding.severity, sx: { minWidth: 0 }, children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [_jsx(Chip, { size: "small", label: finding.severity, color: SEVERITY_COLORS[finding.severity] ?? 'default', sx: { textTransform: 'capitalize' } }), _jsx(Typography, { variant: "body2", component: "span", sx: { fontWeight: 600, ...TEXT_SX, minWidth: 0 }, children: finding.title })] }), finding.evidence && (_jsx(Typography, { variant: "body2", color: "text.secondary", component: "div", sx: { mt: 0.25, ...TEXT_SX }, children: finding.evidence })), hasQuery(finding.queryIndex) && (_jsx(Link, { component: "button", type: "button", variant: "caption", onClick: () => viewQuery(finding.queryIndex), sx: { mt: 0.25 }, children: "View query" }))] }, i))) })] })), report.rootCause && (_jsxs(_Fragment, { children: [_jsx(SectionHeading, { children: "Likely root cause" }), _jsx(Typography, { variant: "body2", component: "div", "data-testid": "assistant-root-cause", sx: TEXT_SX, children: report.rootCause })] })), report.recommendations.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionHeading, { children: "Recommended next steps" }), _jsx(Box, { component: "ol", sx: { m: 0, pl: 2.5 }, children: report.recommendations.map((item, i) => (_jsx(Typography, { component: "li", variant: "body2", "data-testid": "assistant-recommendation", sx: { ...TEXT_SX, mb: 0.25 }, children: item }, i))) })] })), report.queries.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionHeading, { children: "Supporting queries" }), _jsx(Stack, { spacing: 0.75, children: report.queries.map((query, i) => (_jsxs(Accordion, { ref: (el) => {
86
+ queryRefs.current[i] = el;
87
+ }, "data-testid": "assistant-query", variant: "outlined", disableGutters: true, expanded: expanded.has(i), onChange: (_, open) => setQueryExpanded(i, open), sx: { '&::before': { display: 'none' }, minWidth: 0 }, children: [_jsx(AccordionSummary, { expandIcon: _jsx(ExpandMoreIcon, {}), sx: { minHeight: 40, px: 1, '& .MuiAccordionSummary-content': { my: 0.75, minWidth: 0 } }, children: _jsx(Typography, { variant: "body2", sx: TEXT_SX, children: query.title || `Query ${i + 1}` }) }), _jsxs(AccordionDetails, { sx: { px: 1, pt: 0, pb: 1 }, children: [_jsx(SqlBlock, { sql: query.sql, testId: i === 0 ? 'assistant-sql' : undefined }), _jsx(QueryButtons, { sql: query.sql, onInsert: onInsert, onInsertAndRun: onInsertAndRun })] })] }, i))) })] }))] }));
88
+ }
89
+ //# sourceMappingURL=AssistantReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantReport.js","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantReport.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TelemetryAssistantStep } from '../../headless/services/telemetry.js';
2
+ export interface AssistantTimelineProps {
3
+ steps: TelemetryAssistantStep[];
4
+ /** The turn is still streaming (no answer yet). */
5
+ isInvestigating: boolean;
6
+ /** An answer arrived: collapse the steps behind a toggle. */
7
+ collapsible: boolean;
8
+ }
9
+ export declare function AssistantTimeline({ steps, isInvestigating, collapsible }: AssistantTimelineProps): import("react").JSX.Element | null;
10
+ //# sourceMappingURL=AssistantTimeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantTimeline.d.ts","sourceRoot":"","sources":["../../../../src/telemetry/ui/components/AssistantTimeline.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAgGnF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,mDAAmD;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,sBAAsB,sCAuDhG"}