@sqlrooms/mosaic 0.29.0-rc.1 → 0.29.0-rc.2

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 (202) hide show
  1. package/README.md +41 -2
  2. package/dist/MosaicChart.d.ts +20 -0
  3. package/dist/MosaicChart.d.ts.map +1 -0
  4. package/dist/MosaicChart.js +25 -0
  5. package/dist/MosaicChart.js.map +1 -0
  6. package/dist/MosaicChartBuilder.d.ts +32 -0
  7. package/dist/MosaicChartBuilder.d.ts.map +1 -0
  8. package/dist/MosaicChartBuilder.js +35 -0
  9. package/dist/MosaicChartBuilder.js.map +1 -0
  10. package/dist/MosaicColorLegend.d.ts +18 -0
  11. package/dist/MosaicColorLegend.d.ts.map +1 -0
  12. package/dist/MosaicColorLegend.js +117 -0
  13. package/dist/MosaicColorLegend.js.map +1 -0
  14. package/dist/MosaicSlice.d.ts +16 -13
  15. package/dist/MosaicSlice.d.ts.map +1 -1
  16. package/dist/MosaicSlice.js +67 -32
  17. package/dist/MosaicSlice.js.map +1 -1
  18. package/dist/VgPlotChart.d.ts +8 -0
  19. package/dist/VgPlotChart.d.ts.map +1 -1
  20. package/dist/VgPlotChart.js +26 -6
  21. package/dist/VgPlotChart.js.map +1 -1
  22. package/dist/chart-builders/ChartBuilderContent.d.ts +26 -0
  23. package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -0
  24. package/dist/chart-builders/ChartBuilderContent.js +59 -0
  25. package/dist/chart-builders/ChartBuilderContent.js.map +1 -0
  26. package/dist/chart-builders/ChartBuilderContext.d.ts +11 -0
  27. package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -0
  28. package/dist/chart-builders/ChartBuilderContext.js +10 -0
  29. package/dist/chart-builders/ChartBuilderContext.js.map +1 -0
  30. package/dist/chart-builders/ChartBuilderDialog.d.ts +23 -0
  31. package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -0
  32. package/dist/chart-builders/ChartBuilderDialog.js +15 -0
  33. package/dist/chart-builders/ChartBuilderDialog.js.map +1 -0
  34. package/dist/chart-builders/FieldSelectorInput.d.ts +13 -0
  35. package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -0
  36. package/dist/chart-builders/FieldSelectorInput.js +19 -0
  37. package/dist/chart-builders/FieldSelectorInput.js.map +1 -0
  38. package/dist/chart-builders/builders.d.ts +7 -0
  39. package/dist/chart-builders/builders.d.ts.map +1 -0
  40. package/dist/chart-builders/builders.js +280 -0
  41. package/dist/chart-builders/builders.js.map +1 -0
  42. package/dist/chart-builders/chartSpecTitle.d.ts +7 -0
  43. package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -0
  44. package/dist/chart-builders/chartSpecTitle.js +10 -0
  45. package/dist/chart-builders/chartSpecTitle.js.map +1 -0
  46. package/dist/chart-builders/createMosaicChartTool.d.ts +45 -0
  47. package/dist/chart-builders/createMosaicChartTool.d.ts.map +1 -0
  48. package/dist/chart-builders/createMosaicChartTool.js +109 -0
  49. package/dist/chart-builders/createMosaicChartTool.js.map +1 -0
  50. package/dist/chart-builders/describeChartSpecs.d.ts +7 -0
  51. package/dist/chart-builders/describeChartSpecs.d.ts.map +1 -0
  52. package/dist/chart-builders/describeChartSpecs.js +38 -0
  53. package/dist/chart-builders/describeChartSpecs.js.map +1 -0
  54. package/dist/chart-builders/types.d.ts +40 -0
  55. package/dist/chart-builders/types.d.ts.map +1 -0
  56. package/dist/chart-builders/types.js +2 -0
  57. package/dist/chart-builders/types.js.map +1 -0
  58. package/dist/dashboard/MosaicDashboard.d.ts +20 -0
  59. package/dist/dashboard/MosaicDashboard.d.ts.map +1 -0
  60. package/dist/dashboard/MosaicDashboard.js +68 -0
  61. package/dist/dashboard/MosaicDashboard.js.map +1 -0
  62. package/dist/dashboard/MosaicDashboardChartPanel.d.ts +3 -0
  63. package/dist/dashboard/MosaicDashboardChartPanel.d.ts.map +1 -0
  64. package/dist/dashboard/MosaicDashboardChartPanel.js +49 -0
  65. package/dist/dashboard/MosaicDashboardChartPanel.js.map +1 -0
  66. package/dist/dashboard/MosaicDashboardCharts.d.ts +3 -0
  67. package/dist/dashboard/MosaicDashboardCharts.d.ts.map +1 -0
  68. package/dist/dashboard/MosaicDashboardCharts.js +45 -0
  69. package/dist/dashboard/MosaicDashboardCharts.js.map +1 -0
  70. package/dist/dashboard/MosaicDashboardContext.d.ts +11 -0
  71. package/dist/dashboard/MosaicDashboardContext.d.ts.map +1 -0
  72. package/dist/dashboard/MosaicDashboardContext.js +10 -0
  73. package/dist/dashboard/MosaicDashboardContext.js.map +1 -0
  74. package/dist/dashboard/MosaicDashboardProfiler.d.ts +3 -0
  75. package/dist/dashboard/MosaicDashboardProfiler.d.ts.map +1 -0
  76. package/dist/dashboard/MosaicDashboardProfiler.js +21 -0
  77. package/dist/dashboard/MosaicDashboardProfiler.js.map +1 -0
  78. package/dist/dashboard/MosaicDashboardSlice.d.ts +68 -0
  79. package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -0
  80. package/dist/dashboard/MosaicDashboardSlice.js +230 -0
  81. package/dist/dashboard/MosaicDashboardSlice.js.map +1 -0
  82. package/dist/dashboard/MosaicDashboardToolbar.d.ts +3 -0
  83. package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -0
  84. package/dist/dashboard/MosaicDashboardToolbar.js +19 -0
  85. package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -0
  86. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +8 -0
  87. package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +1 -0
  88. package/dist/dashboard/VgPlotSpecPopoverEditor.js +40 -0
  89. package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +1 -0
  90. package/dist/editor/MosaicChartContainer.d.ts +51 -0
  91. package/dist/editor/MosaicChartContainer.d.ts.map +1 -0
  92. package/dist/editor/MosaicChartContainer.js +39 -0
  93. package/dist/editor/MosaicChartContainer.js.map +1 -0
  94. package/dist/editor/MosaicChartDisplay.d.ts +18 -0
  95. package/dist/editor/MosaicChartDisplay.d.ts.map +1 -0
  96. package/dist/editor/MosaicChartDisplay.js +21 -0
  97. package/dist/editor/MosaicChartDisplay.js.map +1 -0
  98. package/dist/editor/MosaicChartEditorActions.d.ts +20 -0
  99. package/dist/editor/MosaicChartEditorActions.d.ts.map +1 -0
  100. package/dist/editor/MosaicChartEditorActions.js +18 -0
  101. package/dist/editor/MosaicChartEditorActions.js.map +1 -0
  102. package/dist/editor/MosaicCodeMirrorEditor.d.ts +15 -0
  103. package/dist/editor/MosaicCodeMirrorEditor.d.ts.map +1 -0
  104. package/dist/editor/MosaicCodeMirrorEditor.js +26 -0
  105. package/dist/editor/MosaicCodeMirrorEditor.js.map +1 -0
  106. package/dist/editor/MosaicEditorContext.d.ts +8 -0
  107. package/dist/editor/MosaicEditorContext.d.ts.map +1 -0
  108. package/dist/editor/MosaicEditorContext.js +14 -0
  109. package/dist/editor/MosaicEditorContext.js.map +1 -0
  110. package/dist/editor/MosaicSpecEditorPanel.d.ts +20 -0
  111. package/dist/editor/MosaicSpecEditorPanel.d.ts.map +1 -0
  112. package/dist/editor/MosaicSpecEditorPanel.js +25 -0
  113. package/dist/editor/MosaicSpecEditorPanel.js.map +1 -0
  114. package/dist/editor/mosaicSchema.d.ts +20 -0
  115. package/dist/editor/mosaicSchema.d.ts.map +1 -0
  116. package/dist/editor/mosaicSchema.js +57 -0
  117. package/dist/editor/mosaicSchema.js.map +1 -0
  118. package/dist/editor/types.d.ts +72 -0
  119. package/dist/editor/types.d.ts.map +1 -0
  120. package/dist/editor/types.js +2 -0
  121. package/dist/editor/types.js.map +1 -0
  122. package/dist/editor/useMosaicChartEditor.d.ts +9 -0
  123. package/dist/editor/useMosaicChartEditor.d.ts.map +1 -0
  124. package/dist/editor/useMosaicChartEditor.js +199 -0
  125. package/dist/editor/useMosaicChartEditor.js.map +1 -0
  126. package/dist/index.d.ts +27 -2
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +18 -1
  129. package/dist/index.js.map +1 -1
  130. package/dist/profiler/MosaicProfiler.d.ts +32 -0
  131. package/dist/profiler/MosaicProfiler.d.ts.map +1 -0
  132. package/dist/profiler/MosaicProfiler.js +57 -0
  133. package/dist/profiler/MosaicProfiler.js.map +1 -0
  134. package/dist/profiler/MosaicProfilerHeader.d.ts +7 -0
  135. package/dist/profiler/MosaicProfilerHeader.d.ts.map +1 -0
  136. package/dist/profiler/MosaicProfilerHeader.js +196 -0
  137. package/dist/profiler/MosaicProfilerHeader.js.map +1 -0
  138. package/dist/profiler/MosaicProfilerRows.d.ts +9 -0
  139. package/dist/profiler/MosaicProfilerRows.d.ts.map +1 -0
  140. package/dist/profiler/MosaicProfilerRows.js +65 -0
  141. package/dist/profiler/MosaicProfilerRows.js.map +1 -0
  142. package/dist/profiler/MosaicProfilerStatusBar.d.ts +9 -0
  143. package/dist/profiler/MosaicProfilerStatusBar.d.ts.map +1 -0
  144. package/dist/profiler/MosaicProfilerStatusBar.js +28 -0
  145. package/dist/profiler/MosaicProfilerStatusBar.js.map +1 -0
  146. package/dist/profiler/ProfilerCategoryClient.d.ts +50 -0
  147. package/dist/profiler/ProfilerCategoryClient.d.ts.map +1 -0
  148. package/dist/profiler/ProfilerCategoryClient.js +121 -0
  149. package/dist/profiler/ProfilerCategoryClient.js.map +1 -0
  150. package/dist/profiler/ProfilerCountClient.d.ts +28 -0
  151. package/dist/profiler/ProfilerCountClient.d.ts.map +1 -0
  152. package/dist/profiler/ProfilerCountClient.js +51 -0
  153. package/dist/profiler/ProfilerCountClient.js.map +1 -0
  154. package/dist/profiler/ProfilerHistogramClient.d.ts +69 -0
  155. package/dist/profiler/ProfilerHistogramClient.d.ts.map +1 -0
  156. package/dist/profiler/ProfilerHistogramClient.js +179 -0
  157. package/dist/profiler/ProfilerHistogramClient.js.map +1 -0
  158. package/dist/profiler/ProfilerPageClient.d.ts +37 -0
  159. package/dist/profiler/ProfilerPageClient.d.ts.map +1 -0
  160. package/dist/profiler/ProfilerPageClient.js +65 -0
  161. package/dist/profiler/ProfilerPageClient.js.map +1 -0
  162. package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts +24 -0
  163. package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts.map +1 -0
  164. package/dist/profiler/ProfilerUnsupportedSummaryClient.js +51 -0
  165. package/dist/profiler/ProfilerUnsupportedSummaryClient.js.map +1 -0
  166. package/dist/profiler/createProfilerStore.d.ts +45 -0
  167. package/dist/profiler/createProfilerStore.d.ts.map +1 -0
  168. package/dist/profiler/createProfilerStore.js +120 -0
  169. package/dist/profiler/createProfilerStore.js.map +1 -0
  170. package/dist/profiler/layout.d.ts +7 -0
  171. package/dist/profiler/layout.d.ts.map +1 -0
  172. package/dist/profiler/layout.js +13 -0
  173. package/dist/profiler/layout.js.map +1 -0
  174. package/dist/profiler/profilerController.d.ts +64 -0
  175. package/dist/profiler/profilerController.d.ts.map +1 -0
  176. package/dist/profiler/profilerController.js +123 -0
  177. package/dist/profiler/profilerController.js.map +1 -0
  178. package/dist/profiler/types.d.ts +86 -0
  179. package/dist/profiler/types.d.ts.map +1 -0
  180. package/dist/profiler/types.js +2 -0
  181. package/dist/profiler/types.js.map +1 -0
  182. package/dist/profiler/useMosaicProfiler.d.ts +7 -0
  183. package/dist/profiler/useMosaicProfiler.d.ts.map +1 -0
  184. package/dist/profiler/useMosaicProfiler.js +339 -0
  185. package/dist/profiler/useMosaicProfiler.js.map +1 -0
  186. package/dist/profiler/utils.d.ts +61 -0
  187. package/dist/profiler/utils.d.ts.map +1 -0
  188. package/dist/profiler/utils.js +347 -0
  189. package/dist/profiler/utils.js.map +1 -0
  190. package/dist/tableInterop.d.ts +30 -0
  191. package/dist/tableInterop.d.ts.map +1 -0
  192. package/dist/tableInterop.js +85 -0
  193. package/dist/tableInterop.js.map +1 -0
  194. package/dist/use-mosaic.d.ts +11 -0
  195. package/dist/use-mosaic.d.ts.map +1 -0
  196. package/dist/use-mosaic.js +42 -0
  197. package/dist/use-mosaic.js.map +1 -0
  198. package/dist/useMosaicClient.d.ts +5 -4
  199. package/dist/useMosaicClient.d.ts.map +1 -1
  200. package/dist/useMosaicClient.js +13 -3
  201. package/dist/useMosaicClient.js.map +1 -1
  202. package/package.json +24 -6
