@sqlrooms/mosaic 0.29.0-rc.7 → 0.29.0-rc.9

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 (572) hide show
  1. package/LICENSE.md +2 -1
  2. package/README.md +179 -35
  3. package/dist/MosaicSlice.d.ts +1 -0
  4. package/dist/MosaicSlice.d.ts.map +1 -1
  5. package/dist/MosaicSlice.js.map +1 -1
  6. package/dist/VgPlotChart.d.ts.map +1 -1
  7. package/dist/VgPlotChart.js +9 -3
  8. package/dist/VgPlotChart.js.map +1 -1
  9. package/dist/ai/agentIntent.d.ts +5 -0
  10. package/dist/ai/agentIntent.d.ts.map +1 -0
  11. package/dist/ai/agentIntent.js +8 -0
  12. package/dist/ai/agentIntent.js.map +1 -0
  13. package/dist/ai/block-document/constants.d.ts +9 -0
  14. package/dist/ai/block-document/constants.d.ts.map +1 -0
  15. package/dist/ai/block-document/constants.js +9 -0
  16. package/dist/ai/block-document/constants.js.map +1 -0
  17. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.d.ts +48 -0
  18. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.d.ts.map +1 -0
  19. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.js +59 -0
  20. package/dist/ai/block-document/createAddMosaicDashboardBlockTool.js.map +1 -0
  21. package/dist/ai/block-document/createBlockDocumentChartTools.d.ts +19 -0
  22. package/dist/ai/block-document/createBlockDocumentChartTools.d.ts.map +1 -0
  23. package/dist/ai/block-document/createBlockDocumentChartTools.js +37 -0
  24. package/dist/ai/block-document/createBlockDocumentChartTools.js.map +1 -0
  25. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.d.ts +32 -0
  26. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.d.ts.map +1 -0
  27. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.js +37 -0
  28. package/dist/ai/block-document/createBlockDocumentDataTableExplorerTool.js.map +1 -0
  29. package/dist/ai/constants.d.ts +3 -0
  30. package/dist/ai/constants.d.ts.map +1 -0
  31. package/dist/ai/constants.js +3 -0
  32. package/dist/ai/constants.js.map +1 -0
  33. package/dist/ai/createDataTableExplorerTool.d.ts +69 -0
  34. package/dist/ai/createDataTableExplorerTool.d.ts.map +1 -0
  35. package/dist/ai/createDataTableExplorerTool.js +68 -0
  36. package/dist/ai/createDataTableExplorerTool.js.map +1 -0
  37. package/dist/ai/dashboard/constants.d.ts +6 -0
  38. package/dist/ai/dashboard/constants.d.ts.map +1 -0
  39. package/dist/ai/dashboard/constants.js +6 -0
  40. package/dist/ai/dashboard/constants.js.map +1 -0
  41. package/dist/ai/dashboard/createDashboardAgentTool.d.ts +17 -0
  42. package/dist/ai/dashboard/createDashboardAgentTool.d.ts.map +1 -0
  43. package/dist/ai/dashboard/createDashboardAgentTool.js +205 -0
  44. package/dist/ai/dashboard/createDashboardAgentTool.js.map +1 -0
  45. package/dist/ai/dashboard/createDashboardAiAdapter.d.ts +14 -0
  46. package/dist/ai/dashboard/createDashboardAiAdapter.d.ts.map +1 -0
  47. package/dist/ai/dashboard/createDashboardAiAdapter.js +75 -0
  48. package/dist/ai/dashboard/createDashboardAiAdapter.js.map +1 -0
  49. package/dist/ai/dashboard/createDashboardAiTools.d.ts +26 -0
  50. package/dist/ai/dashboard/createDashboardAiTools.d.ts.map +1 -0
  51. package/dist/ai/dashboard/createDashboardAiTools.js +40 -0
  52. package/dist/ai/dashboard/createDashboardAiTools.js.map +1 -0
  53. package/dist/ai/dashboard/createDashboardChartTools.d.ts +27 -0
  54. package/dist/ai/dashboard/createDashboardChartTools.d.ts.map +1 -0
  55. package/dist/ai/dashboard/createDashboardChartTools.js +55 -0
  56. package/dist/ai/dashboard/createDashboardChartTools.js.map +1 -0
  57. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.d.ts +23 -0
  58. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.d.ts.map +1 -0
  59. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.js +29 -0
  60. package/dist/ai/dashboard/createDashboardDataTableExplorerTool.js.map +1 -0
  61. package/dist/ai/dashboard/createListDashboardPanelsTool.d.ts +28 -0
  62. package/dist/ai/dashboard/createListDashboardPanelsTool.d.ts.map +1 -0
  63. package/dist/ai/dashboard/createListDashboardPanelsTool.js +54 -0
  64. package/dist/ai/dashboard/createListDashboardPanelsTool.js.map +1 -0
  65. package/dist/ai/dashboard/dashboard-types.d.ts +59 -0
  66. package/dist/ai/dashboard/dashboard-types.d.ts.map +1 -0
  67. package/dist/ai/dashboard/dashboard-types.js +2 -0
  68. package/dist/ai/dashboard/dashboard-types.js.map +1 -0
  69. package/dist/ai/database-types.d.ts +12 -0
  70. package/dist/ai/database-types.d.ts.map +1 -0
  71. package/dist/ai/database-types.js +2 -0
  72. package/dist/ai/database-types.js.map +1 -0
  73. package/dist/ai/errors.d.ts +8 -0
  74. package/dist/ai/errors.d.ts.map +1 -0
  75. package/dist/ai/errors.js +11 -0
  76. package/dist/ai/errors.js.map +1 -0
  77. package/dist/ai/tool-helpers.d.ts +28 -29
  78. package/dist/ai/tool-helpers.d.ts.map +1 -1
  79. package/dist/ai/tool-helpers.js +38 -76
  80. package/dist/ai/tool-helpers.js.map +1 -1
  81. package/dist/ai/tool-schemas.d.ts +9 -4
  82. package/dist/ai/tool-schemas.d.ts.map +1 -1
  83. package/dist/ai/tool-schemas.js +12 -12
  84. package/dist/ai/tool-schemas.js.map +1 -1
  85. package/dist/ai/tool-types.d.ts +19 -1
  86. package/dist/ai/tool-types.d.ts.map +1 -1
  87. package/dist/ai/tool-types.js.map +1 -1
  88. package/dist/ai/types.d.ts +64 -0
  89. package/dist/ai/types.d.ts.map +1 -0
  90. package/dist/ai/types.js +2 -0
  91. package/dist/ai/types.js.map +1 -0
  92. package/dist/ai.d.ts +16 -2
  93. package/dist/ai.d.ts.map +1 -1
  94. package/dist/ai.js +14 -5
  95. package/dist/ai.js.map +1 -1
  96. package/dist/charts/MosaicChart.d.ts +3 -1
  97. package/dist/charts/MosaicChart.d.ts.map +1 -1
  98. package/dist/charts/MosaicChart.js +2 -2
  99. package/dist/charts/MosaicChart.js.map +1 -1
  100. package/dist/charts/MosaicChartError.d.ts +8 -2
  101. package/dist/charts/MosaicChartError.d.ts.map +1 -1
  102. package/dist/charts/MosaicChartError.js +29 -3
  103. package/dist/charts/MosaicChartError.js.map +1 -1
  104. package/dist/charts/MosaicChartSettingsButton.d.ts +15 -0
  105. package/dist/charts/MosaicChartSettingsButton.d.ts.map +1 -0
  106. package/dist/charts/MosaicChartSettingsButton.js +7 -0
  107. package/dist/charts/MosaicChartSettingsButton.js.map +1 -0
  108. package/dist/charts/MosaicChartView.d.ts +2 -0
  109. package/dist/charts/MosaicChartView.d.ts.map +1 -1
  110. package/dist/charts/MosaicChartView.js +19 -7
  111. package/dist/charts/MosaicChartView.js.map +1 -1
  112. package/dist/charts/chart-settings/MosaicChartSettings.d.ts.map +1 -1
  113. package/dist/charts/chart-settings/MosaicChartSettings.js +3 -3
  114. package/dist/charts/chart-settings/MosaicChartSettings.js.map +1 -1
  115. package/dist/charts/chart-settings/MosaicChartSettingsPanel.js +1 -1
  116. package/dist/charts/chart-settings/MosaicChartSettingsPanel.js.map +1 -1
  117. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.d.ts.map +1 -1
  118. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.js +2 -1
  119. package/dist/charts/chart-settings/MosaicChartSpecViewerPanel.js.map +1 -1
  120. package/dist/charts/chart-settings/MosaicChartTypeSelector.d.ts.map +1 -1
  121. package/dist/charts/chart-settings/MosaicChartTypeSelector.js +3 -3
  122. package/dist/charts/chart-settings/MosaicChartTypeSelector.js.map +1 -1
  123. package/dist/charts/chart-types/base-types.d.ts +40 -25
  124. package/dist/charts/chart-types/base-types.d.ts.map +1 -1
  125. package/dist/charts/chart-types/base-types.js +5 -0
  126. package/dist/charts/chart-types/base-types.js.map +1 -1
  127. package/dist/charts/chart-types/box-plot/definition.d.ts.map +1 -1
  128. package/dist/charts/chart-types/box-plot/definition.js +1 -0
  129. package/dist/charts/chart-types/box-plot/definition.js.map +1 -1
  130. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts +37 -3
  131. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.d.ts.map +1 -1
  132. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js +28 -13
  133. package/dist/charts/chart-types/box-plot/renderer/BoxPlotClient.js.map +1 -1
  134. package/dist/charts/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js +2 -2
  135. package/dist/charts/chart-types/box-plot/renderer/BoxPlotPanelRenderer.js.map +1 -1
  136. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.d.ts +12 -1
  137. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.d.ts.map +1 -1
  138. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.js +13 -3
  139. package/dist/charts/chart-types/box-plot/renderer/useBoxPlotClient.js.map +1 -1
  140. package/dist/charts/chart-types/box-plot/tool.d.ts +20 -24
  141. package/dist/charts/chart-types/box-plot/tool.d.ts.map +1 -1
  142. package/dist/charts/chart-types/box-plot/tool.js +25 -33
  143. package/dist/charts/chart-types/box-plot/tool.js.map +1 -1
  144. package/dist/charts/chart-types/box-plot/validation.d.ts +9 -0
  145. package/dist/charts/chart-types/box-plot/validation.d.ts.map +1 -0
  146. package/dist/charts/chart-types/box-plot/validation.js +32 -0
  147. package/dist/charts/chart-types/box-plot/validation.js.map +1 -0
  148. package/dist/charts/chart-types/chart-config.d.ts +3 -1
  149. package/dist/charts/chart-types/chart-config.d.ts.map +1 -1
  150. package/dist/charts/chart-types/chart-config.js +2 -2
  151. package/dist/charts/chart-types/chart-config.js.map +1 -1
  152. package/dist/charts/chart-types/column-types.d.ts +8 -0
  153. package/dist/charts/chart-types/column-types.d.ts.map +1 -0
  154. package/dist/charts/chart-types/column-types.js +2 -0
  155. package/dist/charts/chart-types/column-types.js.map +1 -0
  156. package/dist/charts/chart-types/count-plot/definition.d.ts.map +1 -1
  157. package/dist/charts/chart-types/count-plot/definition.js +1 -0
  158. package/dist/charts/chart-types/count-plot/definition.js.map +1 -1
  159. package/dist/charts/chart-types/count-plot/spec.d.ts +2 -1
  160. package/dist/charts/chart-types/count-plot/spec.d.ts.map +1 -1
  161. package/dist/charts/chart-types/count-plot/spec.js +47 -34
  162. package/dist/charts/chart-types/count-plot/spec.js.map +1 -1
  163. package/dist/charts/chart-types/count-plot/tool.d.ts +19 -24
  164. package/dist/charts/chart-types/count-plot/tool.d.ts.map +1 -1
  165. package/dist/charts/chart-types/count-plot/tool.js +26 -33
  166. package/dist/charts/chart-types/count-plot/tool.js.map +1 -1
  167. package/dist/charts/chart-types/count-plot/validation.d.ts +8 -0
  168. package/dist/charts/chart-types/count-plot/validation.d.ts.map +1 -0
  169. package/dist/charts/chart-types/count-plot/validation.js +20 -0
  170. package/dist/charts/chart-types/count-plot/validation.js.map +1 -0
  171. package/dist/charts/chart-types/createChartInstructions.d.ts +3 -0
  172. package/dist/charts/chart-types/createChartInstructions.d.ts.map +1 -0
  173. package/dist/charts/chart-types/createChartInstructions.js +12 -0
  174. package/dist/charts/chart-types/createChartInstructions.js.map +1 -0
  175. package/dist/charts/chart-types/createChartTools.d.ts +15 -9
  176. package/dist/charts/chart-types/createChartTools.d.ts.map +1 -1
  177. package/dist/charts/chart-types/createChartTools.js +16 -10
  178. package/dist/charts/chart-types/createChartTools.js.map +1 -1
  179. package/dist/charts/chart-types/createDefaultChartTypes.js +2 -2
  180. package/dist/charts/chart-types/createDefaultChartTypes.js.map +1 -1
  181. package/dist/charts/chart-types/custom-spec/definition.d.ts.map +1 -1
  182. package/dist/charts/chart-types/custom-spec/definition.js +1 -0
  183. package/dist/charts/chart-types/custom-spec/definition.js.map +1 -1
  184. package/dist/charts/chart-types/custom-spec/spec.d.ts +2 -1
  185. package/dist/charts/chart-types/custom-spec/spec.d.ts.map +1 -1
  186. package/dist/charts/chart-types/custom-spec/spec.js +16 -12
  187. package/dist/charts/chart-types/custom-spec/spec.js.map +1 -1
  188. package/dist/charts/chart-types/errors.d.ts +35 -0
  189. package/dist/charts/chart-types/errors.d.ts.map +1 -1
  190. package/dist/charts/chart-types/errors.js +56 -0
  191. package/dist/charts/chart-types/errors.js.map +1 -1
  192. package/dist/charts/chart-types/heatmap/definition.d.ts.map +1 -1
  193. package/dist/charts/chart-types/heatmap/definition.js +1 -0
  194. package/dist/charts/chart-types/heatmap/definition.js.map +1 -1
  195. package/dist/charts/chart-types/heatmap/spec.d.ts +2 -1
  196. package/dist/charts/chart-types/heatmap/spec.d.ts.map +1 -1
  197. package/dist/charts/chart-types/heatmap/spec.js +21 -21
  198. package/dist/charts/chart-types/heatmap/spec.js.map +1 -1
  199. package/dist/charts/chart-types/heatmap/tool.d.ts +20 -24
  200. package/dist/charts/chart-types/heatmap/tool.d.ts.map +1 -1
  201. package/dist/charts/chart-types/heatmap/tool.js +27 -37
  202. package/dist/charts/chart-types/heatmap/tool.js.map +1 -1
  203. package/dist/charts/chart-types/heatmap/validation.d.ts +9 -0
  204. package/dist/charts/chart-types/heatmap/validation.d.ts.map +1 -0
  205. package/dist/charts/chart-types/heatmap/validation.js +34 -0
  206. package/dist/charts/chart-types/heatmap/validation.js.map +1 -0
  207. package/dist/charts/chart-types/histogram/HistogramSettings.d.ts.map +1 -1
  208. package/dist/charts/chart-types/histogram/HistogramSettings.js +3 -1
  209. package/dist/charts/chart-types/histogram/HistogramSettings.js.map +1 -1
  210. package/dist/charts/chart-types/histogram/definition.d.ts.map +1 -1
  211. package/dist/charts/chart-types/histogram/definition.js +1 -0
  212. package/dist/charts/chart-types/histogram/definition.js.map +1 -1
  213. package/dist/charts/chart-types/histogram/schema.d.ts +2 -0
  214. package/dist/charts/chart-types/histogram/schema.d.ts.map +1 -1
  215. package/dist/charts/chart-types/histogram/schema.js +1 -0
  216. package/dist/charts/chart-types/histogram/schema.js.map +1 -1
  217. package/dist/charts/chart-types/histogram/spec.d.ts +2 -1
  218. package/dist/charts/chart-types/histogram/spec.d.ts.map +1 -1
  219. package/dist/charts/chart-types/histogram/spec.js +31 -28
  220. package/dist/charts/chart-types/histogram/spec.js.map +1 -1
  221. package/dist/charts/chart-types/histogram/tool.d.ts +39 -24
  222. package/dist/charts/chart-types/histogram/tool.d.ts.map +1 -1
  223. package/dist/charts/chart-types/histogram/tool.js +39 -33
  224. package/dist/charts/chart-types/histogram/tool.js.map +1 -1
  225. package/dist/charts/chart-types/histogram/validation.d.ts +9 -0
  226. package/dist/charts/chart-types/histogram/validation.d.ts.map +1 -0
  227. package/dist/charts/chart-types/histogram/validation.js +22 -0
  228. package/dist/charts/chart-types/histogram/validation.js.map +1 -0
  229. package/dist/charts/chart-types/index.d.ts +5 -11
  230. package/dist/charts/chart-types/index.d.ts.map +1 -1
  231. package/dist/charts/chart-types/index.js +6 -12
  232. package/dist/charts/chart-types/index.js.map +1 -1
  233. package/dist/charts/chart-types/line-chart/LineChartSettings.d.ts.map +1 -1
  234. package/dist/charts/chart-types/line-chart/LineChartSettings.js +4 -13
  235. package/dist/charts/chart-types/line-chart/LineChartSettings.js.map +1 -1
  236. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts +7 -0
  237. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.d.ts.map +1 -0
  238. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js +22 -0
  239. package/dist/charts/chart-types/line-chart/LineChartXFieldSelector.js.map +1 -0
  240. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts +7 -0
  241. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.d.ts.map +1 -0
  242. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js +42 -0
  243. package/dist/charts/chart-types/line-chart/LineChartYFieldsSelector.js.map +1 -0
  244. package/dist/charts/chart-types/line-chart/definition.d.ts.map +1 -1
  245. package/dist/charts/chart-types/line-chart/definition.js +1 -0
  246. package/dist/charts/chart-types/line-chart/definition.js.map +1 -1
  247. package/dist/charts/chart-types/line-chart/schema.d.ts +2 -0
  248. package/dist/charts/chart-types/line-chart/schema.d.ts.map +1 -1
  249. package/dist/charts/chart-types/line-chart/schema.js +5 -0
  250. package/dist/charts/chart-types/line-chart/schema.js.map +1 -1
  251. package/dist/charts/chart-types/line-chart/spec.d.ts +2 -1
  252. package/dist/charts/chart-types/line-chart/spec.d.ts.map +1 -1
  253. package/dist/charts/chart-types/line-chart/spec.js +56 -65
  254. package/dist/charts/chart-types/line-chart/spec.js.map +1 -1
  255. package/dist/charts/chart-types/line-chart/tool.d.ts +28 -24
  256. package/dist/charts/chart-types/line-chart/tool.d.ts.map +1 -1
  257. package/dist/charts/chart-types/line-chart/tool.js +27 -39
  258. package/dist/charts/chart-types/line-chart/tool.js.map +1 -1
  259. package/dist/charts/chart-types/line-chart/utils.d.ts +7 -0
  260. package/dist/charts/chart-types/line-chart/utils.d.ts.map +1 -0
  261. package/dist/charts/chart-types/line-chart/utils.js +17 -0
  262. package/dist/charts/chart-types/line-chart/utils.js.map +1 -0
  263. package/dist/charts/chart-types/line-chart/validation.d.ts +16 -0
  264. package/dist/charts/chart-types/line-chart/validation.d.ts.map +1 -0
  265. package/dist/charts/chart-types/line-chart/validation.js +43 -0
  266. package/dist/charts/chart-types/line-chart/validation.js.map +1 -0
  267. package/dist/charts/chart-types/mosaicChartTypes.d.ts +4 -2
  268. package/dist/charts/chart-types/mosaicChartTypes.d.ts.map +1 -1
  269. package/dist/charts/chart-types/mosaicChartTypes.js +2 -2
  270. package/dist/charts/chart-types/mosaicChartTypes.js.map +1 -1
  271. package/dist/charts/chart-types/resolveChartTypes.d.ts +3 -0
  272. package/dist/charts/chart-types/resolveChartTypes.d.ts.map +1 -0
  273. package/dist/charts/chart-types/resolveChartTypes.js +8 -0
  274. package/dist/charts/chart-types/resolveChartTypes.js.map +1 -0
  275. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts +3 -0
  276. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.d.ts.map +1 -0
  277. package/dist/charts/chart-types/{bubble-chart/BubbleChartSettings.js → scatter-plot/ScatterPlotSettings.js} +4 -4
  278. package/dist/charts/chart-types/scatter-plot/ScatterPlotSettings.js.map +1 -0
  279. package/dist/charts/chart-types/scatter-plot/definition.d.ts +4 -0
  280. package/dist/charts/chart-types/scatter-plot/definition.d.ts.map +1 -0
  281. package/dist/charts/chart-types/scatter-plot/definition.js +25 -0
  282. package/dist/charts/chart-types/scatter-plot/definition.js.map +1 -0
  283. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.d.ts +5 -5
  284. package/dist/charts/chart-types/scatter-plot/schema.d.ts.map +1 -0
  285. package/dist/charts/chart-types/{bubble-chart → scatter-plot}/schema.js +5 -5
  286. package/dist/charts/chart-types/scatter-plot/schema.js.map +1 -0
  287. package/dist/charts/chart-types/scatter-plot/spec.d.ts +5 -0
  288. package/dist/charts/chart-types/scatter-plot/spec.d.ts.map +1 -0
  289. package/dist/charts/chart-types/scatter-plot/spec.js +37 -0
  290. package/dist/charts/chart-types/scatter-plot/spec.js.map +1 -0
  291. package/dist/charts/chart-types/scatter-plot/tool.d.ts +39 -0
  292. package/dist/charts/chart-types/scatter-plot/tool.d.ts.map +1 -0
  293. package/dist/charts/chart-types/scatter-plot/tool.js +57 -0
  294. package/dist/charts/chart-types/scatter-plot/tool.js.map +1 -0
  295. package/dist/charts/chart-types/scatter-plot/validation.d.ts +13 -0
  296. package/dist/charts/chart-types/scatter-plot/validation.d.ts.map +1 -0
  297. package/dist/charts/chart-types/scatter-plot/validation.js +52 -0
  298. package/dist/charts/chart-types/scatter-plot/validation.js.map +1 -0
  299. package/dist/charts/chart-types/tool-types.d.ts +43 -0
  300. package/dist/charts/chart-types/tool-types.d.ts.map +1 -0
  301. package/dist/charts/chart-types/tool-types.js +2 -0
  302. package/dist/charts/chart-types/tool-types.js.map +1 -0
  303. package/dist/charts/chart-types/utils.d.ts +3 -0
  304. package/dist/charts/chart-types/utils.d.ts.map +1 -0
  305. package/dist/charts/chart-types/utils.js +4 -0
  306. package/dist/charts/chart-types/utils.js.map +1 -0
  307. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.d.ts.map +1 -1
  308. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js +12 -5
  309. package/dist/charts/dashboard/MosaicDashboardChartHeaderActions.js.map +1 -1
  310. package/dist/charts/dashboard/MosaicDashboardChartRenderer.d.ts.map +1 -1
  311. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js +6 -4
  312. package/dist/charts/dashboard/MosaicDashboardChartRenderer.js.map +1 -1
  313. package/dist/charts/useChartDataPolicy.d.ts.map +1 -1
  314. package/dist/charts/useChartDataPolicy.js +2 -1
  315. package/dist/charts/useChartDataPolicy.js.map +1 -1
  316. package/dist/charts/useChartPanelClients.d.ts +8 -0
  317. package/dist/charts/useChartPanelClients.d.ts.map +1 -0
  318. package/dist/charts/useChartPanelClients.js +22 -0
  319. package/dist/charts/useChartPanelClients.js.map +1 -0
  320. package/dist/charts/useMosaicChartRenderContext.d.ts +2 -3
  321. package/dist/charts/useMosaicChartRenderContext.d.ts.map +1 -1
  322. package/dist/charts/useMosaicChartRenderContext.js +15 -15
  323. package/dist/charts/useMosaicChartRenderContext.js.map +1 -1
  324. package/dist/charts/worksheet/ChartBlockHeader.d.ts.map +1 -1
  325. package/dist/charts/worksheet/ChartBlockHeader.js +4 -3
  326. package/dist/charts/worksheet/ChartBlockHeader.js.map +1 -1
  327. package/dist/charts/worksheet/ChartBlockRenderer.d.ts.map +1 -1
  328. package/dist/charts/worksheet/ChartBlockRenderer.js +3 -13
  329. package/dist/charts/worksheet/ChartBlockRenderer.js.map +1 -1
  330. package/dist/column-types-utils.d.ts.map +1 -1
  331. package/dist/column-types-utils.js +12 -4
  332. package/dist/column-types-utils.js.map +1 -1
  333. package/dist/components/AggregationSelector.d.ts.map +1 -1
  334. package/dist/components/AggregationSelector.js +9 -2
  335. package/dist/components/AggregationSelector.js.map +1 -1
  336. package/dist/components/BlockCaptionEditor.d.ts +20 -0
  337. package/dist/components/BlockCaptionEditor.d.ts.map +1 -0
  338. package/dist/components/BlockCaptionEditor.js +15 -0
  339. package/dist/components/BlockCaptionEditor.js.map +1 -0
  340. package/dist/components/ColorSelector.d.ts +12 -0
  341. package/dist/components/ColorSelector.d.ts.map +1 -0
  342. package/dist/components/ColorSelector.js +13 -0
  343. package/dist/components/ColorSelector.js.map +1 -0
  344. package/dist/components/ColumnSelector.d.ts +1 -0
  345. package/dist/components/ColumnSelector.d.ts.map +1 -1
  346. package/dist/components/ColumnSelector.js +2 -2
  347. package/dist/components/ColumnSelector.js.map +1 -1
  348. package/dist/components/FieldSelectorInput.d.ts +1 -0
  349. package/dist/components/FieldSelectorInput.d.ts.map +1 -1
  350. package/dist/components/FieldSelectorInput.js +4 -9
  351. package/dist/components/FieldSelectorInput.js.map +1 -1
  352. package/dist/components/MultiFieldSelector.d.ts +4 -1
  353. package/dist/components/MultiFieldSelector.d.ts.map +1 -1
  354. package/dist/components/MultiFieldSelector.js +4 -13
  355. package/dist/components/MultiFieldSelector.js.map +1 -1
  356. package/dist/components/TemporalGranularitySelector.d.ts.map +1 -1
  357. package/dist/components/TemporalGranularitySelector.js +13 -9
  358. package/dist/components/TemporalGranularitySelector.js.map +1 -1
  359. package/dist/constants/chart-colors.d.ts +3 -0
  360. package/dist/constants/chart-colors.d.ts.map +1 -0
  361. package/dist/constants/chart-colors.js +5 -0
  362. package/dist/constants/chart-colors.js.map +1 -0
  363. package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts +2 -1
  364. package/dist/dashboard/DefaultMosaicDashboardBlock.d.ts.map +1 -1
  365. package/dist/dashboard/DefaultMosaicDashboardBlock.js +1 -1
  366. package/dist/dashboard/DefaultMosaicDashboardBlock.js.map +1 -1
  367. package/dist/dashboard/MosaicDashboardCommands.d.ts +19 -0
  368. package/dist/dashboard/MosaicDashboardCommands.d.ts.map +1 -0
  369. package/dist/dashboard/MosaicDashboardCommands.js +226 -0
  370. package/dist/dashboard/MosaicDashboardCommands.js.map +1 -0
  371. package/dist/dashboard/MosaicDashboardSlice.d.ts +22 -4
  372. package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -1
  373. package/dist/dashboard/MosaicDashboardSlice.js +55 -0
  374. package/dist/dashboard/MosaicDashboardSlice.js.map +1 -1
  375. package/dist/dashboard/components/ResetFiltersButton.d.ts +14 -0
  376. package/dist/dashboard/components/ResetFiltersButton.d.ts.map +1 -0
  377. package/dist/dashboard/components/ResetFiltersButton.js +15 -0
  378. package/dist/dashboard/components/ResetFiltersButton.js.map +1 -0
  379. package/dist/dashboard/dashboard-types.d.ts +9 -3
  380. package/dist/dashboard/dashboard-types.d.ts.map +1 -1
  381. package/dist/dashboard/dashboard-types.js.map +1 -1
  382. package/dist/dashboard/hooks/useDashboardResetFilters.d.ts +14 -0
  383. package/dist/dashboard/hooks/useDashboardResetFilters.d.ts.map +1 -0
  384. package/dist/dashboard/hooks/useDashboardResetFilters.js +39 -0
  385. package/dist/dashboard/hooks/useDashboardResetFilters.js.map +1 -0
  386. package/dist/dashboard/hooks/usePanelResetFilters.d.ts +16 -0
  387. package/dist/dashboard/hooks/usePanelResetFilters.d.ts.map +1 -0
  388. package/dist/dashboard/hooks/usePanelResetFilters.js +47 -0
  389. package/dist/dashboard/hooks/usePanelResetFilters.js.map +1 -0
  390. package/dist/dashboard/panel/MosaicDashboardPanel.d.ts.map +1 -1
  391. package/dist/dashboard/panel/MosaicDashboardPanel.js +1 -1
  392. package/dist/dashboard/panel/MosaicDashboardPanel.js.map +1 -1
  393. package/dist/dashboard/panel/MosaicDashboardPanelLayout.d.ts.map +1 -1
  394. package/dist/dashboard/panel/MosaicDashboardPanelLayout.js +3 -3
  395. package/dist/dashboard/panel/MosaicDashboardPanelLayout.js.map +1 -1
  396. package/dist/dashboard/panel/MosaicDashboardPanels.d.ts.map +1 -1
  397. package/dist/dashboard/panel/MosaicDashboardPanels.js +4 -2
  398. package/dist/dashboard/panel/MosaicDashboardPanels.js.map +1 -1
  399. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.d.ts.map +1 -1
  400. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js +3 -3
  401. package/dist/dashboard/toolbar/MosaicDashboardAddPanelDropdown.js.map +1 -1
  402. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts +7 -0
  403. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.d.ts.map +1 -0
  404. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js +18 -0
  405. package/dist/dashboard/toolbar/MosaicDashboardDataTableSelector.js.map +1 -0
  406. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.d.ts.map +1 -1
  407. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js +4 -32
  408. package/dist/dashboard/toolbar/MosaicDashboardResetFiltersButton.js.map +1 -1
  409. package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts +2 -2
  410. package/dist/dashboard/toolbar/MosaicDashboardToolbar.d.ts.map +1 -1
  411. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js +14 -10
  412. package/dist/dashboard/toolbar/MosaicDashboardToolbar.js.map +1 -1
  413. package/dist/dashboard/usePanelClientRegistration.d.ts +7 -0
  414. package/dist/dashboard/usePanelClientRegistration.d.ts.map +1 -0
  415. package/dist/dashboard/usePanelClientRegistration.js +30 -0
  416. package/dist/dashboard/usePanelClientRegistration.js.map +1 -0
  417. package/dist/dashboard/usePanelClients.d.ts +7 -0
  418. package/dist/dashboard/usePanelClients.d.ts.map +1 -0
  419. package/dist/dashboard/usePanelClients.js +13 -0
  420. package/dist/dashboard/usePanelClients.js.map +1 -0
  421. package/dist/dashboard/useSelectedOrFirstTable.d.ts +1 -1
  422. package/dist/dashboard/useSelectedOrFirstTable.d.ts.map +1 -1
  423. package/dist/dashboard/useSelectedOrFirstTable.js +10 -8
  424. package/dist/dashboard/useSelectedOrFirstTable.js.map +1 -1
  425. package/dist/data-table-explorer/DataTableExplorer.d.ts +4 -2
  426. package/dist/data-table-explorer/DataTableExplorer.d.ts.map +1 -1
  427. package/dist/data-table-explorer/DataTableExplorer.js +4 -4
  428. package/dist/data-table-explorer/DataTableExplorer.js.map +1 -1
  429. package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts +3 -2
  430. package/dist/data-table-explorer/DataTableExplorerCategoryClient.d.ts.map +1 -1
  431. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js +4 -3
  432. package/dist/data-table-explorer/DataTableExplorerCategoryClient.js.map +1 -1
  433. package/dist/data-table-explorer/DataTableExplorerCountClient.d.ts +3 -1
  434. package/dist/data-table-explorer/DataTableExplorerCountClient.d.ts.map +1 -1
  435. package/dist/data-table-explorer/DataTableExplorerCountClient.js +3 -3
  436. package/dist/data-table-explorer/DataTableExplorerCountClient.js.map +1 -1
  437. package/dist/data-table-explorer/DataTableExplorerHistogramClient.d.ts +3 -2
  438. package/dist/data-table-explorer/DataTableExplorerHistogramClient.d.ts.map +1 -1
  439. package/dist/data-table-explorer/DataTableExplorerHistogramClient.js +4 -4
  440. package/dist/data-table-explorer/DataTableExplorerHistogramClient.js.map +1 -1
  441. package/dist/data-table-explorer/DataTableExplorerPageClient.d.ts +3 -1
  442. package/dist/data-table-explorer/DataTableExplorerPageClient.d.ts.map +1 -1
  443. package/dist/data-table-explorer/DataTableExplorerPageClient.js +3 -1
  444. package/dist/data-table-explorer/DataTableExplorerPageClient.js.map +1 -1
  445. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.d.ts +3 -2
  446. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.d.ts.map +1 -1
  447. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.js +3 -3
  448. package/dist/data-table-explorer/DataTableExplorerUnsupportedSummaryClient.js.map +1 -1
  449. package/dist/data-table-explorer/createDataTableExplorerStore.d.ts +3 -0
  450. package/dist/data-table-explorer/createDataTableExplorerStore.d.ts.map +1 -1
  451. package/dist/data-table-explorer/createDataTableExplorerStore.js +6 -0
  452. package/dist/data-table-explorer/createDataTableExplorerStore.js.map +1 -1
  453. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts +4 -0
  454. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.d.ts.map +1 -0
  455. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js +13 -0
  456. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerHeaderActions.js.map +1 -0
  457. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.d.ts.map +1 -1
  458. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js +26 -8
  459. package/dist/data-table-explorer/dashboard/MosaicDashboardDataTableExplorerPanelRenderer.js.map +1 -1
  460. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts +13 -0
  461. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.d.ts.map +1 -0
  462. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js +32 -0
  463. package/dist/data-table-explorer/dashboard/useDataTableExplorerPanelClients.js.map +1 -0
  464. package/dist/data-table-explorer/dataTableExplorerController.d.ts +63 -3
  465. package/dist/data-table-explorer/dataTableExplorerController.d.ts.map +1 -1
  466. package/dist/data-table-explorer/dataTableExplorerController.js +73 -10
  467. package/dist/data-table-explorer/dataTableExplorerController.js.map +1 -1
  468. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts +12 -0
  469. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.d.ts.map +1 -0
  470. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js +19 -0
  471. package/dist/data-table-explorer/hooks/useDataTableExplorerColumns.js.map +1 -0
  472. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts +52 -0
  473. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.d.ts.map +1 -0
  474. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js +153 -0
  475. package/dist/data-table-explorer/hooks/useDataTableExplorerLifecycles.js.map +1 -0
  476. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts +42 -0
  477. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.d.ts.map +1 -0
  478. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js +43 -0
  479. package/dist/data-table-explorer/hooks/useDataTableExplorerQueryState.js.map +1 -0
  480. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts +13 -0
  481. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.d.ts.map +1 -0
  482. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js +40 -0
  483. package/dist/data-table-explorer/hooks/useDataTableExplorerSelection.js.map +1 -0
  484. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts +18 -0
  485. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.d.ts.map +1 -0
  486. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js +23 -0
  487. package/dist/data-table-explorer/hooks/useDataTableExplorerStatus.js.map +1 -0
  488. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts +27 -0
  489. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.d.ts.map +1 -0
  490. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js +28 -0
  491. package/dist/data-table-explorer/hooks/useDataTableExplorerStoreState.js.map +1 -0
  492. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts +15 -0
  493. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.d.ts.map +1 -0
  494. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js +21 -0
  495. package/dist/data-table-explorer/hooks/useDataTableExplorerVisiblePage.js.map +1 -0
  496. package/dist/data-table-explorer/types.d.ts +16 -3
  497. package/dist/data-table-explorer/types.d.ts.map +1 -1
  498. package/dist/data-table-explorer/types.js.map +1 -1
  499. package/dist/data-table-explorer/useDataTableExplorer.d.ts.map +1 -1
  500. package/dist/data-table-explorer/useDataTableExplorer.js +20 -279
  501. package/dist/data-table-explorer/useDataTableExplorer.js.map +1 -1
  502. package/dist/data-table-explorer/utils.d.ts +64 -6
  503. package/dist/data-table-explorer/utils.d.ts.map +1 -1
  504. package/dist/data-table-explorer/utils.js +58 -0
  505. package/dist/data-table-explorer/utils.js.map +1 -1
  506. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts +1 -0
  507. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.d.ts.map +1 -1
  508. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js +4 -2
  509. package/dist/data-table-explorer/worksheet/DataTableBlockHeader.js.map +1 -1
  510. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.d.ts.map +1 -1
  511. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js +4 -4
  512. package/dist/data-table-explorer/worksheet/DataTableBlockRenderer.js.map +1 -1
  513. package/dist/index.d.ts +55 -31
  514. package/dist/index.d.ts.map +1 -1
  515. package/dist/index.js +86 -26
  516. package/dist/index.js.map +1 -1
  517. package/dist/mosaicTableReference.d.ts +59 -0
  518. package/dist/mosaicTableReference.d.ts.map +1 -0
  519. package/dist/mosaicTableReference.js +68 -0
  520. package/dist/mosaicTableReference.js.map +1 -0
  521. package/dist/useVgPlotChartRender.d.ts.map +1 -1
  522. package/dist/useVgPlotChartRender.js +151 -25
  523. package/dist/useVgPlotChartRender.js.map +1 -1
  524. package/dist/useVgPlotChartRetention.d.ts +11 -0
  525. package/dist/useVgPlotChartRetention.d.ts.map +1 -1
  526. package/dist/useVgPlotChartRetention.js.map +1 -1
  527. package/dist/utils/table-lookup.d.ts +7 -0
  528. package/dist/utils/table-lookup.d.ts.map +1 -0
  529. package/dist/utils/table-lookup.js +10 -0
  530. package/dist/utils/table-lookup.js.map +1 -0
  531. package/package.json +14 -14
  532. package/dist/ai/ai.d.ts +0 -103
  533. package/dist/ai/ai.d.ts.map +0 -1
  534. package/dist/ai/ai.js +0 -419
  535. package/dist/ai/ai.js.map +0 -1
  536. package/dist/ai/data-table-explorer-tool.d.ts +0 -40
  537. package/dist/ai/data-table-explorer-tool.d.ts.map +0 -1
  538. package/dist/ai/data-table-explorer-tool.js +0 -75
  539. package/dist/ai/data-table-explorer-tool.js.map +0 -1
  540. package/dist/ai/list-panels-tool.d.ts +0 -35
  541. package/dist/ai/list-panels-tool.d.ts.map +0 -1
  542. package/dist/ai/list-panels-tool.js +0 -66
  543. package/dist/ai/list-panels-tool.js.map +0 -1
  544. package/dist/ai/remove-panel-tool.d.ts +0 -31
  545. package/dist/ai/remove-panel-tool.d.ts.map +0 -1
  546. package/dist/ai/remove-panel-tool.js +0 -55
  547. package/dist/ai/remove-panel-tool.js.map +0 -1
  548. package/dist/ai/tool-validation.d.ts +0 -3
  549. package/dist/ai/tool-validation.d.ts.map +0 -1
  550. package/dist/ai/tool-validation.js +0 -11
  551. package/dist/ai/tool-validation.js.map +0 -1
  552. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts +0 -3
  553. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.d.ts.map +0 -1
  554. package/dist/charts/chart-types/bubble-chart/BubbleChartSettings.js.map +0 -1
  555. package/dist/charts/chart-types/bubble-chart/definition.d.ts +0 -4
  556. package/dist/charts/chart-types/bubble-chart/definition.d.ts.map +0 -1
  557. package/dist/charts/chart-types/bubble-chart/definition.js +0 -24
  558. package/dist/charts/chart-types/bubble-chart/definition.js.map +0 -1
  559. package/dist/charts/chart-types/bubble-chart/schema.d.ts.map +0 -1
  560. package/dist/charts/chart-types/bubble-chart/schema.js.map +0 -1
  561. package/dist/charts/chart-types/bubble-chart/spec.d.ts +0 -4
  562. package/dist/charts/chart-types/bubble-chart/spec.d.ts.map +0 -1
  563. package/dist/charts/chart-types/bubble-chart/spec.js +0 -31
  564. package/dist/charts/chart-types/bubble-chart/spec.js.map +0 -1
  565. package/dist/charts/chart-types/bubble-chart/tool.d.ts +0 -42
  566. package/dist/charts/chart-types/bubble-chart/tool.d.ts.map +0 -1
  567. package/dist/charts/chart-types/bubble-chart/tool.js +0 -66
  568. package/dist/charts/chart-types/bubble-chart/tool.js.map +0 -1
  569. package/dist/hooks/useDataTable.d.ts +0 -3
  570. package/dist/hooks/useDataTable.d.ts.map +0 -1
  571. package/dist/hooks/useDataTable.js +0 -28
  572. package/dist/hooks/useDataTable.js.map +0 -1
