ggaction 0.0.13 → 0.0.16

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 (359) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +41 -12
  3. package/knowledge/action-cards.json +1 -1
  4. package/knowledge/intent-taxonomy.json +1 -1
  5. package/knowledge/mcp-resources.json +1 -1
  6. package/knowledge/task-packet.schema.json +1 -1
  7. package/knowledge/task-resolver.js +1 -1
  8. package/package.json +39 -7
  9. package/src/BasicChartProgram.js +3 -1
  10. package/src/ChartProgram.js +2 -0
  11. package/src/accessibility.js +157 -0
  12. package/src/actions/basic.js +2 -2
  13. package/src/actions/boxPlots/components.js +20 -12
  14. package/src/actions/boxPlots/create.js +4 -5
  15. package/src/actions/boxPlots/edit.js +34 -9
  16. package/src/actions/boxPlots/materialize.js +12 -4
  17. package/src/actions/boxPlots/options.js +48 -16
  18. package/src/actions/canvas/actions.js +3 -3
  19. package/src/actions/canvas/fitting.js +1 -1
  20. package/src/actions/categoryOrder/index.js +21 -12
  21. package/src/actions/charts/area.js +6 -2
  22. package/src/actions/charts/bar.js +3 -2
  23. package/src/actions/charts/beeswarm.js +1 -1
  24. package/src/actions/charts/density.js +7 -3
  25. package/src/actions/charts/ecdf.js +6 -3
  26. package/src/actions/charts/endpoints.js +29 -7
  27. package/src/actions/charts/heatmap.js +3 -2
  28. package/src/actions/charts/histogram.js +5 -4
  29. package/src/actions/charts/horizon.js +4 -2
  30. package/src/actions/charts/interval-regression.js +7 -4
  31. package/src/actions/charts/line.js +4 -2
  32. package/src/actions/charts/parallel.js +9 -3
  33. package/src/actions/charts/pie.js +11 -3
  34. package/src/actions/charts/polar.js +17 -6
  35. package/src/actions/charts/radar.js +9 -3
  36. package/src/actions/charts/radial.js +12 -4
  37. package/src/actions/charts/raincloud.js +2 -2
  38. package/src/actions/charts/rug-strip.js +8 -4
  39. package/src/actions/charts/scatter.js +4 -2
  40. package/src/actions/composition/actions.js +29 -24
  41. package/src/actions/coordinates/actions.js +2 -2
  42. package/src/actions/coordinates/edit.js +76 -0
  43. package/src/actions/data/basicBin2d.js +4 -5
  44. package/src/actions/data/bin.js +3 -3
  45. package/src/actions/data/bin2d.js +63 -193
  46. package/src/actions/data/bin2dMaterialize.js +4 -5
  47. package/src/actions/data/box.js +4 -4
  48. package/src/actions/data/complete.js +26 -0
  49. package/src/actions/data/computed.js +4 -4
  50. package/src/actions/data/create.js +7 -14
  51. package/src/actions/data/density.js +15 -23
  52. package/src/actions/data/derived.js +57 -31
  53. package/src/actions/data/ecdf.js +2 -2
  54. package/src/actions/data/edit.js +551 -0
  55. package/src/actions/data/filter.js +28 -22
  56. package/src/actions/data/fold.js +2 -2
  57. package/src/actions/data/gradientProfile.js +2 -2
  58. package/src/actions/data/horizon.js +2 -2
  59. package/src/actions/data/impute.js +26 -0
  60. package/src/actions/data/index.js +62 -47
  61. package/src/actions/data/interval.js +2 -2
  62. package/src/actions/data/intervalEdit.js +26 -18
  63. package/src/actions/data/normalize.js +27 -0
  64. package/src/actions/data/regression.js +21 -27
  65. package/src/actions/data/revise.js +48 -0
  66. package/src/actions/data/revisionBindings.js +125 -0
  67. package/src/actions/data/shared.js +20 -4
  68. package/src/actions/data/stack.js +2 -2
  69. package/src/actions/data/summary.js +3 -3
  70. package/src/actions/data/timeUnit.js +6 -3
  71. package/src/actions/data/window.js +3 -3
  72. package/src/actions/encodings/angle.js +1 -1
  73. package/src/actions/encodings/appearance.js +4 -4
  74. package/src/actions/encodings/barWidth.js +1 -1
  75. package/src/actions/encodings/channels.js +415 -0
  76. package/src/actions/encodings/color/index.js +3 -2
  77. package/src/actions/encodings/density.js +7 -4
  78. package/src/actions/encodings/histogram.js +4 -3
  79. package/src/actions/encodings/horizon.js +6 -8
  80. package/src/actions/encodings/index.js +4 -0
  81. package/src/actions/encodings/offset.js +22 -15
  82. package/src/actions/encodings/parallel.js +4 -5
  83. package/src/actions/encodings/pathOrder.js +6 -11
  84. package/src/actions/encodings/position/apply.js +53 -7
  85. package/src/actions/encodings/position/index.js +14 -6
  86. package/src/actions/encodings/position/policies/bar.js +9 -0
  87. package/src/actions/encodings/position/resolve.js +24 -7
  88. package/src/actions/encodings/ranged.js +5 -5
  89. package/src/actions/encodings/remove.js +13 -9
  90. package/src/actions/encodings/ruleAppearance.js +2 -24
  91. package/src/actions/encodings/seriesLayout.js +2 -1
  92. package/src/actions/encodings/shared.js +82 -14
  93. package/src/actions/encodings/stroke.js +226 -0
  94. package/src/actions/encodings/strokeDash.js +2 -2
  95. package/src/actions/encodings/text.js +1 -1
  96. package/src/actions/errorBands/create.js +34 -20
  97. package/src/actions/errorBands/edit.js +34 -137
  98. package/src/actions/errorBars/create.js +43 -20
  99. package/src/actions/errorBars/edit.js +29 -125
  100. package/src/actions/facets/actions.js +267 -73
  101. package/src/actions/facets/derive.js +99 -28
  102. package/src/actions/facets/guides.js +4 -5
  103. package/src/actions/facets/replay.js +4 -5
  104. package/src/actions/gradientPlots/components.js +15 -8
  105. package/src/actions/gradientPlots/create.js +4 -5
  106. package/src/actions/gradientPlots/edit.js +18 -9
  107. package/src/actions/gradientPlots/materialize.js +5 -3
  108. package/src/actions/gradientPlots/options.js +10 -2
  109. package/src/actions/gradientPlots/rebind.js +4 -5
  110. package/src/actions/guides/applicability.js +8 -2
  111. package/src/actions/guides/axes/axes.js +23 -4
  112. package/src/actions/guides/axes/axis.js +2 -2
  113. package/src/actions/guides/axes/edit.js +2 -2
  114. package/src/actions/guides/axes/labels.js +67 -21
  115. package/src/actions/guides/axes/lines.js +15 -9
  116. package/src/actions/guides/axes/parallel/lifecycle.js +13 -13
  117. package/src/actions/guides/axes/parallel/resolve.js +6 -2
  118. package/src/actions/guides/axes/parallel.js +5 -5
  119. package/src/actions/guides/axes/remove.js +4 -4
  120. package/src/actions/guides/axes/tickGroups.js +6 -5
  121. package/src/actions/guides/axes/ticks.js +19 -6
  122. package/src/actions/guides/axes/titles.js +21 -13
  123. package/src/actions/guides/grids/grid.js +18 -29
  124. package/src/actions/guides/grids/resolve.js +7 -2
  125. package/src/actions/guides/guides.js +20 -4
  126. package/src/actions/guides/legends/blocks.js +426 -0
  127. package/src/actions/guides/legends/categorical/actions.js +138 -52
  128. package/src/actions/guides/legends/categorical/components.js +55 -45
  129. package/src/actions/guides/legends/categorical/index.js +37 -33
  130. package/src/actions/guides/legends/categorical/layout.js +98 -16
  131. package/src/actions/guides/legends/categorical/options.js +2 -2
  132. package/src/actions/guides/legends/categorical/recipes.js +111 -20
  133. package/src/actions/guides/legends/categorical/resolve.js +12 -8
  134. package/src/actions/guides/legends/categorical/symbols.js +104 -52
  135. package/src/actions/guides/legends/continuous/common.js +76 -20
  136. package/src/actions/guides/legends/continuous/gradient.js +95 -158
  137. package/src/actions/guides/legends/continuous/index.js +2 -0
  138. package/src/actions/guides/legends/continuous/interval.js +21 -16
  139. package/src/actions/guides/legends/continuous/opacity.js +37 -83
  140. package/src/actions/guides/legends/continuous/stroke.js +225 -0
  141. package/src/actions/guides/legends/creation.js +14 -1
  142. package/src/actions/guides/legends/edit.js +159 -60
  143. package/src/actions/guides/legends/focused.js +5 -5
  144. package/src/actions/guides/legends/index.js +2 -0
  145. package/src/actions/guides/legends/lane.js +59 -24
  146. package/src/actions/guides/legends/lifecycle.js +19 -8
  147. package/src/actions/guides/legends/remove.js +17 -8
  148. package/src/actions/guides/legends/sampling.js +140 -0
  149. package/src/actions/guides/legends/size.js +100 -108
  150. package/src/actions/guides/legends/strokeWidth.js +38 -92
  151. package/src/actions/guides/legends/target.js +112 -1
  152. package/src/actions/guides/legends/transition.js +165 -16
  153. package/src/actions/guides/polar/axes/facade.js +8 -8
  154. package/src/actions/guides/polar/axes/labels.js +29 -10
  155. package/src/actions/guides/polar/axes/lines.js +19 -19
  156. package/src/actions/guides/polar/axes/shared.js +16 -0
  157. package/src/actions/guides/polar/axes/ticks.js +10 -16
  158. package/src/actions/guides/polar/axes/titles.js +6 -6
  159. package/src/actions/guides/polar/grids.js +12 -14
  160. package/src/actions/guides/polar/resolve.js +12 -8
  161. package/src/actions/index.js +16 -3
  162. package/src/actions/intervals/revision.js +126 -0
  163. package/src/actions/marks/arc/actions.js +80 -22
  164. package/src/actions/marks/area/actions.js +38 -13
  165. package/src/actions/marks/area/materialize.js +17 -1
  166. package/src/actions/marks/bar/create.js +12 -3
  167. package/src/actions/marks/bar/edit.js +21 -4
  168. package/src/actions/marks/bar/materialize.js +34 -40
  169. package/src/actions/marks/index.js +10 -1
  170. package/src/actions/marks/line/actions.js +40 -17
  171. package/src/actions/marks/line/materialize.js +29 -10
  172. package/src/actions/marks/point/create.js +9 -3
  173. package/src/actions/marks/point/edit.js +19 -7
  174. package/src/actions/marks/point/jitter.js +6 -8
  175. package/src/actions/marks/point/materialize.js +48 -22
  176. package/src/actions/marks/point/packing.js +6 -8
  177. package/src/actions/marks/rect/actions.js +36 -15
  178. package/src/actions/marks/references.js +602 -33
  179. package/src/actions/marks/remove.js +67 -41
  180. package/src/actions/marks/rule/actions.js +51 -14
  181. package/src/actions/marks/shared.js +1 -1
  182. package/src/actions/marks/text/actions.js +79 -14
  183. package/src/actions/marks/text/index.js +4 -0
  184. package/src/actions/marks/text/layout.js +157 -17
  185. package/src/actions/marks/text/removal.js +173 -0
  186. package/src/actions/marks/text/selection.js +72 -0
  187. package/src/actions/marks/tick/actions.js +25 -8
  188. package/src/actions/primitives/createGraphics.js +5 -4
  189. package/src/actions/primitives/editGraphics.js +31 -4
  190. package/src/actions/primitives/graphicProperties.js +6 -0
  191. package/src/actions/primitives/semantic.js +11 -3
  192. package/src/actions/primitives/semanticAction.js +90 -14
  193. package/src/actions/primitives/semanticValidation/dataset.js +2 -4
  194. package/src/actions/primitives/semanticValidation/guide.js +1 -1
  195. package/src/actions/primitives/semanticValidation/index.js +9 -1
  196. package/src/actions/primitives/semanticValidation/layer.js +5 -0
  197. package/src/actions/primitives/semanticValidation/scale.js +28 -7
  198. package/src/actions/regression/components.js +36 -25
  199. package/src/actions/regression/create.js +13 -6
  200. package/src/actions/regression/edit.js +24 -11
  201. package/src/actions/resources/index.js +7 -0
  202. package/src/actions/resources/remove.js +173 -0
  203. package/src/actions/scales/channels.js +212 -0
  204. package/src/actions/scales/consumers/common.js +1 -1
  205. package/src/actions/scales/consumers/families.js +3 -2
  206. package/src/actions/scales/consumers/index.js +19 -2
  207. package/src/actions/scales/consumers/seriesLayout.js +28 -14
  208. package/src/actions/scales/create.js +55 -23
  209. package/src/actions/scales/definitions.js +94 -40
  210. package/src/actions/scales/edit.js +67 -12
  211. package/src/actions/scales/editPolicy.js +81 -11
  212. package/src/actions/scales/index.js +6 -0
  213. package/src/actions/scales/materialize.js +5 -4
  214. package/src/actions/scales/offset.js +48 -0
  215. package/src/actions/scales/parallel.js +71 -0
  216. package/src/actions/scales/preview.js +111 -10
  217. package/src/actions/scales/quantitativeColor.js +4 -5
  218. package/src/actions/selection/actions.js +179 -66
  219. package/src/actions/selection/index.js +3 -0
  220. package/src/actions/textMetrics/index.js +56 -0
  221. package/src/actions/theme/actions.js +70 -15
  222. package/src/actions/theme/composition.js +238 -0
  223. package/src/actions/theme/index.js +9 -2
  224. package/src/actions/theme/reconcile.js +313 -121
  225. package/src/actions/theme/state.js +160 -0
  226. package/src/actions/titles/actions.js +8 -8
  227. package/src/actions/titles/resolve.js +3 -3
  228. package/src/actions/violinPlots/create.js +6 -3
  229. package/src/actions/violinPlots/edit.js +2 -1
  230. package/src/core/action.js +117 -35
  231. package/src/core/compositionState.js +6 -1
  232. package/src/core/diagnostics.js +16 -0
  233. package/src/core/extensionRegistry.js +27 -0
  234. package/src/core/font.js +18 -0
  235. package/src/core/identifiers.js +5 -4
  236. package/src/core/immutable.js +10 -3
  237. package/src/core/optionRequirements.js +8 -0
  238. package/src/core/programState.js +21 -1
  239. package/src/core/resourceReferences.js +341 -0
  240. package/src/core/textMetricProfile.js +28 -0
  241. package/src/core/textMetrics.js +24 -3
  242. package/src/core/validation.js +22 -10
  243. package/src/core/vocabulary.js +16 -3
  244. package/src/diagnostics.js +1 -0
  245. package/src/grammar/bars/aggregate.js +4 -1
  246. package/src/grammar/bars/geometry.js +44 -0
  247. package/src/grammar/bin.js +54 -9
  248. package/src/grammar/complete.js +279 -0
  249. package/src/grammar/computed.js +265 -64
  250. package/src/grammar/coordinates.js +37 -0
  251. package/src/grammar/density.js +239 -37
  252. package/src/grammar/displayLabels.js +57 -0
  253. package/src/grammar/facets/dependencies.js +133 -1
  254. package/src/grammar/facets/guides.js +3 -0
  255. package/src/grammar/facets/index.js +7 -47
  256. package/src/grammar/facets/scales.js +15 -18
  257. package/src/grammar/impute.js +341 -0
  258. package/src/grammar/markLabelSelection.js +57 -0
  259. package/src/grammar/markLabels.js +18 -1
  260. package/src/grammar/normalize.js +366 -0
  261. package/src/grammar/pathSeries.js +26 -8
  262. package/src/grammar/pointShapes.js +13 -4
  263. package/src/grammar/polar.js +90 -8
  264. package/src/grammar/regression/index.js +1 -0
  265. package/src/grammar/regression/parameters.js +23 -0
  266. package/src/grammar/roundedRect.js +180 -0
  267. package/src/grammar/rules.js +1 -0
  268. package/src/grammar/scales/colorConsumers.js +20 -1
  269. package/src/grammar/scales/continuous.js +2 -2
  270. package/src/grammar/scales/definition.js +27 -4
  271. package/src/grammar/scales/index.js +1 -0
  272. package/src/grammar/scales/ordinal.js +12 -3
  273. package/src/grammar/scales/policies.js +2 -2
  274. package/src/grammar/scales/size.js +456 -0
  275. package/src/grammar/scales/types.js +8 -0
  276. package/src/grammar/schemas/concreteGraphic.js +14 -2
  277. package/src/grammar/schemas/graphic.js +15 -0
  278. package/src/grammar/schemas/graphicBounds.js +190 -41
  279. package/src/grammar/schemas/semanticPath.js +7 -2
  280. package/src/grammar/statisticalReference.js +103 -0
  281. package/src/grammar/strokeStyle.js +77 -0
  282. package/src/grammar/summary.js +78 -16
  283. package/src/grammar/timeUnit.js +216 -5
  284. package/src/grammar/transformTopology.js +4 -0
  285. package/src/grammar/transforms.js +394 -28
  286. package/src/grammar/weightedStatistics.js +374 -0
  287. package/src/grammar/window.js +221 -16
  288. package/src/layout/aspect.js +80 -0
  289. package/src/layout/facets.js +59 -5
  290. package/src/layout/labels.js +351 -7
  291. package/src/layout/legend.js +4 -4
  292. package/src/layout/legendItems.js +6 -6
  293. package/src/layout/text.js +10 -9
  294. package/src/layout/title.js +9 -9
  295. package/src/materialization/bars/aggregate.js +25 -2
  296. package/src/materialization/bars/histogram.js +84 -24
  297. package/src/materialization/bars/ranged.js +19 -3
  298. package/src/materialization/bars/resolve.js +7 -4
  299. package/src/materialization/composition.js +3 -1
  300. package/src/materialization/coordinateBounds.js +204 -0
  301. package/src/materialization/dependencies.js +36 -0
  302. package/src/materialization/facetGuides/legacyCategorical.js +3 -0
  303. package/src/materialization/facetGuides/placement.js +9 -3
  304. package/src/materialization/facetGuides/preparation.js +13 -8
  305. package/src/materialization/facetHeaders.js +347 -0
  306. package/src/materialization/facets.js +15 -65
  307. package/src/materialization/guides/layout.js +3 -3
  308. package/src/materialization/guides/resources.js +26 -0
  309. package/src/materialization/legends.js +1 -1
  310. package/src/materialization/marks/index.js +11 -5
  311. package/src/materialization/marks/policies.js +2 -1
  312. package/src/materialization/rect.js +25 -12
  313. package/src/materialization/rectConfig.js +5 -1
  314. package/src/materialization/scaleGuideDependencies.js +10 -0
  315. package/src/materialization/scales/map.js +5 -3
  316. package/src/materialization/scales/policies/binnedPosition.js +2 -2
  317. package/src/materialization/scales/policies/offset.js +50 -8
  318. package/src/materialization/scales/policies/series.js +4 -1
  319. package/src/materialization/scales/resolve.js +22 -6
  320. package/src/materialization/selection/items/arc.js +28 -4
  321. package/src/materialization/selection/items/bar.js +30 -3
  322. package/src/materialization/selection/items/common.js +20 -5
  323. package/src/materialization/selection/items/rect.js +28 -4
  324. package/src/materialization/selection/path.js +1 -1
  325. package/src/materialization/selection/point.js +3 -1
  326. package/src/materialization/text.js +265 -14
  327. package/src/materialization/typography.js +31 -0
  328. package/src/mcp/cli.js +5 -3
  329. package/src/persistence/codec.js +65 -0
  330. package/src/persistence/validation.js +185 -0
  331. package/src/persistence.js +74 -0
  332. package/src/renderers/canvas/circle.js +2 -3
  333. package/src/renderers/canvas/index.js +5 -4
  334. package/src/renderers/canvas/line.js +2 -3
  335. package/src/renderers/canvas/native.js +4 -4
  336. package/src/renderers/canvas/path.js +2 -3
  337. package/src/renderers/canvas/rect.js +2 -3
  338. package/src/renderers/canvas/stroke.js +11 -0
  339. package/src/renderers/nativeBackend.js +10 -0
  340. package/src/renderers/options.js +13 -0
  341. package/src/renderers/pdf.js +25 -54
  342. package/src/renderers/png.js +22 -17
  343. package/src/renderers/svg.js +29 -14
  344. package/src/renderers/text.js +1 -11
  345. package/src/selectors/coordinates.js +3 -1
  346. package/src/selectors/datasets.js +38 -5
  347. package/src/selectors/layers.js +10 -4
  348. package/src/selectors/markOwners.js +46 -0
  349. package/src/selectors/scales.js +6 -4
  350. package/src/theme/defaults.js +103 -1
  351. package/src/version.js +2 -0
  352. package/types/accessibility.d.ts +37 -0
  353. package/types/basic.d.ts +10 -2
  354. package/types/diagnostics.d.ts +15 -0
  355. package/types/index.d.ts +90 -0
  356. package/types/pdf.d.ts +9 -0
  357. package/types/persistence.d.ts +7 -0
  358. package/types/png.d.ts +9 -0
  359. package/types/program.d.ts +944 -118