@@ -0,0 +1,280 @@
1
+ import { AlignHorizontalDistributeCenter, BarChart3, BarChartHorizontal, BubblesIcon, Code, Grid3X3, LineChart, TrendingUp, } from 'lucide-react';
2
+ const BG_COLOR = '#f5d9a6';
3
+ const FG_COLOR = '#e67f5f';
4
+ /**
5
+ * Creates a count plot (bar chart with counts) of a field
6
+ */
7
+ const countPlotBuilder = {
8
+ id: 'count-plot',
9
+ icon: BarChartHorizontal,
10
+ description: 'Create a count plot of a field',
11
+ fields: [{ key: 'field', label: 'Field', required: true }],
12
+ createSpec: (tableName, { field }) => ({
13
+ plot: [
14
+ {
15
+ mark: 'rectY',
16
+ data: { from: tableName },
17
+ x: { bin: field, maxbins: 25 },
18
+ y: { count: null },
19
+ fill: BG_COLOR,
20
+ inset: 0.5,
21
+ },
22
+ {
23
+ mark: 'rectY',
24
+ data: { from: tableName, filterBy: '$brush' },
25
+ x: { bin: field, maxbins: 25 },
26
+ y: { count: null },
27
+ fill: FG_COLOR,
28
+ inset: 0.5,
29
+ },
30
+ { select: 'intervalX', as: '$brush' },
31
+ ],
32
+ xLabel: field,
33
+ yLabel: null,
34
+ yAxis: null,
35
+ height: 200,
36
+ width: 380,
37
+ margins: { left: 0, right: 10, top: 10, bottom: 30 },
38
+ params: { brush: { select: 'crossfilter' } },
39
+ }),
40
+ };
41
+ /**
42
+ * Creates a histogram with background/filtered overlay
43
+ */
44
+ const histogramBuilder = {
45
+ id: 'histogram',
46
+ icon: BarChart3,
47
+ description: 'Create a histogram of a field',
48
+ fields: [{ key: 'field', label: 'Field', required: true }],
49
+ createSpec: (tableName, { field }) => ({
50
+ plot: [
51
+ {
52
+ mark: 'rectY',
53
+ data: { from: tableName },
54
+ x: { bin: field, maxbins: 40 },
55
+ y: { count: null },
56
+ fill: BG_COLOR,
57
+ inset: 0.5,
58
+ },
59
+ {
60
+ mark: 'rectY',
61
+ data: { from: tableName, filterBy: '$brush' },
62
+ x: { bin: field, maxbins: 40 },
63
+ y: { count: null },
64
+ fill: FG_COLOR,
65
+ inset: 0.5,
66
+ },
67
+ { select: 'intervalX', as: '$brush' },
68
+ ],
69
+ xLabel: field,
70
+ yLabel: 'Count',
71
+ height: 200,
72
+ width: 380,
73
+ margins: { left: 40, right: 10, top: 10, bottom: 30 },
74
+ params: { brush: { select: 'crossfilter' } },
75
+ }),
76
+ };
77
+ /**
78
+ * Creates a line chart of two fields
79
+ */
80
+ const lineChartBuilder = {
81
+ id: 'line-chart',
82
+ icon: LineChart,
83
+ description: 'Create a line chart of two fields',
84
+ fields: [
85
+ { key: 'x', label: 'X Field', required: true },
86
+ { key: 'y', label: 'Y Field', required: true },
87
+ ],
88
+ createSpec: (tableName, { x, y }) => ({
89
+ plot: [
90
+ {
91
+ mark: 'lineY',
92
+ data: { from: tableName, filterBy: '$brush' },
93
+ x,
94
+ y,
95
+ stroke: FG_COLOR,
96
+ },
97
+ { select: 'intervalX', as: '$brush' },
98
+ ],
99
+ xLabel: x,
100
+ yLabel: y,
101
+ height: 250,
102
+ width: 380,
103
+ margins: { left: 50, right: 10, top: 10, bottom: 30 },
104
+ params: { brush: { select: 'crossfilter' } },
105
+ }),
106
+ };
107
+ /**
108
+ * Creates an empirical cumulative distribution (eCDF) chart
109
+ */
110
+ const ecdfBuilder = {
111
+ id: 'ecdf',
112
+ icon: TrendingUp,
113
+ description: 'Create an eCDF chart of a field',
114
+ fields: [{ key: 'field', label: 'Field', required: true }],
115
+ createSpec: (tableName, { field }) => ({
116
+ plot: [
117
+ {
118
+ mark: 'areaY',
119
+ data: { from: tableName, filterBy: '$brush' },
120
+ x: field,
121
+ y: { cumulative: field },
122
+ fill: FG_COLOR,
123
+ fillOpacity: 0.3,
124
+ },
125
+ {
126
+ mark: 'lineY',
127
+ data: { from: tableName, filterBy: '$brush' },
128
+ x: field,
129
+ y: { cumulative: field },
130
+ stroke: FG_COLOR,
131
+ },
132
+ { select: 'intervalX', as: '$brush' },
133
+ ],
134
+ xLabel: field,
135
+ yLabel: 'Cumulative',
136
+ height: 250,
137
+ width: 380,
138
+ margins: { left: 50, right: 10, top: 10, bottom: 30 },
139
+ params: { brush: { select: 'crossfilter' } },
140
+ }),
141
+ };
142
+ /**
143
+ * Creates a 2D heatmap of two fields
144
+ */
145
+ const heatmapBuilder = {
146
+ id: 'heatmap',
147
+ icon: Grid3X3,
148
+ description: 'Create a 2D heatmap of two fields',
149
+ fields: [
150
+ { key: 'x', label: 'X Field', required: true },
151
+ { key: 'y', label: 'Y Field', required: true },
152
+ ],
153
+ createSpec: (tableName, { x, y }) => ({
154
+ plot: [
155
+ {
156
+ mark: 'raster',
157
+ data: { from: tableName, filterBy: '$brush' },
158
+ x,
159
+ y,
160
+ fill: 'density',
161
+ bandwidth: 0,
162
+ pixelSize: 3,
163
+ },
164
+ { select: 'intervalXY', as: '$brush' },
165
+ ],
166
+ colorScale: 'sqrt',
167
+ colorScheme: 'ylorrd',
168
+ xLabel: x,
169
+ yLabel: y,
170
+ height: 250,
171
+ width: 380,
172
+ margins: { left: 40, right: 10, top: 15, bottom: 30 },
173
+ params: { brush: { select: 'crossfilter' } },
174
+ }),
175
+ };
176
+ /**
177
+ * Creates a box plot
178
+ */
179
+ const boxPlotBuilder = {
180
+ id: 'box-plot',
181
+ icon: AlignHorizontalDistributeCenter,
182
+ description: 'Create a box plot',
183
+ fields: [
184
+ { key: 'x', label: 'X Field (categorical)', required: true },
185
+ { key: 'y', label: 'Y Field (numeric)', required: true },
186
+ ],
187
+ createSpec: (tableName, { x, y }) => ({
188
+ plot: [
189
+ {
190
+ mark: 'boxY',
191
+ data: { from: tableName, filterBy: '$brush' },
192
+ x,
193
+ y,
194
+ fill: FG_COLOR,
195
+ },
196
+ { select: 'intervalX', as: '$brush' },
197
+ ],
198
+ xLabel: x,
199
+ yLabel: y,
200
+ height: 250,
201
+ width: 380,
202
+ margins: { left: 50, right: 10, top: 10, bottom: 30 },
203
+ params: { brush: { select: 'crossfilter' } },
204
+ }),
205
+ };
206
+ /**
207
+ * Creates a bubble chart
208
+ */
209
+ const bubbleChartBuilder = {
210
+ id: 'bubble-chart',
211
+ icon: BubblesIcon,
212
+ description: 'Create a bubble chart',
213
+ fields: [
214
+ { key: 'x', label: 'X Field', required: true },
215
+ { key: 'y', label: 'Y Field', required: true },
216
+ ],
217
+ createSpec: (tableName, { x, y }) => ({
218
+ plot: [
219
+ {
220
+ mark: 'dot',
221
+ data: { from: tableName, filterBy: '$brush' },
222
+ x,
223
+ y,
224
+ fill: FG_COLOR,
225
+ fillOpacity: 0.5,
226
+ r: 3,
227
+ },
228
+ { select: 'intervalXY', as: '$brush' },
229
+ ],
230
+ xLabel: x,
231
+ yLabel: y,
232
+ height: 250,
233
+ width: 380,
234
+ margins: { left: 50, right: 10, top: 10, bottom: 30 },
235
+ params: { brush: { select: 'crossfilter' } },
236
+ }),
237
+ };
238
+ /**
239
+ * Creates a chart with custom spec (empty template)
240
+ */
241
+ const customSpecBuilder = {
242
+ id: 'custom-spec',
243
+ icon: Code,
244
+ description: 'Create a chart with custom spec',
245
+ fields: [],
246
+ createSpec: (tableName) => ({
247
+ plot: [
248
+ {
249
+ mark: 'rectY',
250
+ data: { from: tableName, filterBy: '$brush' },
251
+ x: { bin: 'field_name', maxbins: 25 },
252
+ y: { count: null },
253
+ fill: 'steelblue',
254
+ inset: 0.5,
255
+ },
256
+ { select: 'intervalX', as: '$brush' },
257
+ ],
258
+ xLabel: 'field_name',
259
+ height: 200,
260
+ width: 380,
261
+ params: { brush: { select: 'crossfilter' } },
262
+ }),
263
+ };
264
+ /**
265
+ * Creates the default set of chart builders.
266
+ * Call this to get a fresh array that you can extend or filter.
267
+ */
268
+ export function createDefaultChartBuilders() {
269
+ return [
270
+ countPlotBuilder,
271
+ histogramBuilder,
272
+ lineChartBuilder,
273
+ ecdfBuilder,
274
+ heatmapBuilder,
275
+ boxPlotBuilder,
276
+ bubbleChartBuilder,
277
+ customSpecBuilder,
278
+ ];
279
+ }
280
+ //# sourceMappingURL=builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../src/chart-builders/builders.ts"],"names":[],"mappings":"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","sourcesContent":["import {Spec} from '@uwdata/mosaic-spec';\nimport {\n AlignHorizontalDistributeCenter,\n BarChart3,\n BarChartHorizontal,\n BubblesIcon,\n Code,\n Grid3X3,\n LineChart,\n TrendingUp,\n} from 'lucide-react';\nimport {ChartBuilderTemplate} from './types';\n\nconst BG_COLOR = '#f5d9a6';\nconst FG_COLOR = '#e67f5f';\n\n/**\n * Creates a count plot (bar chart with counts) of a field\n */\nconst countPlotBuilder: ChartBuilderTemplate = {\n id: 'count-plot',\n icon: BarChartHorizontal,\n description: 'Create a count plot of a field',\n fields: [{key: 'field', label: 'Field', required: true}],\n createSpec: (tableName, {field}): Spec =>\n ({\n plot: [\n {\n mark: 'rectY',\n data: {from: tableName},\n x: {bin: field, maxbins: 25},\n y: {count: null},\n fill: BG_COLOR,\n inset: 0.5,\n },\n {\n mark: 'rectY',\n data: {from: tableName, filterBy: '$brush'},\n x: {bin: field, maxbins: 25},\n y: {count: null},\n fill: FG_COLOR,\n inset: 0.5,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: field,\n yLabel: null,\n yAxis: null,\n height: 200,\n width: 380,\n margins: {left: 0, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a histogram with background/filtered overlay\n */\nconst histogramBuilder: ChartBuilderTemplate = {\n id: 'histogram',\n icon: BarChart3,\n description: 'Create a histogram of a field',\n fields: [{key: 'field', label: 'Field', required: true}],\n createSpec: (tableName, {field}): Spec =>\n ({\n plot: [\n {\n mark: 'rectY',\n data: {from: tableName},\n x: {bin: field, maxbins: 40},\n y: {count: null},\n fill: BG_COLOR,\n inset: 0.5,\n },\n {\n mark: 'rectY',\n data: {from: tableName, filterBy: '$brush'},\n x: {bin: field, maxbins: 40},\n y: {count: null},\n fill: FG_COLOR,\n inset: 0.5,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: field,\n yLabel: 'Count',\n height: 200,\n width: 380,\n margins: {left: 40, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a line chart of two fields\n */\nconst lineChartBuilder: ChartBuilderTemplate = {\n id: 'line-chart',\n icon: LineChart,\n description: 'Create a line chart of two fields',\n fields: [\n {key: 'x', label: 'X Field', required: true},\n {key: 'y', label: 'Y Field', required: true},\n ],\n createSpec: (tableName, {x, y}): Spec =>\n ({\n plot: [\n {\n mark: 'lineY',\n data: {from: tableName, filterBy: '$brush'},\n x,\n y,\n stroke: FG_COLOR,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: x,\n yLabel: y,\n height: 250,\n width: 380,\n margins: {left: 50, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates an empirical cumulative distribution (eCDF) chart\n */\nconst ecdfBuilder: ChartBuilderTemplate = {\n id: 'ecdf',\n icon: TrendingUp,\n description: 'Create an eCDF chart of a field',\n fields: [{key: 'field', label: 'Field', required: true}],\n createSpec: (tableName, {field}): Spec =>\n ({\n plot: [\n {\n mark: 'areaY',\n data: {from: tableName, filterBy: '$brush'},\n x: field,\n y: {cumulative: field},\n fill: FG_COLOR,\n fillOpacity: 0.3,\n },\n {\n mark: 'lineY',\n data: {from: tableName, filterBy: '$brush'},\n x: field,\n y: {cumulative: field},\n stroke: FG_COLOR,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: field,\n yLabel: 'Cumulative',\n height: 250,\n width: 380,\n margins: {left: 50, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a 2D heatmap of two fields\n */\nconst heatmapBuilder: ChartBuilderTemplate = {\n id: 'heatmap',\n icon: Grid3X3,\n description: 'Create a 2D heatmap of two fields',\n fields: [\n {key: 'x', label: 'X Field', required: true},\n {key: 'y', label: 'Y Field', required: true},\n ],\n createSpec: (tableName, {x, y}): Spec =>\n ({\n plot: [\n {\n mark: 'raster',\n data: {from: tableName, filterBy: '$brush'},\n x,\n y,\n fill: 'density',\n bandwidth: 0,\n pixelSize: 3,\n },\n {select: 'intervalXY', as: '$brush'},\n ],\n colorScale: 'sqrt',\n colorScheme: 'ylorrd',\n xLabel: x,\n yLabel: y,\n height: 250,\n width: 380,\n margins: {left: 40, right: 10, top: 15, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a box plot\n */\nconst boxPlotBuilder: ChartBuilderTemplate = {\n id: 'box-plot',\n icon: AlignHorizontalDistributeCenter,\n description: 'Create a box plot',\n fields: [\n {key: 'x', label: 'X Field (categorical)', required: true},\n {key: 'y', label: 'Y Field (numeric)', required: true},\n ],\n createSpec: (tableName, {x, y}): Spec =>\n ({\n plot: [\n {\n mark: 'boxY',\n data: {from: tableName, filterBy: '$brush'},\n x,\n y,\n fill: FG_COLOR,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: x,\n yLabel: y,\n height: 250,\n width: 380,\n margins: {left: 50, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a bubble chart\n */\nconst bubbleChartBuilder: ChartBuilderTemplate = {\n id: 'bubble-chart',\n icon: BubblesIcon,\n description: 'Create a bubble chart',\n fields: [\n {key: 'x', label: 'X Field', required: true},\n {key: 'y', label: 'Y Field', required: true},\n ],\n createSpec: (tableName, {x, y}): Spec =>\n ({\n plot: [\n {\n mark: 'dot',\n data: {from: tableName, filterBy: '$brush'},\n x,\n y,\n fill: FG_COLOR,\n fillOpacity: 0.5,\n r: 3,\n },\n {select: 'intervalXY', as: '$brush'},\n ],\n xLabel: x,\n yLabel: y,\n height: 250,\n width: 380,\n margins: {left: 50, right: 10, top: 10, bottom: 30},\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates a chart with custom spec (empty template)\n */\nconst customSpecBuilder: ChartBuilderTemplate = {\n id: 'custom-spec',\n icon: Code,\n description: 'Create a chart with custom spec',\n fields: [],\n createSpec: (tableName): Spec =>\n ({\n plot: [\n {\n mark: 'rectY',\n data: {from: tableName, filterBy: '$brush'},\n x: {bin: 'field_name', maxbins: 25},\n y: {count: null},\n fill: 'steelblue',\n inset: 0.5,\n },\n {select: 'intervalX', as: '$brush'},\n ],\n xLabel: 'field_name',\n height: 200,\n width: 380,\n params: {brush: {select: 'crossfilter'}},\n }) as Spec,\n};\n\n/**\n * Creates the default set of chart builders.\n * Call this to get a fresh array that you can extend or filter.\n */\nexport function createDefaultChartBuilders(): ChartBuilderTemplate[] {\n return [\n countPlotBuilder,\n histogramBuilder,\n lineChartBuilder,\n ecdfBuilder,\n heatmapBuilder,\n boxPlotBuilder,\n bubbleChartBuilder,\n customSpecBuilder,\n ];\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { ChartSpec } from './types';
2
+ /**
3
+ * Human-readable chart title from a spec and selected field values.
4
+ * Matches the logic used in {@link ChartBuilderContent}.
5
+ */
6
+ export declare function buildChartTitleForSpec(spec: Pick<ChartSpec, 'description' | 'fields'>, fieldValues: Record<string, string>): string;
7
+ //# sourceMappingURL=chartSpecTitle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chartSpecTitle.d.ts","sourceRoot":"","sources":["../../src/chart-builders/chartSpecTitle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAAC,EAC/C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,MAAM,CAIR"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Human-readable chart title from a spec and selected field values.
3
+ * Matches the logic used in {@link ChartBuilderContent}.
4
+ */
5
+ export function buildChartTitleForSpec(spec, fieldValues) {
6
+ return spec.fields.length > 0
7
+ ? `${spec.description.replace(/^Create (a |an )?/, '')} - ${Object.values(fieldValues).join(', ')}`
8
+ : spec.description.replace(/^Create (a |an )?/, '');
9
+ }
10
+ //# sourceMappingURL=chartSpecTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chartSpecTitle.js","sourceRoot":"","sources":["../../src/chart-builders/chartSpecTitle.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAA+C,EAC/C,WAAmC;IAEnC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import type {ChartSpec} from './types';\n\n/**\n * Human-readable chart title from a spec and selected field values.\n * Matches the logic used in {@link ChartBuilderContent}.\n */\nexport function buildChartTitleForSpec(\n spec: Pick<ChartSpec, 'description' | 'fields'>,\n fieldValues: Record<string, string>,\n): string {\n return spec.fields.length > 0\n ? `${spec.description.replace(/^Create (a |an )?/, '')} - ${Object.values(fieldValues).join(', ')}`\n : spec.description.replace(/^Create (a |an )?/, '');\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import type { Spec } from '@uwdata/mosaic-spec';
2
+ import type { ChartBuilderColumn, ChartSpec } from './types';
3
+ export declare const DEFAULT_MOSAIC_CHART_TOOL_DESCRIPTION = "Create a Mosaic vgplot chart from a built-in template. Prefer this tool for common chart types (histogram, line chart, etc.) instead of writing raw vgplot JSON. Use set_dashboard_vgplot or equivalent only when no template fits.\n\nPass chartType as one of the template ids and fieldValues with keys matching each template's field keys (column names as values).";
4
+ export type MosaicChartToolParameters = {
5
+ chartType: string;
6
+ fieldValues: Record<string, string>;
7
+ reasoning: string;
8
+ };
9
+ export type MosaicChartToolOutput = {
10
+ success: boolean;
11
+ details: string;
12
+ chartType?: string;
13
+ title?: string;
14
+ spec?: Spec;
15
+ errorMessage?: string;
16
+ };
17
+ export type CreateMosaicChartToolOptions = {
18
+ /** Templates to expose (defaults to all built-in templates, icons stripped). */
19
+ specs?: ChartSpec[];
20
+ tableName: string;
21
+ columns: ChartBuilderColumn[];
22
+ onCreateChart: (spec: Spec, title: string) => void;
23
+ /** Tool description shown to the model */
24
+ description?: string;
25
+ };
26
+ /**
27
+ * AI SDK tool that creates a Mosaic spec from {@link ChartSpec} templates.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * tools: {
32
+ * create_mosaic_chart: createMosaicChartTool({
33
+ * tableName: 'sales',
34
+ * columns: [{name: 'amount', type: 'DOUBLE'}],
35
+ * onCreateChart: (spec, title) => store.addChart(spec, title),
36
+ * }),
37
+ * },
38
+ * ```
39
+ */
40
+ export declare function createMosaicChartTool({ specs: specsOption, tableName, columns, onCreateChart, description, }: CreateMosaicChartToolOptions): import("ai").Tool<{
41
+ chartType: string;
42
+ fieldValues: Record<string, string>;
43
+ reasoning: string;
44
+ }, MosaicChartToolOutput>;
45
+ //# sourceMappingURL=createMosaicChartTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMosaicChartTool.d.ts","sourceRoot":"","sources":["../../src/chart-builders/createMosaicChartTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAK9C,OAAO,KAAK,EAAC,kBAAkB,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AAG3D,eAAO,MAAM,qCAAqC,6WAEgF,CAAC;AAEnI,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAmCF,MAAM,MAAM,4BAA4B,GAAG;IACzC,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EAAE,WAAW,EAClB,SAAS,EACT,OAAO,EACP,aAAa,EACb,WAAmD,GACpD,EAAE,4BAA4B;;;;0BA2E9B"}
@@ -0,0 +1,109 @@
1
+ import { tool } from 'ai';
2
+ import { z } from 'zod';
3
+ import { createDefaultChartBuilders } from './builders';
4
+ import { buildChartTitleForSpec } from './chartSpecTitle';
5
+ import { toChartSpec } from './types';
6
+ export const DEFAULT_MOSAIC_CHART_TOOL_DESCRIPTION = `Create a Mosaic vgplot chart from a built-in template. Prefer this tool for common chart types (histogram, line chart, etc.) instead of writing raw vgplot JSON. Use set_dashboard_vgplot or equivalent only when no template fits.
7
+
8
+ Pass chartType as one of the template ids and fieldValues with keys matching each template's field keys (column names as values).`;
9
+ function columnMatchesFieldTypes(column, field) {
10
+ if (!field.types?.length)
11
+ return true;
12
+ return field.types.some((t) => column.type.toUpperCase() === t.toUpperCase());
13
+ }
14
+ function validateFieldValues(spec, fieldValues, columns) {
15
+ for (const field of spec.fields) {
16
+ const required = field.required !== false;
17
+ const raw = fieldValues[field.key];
18
+ if (required && (!raw || raw.trim() === '')) {
19
+ return `Missing required field "${field.key}" (${field.label}).`;
20
+ }
21
+ if (!raw)
22
+ continue;
23
+ const col = columns.find((c) => c.name === raw);
24
+ if (!col) {
25
+ return `Unknown column "${raw}" for field "${field.key}". Use one of: ${columns.map((c) => c.name).join(', ') || '(none)'}.`;
26
+ }
27
+ if (!columnMatchesFieldTypes(col, field)) {
28
+ return `Column "${raw}" has type ${col.type} but field "${field.key}" expects: ${field.types?.join(', ') ?? 'any'}.`;
29
+ }
30
+ }
31
+ return null;
32
+ }
33
+ /**
34
+ * AI SDK tool that creates a Mosaic spec from {@link ChartSpec} templates.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * tools: {
39
+ * create_mosaic_chart: createMosaicChartTool({
40
+ * tableName: 'sales',
41
+ * columns: [{name: 'amount', type: 'DOUBLE'}],
42
+ * onCreateChart: (spec, title) => store.addChart(spec, title),
43
+ * }),
44
+ * },
45
+ * ```
46
+ */
47
+ export function createMosaicChartTool({ specs: specsOption, tableName, columns, onCreateChart, description = DEFAULT_MOSAIC_CHART_TOOL_DESCRIPTION, }) {
48
+ const specs = specsOption && specsOption.length > 0
49
+ ? specsOption
50
+ : createDefaultChartBuilders().map(toChartSpec);
51
+ if (specs.length === 0) {
52
+ throw new Error('createMosaicChartTool: specs must be a non-empty array.');
53
+ }
54
+ const ids = specs.map((s) => s.id);
55
+ const chartTypeEnum = z.enum(ids);
56
+ const MosaicChartToolParametersSchema = z.object({
57
+ chartType: chartTypeEnum.describe(`One of: ${ids.join(', ')}. See describeChartSpecs / system prompt for details.`),
58
+ fieldValues: z
59
+ .record(z.string(), z.string())
60
+ .describe('Map of template field key -> selected column name.'),
61
+ reasoning: z.string().describe('Brief rationale for this chart choice.'),
62
+ });
63
+ return tool({
64
+ description,
65
+ inputSchema: MosaicChartToolParametersSchema,
66
+ execute: async (params) => {
67
+ const { chartType, fieldValues } = params;
68
+ const specDef = specs.find((s) => s.id === chartType);
69
+ if (!specDef) {
70
+ return {
71
+ success: false,
72
+ details: 'Unknown chartType.',
73
+ errorMessage: `No template with id "${chartType}".`,
74
+ };
75
+ }
76
+ const validationError = validateFieldValues(specDef, fieldValues, columns);
77
+ if (validationError) {
78
+ return {
79
+ success: false,
80
+ details: validationError,
81
+ errorMessage: validationError,
82
+ chartType,
83
+ };
84
+ }
85
+ try {
86
+ const spec = specDef.createSpec(tableName, fieldValues);
87
+ const title = buildChartTitleForSpec(specDef, fieldValues);
88
+ onCreateChart(spec, title);
89
+ return {
90
+ success: true,
91
+ details: `Created chart "${title}" from template "${chartType}".`,
92
+ chartType,
93
+ title,
94
+ spec,
95
+ };
96
+ }
97
+ catch (e) {
98
+ const message = e instanceof Error ? e.message : String(e);
99
+ return {
100
+ success: false,
101
+ details: message,
102
+ errorMessage: message,
103
+ chartType,
104
+ };
105
+ }
106
+ },
107
+ });
108
+ }
109
+ //# sourceMappingURL=createMosaicChartTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMosaicChartTool.js","sourceRoot":"","sources":["../../src/chart-builders/createMosaicChartTool.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Spec} from '@uwdata/mosaic-spec';\nimport {tool} from 'ai';\nimport {z} from 'zod';\nimport {createDefaultChartBuilders} from './builders';\nimport {buildChartTitleForSpec} from './chartSpecTitle';\nimport type {ChartBuilderColumn, ChartSpec} from './types';\nimport {toChartSpec} from './types';\n\nexport const DEFAULT_MOSAIC_CHART_TOOL_DESCRIPTION = `Create a Mosaic vgplot chart from a built-in template. Prefer this tool for common chart types (histogram, line chart, etc.) instead of writing raw vgplot JSON. Use set_dashboard_vgplot or equivalent only when no template fits.\n\nPass chartType as one of the template ids and fieldValues with keys matching each template's field keys (column names as values).`;\n\nexport type MosaicChartToolParameters = {\n chartType: string;\n fieldValues: Record<string, string>;\n reasoning: string;\n};\n\nexport type MosaicChartToolOutput = {\n success: boolean;\n details: string;\n chartType?: string;\n title?: string;\n spec?: Spec;\n errorMessage?: string;\n};\n\nfunction columnMatchesFieldTypes(\n column: ChartBuilderColumn,\n field: {types?: string[]},\n): boolean {\n if (!field.types?.length) return true;\n return field.types.some(\n (t) => column.type.toUpperCase() === t.toUpperCase(),\n );\n}\n\nfunction validateFieldValues(\n spec: ChartSpec,\n fieldValues: Record<string, string>,\n columns: ChartBuilderColumn[],\n): string | null {\n for (const field of spec.fields) {\n const required = field.required !== false;\n const raw = fieldValues[field.key];\n if (required && (!raw || raw.trim() === '')) {\n return `Missing required field \"${field.key}\" (${field.label}).`;\n }\n if (!raw) continue;\n const col = columns.find((c) => c.name === raw);\n if (!col) {\n return `Unknown column \"${raw}\" for field \"${field.key}\". Use one of: ${columns.map((c) => c.name).join(', ') || '(none)'}.`;\n }\n if (!columnMatchesFieldTypes(col, field)) {\n return `Column \"${raw}\" has type ${col.type} but field \"${field.key}\" expects: ${field.types?.join(', ') ?? 'any'}.`;\n }\n }\n return null;\n}\n\nexport type CreateMosaicChartToolOptions = {\n /** Templates to expose (defaults to all built-in templates, icons stripped). */\n specs?: ChartSpec[];\n tableName: string;\n columns: ChartBuilderColumn[];\n onCreateChart: (spec: Spec, title: string) => void;\n /** Tool description shown to the model */\n description?: string;\n};\n\n/**\n * AI SDK tool that creates a Mosaic spec from {@link ChartSpec} templates.\n *\n * @example\n * ```ts\n * tools: {\n * create_mosaic_chart: createMosaicChartTool({\n * tableName: 'sales',\n * columns: [{name: 'amount', type: 'DOUBLE'}],\n * onCreateChart: (spec, title) => store.addChart(spec, title),\n * }),\n * },\n * ```\n */\nexport function createMosaicChartTool({\n specs: specsOption,\n tableName,\n columns,\n onCreateChart,\n description = DEFAULT_MOSAIC_CHART_TOOL_DESCRIPTION,\n}: CreateMosaicChartToolOptions) {\n const specs: ChartSpec[] =\n specsOption && specsOption.length > 0\n ? specsOption\n : createDefaultChartBuilders().map(toChartSpec);\n\n if (specs.length === 0) {\n throw new Error('createMosaicChartTool: specs must be a non-empty array.');\n }\n\n const ids = specs.map((s) => s.id);\n const chartTypeEnum = z.enum(ids as [string, ...string[]]);\n\n const MosaicChartToolParametersSchema = z.object({\n chartType: chartTypeEnum.describe(\n `One of: ${ids.join(', ')}. See describeChartSpecs / system prompt for details.`,\n ),\n fieldValues: z\n .record(z.string(), z.string())\n .describe('Map of template field key -> selected column name.'),\n reasoning: z.string().describe('Brief rationale for this chart choice.'),\n });\n\n type In = z.infer<typeof MosaicChartToolParametersSchema>;\n\n return tool<In, MosaicChartToolOutput>({\n description,\n inputSchema: MosaicChartToolParametersSchema,\n execute: async (params) => {\n const {chartType, fieldValues} = params;\n const specDef = specs.find((s) => s.id === chartType);\n if (!specDef) {\n return {\n success: false,\n details: 'Unknown chartType.',\n errorMessage: `No template with id \"${chartType}\".`,\n };\n }\n\n const validationError = validateFieldValues(\n specDef,\n fieldValues,\n columns,\n );\n if (validationError) {\n return {\n success: false,\n details: validationError,\n errorMessage: validationError,\n chartType,\n };\n }\n\n try {\n const spec = specDef.createSpec(tableName, fieldValues);\n const title = buildChartTitleForSpec(specDef, fieldValues);\n onCreateChart(spec, title);\n return {\n success: true,\n details: `Created chart \"${title}\" from template \"${chartType}\".`,\n chartType,\n title,\n spec,\n };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n details: message,\n errorMessage: message,\n chartType,\n };\n }\n },\n });\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { ChartBuilderColumn, ChartSpec } from './types';
2
+ /**
3
+ * Serialize chart specs and column metadata into a string suitable for LLM
4
+ * system prompts (e.g. alongside dashboard authoring instructions).
5
+ */
6
+ export declare function describeChartSpecs(specs: ChartSpec[], tableName: string, columns: ChartBuilderColumn[]): string;
7
+ //# sourceMappingURL=describeChartSpecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describeChartSpecs.d.ts","sourceRoot":"","sources":["../../src/chart-builders/describeChartSpecs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAqB,SAAS,EAAC,MAAM,SAAS,CAAC;AA0B9E;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,EAAE,GAC5B,MAAM,CAeR"}
@@ -0,0 +1,38 @@
1
+ function formatFieldConstraints(field) {
2
+ const parts = [];
3
+ if (field.types?.length) {
4
+ parts.push(`columns typed ${field.types.join(' | ')}`);
5
+ }
6
+ else {
7
+ parts.push('any column');
8
+ }
9
+ if (field.required === false) {
10
+ parts.push('optional');
11
+ }
12
+ return parts.join(', ');
13
+ }
14
+ function formatFieldsBlock(spec) {
15
+ if (spec.fields.length === 0) {
16
+ return ' Fields: none (template spec only; edit manually after creation)';
17
+ }
18
+ const lines = spec.fields.map((f) => {
19
+ const req = f.required !== false ? 'required' : 'optional';
20
+ return ` - ${f.key} (${f.label}): ${req}; ${formatFieldConstraints(f)}`;
21
+ });
22
+ return ` Fields:\n${lines.join('\n')}`;
23
+ }
24
+ /**
25
+ * Serialize chart specs and column metadata into a string suitable for LLM
26
+ * system prompts (e.g. alongside dashboard authoring instructions).
27
+ */
28
+ export function describeChartSpecs(specs, tableName, columns) {
29
+ const header = `Available chart templates for table "${tableName}":`;
30
+ const body = specs
31
+ .map((spec) => `- ${spec.id}: ${spec.description}\n${formatFieldsBlock(spec)}`)
32
+ .join('\n');
33
+ const colLine = columns.length > 0
34
+ ? columns.map((c) => `${c.name} (${c.type})`).join(', ')
35
+ : '(no columns provided)';
36
+ return `${header}\n${body}\n\nAvailable columns: ${colLine}`;
37
+ }
38
+ //# sourceMappingURL=describeChartSpecs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describeChartSpecs.js","sourceRoot":"","sources":["../../src/chart-builders/describeChartSpecs.ts"],"names":[],"mappings":"AAEA,SAAS,sBAAsB,CAAC,KAAwB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAe;IACxC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,mEAAmE,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3D,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,GAAG,KAAK,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,SAAiB,EACjB,OAA6B;IAE7B,MAAM,MAAM,GAAG,wCAAwC,SAAS,IAAI,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAClE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD,CAAC,CAAC,uBAAuB,CAAC;IAE9B,OAAO,GAAG,MAAM,KAAK,IAAI,0BAA0B,OAAO,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["import type {ChartBuilderColumn, ChartBuilderField, ChartSpec} from './types';\n\nfunction formatFieldConstraints(field: ChartBuilderField): string {\n const parts: string[] = [];\n if (field.types?.length) {\n parts.push(`columns typed ${field.types.join(' | ')}`);\n } else {\n parts.push('any column');\n }\n if (field.required === false) {\n parts.push('optional');\n }\n return parts.join(', ');\n}\n\nfunction formatFieldsBlock(spec: ChartSpec): string {\n if (spec.fields.length === 0) {\n return ' Fields: none (template spec only; edit manually after creation)';\n }\n const lines = spec.fields.map((f) => {\n const req = f.required !== false ? 'required' : 'optional';\n return ` - ${f.key} (${f.label}): ${req}; ${formatFieldConstraints(f)}`;\n });\n return ` Fields:\\n${lines.join('\\n')}`;\n}\n\n/**\n * Serialize chart specs and column metadata into a string suitable for LLM\n * system prompts (e.g. alongside dashboard authoring instructions).\n */\nexport function describeChartSpecs(\n specs: ChartSpec[],\n tableName: string,\n columns: ChartBuilderColumn[],\n): string {\n const header = `Available chart templates for table \"${tableName}\":`;\n const body = specs\n .map(\n (spec) =>\n `- ${spec.id}: ${spec.description}\\n${formatFieldsBlock(spec)}`,\n )\n .join('\\n');\n\n const colLine =\n columns.length > 0\n ? columns.map((c) => `${c.name} (${c.type})`).join(', ')\n : '(no columns provided)';\n\n return `${header}\\n${body}\\n\\nAvailable columns: ${colLine}`;\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { Spec } from '@uwdata/mosaic-spec';
2
+ import { ComponentType } from 'react';
3
+ /**
4
+ * Describes a field selector in a chart builder UI
5
+ */
6
+ export interface ChartBuilderField {
7
+ /** Unique key for this field */
8
+ key: string;
9
+ /** Display label */
10
+ label: string;
11
+ /** Whether the field is required */
12
+ required?: boolean;
13
+ /** Filter columns by DuckDB type (e.g. 'INTEGER', 'VARCHAR', 'DOUBLE') */
14
+ types?: string[];
15
+ }
16
+ /**
17
+ * Describes a chart builder template that generates Mosaic JSON specs
18
+ */
19
+ export interface ChartBuilderTemplate {
20
+ /** Unique identifier */
21
+ id: string;
22
+ /** Icon component */
23
+ icon: ComponentType<{
24
+ className?: string;
25
+ }>;
26
+ /** Short description of what this builder creates */
27
+ description: string;
28
+ /** Field selectors the user must fill in */
29
+ fields: ChartBuilderField[];
30
+ /** Generate a Mosaic spec from table name and selected field values */
31
+ createSpec: (tableName: string, values: Record<string, string>) => Spec;
32
+ }
33
+ /**
34
+ * Column info passed to chart builder UI
35
+ */
36
+ export interface ChartBuilderColumn {
37
+ name: string;
38
+ type: string;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chart-builders/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAC1C,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,uEAAuE;IACvE,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chart-builders/types.ts"],"names":[],"mappings":"","sourcesContent":["import {Spec} from '@uwdata/mosaic-spec';\nimport {ComponentType} from 'react';\n\n/**\n * Describes a field selector in a chart builder UI\n */\nexport interface ChartBuilderField {\n /** Unique key for this field */\n key: string;\n /** Display label */\n label: string;\n /** Whether the field is required */\n required?: boolean;\n /** Filter columns by DuckDB type (e.g. 'INTEGER', 'VARCHAR', 'DOUBLE') */\n types?: string[];\n}\n\n/**\n * Describes a chart builder template that generates Mosaic JSON specs\n */\nexport interface ChartBuilderTemplate {\n /** Unique identifier */\n id: string;\n /** Icon component */\n icon: ComponentType<{className?: string}>;\n /** Short description of what this builder creates */\n description: string;\n /** Field selectors the user must fill in */\n fields: ChartBuilderField[];\n /** Generate a Mosaic spec from table name and selected field values */\n createSpec: (tableName: string, values: Record<string, string>) => Spec;\n}\n\n/**\n * Column info passed to chart builder UI\n */\nexport interface ChartBuilderColumn {\n name: string;\n type: string;\n}\n"]}