@@ -1,8 +1,45 @@
1
1
  import { astToDOM, parseSpec } from '@uwdata/mosaic-spec';
2
2
  import { useLayoutEffect, useRef } from 'react';
3
3
  import { assertChartDataPolicy, createChartRuntimeIssueFromError, } from './chart-runtime';
4
+ import { getMosaicSqlTableReference } from './mosaicTableReference';
5
+ function normalizeSpecTableReferences(value, key) {
6
+ if (Array.isArray(value)) {
7
+ return value.map((item) => normalizeSpecTableReferences(item, key));
8
+ }
9
+ if (!value || typeof value !== 'object') {
10
+ return value;
11
+ }
12
+ const prototype = Object.getPrototypeOf(value);
13
+ if (prototype !== Object.prototype && prototype !== null) {
14
+ return value;
15
+ }
16
+ const entries = Object.entries(value).map(([entryKey, entryValue]) => [
17
+ entryKey,
18
+ normalizeSpecTableReferences(entryValue, entryKey),
19
+ ]);
20
+ const normalized = Object.fromEntries(entries);
21
+ if (key === 'data' &&
22
+ typeof normalized.from === 'string' &&
23
+ normalized.from.trim() &&
24
+ !normalized.from.trim().startsWith('$')) {
25
+ normalized.from = getMosaicSqlTableReference(normalized.from.trim());
26
+ }
27
+ return normalized;
28
+ }
29
+ /**
30
+ * Symbols used to store original mark handlers before wrapping.
31
+ * This allows wrapMarkHandlers to be idempotent - it stores the original
32
+ * handlers once and reuses them on subsequent calls, preventing nested wrappers.
33
+ */
34
+ const ORIGINAL_QUERY_PENDING = Symbol('originalQueryPending');
35
+ const ORIGINAL_QUERY_RESULT = Symbol('originalQueryResult');
36
+ const ORIGINAL_QUERY_ERROR = Symbol('originalQueryError');
4
37
  function getPlotInstance(element) {
5
- const plot = element.value;
38
+ let htmlElement = element;
39
+ if (!htmlElement?.classList.contains('plot')) {
40
+ htmlElement = htmlElement?.querySelector('.plot');
41
+ }
42
+ const plot = htmlElement.value;
6
43
  return plot && typeof plot === 'object' ? plot : null;
7
44
  }