@@ -1 +1 @@
1
- var xe=Object.defineProperty;var p=(o,e)=>xe(o,"name",{value:e,configurable:!0});import{readFileSync as se}from"node:fs";import ce from"node:path";import{fileURLToPath as we}from"node:url";const de=we(new URL("../",import.meta.url)),Z=JSON.parse(se(ce.join(de,"knowledge/action-cards.json"),"utf8")),C=JSON.parse(se(ce.join(de,"knowledge/intent-taxonomy.json"),"utf8")),N=new Map(Z.cards.map(o=>[o.name,o])),U=new Map(C.constraints.map(o=>[o.id,o])),le=Object.freeze(["hconcat","vconcat","render"]),te=Object.freeze({renderToSVG:Object.freeze({entry:"ggaction/svg",output:"svg"}),renderToPNG:Object.freeze({entry:"ggaction/png",output:"png"}),renderToPDF:Object.freeze({entry:"ggaction/pdf",output:"pdf"})}),re=Object.freeze(["createCanvas","createData"]),Pe=Object.freeze({width:"800",height:"600",margin:"{ top: 140, right: 220, bottom: 120, left: 260 }"}),pe=new Set(["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createBoxPlot","createGradientPlot","createViolinPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot","createRugPlot","createStripPlot"]),$e=new Set(["createAxes","createXAxis","createYAxis","createGrid","createLegend","createGuides"]),Se=Object.freeze({"chart.type":"ggaction://docs/choose-chart-type","renderer.format":"ggaction://docs/choose-renderer","layout.responsive":"ggaction://docs/responsive-layout","output.accessibility":"ggaction://docs/accessibility","renderer.svg.accessibleText":"ggaction://docs/accessibility","renderer.pixelRatio":"ggaction://docs/responsive-layout","query.intent":"ggaction://docs/getting-started"});class ke extends Error{static{p(this,"TaskPacketBudgetError")}constructor(e){super(`Compact task packet is ${e} bytes; the hard ceiling is 6144 bytes.`),this.name="TaskPacketBudgetError",this.bytes=e}}function _(o){return[...new Set(o)]}p(_,"unique");function Y(o){return o.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}p(Y,"normalize");const ue=/\b(?:no|not|without|exclude|excluding|omit|omitting|avoid|avoiding|don['’]t|doesn['’]t|isn['’]t|aren['’]t|never|neither|nor)\b/i;function Oe(o){let e=o.normalize("NFKC").replace(/(^|[\s=:(,])("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g,(t,a,n)=>a+" ".repeat(n.length));for(const t of C.constraints)for(const a of t.phrases.filter(n=>ue.test(n))){const n=Y(a).split(" ").join("\\s+");e=e.replace(new RegExp(`\\b${n}\\b`,"gi")," ")}return ue.test(e)}p(Oe,"hasUnresolvedNegation");function ie(o,e){const t=Y(e),a=` ${o} `,n=` ${t} `,r=[];let i=0;for(;i<a.length;){const c=a.indexOf(n,i);if(c===-1)break;r.push({start:c+1,end:c+n.length-1}),i=c+1}return r}p(ie,"phraseOccurrences");function Ce(o){return Z.cards.filter(e=>new RegExp(`(?:^|[^A-Za-z0-9])${e.name}(?:$|[^A-Za-z0-9])`,"i").test(o)).map(e=>e.name)}p(Ce,"exactActionNames");function ze(o){const e=C.constraints.flatMap(r=>r.phrases.flatMap(i=>ie(o,i).map(c=>({constraint:r,...c})))),t=e.filter(r=>!e.some(i=>i.constraint.shadows?.includes(r.constraint.id)&&i.start<=r.start&&i.end>=r.end)),a=C.constraints.filter(r=>t.some(i=>i.constraint.id===r.id)),n=new Map(a.map(r=>[r.id,Math.min(...t.filter(i=>i.constraint.id===r.id).map(i=>i.start))]));return{matched:a,positions:n}}p(ze,"semanticMatchResult");function fe(o){return o.name==="createCanvas"?10:o.name==="createData"?20:o.name.endsWith("Data")?30:o.domain==="charts"||o.domain==="marks"&&o.name.startsWith("create")?40:o.domain==="encodings"?/^encode(X|Y|X2|Y2|XRange|YRange|Theta|R|Radius|ParallelCoordinates)/.test(o.name)?50:o.name==="encodeGroup"||o.name==="encodePathOrder"?52:55:o.domain==="statistics"?60:["axes","grid","legend_and_title"].includes(o.domain)?70:o.domain==="mark-selection"?75:o.domain==="composition"||/^(layout|jitter|order|replace)/.test(o.name)?80:65}p(fe,"orderForCard");function Te(o,e){const t=N.get(o),a=C.providers.filter(n=>n.kind==="action"&&n.name===o).map(n=>({provider:n,coverage:n.covers.filter(r=>e.has(r)).length})).filter(n=>n.coverage>0).sort((n,r)=>r.coverage-n.coverage||n.provider.order-r.provider.order||n.provider.id.localeCompare(r.provider.id))[0]?.provider;return a?{...a,id:`exact.${o}`,anchors:[`action.${o}`],covers:_([`action.${o}`,...a.covers.filter(n=>e.has(n))])}:{id:`exact.${o}`,kind:"action",name:o,order:fe(t),anchors:[`action.${o}`],covers:[`action.${o}`],exactCall:t.snippet,exactOptionNames:t.options.filter(n=>new RegExp(`\\b${n.name}\\s*:`).test(t.snippet)).map(n=>n.name)}}p(Te,"exactProvider");function Me(o){const e=new Map;for(const n of o){if(!n.exclusiveGroup)continue;const r=e.get(n.exclusiveGroup)??[];r.push(n),e.set(n.exclusiveGroup,r)}const t=new Set,a=[];for(const[n,r]of e)if(!(r.length<2)){for(const i of r)t.add(i.id);for(const i of r)a.push({constraint:i.id,reason:`This conflicts within ${n}: ${r.map(c=>c.id).join(", ")}.`,resources:[n==="legend.position"?"ggaction://docs/legend-layout":"ggaction://docs/choose-chart-type"]})}return{blocked:t,unresolved:a}}p(Me,"conflictResult");function Be(o,e){const t=C.providers.filter(a=>a.anchors.some(n=>o.has(n)));for(const a of e)t.push(Te(a,o));return t}p(Be,"candidateProviders");function Re(o,e){const t=new Set(o),a=[];for(;t.size>0;){const n=e.filter(i=>!a.some(c=>c.provider.id===i.id)).map(i=>({provider:i,coverage:i.covers.filter(c=>t.has(c))})).filter(i=>i.coverage.length>0).sort((i,c)=>c.coverage.length-i.coverage.length||i.provider.order-c.provider.order||i.provider.id.localeCompare(c.provider.id));if(n.length===0)break;const r=n[0];a.push(r);for(const i of r.coverage)t.delete(i)}return{selected:a,uncovered:t}}p(Re,"selectProviders");function ye(o){let e=o;o.some(i=>i.provider.name==="selectMarks")&&(e=e.map(i=>i.provider.name!=="highlightMarks"?i:{...i,provider:{...i.provider,baseOptions:{selection:'"selection-1"',color:'"#f28e2b"'}}}));const a=e.some(i=>i.provider.name==="createRegression"&&!i.provider.id.startsWith("exact.")),n=e.some(i=>["createPointMark","createScatterPlot","createPolarScatterPlot"].includes(i.provider.name));a&&!n&&(e=[J("createPointMark",{}),...e]);const r=e.find(i=>i.provider.name==="editLegendLayout"&&i.coverage.some(c=>c.startsWith("layout.legend.")));if(r){const i=e.find(c=>c.coverage.includes("guide.legend")&&(c.provider.name==="createLegend"||c.provider.optionsByConstraint?.["guide.legend"]?.guides!==void 0));if(i){const c=r.provider.baseOptions?.position;if(c===void 0)throw new Error(`${r.provider.id} lacks a legend position.`);const m=r.coverage.filter(f=>f.startsWith("layout.legend."));e=e.filter(f=>f!==r).map(f=>{if(f!==i)return f;const P=c==='"left"'?"96":c==='"bottom"'?ge:void 0;return{provider:f.provider.name==="createLegend"?{...f.provider,baseOptions:{...f.provider.baseOptions??{},position:c,...P===void 0?{}:{offset:P}}}:{...f.provider,optionsByConstraint:{...f.provider.optionsByConstraint??{},"guide.legend":{...f.provider.optionsByConstraint?.["guide.legend"]??{},guides:`{ legend: { position: ${c}${P===void 0?"":`, offset: ${P}`} } }`}}},coverage:[...f.coverage,...m]}})}}return e}p(ye,"adaptProviderDependencies");function S(o,e){return{...o,provider:{...o.provider,baseOptions:{...o.provider.baseOptions??{},...e}}}}p(S,"withBaseOptions");function J(o,e,t=[]){const a=N.get(o);if(!a)throw new Error(`Unknown runtime dependency action ${o}.`);return{provider:{id:`action.${o}`,kind:"action",name:o,order:fe(a),anchors:[],covers:[],baseOptions:e},coverage:t}}p(J,"dependencyEntry");function qe(o){const e=o.find(n=>!n.provider.id.startsWith("exact.")&&pe.has(n.provider.name));if(!e)return o;const t=o.filter(n=>!n.provider.id.startsWith("exact.")&&$e.has(n.provider.name));if(t.length===0)return o;const a=t.flatMap(n=>n.coverage);return o.filter(n=>!t.includes(n)).map(n=>n===e?{...n,coverage:_([...n.coverage,...a])}:n)}p(qe,"absorbFacadeGuides");function he(o,e,t){const a=o.indexOf(e);return a===-1?o:[...o.slice(0,a),...t,...o.slice(a+1)]}p(he,"replaceEntry");function Ae(o){const e=p($=>o.find(q=>q.provider.name===$&&!q.provider.id.startsWith("exact.")),"semantic"),t=e("createPointMark"),a=e("createTextMark"),n=e("encodeText"),r=new Set(["encodeX","encodeY","encodeColor","encodeSize","encodeShape","encodeAngle","encodeOpacity"]),i=o.filter($=>!$.provider.id.startsWith("exact.")&&r.has($.provider.name));if(!t||!a||!n||!i.some($=>$.provider.name==="encodeX")||!i.some($=>$.provider.name==="encodeY"))return o;const c=[t,...i,a,n],m=new Set(c),f=Math.min(...c.map($=>o.indexOf($))),P=o.slice(0,f).filter($=>!m.has($)).length,x=o.filter($=>!m.has($));return[...x.slice(0,P),...c,...x.slice(P)]}p(Ae,"orderInheritedTextOverlay");function De(o){const e=o.find(x=>x.provider.name==="createBarMark"&&!x.provider.id.startsWith("exact."));if(!e)return o;const t=o.indexOf(e),a=o.findIndex((x,$)=>$>t&&!x.provider.id.startsWith("exact.")&&x.provider.name.startsWith("create")&&(x.provider.name.endsWith("Mark")||x.provider.name.endsWith("Plot"))),n=a===-1?o.length:a,r=o.slice(t+1,n).filter(x=>["encodeX","encodeY"].includes(x.provider.name)&&!x.provider.id.startsWith("exact.")),i=r.find(x=>['"nominal"','"ordinal"','"temporal"'].includes(x.provider.baseOptions?.fieldType)),c=r.find(x=>x.provider.baseOptions?.fieldType==='"quantitative"');if(!i||!c||o.indexOf(i)<o.indexOf(c))return o;const m=[...o],f=m.indexOf(i),P=m.indexOf(c);return m[P]=i,m[f]=c,m}p(De,"orderBarCategoryBeforeMeasure");function Ee(o){let e=qe(o);const t=p(s=>e.find(g=>g.provider.name===s&&!g.provider.id.startsWith("exact.")),"semantic"),a=p(s=>e.find(g=>g.coverage.includes(s)),"chartOwner"),n=p((s,{before:g=[],after:h=[]})=>{if(!s)return;const d=e.indexOf(s);e=[...e.slice(0,d),...g,s,...h,...e.slice(d+1)]},"expandChartOwner"),r=p((s,g)=>{const h=e.find(d=>d.provider.name===s&&!d.provider.id.startsWith("exact."));return h?(e=e.filter(d=>d!==h),S(h,g)):J(s,g)},"chartDependency"),i=p((s,g)=>{const h=a(s);h&&n(h,g())},"expandChartConstraint");i("chart.bar.horizontal",()=>({after:[r("encodeY",{field:'"category"',fieldType:'"nominal"'}),r("encodeX",{field:'"value"',fieldType:'"quantitative"'})]})),i("chart.radar",()=>({}));const c=t("createData");c&&(e=e.map(s=>s===c?S(s,{values:"values"}):s));const m=t("createCanvas");m&&(e=e.map(s=>s===m?S(s,Pe):s));const f=t("createScatterPlot");f&&(e=e.map(s=>s===f?S(s,{x:'{ field: "x", fieldType: "quantitative" }',y:'{ field: "y", fieldType: "quantitative" }'}):s));const P=t("createLinePlot"),x=t("encodeOpacity");P&&x&&(e=e.filter(s=>s!==x).map(s=>s===P?{...S(s,{line:"{ opacity: 0.8 }"}),coverage:_([...s.coverage,...x.coverage])}:s));const $=t("createBarPlot");if($){const s=t("createScale")?.provider.id==="action.createColorScale",g='{ field: "category", scale: { id: "color-scale" } }';e=e.map(h=>{if(h!==$)return h;const d=S(h,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }',...s?{color:g}:{}});return s?{...d,provider:{...d.provider,optionsByConstraint:{...d.provider.optionsByConstraint??{},"encoding.color":{color:g}}}}:d})}const q=t("createTimeUnitData"),j=t("createBarPlot");q&&j&&(e=e.map(s=>s===j?S(s,{data:'"monthly"',x:'{ field: "month", fieldType: "ordinal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const I=t("createBoxPlot");I&&(e=e.map(s=>s===I?S(s,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const R=t("createWindowData"),z=t("createLinePlot");if(R&&z){const s=t("createScale")?.provider.id==="action.createTimeScale";e=e.map(g=>g===z?S(g,{data:'"windowed"',x:s?'{ field: "date", fieldType: "temporal", scale: { id: "scale-1" } }':'{ field: "x", fieldType: "quantitative" }',y:'{ field: "movingMean", fieldType: "quantitative" }'}):g)}const B=t("createIntervalData"),T=t("createBoxPlot"),D=t("createErrorBar");B&&T&&D&&(e=e.map(s=>s===B?S(s,{source:'"data"',groupBy:'"category"'}):s===T?S(s,{data:'"data"',x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s===D?S(s,{data:'"interval"',x:'{ field: "category", fieldType: "nominal", scale: { id: "errorBarX" } }',y:'{ center: "__interval_center", lower: "__interval_lower", upper: "__interval_upper", scale: { id: "errorBarY" } }'}):s));const M=t("createDensityData"),u=t("createViolinPlot");M&&u&&(e=e.filter(s=>s!==M).map(s=>s===u?{...S(s,{data:'"data"',...s.coverage.includes("guide.legend")?{color:'"category"'}:{}}),coverage:_([...s.coverage,...M.coverage])}:s));const O=t("createGradientPlot"),K=t("createScale")?.provider.id==="action.createLogScale"?t("createScale"):void 0;O&&(e=e.map(s=>s===O?S(s,{data:'"data"',x:`{ field: "value", fieldType: "quantitative"${K?', scale: { id: "scale-1" }':""} }`,y:'{ field: "category", fieldType: "nominal" }'}):s));const V=t("encodeDensity"),Q=t("createAreaMark");if(V&&!Q){const s=J("createAreaMark",{id:'"densityArea"'}),g=e.indexOf(V);e=[...e.slice(0,g),s,...e.slice(g)].map(h=>h===V?S(h,{target:'"densityArea"'}):h)}const H=t("createBin2DData"),G=t("createRectMark");if(H&&G){e=e.map(l=>l===H?S(l,{source:'"data"'}):l===G?S(l,{id:'"rect"',data:'"bins"'}):l.provider.id==="action.createColorScale"?S(l,{type:'"sequential"',range:'{ palette: "viridis" }'}):l);const s=t("encodeX"),g=t("encodeY");s&&(e=he(e,s,[S(s,{field:'"__bins_x0"',fieldType:'"quantitative"',target:'"rect"'}),J("encodeX2",{field:'"__bins_x1"',fieldType:'"quantitative"',target:'"rect"'})])),g&&(e=he(e,g,[S(g,{field:'"__bins_y0"',fieldType:'"quantitative"',target:'"rect"'}),J("encodeY2",{field:'"__bins_y1"',fieldType:'"quantitative"',target:'"rect"'})]));const h=t("encodeColor");h&&(e=e.map(l=>l===h?S(l,{field:'"__bins_count"',fieldType:'"quantitative"',target:'"rect"',scale:'{ id: "color-scale" }'}):l));const d=t("createLegend");d&&(e=e.map(l=>l===d?S(l,{target:'"rect"',channels:'["color"]'}):l))}let F,E,L;const ne=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"scatterPlot",createLinePlot:"linePlot",createPolarScatterPlot:"polarScatterPlot",createPolarLinePlot:"polarLinePlot",createRadarPlot:"radarPlot",createRugPlot:"rugPlot",createStripPlot:"stripPlot",createAreaPlot:"areaPlot",createBarPlot:"barPlot",createBoxPlot:"boxPlot",createGradientPlot:"gradientPlot",createViolinPlot:"violinPlot",createPiePlot:"piePlot",createRosePlot:"rosePlot",createRadialBarPlot:"radialBarPlot",createDensityPlot:"densityPlot",createHorizonPlot:"horizonPlot"}),X=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"point",createLinePlot:"line",createPolarScatterPlot:"point",createPolarLinePlot:"line",createRadarPlot:"line",createRugPlot:"tick",createStripPlot:"point",createAreaPlot:"area",createBarPlot:"bar",createBoxPlot:"bar",createGradientPlot:"rect",createViolinPlot:"area",createPiePlot:"arc",createRosePlot:"arc",createRadialBarPlot:"arc",createDensityPlot:"area",createHorizonPlot:"area"});return e=e.map(s=>{if(s.provider.id.startsWith("exact."))return s;if(s.provider.name==="createScale")return L=s.provider.id==="action.createColorScale"?void 0:s.provider.baseOptions?.id,s;const g=ne[s.provider.name];if(g!==void 0)return F=s.provider.baseOptions?.id?.replaceAll('"',"")??g,E=s.coverage.includes("chart.bar.horizontal")?"bar-horizontal":X[s.provider.name],s;if(!F||s.provider.name==="createErrorBar")return s;const h={};return["area","rule","arc"].includes(E)&&["encodeX","encodeY","encodeR"].includes(s.provider.name)&&(h.fieldType='"quantitative"'),s.provider.name==="encodeTheta"&&E==="arc"&&s.provider.baseOptions?.fieldType===void 0&&(h.fieldType='"ordinal"'),E==="bar"&&s.provider.name==="encodeX"&&(h.field='"category"',h.fieldType='"nominal"'),E==="bar"&&s.provider.name==="encodeY"&&(h.field='"value"',h.fieldType='"quantitative"'),E==="bar-horizontal"&&s.provider.name==="encodeX"&&(h.field='"value"',h.fieldType='"quantitative"'),E==="bar-horizontal"&&s.provider.name==="encodeY"&&(h.field='"category"',h.fieldType='"nominal"'),L&&["encodeX","encodeY"].includes(s.provider.name)&&(h.scale=`{ id: ${L} }`,L=void 0),Object.keys(h).length===0?s:S(s,h)}),Ae(De(e))}p(Ee,"closeRuntimeDependencies");function me(o,e){const t=o.coverage.map(a=>e.get(a)).filter(a=>a!==void 0);return t.length===0?Number.POSITIVE_INFINITY:Math.min(...t)}p(me,"providerRequestPosition");function ae(o,e){const t=new Map(Object.entries(o.baseOptions??{}));for(const a of e)for(const[n,r]of Object.entries(o.optionsByConstraint?.[a]??{})){const i=t.get(n);if(i!==void 0&&i!==r){if(n==="guides"&&(i==="{}"||r==="{}")){t.set(n,i==="{}"?r:i);continue}throw new Error(`${o.id} assigns conflicting values to option ${n}.`)}t.set(n,r)}return t}p(ae,"mergeOptionValues");function Le(o,e){if(o.exactCall)return o.exactCall;if(N.get(o.name).options.length===0)return`program.${o.name}()`;const a=[...e].map(([n,r])=>`${n}: ${r}`).join(", ");return`program.${o.name}(${a.length===0?"{}":`{ ${a} }`})`}p(Le,"actionCall");function We(o,e){const{provider:t,coverage:a}=o,n=ae(t,a);if(t.kind==="runtime")return{plan:{step:e,id:t.id,kind:t.kind,name:t.name,constraints:a,requiredOptions:[],signature:t.signature,route:t.route},call:t.call};const r=N.get(t.name),i=new Map(r.options.filter(c=>n.has(c.name)).map(c=>[c.name,n.get(c.name)]));return{plan:{step:e,id:t.id,kind:t.kind,name:t.name,constraints:a,requiredOptions:t.exactOptionNames??[...i.keys()],signature:r.signature,route:r.route},call:Le(t,i)}}p(We,"planEntry");function Ne(o){const e=new Set(o.filter(a=>a.plan.kind==="runtime").map(a=>a.plan.name));return[`import { ${["chart",...le.filter(a=>e.has(a))].join(", ")} } from "ggaction";`,...Object.entries(te).filter(([a])=>e.has(a)).map(([a,n])=>`import { ${a} } from "${n.entry}";`)]}p(Ne,"authoringImports");function je(o){const e=o.filter(t=>te[t.plan.name]);return o.map(t=>{if(t.plan.kind==="action"||["hconcat","vconcat"].includes(t.plan.name))return`program = ${t.call}`;if(t.plan.name==="render")return t.call;const a=te[t.plan.name];if(!a)throw new Error(`Unknown authoring runtime ${t.plan.name}.`);return`const ${e.length===1?"output":`${a.output}Output`} = ${t.call}`})}p(je,"authoringSteps");function _e(o){const e=new Set(o.map(t=>t.plan.name).filter(t=>re.includes(t)));return{imports:Ne(o),initialize:"let program = chart()",prerequisites:re.filter(t=>!e.has(t)).map(t=>{const a=N.get(t);return{id:`action.${t}`,signature:a.signature,call:t==="createCanvas"?"program = program.createCanvas({ width: 800, height: 600, margin: { top: 140, right: 220, bottom: 120, left: 260 } })":"program = program.createData({ values })",bindings:t==="createData"?["values"]:[]}}),steps:je(o)}}p(_e,"authoringBlock");function y(o){return JSON.stringify(o)}p(y,"codeString");function Ge(o,e){if(!o||e.size===0)return o;const t=o.lastIndexOf("})"),a=o.indexOf("({");if(a===-1||t===-1||t<a)throw new Error(`Cannot apply requested options to exact call: ${o}`);let n=o.slice(a+2,t).trim();for(const[r,i]of e){const c=new RegExp(`(^|,\\s*)${r}\\s*:\\s*(?:"[^"]*"|'[^']*'|-?[0-9]+(?:\\.[0-9]+)?|true|false)(?=\\s*,|$)`);c.test(n)?n=n.replace(c,(m,f)=>`${f}${r}: ${i}`):n=`${n}${n.length===0?"":", "}${r}: ${i}`}return`${o.slice(0,a+2)}${n}${o.slice(t)}`}p(Ge,"mergeExactCallOptions");function Ie(o,e){if(o.provider.exactCall)return{...o,provider:{...o.provider,exactCall:Ge(o.provider.exactCall,e),exactOptionNames:_([...o.provider.exactOptionNames??[],...e.keys()])}};const t=Object.fromEntries(Object.entries(o.provider.optionsByConstraint??{}).map(([n,r])=>[n,Object.fromEntries(Object.entries(r).filter(([i])=>!e.has(i)))])),a=S(o,Object.fromEntries(e));return{...a,provider:{...a.provider,optionsByConstraint:t}}}p(Ie,"entryWithRequestedOptions");const ge="70";function A(o,...e){return e.map(t=>o?.[t]).find(t=>t!==void 0)?.trim()}p(A,"requestedText");const oe=new Set(["and","as","at","axes","axis","coordinate","coordinates","encoding","field","for","is","legend","on","option","options","palette","scale","then","to","using","with","without","no","not"]);function Ve(o,e){const t=o.match(new RegExp(`\\b${e}(?:(?:\\s+(?:field|encoding|by|is))|\\s*[:=]|\\s+)\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!t)return;const a=A(t,1,2,3);return t[3]!==void 0&&oe.has(a.toLowerCase())?void 0:{value:a,source:t[0]}}p(Ve,"fieldRequest");function Ye(o,e){const t=o.match(new RegExp(`\\b${e}(?:\\s+(?:by|field|encoding))?\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!t)return;const a=A(t,1,2,3);if(!(t[3]!==void 0&&oe.has(a.toLowerCase())))return{value:a,source:t[0]}}p(Ye,"appearanceFieldRequest");function He(o,e){const t=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=e.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),n=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=o.match(new RegExp(`\\b(?:${t}|${n})\\b\\s*(?:=|:|\\bis\\b|\\bto\\b)\\s*[^,;]+`,"i"));if(r)return r[0].trim();if(e!==a)return o.match(new RegExp(`\\b${t}\\b`,"i"))?.[0]}p(He,"explicitOptionMention");function Xe(o,e){let t=o;const a=[],n=[],r=[],i=p((d,l,v)=>{const b=t.find(k=>d.includes(k.provider.name));if(!b||l.size===0)return!1;t=t.map(k=>k===b?Ie(k,l):k);for(const[k,W]of l)a.push({owner:b.provider.name,option:k,value:W,source:v});return!0},"apply"),c=e.match(/\b(?:(one|two|three|four|five|six|seven|eight|nine|ten|\d+)\s+bands?|bands?\s*(?:of|=|:)?\s*(one|two|three|four|five|six|seven|eight|nine|ten|\d+))\b/i);if(c){const d=A(c,1,2),l=Number({one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10}[d.toLowerCase()]??d);Number.isInteger(l)&&l>0?i(["createHorizonPlot","encodeHorizon","editHorizon"],new Map([["bands",String(l)]]),c[0]):(n.push(c[0]),r.push(w("request.option.horizon.bands","Horizon bands must be a positive integer.")))}const m=/\b(?:legend|encoding key)\b/i.test(e),f=t.some(d=>d.provider.id.startsWith("exact.")&&/Legend/.test(d.provider.name)),P=t.some(d=>d.provider.name==="facet"),x=new Set(["encoding.color","encoding.opacity","encoding.shape","encoding.size","encoding.strokeDash","encoding.strokeWidth"]),$=t.some(d=>["createPiePlot","createRosePlot","createRadialBarPlot"].includes(d.provider.name)||d.coverage.some(l=>x.has(l)));if(m&&!$&&!f&&!P){const d=_(t.flatMap(l=>l.coverage).filter(l=>l==="guide.legend"||l.startsWith("layout.legend.")));t=t.map(l=>({...l,coverage:l.coverage.filter(v=>v!=="guide.legend"&&!v.startsWith("layout.legend."))})).filter(l=>l.coverage.length>0||l.provider.id.startsWith("exact.")),n.push("legend channel");for(const l of d)r.push(w(l,"A legend requires a concrete compatible encoding channel such as color, shape, size, opacity, stroke dash, or stroke width."))}const q=e.match(/\blegend\s+(?:at|on)\s+(top|bottom|left|right)\b/i),j=m?e.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i):void 0,I=m?void 0:e.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i),R=m?e.match(/\b(?:(horizontal|vertical)(?:\s+direction)?\s+legend|legend(?:\s+direction)?\s*(?:=|:|is)?\s*(horizontal|vertical)|direction\s*(?:=|:|is)?\s*(horizontal|vertical)|legend\b[^,;]{0,60}\b(horizontal|vertical)|(horizontal|vertical)\s+direction)\b/i):void 0,z=new Map;if(q&&z.set("position",y(q[1].toLowerCase())),j){const d=Number(A(j,1,2));Number.isInteger(d)&&d>0?z.set("columns",String(d)):(n.push(j[0]),r.push(w("request.option.legend.columns","Legend columns must be a positive integer.")))}if(R&&z.set("direction",y(A(R,1,2,3,4,5).toLowerCase())),q?.[1].toLowerCase()==="bottom"&&z.set("offset",ge),I&&(n.push(I[0]),r.push(w("request.option.columns","A column count requires a concrete owner such as a legend or composition layout."))),z.size>0&&($||f||P)){const d=[q?.[0],j?.[0],R?.[0]].filter(Boolean).join(", ");if(!i(["editLegendLayout","createLegend"],z,d)){const l=[...z].map(([v,b])=>`${v}: ${b}`).join(", ");i([...pe],new Map([["guides",`{ legend: { ${l} } }`]]),d)}}const B=e.match(/\b(\d+)\s+x[ -]?bins?\b/i),T=e.match(/\b(\d+)\s+y[ -]?bins?\b/i),D=e.match(/\b(\d+)\s+(?:bins?|bins? per axis)\b/i),M=new Map,u=[];if(B||T)if(B&&T){const d=Number(B[1]),l=Number(T[1]);if(d>0&&l>0)M.set("bins",`{ x: ${d}, y: ${l} }`),u.push(B[0],T[0]);else{const v=`${B[0]}; ${T[0]}`;n.push(v),r.push(w("request.option.bin2d.bins","Two-dimensional x and y bin counts must be positive integers."))}}else{const d=B?"y":"x",l=(B??T)[0];n.push(l),r.push(w(`transform.bin2d.bins.${d}`,`Two-dimensional bin counts require both x and y; the request specifies only ${l}.`))}else if(D){const d=Number(D[1]);Number.isInteger(d)&&d>0?(M.set("bins",String(d)),u.push(D[0])):(n.push(D[0]),r.push(w("request.option.bin2d.bins","Two-dimensional bin counts must be positive integers.")))}const O=e.match(/\b(include|exclude|omit)\s+empty\s+(?:bins|cells)\b/i);if(O&&(M.set("includeEmpty",String(O[1].toLowerCase()==="include")),u.push(O[0])),M.size>0){const d=u.join("; ");if(!i(["createBin2DData","editBin2DData"],M,d)){const l=[...M].map(([W,ee])=>`${W}: ${ee}`).join(", "),v=i(["createHeatmap"],new Map([["bin",`{ ${l} }`]]),d),b=M.get("bins"),k=!v&&b!==void 0&&/^\d+$/.test(b)&&!M.has("includeEmpty")&&i(["createHistogram"],new Map([["maxBins",b]]),d);!v&&!k&&(n.push(d),r.push(w("request.option.bin2d","Two-dimensional bin options require a heatmap or a create/edit Bin2D data action.")))}}const K=e.match(/\b(?:titled\b|(?:chart\s+)?title\b(?:\s+(?:is|text))?)\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|subtitle|on\s+|as\s+)|$)/i),V=A(K,1,2,3);V&&!oe.has(V.toLowerCase())&&i(["createTitle","editTitle"],new Map([["text",y(V)]]),K[0]);const Q=e.match(/\bsubtitle(?:\s+(?:is|text))?\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|title|on\s+|as\s+)|$)/i),H=A(Q,1,2,3);H&&!oe.has(H.toLowerCase())&&i(["createTitle","editTitle"],new Map([["subtitle",y(H)]]),Q[0]);const G=e.match(/\bfont[ -]?size\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(G){const d=Number(G[1]);d>0&&i(["createTitle","editTitle"],new Map([["titleStyle",`{ fontSize: ${G[1]} }`]]),G[0])||(n.push(G[0]),r.push(w("request.option.fontSize",d>0?"A font size requires a concrete text owner such as a chart title, axis, legend, or text mark.":"Font size must be a positive finite number.")))}const F=Object.freeze({x:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"],y:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"]}),E=new Set;for(const d of["x","y"]){const l=Ve(e,d);if(!l||/^(?:bins?|axis|encoding|field)$/i.test(l.value))continue;(i(F[d],new Map([[d,y(l.value)]]),l.source)||i([`encode${d.toUpperCase()}`],new Map([["field",y(l.value)]]),l.source))&&E.add(d)}const L=e.match(/\b(?:plot|chart)\s+of\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))\s+(?:vs\.?|versus|against)\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))/i);if(L&&E.size===0){const d=A(L,1,2,3),l=A(L,4,5,6);for(const[v,b]of[["x",l],["y",d]])i(F[v],new Map([[v,y(b)]]),L[0])||i([`encode${v.toUpperCase()}`],new Map([["field",y(b)]]),L[0])}const ne=Object.freeze({color:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createViolinPlot","createPiePlot","createRosePlot","createRadialBarPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot"],size:["createScatterPlot","createPolarScatterPlot"],shape:["createScatterPlot","createPolarScatterPlot"]});for(const d of["color","size","shape"]){const l=Ye(e,d);if(!l)continue;i(ne[d],new Map([[d,y(l.value)]]),l.source)||i([`encode${d[0].toUpperCase()}${d.slice(1)}`],new Map([["field",y(l.value)]]),l.source)}const X=t.find(d=>d.provider.name==="renderToSVG");if(X){const d=e.match(/\bsvg\s+title\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),l=e.match(/\bdescription\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),v=new Map;if(d&&v.set("title",y(A(d,1,2))),l&&v.set("description",y(A(l,1,2))),v.size>0){const b=[...v].map(([k,W])=>`${k}: ${W}`).join(", ");t=t.map(k=>k===X?{...k,provider:{...k.provider,call:`renderToSVG(program, { ${b} })`}}:k);for(const[k,W]of v)a.push({owner:"renderToSVG",option:k,value:W,source:"SVG accessible text"})}}const s=e.match(/\bpixel[ -]?ratio\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(s){const d=Number(s[1]),l=t.find(v=>["render","renderToPNG"].includes(v.provider.name));if(l&&d>0){const v=l.provider.name==="render"?`render(program, context, { pixelRatio: ${s[1]} })`:l.provider.call.replace(/\s*}\)$/,`, pixelRatio: ${s[1]} })`);t=t.map(b=>b===l?{...b,provider:{...b.provider,call:v}}:b),a.push({owner:l.provider.name,option:"pixelRatio",value:s[1],source:s[0]})}else n.push(s[0]),r.push(w("renderer.pixelRatio",d>0?"pixelRatio applies only to Browser Canvas or PNG output; choose one of those renderers or remove the requirement.":"pixelRatio must be a positive finite number."))}else if(/\b(?:high[ -]?dpi|retina)\b/i.test(e)){const d=e.match(/\b(?:high[ -]?dpi|retina)\b/i)[0];n.push(d),r.push(w("renderer.pixelRatio","High-density raster or Canvas output requires an explicit positive pixelRatio."))}/\bresponsive\b/i.test(e)&&(n.push("responsive"),r.push(w("layout.responsive","Responsive charts require host resize observation and immutable program rebuilding; no container size was supplied."))),/\b(?:accessible|accessibility|aria)\b/i.test(e)&&(a.some(l=>l.owner==="renderToSVG"&&l.option==="title")&&a.some(l=>l.owner==="renderToSVG"&&l.option==="description")||(n.push("accessible output"),r.push(w(X?"renderer.svg.accessibleText":"output.accessibility",X?"Accessible SVG output requires concrete title and description strings.":"Accessibility requires an output-specific accessible name, description, and host fallback strategy."))));const g=new Set(a.map(d=>`${d.owner}.${Y(d.option)}`)),h=Y(e);for(const d of t.filter(l=>l.provider.kind==="action")){const l=N.get(d.provider.name),v=ae(d.provider,d.coverage);for(const b of l?.options??[]){const k=Y(b.name);if(k.length<3||!ie(h,k).length||g.has(`${d.provider.name}.${k}`)||v.has(b.name)||b.name==="stroke"&&/\b(?:stroke[ -]?dash|dashed?\s+stroke)\b/i.test(e)||b.name==="bins"&&r.some(be=>be.constraint.startsWith("transform.bin2d.bins.")))continue;const W=He(e,b.name);if(!W)continue;const ee=`${d.provider.name}.${b.name}: ${W}`;n.includes(ee)||(n.push(ee),r.push(w(`request.option.${d.provider.name}.${b.name}`,`The request mentions ${b.name}, but its value could not be parsed safely for ${d.provider.name}.`)))}}return{entries:t,appliedOptions:a,unmatchedRequirements:_(n),unresolved:r}}p(Xe,"applyRequestedOptions");function Fe(o,e=[]){const t=new Map,a=p((r,i,c,m)=>{const f=`${i}:${r}`,P=t.get(f)??{name:r,kind:i,required:!0,usedBy:[],reason:m};P.usedBy=_([...P.usedBy,c]),t.set(f,P)},"add"),n=o.find(r=>r.plan.name==="createData");(!n||/\bvalues\s*:\s*values\b/.test(n.call))&&a("values","binding","createData","Supply the caller-owned dataset rows before running the authoring block.");for(const r of o){r.plan.name==="render"&&a("context","runtime","render","Supply a CanvasRenderingContext2D from the host page."),["hconcat","vconcat"].includes(r.plan.name)&&a("programs","program",r.plan.name,"Replace the repeated sample program with two complete child ChartPrograms.");const i=r.call.matchAll(/\b(?:field|x|y|theta|radius|color|size|shape|groupBy|weight):\s*"(x|y|value|category|label|angle|distance|date|a|b|series)"/g);for(const c of i)a(c[1],"field",r.plan.name,"Replace this template name unless the input dataset declares the same field.");if(r.call.includes('"Chart title"')&&a("Chart title","text",r.plan.name,"Replace the sample title with user-approved chart text."),r.plan.id.startsWith("exact.")){const c=N.get(r.plan.name);for(const m of c?.resources.prerequisites??[])a(m,"resource",r.plan.name,"Provide or create this action-card prerequisite before applying the exact call.")}}for(const r of e){if(!new Set(["color","field","groupBy","shape","size","weight","x","y","theta","radius"]).has(r.option))continue;let i;try{i=JSON.parse(r.value)}catch{continue}typeof i!="string"||i.length===0||a(i,"field",r.owner,"Confirm that this request-supplied field exists in the caller-owned dataset.")}return[...t.values()]}p(Fe,"placeholderBindings");function Ze(o){let e=!1,t=new Set;const a=p(()=>e&&t.has("encodeX")&&t.has("encodeY")&&!t.has("encodeX2")&&!t.has("encodeY2"),"incomplete");for(const n of o){if(n.provider.id.startsWith("exact."))continue;const r=n.provider.name;if(r.startsWith("create")&&(r.endsWith("Mark")||r.endsWith("Plot"))){if(a())return!0;e=r==="createRuleMark",t=new Set;continue}e&&["encodeX","encodeY","encodeX2","encodeY2"].includes(r)&&t.add(r)}return a()}p(Ze,"hasIncompleteRulePrimaryPair");function Ue(o){return o.filter(t=>t.provider.name==="createScale"&&!t.provider.id.startsWith("exact.")).filter(t=>{const a=t.provider.baseOptions?.id;if(a===void 0)return!1;const n=`id: ${a}`;return!o.some(r=>r!==t&&[...ae(r.provider,r.coverage).values()].some(i=>i.includes(n)))}).map(t=>t.provider.baseOptions.id.replaceAll('"',""))}p(Ue,"unconsumedScaleIds");function Je(o){const e=new Set(o.filter(c=>!c.provider.id.startsWith("exact.")).map(c=>c.provider.name)),t=[],a=[],n=new Set(o.flatMap(c=>c.coverage)),i=[...e].filter(c=>c.startsWith("create")&&(c.endsWith("Mark")||c.endsWith("Plot"))).length>0||[...e].some(c=>["createHistogram","createHeatmap","createParallelCoordinates"].includes(c));["selectMarks","filterMarks","highlightMarks","facet"].some(c=>e.has(c))&&!i&&t.push(w("chart.type","Selection and faceting require one explicit chart or mark owner before those actions can be addressed.")),["hconcat","vconcat"].some(c=>e.has(c))&&!i&&t.push(w("composition.children","Composition requires at least two complete child ChartPrograms; name or provide the child charts first.")),e.has("layoutLabels")&&e.has("createTextMark")&&!e.has("encodeX")&&!e.has("encodeY")&&t.push(w("encoding.position","Collision-aware labels require a positioned source layer or explicit x and y encodings.")),e.has("createLegend")&&!["encodeColor","encodeSize","encodeShape","encodeOpacity","encodeStrokeDash","encodeStrokeWidth"].some(c=>e.has(c))&&t.push(w("guide.legend.channel","A legend requires an explicit compatible visual encoding such as color, size, shape, opacity, dash, or width.")),Ze(o)&&t.push(w("encoding.rule.endpoint","A rule with both x and y primary positions also requires x2 or y2; otherwise choose one primary position for a full-span rule."));for(const c of Ue(o))t.push(w("scale.consumer",`Scale "${c}" is not connected to a compatible encoding; choose the channel that should consume it.`));return(e.has("createAreaMark")||e.has("createAreaPlot"))&&e.has("encodeStrokeDash")&&a.push({constraint:"unsupported.areaStrokeDash",reason:"Field-driven stroke dash is not supported for area marks; use a line or rule mark for dash encoding."}),{unresolved:t,unsupported:a}}p(Je,"runtimeClosureDecisions");function w(o,e){const t=Se[o]??(o.startsWith("layout.legend.")?"ggaction://docs/legend-layout":"ggaction://docs/action-reference");return{constraint:o,reason:e,resources:[t]}}p(w,"unresolvedDecision");function Ke(o,e){const t=[],a=["chart.pie","chart.donut"].some(i=>o.has(i)&&!e.has(i)),n=o.has("chart.horizon")&&!e.has("chart.horizon"),r=o.has("chart.density")&&!e.has("chart.density");for(const i of o){let c;a&&["encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid"].includes(i)&&(c="A pie has categorical sectors and a color legend. Cartesian positions, axes, and grids require a different chart or an explicit lower-level recipe."),n&&(i==="guide.yAxis"||i==="encoding.color"||i==="guide.legend"||i.startsWith("layout.legend."))&&(c="Horizon's y scale and palette describe internal folded bands. Choose an explicit lower-level guide or a separate original-amplitude guide; the facade only creates original-x guides."),r&&(i==="encoding.color"||i==="guide.legend"||i.startsWith("layout.legend."))&&(c="Density color requires an explicit groupBy field and matching color field. Its derived data does not retain arbitrary raw categories; choose that grouping before requesting a color legend."),c&&(e.add(i),t.push(w(i,c)))}return t}p(Ke,"completeChartBoundaries");function Qe(o,e,t){const a=[],n=[...e].filter(r=>!r.startsWith("renderer.")&&!r.startsWith("unsupported."));return/\b(chart|plot)\b/.test(o)&&n.length===0&&![...e].some(r=>r.startsWith("unsupported."))&&t.length===0&&a.push(w("chart.type","A chart or mark type is required; for example scatter plot, line chart, bar chart, or tick mark.")),/\b(render|export|output)\b/.test(o)&&![...e].some(r=>r.startsWith("renderer."))&&a.push(w("renderer.format","A supported output format is required: Browser Canvas, SVG, PNG, or PDF.")),a}p(Qe,"genericUnresolved");function ve(){if(Z.schemaVersion!==3||C.schemaVersion!==2)throw new Error("Compact action cards must use schemaVersion 3 and the intent taxonomy must use schemaVersion 2.");if(C.packageVersion!==Z.packageVersion)throw new Error("Compact action cards and the intent taxonomy must use one packageVersion.");if(U.size!==C.constraints.length)throw new Error("Intent constraint IDs must be unique.");if(new Set(C.providers.map(n=>n.id)).size!==C.providers.length)throw new Error("Intent provider IDs must be unique.");const e=new Set;for(const n of C.constraints)for(const r of n.shadows??[])if(!U.has(r)||r===n.id)throw new Error(`${n.id} shadows invalid constraint ${r}.`);for(const n of C.providers){for(const r of[...n.anchors,...n.covers])if(!U.has(r))throw new Error(`${n.id} references unknown constraint ${r}.`);if(n.anchors.some(r=>!n.covers.includes(r)))throw new Error(`${n.id} does not cover every anchor.`);for(const r of n.anchors)e.add(r);if(n.kind==="action"){const r=N.get(n.name);if(!r)throw new Error(`${n.id} references unknown action ${n.name}.`);const i=new Set(r.options.map(m=>m.name)),c=[n.baseOptions??{},...Object.values(n.optionsByConstraint??{})];for(const m of c)for(const[f,P]of Object.entries(m)){if(!i.has(f))throw new Error(`${n.id} references undeclared option ${f}.`);if(typeof P!="string"||P.length===0)throw new Error(`${n.id}.${f} must be a JavaScript expression string.`)}}else{if(n.kind!=="runtime"||typeof n.signature!="string"||typeof n.call!="string"||!n.route.startsWith("/reference/"))throw new Error(`${n.id} has an invalid runtime contract.`);if(!le.includes(n.name)&&te[n.name]===void 0)throw new Error(`${n.id} lacks an authoring runtime mapping.`)}}const t=C.constraints.filter(n=>n.unsupported===void 0&&!e.has(n.id));if(t.length>0)throw new Error(`Supported constraints lack providers: ${t.map(n=>n.id).join(", ")}.`);const a=C.constraints.filter(n=>n.unsupported!==void 0!==n.id.startsWith("unsupported.")||n.unsupported!==void 0&&e.has(n.id));if(a.length>0)throw new Error(`Terminal constraints must use unsupported.* IDs without providers: ${a.map(n=>n.id).join(", ")}.`);for(const n of re)if(!N.has(n))throw new Error(`Missing authoring prerequisite action card: ${n}.`);return{cards:N.size,constraints:U.size,providers:C.providers.length,supported:C.constraints.filter(n=>n.unsupported===void 0).length,unsupported:C.constraints.filter(n=>n.unsupported!==void 0).length}}p(ve,"validateResolverKnowledge");function rt(o){if(typeof o!="string"||o.trim().length===0)throw new TypeError("searchGgaction query must be a non-empty string.");if(o.length>500)throw new RangeError("searchGgaction query must be at most 500 characters.");ve();const e=Oe(o),t=e?"":o,a=Y(t),n=Ce(t),{matched:r,positions:i}=ze(a);for(const u of n){const[O]=ie(a,Y(u));O&&i.set(`action.${u}`,O.start)}const c=new Set([...r.map(u=>u.id),...n.map(u=>`action.${u}`)]),m=r.filter(u=>u.unsupported!==void 0).map(u=>({constraint:u.id,reason:u.unsupported})),f=e?[w("request.negation","Negation or exclusion requires explicit interpretation. No authoring steps are proposed; preserve the restriction when choosing action options.")]:[],{blocked:P,unresolved:x}=Me(r);f.push(...x),f.push(...Ke(c,P));const $=new Set([...c].filter(u=>{const O=U.get(u);return!P.has(u)&&(O===void 0||O.unsupported===void 0)})),q=Be($,n),{selected:j,uncovered:I}=Re($,q);for(const u of I)f.push(w(u,"No current action or runtime operation covers this recognized constraint."));f.push(...Qe(a,c,n)),c.size===0&&f.length===0&&f.push(w("query.intent","No current ggaction constraint was recognized; use an exact action name or a supported chart task."));let R=Ee(ye(j).sort((u,O)=>u.provider.order-O.provider.order||me(u,i)-me(O,i)||u.provider.id.localeCompare(O.provider.id)));const z=Xe(R,t);R=z.entries,f.push(...z.unresolved);const B=Je(R);m.push(...B.unsupported),f.push(...B.unresolved),B.unsupported.some(u=>u.constraint==="unsupported.areaStrokeDash")&&(R=R.filter(u=>u.provider.name!=="encodeStrokeDash"));const T=R.map((u,O)=>We(u,O+1)),D={schemaVersion:4,packageVersion:Z.packageVersion,query:o.trim(),matchedConstraints:[...c],actionPlan:T.map(u=>u.plan),exactCalls:T.map(u=>u.call),appliedOptions:z.appliedOptions,placeholderBindings:Fe(T,z.appliedOptions),unmatchedRequirements:e?o.trim().length<=180?[o.trim()]:o.trim().match(/[\s\S]{1,176}/g).map((u,O)=>`${O+1}. ${u}`):z.unmatchedRequirements,authoring:_e(T),unsupported:m,unresolved:_(f.map(u=>JSON.stringify(u))).map(JSON.parse),candidates:T.slice(0,3).map(u=>({id:u.plan.id,kind:u.plan.kind,name:u.plan.name,route:u.plan.route}))},M=Buffer.byteLength(JSON.stringify(D),"utf8");if(M>6144)throw new ke(M);return D}p(rt,"searchGgaction");function it(o){return Buffer.byteLength(JSON.stringify(o),"utf8")}p(it,"taskPacketBytes"),ve();export{ke as TaskPacketBudgetError,rt as searchGgaction,it as taskPacketBytes,ve as validateResolverKnowledge};
1
+ var ze=Object.defineProperty;var p=(o,t)=>ze(o,"name",{value:t,configurable:!0});import{IMPUTE_REQUIRED_OPTIONS as Te}from"../src/core/optionRequirements.js";import{readFileSync as fe}from"node:fs";import he from"node:path";import{fileURLToPath as Me}from"node:url";const me=Me(new URL("../",import.meta.url)),te=JSON.parse(fe(he.join(me,"knowledge/action-cards.json"),"utf8")),T=JSON.parse(fe(he.join(me,"knowledge/intent-taxonomy.json"),"utf8")),A=new Map(te.cards.map(o=>[o.name,o])),oe=new Map(T.constraints.map(o=>[o.id,o])),ge=Object.freeze(["hconcat","vconcat","render"]),se=Object.freeze({renderToSVG:Object.freeze({entry:"ggaction/svg",output:"svg"}),renderToPNG:Object.freeze({entry:"ggaction/png",output:"png"}),renderToPDF:Object.freeze({entry:"ggaction/pdf",output:"pdf"})}),de=Object.freeze(["createCanvas","createData"]),Re=Object.freeze({width:"800",height:"600",margin:"{ top: 140, right: 220, bottom: 120, left: 260 }"}),ve=new Set(["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createBoxPlot","createGradientPlot","createViolinPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot","createRugPlot","createStripPlot"]),Be=new Set(["createAxes","createXAxis","createYAxis","createGrid","createLegend","createGuides"]),ye=Object.freeze({"chart.type":"ggaction://docs/choose-chart-type","renderer.format":"ggaction://docs/choose-renderer","layout.responsive":"ggaction://docs/responsive-layout","output.accessibility":"ggaction://docs/accessibility","renderer.svg.accessibleText":"ggaction://docs/accessibility","renderer.pixelRatio":"ggaction://docs/responsive-layout","query.intent":"ggaction://docs/getting-started"});class qe extends Error{static{p(this,"TaskPacketBudgetError")}constructor(t){super(`Compact task packet is ${t} bytes; the hard ceiling is 6144 bytes.`),this.name="TaskPacketBudgetError",this.bytes=t}}function D(o){return[...new Set(o)]}p(D,"unique");function Z(o){return o.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}p(Z,"normalize");const be=/\b(?:no|not|without|exclude|excluding|omit|omitting|avoid|avoiding|don['’]t|doesn['’]t|isn['’]t|aren['’]t|never|neither|nor)\b/i;function Ae(o){let t=o.normalize("NFKC").replace(/(^|[\s=:(,])("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g,(e,i,n)=>i+" ".repeat(n.length));for(const e of T.constraints)for(const i of e.phrases.filter(n=>be.test(n))){const n=Z(i).split(" ").join("\\s+");t=t.replace(new RegExp(`\\b${n}\\b`,"gi")," ")}return be.test(t)}p(Ae,"hasUnresolvedNegation");function le(o,t){const e=Z(t),i=` ${o} `,n=` ${e} `,r=[];let a=0;for(;a<i.length;){const d=i.indexOf(n,a);if(d===-1)break;r.push({start:d+1,end:d+n.length-1}),a=d+1}return r}p(le,"phraseOccurrences");function De(o){return te.cards.filter(t=>new RegExp(`(?:^|[^A-Za-z0-9])${t.name}(?:$|[^A-Za-z0-9])`,"i").test(o)).map(t=>t.name)}p(De,"exactActionNames");function Ee(o){const t=T.constraints.flatMap(r=>r.phrases.flatMap(a=>le(o,a).map(d=>({constraint:r,...d})))),e=t.filter(r=>!t.some(a=>a.constraint.shadows?.includes(r.constraint.id)&&a.start<=r.start&&a.end>=r.end)),i=T.constraints.filter(r=>e.some(a=>a.constraint.id===r.id)),n=new Map(i.map(r=>[r.id,Math.min(...e.filter(a=>a.constraint.id===r.id).map(a=>a.start))]));return{matched:i,positions:n}}p(Ee,"semanticMatchResult");function pe(o){return o.name==="createCanvas"?10:o.name==="createData"?20:o.name.endsWith("Data")?30:o.domain==="charts"||o.domain==="marks"&&o.name.startsWith("create")?40:o.domain==="encodings"?/^encode(X|Y|X2|Y2|XRange|YRange|Theta|R|Radius|ParallelCoordinates)/.test(o.name)?50:o.name==="encodeGroup"||o.name==="encodePathOrder"?52:55:o.domain==="statistics"?60:["axes","grid","legend_and_title"].includes(o.domain)?70:o.domain==="mark-selection"?75:o.domain==="composition"||/^(layout|jitter|order|replace)/.test(o.name)?80:65}p(pe,"orderForCard");function Le(o,t){const e=A.get(o),i=T.providers.filter(n=>n.kind==="action"&&n.name===o).map(n=>({provider:n,coverage:n.covers.filter(r=>t.has(r)).length})).filter(n=>n.coverage>0).sort((n,r)=>r.coverage-n.coverage||n.provider.order-r.provider.order||n.provider.id.localeCompare(r.provider.id))[0]?.provider;return i?{...i,id:`exact.${o}`,anchors:[`action.${o}`],covers:D([`action.${o}`,...i.covers.filter(n=>t.has(n))])}:{id:`exact.${o}`,kind:"action",name:o,order:pe(e),anchors:[`action.${o}`],covers:[`action.${o}`],exactCall:e.snippet,exactOptionNames:e.options.filter(n=>new RegExp(`\\b${n.name}\\s*:`).test(e.snippet)).map(n=>n.name)}}p(Le,"exactProvider");function Ne(o){const t=new Map;for(const n of o){if(!n.exclusiveGroup)continue;const r=t.get(n.exclusiveGroup)??[];r.push(n),t.set(n.exclusiveGroup,r)}const e=new Set,i=[];for(const[n,r]of t)if(!(r.length<2)){for(const a of r)e.add(a.id);for(const a of r)i.push({constraint:a.id,reason:`This conflicts within ${n}: ${r.map(d=>d.id).join(", ")}.`,resources:[n==="legend.position"?"ggaction://docs/legend-layout":"ggaction://docs/choose-chart-type"]})}return{blocked:e,unresolved:i}}p(Ne,"conflictResult");function We(o,t){const e=T.providers.filter(i=>i.anchors.some(n=>o.has(n)));for(const i of t)e.push(Le(i,o));return e}p(We,"candidateProviders");function je(o,t){const e=new Set(o),i=[];for(;e.size>0;){const n=t.filter(a=>!i.some(d=>d.provider.id===a.id)).map(a=>({provider:a,coverage:a.covers.filter(d=>e.has(d))})).filter(a=>a.coverage.length>0).sort((a,d)=>d.coverage.length-a.coverage.length||a.provider.order-d.provider.order||a.provider.id.localeCompare(d.provider.id));if(n.length===0)break;const r=n[0];i.push(r);for(const a of r.coverage)e.delete(a)}return{selected:i,uncovered:e}}p(je,"selectProviders");function _e(o){let t=o;o.some(a=>a.provider.name==="selectMarks")&&(t=t.map(a=>a.provider.name!=="highlightMarks"?a:{...a,provider:{...a.provider,baseOptions:{selection:'"selection-1"',color:'"#f28e2b"'}}}));const i=t.some(a=>a.provider.name==="createRegression"&&!a.provider.id.startsWith("exact.")),n=t.some(a=>["createPointMark","createScatterPlot","createPolarScatterPlot"].includes(a.provider.name));i&&!n&&(t=[ne("createPointMark",{}),...t]);const r=t.find(a=>a.provider.name==="editLegendLayout"&&a.coverage.some(d=>d.startsWith("layout.legend.")));if(r){const a=t.find(d=>d.coverage.includes("guide.legend")&&(d.provider.name==="createLegend"||d.provider.optionsByConstraint?.["guide.legend"]?.guides!==void 0));if(a){const d=r.provider.baseOptions?.position;if(d===void 0)throw new Error(`${r.provider.id} lacks a legend position.`);const w=r.coverage.filter(h=>h.startsWith("layout.legend."));t=t.filter(h=>h!==r).map(h=>{if(h!==a)return h;const $=d==='"left"'?"96":d==='"bottom"'?$e:void 0;return{provider:h.provider.name==="createLegend"?{...h.provider,baseOptions:{...h.provider.baseOptions??{},position:d,...$===void 0?{}:{offset:$}}}:{...h.provider,optionsByConstraint:{...h.provider.optionsByConstraint??{},"guide.legend":{...h.provider.optionsByConstraint?.["guide.legend"]??{},guides:`{ legend: { position: ${d}${$===void 0?"":`, offset: ${$}`} } }`}}},coverage:[...h.coverage,...w]}})}}return t}p(_e,"adaptProviderDependencies");function S(o,t){return{...o,provider:{...o.provider,baseOptions:{...o.provider.baseOptions??{},...t}}}}p(S,"withBaseOptions");function ne(o,t,e=[]){const i=A.get(o);if(!i)throw new Error(`Unknown runtime dependency action ${o}.`);return{provider:{id:`action.${o}`,kind:"action",name:o,order:pe(i),anchors:[],covers:[],baseOptions:t},coverage:e}}p(ne,"dependencyEntry");function Ge(o){const t=o.find(n=>!n.provider.id.startsWith("exact.")&&ve.has(n.provider.name));if(!t)return o;const e=o.filter(n=>!n.provider.id.startsWith("exact.")&&Be.has(n.provider.name));if(e.length===0)return o;const i=e.flatMap(n=>n.coverage);return o.filter(n=>!e.includes(n)).map(n=>n===t?{...n,coverage:D([...n.coverage,...i])}:n)}p(Ge,"absorbFacadeGuides");function we(o,t,e){const i=o.indexOf(t);return i===-1?o:[...o.slice(0,i),...e,...o.slice(i+1)]}p(we,"replaceEntry");function Ie(o){const t=p(v=>o.find(M=>M.provider.name===v&&!M.provider.id.startsWith("exact.")),"semantic"),e=t("createPointMark"),i=t("createTextMark"),n=t("encodeText"),r=new Set(["encodeX","encodeY","encodeColor","encodeSize","encodeShape","encodeAngle","encodeOpacity"]),a=o.filter(v=>!v.provider.id.startsWith("exact.")&&r.has(v.provider.name));if(!e||!i||!n||!a.some(v=>v.provider.name==="encodeX")||!a.some(v=>v.provider.name==="encodeY"))return o;const d=[e,...a,i,n],w=new Set(d),h=Math.min(...d.map(v=>o.indexOf(v))),$=o.slice(0,h).filter(v=>!w.has(v)).length,u=o.filter(v=>!w.has(v));return[...u.slice(0,$),...d,...u.slice($)]}p(Ie,"orderInheritedTextOverlay");function Ve(o){const t=o.find(u=>u.provider.name==="createBarMark"&&!u.provider.id.startsWith("exact."));if(!t)return o;const e=o.indexOf(t),i=o.findIndex((u,v)=>v>e&&!u.provider.id.startsWith("exact.")&&u.provider.name.startsWith("create")&&(u.provider.name.endsWith("Mark")||u.provider.name.endsWith("Plot"))),n=i===-1?o.length:i,r=o.slice(e+1,n).filter(u=>["encodeX","encodeY"].includes(u.provider.name)&&!u.provider.id.startsWith("exact.")),a=r.find(u=>['"nominal"','"ordinal"','"temporal"'].includes(u.provider.baseOptions?.fieldType)),d=r.find(u=>u.provider.baseOptions?.fieldType==='"quantitative"');if(!a||!d||o.indexOf(a)<o.indexOf(d))return o;const w=[...o],h=w.indexOf(a),$=w.indexOf(d);return w[$]=a,w[h]=d,w}p(Ve,"orderBarCategoryBeforeMeasure");function He(o){let t=Ge(o);const e=p(s=>t.find(x=>x.provider.name===s&&!x.provider.id.startsWith("exact.")),"semantic"),i=p(s=>t.find(x=>x.coverage.includes(s)),"chartOwner"),n=p((s,{before:x=[],after:b=[]})=>{if(!s)return;const C=t.indexOf(s);t=[...t.slice(0,C),...x,s,...b,...t.slice(C+1)]},"expandChartOwner"),r=p((s,x)=>{const b=t.find(C=>C.provider.name===s&&!C.provider.id.startsWith("exact."));return b?(t=t.filter(C=>C!==b),S(b,x)):ne(s,x)},"chartDependency"),a=p((s,x)=>{const b=i(s);b&&n(b,x())},"expandChartConstraint");a("chart.bar.horizontal",()=>({after:[r("encodeY",{field:'"category"',fieldType:'"nominal"'}),r("encodeX",{field:'"value"',fieldType:'"quantitative"'})]})),a("chart.radar",()=>({}));const d=e("createData");d&&(t=t.map(s=>s===d?S(s,{values:"values"}):s));const w=e("createCanvas");w&&(t=t.map(s=>s===w?S(s,Re):s));const h=e("createScatterPlot");h&&(t=t.map(s=>s===h?S(s,{x:'{ field: "x", fieldType: "quantitative" }',y:'{ field: "y", fieldType: "quantitative" }'}):s));const $=e("createLinePlot"),u=e("encodeOpacity");$&&u&&(t=t.filter(s=>s!==u).map(s=>s===$?{...S(s,{line:"{ opacity: 0.8 }"}),coverage:D([...s.coverage,...u.coverage])}:s));const v=e("createBarPlot");if(v){const s=e("createScale")?.provider.id==="action.createColorScale",x='{ field: "category", scale: { id: "color-scale" } }';t=t.map(b=>{if(b!==v)return b;const C=S(b,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }',...s?{color:x}:{}});return s?{...C,provider:{...C.provider,optionsByConstraint:{...C.provider.optionsByConstraint??{},"encoding.color":{color:x}}}}:C})}const M=e("createTimeUnitData"),G=e("createBarPlot");M&&G&&(t=t.map(s=>s===G?S(s,{data:'"monthly"',x:'{ field: "month", fieldType: "ordinal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const X=e("createBoxPlot");X&&(t=t.map(s=>s===X?S(s,{x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s));const E=e("createWindowData"),q=e("createLinePlot");if(E&&q){const s=e("createScale")?.provider.id==="action.createTimeScale";t=t.map(x=>x===q?S(x,{data:'"windowed"',x:s?'{ field: "date", fieldType: "temporal", scale: { id: "scale-1" } }':'{ field: "x", fieldType: "quantitative" }',y:'{ field: "movingMean", fieldType: "quantitative" }'}):x)}const H=e("createIntervalData"),L=e("createBoxPlot"),y=e("createErrorBar");H&&L&&y&&(t=t.map(s=>s===H?S(s,{source:'"data"',groupBy:'"category"'}):s===L?S(s,{data:'"data"',x:'{ field: "category", fieldType: "nominal" }',y:'{ field: "value", fieldType: "quantitative" }'}):s===y?S(s,{data:'"interval"',x:'{ field: "category", fieldType: "nominal", scale: { id: "errorBarX" } }',y:'{ center: "__interval_center", lower: "__interval_lower", upper: "__interval_upper", scale: { id: "errorBarY" } }'}):s));const I=e("createDensityData"),V=e("createViolinPlot");I&&V&&(t=t.filter(s=>s!==I).map(s=>s===V?{...S(s,{data:'"data"',...s.coverage.includes("guide.legend")?{color:'"category"'}:{}}),coverage:D([...s.coverage,...I.coverage])}:s));const f=e("createGradientPlot"),O=e("createScale")?.provider.id==="action.createLogScale"?e("createScale"):void 0;f&&(t=t.map(s=>s===f?S(s,{data:'"data"',x:`{ field: "value", fieldType: "quantitative"${O?', scale: { id: "scale-1" }':""} }`,y:'{ field: "category", fieldType: "nominal" }'}):s));const j=e("encodeDensity"),J=e("createAreaMark");if(j&&!J){const s=ne("createAreaMark",{id:'"densityArea"'}),x=t.indexOf(j);t=[...t.slice(0,x),s,...t.slice(x)].map(b=>b===j?S(b,{target:'"densityArea"'}):b)}const N=e("createBin2DData"),F=e("createRectMark");if(N&&F){t=t.map(R=>R===N?S(R,{source:'"data"'}):R===F?S(R,{id:'"rect"',data:'"bins"'}):R.provider.id==="action.createColorScale"?S(R,{type:'"sequential"',range:'{ palette: "viridis" }'}):R);const s=e("encodeX"),x=e("encodeY");s&&(t=we(t,s,[S(s,{field:'"__bins_x0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeX2",{field:'"__bins_x1"',fieldType:'"quantitative"',target:'"rect"'})])),x&&(t=we(t,x,[S(x,{field:'"__bins_y0"',fieldType:'"quantitative"',target:'"rect"'}),ne("encodeY2",{field:'"__bins_y1"',fieldType:'"quantitative"',target:'"rect"'})]));const b=e("encodeColor");b&&(t=t.map(R=>R===b?S(R,{field:'"__bins_count"',fieldType:'"quantitative"',target:'"rect"',scale:'{ id: "color-scale" }'}):R));const C=e("createLegend");C&&(t=t.map(R=>R===C?S(R,{target:'"rect"',channels:'["color"]'}):R))}let K,_,Y;const ie=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"scatterPlot",createLinePlot:"linePlot",createPolarScatterPlot:"polarScatterPlot",createPolarLinePlot:"polarLinePlot",createRadarPlot:"radarPlot",createRugPlot:"rugPlot",createStripPlot:"stripPlot",createAreaPlot:"areaPlot",createBarPlot:"barPlot",createBoxPlot:"boxPlot",createGradientPlot:"gradientPlot",createViolinPlot:"violinPlot",createPiePlot:"piePlot",createRosePlot:"rosePlot",createRadialBarPlot:"radialBarPlot",createDensityPlot:"densityPlot",createHorizonPlot:"horizonPlot"}),ee=Object.freeze({createPointMark:"point",createLineMark:"line",createAreaMark:"area",createBarMark:"bar",createRuleMark:"rule",createArcMark:"arc",createRectMark:"rect",createTextMark:"text",createScatterPlot:"point",createLinePlot:"line",createPolarScatterPlot:"point",createPolarLinePlot:"line",createRadarPlot:"line",createRugPlot:"tick",createStripPlot:"point",createAreaPlot:"area",createBarPlot:"bar",createBoxPlot:"bar",createGradientPlot:"rect",createViolinPlot:"area",createPiePlot:"arc",createRosePlot:"arc",createRadialBarPlot:"arc",createDensityPlot:"area",createHorizonPlot:"area"});return t=t.map(s=>{if(s.provider.id.startsWith("exact."))return s;if(s.provider.name==="createScale")return Y=s.provider.id==="action.createColorScale"?void 0:s.provider.baseOptions?.id,s;const x=ie[s.provider.name];if(x!==void 0)return K=s.provider.baseOptions?.id?.replaceAll('"',"")??x,_=s.coverage.includes("chart.bar.horizontal")?"bar-horizontal":ee[s.provider.name],s;if(!K||s.provider.name==="createErrorBar")return s;const b={};return["area","rule","arc"].includes(_)&&["encodeX","encodeY","encodeR"].includes(s.provider.name)&&(b.fieldType='"quantitative"'),s.provider.name==="encodeTheta"&&_==="arc"&&s.provider.baseOptions?.fieldType===void 0&&(b.fieldType='"ordinal"'),_==="bar"&&s.provider.name==="encodeX"&&(b.field='"category"',b.fieldType='"nominal"'),_==="bar"&&s.provider.name==="encodeY"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeX"&&(b.field='"value"',b.fieldType='"quantitative"'),_==="bar-horizontal"&&s.provider.name==="encodeY"&&(b.field='"category"',b.fieldType='"nominal"'),Y&&["encodeX","encodeY"].includes(s.provider.name)&&(b.scale=`{ id: ${Y} }`,Y=void 0),Object.keys(b).length===0?s:S(s,b)}),Ie(Ve(t))}p(He,"closeRuntimeDependencies");function xe(o,t){const e=o.coverage.map(i=>t.get(i)).filter(i=>i!==void 0);return e.length===0?Number.POSITIVE_INFINITY:Math.min(...e)}p(xe,"providerRequestPosition");function re(o,t){const e=new Map(Object.entries(o.baseOptions??{}));for(const i of t)for(const[n,r]of Object.entries(o.optionsByConstraint?.[i]??{})){const a=e.get(n);if(a!==void 0&&a!==r){if(n==="guides"&&(a==="{}"||r==="{}")){e.set(n,a==="{}"?r:a);continue}throw new Error(`${o.id} assigns conflicting values to option ${n}.`)}e.set(n,r)}return e}p(re,"mergeOptionValues");function ue(o,t){if(o.exactCall)return o.exactCall;if(A.get(o.name).options.length===0)return`program.${o.name}()`;const i=[...t].map(([n,r])=>`${n}: ${r}`).join(", ");return`program.${o.name}(${i.length===0?"{}":`{ ${i} }`})`}p(ue,"actionCall");function Ye(o){const t=new Map;return o.map(e=>{if(e.provider.kind!=="action")return e;const i=e.provider.name,n=ue(e.provider,re(e.provider,e.coverage));if(/^create.+Data$/.test(i)){const r=n.match(/\bid\s*:\s*"([A-Za-z0-9_-]+)"/)?.[1];r&&t.set(i,r)}if(/^edit.+Data$/.test(i)){const r=t.get(i.replace(/^edit/,"create"));if(r)return Pe(e,new Map([["target",B(r)]]))}return e})}p(Ye,"linkCreatedDataEditors");function Xe(o,t){const e=o.options.filter(i=>i.required).map(i=>i.name);if(o.name==="createImputedData"){const i=t.match(/\bmethod\s*:\s*["'](constant|forward|backward|linear)["']/)?.[1];e.push(...Te[i]??[])}return D(e)}p(Xe,"requiredOptionNames");function Fe(o,t){const{provider:e,coverage:i}=o,n=re(e,i);if(e.kind==="runtime")return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:[],signature:e.signature,route:e.route},call:e.call};const r=A.get(e.name),a=new Map(r.options.filter(d=>n.has(d.name)).map(d=>[d.name,n.get(d.name)]));return{plan:{step:t,id:e.id,kind:e.kind,name:e.name,constraints:i,requiredOptions:Xe(r,ue(e,a)),signature:r.signature,route:r.route},call:ue(e,a)}}p(Fe,"planEntry");function Ue(o){const t=new Set(o.filter(i=>i.plan.kind==="runtime").map(i=>i.plan.name));return[`import { ${["chart",...ge.filter(i=>t.has(i))].join(", ")} } from "ggaction";`,...Object.entries(se).filter(([i])=>t.has(i)).map(([i,n])=>`import { ${i} } from "${n.entry}";`)]}p(Ue,"authoringImports");function Ze(o){const t=o.filter(e=>se[e.plan.name]);return o.map(e=>{if(e.plan.kind==="action"||["hconcat","vconcat"].includes(e.plan.name))return`program = ${e.call}`;if(e.plan.name==="render")return e.call;const i=se[e.plan.name];if(!i)throw new Error(`Unknown authoring runtime ${e.plan.name}.`);return`const ${t.length===1?"output":`${i.output}Output`} = ${e.call}`})}p(Ze,"authoringSteps");function Je(o){const t=new Set(o.map(e=>e.plan.name).filter(e=>de.includes(e)));return{imports:Ue(o),initialize:"let program = chart()",prerequisites:de.filter(e=>!t.has(e)).map(e=>{const i=A.get(e);return{id:`action.${e}`,signature:i.signature,call:e==="createCanvas"?"program = program.createCanvas({ width: 800, height: 600, margin: { top: 140, right: 220, bottom: 120, left: 260 } })":"program = program.createData({ values })",bindings:e==="createData"?["values"]:[]}}),steps:Ze(o)}}p(Je,"authoringBlock");function B(o){return JSON.stringify(o)}p(B,"codeString");function Ke(o,t){if(!o||t.size===0)return o;const e=o.lastIndexOf("})"),i=o.indexOf("({");if(i===-1||e===-1||e<i)throw new Error(`Cannot apply requested options to exact call: ${o}`);let n=o.slice(i+2,e).trim();for(const[r,a]of t){const d=new RegExp(`(^|,\\s*)${r}\\s*:\\s*(?:"[^"]*"|'[^']*'|-?[0-9]+(?:\\.[0-9]+)?|true|false)(?=\\s*,|$)`);d.test(n)?n=n.replace(d,(w,h)=>`${h}${r}: ${a}`):n=`${n}${n.length===0?"":", "}${r}: ${a}`}return`${o.slice(0,i+2)}${n}${o.slice(e)}`}p(Ke,"mergeExactCallOptions");function Pe(o,t){if(o.provider.exactCall)return{...o,provider:{...o.provider,exactCall:Ke(o.provider.exactCall,t),exactOptionNames:D([...o.provider.exactOptionNames??[],...t.keys()])}};const e=Object.fromEntries(Object.entries(o.provider.optionsByConstraint??{}).map(([n,r])=>[n,Object.fromEntries(Object.entries(r).filter(([a])=>!t.has(a)))])),i=S(o,Object.fromEntries(t));return{...i,provider:{...i.provider,optionsByConstraint:e}}}p(Pe,"entryWithRequestedOptions");const $e="70";function W(o,...t){return t.map(e=>o?.[e]).find(e=>e!==void 0)?.trim()}p(W,"requestedText");const ce=new Set(["and","as","at","axes","axis","coordinate","coordinates","encoding","field","for","is","legend","on","option","options","palette","scale","then","to","using","with","without","no","not"]);function Qe(o,t){const e=o.match(new RegExp(`\\b${t}(?:(?:\\s+(?:field|encoding|by|is))|\\s*[:=]|\\s+)\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);return e[3]!==void 0&&ce.has(i.toLowerCase())?void 0:{value:i,source:e[0]}}p(Qe,"fieldRequest");function et(o,t){const e=o.match(new RegExp(`\\b${t}(?:\\s+(?:by|field|encoding))?\\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))`,"i"));if(!e)return;const i=W(e,1,2,3);if(!(e[3]!==void 0&&ce.has(i.toLowerCase())))return{value:i,source:e[0]}}p(et,"appearanceFieldRequest");function tt(o,t){const e=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=t.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),n=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=o.match(new RegExp(`\\b(?:${e}|${n})\\b\\s*(?:=|:|\\bis\\b|\\bto\\b)\\s*[^,;]+`,"i"));if(r)return r[0].trim();if(t!==i)return o.match(new RegExp(`\\b${e}\\b`,"i"))?.[0]}p(tt,"explicitOptionMention");function ot(o,t){let e=o;const i=[],n=[],r=[],a=p((c,l,m)=>{const g=e.find(P=>c.includes(P.provider.name));if(!g||l.size===0)return!1;e=e.map(P=>P===g?Pe(P,l):P);for(const[P,z]of l)i.push({owner:g.provider.name,option:P,value:z,source:m});return!0},"apply"),d=p((c,l,m)=>{n.push(c),r.push(k(l,m))},"rejectRequirement"),w=p(c=>{const l=e.filter(g=>c.includes(g.provider.name)),m=e.filter(g=>g.provider.kind==="action"&&A.get(g.provider.name)?.domain==="charts");return l.length===1&&m.length===1?l[0]:void 0},"singleFacade"),h=p((c,l,m)=>{let g=e.find(P=>P.provider.name===c);if(!g){const P=A.get(c);g={provider:{id:`request.${c}`,kind:"action",name:c,order:pe(P),anchors:[],covers:[],baseOptions:Object.fromEntries(l)},coverage:[]};const z=e.findIndex(Q=>Q.provider.kind==="runtime");e=[...e],e.splice(z<0?e.length:z,0,g)}a([c],l,m)},"addEditor"),$=[...t.matchAll(/\b(red|blue|green|orange|purple|black|white|yellow|pink|gray|grey)\s+(?:points|markers)\b/gi)];if($.length){const c=D($.map(m=>m[1].toLowerCase())),l=w(["createScatterPlot","createPolarScatterPlot"]);if(c.length===1&&l)for(const m of $)a([l.provider.name],new Map([["point",`{ fill: ${B(c[0])} }`]]),m[0]);else for(const m of $)d(m[0],"request.pointColor","Point color requires one unambiguous point chart and one requested color.")}const u=["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap"],v=[...t.matchAll(/\b(?:rotate|tilt)\s+(?:the\s+)?([xy])[ -]+axis\s+labels?\s+(?:by|to)\s+(-?\d+(?:\.\d+)?)\s*(degrees?|radians?)\b/gi)];for(const c of v){const l=c[1].toUpperCase(),m=Number(c[2]),g=c[3].toLowerCase().startsWith("degree")?"degrees":"radians",P=v.filter(z=>z[1].toUpperCase()===l);w(u)&&Number.isFinite(m)&&D(P.map(z=>`${z[2]}:${z[3]}`)).length===1?h(`edit${l}AxisLabels`,new Map([["rotation",`{ value: ${m}, unit: "${g}" }`]]),c[0]):d(c[0],`request.${l.toLowerCase()}AxisRotation`,"Axis label rotation requires one Cartesian chart and an unambiguous angle with units.")}for(const c of t.matchAll(/\b(?:logarithmic|log)\s+([xy])\s+(?:axis|scale)\b/gi))w(u)?h(`edit${c[1].toUpperCase()}Scale`,new Map([["type",'"log"']]),c[0]):d(c[0],"request.logScale","A logarithmic scale requires one unambiguous Cartesian chart and compatible nonzero data.");const M=t.match(/\b(?:(one|two|three|four|five|six|seven|eight|nine|ten|\d+)\s+bands?|bands?\s*(?:of|=|:)?\s*(one|two|three|four|five|six|seven|eight|nine|ten|\d+))\b/i);if(M){const c=W(M,1,2),l=Number({one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10}[c.toLowerCase()]??c);Number.isInteger(l)&&l>0?a(["createHorizonPlot","encodeHorizon","editHorizon"],new Map([["bands",String(l)]]),M[0]):(n.push(M[0]),r.push(k("request.option.horizon.bands","Horizon bands must be a positive integer.")))}const G=/\b(?:legend|encoding key)\b/i.test(t),X=e.some(c=>c.provider.id.startsWith("exact.")&&/Legend/.test(c.provider.name)),E=e.some(c=>c.provider.name==="facet"),q=new Set(["encoding.color","encoding.opacity","encoding.shape","encoding.size","encoding.strokeDash","encoding.strokeWidth"]),H=e.some(c=>["createPiePlot","createRosePlot","createRadialBarPlot"].includes(c.provider.name)||c.coverage.some(l=>q.has(l)));if(G&&!H&&!X&&!E){const c=D(e.flatMap(l=>l.coverage).filter(l=>l==="guide.legend"||l.startsWith("layout.legend.")));e=e.map(l=>({...l,coverage:l.coverage.filter(m=>m!=="guide.legend"&&!m.startsWith("layout.legend."))})).filter(l=>l.coverage.length>0||l.provider.id.startsWith("exact.")),n.push("legend channel");for(const l of c)r.push(k(l,"A legend requires a concrete compatible encoding channel such as color, shape, size, opacity, stroke dash, or stroke width."))}const L=t.match(/\blegend\s+(?:at|on)\s+(top|bottom|left|right)\b/i),y=G?t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i):void 0,I=G?void 0:t.match(/\b(?:(\d+)\s+columns?|columns?\s*(?:=|:)?\s*(\d+))\b/i),V=G?t.match(/\b(?:(horizontal|vertical)(?:\s+direction)?\s+legend|legend(?:\s+direction)?\s*(?:=|:|is)?\s*(horizontal|vertical)|direction\s*(?:=|:|is)?\s*(horizontal|vertical)|legend\b[^,;]{0,60}\b(horizontal|vertical)|(horizontal|vertical)\s+direction)\b/i):void 0,f=new Map;if(L&&f.set("position",B(L[1].toLowerCase())),y){const c=Number(W(y,1,2));Number.isInteger(c)&&c>0?f.set("columns",String(c)):(n.push(y[0]),r.push(k("request.option.legend.columns","Legend columns must be a positive integer.")))}if(V&&f.set("direction",B(W(V,1,2,3,4,5).toLowerCase())),L?.[1].toLowerCase()==="bottom"&&f.set("offset",$e),I&&(n.push(I[0]),r.push(k("request.option.columns","A column count requires a concrete owner such as a legend or composition layout."))),f.size>0&&(H||X||E)){const c=[L?.[0],y?.[0],V?.[0]].filter(Boolean).join(", ");if(!a(["editLegendLayout","createLegend"],f,c)){const l=[...f].map(([m,g])=>`${m}: ${g}`).join(", ");a([...ve],new Map([["guides",`{ legend: { ${l} } }`]]),c)}}const O=t.match(/\b(\d+)\s+x[ -]?bins?\b/i),j=t.match(/\b(\d+)\s+y[ -]?bins?\b/i),J=t.match(/\b(\d+)\s+(?:bins?|bins? per axis)\b/i),N=new Map,F=[];if(O||j)if(O&&j){const c=Number(O[1]),l=Number(j[1]);if(c>0&&l>0)N.set("bins",`{ x: ${c}, y: ${l} }`),F.push(O[0],j[0]);else{const m=`${O[0]}; ${j[0]}`;n.push(m),r.push(k("request.option.bin2d.bins","Two-dimensional x and y bin counts must be positive integers."))}}else{const c=O?"y":"x",l=(O??j)[0];n.push(l),r.push(k(`transform.bin2d.bins.${c}`,`Two-dimensional bin counts require both x and y; the request specifies only ${l}.`))}else if(J){const c=Number(J[1]);Number.isInteger(c)&&c>0?(N.set("bins",String(c)),F.push(J[0])):(n.push(J[0]),r.push(k("request.option.bin2d.bins","Two-dimensional bin counts must be positive integers.")))}const K=t.match(/\b(include|exclude|omit)\s+empty\s+(?:bins|cells)\b/i);if(K&&(N.set("includeEmpty",String(K[1].toLowerCase()==="include")),F.push(K[0])),N.size>0){const c=F.join("; ");if(!a(["createBin2DData","editBin2DData"],N,c)){const l=[...N].map(([z,Q])=>`${z}: ${Q}`).join(", "),m=a(["createHeatmap"],new Map([["bin",`{ ${l} }`]]),c),g=N.get("bins"),P=!m&&g!==void 0&&/^\d+$/.test(g)&&!N.has("includeEmpty")&&a(["createHistogram"],new Map([["maxBins",g]]),c);!m&&!P&&(n.push(c),r.push(k("request.option.bin2d","Two-dimensional bin options require a heatmap or a create/edit Bin2D data action.")))}}const _=t.match(/\b(?:titled\b|(?:chart\s+)?title\b(?:\s+(?:is|text))?)\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|subtitle|on\s+|as\s+)|$)/i),Y=W(_,1,2,3);Y&&!ce.has(Y.toLowerCase())&&a(["createTitle","editTitle"],new Map([["text",B(Y)]]),_[0]);const ie=t.match(/\bsubtitle(?:\s+(?:is|text))?\s*[:=]?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z0-9][^,;]*?))(?=\s+(?:(?:and|with)\s+)?(?:font(?:[ -]?size)?|title|on\s+|as\s+)|$)/i),ee=W(ie,1,2,3);ee&&!ce.has(ee.toLowerCase())&&a(["createTitle","editTitle"],new Map([["subtitle",B(ee)]]),ie[0]);const s=t.match(/\bfont[ -]?size\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(s){const c=Number(s[1]);c>0&&a(["createTitle","editTitle"],new Map([["titleStyle",`{ fontSize: ${s[1]} }`]]),s[0])||(n.push(s[0]),r.push(k("request.option.fontSize",c>0?"A font size requires a concrete text owner such as a chart title, axis, legend, or text mark.":"Font size must be a positive finite number.")))}const x=Object.freeze({x:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"],y:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createHeatmap","createBoxPlot","createViolinPlot","createGradientPlot","createRegressionData","createBin2DData","encodeHorizon","createHorizonPlot"]}),b=new Set;for(const c of["x","y"]){const l=Qe(t,c);if(!l||/^(?:bins?|axis|encoding|field)$/i.test(l.value))continue;(a(x[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c.toUpperCase()}`],new Map([["field",B(l.value)]]),l.source))&&b.add(c)}const C=t.match(/\b(?:plot|chart)\s+of\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))\s+(?:vs\.?|versus|against)\s+(?:"([^"]+)"|'([^']+)'|([A-Za-z_$][A-Za-z0-9_$.-]*))/i);if(C&&b.size===0){const c=W(C,1,2,3),l=W(C,4,5,6);for(const[m,g]of[["x",l],["y",c]])a(x[m],new Map([[m,B(g)]]),C[0])||a([`encode${m.toUpperCase()}`],new Map([["field",B(g)]]),C[0])}const R=Object.freeze({color:["createScatterPlot","createLinePlot","createAreaPlot","createBarPlot","createViolinPlot","createPiePlot","createRosePlot","createRadialBarPlot","createPolarScatterPlot","createPolarLinePlot","createRadarPlot"],size:["createScatterPlot","createPolarScatterPlot"],shape:["createScatterPlot","createPolarScatterPlot"]});for(const c of["color","size","shape"]){const l=et(t,c);if(!l)continue;a(R[c],new Map([[c,B(l.value)]]),l.source)||a([`encode${c[0].toUpperCase()}${c.slice(1)}`],new Map([["field",B(l.value)]]),l.source)}const ae=e.find(c=>c.provider.name==="renderToSVG");if(ae){const c=t.match(/\bsvg\s+title\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),l=t.match(/\bdescription\s*(?:=|:)?\s*(?:"([^"]+)"|'([^']+)')/i),m=new Map;if(c&&m.set("title",B(W(c,1,2))),l&&m.set("description",B(W(l,1,2))),m.size>0){const g=[...m].map(([P,z])=>`${P}: ${z}`).join(", ");e=e.map(P=>P===ae?{...P,provider:{...P.provider,call:`renderToSVG(program, { ${g} })`}}:P);for(const[P,z]of m)i.push({owner:"renderToSVG",option:P,value:z,source:P==="title"?c[0]:l[0]})}}const U=t.match(/\bpixel[ -]?ratio\s*(?:=|:)?\s*(\d+(?:\.\d+)?)\b/i);if(U){const c=Number(U[1]),l=e.find(m=>["render","renderToPNG"].includes(m.provider.name));if(l&&c>0){const m=l.provider.name==="render"?`render(program, context, { pixelRatio: ${U[1]} })`:l.provider.call.replace(/\s*}\)$/,`, pixelRatio: ${U[1]} })`);e=e.map(g=>g===l?{...g,provider:{...g.provider,call:m}}:g),i.push({owner:l.provider.name,option:"pixelRatio",value:U[1],source:U[0]})}else n.push(U[0]),r.push(k("renderer.pixelRatio",c>0?"pixelRatio applies only to Browser Canvas or PNG output; choose one of those renderers or remove the requirement.":"pixelRatio must be a positive finite number."))}else if(/\b(?:high[ -]?dpi|retina)\b/i.test(t)){const c=t.match(/\b(?:high[ -]?dpi|retina)\b/i)[0];n.push(c),r.push(k("renderer.pixelRatio","High-density raster or Canvas output requires an explicit positive pixelRatio."))}/\bresponsive\b/i.test(t)&&(n.push("responsive"),r.push(k("layout.responsive","Responsive charts require host resize observation and immutable program rebuilding; no container size was supplied."))),/\b(?:accessible|accessibility|aria)\b/i.test(t)&&(i.some(l=>l.owner==="renderToSVG"&&l.option==="title")&&i.some(l=>l.owner==="renderToSVG"&&l.option==="description")||(n.push("accessible output"),r.push(k(ae?"renderer.svg.accessibleText":"output.accessibility",ae?"Accessible SVG output requires concrete title and description strings.":"Accessibility requires an output-specific accessible name, description, and host fallback strategy."))));const Se=new Set(i.map(c=>`${c.owner}.${Z(c.option)}`)),Oe=Z(t);for(const c of e.filter(l=>l.provider.kind==="action")){const l=A.get(c.provider.name),m=re(c.provider,c.coverage);for(const g of l?.options??[]){const P=Z(g.name);if(P.length<3||!le(Oe,P).length||Se.has(`${c.provider.name}.${P}`)||m.has(g.name)||g.name==="stroke"&&/\b(?:stroke[ -]?dash|dashed?\s+stroke)\b/i.test(t)||g.name==="bins"&&r.some(Ce=>Ce.constraint.startsWith("transform.bin2d.bins.")))continue;const z=tt(t,g.name);if(!z)continue;const Q=`${c.provider.name}.${g.name}: ${z}`;n.includes(Q)||(n.push(Q),r.push(k(`request.option.${c.provider.name}.${g.name}`,`The request mentions ${g.name}, but its value could not be parsed safely for ${c.provider.name}.`)))}}return{entries:e,appliedOptions:i,unmatchedRequirements:D(n),unresolved:r}}p(ot,"applyRequestedOptions");function nt(o,t=[]){const e=new Map,i=p((r,a,d,w)=>{const h=`${a}:${r}`,$=e.get(h)??{name:r,kind:a,required:!0,usedBy:[],reason:w};$.usedBy=D([...$.usedBy,d]),e.set(h,$)},"add"),n=o.find(r=>r.plan.name==="createData");(!n||/\bvalues\s*:\s*values\b/.test(n.call))&&i("values","binding","createData","Supply the caller-owned dataset rows before running the authoring block.");for(const r of o){r.plan.name==="render"&&i("context","runtime","render","Supply a CanvasRenderingContext2D from the host page."),["hconcat","vconcat"].includes(r.plan.name)&&i("programs","program",r.plan.name,"Replace the repeated sample program with two complete child ChartPrograms.");const a=r.call.matchAll(/\b(?:field|x|y|theta|radius|color|size|shape|groupBy|weight):\s*"(x|y|value|category|label|angle|distance|date|a|b|series)"/g);for(const d of a)i(d[1],"field",r.plan.name,"Replace this template name unless the input dataset declares the same field.");if(r.call.includes('"Chart title"')&&i("Chart title","text",r.plan.name,"Replace the sample title with user-approved chart text."),r.plan.id.startsWith("exact.")){const d=A.get(r.plan.name);for(const w of d?.resources.prerequisites??[])i(w,"resource",r.plan.name,"Provide or create this action-card prerequisite before applying the exact call.")}}for(const r of t){if(!new Set(["color","field","groupBy","shape","size","weight","x","y","theta","radius"]).has(r.option))continue;let a;try{a=JSON.parse(r.value)}catch{continue}typeof a!="string"||a.length===0||i(a,"field",r.owner,"Confirm that this request-supplied field exists in the caller-owned dataset.")}return[...e.values()]}p(nt,"placeholderBindings");function rt(o){let t=!1,e=new Set;const i=p(()=>t&&e.has("encodeX")&&e.has("encodeY")&&!e.has("encodeX2")&&!e.has("encodeY2"),"incomplete");for(const n of o){if(n.provider.id.startsWith("exact."))continue;const r=n.provider.name;if(r.startsWith("create")&&(r.endsWith("Mark")||r.endsWith("Plot"))){if(i())return!0;t=r==="createRuleMark",e=new Set;continue}t&&["encodeX","encodeY","encodeX2","encodeY2"].includes(r)&&e.add(r)}return i()}p(rt,"hasIncompleteRulePrimaryPair");function it(o){return o.filter(e=>e.provider.name==="createScale"&&!e.provider.id.startsWith("exact.")).filter(e=>{const i=e.provider.baseOptions?.id;if(i===void 0)return!1;const n=`id: ${i}`;return!o.some(r=>r!==e&&[...re(r.provider,r.coverage).values()].some(a=>a.includes(n)))}).map(e=>e.provider.baseOptions.id.replaceAll('"',""))}p(it,"unconsumedScaleIds");function at(o){const t=new Set(o.filter(d=>!d.provider.id.startsWith("exact.")).map(d=>d.provider.name)),e=[],i=[],n=new Set(o.flatMap(d=>d.coverage)),a=[...t].filter(d=>d.startsWith("create")&&(d.endsWith("Mark")||d.endsWith("Plot"))).length>0||[...t].some(d=>["createHistogram","createHeatmap","createParallelCoordinates"].includes(d));["selectMarks","filterMarks","highlightMarks","facet"].some(d=>t.has(d))&&!a&&e.push(k("chart.type","Selection and faceting require one explicit chart or mark owner before those actions can be addressed.")),["hconcat","vconcat"].some(d=>t.has(d))&&!a&&e.push(k("composition.children","Composition requires at least two complete child ChartPrograms; name or provide the child charts first.")),t.has("layoutLabels")&&t.has("createTextMark")&&!t.has("encodeX")&&!t.has("encodeY")&&e.push(k("encoding.position","Collision-aware labels require a positioned source layer or explicit x and y encodings.")),t.has("createLegend")&&!["encodeColor","encodeSize","encodeShape","encodeOpacity","encodeStrokeDash","encodeStrokeWidth"].some(d=>t.has(d))&&e.push(k("guide.legend.channel","A legend requires an explicit compatible visual encoding such as color, size, shape, opacity, dash, or width.")),rt(o)&&e.push(k("encoding.rule.endpoint","A rule with both x and y primary positions also requires x2 or y2; otherwise choose one primary position for a full-span rule."));for(const d of it(o))e.push(k("scale.consumer",`Scale "${d}" is not connected to a compatible encoding; choose the channel that should consume it.`));return(t.has("createAreaMark")||t.has("createAreaPlot"))&&t.has("encodeStrokeDash")&&i.push({constraint:"unsupported.areaStrokeDash",reason:"Field-driven stroke dash is not supported for area marks; use a line or rule mark for dash encoding."}),{unresolved:e,unsupported:i}}p(at,"runtimeClosureDecisions");function k(o,t){const e=ye[o]??(o.startsWith("layout.legend.")?"ggaction://docs/legend-layout":"ggaction://docs/action-reference");return{constraint:o,reason:t,resources:[e]}}p(k,"unresolvedDecision");function st(o,t){const e=[],i=["chart.pie","chart.donut"].some(a=>o.has(a)&&!t.has(a)),n=o.has("chart.horizon")&&!t.has("chart.horizon"),r=o.has("chart.density")&&!t.has("chart.density");for(const a of o){let d;i&&["encoding.x","encoding.y","guide.axes","guide.xAxis","guide.yAxis","guide.grid"].includes(a)&&(d="A pie has categorical sectors and a color legend. Cartesian positions, axes, and grids require a different chart or an explicit lower-level recipe."),n&&(a==="guide.yAxis"||a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Horizon's y scale and palette describe internal folded bands. Choose an explicit lower-level guide or a separate original-amplitude guide; the facade only creates original-x guides."),r&&(a==="encoding.color"||a==="guide.legend"||a.startsWith("layout.legend."))&&(d="Density color requires an explicit groupBy field and matching color field. Its derived data does not retain arbitrary raw categories; choose that grouping before requesting a color legend."),d&&(t.add(a),e.push(k(a,d)))}return e}p(st,"completeChartBoundaries");function ct(o,t,e,i){const n=p(u=>u.normalize("NFKC").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").trim().replace(/\s+/g," "),"normalizeWords"),r=` ${n(o)} `,a=new Uint8Array(r.length),d=[...i.appliedOptions.map(u=>u.source),...i.unmatchedRequirements,...i.unresolved.some(u=>["renderer.svg.accessibleText","output.accessibility"].includes(u.constraint))||["title","description"].every(u=>i.appliedOptions.some(v=>v.owner==="renderToSVG"&&v.option===u))?["accessible","accessibility"]:[],...i.entries.some(u=>u.provider.name==="facet"&&/legend:\s*"shared"/.test(re(u.provider,u.coverage).get("guides")??""))?["shared legend"]:[],...t.flatMap(u=>u.phrases),...e].map(n).filter(Boolean).sort((u,v)=>v.length-u.length);for(const u of d){const v=` ${u} `;let M=r.indexOf(v);for(;M!==-1;)a.fill(1,M,M+v.length),M=r.indexOf(v,M+1)}const w=r.split("").map((u,v)=>a[v]?" ":u).join(""),h=new Set("a an the and then with using use as at on in to of for by from create draw make build show add apply set please chart plot output export render i want would like me can you it this that is be should must into also put charts".split(" "));return w.trim().split(/\s+/).filter(u=>u&&!h.has(u)).length===0?[]:o.trim().match(/[\s\S]{1,176}/g)??[]}p(ct,"unconsumedRequirements");function dt(o,t,e){const i=[],n=[...t].filter(r=>!r.startsWith("renderer.")&&!r.startsWith("unsupported."));return/\b(chart|plot)\b/.test(o)&&n.length===0&&![...t].some(r=>r.startsWith("unsupported."))&&e.length===0&&i.push(k("chart.type","A chart or mark type is required; for example scatter plot, line chart, bar chart, or tick mark.")),/\b(render|export|output)\b/.test(o)&&![...t].some(r=>r.startsWith("renderer."))&&i.push(k("renderer.format","A supported output format is required: Browser Canvas, SVG, PNG, or PDF.")),i}p(dt,"genericUnresolved");function ke(){if(te.schemaVersion!==3||T.schemaVersion!==2)throw new Error("Compact action cards must use schemaVersion 3 and the intent taxonomy must use schemaVersion 2.");if(T.packageVersion!==te.packageVersion)throw new Error("Compact action cards and the intent taxonomy must use one packageVersion.");if(oe.size!==T.constraints.length)throw new Error("Intent constraint IDs must be unique.");if(new Set(T.providers.map(n=>n.id)).size!==T.providers.length)throw new Error("Intent provider IDs must be unique.");const t=new Set;for(const n of T.constraints)for(const r of n.shadows??[])if(!oe.has(r)||r===n.id)throw new Error(`${n.id} shadows invalid constraint ${r}.`);for(const n of T.providers){for(const r of[...n.anchors,...n.covers])if(!oe.has(r))throw new Error(`${n.id} references unknown constraint ${r}.`);if(n.anchors.some(r=>!n.covers.includes(r)))throw new Error(`${n.id} does not cover every anchor.`);for(const r of n.anchors)t.add(r);if(n.kind==="action"){const r=A.get(n.name);if(!r)throw new Error(`${n.id} references unknown action ${n.name}.`);const a=new Set(r.options.map(w=>w.name)),d=[n.baseOptions??{},...Object.values(n.optionsByConstraint??{})];for(const w of d)for(const[h,$]of Object.entries(w)){if(!a.has(h))throw new Error(`${n.id} references undeclared option ${h}.`);if(typeof $!="string"||$.length===0)throw new Error(`${n.id}.${h} must be a JavaScript expression string.`)}}else{if(n.kind!=="runtime"||typeof n.signature!="string"||typeof n.call!="string"||!n.route.startsWith("/reference/"))throw new Error(`${n.id} has an invalid runtime contract.`);if(!ge.includes(n.name)&&se[n.name]===void 0)throw new Error(`${n.id} lacks an authoring runtime mapping.`)}}const e=T.constraints.filter(n=>n.unsupported===void 0&&!t.has(n.id));if(e.length>0)throw new Error(`Supported constraints lack providers: ${e.map(n=>n.id).join(", ")}.`);const i=T.constraints.filter(n=>n.unsupported!==void 0!==n.id.startsWith("unsupported.")||n.unsupported!==void 0&&t.has(n.id));if(i.length>0)throw new Error(`Terminal constraints must use unsupported.* IDs without providers: ${i.map(n=>n.id).join(", ")}.`);for(const n of de)if(!A.has(n))throw new Error(`Missing authoring prerequisite action card: ${n}.`);return{cards:A.size,constraints:oe.size,providers:T.providers.length,supported:T.constraints.filter(n=>n.unsupported===void 0).length,unsupported:T.constraints.filter(n=>n.unsupported!==void 0).length}}p(ke,"validateResolverKnowledge");function mt(o){if(typeof o!="string"||o.trim().length===0)throw new TypeError("searchGgaction query must be a non-empty string.");if(o.length>500)throw new RangeError("searchGgaction query must be at most 500 characters.");ke();const t=Ae(o),e=t?"":o,i=Z(e),n=De(e),{matched:r,positions:a}=Ee(i);for(const f of n){const[O]=le(i,Z(f));O&&a.set(`action.${f}`,O.start)}const d=new Set([...r.map(f=>f.id),...n.map(f=>`action.${f}`)]),w=r.filter(f=>f.unsupported!==void 0).map(f=>({constraint:f.id,reason:f.unsupported})),h=t?[k("request.negation","Negation or exclusion requires explicit interpretation. No authoring steps are proposed; preserve the restriction when choosing action options.")]:[],{blocked:$,unresolved:u}=Ne(r);h.push(...u),h.push(...st(d,$));const v=new Set([...d].filter(f=>{const O=oe.get(f);return!$.has(f)&&(O===void 0||O.unsupported===void 0)})),M=We(v,n),{selected:G,uncovered:X}=je(v,M);for(const f of X)h.push(k(f,"No current action or runtime operation covers this recognized constraint."));h.push(...dt(i,d,n)),d.size===0&&h.length===0&&h.push(k("query.intent","No current ggaction constraint was recognized; use an exact action name or a supported chart task."));let E=He(_e(G).sort((f,O)=>f.provider.order-O.provider.order||xe(f,a)-xe(O,a)||f.provider.id.localeCompare(O.provider.id)));const q=ot(Ye(E),e);E=q.entries,h.push(...q.unresolved);const H=t?[]:ct(e,r,n,q);H.length>0&&(q.unmatchedRequirements.push(...H),h.push(k("request.unconsumed","Part of the original request was not interpreted. Review unmatchedRequirements before claiming the requested chart is complete.")));const L=at(E);w.push(...L.unsupported),h.push(...L.unresolved),L.unsupported.some(f=>f.constraint==="unsupported.areaStrokeDash")&&(E=E.filter(f=>f.provider.name!=="encodeStrokeDash"));const y=E.map((f,O)=>Fe(f,O+1)),I={schemaVersion:5,packageVersion:te.packageVersion,query:o.trim(),matchedConstraints:[...d],actionPlan:y.map(f=>f.plan),exactCalls:y.map(f=>f.call),appliedOptions:q.appliedOptions,placeholderBindings:nt(y,q.appliedOptions),unmatchedRequirements:t?o.trim().length<=180?[o.trim()]:o.trim().match(/[\s\S]{1,176}/g).map((f,O)=>`${O+1}. ${f}`):q.unmatchedRequirements,authoring:Je(y),unsupported:w,unresolved:D(h.map(f=>JSON.stringify(f))).map(JSON.parse),candidates:y.slice(0,3).map(f=>({id:f.plan.id,kind:f.plan.kind,name:f.plan.name,route:f.plan.route}))},V=Buffer.byteLength(JSON.stringify(I),"utf8");if(V>6144)throw new qe(V);return I}p(mt,"searchGgaction");function gt(o){return Buffer.byteLength(JSON.stringify(o),"utf8")}p(gt,"taskPacketBytes"),ke();export{qe as TaskPacketBudgetError,mt as searchGgaction,gt as taskPacketBytes,ke as validateResolverKnowledge};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ggaction",
3
- "version": "0.0.13",
3
+ "version": "0.0.16",
4
4
  "description": "Build charts through immutable, traceable graphical actions.",
5
5
  "license": "MIT",
6
6
  "author": "Hyeon Jeon",
@@ -67,6 +67,18 @@
67
67
  "./svg": {
68
68
  "types": "./types/svg.d.ts",
69
69
  "default": "./src/renderers/svg.js"
70
+ },
71
+ "./diagnostics": {
72
+ "types": "./types/diagnostics.d.ts",
73
+ "default": "./src/diagnostics.js"
74
+ },
75
+ "./persistence": {
76
+ "types": "./types/persistence.d.ts",
77
+ "default": "./src/persistence.js"
78
+ },
79
+ "./accessibility": {
80
+ "types": "./types/accessibility.d.ts",
81
+ "default": "./src/accessibility.js"
70
82
  }
71
83
  },
72
84
  "scripts": {
@@ -111,7 +123,7 @@
111
123
  "docs:signatures:check": "node scripts/generate-doc-signatures.js --check",
112
124
  "examples:index": "node scripts/generate-examples-readme.js",
113
125
  "examples:index:check": "node scripts/generate-examples-readme.js --check",
114
- "docs:generate": "npm run examples:index && npm run docs:capabilities && npm run docs:reference && npm run contracts:relations && npm run contracts:cards && npm run docs:actions && npm run docs:signatures && npm run docs:metadata && npm run docs:search && npm run docs:images && npm run docs:machine && npm run docs:llms",
126
+ "docs:generate": "npm run docs:provenance && npm run docs:workflows && npm run examples:index && npm run docs:capabilities && npm run docs:reference && npm run contracts:relations && npm run contracts:cards && npm run docs:picker && npm run docs:scale-editors && npm run docs:actions && npm run docs:signatures && npm run docs:snippets && npm run docs:metadata && npm run docs:search && npm run docs:images && npm run docs:machine && npm run docs:llms",
115
127
  "docs:build": "bundle exec jekyll build --source docs --destination _site --baseurl /ggaction",
116
128
  "docs:verify": "npm run docs:preflight && npm run docs:generate && npm run test:docs && npm run docs:build && npm run test:docs:built && npm run test:docs:browser",
117
129
  "contracts:catalog": "node scripts/generate-action-catalog.js",
@@ -124,7 +136,17 @@
124
136
  "package:pack": "node scripts/package-artifact.js --pack",
125
137
  "package:bundle": "node scripts/measure-browser-bundle.js",
126
138
  "test:package": "node scripts/package-consumer.js",
127
- "release:notes": "node scripts/release-notes.js"
139
+ "release:notes": "node scripts/release-notes.js",
140
+ "docs:workflows": "node scripts/generate-doc-workflows.js",
141
+ "docs:provenance": "node scripts/doc-provenance.js",
142
+ "docs:picker": "node scripts/generate-doc-chart-picker.js",
143
+ "docs:snippets": "node scripts/generate-doc-snippet-contracts.js",
144
+ "docs:scale-editors": "node scripts/generate-doc-scale-editors.js",
145
+ "benchmark:runtime": "node scripts/benchmark-runtime.js",
146
+ "benchmark:authoring": "node scripts/evaluate-authoring-requirements.js",
147
+ "test:platform": "node scripts/test-platform-package.js",
148
+ "test:browser:compat": "node scripts/run-tests.js browser browser/backend-compatibility.browser.js",
149
+ "release:prepare": "node scripts/prepare-release.js"
128
150
  },
129
151
  "engines": {
130
152
  "node": ">=20"
@@ -134,12 +156,10 @@
134
156
  "registry": "https://registry.npmjs.org/",
135
157
  "tag": "latest"
136
158
  },
137
- "dependencies": {
138
- "@modelcontextprotocol/sdk": "1.30.0",
139
- "@napi-rs/canvas": "^1.0.2"
140
- },
141
159
  "devDependencies": {
142
160
  "@axe-core/playwright": "^4.12.1",
161
+ "@modelcontextprotocol/sdk": "1.30.0",
162
+ "@napi-rs/canvas": "^1.0.2",
143
163
  "ajv": "^8.20.0",
144
164
  "es-module-lexer": "^1.7.0",
145
165
  "esbuild": "0.28.2",
@@ -147,5 +167,17 @@
147
167
  "playwright": "^1.61.1",
148
168
  "typescript": "^7.0.2",
149
169
  "vite": "^6.4.3"
170
+ },
171
+ "peerDependencies": {
172
+ "@modelcontextprotocol/sdk": "1.30.0",
173
+ "@napi-rs/canvas": "^1.0.2"
174
+ },
175
+ "peerDependenciesMeta": {
176
+ "@modelcontextprotocol/sdk": {
177
+ "optional": true
178
+ },
179
+ "@napi-rs/canvas": {
180
+ "optional": true
181
+ }
150
182
  }
151
183
  }
@@ -1,9 +1,11 @@
1
+ import { recordBuiltinActions } from "./core/extensionRegistry.js";
1
2
  import { registerBasicActions } from "./actions/basic.js";
2
3
  import { ChartProgram as CoreChartProgram } from "./core/ChartProgram.js";
3
4
 
4
- class BasicChartProgram extends CoreChartProgram {}
5
+ export class BasicChartProgram extends CoreChartProgram {}
5
6
 
6
7
  registerBasicActions(BasicChartProgram);
8
+ recordBuiltinActions(BasicChartProgram, ["hconcat", "vconcat", "rematerializeEncodingScales"]);
7
9
 
8
10
  export function chart() {
9
11
  return new BasicChartProgram();
@@ -1,9 +1,11 @@
1
+ import { recordBuiltinActions } from "./core/extensionRegistry.js";
1
2
  import { registerActions } from "./actions/index.js";
2
3
  import { ChartProgram as CoreChartProgram } from "./core/ChartProgram.js";
3
4
 
4
5
  export class ChartProgram extends CoreChartProgram {}
5
6
 
6
7
  registerActions(ChartProgram);
8
+ recordBuiltinActions(ChartProgram, ["hconcat", "vconcat", "rematerializeEncodingScales"]);
7
9
 
8
10
  export function chart() {
9
11
  return new ChartProgram();
@@ -0,0 +1,157 @@
1
+ import { ChartProgram } from "./core/ChartProgram.js";
2
+ import { cloneAndFreeze } from "./core/immutable.js";
3
+ import { validateOptionObject } from "./core/validation.js";
4
+ import { validateUserId } from "./core/identifiers.js";
5
+ import { findLayer } from "./selectors/layers.js";
6
+ import { requireDataset } from "./selectors/datasets.js";
7
+ import { requireSemanticScale } from "./selectors/scales.js";
8
+ import { ownedChildren, ownership } from "./selectors/markOwners.js";
9
+ import { resolveMarkItems } from "./materialization/selection/policies/index.js";
10
+ import { channelMapFromRow } from "./materialization/selection/items/common.js";
11
+ import { deriveLineSeries, resolveLineBins } from "./grammar/lineSeries.js";
12
+ import { deriveAreaSeries, deriveCenteredAreaSeries, deriveDensityAreaSeries, layoutDensityAreaSeries } from "./grammar/areaSeries.js";
13
+ import { findUpstreamTransform } from "./materialization/dataProvenance.js";
14
+
15
+ function unsupported(id, message) {
16
+ throw new Error(`Cannot export accessible data for mark "${id}": ${message}.`);
17
+ }
18
+
19
+ function pathRows(program, layer) {
20
+ const dataset = requireDataset(program, layer.data);
21
+ const rows = dataset.values;
22
+ if (layer.encoding.parallel !== undefined) {
23
+ const dimensions = layer.encoding.parallel.dimensions;
24
+ return resolveMarkItems(program, layer.id).map(item => ({
25
+ series: {}, values: Object.fromEntries(dimensions.map(dimension =>
26
+ [dimension.field, item.fields[dimension.field] ?? null]))
27
+ }));
28
+ }
29
+ let derived;
30
+ if (layer.mark.type === "line") {
31
+ const x = layer.encoding.x;
32
+ derived = deriveLineSeries(rows, layer, {
33
+ ...(x?.bin === undefined ? {} : { xBinBoundaries: resolveLineBins(rows, layer, requireSemanticScale(program, x.scale)).boundaries }),
34
+ thetaDomain: program.resolvedScales[layer.encoding.theta?.scale]?.domain
35
+ });
36
+ } else {
37
+ const transform = findUpstreamTransform(program, dataset, "density");
38
+ derived = transform === undefined
39
+ ? layer.encoding.y?.stack === "center"
40
+ ? deriveCenteredAreaSeries(rows, layer)
41
+ : deriveAreaSeries(rows, layer)
42
+ : deriveDensityAreaSeries(rows, layer, transform);
43
+ if (transform !== undefined && transform.placement?.type !== "category") {
44
+ derived = layoutDensityAreaSeries(derived, layer.layout?.mode ?? layer.encoding.color?.layout ?? "overlay");
45
+ }
46
+ }
47
+ // Confirm the same final series are materialized; never export source rows as vertices.
48
+ const graphic = program.graphicSpec.objects[layer.id];
49
+ if (!Array.isArray(graphic?.items) || graphic.items.length !== derived.series.length) {
50
+ unsupported(layer.id, "final path series do not match materialized graphics");
51
+ }
52
+ return derived.series.flatMap(series => series.values.map(value => ({
53
+ series: series.key,
54
+ values: {
55
+ ...channelMapFromRow(series.key, layer),
56
+ ...Object.fromEntries(Object.entries(value).filter(([key]) =>
57
+ !["sourceIndex", "order", "pathOrder"].includes(key)))
58
+ }
59
+ })));
60
+ }
61
+
62
+ function finalRows(program, layer) {
63
+ if (program.graphicSpec.objects[layer.id] === undefined) {
64
+ unsupported(layer.id, "the owner is not materialized");
65
+ }
66
+ if (["line", "area"].includes(layer.mark.type)) return pathRows(program, layer);
67
+ if (!["point", "bar", "arc", "rule", "tick", "rect"].includes(layer.mark.type)) {
68
+ unsupported(layer.id, `unsupported ${layer.mark.type} owner`);
69
+ }
70
+ return resolveMarkItems(program, layer.id).map(item => ({
71
+ series: Object.fromEntries(["group", "color", "stroke"].flatMap(channel => {
72
+ const encoding = layer.encoding[channel];
73
+ return encoding?.field !== undefined && ["nominal", "ordinal"].includes(encoding.fieldType) && item.channels[channel] !== undefined
74
+ ? [[encoding.field, item.channels[channel]]] : [];
75
+ })),
76
+ values: item.channels
77
+ }));
78
+ }
79
+
80
+ function column(layer, key) {
81
+ const dimension = layer.encoding.parallel?.dimensions.find(item => item.field === key);
82
+ const encoding = dimension ?? layer.encoding[key] ?? layer.encoding[key.replace(/2$/, "")];
83
+ const temporal = encoding?.fieldType === "temporal";
84
+ return {
85
+ key,
86
+ role: key,
87
+ ...(encoding?.field === undefined ? {} : { field: encoding.field }),
88
+ ...(encoding?.aggregate === undefined ? {} : { aggregate: encoding.aggregate }),
89
+ ...(temporal ? { unit: "utc-milliseconds" } : {})
90
+ };
91
+ }
92
+
93
+ function ownerView(program, layer) {
94
+ const ownerByChild = ownership(program);
95
+ const components = [];
96
+ const visited = new Set();
97
+ const visit = current => {
98
+ if (visited.has(current.id)) unsupported(layer.id, "cyclic mark ownership");
99
+ visited.add(current.id);
100
+ components.push(current);
101
+ for (const id of ownedChildren(program, current.id)) {
102
+ if (ownerByChild.get(id) === current.id) visit(findLayer(program, id));
103
+ }
104
+ };
105
+ visit(layer);
106
+ const columns = new Map();
107
+ const rows = [];
108
+ for (const component of components) {
109
+ // Attached text labels repeat their owner's values; they are not independent data views.
110
+ if (component.mark.type === "text" && component.source !== undefined) continue;
111
+ const resolved = finalRows(program, component);
112
+ for (const row of resolved) {
113
+ for (const key of Object.keys(row.values)) {
114
+ const id = `${component.id}:${key}`;
115
+ if (!columns.has(id)) columns.set(id, { ...column(component, key), key: id, component: component.id });
116
+ }
117
+ rows.push({ component: component.id, series: row.series,
118
+ values: Object.fromEntries(Object.entries(row.values).map(([key, value]) => [`${component.id}:${key}`, value])) });
119
+ }
120
+ }
121
+ return { ownerId: layer.id, markType: layer.mark.type,
122
+ columns: [...columns.values()], rows,
123
+ units: Object.fromEntries([...columns.values()].filter(item => item.unit !== undefined).map(item => [item.key, item.unit])) };
124
+ }
125
+
126
+ function alternative(program, target) {
127
+ const title = program.semanticSpec.title.text ?? null;
128
+ if (program.compositionSpec !== undefined) {
129
+ if (target !== undefined) throw new Error("Composition targets are ambiguous; export an explicit child program instead.");
130
+ const spec = program.compositionSpec;
131
+ return { title, views: spec.children.map((id, index) => ({
132
+ ownerId: id, kind: "composition-child",
133
+ ...(spec.facet === undefined ? {} : { facet: spec.facet.grid !== undefined
134
+ ? { [spec.facet.grid.rows.field]: spec.facet.grid.cells[index].rowValue, [spec.facet.grid.columns.field]: spec.facet.grid.cells[index].columnValue }
135
+ : spec.facet.repeat !== undefined ? { repeatField: spec.facet.values[index], channel: spec.facet.repeat.channel }
136
+ : { [spec.facet.field]: spec.facet.values[index] } }),
137
+ ...alternative(program.children[id])
138
+ })) };
139
+ }
140
+ const owners = ownership(program);
141
+ let layers = program.semanticSpec.layers.filter(layer => !owners.has(layer.id));
142
+ if (target !== undefined) {
143
+ const layer = findLayer(program, target);
144
+ if (layer === undefined) throw new Error(`Unknown mark target "${target}".`);
145
+ if (owners.has(target)) throw new Error(`Mark "${target}" is owned by "${owners.get(target)}"; export its stable owner.`);
146
+ layers = [layer];
147
+ }
148
+ return { title, views: layers.map(layer => ownerView(program, layer)) };
149
+ }
150
+
151
+ export function exportAccessibleData(program, options = {}) {
152
+ validateOptionObject(options, ["target"], "exportAccessibleData");
153
+ if (!(program instanceof ChartProgram)) throw new TypeError("exportAccessibleData requires an editable chart program.");
154
+ if (program.actionStack.length !== 0) throw new Error("exportAccessibleData requires a closed action stack.");
155
+ if (options.target !== undefined) validateUserId(options.target, "Accessible data target");
156
+ return cloneAndFreeze({ schemaVersion: 1, ...alternative(program, options.target) });
157
+ }
@@ -1,6 +1,6 @@
1
1
  import { registerBasicCanvasActions } from "./canvas/index.js";
2
2
  import { registerBasicChartActions } from "./charts/basic.js";
3
- import { registerCoordinateActions } from "./coordinates/actions.js";
3
+ import { registerBasicCoordinateActions } from "./coordinates/actions.js";
4
4
  import { registerBasicDataActions } from "./data/basic.js";
5
5
  import { registerBasicEncodingActions } from "./encodings/basic.js";
6
6
  import { registerBasicGuideActions } from "./guides/basic.js";
@@ -17,7 +17,7 @@ export function registerBasicActions(ProgramClass) {
17
17
  registerBasicMarkActions(ProgramClass);
18
18
  registerBasicScaleActions(ProgramClass);
19
19
  registerBasicEncodingActions(ProgramClass);
20
- registerCoordinateActions(ProgramClass);
20
+ registerBasicCoordinateActions(ProgramClass);
21
21
  registerBasicGuideActions(ProgramClass);
22
22
  registerBasicChartActions(ProgramClass);
23
23
  }
@@ -1,29 +1,37 @@
1
- import { action } from "../../core/action.js";
2
- import { validateKeys } from "../../core/validation.js";
1
+ import { closedAction } from "../../core/action.js";
2
+
3
+ import {
4
+ requestedStrokeDetails,
5
+ STROKE_STYLE_PROPERTIES
6
+ } from "../../grammar/strokeStyle.js";
3
7
 
4
8
  const MEDIAN_OPTIONS = Object.freeze([
5
9
  "id", "owner", "data", "category", "categoryType", "measure",
6
10
  "coordinate", "categoryScale", "measureScale", "orientation", "stroke",
7
- "strokeWidth"
11
+ "strokeWidth", ...STROKE_STYLE_PROPERTIES
8
12
  ]);
9
13
  const OUTLIER_OPTIONS = Object.freeze([
10
14
  "id", "data", "category", "categoryType", "measure", "coordinate",
11
- "categoryScale", "measureScale", "orientation", "shape", "radius", "opacity"
15
+ "categoryScale", "measureScale", "orientation", "shape", "radius", "opacity",
16
+ ...STROKE_STYLE_PROPERTIES
12
17
  ]);
13
18
 
14
- export const createBoxMedian = action(
19
+ export const createBoxMedian = /* @__PURE__ */ closedAction(
15
20
  {
16
21
  op: "createBoxMedian",
17
22
  description: "Create a median rule spanning one concrete box body."
18
- },
23
+ }, MEDIAN_OPTIONS,
19
24
  function (args = {}) {
20
- validateKeys(args, MEDIAN_OPTIONS, "createBoxMedian");
21
25
  if (!["vertical", "horizontal"].includes(args.orientation)) {
22
26
  throw new Error(`Unsupported box median orientation "${args.orientation}".`);
23
27
  }
24
28
  const categoryAction = args.orientation === "vertical" ? "encodeX" : "encodeY";
25
29
  const measureAction = args.orientation === "vertical" ? "encodeY" : "encodeX";
26
- let next = this.createRuleMark({ id: args.id, data: args.data });
30
+ let next = this.createRuleMark({
31
+ id: args.id,
32
+ data: args.data,
33
+ ...requestedStrokeDetails(args, "Box median")
34
+ });
27
35
  next = next[categoryAction]({
28
36
  target: args.id,
29
37
  field: args.category,
@@ -49,13 +57,12 @@ export const createBoxMedian = action(
49
57
  }
50
58
  );
51
59
 
52
- export const createBoxOutliers = action(
60
+ export const createBoxOutliers = /* @__PURE__ */ closedAction(
53
61
  {
54
62
  op: "createBoxOutliers",
55
63
  description: "Create concrete point symbols for box-plot outlier rows."
56
- },
64
+ }, OUTLIER_OPTIONS,
57
65
  function (args = {}) {
58
- validateKeys(args, OUTLIER_OPTIONS, "createBoxOutliers");
59
66
  if (!["vertical", "horizontal"].includes(args.orientation)) {
60
67
  throw new Error(`Unsupported box outlier orientation "${args.orientation}".`);
61
68
  }
@@ -65,7 +72,8 @@ export const createBoxOutliers = action(
65
72
  id: args.id,
66
73
  data: args.data,
67
74
  shape: args.shape,
68
- fill: "#111111"
75
+ fill: "#111111",
76
+ ...requestedStrokeDetails(args, "Box outlier")
69
77
  });
70
78
  next = next[categoryAction]({
71
79
  target: args.id,