8
45
  function resizeChartElement(element, size) {
@@ -23,7 +60,7 @@ async function createSpecChartElement(spec, size, params) {
23
60
  width: size.width,
24
61
  height: size.height,
25
62
  };
26
- const ast = await parseSpec(sizedSpec);
63
+ const ast = await parseSpec(normalizeSpecTableReferences(sizedSpec));
27
64
  const options = params
28
65
  ? { params: params }
29
66
  : undefined;
@@ -38,44 +75,125 @@ function attachPlotElement(container, element) {
38
75
  }
39
76
  container.replaceChildren(element);
40
77
  }
78
+ /**
79
+ * Checks the aggregate state of all chart marks and reports errors when all marks are done.
80
+ * This function is called after mark handlers complete to determine if the chart succeeded or failed.
81
+ *
82
+ * @param chart - Retained chart with mark state tracking
83
+ * @param onError - Callback invoked with first error when marks fail
84
+ * @param runtimeIssueReporter - Optional reporter for runtime issues
85
+ * @param runtimeIssueContext - Context for runtime issue reporting
86
+ * @param dataPolicy - Optional policy for validating chart data
87
+ */
88
+ function checkAndReportAggregateState(chart, onError, runtimeIssueReporter, runtimeIssueContext, dataPolicy) {
89
+ if (!chart.markStates || chart.markStates.size === 0) {
90
+ return; // No marks tracked yet
91
+ }
92
+ // Check if all marks are done (only success or error, not pending or idle)
93
+ const allDone = Array.from(chart.markStates.values()).every((state) => state === 'success' || state === 'error');
94
+ if (!allDone) {
95
+ return; // Wait for all marks to finish
96
+ }
97
+ // All marks done - determine aggregate state
98
+ const hasError = Array.from(chart.markStates.values()).some((state) => state === 'error');
99
+ if (hasError) {
100
+ // Find first error
101
+ const firstErrorMark = Array.from(chart.markStates.entries()).find(([, state]) => state === 'error')?.[0];
102
+ const error = firstErrorMark && chart.markErrors?.get(firstErrorMark);
103
+ if (error) {
104
+ chart.error = error; // For standalone case
105
+ onError(error);
106
+ if (runtimeIssueContext) {
107
+ runtimeIssueReporter?.reportIssue(createChartRuntimeIssueFromError(error, runtimeIssueContext, dataPolicy));
108
+ }
109
+ }
110
+ }
111
+ else {
112
+ // All successful
113
+ delete chart.error;
114
+ runtimeIssueReporter?.clearIssue();
115
+ }
116
+ }
117
+ /**
118
+ * Wraps chart mark handlers (queryPending, queryResult, queryError) to track state and report errors.
119
+ * This function is idempotent - it stores original handlers in Symbols and only wraps once.
120
+ * Subsequent calls update the closures with fresh dataPolicy/runtimeIssue reporters without nesting wrappers.
121
+ *
122
+ * Pre-populates all queryable marks with 'idle' state for proper aggregate state tracking.
123
+ *
124
+ * @param chart - Retained chart whose marks will be wrapped
125
+ * @param onError - Callback invoked when mark errors occur
126
+ * @param dataPolicy - Optional policy for validating chart data
127
+ * @param runtimeIssueContext - Context for runtime issue reporting
128
+ * @param runtimeIssueReporter - Optional reporter for runtime issues
129
+ */
41
130
  function wrapMarkHandlers(chart, onError, dataPolicy, runtimeIssueContext, runtimeIssueReporter) {
42
131
  const plot = getPlotInstance(chart.element);
43
132
  if (!plot?.marks) {
44
133
  return;
45
134
  }
135
+ // Initialize tracking
136
+ if (!chart.markStates) {
137
+ chart.markStates = new Map();
138
+ }
139
+ if (!chart.markErrors) {
140
+ chart.markErrors = new Map();
141
+ }
46
142
  plot.marks.forEach((mark) => {
143
+ const markWithOriginals = mark;
144
+ // Pre-populate tracking for all queryable marks
145
+ if (mark.queryPending || mark.queryResult || mark.queryError) {
146
+ chart.markStates.set(mark, 'idle');
147
+ }
148
+ // Wrap queryPending - store original if not already stored
149
+ if (mark.queryPending) {
150
+ if (!markWithOriginals[ORIGINAL_QUERY_PENDING]) {
151
+ markWithOriginals[ORIGINAL_QUERY_PENDING] = mark.queryPending;
152
+ }
153
+ const originalPending = markWithOriginals[ORIGINAL_QUERY_PENDING];
154
+ mark.queryPending = function () {
155
+ chart.markStates.set(mark, 'pending');
156
+ return originalPending.call(this);
157
+ };
158
+ }
159
+ // Wrap queryResult - store original if not already stored
47
160
  if (mark.queryResult) {
48
- const originalQueryResult = mark.queryResult;
49
- mark.queryResult = (data) => {
161
+ if (!markWithOriginals[ORIGINAL_QUERY_RESULT]) {
162
+ markWithOriginals[ORIGINAL_QUERY_RESULT] = mark.queryResult;
163
+ }
164
+ const originalQueryResult = markWithOriginals[ORIGINAL_QUERY_RESULT];
165
+ mark.queryResult = function (data) {
50
166
  try {
51
167
  assertChartDataPolicy(dataPolicy, data);
52
- runtimeIssueReporter?.clearIssue();
53
- return originalQueryResult.call(mark, data);
168
+ chart.markStates.set(mark, 'success');
169
+ chart.markErrors.delete(mark);
170
+ checkAndReportAggregateState(chart, onError, runtimeIssueReporter, runtimeIssueContext, dataPolicy);
171
+ return originalQueryResult.call(this, data);
54
172
  }
55
173
  catch (error) {
56
174
  const normalizedError = error instanceof Error ? error : new Error(String(error));
57
- onError(normalizedError);
58
- chart.error = normalizedError;
59
- if (runtimeIssueContext) {
60
- runtimeIssueReporter?.reportIssue(createChartRuntimeIssueFromError(normalizedError, runtimeIssueContext, dataPolicy));
61
- }
62
- if (mark.queryError) {
63
- return mark.queryError(normalizedError);
175
+ chart.markStates.set(mark, 'error');
176
+ chart.markErrors.set(mark, normalizedError);
177
+ checkAndReportAggregateState(chart, onError, runtimeIssueReporter, runtimeIssueContext, dataPolicy);
178
+ if (markWithOriginals[ORIGINAL_QUERY_ERROR]) {
179
+ return markWithOriginals[ORIGINAL_QUERY_ERROR].call(this, normalizedError);
64
180
  }
65
181
  return undefined;
66
182
  }
67
183
  };
68
184
  }
185
+ // Wrap queryError - store original if not already stored
69
186
  if (mark.queryError) {
70
- const originalQueryError = mark.queryError;
71
- mark.queryError = (error) => {
187
+ if (!markWithOriginals[ORIGINAL_QUERY_ERROR]) {
188
+ markWithOriginals[ORIGINAL_QUERY_ERROR] = mark.queryError;
189
+ }
190
+ const originalQueryError = markWithOriginals[ORIGINAL_QUERY_ERROR];
191
+ mark.queryError = function (error) {
72
192
  const normalizedError = error instanceof Error ? error : new Error(String(error));
73
- onError(normalizedError);
74
- chart.error = normalizedError;
75
- if (runtimeIssueContext) {
76
- runtimeIssueReporter?.reportIssue(createChartRuntimeIssueFromError(normalizedError, runtimeIssueContext, dataPolicy));
77
- }
78
- originalQueryError.call(mark, error);
193
+ chart.markStates?.set(mark, 'error');
194
+ chart.markErrors?.set(mark, normalizedError);
195
+ checkAndReportAggregateState(chart, onError, runtimeIssueReporter, runtimeIssueContext, dataPolicy);
196
+ return originalQueryError.call(this, error);
79
197
  };
80
198
  }
81
199
  });
@@ -91,21 +209,29 @@ export function useVgPlotChartRender({ containerRef, spec, specKey, params, cont
91
209
  return;
92
210
  }
93
211
  if (cachedChart) {
212
+ // Check aggregate state before clearing to preserve error state
213
+ checkAndReportAggregateState(cachedChart, onError, runtimeIssueReporter, runtimeIssueContext, dataPolicy);
214
+ // Clear mark states when reusing cached chart - marks will re-register on next query
215
+ if (cachedChart.markStates) {
216
+ cachedChart.markStates.clear();
217
+ }
218
+ if (cachedChart.markErrors) {
219
+ cachedChart.markErrors.clear();
220
+ }
94
221
  attachPlotElement(container, asPlotDomElement(cachedChart.element));
95
222
  if (containerSize) {
96
223
  resizeChartElement(cachedChart.element, containerSize);
97
224
  }
98
225
  // Re-wrap mark handlers with fresh closures for dataPolicy/runtimeIssue reporting
99
226
  wrapMarkHandlers(cachedChart, onError, dataPolicy, runtimeIssueContext, runtimeIssueReporter);
100
- // Restore error state from cached chart
101
- if (cachedChart.error) {
102
- onError(cachedChart.error);
103
- }
104
227
  return;
105
228
  }
106
229
  if (!containerSize) {
107
230
  return;
108
231
  }
232
+ // Clear any previous runtime issues when starting to render a new chart spec
233
+ // This ensures stale errors don't persist when the chart configuration changes
234
+ runtimeIssueReporter?.clearIssue();
109
235
  // Create new chart
110
236
  const renderVersion = ++renderVersionRef.current;
111
237
  let cancelled = false;
@@ -1 +1 @@
1
- {"version":3,"file":"useVgPlotChartRender.js","sourceRoot":"","sources":["../src/useVgPlotChartRender.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAO,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAC,eAAe,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAG9C,OAAO,EACL,qBAAqB,EACrB,gCAAgC,GAIjC,MAAM,iBAAiB,CAAC;AAezB,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GAAI,OAA2C,CAAC,KAAK,CAAC;IAChE,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,IAAc;IACzD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAU,EACV,IAAc,EACd,MAA4C;IAE5C,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACZ,CAAC;IAEV,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,EAAC,MAAM,EAAE,MAA4C,EAAC;QACxD,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAyB,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CACxB,SAAsB,EACtB,OAAuB;IAEvB,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAC1E,OAAO;IACT,CAAC;IACD,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA0B,EAC1B,OAA+B,EAC/B,UAAmC,EACnC,mBAA8C,EAC9C,oBAAgD;IAEhD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAmB,EAAE,EAAE;QACzC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,CAAC,IAAa,EAAE,EAAE;gBACnC,IAAI,CAAC;oBACH,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxC,oBAAoB,EAAE,UAAU,EAAE,CAAC;oBACnC,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC9C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,eAAe,GACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC5D,OAAO,CAAC,eAAe,CAAC,CAAC;oBACzB,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC;oBAC9B,IAAI,mBAAmB,EAAE,CAAC;wBACxB,oBAAoB,EAAE,WAAW,CAC/B,gCAAgC,CAC9B,eAAe,EACf,mBAAmB,EACnB,UAAU,CACX,CACF,CAAC;oBACJ,CAAC;oBACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;oBAC1C,CAAC;oBACD,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE;gBACnC,MAAM,eAAe,GACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,eAAe,CAAC,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC;gBAC9B,IAAI,mBAAmB,EAAE,CAAC;oBACxB,oBAAoB,EAAE,WAAW,CAC/B,gCAAgC,CAC9B,eAAe,EACf,mBAAmB,EACnB,UAAU,CACX,CACF,CAAC;gBACJ,CAAC;gBACD,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,cAAc,EACd,OAAO,EACP,UAAU,EACV,mBAAmB,EACnB,oBAAoB,GACO;IAC3B,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEnC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACpE,IAAI,aAAa,EAAE,CAAC;gBAClB,kBAAkB,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACzD,CAAC;YAED,kFAAkF;YAClF,gBAAgB,CACd,WAAW,EACX,OAAO,EACP,UAAU,EACV,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;YAEF,wCAAwC;YACxC,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,aAAa,GAAG,EAAE,gBAAgB,CAAC,OAAO,CAAC;QACjD,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC;aACrD,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,IACE,SAAS;gBACT,aAAa,KAAK,gBAAgB,CAAC,OAAO;gBAC1C,CAAC,YAAY,CAAC,OAAO,EACrB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAwB;gBACrC,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aACzC,CAAC;YAEF,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1B,iBAAiB,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjD,mCAAmC;YACnC,gBAAgB,CACd,SAAS,EACT,OAAO,EACP,UAAU,EACV,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;QACJ,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,oCAAoC;YACpC,MAAM,eAAe,GACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,eAAe,CAAC,CAAC;YACzB,IAAI,mBAAmB,EAAE,CAAC;gBACxB,oBAAoB,EAAE,WAAW,CAAC;oBAChC,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,mBAAmB,CAAC,OAAO;oBACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;oBACxC,OAAO,EAAE,eAAe,CAAC,OAAO;oBAChC,WAAW,EAAE,KAAK;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,eAAe,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE;QACD,aAAa;QACb,OAAO;QACP,WAAW;QACX,cAAc;QACd,OAAO;QACP,UAAU;QACV,mBAAmB;QACnB,oBAAoB;KACrB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {astToDOM, parseSpec, Spec} from '@uwdata/mosaic-spec';\nimport {useLayoutEffect, useRef} from 'react';\nimport {PlotSize} from './ResponsivePlot';\nimport {RetainedVgPlotChart} from './useVgPlotChartRetention';\nimport {\n assertChartDataPolicy,\n createChartRuntimeIssueFromError,\n type ChartDataPolicy,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n} from './chart-runtime';\n\ntype PlotDomElement = HTMLElement | SVGSVGElement;\n\ntype QueryableMark = {\n queryResult?: (data: unknown) => unknown;\n queryError?: (error: unknown) => unknown;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void} & QueryableMark>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n const plot = (element as HTMLElement & {value?: unknown}).value;\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nfunction resizeChartElement(element: object, size: PlotSize): boolean {\n const plot = getPlotInstance(element);\n if (!plot?.setAttribute || !plot.render) {\n return false;\n }\n\n const widthChanged = plot.setAttribute('width', size.width);\n const heightChanged = plot.setAttribute('height', size.height);\n if (widthChanged || heightChanged) {\n void plot.render();\n }\n return true;\n}\n\nasync function createSpecChartElement(\n spec: Spec,\n size: PlotSize,\n params?: Map<string, Param<any> | Selection>,\n): Promise<PlotDomElement> {\n const sizedSpec = {\n ...spec,\n width: size.width,\n height: size.height,\n } as Spec;\n\n const ast = await parseSpec(sizedSpec);\n const options = params\n ? {params: params as unknown as Map<string, Param<any>>}\n : undefined;\n\n return (await astToDOM(ast, options)).element;\n}\n\nfunction asPlotDomElement(element: object): PlotDomElement {\n return element as PlotDomElement;\n}\n\nfunction attachPlotElement(\n container: HTMLElement,\n element: PlotDomElement,\n) {\n if (container.childNodes.length === 1 && container.firstChild === element) {\n return;\n }\n container.replaceChildren(element);\n}\n\nfunction wrapMarkHandlers(\n chart: RetainedVgPlotChart,\n onError: (error: Error) => void,\n dataPolicy?: ChartDataPolicy | null,\n runtimeIssueContext?: ChartRuntimeIssueContext,\n runtimeIssueReporter?: ChartRuntimeIssueReporter,\n) {\n const plot = getPlotInstance(chart.element);\n if (!plot?.marks) {\n return;\n }\n\n plot.marks.forEach((mark: QueryableMark) => {\n if (mark.queryResult) {\n const originalQueryResult = mark.queryResult;\n mark.queryResult = (data: unknown) => {\n try {\n assertChartDataPolicy(dataPolicy, data);\n runtimeIssueReporter?.clearIssue();\n return originalQueryResult.call(mark, data);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n onError(normalizedError);\n chart.error = normalizedError;\n if (runtimeIssueContext) {\n runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n normalizedError,\n runtimeIssueContext,\n dataPolicy,\n ),\n );\n }\n if (mark.queryError) {\n return mark.queryError(normalizedError);\n }\n return undefined;\n }\n };\n }\n if (mark.queryError) {\n const originalQueryError = mark.queryError;\n mark.queryError = (error: unknown) => {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n onError(normalizedError);\n chart.error = normalizedError;\n if (runtimeIssueContext) {\n runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n normalizedError,\n runtimeIssueContext,\n dataPolicy,\n ),\n );\n }\n originalQueryError.call(mark, error);\n };\n }\n });\n}\n\ntype UseVgPlotChartRenderParams = {\n containerRef: React.RefObject<HTMLDivElement | null>;\n spec: Spec;\n specKey: string | null;\n params?: Map<string, Param<any> | Selection>;\n containerSize: PlotSize | null;\n cachedChart: RetainedVgPlotChart | null;\n onChartCreated: (chart: RetainedVgPlotChart) => void;\n onError: (error: Error) => void;\n dataPolicy?: ChartDataPolicy | null;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n};\n\n/**\n * Hook to handle chart rendering lifecycle: creating, caching, and displaying vgplot charts.\n */\nexport function useVgPlotChartRender({\n containerRef,\n spec,\n specKey,\n params,\n containerSize,\n cachedChart,\n onChartCreated,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n}: UseVgPlotChartRenderParams) {\n const renderVersionRef = useRef(0);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n if (cachedChart) {\n attachPlotElement(container, asPlotDomElement(cachedChart.element));\n if (containerSize) {\n resizeChartElement(cachedChart.element, containerSize);\n }\n\n // Re-wrap mark handlers with fresh closures for dataPolicy/runtimeIssue reporting\n wrapMarkHandlers(\n cachedChart,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n );\n\n // Restore error state from cached chart\n if (cachedChart.error) {\n onError(cachedChart.error);\n }\n\n return;\n }\n\n if (!containerSize) {\n return;\n }\n\n // Create new chart\n const renderVersion = ++renderVersionRef.current;\n let cancelled = false;\n\n void createSpecChartElement(spec, containerSize, params)\n .then((element) => {\n if (\n cancelled ||\n renderVersion !== renderVersionRef.current ||\n !containerRef.current\n ) {\n return;\n }\n\n const nextChart: RetainedVgPlotChart = {\n element,\n params,\n specKey: specKey ?? JSON.stringify(spec),\n };\n\n onChartCreated(nextChart);\n attachPlotElement(containerRef.current, element);\n\n // Wrap marks with runtime handlers\n wrapMarkHandlers(\n nextChart,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n );\n })\n .catch((error) => {\n if (cancelled) {\n return;\n }\n\n // Normalize error to Error instance\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n onError(normalizedError);\n if (runtimeIssueContext) {\n runtimeIssueReporter?.reportIssue({\n kind: 'render-error',\n panelId: runtimeIssueContext.panelId,\n chartType: runtimeIssueContext.chartType,\n message: normalizedError.message,\n recoverable: false,\n });\n }\n console.error('[VgPlotChart] Error rendering chart:', normalizedError);\n });\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n containerSize,\n specKey,\n cachedChart,\n onChartCreated,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n ]);\n}\n"]}
1
+ {"version":3,"file":"useVgPlotChartRender.js","sourceRoot":"","sources":["../src/useVgPlotChartRender.ts"],"names":[],"mappings":"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","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {astToDOM, parseSpec, Spec} from '@uwdata/mosaic-spec';\nimport {useLayoutEffect, useRef} from 'react';\nimport {PlotSize} from './ResponsivePlot';\nimport {RetainedVgPlotChart} from './useVgPlotChartRetention';\nimport {\n assertChartDataPolicy,\n createChartRuntimeIssueFromError,\n type ChartDataPolicy,\n type ChartRuntimeIssueContext,\n type ChartRuntimeIssueReporter,\n} from './chart-runtime';\nimport {getMosaicSqlTableReference} from './mosaicTableReference';\n\ntype PlotDomElement = HTMLElement | SVGSVGElement;\n\ntype QueryableMark = {\n queryPending?: () => unknown;\n queryResult?: (data: unknown) => unknown;\n queryError?: (error: unknown) => unknown;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void} & QueryableMark>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction normalizeSpecTableReferences(value: unknown, key?: string): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeSpecTableReferences(item, key));\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return value;\n }\n\n const entries = Object.entries(value).map(([entryKey, entryValue]) => [\n entryKey,\n normalizeSpecTableReferences(entryValue, entryKey),\n ]);\n const normalized = Object.fromEntries(entries) as Record<string, unknown>;\n\n if (\n key === 'data' &&\n typeof normalized.from === 'string' &&\n normalized.from.trim() &&\n !normalized.from.trim().startsWith('$')\n ) {\n normalized.from = getMosaicSqlTableReference(normalized.from.trim());\n }\n\n return normalized;\n}\n\n/**\n * Symbols used to store original mark handlers before wrapping.\n * This allows wrapMarkHandlers to be idempotent - it stores the original\n * handlers once and reuses them on subsequent calls, preventing nested wrappers.\n */\nconst ORIGINAL_QUERY_PENDING = Symbol('originalQueryPending');\nconst ORIGINAL_QUERY_RESULT = Symbol('originalQueryResult');\nconst ORIGINAL_QUERY_ERROR = Symbol('originalQueryError');\n\n/**\n * QueryableMark extended with Symbol properties for storing original handlers.\n * Used internally by wrapMarkHandlers to detect and prevent re-wrapping.\n */\ntype MarkWithOriginals = QueryableMark & {\n [ORIGINAL_QUERY_PENDING]?: () => unknown;\n [ORIGINAL_QUERY_RESULT]?: (data: unknown) => unknown;\n [ORIGINAL_QUERY_ERROR]?: (error: unknown) => unknown;\n};\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n let htmlElement = element as HTMLElement | null;\n\n if (!htmlElement?.classList.contains('plot')) {\n htmlElement = htmlElement?.querySelector('.plot') as HTMLElement | null;\n }\n\n const plot = (htmlElement as {value?: unknown}).value;\n\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nfunction resizeChartElement(element: object, size: PlotSize): boolean {\n const plot = getPlotInstance(element);\n if (!plot?.setAttribute || !plot.render) {\n return false;\n }\n\n const widthChanged = plot.setAttribute('width', size.width);\n const heightChanged = plot.setAttribute('height', size.height);\n if (widthChanged || heightChanged) {\n void plot.render();\n }\n return true;\n}\n\nasync function createSpecChartElement(\n spec: Spec,\n size: PlotSize,\n params?: Map<string, Param<any> | Selection>,\n): Promise<PlotDomElement> {\n const sizedSpec = {\n ...spec,\n width: size.width,\n height: size.height,\n } as Spec;\n\n const ast = await parseSpec(normalizeSpecTableReferences(sizedSpec) as Spec);\n const options = params\n ? {params: params as unknown as Map<string, Param<any>>}\n : undefined;\n\n return (await astToDOM(ast, options)).element;\n}\n\nfunction asPlotDomElement(element: object): PlotDomElement {\n return element as PlotDomElement;\n}\n\nfunction attachPlotElement(container: HTMLElement, element: PlotDomElement) {\n if (container.childNodes.length === 1 && container.firstChild === element) {\n return;\n }\n container.replaceChildren(element);\n}\n\n/**\n * Checks the aggregate state of all chart marks and reports errors when all marks are done.\n * This function is called after mark handlers complete to determine if the chart succeeded or failed.\n *\n * @param chart - Retained chart with mark state tracking\n * @param onError - Callback invoked with first error when marks fail\n * @param runtimeIssueReporter - Optional reporter for runtime issues\n * @param runtimeIssueContext - Context for runtime issue reporting\n * @param dataPolicy - Optional policy for validating chart data\n */\nfunction checkAndReportAggregateState(\n chart: RetainedVgPlotChart,\n onError: (error: Error) => void,\n runtimeIssueReporter: ChartRuntimeIssueReporter | undefined,\n runtimeIssueContext: ChartRuntimeIssueContext | undefined,\n dataPolicy: ChartDataPolicy | null | undefined,\n) {\n if (!chart.markStates || chart.markStates.size === 0) {\n return; // No marks tracked yet\n }\n\n // Check if all marks are done (only success or error, not pending or idle)\n const allDone = Array.from(chart.markStates.values()).every(\n (state) => state === 'success' || state === 'error',\n );\n\n if (!allDone) {\n return; // Wait for all marks to finish\n }\n\n // All marks done - determine aggregate state\n const hasError = Array.from(chart.markStates.values()).some(\n (state) => state === 'error',\n );\n\n if (hasError) {\n // Find first error\n const firstErrorMark = Array.from(chart.markStates.entries()).find(\n ([, state]) => state === 'error',\n )?.[0];\n const error = firstErrorMark && chart.markErrors?.get(firstErrorMark);\n\n if (error) {\n chart.error = error; // For standalone case\n onError(error);\n if (runtimeIssueContext) {\n runtimeIssueReporter?.reportIssue(\n createChartRuntimeIssueFromError(\n error,\n runtimeIssueContext,\n dataPolicy,\n ),\n );\n }\n }\n } else {\n // All successful\n delete chart.error;\n runtimeIssueReporter?.clearIssue();\n }\n}\n\n/**\n * Wraps chart mark handlers (queryPending, queryResult, queryError) to track state and report errors.\n * This function is idempotent - it stores original handlers in Symbols and only wraps once.\n * Subsequent calls update the closures with fresh dataPolicy/runtimeIssue reporters without nesting wrappers.\n *\n * Pre-populates all queryable marks with 'idle' state for proper aggregate state tracking.\n *\n * @param chart - Retained chart whose marks will be wrapped\n * @param onError - Callback invoked when mark errors occur\n * @param dataPolicy - Optional policy for validating chart data\n * @param runtimeIssueContext - Context for runtime issue reporting\n * @param runtimeIssueReporter - Optional reporter for runtime issues\n */\nfunction wrapMarkHandlers(\n chart: RetainedVgPlotChart,\n onError: (error: Error) => void,\n dataPolicy?: ChartDataPolicy | null,\n runtimeIssueContext?: ChartRuntimeIssueContext,\n runtimeIssueReporter?: ChartRuntimeIssueReporter,\n) {\n const plot = getPlotInstance(chart.element);\n if (!plot?.marks) {\n return;\n }\n\n // Initialize tracking\n if (!chart.markStates) {\n chart.markStates = new Map();\n }\n if (!chart.markErrors) {\n chart.markErrors = new Map();\n }\n\n plot.marks.forEach((mark: QueryableMark) => {\n const markWithOriginals = mark as MarkWithOriginals;\n\n // Pre-populate tracking for all queryable marks\n if (mark.queryPending || mark.queryResult || mark.queryError) {\n chart.markStates!.set(mark, 'idle');\n }\n\n // Wrap queryPending - store original if not already stored\n if (mark.queryPending) {\n if (!markWithOriginals[ORIGINAL_QUERY_PENDING]) {\n markWithOriginals[ORIGINAL_QUERY_PENDING] = mark.queryPending;\n }\n const originalPending = markWithOriginals[ORIGINAL_QUERY_PENDING]!;\n mark.queryPending = function (this: QueryableMark) {\n chart.markStates!.set(mark, 'pending');\n return originalPending.call(this);\n };\n }\n\n // Wrap queryResult - store original if not already stored\n if (mark.queryResult) {\n if (!markWithOriginals[ORIGINAL_QUERY_RESULT]) {\n markWithOriginals[ORIGINAL_QUERY_RESULT] = mark.queryResult;\n }\n const originalQueryResult = markWithOriginals[ORIGINAL_QUERY_RESULT]!;\n mark.queryResult = function (this: QueryableMark, data: unknown) {\n try {\n assertChartDataPolicy(dataPolicy, data);\n chart.markStates!.set(mark, 'success');\n chart.markErrors!.delete(mark);\n checkAndReportAggregateState(\n chart,\n onError,\n runtimeIssueReporter,\n runtimeIssueContext,\n dataPolicy,\n );\n return originalQueryResult.call(this, data);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n chart.markStates!.set(mark, 'error');\n chart.markErrors!.set(mark, normalizedError);\n checkAndReportAggregateState(\n chart,\n onError,\n runtimeIssueReporter,\n runtimeIssueContext,\n dataPolicy,\n );\n if (markWithOriginals[ORIGINAL_QUERY_ERROR]) {\n return markWithOriginals[ORIGINAL_QUERY_ERROR].call(\n this,\n normalizedError,\n );\n }\n return undefined;\n }\n };\n }\n\n // Wrap queryError - store original if not already stored\n if (mark.queryError) {\n if (!markWithOriginals[ORIGINAL_QUERY_ERROR]) {\n markWithOriginals[ORIGINAL_QUERY_ERROR] = mark.queryError;\n }\n const originalQueryError = markWithOriginals[ORIGINAL_QUERY_ERROR]!;\n mark.queryError = function (this: QueryableMark, error: unknown) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n\n chart.markStates?.set(mark, 'error');\n chart.markErrors?.set(mark, normalizedError);\n\n checkAndReportAggregateState(\n chart,\n onError,\n runtimeIssueReporter,\n runtimeIssueContext,\n dataPolicy,\n );\n return originalQueryError.call(this, error);\n };\n }\n });\n}\n\ntype UseVgPlotChartRenderParams = {\n containerRef: React.RefObject<HTMLDivElement | null>;\n spec: Spec;\n specKey: string | null;\n params?: Map<string, Param<any> | Selection>;\n containerSize: PlotSize | null;\n cachedChart: RetainedVgPlotChart | null;\n onChartCreated: (chart: RetainedVgPlotChart) => void;\n onError: (error: Error) => void;\n dataPolicy?: ChartDataPolicy | null;\n runtimeIssueContext?: ChartRuntimeIssueContext;\n runtimeIssueReporter?: ChartRuntimeIssueReporter;\n};\n\n/**\n * Hook to handle chart rendering lifecycle: creating, caching, and displaying vgplot charts.\n */\nexport function useVgPlotChartRender({\n containerRef,\n spec,\n specKey,\n params,\n containerSize,\n cachedChart,\n onChartCreated,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n}: UseVgPlotChartRenderParams) {\n const renderVersionRef = useRef(0);\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n if (cachedChart) {\n // Check aggregate state before clearing to preserve error state\n checkAndReportAggregateState(\n cachedChart,\n onError,\n runtimeIssueReporter,\n runtimeIssueContext,\n dataPolicy,\n );\n\n // Clear mark states when reusing cached chart - marks will re-register on next query\n if (cachedChart.markStates) {\n cachedChart.markStates.clear();\n }\n if (cachedChart.markErrors) {\n cachedChart.markErrors.clear();\n }\n attachPlotElement(container, asPlotDomElement(cachedChart.element));\n if (containerSize) {\n resizeChartElement(cachedChart.element, containerSize);\n }\n\n // Re-wrap mark handlers with fresh closures for dataPolicy/runtimeIssue reporting\n wrapMarkHandlers(\n cachedChart,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n );\n\n return;\n }\n\n if (!containerSize) {\n return;\n }\n\n // Clear any previous runtime issues when starting to render a new chart spec\n // This ensures stale errors don't persist when the chart configuration changes\n runtimeIssueReporter?.clearIssue();\n\n // Create new chart\n const renderVersion = ++renderVersionRef.current;\n let cancelled = false;\n\n void createSpecChartElement(spec, containerSize, params)\n .then((element) => {\n if (\n cancelled ||\n renderVersion !== renderVersionRef.current ||\n !containerRef.current\n ) {\n return;\n }\n\n const nextChart: RetainedVgPlotChart = {\n element,\n params,\n specKey: specKey ?? JSON.stringify(spec),\n };\n\n onChartCreated(nextChart);\n attachPlotElement(containerRef.current, element);\n\n // Wrap marks with runtime handlers\n wrapMarkHandlers(\n nextChart,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n );\n })\n .catch((error) => {\n if (cancelled) {\n return;\n }\n\n // Normalize error to Error instance\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n onError(normalizedError);\n if (runtimeIssueContext) {\n runtimeIssueReporter?.reportIssue({\n kind: 'render-error',\n panelId: runtimeIssueContext.panelId,\n chartType: runtimeIssueContext.chartType,\n message: normalizedError.message,\n recoverable: false,\n });\n }\n console.error('[VgPlotChart] Error rendering chart:', normalizedError);\n });\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n containerSize,\n specKey,\n cachedChart,\n onChartCreated,\n onError,\n dataPolicy,\n runtimeIssueContext,\n runtimeIssueReporter,\n ]);\n}\n"]}
@@ -1,9 +1,19 @@
1
1
  import { Param, Selection } from '@uwdata/mosaic-core';
2
+ /**
3
+ * State of a chart mark during its lifecycle.
4
+ * - idle: Mark is registered but has not started querying
5
+ * - pending: Mark is actively querying data
6
+ * - success: Mark query completed successfully
7
+ * - error: Mark query failed with an error
8
+ */
9
+ type MarkState = 'idle' | 'pending' | 'success' | 'error';
2
10
  export type RetainedVgPlotChart = {
3
11
  element: object;
4
12
  params?: Map<string, Param<any> | Selection>;
5
13
  specKey: string;
6
14
  error?: Error;
15
+ markStates?: Map<object, MarkState>;
16
+ markErrors?: Map<object, Error>;
7
17
  };
8
18
  export type VgPlotChartRetention = {
9
19
  chart?: RetainedVgPlotChart;
@@ -18,4 +28,5 @@ export declare function useVgPlotChartRetention(specKey: string | null, params:
18
28
  getCachedChart: () => RetainedVgPlotChart | null;
19
29
  setCachedChart: (chart: RetainedVgPlotChart) => void;
20
30
  };
31
+ export {};
21
32
  //# sourceMappingURL=useVgPlotChartRetention.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVgPlotChartRetention.d.ts","sourceRoot":"","sources":["../src/useVgPlotChartRetention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAGrD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAChD,CAAC;AAaF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,QAKpE;AAoBD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,EACvD,iBAAiB,CAAC,EAAE,oBAAoB;0BAaD,mBAAmB,GAAG,IAAI;4BA0BvD,mBAAmB;EAQ9B"}
1
+ {"version":3,"file":"useVgPlotChartRetention.d.ts","sourceRoot":"","sources":["../src/useVgPlotChartRetention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAGrD;;;;;;GAMG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAChD,CAAC;AAaF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,QAKpE;AAoBD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,EACvD,iBAAiB,CAAC,EAAE,oBAAoB;0BAaD,mBAAmB,GAAG,IAAI;4BA0BvD,mBAAmB;EAQ9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useVgPlotChartRetention.js","sourceRoot":"","sources":["../src/useVgPlotChartRetention.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAoBrD,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GAAI,OAA2C,CAAC,KAAK,CAAC;IAChE,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAA0B;IACnE,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA0C,EAC1C,KAA2C;IAE3C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAsB,EACtB,MAAuD,EACvD,iBAAwC;IAExC,MAAM,aAAa,GAAG,MAAM,CAA6B,IAAI,CAAC,CAAC;IAE/D,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QACpC,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACvC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,WAAW,CAAC,GAA+B,EAAE;QAClE,MAAM,MAAM,GAAG,iBAAiB,EAAE,KAAK,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QAEpC,wBAAwB;QACxB,IACE,KAAK;YACL,KAAK,CAAC,OAAO,KAAK,OAAO;YACzB,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qBAAqB;QACrB,IACE,MAAM;YACN,MAAM,CAAC,OAAO,KAAK,OAAO;YAC1B,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAA0B,EAAE,EAAE;QAC7B,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;QAC9B,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,CAAC;AAC1C,CAAC","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {useCallback, useEffect, useRef} from 'react';\n\nexport type RetainedVgPlotChart = {\n element: object;\n params?: Map<string, Param<any> | Selection>;\n specKey: string;\n error?: Error;\n};\n\nexport type VgPlotChartRetention = {\n chart?: RetainedVgPlotChart;\n setChart: (chart: RetainedVgPlotChart) => void;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void}>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n const plot = (element as HTMLElement & {value?: unknown}).value;\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nexport function destroyRetainedVgPlotChart(chart: RetainedVgPlotChart) {\n const plot = getPlotInstance(chart.element);\n plot?.marks?.forEach((mark) => {\n mark.destroy?.();\n });\n}\n\nfunction areEquivalentParams(\n left?: Map<string, Param<any> | Selection>,\n right?: Map<string, Param<any> | Selection>,\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Hook to manage chart retention (caching) across spec changes.\n * Handles chart lifecycle: retrieval, storage, and cleanup.\n */\nexport function useVgPlotChartRetention(\n specKey: string | null,\n params: Map<string, Param<any> | Selection> | undefined,\n externalRetention?: VgPlotChartRetention,\n) {\n const localChartRef = useRef<RetainedVgPlotChart | null>(null);\n\n // Clean up old chart when spec changes\n useEffect(() => {\n const local = localChartRef.current;\n if (local && local.specKey !== specKey) {\n destroyRetainedVgPlotChart(local);\n localChartRef.current = null;\n }\n }, [specKey]);\n\n const getCachedChart = useCallback((): RetainedVgPlotChart | null => {\n const cached = externalRetention?.chart;\n const local = localChartRef.current;\n\n // Try local cache first\n if (\n local &&\n local.specKey === specKey &&\n areEquivalentParams(local.params, params)\n ) {\n return local;\n }\n\n // Try external cache\n if (\n cached &&\n cached.specKey === specKey &&\n areEquivalentParams(cached.params, params)\n ) {\n return cached;\n }\n\n return null;\n }, [specKey, params, externalRetention]);\n\n const setCachedChart = useCallback(\n (chart: RetainedVgPlotChart) => {\n localChartRef.current = chart;\n externalRetention?.setChart(chart);\n },\n [externalRetention],\n );\n\n return {getCachedChart, setCachedChart};\n}\n"]}
1
+ {"version":3,"file":"useVgPlotChartRetention.js","sourceRoot":"","sources":["../src/useVgPlotChartRetention.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AA+BrD,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GAAI,OAA2C,CAAC,KAAK,CAAC;IAChE,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAA0B;IACnE,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA0C,EAC1C,KAA2C;IAE3C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAsB,EACtB,MAAuD,EACvD,iBAAwC;IAExC,MAAM,aAAa,GAAG,MAAM,CAA6B,IAAI,CAAC,CAAC;IAE/D,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QACpC,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACvC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,WAAW,CAAC,GAA+B,EAAE;QAClE,MAAM,MAAM,GAAG,iBAAiB,EAAE,KAAK,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC;QAEpC,wBAAwB;QACxB,IACE,KAAK;YACL,KAAK,CAAC,OAAO,KAAK,OAAO;YACzB,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qBAAqB;QACrB,IACE,MAAM;YACN,MAAM,CAAC,OAAO,KAAK,OAAO;YAC1B,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAA0B,EAAE,EAAE;QAC7B,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;QAC9B,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,CAAC;AAC1C,CAAC","sourcesContent":["import {Param, Selection} from '@uwdata/mosaic-core';\nimport {useCallback, useEffect, useRef} from 'react';\n\n/**\n * State of a chart mark during its lifecycle.\n * - idle: Mark is registered but has not started querying\n * - pending: Mark is actively querying data\n * - success: Mark query completed successfully\n * - error: Mark query failed with an error\n */\ntype MarkState = 'idle' | 'pending' | 'success' | 'error';\n\nexport type RetainedVgPlotChart = {\n element: object;\n params?: Map<string, Param<any> | Selection>;\n specKey: string;\n error?: Error;\n markStates?: Map<object, MarkState>;\n markErrors?: Map<object, Error>;\n};\n\nexport type VgPlotChartRetention = {\n chart?: RetainedVgPlotChart;\n setChart: (chart: RetainedVgPlotChart) => void;\n};\n\ntype PlotInstance = {\n marks?: Array<{destroy?: () => void}>;\n render?: () => Promise<unknown> | unknown;\n setAttribute?: (name: string, value: unknown) => boolean;\n};\n\nfunction getPlotInstance(element: object): PlotInstance | null {\n const plot = (element as HTMLElement & {value?: unknown}).value;\n return plot && typeof plot === 'object' ? (plot as PlotInstance) : null;\n}\n\nexport function destroyRetainedVgPlotChart(chart: RetainedVgPlotChart) {\n const plot = getPlotInstance(chart.element);\n plot?.marks?.forEach((mark) => {\n mark.destroy?.();\n });\n}\n\nfunction areEquivalentParams(\n left?: Map<string, Param<any> | Selection>,\n right?: Map<string, Param<any> | Selection>,\n) {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Hook to manage chart retention (caching) across spec changes.\n * Handles chart lifecycle: retrieval, storage, and cleanup.\n */\nexport function useVgPlotChartRetention(\n specKey: string | null,\n params: Map<string, Param<any> | Selection> | undefined,\n externalRetention?: VgPlotChartRetention,\n) {\n const localChartRef = useRef<RetainedVgPlotChart | null>(null);\n\n // Clean up old chart when spec changes\n useEffect(() => {\n const local = localChartRef.current;\n if (local && local.specKey !== specKey) {\n destroyRetainedVgPlotChart(local);\n localChartRef.current = null;\n }\n }, [specKey]);\n\n const getCachedChart = useCallback((): RetainedVgPlotChart | null => {\n const cached = externalRetention?.chart;\n const local = localChartRef.current;\n\n // Try local cache first\n if (\n local &&\n local.specKey === specKey &&\n areEquivalentParams(local.params, params)\n ) {\n return local;\n }\n\n // Try external cache\n if (\n cached &&\n cached.specKey === specKey &&\n areEquivalentParams(cached.params, params)\n ) {\n return cached;\n }\n\n return null;\n }, [specKey, params, externalRetention]);\n\n const setCachedChart = useCallback(\n (chart: RetainedVgPlotChart) => {\n localChartRef.current = chart;\n externalRetention?.setChart(chart);\n },\n [externalRetention],\n );\n\n return {getCachedChart, setCachedChart};\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { DataTable } from '@sqlrooms/db';
2
+ /**
3
+ * Returns the full table reference (database.schema.table) as a string,
4
+ * without SQL escaping (for UI display and matching).
5
+ */
6
+ export declare function getTableReference(table: DataTable): string;
7
+ //# sourceMappingURL=table-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-lookup.d.ts","sourceRoot":"","sources":["../../src/utils/table-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAI1D"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns the full table reference (database.schema.table) as a string,
3
+ * without SQL escaping (for UI display and matching).
4
+ */
5
+ export function getTableReference(table) {
6
+ return [table.table.database, table.table.schema, table.table.table]
7
+ .filter((part) => Boolean(part))
8
+ .join('.');
9
+ }
10
+ //# sourceMappingURL=table-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-lookup.js","sourceRoot":"","sources":["../../src/utils/table-lookup.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;SACjE,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC","sourcesContent":["import type {DataTable} from '@sqlrooms/db';\n\n/**\n * Returns the full table reference (database.schema.table) as a string,\n * without SQL escaping (for UI display and matching).\n */\nexport function getTableReference(table: DataTable): string {\n return [table.table.database, table.table.schema, table.table.table]\n .filter((part): part is string => Boolean(part))\n .join('.');\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/mosaic",
3
- "version": "0.29.0-rc.7",
3
+ "version": "0.29.0-rc.9",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/sqlrooms/sqlrooms.git"
@@ -44,18 +44,18 @@
44
44
  "dependencies": {
45
45
  "@observablehq/plot": "^0.6.17",
46
46
  "@paralleldrive/cuid2": "^3.0.0",
47
- "@sqlrooms/blocks": "0.29.0-rc.7",
48
- "@sqlrooms/codemirror": "0.29.0-rc.7",
49
- "@sqlrooms/color-scales": "0.29.0-rc.7",
50
- "@sqlrooms/data-table": "0.29.0-rc.7",
51
- "@sqlrooms/db": "0.29.0-rc.7",
52
- "@sqlrooms/documents": "0.29.0-rc.7",
53
- "@sqlrooms/duckdb": "0.29.0-rc.7",
54
- "@sqlrooms/layout": "0.29.0-rc.7",
55
- "@sqlrooms/layout-config": "0.29.0-rc.7",
56
- "@sqlrooms/room-store": "0.29.0-rc.7",
57
- "@sqlrooms/ui": "0.29.0-rc.7",
58
- "@sqlrooms/utils": "0.29.0-rc.7",
47
+ "@sqlrooms/blocks": "0.29.0-rc.9",
48
+ "@sqlrooms/codemirror": "0.29.0-rc.9",
49
+ "@sqlrooms/color-scales": "0.29.0-rc.9",
50
+ "@sqlrooms/data-table": "0.29.0-rc.9",
51
+ "@sqlrooms/db": "0.29.0-rc.9",
52
+ "@sqlrooms/documents": "0.29.0-rc.9",
53
+ "@sqlrooms/duckdb": "0.29.0-rc.9",
54
+ "@sqlrooms/layout": "0.29.0-rc.9",
55
+ "@sqlrooms/layout-config": "0.29.0-rc.9",
56
+ "@sqlrooms/room-store": "0.29.0-rc.9",
57
+ "@sqlrooms/ui": "0.29.0-rc.9",
58
+ "@sqlrooms/utils": "0.29.0-rc.9",
59
59
  "@uwdata/flechette": "^2.2.6",
60
60
  "@uwdata/mosaic-core": "^0.21.0",
61
61
  "@uwdata/mosaic-plot": "^0.21.0",
@@ -86,5 +86,5 @@
86
86
  "publishConfig": {
87
87
  "access": "public"
88
88
  },
89
- "gitHead": "db298360fd66dc7839d4a14c15b99ac4a4cbf8c5"
89
+ "gitHead": "e9e4ed45ebb0ceb3e1e647674a7039b8d9325583"
90
90
  }
package/dist/ai/ai.d.ts DELETED
@@ -1,103 +0,0 @@
1
- /**
2
- * Reusable AI helpers for Mosaic dashboards.
3
- *
4
- * Host apps provide a narrow adapter for their store/artifact model; Mosaic owns
5
- * the dashboard tool behavior and prompts.
6
- *
7
- * @packageDocumentation
8
- */
9
- import { type LanguageModel, type Tool, ToolLoopAgent } from 'ai';
10
- import { type ChartBuilderColumn, type ChartToolExecutionContext, type DashboardToolDeps, type PanelPatch, type ChartTypeDefinition } from '../charts/chart-types';
11
- import type { MosaicDashboardEntry, MosaicDashboardPanelConfig } from '../dashboard/dashboard-types';
12
- import type { MosaicDashboardLayoutType } from '../dashboard/core-types';
13
- import { type ChartRuntimeIssue } from '../chart-runtime';
14
- export type { ChartToolExecutionContext } from '../charts/chart-types';
15
- export type DashboardAiStore<TState> = {
16
- getState: () => TState;
17
- };
18
- export type DashboardAiTable = {
19
- tableName: string;
20
- columns?: ChartBuilderColumn[];
21
- rowCount?: number;
22
- };
23
- export type DashboardAiAdapter<TState> = {
24
- getTables: (state: TState) => DashboardAiTable[];
25
- hasRunContext?: (state: TState, context?: ChartToolExecutionContext) => boolean;
26
- resolveContextDashboardArtifactId?: (state: TState, context?: ChartToolExecutionContext) => string | undefined;
27
- makeDashboardPrimaryForRun?: (state: TState, dashboardId: string, context?: ChartToolExecutionContext) => void;
28
- getCurrentDashboardArtifactId: (state: TState) => string | undefined;
29
- createDashboardArtifact: (state: TState, title?: string, layoutType?: MosaicDashboardLayoutType) => string;
30
- isDashboardArtifact: (state: TState, artifactId: string) => boolean;
31
- setCurrentArtifact: (state: TState, artifactId: string) => void;
32
- ensureDashboard: (state: TState, dashboardId: string, title?: string, layoutType?: MosaicDashboardLayoutType) => void;
33
- getDashboard: (state: TState, dashboardId: string) => MosaicDashboardEntry | undefined;
34
- getPanelIssue?: (state: TState, dashboardId: string, panelId: string) => ChartRuntimeIssue | undefined;
35
- setSelectedTable: (state: TState, dashboardId: string, tableName: string) => void;
36
- addPanel: (state: TState, dashboardId: string, panel: MosaicDashboardPanelConfig) => string;
37
- updatePanel: (state: TState, dashboardId: string, panelId: string, patch: Partial<PanelPatch>) => void;
38
- removePanel: (state: TState, dashboardId: string, panelId: string) => void;
39
- };
40
- export type CreateDashboardToolDepsOptions<TState> = {
41
- store: DashboardAiStore<TState>;
42
- adapter: DashboardAiAdapter<TState>;
43
- };
44
- export type CreateDashboardAiToolsOptions<TState> = CreateDashboardToolDepsOptions<TState> & {
45
- chartTypes?: ChartTypeDefinition<any>[];
46
- /**
47
- * Host-provided dashboard tools keyed by their registered tool name.
48
- * Register geospatial map tools under MAP_TOOL_KEY so prompts and tools
49
- * stay in sync.
50
- */
51
- extraTools?: (deps: DashboardToolDeps) => Record<string, Tool>;
52
- };
53
- export type DashboardAgentToolCall = {
54
- toolName: string;
55
- };
56
- export type DashboardAgentRunResult = {
57
- finalOutput?: string;
58
- agentToolCalls?: DashboardAgentToolCall[];
59
- };
60
- export type DashboardAgentResult = {
61
- success: boolean;
62
- finalOutput: string;
63
- dashboardId: string;
64
- error?: string;
65
- metadata?: {
66
- tableName: string;
67
- panelsCreated: number;
68
- stepsExecuted: number;
69
- queriesRun: number;
70
- };
71
- };
72
- export type CreateDashboardAgentToolOptions<TState> = CreateDashboardToolDepsOptions<TState> & {
73
- getModel: (args: {
74
- state: TState;
75
- }) => LanguageModel;
76
- createQueryTools?: (args: {
77
- store: DashboardAiStore<TState>;
78
- }) => {
79
- query: Tool;
80
- };
81
- runSubAgent: (args: {
82
- agent: ToolLoopAgent<any, any, any>;
83
- prompt: string;
84
- store: DashboardAiStore<TState>;
85
- parentToolCallId: string;
86
- abortSignal?: AbortSignal;
87
- }) => Promise<DashboardAgentRunResult>;
88
- instructions?: string;
89
- chartTypes?: ChartTypeDefinition<any>[];
90
- /**
91
- * Host-provided dashboard tools keyed by their registered tool name.
92
- * Register geospatial map tools under MAP_TOOL_KEY so prompts and tools
93
- * stay in sync.
94
- */
95
- extraTools?: (deps: DashboardToolDeps) => Record<string, Tool>;
96
- };
97
- export declare const MAP_TOOL_KEY = "create_dashboard_map";
98
- export declare const DASHBOARD_AI_INSTRUCTIONS = "\nDashboard authoring:\n\n**When to use dashboard_agent vs individual tools:**\n- Use `dashboard_agent` for exploratory requests that require data analysis and discovery:\n - \"analyze the earthquakes dataset\"\n - \"create insights dashboard for sales data\"\n - \"find interesting patterns in customer behavior\"\n - Any request asking to \"discover\", \"explore\", \"find insights\", or \"analyze\"\n- Use individual chart tools for direct, specific requests:\n - \"create histogram of magnitude with 20 bins\"\n - \"add a line chart showing sales over time\"\n - \"update the histogram to use 30 bins\"\n\n**Individual dashboard chart tools:**\n- create_dashboard_histogram, create_dashboard_line_chart, create_dashboard_box_plot, create_dashboard_bubble_chart, create_dashboard_count_plot, create_dashboard_heatmap\n- Each chart type has its own tool with specific parameters.\n- For line charts with aggregation, use yFields array with {field: string, aggregate: \"sum\"|\"avg\"|\"min\"|\"max\"}.\n- Set xInterval for temporal binning (year, month, day, hour, etc.).\n- If the host app provides `create_dashboard_map`, use it for map/geospatial/location requests and tables with longitude/latitude or geometry columns. Author its config as native Deck JSON with layer classes in `spec.layers[].@@type`, dataset bindings in `_sqlroomsBinding.dataset`, and table/query sources in `config.datasets`. For data-driven map colors, use color accessors such as `getFillColor`, `getLineColor`, `getColor`, `getSourceColor`, or `getTargetColor` with `{\"@@function\":\"colorScale\", \"field\":\"...\", \"type\":\"sequential\"|\"diverging\"|\"quantize\"|\"quantile\"|\"categorical\", \"scheme\":\"Viridis\", \"domain\":\"auto\"}`.\n- Use `set_dashboard_vgplot` with complete JSON only when no chart tool fits your needs.\n- When calling `create_dashboard_artifact`, `layoutType` may be `grid` or `dock`; omitted values default to `grid`.\n- Ensure specs are valid JSON objects compatible with https://idl.uw.edu/mosaic/schema/latest.json.\n- `list_dashboard_panels` includes runtime issues when a chart failed. Use those issues to repair panels in place: convert too-large bubble charts to heatmaps, add `xInterval` to too-large line charts, and inspect columns/settings for SQL errors.\n";
99
- export declare const DASHBOARD_AGENT_INSTRUCTIONS = "You are a dashboard builder agent that creates and modifies interactive data dashboards.\n\n## Your Role\n\nYou analyze data and create insightful dashboards with multiple visualizations (charts, Data Table Explorers). You can handle both direct requests (\"create histogram of magnitude\") and exploratory requests (\"find interesting insights in earthquakes dataset\").\n\n## Available Tools\n\n**Chart Tools:**\n- create_dashboard_histogram - distribution of numeric values (always safe, aggregates automatically)\n- create_dashboard_line_chart - trends over time or ordered variable (use with aggregations for >10k rows)\n- create_dashboard_box_plot - compare distributions across categories\n- create_dashboard_bubble_chart - relationship between two numeric columns (avoid for >10k rows, use heatmap instead)\n- create_dashboard_count_plot - frequency of categorical values (always safe, aggregates automatically)\n- create_dashboard_heatmap - density/patterns across two dimensions (preferred for large datasets)\n\n**Panel Tools:**\n- create_dashboard_data_table_explorer - table statistics and column summaries\n- create_dashboard_map - native Deck JSON geospatial map panel (if provided by the host app)\n\n**Data Tools:**\n- query - execute SQL queries for data exploration\n\n**Management Tools:**\n- list_dashboard_panels - discover panel IDs and what's on the dashboard\n- remove_dashboard_panel - delete a panel by ID\n\n## Workflows\n\n### Direct Requests\nWhen user provides specific instructions:\n1. Parse intent -> identify chart type\n2. Call appropriate tool with settings\n3. Done\n\nExample: \"create histogram of magnitude with 20 bins\"\n-> create_dashboard_histogram(settings: {field: \"magnitude\", bins: 20})\n\n### Exploratory Requests\nWhen user asks to discover insights:\n1. Use query tool to explore data:\n - Start with simple stats: COUNT, MIN, MAX, AVG, DISTINCT (check total row count!)\n - Check distributions: GROUP BY with COUNT\n - Find correlations: CORR(col1, col2)\n - Identify outliers and patterns\n2. Create targeted charts based on discoveries:\n - If dataset has >10k rows: avoid bubble charts and unaggregated line charts\n - Use histogram, count plot, heatmap, or aggregated visualizations instead\n3. Stop when dashboard tells coherent story\n\n### Update Requests\nTo update existing panels:\n1. Call list_dashboard_panels() to discover panel IDs\n2. Call appropriate create tool with panelId parameter\n3. Panel is updated in-place\n\n## Query Guidelines\n\n**Keep queries simple:**\n- Start with aggregations: COUNT, MIN, MAX, AVG, SUM\n- Use GROUP BY for breakdowns and distributions\n- Use LIMIT to control result size (especially with GROUP BY)\n- Avoid expensive operations: large JOINs, full table scans\n\n**Exploration strategy:**\n- Limit exploration to 5-10 queries per request\n- Start broad (overall stats), then narrow (specific patterns)\n- Stop when you have enough insights for a coherent dashboard\n\n## Best Practices\n\n- **Avoid unaggregated charts for large datasets:** For datasets >10k rows, DO NOT use bubble charts or line charts without aggregations. Use aggregated alternatives instead:\n - For scatter/bubble plots: use heatmap or binned aggregations\n - For line charts: use GROUP BY with time buckets or aggregations\n - Histograms and count plots are always safe (they aggregate automatically)\n- **Check before update:** Always call list_dashboard_panels before updating/removing panels\n- **Repair broken charts:** list_dashboard_panels may return an `issue` per panel. For `too-much-data`, switch to an aggregated chart or add aggregation. For `sql-error`, inspect available columns/types and update the broken panel in place.\n- **Validate columns:** Query tools will validate column existence and types\n- **Handle errors gracefully:** If a query or chart creation fails, try alternative approach";
100
- export declare function createDashboardToolDeps<TState>({ store, adapter, }: CreateDashboardToolDepsOptions<TState>): DashboardToolDeps;
101
- export declare function createDashboardAiTools<TState>({ store, adapter, chartTypes, extraTools, }: CreateDashboardAiToolsOptions<TState>): Record<string, Tool>;
102
- export declare function createDashboardAgentTool<TState>(options: CreateDashboardAgentToolOptions<TState>): Tool;
103
- //# sourceMappingURL=ai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/ai/ai.ts"],"names":[],"mappings":"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"}