@pixerate/editor 0.54.0 → 0.56.0

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 (115) hide show
  1. package/dist/agent/index.cjs +24 -23
  2. package/dist/agent/index.cjs.map +1 -1
  3. package/dist/agent/index.js +9 -8
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/animation/index.cjs +1 -1
  6. package/dist/animation/index.cjs.map +1 -1
  7. package/dist/animation/index.d.cts +2 -1
  8. package/dist/animation/index.d.ts +2 -1
  9. package/dist/animation/index.js +1 -1
  10. package/dist/animation-editor/index.cjs +2221 -0
  11. package/dist/animation-editor/index.cjs.map +1 -0
  12. package/dist/animation-editor/index.d.cts +1117 -0
  13. package/dist/animation-editor/index.d.ts +1117 -0
  14. package/dist/animation-editor/index.js +2221 -0
  15. package/dist/animation-editor/index.js.map +1 -0
  16. package/dist/bezier-BfwIbVTl.d.cts +548 -0
  17. package/dist/bezier-DYBvLgUH.d.ts +548 -0
  18. package/dist/canvas/index.cjs +2740 -580
  19. package/dist/canvas/index.cjs.map +1 -1
  20. package/dist/canvas/index.d.cts +402 -6
  21. package/dist/canvas/index.d.ts +402 -6
  22. package/dist/canvas/index.js +2735 -575
  23. package/dist/canvas/index.js.map +1 -1
  24. package/dist/chart/index.cjs +33 -31
  25. package/dist/chart/index.cjs.map +1 -1
  26. package/dist/chart/index.d.cts +4 -2
  27. package/dist/chart/index.d.ts +4 -2
  28. package/dist/chart/index.js +21 -19
  29. package/dist/chart/index.js.map +1 -1
  30. package/dist/{chunk-C3JHII3M.cjs → chunk-3I6V7PI4.cjs} +45 -45
  31. package/dist/{chunk-C3JHII3M.cjs.map → chunk-3I6V7PI4.cjs.map} +1 -1
  32. package/dist/{chunk-P43HUQRX.cjs → chunk-AHCENCU4.cjs} +12 -10
  33. package/dist/chunk-AHCENCU4.cjs.map +1 -0
  34. package/dist/{chunk-TO22LX34.js → chunk-GTMJ4Y3S.js} +2208 -2920
  35. package/dist/chunk-GTMJ4Y3S.js.map +1 -0
  36. package/dist/chunk-II77MLHN.cjs +11106 -0
  37. package/dist/chunk-II77MLHN.cjs.map +1 -0
  38. package/dist/{chunk-OIKYP7XC.js → chunk-LMUDHBWR.js} +2 -2
  39. package/dist/chunk-MLREO6J3.cjs +737 -0
  40. package/dist/chunk-MLREO6J3.cjs.map +1 -0
  41. package/dist/chunk-NONDTTH7.js +5979 -0
  42. package/dist/chunk-NONDTTH7.js.map +1 -0
  43. package/dist/{chunk-YNSK4MGT.cjs → chunk-O2UH7LZE.cjs} +1549 -2261
  44. package/dist/chunk-O2UH7LZE.cjs.map +1 -0
  45. package/dist/{chunk-VODBAO32.js → chunk-OEFCLWZ3.js} +4 -1425
  46. package/dist/chunk-OEFCLWZ3.js.map +1 -0
  47. package/dist/{chunk-NK3WL5TJ.cjs → chunk-P2CTDJNF.cjs} +27 -1448
  48. package/dist/chunk-P2CTDJNF.cjs.map +1 -0
  49. package/dist/chunk-TKPPIVW7.cjs +1443 -0
  50. package/dist/chunk-TKPPIVW7.cjs.map +1 -0
  51. package/dist/chunk-VWZB6BCY.js +737 -0
  52. package/dist/chunk-VWZB6BCY.js.map +1 -0
  53. package/dist/chunk-WJSCGBJ2.js +11106 -0
  54. package/dist/chunk-WJSCGBJ2.js.map +1 -0
  55. package/dist/{chunk-RIXTW3C4.js → chunk-WLVZ235X.js} +5 -3
  56. package/dist/{chunk-RIXTW3C4.js.map → chunk-WLVZ235X.js.map} +1 -1
  57. package/dist/chunk-XCXQDPID.cjs +5979 -0
  58. package/dist/chunk-XCXQDPID.cjs.map +1 -0
  59. package/dist/chunk-ZOH6X3VR.js +1443 -0
  60. package/dist/chunk-ZOH6X3VR.js.map +1 -0
  61. package/dist/color-E9pwm--w.d.cts +33 -0
  62. package/dist/color-E9pwm--w.d.ts +33 -0
  63. package/dist/commands/index.cjs +2 -2
  64. package/dist/commands/index.cjs.map +1 -1
  65. package/dist/commands/index.js +3 -3
  66. package/dist/{controller-DscWQbjO.d.ts → controller-D2rj5umx.d.ts} +2 -362
  67. package/dist/{controller-CX0QfSv0.d.cts → controller-R2biKk_E.d.cts} +2 -362
  68. package/dist/diagram/index.cjs +1481 -50
  69. package/dist/diagram/index.cjs.map +1 -1
  70. package/dist/diagram/index.d.cts +1757 -15
  71. package/dist/diagram/index.d.ts +1757 -15
  72. package/dist/diagram/index.js +1469 -38
  73. package/dist/diagram/index.js.map +1 -1
  74. package/dist/extensions/index.cjs +5 -4
  75. package/dist/extensions/index.cjs.map +1 -1
  76. package/dist/extensions/index.d.cts +4 -3
  77. package/dist/extensions/index.d.ts +4 -3
  78. package/dist/extensions/index.js +4 -3
  79. package/dist/{index-DIWB6xMf.d.cts → index-BcHyG0Wq.d.cts} +2 -1
  80. package/dist/{index-CALDD35B.d.ts → index-CTCc3m3C.d.ts} +2 -1
  81. package/dist/index.cjs +10 -9
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +4 -3
  84. package/dist/index.d.ts +4 -3
  85. package/dist/index.js +4 -3
  86. package/dist/index.js.map +1 -1
  87. package/dist/pathfinder-BZL8aSu0.d.cts +469 -0
  88. package/dist/pathfinder-CNtsbCRK.d.ts +469 -0
  89. package/dist/{player-DSMjdgQ9.d.cts → player-Dg0FT0UI.d.cts} +1 -33
  90. package/dist/{player-DdfVrKWq.d.ts → player-W-5DX3Go.d.ts} +1 -33
  91. package/dist/svg-CLg2zqZA.d.cts +847 -0
  92. package/dist/svg-CPK82TtU.d.ts +847 -0
  93. package/dist/types-BRp-6zkY.d.cts +362 -0
  94. package/dist/types-BRp-6zkY.d.ts +362 -0
  95. package/dist/{types-BULrFyuQ.d.cts → types-DYkjhzdz.d.cts} +1 -1
  96. package/dist/{types-BULrFyuQ.d.ts → types-DYkjhzdz.d.ts} +1 -1
  97. package/dist/vector/index.cjs +1328 -6752
  98. package/dist/vector/index.cjs.map +1 -1
  99. package/dist/vector/index.d.cts +6 -846
  100. package/dist/vector/index.d.ts +6 -846
  101. package/dist/vector/index.js +645 -6069
  102. package/dist/vector/index.js.map +1 -1
  103. package/package.json +6 -1
  104. package/dist/chunk-H5K77C7Y.cjs +0 -3848
  105. package/dist/chunk-H5K77C7Y.cjs.map +0 -1
  106. package/dist/chunk-NK3WL5TJ.cjs.map +0 -1
  107. package/dist/chunk-P43HUQRX.cjs.map +0 -1
  108. package/dist/chunk-TO22LX34.js.map +0 -1
  109. package/dist/chunk-VODBAO32.js.map +0 -1
  110. package/dist/chunk-WWJNC7SX.js +0 -3848
  111. package/dist/chunk-WWJNC7SX.js.map +0 -1
  112. package/dist/chunk-YNSK4MGT.cjs.map +0 -1
  113. package/dist/pathfinder-B9xh_pCZ.d.ts +0 -1013
  114. package/dist/pathfinder-QdG70sr9.d.cts +0 -1013
  115. /package/dist/{chunk-OIKYP7XC.js.map → chunk-LMUDHBWR.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/chart/raster.ts","../../src/chart/recommend.ts","../../src/chart/commands.ts","../../src/chart/interaction.ts","../../src/chart/tools.ts","../../src/chart/stream.ts","../../src/chart/presence.ts","../../src/chart/office-files.ts","../../src/chart/file-tools.ts"],"sourcesContent":["// Paint resolution before drawing to a canvas follows Ursula's src/react/export.ts `inlineSvgPaint`,\n// and the longest-side bound its `canvasSnapshot`.\nimport { chartToSvg } from './svg.js';\nimport type { ChartSpec, ChartTheme } from './types.js';\n\n/** Longest side, in pixels, of a rasterized chart unless `maxSize` says otherwise. */\nexport const CHART_RASTER_MAX_SIZE = 1024;\n\nexport interface ChartPaintScope {\n\t/**\n\t * Element whose CSS variables, `color` and `font-family` stand in for `var(--x)`,\n\t * `currentColor` and `inherit` (default: the document's root element). Pass the chart's\n\t * container when its theme is scoped (e.g. a `.dark` wrapper).\n\t */\n\tscope?: Element | null;\n\t/** Looks up a custom property (`--name`) instead of `getComputedStyle(scope)`. Return '' when unset. */\n\tlookup?: (name: string) => string;\n}\n\nexport interface RasterizeChartOptions extends ChartPaintScope {\n\t/** Size of the chart in CSS pixels (the SVG's own size). */\n\twidth: number;\n\theight: number;\n\t/** Pixels per CSS pixel (default 2), reduced so the longest side stays within `maxSize`. */\n\tscale?: number;\n\t/** Longest side of the image in pixels (default 1024). */\n\tmaxSize?: number;\n\t/** Fill behind the chart (default white; `transparent` keeps the alpha channel). */\n\tbackground?: string;\n\t/** Document to create the canvas and image in (default: the global one). */\n\tdocument?: Document;\n}\n\nexport interface ChartRasterImage {\n\t/** Base64 PNG, without the `data:` prefix. */\n\tdata: string;\n\tmimeType: 'image/png';\n\t/** Size of the image in pixels. */\n\twidth: number;\n\theight: number;\n}\n\n/** Pixel size of the image for a chart of `width` × `height` CSS pixels: `scale` × the size, longest side ≤ `maxSize`. */\nexport function chartRasterSize(width: number, height: number, scale = 2, maxSize = CHART_RASTER_MAX_SIZE): { width: number; height: number; scale: number } {\n\tif (!(width > 0) || !(height > 0)) throw new Error(`A chart image needs a positive width and height; got ${width} × ${height}.`);\n\tconst factor = Math.min(scale > 0 ? scale : 1, maxSize / Math.max(width, height));\n\treturn { width: Math.max(1, Math.round(width * factor)), height: Math.max(1, Math.round(height * factor)), scale: factor };\n}\n\n/** Index just past the `)` closing the parenthesis opened at `open`, or -1. */\nfunction closingParen(text: string, open: number): number {\n\tlet depth = 0;\n\tfor (let i = open; i < text.length; i++) {\n\t\tif (text[i] === '(') depth++;\n\t\telse if (text[i] === ')' && --depth === 0) return i + 1;\n\t}\n\treturn -1;\n}\n\n/** Replaces every `var(--name, fallback)` in a CSS value; unset variables without a fallback become ''. */\nfunction substituteVars(value: string, lookup: (name: string) => string, depth = 0): string {\n\tlet out = '';\n\tlet i = 0;\n\tfor (let at = value.indexOf('var(', i); at !== -1; at = value.indexOf('var(', i)) {\n\t\tconst end = closingParen(value, at + 3);\n\t\tif (end === -1) break;\n\t\tconst inner = value.slice(at + 4, end - 1);\n\t\tlet comma = -1;\n\t\tfor (let j = 0, d = 0; j < inner.length; j++) {\n\t\t\tif (inner[j] === '(') d++;\n\t\t\telse if (inner[j] === ')') d--;\n\t\t\telse if (inner[j] === ',' && d === 0) {\n\t\t\t\tcomma = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst name = (comma === -1 ? inner : inner.slice(0, comma)).trim();\n\t\tconst fallback = comma === -1 ? '' : inner.slice(comma + 1).trim();\n\t\tconst found = lookup(name).trim();\n\t\tconst resolved = found || fallback;\n\t\tout += value.slice(i, at) + (depth < 8 && resolved.includes('var(') ? substituteVars(resolved, lookup, depth + 1) : resolved);\n\t\ti = end;\n\t}\n\treturn out + value.slice(i);\n}\n\nconst PAINT_ATTRIBUTE = /(\\s)([\\w:-]+)=\"([^\"]*)\"/g;\n\n/**\n * Makes a chart SVG drawable on its own (as an `<img>` or on a canvas, where the page's CSS\n * does not apply): `var(--x, fallback)` becomes the variable's value on `scope` (or the\n * fallback), `currentColor` the scope's colour and `font-family=\"inherit\"` its font. An\n * attribute left empty is dropped, so the renderer's default applies instead of an invalid\n * paint. Text content is left alone.\n */\nexport function resolveChartSvgPaints(svg: string, options: ChartPaintScope = {}): string {\n\tconst doc = (globalThis as { document?: Document }).document;\n\tconst scope = options.scope ?? doc?.documentElement ?? null;\n\tconst view = scope?.ownerDocument?.defaultView ?? (globalThis as { getComputedStyle?: Window['getComputedStyle'] });\n\tlet computed: CSSStyleDeclaration | null | undefined;\n\tconst style = () => {\n\t\tif (computed === undefined) computed = scope && typeof view?.getComputedStyle === 'function' ? view.getComputedStyle(scope) : null;\n\t\treturn computed;\n\t};\n\tconst lookup = options.lookup ?? ((name: string) => style()?.getPropertyValue(name) ?? '');\n\treturn svg.replace(PAINT_ATTRIBUTE, (match, space: string, name: string, raw: string) => {\n\t\tlet value = raw;\n\t\tif (value.includes('var(')) value = substituteVars(value.replace(/&quot;/g, '\"'), lookup).replace(/\"/g, '&quot;');\n\t\tif (/currentcolor/i.test(value)) value = value.replace(/currentcolor/gi, style()?.color || '#000000');\n\t\tif (name === 'font-family' && /^(inherit|unset|initial)$/i.test(value.trim())) value = (style()?.fontFamily || 'sans-serif').replace(/\"/g, \"'\");\n\t\tif (value === raw) return match;\n\t\treturn value.trim() ? `${space}${name}=\"${value}\"` : '';\n\t});\n}\n\nconst NO_DOM =\n\t'Rasterizing a chart needs a browser DOM (document, Image and a 2D canvas). Outside a browser, render SVG with chartToSvg (or render_chart with format \"svg\") and convert it with an SVG renderer, or pass your own rasterize option to createChartToolProvider.';\n\n/** Draws an SVG document onto a canvas and returns the PNG as a data URL. */\nasync function svgToPngDataUrl(svg: string, options: RasterizeChartOptions): Promise<{ url: string; width: number; height: number }> {\n\tconst doc = options.document ?? (globalThis as { document?: Document }).document;\n\tconst ImageCtor = (doc?.defaultView as (Window & typeof globalThis) | null | undefined)?.Image ?? (globalThis as { Image?: typeof Image }).Image;\n\tif (!doc || typeof doc.createElement !== 'function' || !ImageCtor) throw new Error(NO_DOM);\n\tconst size = chartRasterSize(options.width, options.height, options.scale, options.maxSize);\n\tconst canvas = doc.createElement('canvas');\n\tcanvas.width = size.width;\n\tcanvas.height = size.height;\n\tlet context: CanvasRenderingContext2D | null = null;\n\ttry {\n\t\tcontext = canvas.getContext('2d');\n\t} catch {\n\t\tcontext = null;\n\t}\n\tif (!context) throw new Error(NO_DOM);\n\n\tconst drawable = resolveChartSvgPaints(svg, options);\n\tconst image = new ImageCtor();\n\tawait new Promise<void>((resolve, reject) => {\n\t\timage.onload = () => resolve();\n\t\timage.onerror = () => reject(new Error('The chart SVG could not be loaded as an image; check that it is a complete <svg> document with the SVG namespace.'));\n\t\timage.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(drawable)}`;\n\t});\n\tconst background = options.background ?? '#ffffff';\n\tif (background !== 'transparent') {\n\t\tcontext.fillStyle = background;\n\t\tcontext.fillRect(0, 0, size.width, size.height);\n\t}\n\tcontext.drawImage(image, 0, 0, size.width, size.height);\n\tconst url = canvas.toDataURL('image/png');\n\tif (!url.startsWith('data:image/png')) throw new Error('This canvas cannot export PNG (toDataURL returned no image).');\n\treturn { url, width: size.width, height: size.height };\n}\n\n/**\n * Turns a chart SVG (from `chartToSvg`, `chartSceneToSvg` or a live chart's `<svg>`) into a\n * PNG in the browser: resolves CSS-variable paints first (see `resolveChartSvgPaints`, without\n * which they draw black), draws it through an `Image` onto a canvas at `scale` (longest side\n * ≤ `maxSize`, default 1024) over `background`, and returns base64 data. Throws a message\n * saying what to do instead when there is no DOM or canvas.\n */\nexport async function rasterizeChartSvg(svg: string, options: RasterizeChartOptions): Promise<ChartRasterImage> {\n\tconst { url, width, height } = await svgToPngDataUrl(svg, options);\n\treturn { data: url.slice(url.indexOf(',') + 1), mimeType: 'image/png', width, height };\n}\n\n/**\n * A `rasterize` function for `createChartToolProvider` (so `render_chart { format: \"png\" }`\n * works), or `undefined` when there is no DOM to draw with. The React and Svelte\n * `useChartToolProvider` pass one by default.\n */\nexport function createChartRasterizer(\n\toptions: Omit<RasterizeChartOptions, 'width' | 'height'> = {}\n): ((svg: string, size: { width: number; height: number }) => Promise<ChartRasterImage>) | undefined {\n\tconst doc = options.document ?? (globalThis as { document?: Document }).document;\n\tif (!doc || typeof doc.createElement !== 'function') return undefined;\n\treturn (svg, size) => rasterizeChartSvg(svg, { ...options, ...size });\n}\n\nexport interface DownloadChartPngOptions extends Omit<RasterizeChartOptions, 'width' | 'height'> {\n\t/** Chart size in CSS pixels (default 800 × 450). */\n\twidth?: number;\n\theight?: number;\n\t/** File name (default: the chart title, else `chart`, plus `.png`). */\n\tfilename?: string;\n\t/** Colours and type (default: the light default theme, with concrete colours). */\n\ttheme?: Partial<ChartTheme>;\n}\n\n/** A file name for a chart: its title in lower case with dashes, else `chart`, plus the extension. */\nexport function chartFileName(spec: Pick<ChartSpec, 'title'>, extension: string): string {\n\tconst base = (spec.title ?? '')\n\t\t.toLowerCase()\n\t\t.replace(/[^\\p{L}\\p{N}]+/gu, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.slice(0, 60);\n\treturn `${base || 'chart'}.${extension}`;\n}\n\n/** Renders a chart to PNG (see `rasterizeChartSvg`) and saves it through a download link. Returns the image and the file name. */\nexport async function downloadChartPng(spec: ChartSpec, options: DownloadChartPngOptions = {}): Promise<ChartRasterImage & { filename: string }> {\n\tconst { width = 800, height = 450, filename = chartFileName(spec, 'png'), theme, ...raster } = options;\n\tconst svg = chartToSvg(spec, { width, height, theme });\n\tconst { url, width: w, height: h } = await svgToPngDataUrl(svg, { ...raster, width, height });\n\tconst doc = (raster.document ?? (globalThis as { document?: Document }).document)!;\n\tconst link = doc.createElement('a');\n\tlink.href = url;\n\tlink.download = filename;\n\tlink.style.display = 'none';\n\tdoc.body?.appendChild(link);\n\tlink.click();\n\tlink.remove();\n\treturn { data: url.slice(url.indexOf(',') + 1), mimeType: 'image/png', width: w, height: h, filename };\n}\n","// Ported from gridcraft-main/crates/engine/src/cmd/insert.rs (`series_from_range`, `scatter_x_from_first`,\n// `recommend_charts`) (MIT OR Apache-2.0, © ArtCraft Team and contributors), extended for the chart types\n// this editor adds. See THIRD_PARTY_NOTICES.md.\nimport { parseChartDate } from './date.js';\nimport { chartDataFromTable, parseChartValue } from './spec.js';\nimport type { ChartIssue, ChartSeries, ChartStacking, ChartType } from './types.js';\n\nexport interface ChartTableShape {\n\t/** The first row holds series names (some text, every value cell text or blank). */\n\theaderRow: boolean;\n\t/** The first column holds category labels (all text, or a blank top-left cell above a header row). */\n\tlabelColumn: boolean;\n\t/** Series run along rows (the block is much wider than tall). */\n\tbyRows: boolean;\n\tseries: number;\n\t/** Points per series. */\n\tpoints: number;\n\tanyNumber: boolean;\n\tnonNegative: boolean;\n\tmixedSigns: boolean;\n\t/** The category labels read as dates. */\n\tdates: boolean;\n}\n\nconst blank = (c: unknown) => c === null || c === undefined || String(c).trim() === '';\nconst isText = (c: unknown) => blank(c) || parseChartValue(c) === undefined;\n\n/**\n * Reads the shape of a block of cells the way spreadsheets do: a header row when the first\n * row is text, a label column when the first column is text (or the top-left cell is blank\n * above a header row, the convention for years and x values), and series along the longer side.\n */\nexport function analyzeChartTable(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartTableShape {\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c)));\n\tconst height = grid.length;\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tconst cell = (r: number, c: number) => grid[r]?.[c];\n\tconst headerRow = height > 1 && grid[0].some((c) => !blank(c) && isText(c)) && Array.from({ length: width - 1 }, (_, i) => i + 1).every((c) => isText(cell(0, c)));\n\tconst blankCorner = headerRow && blank(cell(0, 0));\n\tconst labelColumn = width > 1 && (blankCorner || Array.from({ length: height - (headerRow ? 1 : 0) }, (_, i) => i + (headerRow ? 1 : 0)).every((r) => isText(cell(r, 0))));\n\tconst byRows = width > height + 1;\n\tconst dataRows = height - (headerRow ? 1 : 0);\n\tconst dataCols = width - (labelColumn ? 1 : 0);\n\tlet anyNumber = false;\n\tlet nonNegative = true;\n\tlet anyNegative = false;\n\tlet anyPositive = false;\n\tfor (let r = headerRow ? 1 : 0; r < height; r++)\n\t\tfor (let c = labelColumn ? 1 : 0; c < width; c++) {\n\t\t\tconst v = parseChartValue(cell(r, c));\n\t\t\tif (typeof v !== 'number') continue;\n\t\t\tanyNumber = true;\n\t\t\tif (v < 0) {\n\t\t\t\tnonNegative = false;\n\t\t\t\tanyNegative = true;\n\t\t\t} else if (v > 0) anyPositive = true;\n\t\t}\n\tconst labels = byRows ? grid[0]?.slice(labelColumn ? 1 : 0) ?? [] : grid.slice(headerRow ? 1 : 0).map((r) => r[0]);\n\tconst dates = (byRows ? headerRow : labelColumn) && labels.length > 1 && labels.filter((l) => !blank(l) && parseChartDate(String(l)) !== null).length >= labels.length * 0.8;\n\treturn {\n\t\theaderRow,\n\t\tlabelColumn,\n\t\tbyRows,\n\t\tseries: Math.max(0, byRows ? dataRows : dataCols),\n\t\tpoints: Math.max(0, byRows ? dataCols : dataRows),\n\t\tanyNumber,\n\t\tnonNegative,\n\t\tmixedSigns: anyNegative && anyPositive,\n\t\tdates\n\t};\n}\n\nexport interface ChartRecommendation {\n\ttype: ChartType;\n\tstacking?: ChartStacking;\n\tlabel: string;\n\t/** Why it suits the data, as a sentence. */\n\treason: string;\n}\n\n/**\n * Chart types that suit the shape of a block of cells, best first. A heuristic from the shape\n * (series count, points per series, text or date categories, negative values), not a copy of\n * any spreadsheet's ranking.\n */\nexport function recommendChartTypes(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartRecommendation[] {\n\tconst shape = analyzeChartTable(rows);\n\tif (!shape.anyNumber || !shape.series) return [];\n\treturn recommendForShape(shape);\n}\n\nexport function recommendForShape(shape: Omit<ChartTableShape, 'headerRow' | 'byRows'> & Partial<ChartTableShape>): ChartRecommendation[] {\n\tconst out: ChartRecommendation[] = [];\n\tconst add = (type: ChartType, label: string, reason: string, stacking?: ChartStacking) => out.push({ type, label, reason, ...(stacking ? { stacking } : {}) });\n\tif (shape.series === 2 && !shape.labelColumn && !shape.byRows) {\n\t\tadd('scatter', 'Scatter', 'Two numeric columns without labels: the first is x, the second y.');\n\t\tadd('line', 'Line', 'Shows the second column in order.');\n\t\tadd('bar', 'Column', 'Compares the values side by side.');\n\t\treturn out;\n\t}\n\tif (shape.series === 1 && !shape.labelColumn && shape.points > 20) {\n\t\tadd('histogram', 'Histogram', 'Many unlabelled values: shows how they are distributed.');\n\t\tadd('box', 'Box plot', 'Summarises the spread: quartiles, median and outliers.');\n\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\treturn out;\n\t}\n\tif (shape.dates) {\n\t\tadd('line', 'Line', 'The categories are dates: a line shows change over time.');\n\t\tadd('area', 'Area', 'Shows change over time with volume.');\n\t\tadd('bar', 'Column', 'Compares each period.');\n\t\tif (shape.series > 1) add('area', 'Stacked area', 'Shows how the parts add up over time.', 'stacked');\n\t\treturn out;\n\t}\n\tif (shape.series === 1) {\n\t\tif (shape.points > 12) {\n\t\t\tadd('line', 'Line', 'One long series: a line shows its shape.');\n\t\t\tadd('bar', 'Column', 'Compares every value.');\n\t\t\tadd('area', 'Area', 'Emphasises the volume under the series.');\n\t\t} else {\n\t\t\tadd('bar', 'Column', 'One short series: columns compare the values.');\n\t\t\tif (shape.mixedSigns) add('waterfall', 'Waterfall', 'Positive and negative values: shows how they add up to a total.');\n\t\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\t\tif (shape.nonNegative && shape.points >= 2) {\n\t\t\t\tadd('pie', 'Pie', 'Shares of a whole (all values are positive).');\n\t\t\t\tadd('donut', 'Donut', 'Shares of a whole with the total in the middle.');\n\t\t\t\tif (shape.points >= 5) add('treemap', 'Treemap', 'Compares many shares by area.');\n\t\t\t\tadd('funnel', 'Funnel', 'Shows stages that narrow down.');\n\t\t\t}\n\t\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\t}\n\t\treturn out;\n\t}\n\tif (shape.points > 12) {\n\t\tadd('line', 'Line', 'Several long series: lines keep them readable.');\n\t\tadd('bar', 'Column', 'Compares the series at each category.');\n\t\tadd('area', 'Area', 'Emphasises volume.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t} else {\n\t\tadd('bar', 'Column', 'Several series: clustered columns compare them per category.');\n\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t\tadd('line', 'Line', 'Shows the series in order.');\n\t\tif (shape.points >= 3 && shape.series <= 6) add('radar', 'Radar', 'Compares several measures across the series.');\n\t}\n\treturn out;\n}\n\nexport interface ChartFromTable {\n\ttype: ChartType;\n\tstacking: ChartStacking;\n\tcategories: string[];\n\tseries: ChartSeries[];\n\tissues: ChartIssue[];\n\tshape: ChartTableShape;\n}\n\n/**\n * Builds chart data from a block of cells (CSV, a clipboard grid or a spreadsheet range) using\n * the spreadsheet conventions of `analyzeChartTable`. `type: 'auto'` (the default) takes the\n * first recommendation. A scatter chart of a block without labels takes the first column as\n * the x values of the others.\n */\nexport function chartFromTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: { type?: ChartType | 'auto' } = {}): ChartFromTable {\n\tconst shape = analyzeChartTable(rows);\n\tconst rec = (options.type ?? 'auto') === 'auto' ? recommendForShape(shape)[0] : undefined;\n\tconst type = rec?.type ?? (options.type === 'auto' || !options.type ? 'bar' : options.type);\n\tconst stacking = rec?.stacking ?? 'none';\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c))).map((r) => [...r]);\n\t// Without a header row, invent one so chartDataFromTable reads every row as data.\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tlet table = grid;\n\tif (!shape.labelColumn) table = table.map((r, i) => [shape.headerRow && i === 0 ? '' : String(i + (shape.headerRow ? 0 : 1)), ...r]);\n\tif (!shape.headerRow) table = [['', ...Array.from({ length: width }, (_, i) => `Series ${i + 1}`)], ...table];\n\tconst xFromFirst = type === 'scatter' && !shape.labelColumn && !shape.byRows && shape.series > 1;\n\tif (xFromFirst) {\n\t\t// The first data column becomes x: move it into the label column.\n\t\ttable = table.map((r) => [r[1], ...r.slice(2)]);\n\t}\n\tconst data = chartDataFromTable(table, { seriesIn: shape.byRows ? 'rows' : 'columns', header: true, xFromFirstColumn: xFromFirst });\n\treturn { type, stacking, categories: data.categories, series: data.series, issues: data.issues, shape };\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartToOoxml } from './ooxml.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { recommendChartTypes } from './recommend.js';\nimport { CATEGORY_REF, CHART_UPDATE_PROPERTIES, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { chartColorsByCategory, chartDataToTable, chartSeriesColor, chartSliceColor } from './spec.js';\nimport { summarizeChart } from './summary.js';\nimport { chartToSvg } from './svg.js';\nimport type { ChartTrendline } from './types.js';\n\nexport interface ChartCommandOptions {\n\t/** Id prefix (default `chart.`); use one per chart when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Chart`). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst check = (result: { ok: boolean; message?: string }) => {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n};\n\n/**\n * Palette and agent commands for a chart: describe, update presentation, replace data, set\n * values, add / remove series, categories and trendlines, apply presets, switch rows and\n * columns, import CSV or Mermaid, export SVG, Mermaid or Office XML, recommend types and\n * check colours. Register them in a `CommandRegistry` and agents get them through\n * `createCommandToolProvider`; `createChartToolProvider` offers the same operations as\n * individual tools. Failures throw sentences, which the registry returns as\n * `{ ok: false, code: 'failed', message }`.\n */\nexport function createChartCommands(controller: ChartController, options: ChartCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'chart.';\n\tconst base = { group: options.group ?? 'Chart', ...(options.scope ? { scope: options.scope } : {}) };\n\tconst seriesIds = () => controller.getSpec().series.map((s) => s.id);\n\tconst resolveSeries = (ref: string) => {\n\t\tconst spec = controller.getSpec();\n\t\tconst series = spec.series.find((s) => s.id === ref) ?? spec.series.find((s) => s.name === ref);\n\t\tif (!series) fail(`There is no series \"${ref}\"; expected one of ${seriesIds().map((id) => `\"${id}\"`).join(', ') || '(none yet)'}.`);\n\t\treturn series!;\n\t};\n\tconst resolveCategory = (ref: string | number) => {\n\t\tconst categories = controller.getSpec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (index < 0 || index >= categories.length || !Number.isInteger(index)) fail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of the labels.`);\n\t\treturn index;\n\t};\n\tconst object = (properties: Record<string, unknown>, required?: string[]) => ({ type: 'object' as const, properties, ...(required ? { required } : {}), additionalProperties: false }) as any;\n\n\treturn [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}describe`,\n\t\t\tlabel: 'Describe Chart',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'data', 'spec', 'get', 'summary'],\n\t\t\tdescription: 'Returns the chart spec, its data as a table (series names in the header row) and a summary: per-series min / max / mean / trend, axes as drawn, layout warnings and a colour check.',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => {\n\t\t\t\tconst spec = controller.getSpec();\n\t\t\t\treturn { spec: controller.toJSON(), table: chartDataToTable(spec), summary: summarizeChart(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 }), issues: controller.getState().issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}update`,\n\t\t\tlabel: 'Change Chart…',\n\t\t\tkeywords: ['chart', 'title', 'axis', 'legend', 'stack', 'style', 'format', 'type'],\n\t\t\tdescription:\n\t\t\t\t'Changes chart presentation as one undo step: type, titles, axes (xAxis = categories, yAxis = values, yAxis2 = secondary values; reverse, and scale \"log\" on value axes), legend, stacking, orientation, curve, points, data labels, palette, donut hole, bar spacing, histogram bins or waterfall total. Invalid values change nothing and return why.',\n\t\t\tparams: object(CHART_UPDATE_PROPERTIES),\n\t\t\trun: (_ctx: unknown, params: ChartSpecPatch) => {\n\t\t\t\tcheck(controller.update(params));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setData`,\n\t\t\tlabel: 'Replace Chart Data…',\n\t\t\tkeywords: ['chart', 'data', 'series', 'categories'],\n\t\t\tdescription: 'Replaces the categories and series as one undo step. Each series has one value per category (padded with gaps).',\n\t\t\tparams: object({\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: { type: 'array', description: 'The new series.', items: object({ id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, ['name', 'values']) }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { categories?: string[]; series?: any[] }) => {\n\t\t\t\tcheck(controller.setData(params));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setValues`,\n\t\t\tlabel: 'Set Chart Values…',\n\t\t\tkeywords: ['chart', 'value', 'cell', 'edit'],\n\t\t\tdescription: 'Sets individual values as one undo step. Series by id or name; category by index or label.',\n\t\t\tparams: object({ cells: { type: 'array', minItems: 1, description: 'Values to set.', items: object({ series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, ['series', 'category', 'value']) } }, ['cells']),\n\t\t\trun: (_ctx: unknown, params: { cells: { series: string; category: string | number; value: unknown }[] }) => {\n\t\t\t\tcheck(controller.setValues(params.cells.map((c) => ({ seriesId: resolveSeries(c.series).id, index: resolveCategory(c.category), value: c.value }))));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addSeries`,\n\t\t\tlabel: 'Add Series',\n\t\t\tkeywords: ['chart', 'series', 'new'],\n\t\t\tdescription: 'Adds a series (default: an empty one at the end). Returns its id.',\n\t\t\tparams: object({ ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } }),\n\t\t\trun: (_ctx: unknown, params: { at?: number; name?: string; values?: unknown[] } = {}) => {\n\t\t\t\tconst { at, ...input } = params ?? {};\n\t\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\t\tconst result = controller.addSeries(clean as any, { at });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { id: (result as { id: string }).id };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}updateSeries`,\n\t\t\tlabel: 'Change Series…',\n\t\t\tkeywords: ['chart', 'series', 'rename', 'colour', 'color', 'hide', 'axis', 'marker'],\n\t\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn, including error bars (null resets a field).',\n\t\t\tparams: object({ series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & Record<string, unknown>) => {\n\t\t\t\tconst { series, ...patch } = params;\n\t\t\t\tconst id = resolveSeries(series).id;\n\t\t\t\tcheck(controller.updateSeries(id, patch as any));\n\t\t\t\treturn { series: controller.getSeries(id) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeSeries`,\n\t\t\tlabel: 'Delete Series',\n\t\t\tkeywords: ['chart', 'series', 'remove'],\n\t\t\tdescription: 'Deletes a series by id or name.',\n\t\t\tparams: object({ series: SERIES_REF }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string }) => {\n\t\t\t\tcheck(controller.removeSeries(resolveSeries(params.series).id));\n\t\t\t\treturn { series: seriesIds() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addCategory`,\n\t\t\tlabel: 'Add Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'label'],\n\t\t\tdescription: 'Inserts a category (gaps in every series) at `at` (default: the end).',\n\t\t\tparams: object({ label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } }),\n\t\t\trun: (_ctx: unknown, params: { label?: string; at?: number } = {}) => controller.addCategory(params?.label, { at: params?.at })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeCategory`,\n\t\t\tlabel: 'Delete Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'remove'],\n\t\t\tdescription: 'Deletes a category (and its values) by index or label.',\n\t\t\tparams: object({ category: CATEGORY_REF }, ['category']),\n\t\t\trun: (_ctx: unknown, params: { category: string | number }) => {\n\t\t\t\tcheck(controller.removeCategory(resolveCategory(params.category)));\n\t\t\t\treturn { categories: controller.getSpec().categories };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addTrendline`,\n\t\t\tlabel: 'Add Trendline…',\n\t\t\tkeywords: ['chart', 'trend', 'regression', 'fit', 'forecast', 'moving average'],\n\t\t\tdescription: 'Fits a trendline to a series (linear, exponential, logarithmic, power, polynomial or moving average). Returns its index and the fit.',\n\t\t\tparams: object({ series: SERIES_REF, ...TRENDLINE_PROPS }, ['series', 'type']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & ChartTrendline) => {\n\t\t\t\tconst { series, ...line } = params;\n\t\t\t\tconst result = controller.addTrendline(resolveSeries(series).id, line);\n\t\t\t\tcheck(result);\n\t\t\t\tconst ok = result as { index: number; fit: { coefficients: number[]; r2: number | null; equation: string } | null };\n\t\t\t\treturn { index: ok.index, ...(ok.fit ? { coefficients: ok.fit.coefficients, r2: ok.fit.r2, equation: ok.fit.equation } : {}) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeTrendline`,\n\t\t\tlabel: 'Delete Trendline',\n\t\t\tkeywords: ['chart', 'trend', 'remove'],\n\t\t\tdescription: 'Deletes a trendline from a series.',\n\t\t\tparams: object({ series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index (0 = first).' } }, ['series', 'index']),\n\t\t\trun: (_ctx: unknown, params: { series: string; index: number }) => {\n\t\t\t\tcheck(controller.removeTrendline(resolveSeries(params.series).id, params.index));\n\t\t\t\treturn { trendlines: controller.getSeries(resolveSeries(params.series).id)?.trendlines ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}applyPreset`,\n\t\t\tlabel: 'Apply Chart Style…',\n\t\t\tkeywords: ['chart', 'quick layout', 'style', 'colours', 'colors', 'monochrome', 'theme'],\n\t\t\tdescription: 'Applies a quick layout and / or colour scheme as one undo step.',\n\t\t\tparams: object({\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { layout?: string; colors?: string } = {}) => {\n\t\t\t\tcheck(controller.applyPreset(params ?? {}));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}transpose`,\n\t\t\tlabel: 'Switch Rows and Columns',\n\t\t\tkeywords: ['chart', 'transpose', 'swap', 'rows', 'columns', 'series'],\n\t\t\tdescription: 'Swaps series and categories as one undo step.',\n\t\t\trun: () => {\n\t\t\t\tcheck(controller.transpose());\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importCsv`,\n\t\t\tlabel: 'Import Chart Data from CSV…',\n\t\t\tkeywords: ['chart', 'csv', 'tsv', 'paste', 'import'],\n\t\t\tdescription: 'Replaces the data with CSV / TSV text: by default the first column holds categories and the first row series names.',\n\t\t\tparams: object(\n\t\t\t\t{\n\t\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text.' },\n\t\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows.' },\n\t\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names (default true).' }\n\t\t\t\t},\n\t\t\t\t['csv']\n\t\t\t),\n\t\t\trun: (_ctx: unknown, params: { csv: string; seriesIn?: 'columns' | 'rows'; header?: boolean | 'auto' }) => {\n\t\t\t\tconst result = controller.importCsv(params.csv, { seriesIn: params.seriesIn, header: params.header });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()), issues: result.issues ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importMermaid`,\n\t\t\tlabel: 'Import Mermaid Chart…',\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'xychart', 'pie', 'radar', 'import'],\n\t\t\tdescription: 'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text (one undo step). Unreadable lines are listed with line numbers.',\n\t\t\tparams: object({ mermaid: { type: 'string', description: 'Mermaid text.' } }, ['mermaid']),\n\t\t\trun: (_ctx: unknown, params: { mermaid: string }) => {\n\t\t\t\tconst read = chartFromMermaid(params.mermaid);\n\t\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\t\tcheck(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportMermaid`,\n\t\t\tlabel: 'Copy Chart as Mermaid',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'export'],\n\t\t\tdescription: 'Returns the chart as Mermaid text (with a round-trip comment unless meta is false).',\n\t\t\tparams: object({ meta: { type: 'boolean', description: 'Include the %% @pixerate round-trip comment (default true).' } }),\n\t\t\trun: (_ctx: unknown, params: { meta?: boolean } = {}) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta: params?.meta }) })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportOoxml`,\n\t\t\tlabel: 'Export Chart as Office XML',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'office', 'word', 'powerpoint', 'docx', 'pptx', 'xml', 'export'],\n\t\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) and what could not be written.',\n\t\t\trun: () => chartToOoxml(controller.toJSON())\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportSvg`,\n\t\t\tlabel: 'Export Chart as SVG',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'svg', 'export', 'image'],\n\t\t\tdescription: 'Returns the chart drawn as a standalone, accessible SVG string (with <title> and <desc>).',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => ({\n\t\t\t\tsvg: chartToSvg(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 })\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}recommend`,\n\t\t\tlabel: 'Recommend Chart Types',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'recommend', 'suggest', 'type'],\n\t\t\tdescription: 'Suggests chart types for the current data (or CSV), best first, each with a reason.',\n\t\t\tparams: object({ csv: { type: 'string', description: 'CSV text to analyse instead of the current data.' } }),\n\t\t\trun: (_ctx: unknown, params: { csv?: string } = {}) => ({\n\t\t\t\trecommendations: recommendChartTypes(params?.csv !== undefined ? parseCsv(params.csv) : chartDataToTable(controller.getSpec()))\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}checkColors`,\n\t\t\tlabel: 'Check Chart Colours',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'colour', 'color', 'accessibility', 'colour-blind', 'contrast'],\n\t\t\tdescription: 'Checks that the series colours can be told apart (including with colour-blindness) and stand out from the background.',\n\t\t\trun: () => {\n\t\t\t\tconst s = controller.getSpec();\n\t\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\t\tconst colors = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\t\treturn { colors, ...checkChartColors(colors) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Chart Edit',\n\t\t\tkeywords: ['chart', 'undo'],\n\t\t\tenabled: () => controller.getState().canUndo || 'Nothing to undo',\n\t\t\trun: () => ({ undone: controller.undo() })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Chart Edit',\n\t\t\tkeywords: ['chart', 'redo'],\n\t\t\tenabled: () => controller.getState().canRedo || 'Nothing to redo',\n\t\t\trun: () => ({ redone: controller.redo() })\n\t\t}\n\t];\n}\n","// Drag behaviour follows effectcraft-main/crates/ui-egui/src/panels/graph.rs and graph_tools.rs (the value axis\n// is frozen while a key is dragged, Shift locks to the axis that moved most, `snap_px` picks the nearest\n// candidate within a few screen pixels) and lightcraft-main's curve tests (Alt moves a tenth as far)\n// (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { ChartController } from './controller.js';\nimport { chartValueAtPoint, chartXAtPoint, snapChartValue } from './layout.js';\nimport { chartScaleToPixel } from './scale.js';\nimport { chartFamily } from './spec.js';\nimport type { ChartScene, ChartSelection, ChartValueScale } from './types.js';\n\n/** Scene coordinates of a pointer, given the rendered element's box (the scene is scaled to fit it). */\nexport function chartClientToScene(scene: Pick<ChartScene, 'width' | 'height'>, box: { left: number; top: number; width: number; height: number }, clientX: number, clientY: number): { x: number; y: number } {\n\tconst sx = box.width ? scene.width / box.width : 1;\n\tconst sy = box.height ? scene.height / box.height : 1;\n\treturn { x: (clientX - box.left) * sx, y: (clientY - box.top) * sy };\n}\n\n/**\n * Whether a point can be dragged to a new value in this scene: bar, line, area and scatter\n * charts (not percent-stacked), scatter and bubble charts with x values (x and y), and\n * waterfall steps. Hidden series and gaps cannot be dragged.\n */\nexport function canDragChartPoint(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined): target is Extract<ChartSelection, { kind: 'point' }> {\n\tif (target?.kind !== 'point' || !scene.valueScale || scene.percent) return false;\n\tconst spec = controller.getSpec();\n\tconst family = chartFamily(spec);\n\tif (family !== 'cartesian' && family !== 'xy' && family !== 'waterfall') return false;\n\tconst series = controller.getSeries(target.seriesId);\n\treturn !!series && !series.hidden && series.values[target.index] !== null;\n}\n\nexport interface ChartDragMoveOptions {\n\t/** Move a tenth as far as the pointer (fine adjustment; Alt). */\n\tfine?: boolean;\n\t/** Only change the axis the pointer has moved along most (scatter charts; Shift). */\n\tlockAxis?: boolean;\n\t/** Skip snapping to nearby values and ticks (e.g. while Ctrl / Cmd is held). */\n\tnoSnap?: boolean;\n}\n\nexport interface ChartPointDrag {\n\t/**\n\t * The value axis range when the drag started. Pass it to `layoutChart` (`valueDomain`)\n\t * until `end()` so the axis does not rescale under the pointer.\n\t */\n\treadonly valueDomain: { min: number; max: number };\n\t/** The secondary value axis range when the drag started (`layoutChart`'s `valueDomain2`). */\n\treadonly valueDomain2?: { min: number; max: number };\n\t/** The numeric x range of a scatter or bubble chart when the drag started (`xDomain`). */\n\treadonly xDomain?: { min: number; max: number };\n\t/** The point being dragged, for `layoutChart`'s `readout`. */\n\treadonly target: { seriesId: string; index: number };\n\t/** Moves the value with the pointer (scene coordinates). */\n\tmove(point: { x: number; y: number }, options?: ChartDragMoveOptions): void;\n\t/** Ends the drag (one undo step for the whole drag). */\n\tend(): void;\n\t/** Cancels the drag: the value goes back and no undo step is left (Escape). */\n\tcancel(): void;\n}\n\nexport interface ChartSnapOptions {\n\t/** Values to snap to when the pointer is within `tolerancePx` of them. */\n\tcandidates?: readonly number[];\n\t/** Screen distance that snaps (default 6). */\n\ttolerancePx?: number;\n\t/** Fallback step when no candidate is close (default: a tenth of the tick step). */\n\tstep?: number;\n\t/** The scale the value is on (default: the scene's value scale). */\n\tscale?: ChartValueScale;\n}\n\n/**\n * Snaps a dragged value: to the nearest candidate (other series at the same category, the\n * neighbouring values, zero, the start value, ticks) within `tolerancePx` screen pixels, or\n * else to a tenth of the tick step.\n */\nexport function snapChartDragValue(scene: ChartScene, value: number, options: ChartSnapOptions = {}): number {\n\tconst scale = options.scale ?? scene.valueScale;\n\tconst tolerance = options.tolerancePx ?? 6;\n\tif (scale) {\n\t\tconst px = (v: number) => chartScaleToPixel(v, scale);\n\t\tconst at = px(value);\n\t\tlet best: number | null = null;\n\t\tlet bestDist = tolerance;\n\t\tfor (const c of [...(options.candidates ?? []), ...scale.ticks]) {\n\t\t\tif (!Number.isFinite(c)) continue;\n\t\t\tconst d = Math.abs(px(c) - at);\n\t\t\tif (!Number.isFinite(d)) continue;\n\t\t\tif (d <= bestDist) {\n\t\t\t\tbest = c;\n\t\t\t\tbestDist = d;\n\t\t\t}\n\t\t}\n\t\tif (best !== null) return best;\n\t}\n\treturn snapChartValue(scene, value, options.step, scale?.ticks, scale?.logBase);\n}\n\n/**\n * Starts dragging a bar or point: the value follows the pointer along its value axis (and\n * along x on scatter and bubble charts), snapped to nearby values and then to a tenth of the\n * tick step (`step` overrides), and the whole drag is one undo step. Works for stacked bars\n * too (the drag changes the segment by the distance moved). Returns `null` when the target\n * cannot be dragged.\n */\nexport function startChartPointDrag(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined, start: { x: number; y: number }, options: { step?: number; tolerancePx?: number } = {}): ChartPointDrag | null {\n\tif (!canDragChartPoint(controller, scene, target)) return null;\n\tconst { seriesId, index } = target;\n\tconst spec = controller.getSpec();\n\tconst series = controller.getSeries(seriesId)!;\n\tconst secondary = series.axis === 'secondary' && !!scene.valueScale2;\n\tconst scale = secondary ? scene.valueScale2! : scene.valueScale!;\n\tconst xy = chartFamily(spec) === 'xy' && !!scene.xScale;\n\tconst startValue = series.values[index] ?? 0;\n\tconst startX = series.x?.[index] ?? null;\n\tconst startAt = chartValueAtPoint(scene, start, secondary);\n\tconst startAtX = xy ? chartXAtPoint(scene, start) : undefined;\n\tif (startAt === undefined) return null;\n\t// Nearby values worth snapping to: zero, where the drag started, other series at this\n\t// category and this series' neighbours.\n\tconst candidates = [0, startValue];\n\tif (!xy) {\n\t\tfor (const s of spec.series) if (s.id !== seriesId && !s.hidden && (s.axis === 'secondary') === secondary) candidates.push(s.values[index] ?? NaN);\n\t\tcandidates.push(series.values[index - 1] ?? NaN, series.values[index + 1] ?? NaN);\n\t}\n\tcontroller.beginGesture(`drag:${seriesId}:${index}`);\n\tlet ended = false;\n\tconst [min, max] = scene.valueScale!.domain;\n\tconst label = `Drag ${series.name}`;\n\treturn {\n\t\tvalueDomain: { min, max },\n\t\t...(scene.valueScale2 ? { valueDomain2: { min: scene.valueScale2.domain[0], max: scene.valueScale2.domain[1] } } : {}),\n\t\t...(xy ? { xDomain: { min: scene.xScale!.domain[0], max: scene.xScale!.domain[1] } } : {}),\n\t\ttarget: { seriesId, index },\n\t\tmove(point, moveOptions = {}) {\n\t\t\tif (ended) return;\n\t\t\tconst at = chartValueAtPoint(scene, point, secondary);\n\t\t\tif (at === undefined) return;\n\t\t\tconst factor = moveOptions.fine ? 0.1 : 1;\n\t\t\t// Linear axes move by the distance the pointer moved; log axes by the ratio, so the\n\t\t\t// point stays under the pointer.\n\t\t\tconst moved = (from: number, to: number, s: ChartValueScale, value: number) =>\n\t\t\t\ts.logBase && value > 0 && from > 0 && to > 0 ? value * Math.pow(to / from, factor) : value + (to - from) * factor;\n\t\t\tlet moveY = true;\n\t\t\tlet moveX = false;\n\t\t\tlet atX: number | undefined;\n\t\t\tif (xy && startX !== null && startAtX !== undefined) {\n\t\t\t\tatX = chartXAtPoint(scene, point);\n\t\t\t\tmoveX = atX !== undefined;\n\t\t\t\tif (moveOptions.lockAxis) {\n\t\t\t\t\t// Keep the axis the pointer moved further along (in pixels).\n\t\t\t\t\tif (Math.abs(point.x - start.x) >= Math.abs(point.y - start.y)) moveY = false;\n\t\t\t\t\telse moveX = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst snap = (v: number, s: ChartValueScale, c: readonly number[]) => {\n\t\t\t\tif (moveOptions.noSnap) return Number(v.toPrecision(12));\n\t\t\t\tif (moveOptions.fine) {\n\t\t\t\t\tif (s.logBase && !options.step) return v > 0 ? Number(v.toPrecision(3)) : v;\n\t\t\t\t\tconst unit = options.step ? options.step / 10 : s.ticks.length > 1 ? (s.ticks[1] - s.ticks[0]) / 100 : undefined;\n\t\t\t\t\treturn snapChartValue(scene, v, unit, s.ticks);\n\t\t\t\t}\n\t\t\t\treturn snapChartDragValue(scene, v, { candidates: c, tolerancePx: options.tolerancePx, step: options.step, scale: s });\n\t\t\t};\n\t\t\tconst y = moveY ? snap(moved(startAt, at, scale, startValue), scale, candidates) : startValue;\n\t\t\tif (xy && startX !== null) {\n\t\t\t\tconst nextX = moveX ? moved(startAtX!, atX!, scene.xScale!, startX) : startX;\n\t\t\t\tconst x = nextX !== startX ? snap(nextX, scene.xScale!, [0, startX]) : startX;\n\t\t\t\tconst xs = [...(series.x ?? [])];\n\t\t\t\txs[index] = x;\n\t\t\t\tcontroller.setValue(seriesId, index, y, { label });\n\t\t\t\tif (x !== controller.getSeries(seriesId)?.x?.[index]) controller.updateSeries(seriesId, { x: xs });\n\t\t\t} else controller.setValue(seriesId, index, y, { label });\n\t\t},\n\t\tend() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.endGesture();\n\t\t},\n\t\tcancel() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.cancelGesture();\n\t\t}\n\t};\n}\n\nexport interface ChartKeyInput {\n\tkey: string;\n\tshiftKey?: boolean;\n\taltKey?: boolean;\n\tmetaKey?: boolean;\n\tctrlKey?: boolean;\n}\n\n/**\n * Keyboard editing on a focused chart: arrows move a point selection between categories\n * (← →) and change its value (↑ ↓, a tenth of the tick step; Shift: a whole step; Alt: a\n * hundredth), Delete / Backspace deletes the selection, Escape cancels a drag or clears the\n * selection. Returns `true` when the key was used (call `preventDefault`).\n */\nexport function handleChartKey(controller: ChartController, scene: ChartScene | null, event: ChartKeyInput): boolean {\n\tif (event.metaKey || event.ctrlKey) return false;\n\tconst { selection, spec, gesture } = controller.getState();\n\tswitch (event.key) {\n\t\tcase 'Escape':\n\t\t\tif (gesture) {\n\t\t\t\tcontroller.cancelGesture();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!selection) return false;\n\t\t\tcontroller.select(null);\n\t\t\treturn true;\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (event.altKey || !selection || selection.kind === 'chart') return false;\n\t\t\tcontroller.deleteSelection();\n\t\t\treturn true;\n\t\tcase 'ArrowLeft':\n\t\tcase 'ArrowRight': {\n\t\t\tif (event.altKey || (selection?.kind !== 'point' && selection?.kind !== 'category')) return false;\n\t\t\tconst n = spec.categories.length;\n\t\t\tconst index = Math.max(0, Math.min(n - 1, selection.index + (event.key === 'ArrowRight' ? 1 : -1)));\n\t\t\tcontroller.select({ ...selection, index });\n\t\t\treturn true;\n\t\t}\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowDown': {\n\t\t\tif (selection?.kind !== 'point' || scene?.percent) return false;\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst secondary = series?.axis === 'secondary';\n\t\t\tconst scale = (secondary ? scene?.valueScale2 : null) ?? scene?.valueScale;\n\t\t\tconst ticks = scale?.ticks ?? [];\n\t\t\tconst up = event.key === 'ArrowUp';\n\t\t\tconst current = series?.values[selection.index] ?? null;\n\t\t\tif (scale?.logBase && current !== null && current > 0) {\n\t\t\t\t// Log axes step by ratios: a tenth of a power of the base (Shift: a whole power; Alt: a hundredth).\n\t\t\t\tconst power = event.shiftKey ? 1 : event.altKey ? 0.01 : 0.1;\n\t\t\t\tconst next = Number((current * Math.pow(scale.logBase, up ? power : -power)).toPrecision(event.altKey ? 4 : 3));\n\t\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, next - current);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst step = ticks.length > 1 ? ticks[1] - ticks[0] : 1;\n\t\t\tconst amount = event.shiftKey ? step : event.altKey ? step / 100 : step / 10;\n\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, amount * (up ? 1 : -1));\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A short description of the selection for an inspector heading or a screen reader. */\nexport function describeChartSelection(controller: ChartController, selection: ChartSelection | null = controller.getState().selection): string {\n\tif (!selection) return 'Nothing selected';\n\tconst spec = controller.getSpec();\n\tswitch (selection.kind) {\n\t\tcase 'chart':\n\t\t\treturn 'Chart';\n\t\tcase 'title':\n\t\t\treturn 'Title';\n\t\tcase 'subtitle':\n\t\t\treturn 'Subtitle';\n\t\tcase 'legend':\n\t\t\treturn 'Legend';\n\t\tcase 'axis':\n\t\t\treturn selection.axis === 'x' ? (chartFamily(spec) === 'xy' ? 'X axis' : 'Category axis') : selection.axis === 'y' ? 'Value axis' : 'Secondary value axis';\n\t\tcase 'series':\n\t\t\treturn `Series \"${controller.getSeries(selection.seriesId)?.name ?? selection.seriesId}\"`;\n\t\tcase 'category':\n\t\t\treturn `Category \"${spec.categories[selection.index] ?? selection.index}\"`;\n\t\tcase 'trendline': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst line = series?.trendlines?.[selection.index];\n\t\t\treturn `${line ? line.type.replace('-', ' ') : 'Trendline'} trendline on \"${series?.name ?? selection.seriesId}\"`;\n\t\t}\n\t\tcase 'point': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst value = series?.values[selection.index];\n\t\t\tconst x = series?.x?.[selection.index];\n\t\t\tif (x !== undefined && x !== null && chartFamily(spec) === 'xy') return `${series?.name ?? selection.seriesId}: (${x}, ${value ?? 'blank'})`;\n\t\t\treturn `${series?.name ?? selection.seriesId} · ${spec.categories[selection.index] ?? selection.index}: ${value ?? 'blank'}`;\n\t\t}\n\t}\n}\n\n/**\n * The mark under a scene point (topmost first), for hosts without DOM events and for agents\n * that drive the pointer: rects, circles, lines (within 4 px) and text boxes. Returns the\n * mark's `target`, or `{ kind: 'chart' }` over the background, or `null` outside.\n */\nexport function chartHitTest(scene: ChartScene, point: { x: number; y: number }, measure: (text: string, size: number, weight?: number) => number = (t, s, w = 400) => t.length * s * (w >= 600 ? 0.6 : 0.56)): ChartSelection | null {\n\tfor (let i = scene.marks.length - 1; i >= 0; i--) {\n\t\tconst m = scene.marks[i];\n\t\tif (!m.target || m.role === 'selection' || m.role === 'background') continue;\n\t\tlet hit = false;\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect':\n\t\t\t\thit = point.x >= m.x && point.x <= m.x + m.width && point.y >= m.y && point.y <= m.y + m.height;\n\t\t\t\tbreak;\n\t\t\tcase 'circle':\n\t\t\t\thit = Math.hypot(point.x - m.cx, point.y - m.cy) <= Math.max(m.r, 4) + 2;\n\t\t\t\tbreak;\n\t\t\tcase 'line': {\n\t\t\t\tconst dx = m.x2 - m.x1;\n\t\t\t\tconst dy = m.y2 - m.y1;\n\t\t\t\tconst len2 = dx * dx + dy * dy;\n\t\t\t\tconst t = len2 ? Math.max(0, Math.min(1, ((point.x - m.x1) * dx + (point.y - m.y1) * dy) / len2)) : 0;\n\t\t\t\thit = Math.hypot(point.x - (m.x1 + t * dx), point.y - (m.y1 + t * dy)) <= 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tif (m.rotate) break;\n\t\t\t\tconst w = measure(m.text, m.size, m.weight);\n\t\t\t\tconst x0 = m.anchor === 'start' ? m.x : m.anchor === 'end' ? m.x - w : m.x - w / 2;\n\t\t\t\tconst y0 = m.baseline === 'top' ? m.y : m.baseline === 'bottom' ? m.y - m.size : m.y - m.size / 2;\n\t\t\t\thit = point.x >= x0 - 2 && point.x <= x0 + w + 2 && point.y >= y0 - 2 && point.y <= y0 + m.size + 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (hit) return m.target;\n\t}\n\treturn point.x >= 0 && point.y >= 0 && point.x <= scene.width && point.y <= scene.height ? { kind: 'chart' } : null;\n}\n","// The render-preview, pointer-gesture and key tools follow the conventions of the craft apps' MCP servers\n// (vectorcraft-main/crates/mcp/src/tools.rs `render_preview`, lightcraft-main `pointer_gesture`,\n// designcraft-main `key`) (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSeriesPatch, ChartSpecPatch } from './controller.js';\nimport { chartHitTest, handleChartKey, startChartPointDrag } from './interaction.js';\nimport { layoutChart } from './layout.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartFromOoxml, chartToOoxml } from './ooxml.js';\nimport type { ChartDirector, ChartDirectorActor } from './presence.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { chartFromTable, recommendChartTypes } from './recommend.js';\nimport {\n\tparseChartValue,\n\tCHART_AXIS_KINDS,\n\tCHART_CURVES,\n\tCHART_LABEL_POSITIONS,\n\tCHART_LEGEND_POSITIONS,\n\tCHART_MARKERS,\n\tCHART_NUMBER_STYLES,\n\tCHART_ORIENTATIONS,\n\tCHART_SERIES_TYPES,\n\tCHART_STACKINGS,\n\tCHART_TRENDLINE_TYPES,\n\tCHART_TYPES,\n\tchartColorsByCategory,\n\tchartDataToTable,\n\tchartSeriesColor,\n\tchartSliceColor\n} from './spec.js';\nimport { AXIS, CATEGORY_REF, CHART_UPDATE_PROPERTIES, FORMAT, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { describeChart, summarizeChart } from './summary.js';\nimport { chartSceneToSvg } from './svg.js';\nimport type { ChartSelection, ChartTrendline } from './types.js';\n\ntype ParserCtor = { new (): DOMParser };\n\nexport interface ChartToolProviderOptions {\n\t/** Provider id (unique per registry). Default `chart`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/**\n\t * The chart cannot be edited: write tools are hidden and `get_chart` says why. A string\n\t * is the reason (\"The report is locked\").\n\t */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** Size used for summaries, previews and pointer gestures (default 640 × 400). */\n\tsize?: { width: number; height: number };\n\t/** Enables `import_chart_ooxml` (reading Office chart XML needs a DOMParser). Default: the global one, if any. */\n\tDOMParser?: ParserCtor;\n\t/**\n\t * Acts out `set_chart_values` and `select_chart_element` with a visible cursor (see\n\t * `ChartDirector`); each call is still one undo step. Without it, edits apply at once.\n\t */\n\tdirector?: ChartDirector;\n\t/** Who the cursor belongs to (default `{ id: 'agent', name: 'Agent' }`). */\n\tactor?: ChartDirectorActor;\n\t/** Turns SVG into an image so `render_chart` can return PNG (e.g. through a canvas). */\n\trasterize?: (svg: string, size: { width: number; height: number }) => Promise<{ data: string; mimeType: string }> | { data: string; mimeType: string };\n}\n\n/**\n * When to look at the chart, for `render_chart`'s description (after vectorcraft's\n * `render_preview` and Ursula's VIEW_DIAGRAM_INSTRUCTIONS).\n */\nexport const RENDER_CHART_INSTRUCTIONS =\n\t'Draws the chart without changing it so you can check how it looks: SVG text by default, or a PNG image with format \"png\" when the host can rasterize. Returns the layout warnings (hidden or thinned labels, dropped markers) alongside. An image costs tokens, so render after a batch of edits rather than after each one, and use it to check what text cannot tell you: overlapping or cut-off labels, a crowded legend, unreadable colours, whether the chart reads at the given size. For values, ids and warnings alone, get_chart is cheaper.';\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false } as const;\nconst WRITE_IDEMPOTENT = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nfunction resolve<T>(result: { ok: boolean; message?: string } & T): T {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n\treturn result;\n}\n\n/**\n * Agent tools for a chart editor, for a `ToolRegistry`: one tool per operation with strict\n * schemas. Reads (`get_chart`, `render_chart`, `check_chart_colors`, `recommend_chart`,\n * `get_chart_trendline`, `list_chart_presets`, `export_chart_mermaid`, `export_chart_ooxml`)\n * are always there; writes (data, series, categories, presentation, trendlines, presets,\n * imports, selection, pointer and key input, undo / redo) are hidden while the chart is\n * read-only. Every write is one undo step and returns what it changed.\n */\nexport function createChartToolProvider(controller: ChartController, options: ChartToolProviderOptions = {}): AgentToolProvider {\n\tconst size = options.size ?? { width: 640, height: 400 };\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (!r) return null;\n\t\treturn typeof r === 'string' ? r : 'This chart is read-only.';\n\t};\n\tconst spec = () => controller.getSpec();\n\tconst seriesById = (ref: string) => {\n\t\tconst s = spec().series.find((x) => x.id === ref) ?? spec().series.find((x) => x.name === ref);\n\t\tif (!s) fail(`There is no series \"${ref}\"; expected one of ${spec().series.map((x) => `\"${x.id}\" (${x.name})`).join(', ') || '(none yet; add one with add_chart_series)'}.`);\n\t\treturn s!;\n\t};\n\tconst categoryIndex = (ref: string | number) => {\n\t\tconst categories = spec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (!Number.isInteger(index) || index < 0 || index >= categories.length)\n\t\t\tfail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of ${categories.slice(0, 20).map((c) => JSON.stringify(c)).join(', ')}.`);\n\t\treturn index;\n\t};\n\tconst table = () => chartDataToTable(spec());\n\tconst Parser = (): ParserCtor | undefined => options.DOMParser ?? (globalThis as { DOMParser?: ParserCtor }).DOMParser;\n\n\tconst getChart: AgentTool = {\n\t\tname: 'get_chart',\n\t\ttitle: 'Read the chart',\n\t\tdescription:\n\t\t\t'Returns the chart spec (type, titles, axes, legend, series with ids and settings), its data as a table (header row of series names, then one row per category), the current selection, and a summary at the given size: per-series min / max / mean / trend, the axes as drawn, layout warnings (hidden labels, thinned lines), a colour check and a plain-language description. Use the series ids and category indexes it returns with the write tools.',\n\t\tinputSchema: { type: 'object', properties: { width: WIDTH, height: HEIGHT }, additionalProperties: false },\n\t\tannotations: { title: 'Read the chart', ...READ },\n\t\thandler: ({ width = size.width, height = size.height }) => {\n\t\t\tconst reason = readOnlyReason();\n\t\t\treturn {\n\t\t\t\tspec: controller.toJSON(),\n\t\t\t\ttable: table(),\n\t\t\t\tselection: controller.getState().selection,\n\t\t\t\tsummary: summarizeChart(controller.toJSON(), { width, height }),\n\t\t\t\tissues: controller.getState().issues,\n\t\t\t\t...(reason ? { readOnly: reason } : {})\n\t\t\t};\n\t\t}\n\t};\n\n\tconst renderChart: AgentTool = {\n\t\tname: 'render_chart',\n\t\ttitle: 'Render the chart',\n\t\tdescription: RENDER_CHART_INSTRUCTIONS,\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\twidth: WIDTH,\n\t\t\t\theight: HEIGHT,\n\t\t\t\tformat: { type: 'string', enum: ['svg', 'png'], description: 'svg (default): the SVG document as text. png: an image to look at (only when the host can rasterize; costs image tokens).' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Render the chart', ...READ },\n\t\thandler: async ({ width = size.width, height = size.height, format = 'svg' }) => {\n\t\t\tconst json = controller.toJSON();\n\t\t\tconst scene = layoutChart(json, { width, height, selection: null });\n\t\t\tconst svg = chartSceneToSvg(scene, { ariaLabel: json.title || undefined, description: describeChart(json) });\n\t\t\tconst warnings = scene.warnings;\n\t\t\tif (format === 'png') {\n\t\t\t\tif (!options.rasterize) fail('This host cannot rasterize charts; call render_chart with format \"svg\", or get_chart for the layout warnings.');\n\t\t\t\tconst image = await options.rasterize!(svg, { width, height });\n\t\t\t\tconst info = { width, height, mimeType: image.mimeType, warnings };\n\t\t\t\tconst note = warnings.length ? `Layout warnings: ${warnings.map((w) => w.message).join(' ')}` : 'No layout warnings.';\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: 'image', data: image.data, mimeType: image.mimeType },\n\t\t\t\t\t\t{ type: 'text', text: `Chart at ${width} × ${height}. ${note}` }\n\t\t\t\t\t],\n\t\t\t\t\tstructuredContent: info\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { svg, width, height, warnings };\n\t\t}\n\t};\n\n\tconst checkColors: AgentTool = {\n\t\tname: 'check_chart_colors',\n\t\ttitle: 'Check chart colours',\n\t\tdescription:\n\t\t\t'Checks that colours can be told apart with normal vision and with protanopia, deuteranopia and tritanopia (OKLab distance after simulation), and that they stand out from the background. Checks the chart\\'s own series (or slice) colours unless colours are given. Returns the closest pair per vision, contrast ratios and problems as sentences.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcolors: { type: 'array', items: { type: 'string' }, minItems: 1, description: 'Colours to check instead of the chart\\'s (hex or rgb()).' },\n\t\t\t\tsurface: { type: 'string', description: 'Background colour (default white).' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Check chart colours', ...READ },\n\t\thandler: ({ colors, surface }) => {\n\t\t\tconst s = spec();\n\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\tconst own = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\treturn { colors: colors ?? own, ...checkChartColors(colors ?? own, { surface }) };\n\t\t}\n\t};\n\n\tconst recommend: AgentTool = {\n\t\tname: 'recommend_chart',\n\t\ttitle: 'Recommend chart types',\n\t\tdescription:\n\t\t\t'Suggests chart types for data, best first, each with a reason: from CSV text when given, else from the chart\\'s current data. Uses the shape of the data (series count, points, dates, negative values).',\n\t\tinputSchema: { type: 'object', properties: { csv: { type: 'string', description: 'CSV or TSV text to analyse instead of the current data (first row may be series names, first column categories).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Recommend chart types', ...READ },\n\t\thandler: ({ csv }) => {\n\t\t\tconst rows = csv !== undefined ? parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' }) : table();\n\t\t\tconst recommendations = recommendChartTypes(rows);\n\t\t\tif (!recommendations.length) fail('There are no numbers to chart: give CSV with at least one numeric column.');\n\t\t\treturn { recommendations };\n\t\t}\n\t};\n\n\tconst getTrendline: AgentTool = {\n\t\tname: 'get_chart_trendline',\n\t\ttitle: 'Read a trendline fit',\n\t\tdescription: 'Returns a trendline\\'s fitted coefficients (in x for category charts, x = 1, 2, 3, …), R², equation and the number of points, or the moving-average points.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Read a trendline fit', ...READ },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst line = s.trendlines?.[index];\n\t\t\tif (!line) fail(`\"${s.name}\" has no trendline ${index}; it has ${s.trendlines?.length ?? 0}.`);\n\t\t\tif (line!.type === 'moving-average') return { trendline: line, points: controller.trendlineMovingAverage(s.id, index) };\n\t\t\tconst fit = controller.trendlineFit(s.id, index);\n\t\t\tif (!fit) fail(`The ${line!.type} trendline on \"${s.name}\" cannot be fitted: it needs more points (and positive values for log, exponential and power fits).`);\n\t\t\treturn { trendline: line, coefficients: fit!.coefficients, r2: fit!.r2, equation: fit!.equation, points: fit!.points };\n\t\t}\n\t};\n\n\tconst listPresets: AgentTool = {\n\t\tname: 'list_chart_presets',\n\t\ttitle: 'List chart presets',\n\t\tdescription: 'Lists the quick layouts and colour schemes apply_chart_preset accepts, with what each changes.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'List chart presets', ...READ },\n\t\thandler: () => ({\n\t\t\tlayouts: CHART_LAYOUT_PRESETS.map(({ id, label, description }) => ({ id, label, description })),\n\t\t\tcolorSchemes: CHART_COLOR_SCHEMES.map(({ id, label, description, palette }) => ({ id, label, description, palette }))\n\t\t})\n\t};\n\n\tconst exportMermaid: AgentTool = {\n\t\tname: 'export_chart_mermaid',\n\t\ttitle: 'Export chart as Mermaid',\n\t\tdescription:\n\t\t\t'Returns the chart as Mermaid text (xychart-beta, pie or radar-beta) for Markdown or chat. With meta (default true) one \"%% @pixerate {…}\" comment keeps what Mermaid cannot express, so import_chart_mermaid gets the chart back exactly.',\n\t\tinputSchema: { type: 'object', properties: { meta: { type: 'boolean', description: 'Include the round-trip comment (default true).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Mermaid', ...READ },\n\t\thandler: ({ meta = true }) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta }) })\n\t};\n\n\tconst exportOoxml: AgentTool = {\n\t\tname: 'export_chart_ooxml',\n\t\ttitle: 'Export chart as Office XML',\n\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) for Word or PowerPoint files, with what could not be written as sentences.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Office XML', ...READ },\n\t\thandler: () => chartToOoxml(controller.toJSON())\n\t};\n\n\t// ---------------------------------------------------------------- writes\n\n\tconst updateChart: AgentTool = {\n\t\tname: 'update_chart',\n\t\ttitle: 'Change chart presentation',\n\t\tdescription:\n\t\t\t'Changes how the chart looks, as one undo step: type, titles, axes (xAxis = categories or numeric x, yAxis = values, yAxis2 = secondary values; each can be reversed, and value axes can be logarithmic with scale \"log\"), legend, stacking, orientation, curve, points, data labels and their position, palette, donut hole, bar spacing, histogram bins, waterfall total. All-or-nothing: invalid values change nothing and come back as sentences. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: CHART_UPDATE_PROPERTIES,\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change chart presentation', ...WRITE_IDEMPOTENT },\n\t\thandler: (args) => {\n\t\t\tif (!Object.keys(args).length) fail('Nothing to change: pass at least one field, e.g. {\"type\": \"line\"}.');\n\t\t\tresolve(controller.update(args as ChartSpecPatch));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst setData: AgentTool = {\n\t\tname: 'set_chart_data',\n\t\ttitle: 'Replace chart data',\n\t\tdescription: 'Replaces the categories and / or the series as one undo step. Each series has one value per category (padded with gaps). Returns the data table and the series ids.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tdescription: 'The new series (replaces all).',\n\t\t\t\t\titems: { type: 'object', properties: { id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, required: ['name', 'values'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Replace chart data', ...DESTRUCTIVE },\n\t\thandler: (args) => {\n\t\t\tif (!args.categories && !args.series) fail('Pass categories, series or both.');\n\t\t\tresolve(controller.setData(args as any));\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst setValues: AgentTool = {\n\t\tname: 'set_chart_values',\n\t\ttitle: 'Set chart values',\n\t\tdescription: 'Sets individual values as one undo step (all-or-nothing). Series by id or name, category by index or label. Returns the values as stored.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcells: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tminItems: 1,\n\t\t\t\t\tdescription: 'Values to set.',\n\t\t\t\t\titems: { type: 'object', properties: { series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, required: ['series', 'category', 'value'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\trequired: ['cells'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Set chart values', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ cells }) => {\n\t\t\tconst resolved = (cells as { series: string; category: string | number; value: unknown }[]).map((c) => ({ seriesId: seriesById(c.series).id, index: categoryIndex(c.category), value: c.value }));\n\t\t\tconst parsed = resolved.map((c) => parseChartValue(c.value));\n\t\t\tconst bad = resolved.find((_, i) => parsed[i] === undefined);\n\t\t\tif (bad) fail(`\"${String(bad.value)}\" is not a number; pass a number, numeric text or null for a gap. Nothing was changed.`);\n\t\t\tif (options.director && parsed.every((v) => typeof v === 'number')) {\n\t\t\t\tconst results = await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, resolved.map((c, i) => ({ kind: 'setValue' as const, seriesId: c.seriesId, index: c.index, value: parsed[i] as number })));\n\t\t\t\tconst failed = results.find((r) => !r.ok);\n\t\t\t\tif (failed && !failed.ok) fail(failed.message);\n\t\t\t} else resolve(controller.setValues(resolved));\n\t\t\treturn { cells: resolved.map((c) => ({ series: c.seriesId, category: spec().categories[c.index], index: c.index, value: controller.getSeries(c.seriesId)!.values[c.index] })) };\n\t\t}\n\t};\n\n\tconst addSeries: AgentTool = {\n\t\tname: 'add_chart_series',\n\t\ttitle: 'Add a series',\n\t\tdescription: 'Adds a series (values padded to the categories) and selects it. Returns its id and stored values.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default: series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } },\n\t\t\trequired: ['name'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a series', ...WRITE },\n\t\thandler: ({ at, ...input }) => {\n\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\tconst result = resolve(controller.addSeries(clean as any, { at })) as { id: string };\n\t\t\tconst s = controller.getSeries(result.id)!;\n\t\t\treturn { id: s.id, name: s.name, values: s.values };\n\t\t}\n\t};\n\n\tconst updateSeries: AgentTool = {\n\t\tname: 'update_chart_series',\n\t\ttitle: 'Change a series',\n\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn (marker, curve, labels, format, x values, bubble sizes, point colours, error bars). null resets a field. Values change with set_chart_values. Returns the series.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) },\n\t\t\trequired: ['series'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change a series', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ series, ...patch }) => {\n\t\t\tconst id = seriesById(series).id;\n\t\t\tif (!Object.keys(patch).length) fail('Nothing to change: pass a field such as {\"color\": \"#e8710a\"} or {\"axis\": \"secondary\"}.');\n\t\t\tresolve(controller.updateSeries(id, patch as ChartSeriesPatch));\n\t\t\treturn { series: controller.getSeries(id) };\n\t\t}\n\t};\n\n\tconst removeSeries: AgentTool = {\n\t\tname: 'remove_chart_series',\n\t\ttitle: 'Delete a series',\n\t\tdescription: 'Deletes a series and its values. Returns the remaining series ids.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF }, required: ['series'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a series', ...DESTRUCTIVE },\n\t\thandler: ({ series }) => {\n\t\t\tresolve(controller.removeSeries(seriesById(series).id));\n\t\t\treturn { series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst addCategory: AgentTool = {\n\t\tname: 'add_chart_category',\n\t\ttitle: 'Add a category',\n\t\tdescription: 'Inserts a category (a gap in every series) and returns its index.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } },\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a category', ...WRITE },\n\t\thandler: ({ label, at }) => {\n\t\t\tconst result = controller.addCategory(label, { at });\n\t\t\treturn { index: result.index, categories: spec().categories };\n\t\t}\n\t};\n\n\tconst removeCategory: AgentTool = {\n\t\tname: 'remove_chart_category',\n\t\ttitle: 'Delete a category',\n\t\tdescription: 'Deletes a category and its value in every series. Returns the remaining categories.',\n\t\tinputSchema: { type: 'object', properties: { category: CATEGORY_REF }, required: ['category'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a category', ...DESTRUCTIVE },\n\t\thandler: ({ category }) => {\n\t\t\tresolve(controller.removeCategory(categoryIndex(category)));\n\t\t\treturn { categories: spec().categories };\n\t\t}\n\t};\n\n\tconst importCsv: AgentTool = {\n\t\tname: 'import_chart_csv',\n\t\ttitle: 'Import chart data from CSV',\n\t\tdescription:\n\t\t\t'Replaces the data with CSV or TSV text as one undo step. By default the first row holds series names and the first column categories (detected when \"auto\"). chartType \"auto\" also picks the recommended chart type (two unlabelled numeric columns become a scatter of x against y). Returns the data table, the chart type and cells that were not numbers.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text (tabs are detected).' },\n\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows. Ignored with chartType \"auto\".' },\n\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names: true (default), false or \"auto\". Ignored with chartType \"auto\".' },\n\t\t\t\tchartType: { type: 'string', enum: ['keep', 'auto'], description: '\"keep\" (default) keeps the chart type; \"auto\" reads the table shape and picks a type.' }\n\t\t\t},\n\t\t\trequired: ['csv'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Import chart data from CSV', ...DESTRUCTIVE },\n\t\thandler: ({ csv, seriesIn, header, chartType = 'keep' }) => {\n\t\t\tif (chartType === 'auto') {\n\t\t\t\tconst rows = parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' });\n\t\t\t\tconst built = chartFromTable(rows);\n\t\t\t\tif (!built.series.length || !built.categories.length) fail('There is no data to import: expected at least one row of numbers.');\n\t\t\t\tresolve(controller.update({ type: built.type, stacking: built.stacking, categories: built.categories, series: built.series }, { label: 'Import data' }));\n\t\t\t\treturn { type: built.type, table: table(), issues: built.issues };\n\t\t\t}\n\t\t\tconst result = resolve(controller.importCsv(csv, { seriesIn, header })) as { issues?: unknown[] };\n\t\t\treturn { type: spec().type, table: table(), issues: result.issues ?? [] };\n\t\t}\n\t};\n\n\tconst importMermaid: AgentTool = {\n\t\tname: 'import_chart_mermaid',\n\t\ttitle: 'Import a Mermaid chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text as one undo step (a \"%% @pixerate\" comment from export_chart_mermaid restores everything else). Lines that cannot be read are skipped and listed with their line numbers. Returns the spec.',\n\t\tinputSchema: { type: 'object', properties: { mermaid: { type: 'string', description: 'Mermaid text, optionally inside a ```mermaid fence.' } }, required: ['mermaid'], additionalProperties: false },\n\t\tannotations: { title: 'Import a Mermaid chart', ...DESTRUCTIVE },\n\t\thandler: ({ mermaid }) => {\n\t\t\tconst fenced = /```(?:mermaid)?\\s*\\n([\\s\\S]*?)```/.exec(mermaid);\n\t\t\tconst read = chartFromMermaid(fenced ? fenced[1] : mermaid);\n\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t}\n\t};\n\n\tconst importOoxml: AgentTool = {\n\t\tname: 'import_chart_ooxml',\n\t\ttitle: 'Import an Office chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with an Office chart part (DrawingML c:chartSpace, or chartex for waterfall, funnel, treemap, histogram and box charts) as one undo step. Returns the spec, problems, and the features the editor cannot hold.',\n\t\tinputSchema: { type: 'object', properties: { xml: { type: 'string', description: 'The chart part XML, e.g. word/charts/chart1.xml.' } }, required: ['xml'], additionalProperties: false },\n\t\tannotations: { title: 'Import an Office chart', ...DESTRUCTIVE },\n\t\thandler: ({ xml }) => {\n\t\t\tconst read = chartFromOoxml(xml, { DOMParser: Parser() });\n\t\t\tif (read.issues.some((i) => i.path === '' || i.path === 'plotArea')) fail(read.issues.map((i) => i.message).join(' '));\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Office chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues.map((i) => i.message), unsupported: read.unsupported, lossless: read.lossless };\n\t\t}\n\t};\n\n\tconst addTrendline: AgentTool = {\n\t\tname: 'add_chart_trendline',\n\t\ttitle: 'Add a trendline',\n\t\tdescription: 'Fits a trendline to a series and draws it (unstacked bar, line, area, scatter and bubble charts). Returns its index and the fit: coefficients, R² and equation.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF, ...TRENDLINE_PROPS }, required: ['series', 'type'], additionalProperties: false },\n\t\tannotations: { title: 'Add a trendline', ...WRITE },\n\t\thandler: ({ series, ...line }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst result = resolve(controller.addTrendline(s.id, line as ChartTrendline)) as { index: number; fit: ReturnType<ChartController['trendlineFit']> };\n\t\t\treturn { series: s.id, index: result.index, ...(result.fit ? { coefficients: result.fit.coefficients, r2: result.fit.r2, equation: result.fit.equation } : {}) };\n\t\t}\n\t};\n\n\tconst removeTrendline: AgentTool = {\n\t\tname: 'remove_chart_trendline',\n\t\ttitle: 'Delete a trendline',\n\t\tdescription: 'Deletes a trendline from a series. Returns the series\\' remaining trendlines.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Delete a trendline', ...DESTRUCTIVE },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tresolve(controller.removeTrendline(s.id, index));\n\t\t\treturn { series: s.id, trendlines: controller.getSeries(s.id)?.trendlines ?? [] };\n\t\t}\n\t};\n\n\tconst applyPreset: AgentTool = {\n\t\tname: 'apply_chart_preset',\n\t\ttitle: 'Apply a chart style',\n\t\tdescription: 'Applies a quick layout (legend, labels and grid lines together) and / or a colour scheme as one undo step. See list_chart_presets for the names. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Apply a chart style', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ layout, colors }) => {\n\t\t\tresolve(controller.applyPreset({ layout, colors }));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst transpose: AgentTool = {\n\t\tname: 'transpose_chart',\n\t\ttitle: 'Switch rows and columns',\n\t\tdescription: 'Swaps series and categories (each category becomes a series) as one undo step. Per-series colours and settings are dropped. Returns the data table.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Switch rows and columns', ...WRITE },\n\t\thandler: () => {\n\t\t\tresolve(controller.transpose());\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst select: AgentTool = {\n\t\tname: 'select_chart_element',\n\t\ttitle: 'Select a chart element',\n\t\tdescription: 'Selects part of the chart (as a click would), for press_chart_key and for the user to see. kind \"none\" clears the selection. Returns the selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkind: { type: 'string', enum: ['none', 'chart', 'title', 'subtitle', 'legend', 'axis', 'series', 'point', 'category', 'trendline'], description: 'What to select.' },\n\t\t\t\tseries: { ...SERIES_REF, description: 'Series id or name (series, point, trendline).' },\n\t\t\t\tcategory: { ...CATEGORY_REF, description: 'Category index or label (point, category).' },\n\t\t\t\taxis: { type: 'string', enum: ['x', 'y', 'y2'], description: 'Axis (axis).' },\n\t\t\t\tindex: { type: 'integer', minimum: 0, description: 'Trendline index (trendline).' }\n\t\t\t},\n\t\t\trequired: ['kind'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Select a chart element', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ kind, series, category, axis, index }) => {\n\t\t\tlet sel: ChartSelection | null;\n\t\t\tconst need = (v: unknown, what: string) => v === undefined && fail(`kind \"${kind}\" needs ${what}.`);\n\t\t\tswitch (kind) {\n\t\t\t\tcase 'none':\n\t\t\t\t\tsel = null;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'axis':\n\t\t\t\t\tneed(axis, 'axis');\n\t\t\t\t\tsel = { kind, axis };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'series':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'point':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'category':\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'trendline':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(index, 'index');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index };\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsel = { kind } as ChartSelection;\n\t\t\t}\n\t\t\tif (options.director) await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, [{ kind: 'select', selection: sel }]);\n\t\t\telse controller.select(sel);\n\t\t\tconst now = controller.getState().selection;\n\t\t\tif (sel && !now) fail(`Nothing to select there (e.g. the chart has no ${kind} of that kind).`);\n\t\t\treturn { selection: now };\n\t\t}\n\t};\n\n\tconst drag: AgentTool = {\n\t\tname: 'drag_chart_point',\n\t\ttitle: 'Drag a chart point',\n\t\tdescription:\n\t\t\t'Drags on the chart as a pointer would, through the same code as the mouse: from a bar or point to a new position, with the same snapping (to other values, zero and ticks), fine adjustment (fine: Alt) and axis lock on scatter charts (lockAxis: Shift). Positions are 0–1 fractions of the chart\\'s width and height at the given size (use render_chart to see where marks are). One undo step. Returns what was dragged and the value before and after.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tfrom: { type: 'object', description: 'Start, as fractions of the chart (0,0 top-left).', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tto: { type: 'object', description: 'End, as fractions of the chart.', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tfine: { type: 'boolean', description: 'Move a tenth as far (Alt).' },\n\t\t\t\tlockAxis: { type: 'boolean', description: 'Scatter charts: change only the axis moved along most (Shift).' },\n\t\t\t\twidth: WIDTH,\n\t\t\t\theight: HEIGHT\n\t\t\t},\n\t\t\trequired: ['from', 'to'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Drag a chart point', ...WRITE },\n\t\thandler: ({ from, to, fine, lockAxis, width = size.width, height = size.height }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), { width, height });\n\t\t\tconst start = { x: from.x * width, y: from.y * height };\n\t\t\tconst target = chartHitTest(scene, start);\n\t\t\tif (target?.kind !== 'point') fail(`There is no bar or point at (${from.x}, ${from.y}); ${target ? `that is the ${target.kind}` : 'that is outside the chart'}. Use render_chart to find marks.`);\n\t\t\tconst t = target as Extract<ChartSelection, { kind: 'point' }>;\n\t\t\tconst before = controller.getSeries(t.seriesId)?.values[t.index] ?? null;\n\t\t\tconst session = startChartPointDrag(controller, scene, t, start);\n\t\t\tif (!session) fail('That point cannot be dragged here (percent-stacked charts, pies and gaps cannot be dragged).');\n\t\t\tsession!.move({ x: to.x * width, y: to.y * height }, { fine, lockAxis });\n\t\t\tsession!.end();\n\t\t\tconst s = controller.getSeries(t.seriesId)!;\n\t\t\treturn { series: s.id, category: spec().categories[t.index], index: t.index, before, after: s.values[t.index], ...(s.x ? { x: s.x[t.index] } : {}) };\n\t\t}\n\t};\n\n\tconst key: AgentTool = {\n\t\tname: 'press_chart_key',\n\t\ttitle: 'Press a key on the chart',\n\t\tdescription:\n\t\t\t'Sends a key to the chart as the keyboard would, acting on the selection (select_chart_element first): ← → move between categories, ↑ ↓ change the selected value by a tenth of a tick (shift: a whole tick, alt: a hundredth), Delete removes the selection, Escape clears it. Returns whether the key did anything and the new selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkey: { type: 'string', enum: ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Delete', 'Backspace', 'Escape'], description: 'Key name.' },\n\t\t\t\tshift: { type: 'boolean', description: 'Hold Shift.' },\n\t\t\t\talt: { type: 'boolean', description: 'Hold Alt / Option.' }\n\t\t\t},\n\t\t\trequired: ['key'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Press a key on the chart', ...DESTRUCTIVE },\n\t\thandler: ({ key: k, shift, alt }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), size);\n\t\t\tconst used = handleChartKey(controller, scene, { key: k, shiftKey: shift, altKey: alt });\n\t\t\tconst sel = controller.getState().selection;\n\t\t\tconst value = sel?.kind === 'point' ? (controller.getSeries(sel.seriesId)?.values[sel.index] ?? null) : undefined;\n\t\t\treturn { used, selection: sel, ...(value !== undefined ? { value } : {}) };\n\t\t}\n\t};\n\n\tconst undo: AgentTool = {\n\t\tname: 'undo_chart',\n\t\ttitle: 'Undo a chart edit',\n\t\tdescription: 'Undoes the last chart edit. Returns whether something was undone and what the next undo would be.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Undo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().undoLabel;\n\t\t\tconst undone = controller.undo();\n\t\t\treturn { undone, ...(undone ? { label } : {}), next: controller.getState().undoLabel || null };\n\t\t}\n\t};\n\n\tconst redo: AgentTool = {\n\t\tname: 'redo_chart',\n\t\ttitle: 'Redo a chart edit',\n\t\tdescription: 'Redoes the last undone chart edit. Returns whether something was redone.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Redo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().redoLabel;\n\t\t\tconst redone = controller.redo();\n\t\t\treturn { redone, ...(redone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst reads = [getChart, renderChart, checkColors, recommend, getTrendline, listPresets, exportMermaid, exportOoxml];\n\tconst writes = [updateChart, setData, setValues, addSeries, updateSeries, removeSeries, addCategory, removeCategory, importCsv, importMermaid, addTrendline, removeTrendline, applyPreset, transpose, select, drag, key, undo, redo];\n\n\treturn {\n\t\tid: options.id ?? 'chart',\n\t\tnamespace: options.namespace,\n\t\ttools: () => {\n\t\t\tif (readOnlyReason()) return reads;\n\t\t\treturn [...reads, ...writes.slice(0, 10), ...(Parser() ? [importOoxml] : []), ...writes.slice(10)];\n\t\t},\n\t\tsubscribe: (notify) => {\n\t\t\t// Re-announce when read-only state may have changed.\n\t\t\tlet last = readOnlyReason();\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tconst now = readOnlyReason();\n\t\t\t\tif (now !== last) {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n}\n","// Streaming follows Ursula's MermaidStreamingView and src/graph/view.ts (`blendLayout`: marks are matched by id,\n// new ones appear at their target, missing ones drop out; layouts are adopted on a throttle and the scale is held\n// steady until the source is complete).\nimport { chartFromMermaid } from './mermaid.js';\nimport { normalizeChartSpec } from './spec.js';\nimport type { ChartIssue, ChartMark, ChartScene, ChartSpec } from './types.js';\n\n/**\n * Reads JSON that is still arriving: closes open strings, arrays and objects and drops a\n * dangling key or comma, so `{\"type\":\"bar\",\"series\":[{\"name\":\"A\",\"values\":[1,2` reads as far\n * as it goes. Returns `undefined` when nothing usable has arrived yet.\n */\nexport function parsePartialChartJson(text: string): unknown {\n\tconst src = text.trim();\n\tif (!src) return undefined;\n\ttry {\n\t\treturn JSON.parse(src);\n\t} catch {\n\t\t// fall through\n\t}\n\tconst stack: string[] = [];\n\tlet inString = false;\n\tlet escaped = false;\n\tlet out = '';\n\tfor (const ch of src) {\n\t\tout += ch;\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === '\\\\') escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === '{' || ch === '[') stack.push(ch === '{' ? '}' : ']');\n\t\telse if (ch === '}' || ch === ']') stack.pop();\n\t}\n\tif (inString) out += '\"';\n\t// Drop what cannot end a value: a trailing comma, colon, key without value or partial literal.\n\tfor (let attempt = 0; attempt < 6; attempt++) {\n\t\tconst trimmed = out.replace(/\\s+$/, '');\n\t\tconst candidate = trimmed + [...stack].reverse().join('');\n\t\ttry {\n\t\t\treturn JSON.parse(candidate);\n\t\t} catch {\n\t\t\tconst next = trimmed\n\t\t\t\t.replace(/,\\s*$/, '')\n\t\t\t\t.replace(/(?:,|\\{)\\s*\"[^\"]*\"\\s*:?\\s*$/, (m) => (m.trim().startsWith('{') ? '{' : ''))\n\t\t\t\t.replace(/:\\s*$/, ': null')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-|tr?u?|fa?l?s?|nu?l?)$/, '')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-?\\d+\\.)$/, (m) => m.slice(0, -1));\n\t\t\tif (next === trimmed) break;\n\t\t\tout = next;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport type ChartStreamFormat = 'auto' | 'mermaid' | 'json';\n\nexport interface ChartStreamResult {\n\t/** The chart as far as it has arrived, or `null` before anything can be drawn. */\n\tspec: ChartSpec | null;\n\tissues: ChartIssue[];\n\t/**\n\t * The value range to lay out with while incomplete: it only grows, so the axis does not\n\t * jump as values arrive. `null` once complete (the chart's own scale takes over).\n\t */\n\tvalueDomain: { min: number; max: number } | null;\n}\n\n/**\n * Turns a chart source that is still being written (Mermaid or a JSON spec, e.g. streamed\n * from a model) into drawable specs. Series appear once their values start, axis bounds only\n * grow until `complete`, and parse problems are reported only once the source is complete.\n */\nexport class ChartStream {\n\tprivate lo = Infinity;\n\tprivate hi = -Infinity;\n\tprivate last: ChartSpec | null = null;\n\n\tconstructor(private readonly format: ChartStreamFormat = 'auto') {}\n\n\t/** Reads the source so far. `complete` when nothing more will arrive. */\n\tupdate(source: string, complete = false): ChartStreamResult {\n\t\tconst text = source.replace(/^\\s*```(?:mermaid|json)?\\s*\\n?/, '').replace(/```\\s*$/, '');\n\t\tconst format = this.format === 'auto' ? (/^\\s*[[{]/.test(text) ? 'json' : 'mermaid') : this.format;\n\t\tlet spec: ChartSpec | null = null;\n\t\tlet issues: ChartIssue[] = [];\n\t\tif (format === 'json') {\n\t\t\tconst value = complete ? safeParse(text) : parsePartialChartJson(text);\n\t\t\tif (value !== undefined) {\n\t\t\t\tconst read = normalizeChartSpec(value);\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t} else {\n\t\t\tconst read = chartFromMermaid(text, { partial: !complete });\n\t\t\tif (read.family) {\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t}\n\t\tif (spec && !spec.series.some((s) => s.values.some((v) => v !== null))) spec = complete ? spec : this.last;\n\t\tif (spec) this.last = spec;\n\t\tif (spec) {\n\t\t\tfor (const s of spec.series) for (const v of s.values) if (v !== null && Number.isFinite(v)) (this.lo = Math.min(this.lo, v)), (this.hi = Math.max(this.hi, v));\n\t\t}\n\t\tconst valueDomain = !complete && Number.isFinite(this.lo) && this.hi > this.lo ? { min: Math.min(0, this.lo), max: this.hi } : null;\n\t\treturn { spec, issues, valueDomain };\n\t}\n\n\t/** Forgets the axis bounds (a new source). */\n\treset(): void {\n\t\tthis.lo = Infinity;\n\t\tthis.hi = -Infinity;\n\t\tthis.last = null;\n\t}\n}\n\nfunction safeParse(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn parsePartialChartJson(text);\n\t}\n}\n\nconst mix = (a: number, b: number, t: number) => a + (b - a) * t;\n\n/** Paths with the same commands blend number by number; others switch at the end. */\nfunction blendPath(a: string, b: string, t: number): string {\n\tconst na = a.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tconst nb = b.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tif (!na || !nb || na.length !== nb.length || a.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#') !== b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#')) return t < 1 ? a : b;\n\tlet i = 0;\n\treturn b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, () => {\n\t\tconst v = mix(Number(na[i]), Number(nb[i]), t);\n\t\ti++;\n\t\treturn String(Math.round(v * 100) / 100);\n\t});\n}\n\n/**\n * A scene between two scenes, for animating changes (streamed data arriving, an agent's\n * edit): marks are matched by `key`; numbers and same-shaped paths move from `from` to `to`;\n * new marks fade in and marks that are gone are dropped. `t` runs from 0 to 1.\n */\nexport function blendChartScenes(from: ChartScene | null, to: ChartScene, t: number): ChartScene {\n\tif (!from || t >= 1) return to;\n\tconst k = Math.max(0, Math.min(1, t));\n\tconst before = new Map(from.marks.map((m) => [m.key, m]));\n\tconst marks: ChartMark[] = to.marks.map((m) => {\n\t\tconst a = before.get(m.key);\n\t\tif (!a || a.kind !== m.kind) return { ...m, opacity: (m.opacity ?? 1) * k };\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k), width: mix(p.width, m.width, k), height: mix(p.height, m.height, k) };\n\t\t\t}\n\t\t\tcase 'circle': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, cx: mix(p.cx, m.cx, k), cy: mix(p.cy, m.cy, k), r: mix(p.r, m.r, k) };\n\t\t\t}\n\t\t\tcase 'line': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x1: mix(p.x1, m.x1, k), y1: mix(p.y1, m.y1, k), x2: mix(p.x2, m.x2, k), y2: mix(p.y2, m.y2, k) };\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k) };\n\t\t\t}\n\t\t\tcase 'path':\n\t\t\t\treturn { ...m, d: blendPath((a as typeof m).d, m.d, k) };\n\t\t}\n\t});\n\treturn { ...to, marks };\n}\n\n/** Ease-out cubic, for tweens. */\nexport const easeChartTween = (t: number) => 1 - Math.pow(1 - Math.max(0, Math.min(1, t)), 3);\n","// Agent \"performances\" follow Ursula's remote control (src/remote/commands.ts `planCommand`, src/react/remote/director.ts,\n// presence.ts, clock.ts): a pure planner turns a command into cursor steps, a director acts them out per actor and\n// commits each command as one undo step, and the clock is injectable so performances are repeatable in tests.\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { linearMap } from './scale.js';\nimport type { ChartScene, ChartSelection, ChartSpec } from './types.js';\n\nimport {\n\tPRESENCE_COLORS,\n\tPerformanceQueue,\n\tPresenceStore,\n\tcreateInstantPresenceClock,\n\trealPresenceClock,\n\ttweenPresenceCursor,\n\ttype PresenceActor,\n\ttype PresenceActorInfo,\n\ttype PresenceClock,\n\ttype PresenceState\n} from '../animation/presence.js';\n\nexport type ChartPresenceActor = PresenceActor;\nexport type ChartPresenceState = PresenceState;\n\n/** Cursor positions and notes of agents acting on a chart, for an overlay. */\nexport class ChartPresence extends PresenceStore {}\n\nexport const CHART_PRESENCE_COLORS: readonly string[] = PRESENCE_COLORS;\n\n/** Time for performances: real timers, or an instant clock for tests and recordings. */\nexport type ChartClock = PresenceClock;\n\nexport const realChartClock: ChartClock = realPresenceClock;\n\n/** A clock whose waits finish at once while its time still advances (repeatable performances). */\nexport const createInstantChartClock = createInstantPresenceClock;\n\n/** What an agent asks for. Each command commits as one undo step. */\nexport type ChartAgentCommand =\n\t| { kind: 'setValue'; seriesId: string; index: number; value: number; note?: string }\n\t| { kind: 'select'; selection: ChartSelection | null; note?: string }\n\t| { kind: 'update'; patch: ChartSpecPatch; label?: string; note?: string }\n\t| { kind: 'say'; text: string };\n\nexport type ChartPerformanceStep =\n\t| { type: 'move'; to: { x: number; y: number }; ms: number }\n\t| { type: 'say'; text: string; ms: number }\n\t| { type: 'press' }\n\t| { type: 'drag'; to: { x: number; y: number }; ms: number; from: number; value: number }\n\t| { type: 'release' }\n\t| { type: 'commit' };\n\n/** Where a point or bar sits in the scene (its top for bars), or null when it is not drawn. */\nexport function chartPointAnchor(scene: ChartScene, seriesId: string, index: number): { x: number; y: number } | null {\n\tconst mark = scene.marks.find((m) => (m.role === 'bar' || m.role === 'point') && m.target?.kind === 'point' && m.target.seriesId === seriesId && m.target.index === index);\n\tif (!mark) return null;\n\tif (mark.kind === 'rect') return { x: mark.x + mark.width / 2, y: mark.y };\n\tif (mark.kind === 'circle') return { x: mark.cx, y: mark.cy };\n\treturn null;\n}\n\nconst anchorFor = (scene: ChartScene, role: string) => {\n\tconst m = scene.marks.find((x) => x.role === role);\n\tif (!m) return null;\n\tif (m.kind === 'text') return { x: m.x, y: m.y };\n\tif (m.kind === 'rect') return { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\tif (m.kind === 'line') return { x: (m.x1 + m.x2) / 2, y: (m.y1 + m.y2) / 2 };\n\treturn null;\n};\n\n/**\n * Plans how an agent acts out a command on the chart: cursor moves, a drag along the value\n * axis for a value change (its end at the new value), a note, then a commit. Pure: the same\n * scene and command give the same steps.\n */\nexport function planChartCommand(spec: ChartSpec, scene: ChartScene, command: ChartAgentCommand, speed = 1): ChartPerformanceStep[] {\n\tconst ms = (n: number) => Math.round(n / Math.max(0.1, speed));\n\tconst steps: ChartPerformanceStep[] = [];\n\tconst note = 'note' in command && command.note ? command.note : undefined;\n\tif (note) steps.push({ type: 'say', text: note, ms: ms(500) });\n\tswitch (command.kind) {\n\t\tcase 'say':\n\t\t\tsteps.push({ type: 'say', text: command.text, ms: ms(900) });\n\t\t\treturn steps;\n\t\tcase 'setValue': {\n\t\t\tconst at = chartPointAnchor(scene, command.seriesId, command.index);\n\t\t\tconst series = spec.series.find((s) => s.id === command.seriesId);\n\t\t\tconst from = series?.values[command.index] ?? 0;\n\t\t\tconst scale = series?.axis === 'secondary' ? (scene.valueScale2 ?? scene.valueScale) : scene.valueScale;\n\t\t\tif (at && scale) {\n\t\t\t\tconst px = linearMap(command.value, scale.domain, scale.range);\n\t\t\t\tconst to = scale.axis === 'y' ? { x: at.x, y: px } : { x: px, y: at.y };\n\t\t\t\tsteps.push({ type: 'move', to: at, ms: ms(380) }, { type: 'press' }, { type: 'drag', to, ms: ms(520), from, value: command.value }, { type: 'release' });\n\t\t\t} else steps.push({ type: 'drag', to: { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + scene.plot.height / 2 }, ms: ms(200), from, value: command.value });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'select': {\n\t\t\tconst sel = command.selection;\n\t\t\tlet to: { x: number; y: number } | null = null;\n\t\t\tif (sel?.kind === 'point') to = chartPointAnchor(scene, sel.seriesId, sel.index);\n\t\t\telse if (sel) {\n\t\t\t\tconst m = scene.marks.find((x) => x.target && JSON.stringify(x.target) === JSON.stringify(sel));\n\t\t\t\tif (m?.kind === 'text') to = { x: m.x, y: m.y };\n\t\t\t\telse if (m?.kind === 'rect') to = { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\t\t\t\telse if (m?.kind === 'circle') to = { x: m.cx, y: m.cy };\n\t\t\t}\n\t\t\tif (to) steps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'update': {\n\t\t\tconst keys = Object.keys(command.patch);\n\t\t\tconst role = keys.includes('title') ? 'title' : keys.includes('legend') ? 'legend-label' : keys.some((k) => k === 'xAxis') ? 'axis' : keys.some((k) => k === 'yAxis' || k === 'yAxis2') ? 'tick-label' : null;\n\t\t\tconst to = (role && anchorFor(scene, role)) || { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + 12 };\n\t\t\tsteps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' }, { type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t}\n}\n\nexport interface ChartDirectorOptions {\n\t/** The scene as currently drawn (for cursor targets), e.g. the canvas' last layout. */\n\tscene: () => ChartScene;\n\tclock?: ChartClock;\n\t/** 1 = natural speed; 2 = twice as fast. */\n\tspeed?: number;\n\t/** Hide each actor's cursor this long after its last command (ms, default 1500; 0 keeps it). */\n\tlinger?: number;\n}\n\nexport type ChartDirectorActor = PresenceActorInfo;\n\nexport type ChartPerformanceResult = { ok: true; command: ChartAgentCommand } | { ok: false; command: ChartAgentCommand; message: string };\n\n/**\n * Acts out agent commands on a chart: each actor's cursor moves to the target, drags values\n * into place (the chart updates live) and the command commits as one undo step, while the\n * user keeps editing. Commands queue per actor; a command whose target was deleted meanwhile\n * fails with a sentence instead of editing something else.\n */\nexport class ChartDirector {\n\tprivate readonly clock: ChartClock;\n\tprivate readonly queue: PerformanceQueue;\n\n\tconstructor(\n\t\tprivate readonly controller: ChartController,\n\t\treadonly presence: ChartPresence,\n\t\tprivate readonly options: ChartDirectorOptions\n\t) {\n\t\tthis.clock = options.clock ?? realChartClock;\n\t\tthis.queue = new PerformanceQueue(presence, {\n\t\t\tclock: this.clock,\n\t\t\tlinger: options.linger,\n\t\t\tbeginGesture: (key) => controller.beginGesture(key),\n\t\t\tendGesture: () => controller.endGesture()\n\t\t});\n\t}\n\n\t/** Acts out `commands` in order for `actor`. Resolves with one result per command. */\n\tperform(actor: ChartDirectorActor, commands: readonly ChartAgentCommand[]): Promise<ChartPerformanceResult[]> {\n\t\treturn this.queue.run(actor, async () => {\n\t\t\tconst results: ChartPerformanceResult[] = [];\n\t\t\tfor (const command of commands) results.push(await this.performOne(actor.id, command));\n\t\t\treturn results;\n\t\t});\n\t}\n\n\tprivate stale(command: ChartAgentCommand): string | null {\n\t\tconst spec = this.controller.getSpec();\n\t\tif (command.kind === 'setValue') {\n\t\t\tconst s = spec.series.find((x) => x.id === command.seriesId);\n\t\t\tif (!s) return `The series \"${command.seriesId}\" no longer exists.`;\n\t\t\tif (command.index < 0 || command.index >= spec.categories.length) return `Category ${command.index} no longer exists.`;\n\t\t\tif (!Number.isFinite(command.value)) return 'The value must be a finite number.';\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate move(id: string, from: { x: number; y: number }, to: { x: number; y: number }, ms: number, each?: (t: number) => void) {\n\t\treturn tweenPresenceCursor(this.presence, this.clock, id, from, to, ms, each);\n\t}\n\n\tprivate async performOne(id: string, command: ChartAgentCommand): Promise<ChartPerformanceResult> {\n\t\tconst stale = this.stale(command);\n\t\tif (stale) return { ok: false, command, message: stale };\n\t\tconst steps = planChartCommand(this.controller.getSpec(), this.options.scene(), command, this.options.speed);\n\t\tconst where = () => {\n\t\t\tconst a = this.presence.getState().actors.find((x) => x.id === id)!;\n\t\t\treturn { x: a.x, y: a.y };\n\t\t};\n\t\t{\n\t\t\tfor (const step of steps) {\n\t\t\t\tswitch (step.type) {\n\t\t\t\t\tcase 'say':\n\t\t\t\t\t\tthis.presence.set({ id, message: step.text });\n\t\t\t\t\t\tawait this.clock.wait(step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'move':\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'press':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: true });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'release':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: false });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'drag': {\n\t\t\t\t\t\tif (command.kind !== 'setValue') break;\n\t\t\t\t\t\t// The value follows the cursor; the whole drag is one undo step.\n\t\t\t\t\t\tconst stale2 = this.stale(command);\n\t\t\t\t\t\tif (stale2) return { ok: false, command, message: stale2 };\n\t\t\t\t\t\tconst label = `${this.presence.getState().actors.find((a) => a.id === id)?.name ?? 'Agent'}: edit value`;\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms, (e) => {\n\t\t\t\t\t\t\tconst v = step.from + (step.value - step.from) * e;\n\t\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, Number(v.toPrecision(12)), { label });\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, step.value, { label });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'commit': {\n\t\t\t\t\t\tif (command.kind === 'select') this.controller.select(command.selection);\n\t\t\t\t\t\telse if (command.kind === 'update') {\n\t\t\t\t\t\t\tconst result = this.controller.update(command.patch, command.label ? { label: command.label } : {});\n\t\t\t\t\t\t\tif (!result.ok) return { ok: false, command, message: result.message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ok: true, command };\n\t\t}\n\t}\n}\n","import { readZip, type ZipArchive, type ZipReadOptions } from '../import/zip.js';\nimport { CHART_OOXML_NS, chartFromOoxml } from './ooxml.js';\nimport type { ChartSpec } from './types.js';\n\ntype ParserCtor = { new (): DOMParser };\n\n/** Office files charts can be read from. */\nexport type OfficeChartFileFormat = 'xlsx' | 'pptx' | 'docx';\n\n/** A chart found in an Excel workbook, PowerPoint deck or Word document. */\nexport interface OfficeFileChart {\n\t/** `chart-1`, `chart-2`, … in file order (sheets, slides or the document body). */\n\tid: string;\n\t/** The chart part, e.g. `xl/charts/chart1.xml` or `ppt/charts/chartEx1.xml`. */\n\tpath: string;\n\t/** `chart` for DrawingML (`c:chartSpace`), `chartex` for Office 2016 charts (`cx:chartSpace`). */\n\tpartKind: 'chart' | 'chartex';\n\t/** Worksheet or chart sheet name (xlsx). */\n\tsheet?: string;\n\t/** 1-based slide number (pptx). */\n\tslide?: number;\n\t/** Top-left cell the chart is anchored to, e.g. `B2` (xlsx worksheets). */\n\tanchor?: string;\n\t/** The cells the chart covers, e.g. `B2:H18` (xlsx two-cell anchors). */\n\trange?: string;\n\t/** The shape name (`cNvPr name`), e.g. `Chart 3`. */\n\tname?: string;\n\t/** The chart's title (may be empty). */\n\ttitle: string;\n\tspec: ChartSpec;\n\t/** Problems reading it, as sentences. */\n\tissues: string[];\n\t/** Features the chart editor cannot hold (3-D, stock, …). */\n\tunsupported: string[];\n\t/** Writing `spec` back loses nothing. */\n\tlossless: boolean;\n}\n\nexport interface OfficeChartsResult {\n\tformat: OfficeChartFileFormat;\n\tcharts: OfficeFileChart[];\n}\n\nexport interface OfficeChartsReadOptions extends ZipReadOptions {\n\t/** `DOMParser` constructor (default: the global one; pass jsdom's or xmldom's in Node). */\n\tDOMParser?: ParserCtor;\n\t/** Stop after this many charts (default 500). */\n\tmaxCharts?: number;\n}\n\n/** Thrown when the bytes are not a readable Office file of the expected kind. */\nexport class OfficeChartsError extends Error {\n\tconstructor(message: string, options?: { cause?: unknown }) {\n\t\tsuper(message, options);\n\t\tthis.name = 'OfficeChartsError';\n\t}\n}\n\nconst CHARTEX_NS = 'http://schemas.microsoft.com/office/drawing/2014/chartex';\nconst STRICT_CHART_NS = 'http://purl.oclc.org/ooxml/drawingml/chart';\n\ninterface Relationship {\n\ttype: string;\n\ttarget: string;\n\texternal: boolean;\n}\n\ninterface Reader {\n\tzip: ZipArchive;\n\tParser: ParserCtor;\n\tmax: number;\n\tcharts: OfficeFileChart[];\n\tseen: Set<string>;\n}\n\nconst dirname = (path: string) => path.slice(0, path.lastIndexOf('/') + 1);\n\nfunction resolvePartPath(baseDir: string, target: string): string {\n\tconst out: string[] = [];\n\tfor (const segment of (target.startsWith('/') ? target.slice(1) : baseDir + target).split('/')) {\n\t\tif (segment === '' || segment === '.') continue;\n\t\tif (segment === '..') out.pop();\n\t\telse out.push(segment);\n\t}\n\treturn out.join('/');\n}\n\nconst relsPathFor = (partPath: string) => `${dirname(partPath)}_rels/${partPath.slice(dirname(partPath).length)}.rels`;\n\nfunction elements(root: Document | Element, localName: string): Element[] {\n\treturn Array.from(root.getElementsByTagNameNS('*', localName));\n}\n\n/** A relationship id attribute (`r:id`, `r:embed`) in the transitional or strict namespace. */\nfunction relId(el: Element, localName = 'id'): string | undefined {\n\tfor (const a of Array.from(el.attributes)) {\n\t\tif (a.localName === localName && (a.namespaceURI?.includes('relationships') || a.prefix === 'r')) return a.value;\n\t}\n\treturn undefined;\n}\n\nconst firstChild = (el: Element | undefined, localName: string): Element | undefined =>\n\tel ? Array.from(el.children ?? el.childNodes).find((n): n is Element => n.nodeType === 1 && (n as Element).localName === localName) : undefined;\n\nasync function readXml(r: Reader, path: string): Promise<Document | null> {\n\tconst entry = r.zip.get(path) ?? r.zip.entries.find((e) => e.name.toLowerCase() === path.toLowerCase());\n\tif (!entry) return null;\n\tconst doc = new r.Parser().parseFromString(await r.zip.readText(entry), 'application/xml');\n\treturn doc.getElementsByTagName('parsererror').length ? null : doc;\n}\n\nasync function readRels(r: Reader, partPath: string): Promise<Map<string, Relationship>> {\n\tconst rels = new Map<string, Relationship>();\n\tconst doc = await readXml(r, relsPathFor(partPath));\n\tif (!doc) return rels;\n\tfor (const rel of elements(doc, 'Relationship')) {\n\t\tconst id = rel.getAttribute('Id');\n\t\tif (!id) continue;\n\t\tconst target = rel.getAttribute('Target') ?? '';\n\t\tconst external = rel.getAttribute('TargetMode')?.toLowerCase() === 'external';\n\t\trels.set(id, { type: rel.getAttribute('Type') ?? '', target: external ? target : resolvePartPath(dirname(partPath), target), external });\n\t}\n\treturn rels;\n}\n\nconst isChartRef = (el: Element) => el.localName === 'chart' && (el.namespaceURI === CHART_OOXML_NS || el.namespaceURI === STRICT_CHART_NS || el.namespaceURI === CHARTEX_NS);\n\n/** The `cNvPr name` of the graphic frame around a chart reference, if any. */\nfunction frameName(ref: Element): string | undefined {\n\tfor (let el: Element | null = ref.parentElement; el; el = el.parentElement) {\n\t\tif (el.localName === 'graphicFrame') {\n\t\t\tconst nv = elements(el, 'cNvPr')[0];\n\t\t\treturn nv?.getAttribute('name') || undefined;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Reads every chart a part references (`c:chart r:id`, `cx:chart r:id`) and adds it to `r.charts`. */\nasync function chartsInPart(r: Reader, root: Document | Element, rels: Map<string, Relationship>, place: (ref: Element) => Partial<OfficeFileChart>): Promise<void> {\n\tfor (const ref of elements(root, 'chart')) {\n\t\tif (r.charts.length >= r.max) return;\n\t\tif (!isChartRef(ref)) continue;\n\t\tconst rel = rels.get(relId(ref) ?? '');\n\t\tif (!rel || rel.external || r.seen.has(rel.target)) continue;\n\t\tconst entry = r.zip.get(rel.target);\n\t\tif (!entry) continue;\n\t\tr.seen.add(rel.target);\n\t\tconst read = chartFromOoxml(await r.zip.readText(entry), { DOMParser: r.Parser });\n\t\tconst name = frameName(ref);\n\t\tr.charts.push({\n\t\t\tid: `chart-${r.charts.length + 1}`,\n\t\t\tpath: rel.target,\n\t\t\tpartKind: ref.namespaceURI === CHARTEX_NS ? 'chartex' : 'chart',\n\t\t\t...place(ref),\n\t\t\t...(name ? { name } : {}),\n\t\t\ttitle: read.spec.title,\n\t\t\tspec: read.spec,\n\t\t\tissues: read.issues.map((i) => i.message),\n\t\t\tunsupported: read.unsupported,\n\t\t\tlossless: read.lossless\n\t\t});\n\t}\n}\n\n/** `0` → `A`, `27` → `AB`. */\nfunction columnName(index: number): string {\n\tlet name = '';\n\tfor (let n = index + 1; n > 0; n = Math.floor((n - 1) / 26)) name = String.fromCharCode(65 + ((n - 1) % 26)) + name;\n\treturn name;\n}\n\nfunction anchorCell(marker: Element | undefined): string | undefined {\n\tconst col = Number(firstChild(marker, 'col')?.textContent);\n\tconst row = Number(firstChild(marker, 'row')?.textContent);\n\treturn Number.isInteger(col) && Number.isInteger(row) && col >= 0 && row >= 0 ? `${columnName(col)}${row + 1}` : undefined;\n}\n\n/** The anchor (`xdr:twoCellAnchor`, `xdr:oneCellAnchor`) a chart reference sits in. */\nfunction drawingPlace(ref: Element): Partial<OfficeFileChart> {\n\tfor (let el: Element | null = ref.parentElement; el; el = el.parentElement) {\n\t\tif (el.localName === 'twoCellAnchor' || el.localName === 'oneCellAnchor') {\n\t\t\tconst anchor = anchorCell(firstChild(el, 'from'));\n\t\t\tconst to = el.localName === 'twoCellAnchor' ? anchorCell(firstChild(el, 'to')) : undefined;\n\t\t\treturn { ...(anchor ? { anchor } : {}), ...(anchor && to ? { range: `${anchor}:${to}` } : {}) };\n\t\t}\n\t\tif (el.localName === 'absoluteAnchor') return {};\n\t}\n\treturn {};\n}\n\nasync function readMainPart(r: Reader): Promise<{ path: string; doc: Document }> {\n\tconst rootRels = await readRels(r, '');\n\tconst main = [...rootRels.values()].find((rel) => /\\/officeDocument$/.test(rel.type) && !rel.external);\n\tconst doc = main ? await readXml(r, main.target) : null;\n\tif (!main || !doc) throw new OfficeChartsError('This is not an Office file: _rels/.rels names no main part (expected an .xlsx, .pptx or .docx file).');\n\treturn { path: main.target, doc };\n}\n\nasync function readXlsx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tconst rels = await readRels(r, main.path);\n\tfor (const sheet of elements(main.doc, 'sheet')) {\n\t\tconst rel = rels.get(relId(sheet) ?? '');\n\t\tif (!rel || rel.external) continue;\n\t\tconst doc = await readXml(r, rel.target);\n\t\tif (!doc) continue;\n\t\tconst sheetName = sheet.getAttribute('name') ?? rel.target;\n\t\tconst sheetRels = await readRels(r, rel.target);\n\t\tfor (const drawingRef of elements(doc, 'drawing')) {\n\t\t\tconst drawingRel = sheetRels.get(relId(drawingRef) ?? '');\n\t\t\tif (!drawingRel || drawingRel.external) continue;\n\t\t\tconst drawing = await readXml(r, drawingRel.target);\n\t\t\tif (!drawing) continue;\n\t\t\tconst drawingRels = await readRels(r, drawingRel.target);\n\t\t\tawait chartsInPart(r, drawing, drawingRels, (ref) => ({ sheet: sheetName, ...drawingPlace(ref) }));\n\t\t}\n\t}\n}\n\nasync function readPptx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tconst rels = await readRels(r, main.path);\n\tconst slides = elements(main.doc, 'sldId');\n\tfor (let i = 0; i < slides.length; i++) {\n\t\tconst rel = rels.get(relId(slides[i]) ?? '');\n\t\tif (!rel || rel.external) continue;\n\t\tconst doc = await readXml(r, rel.target);\n\t\tif (!doc) continue;\n\t\tawait chartsInPart(r, doc, await readRels(r, rel.target), () => ({ slide: i + 1 }));\n\t}\n}\n\nasync function readDocx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tawait chartsInPart(r, main.doc, await readRels(r, main.path), () => ({}));\n}\n\nasync function open(bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions): Promise<{ r: Reader; main: { path: string; doc: Document }; format: OfficeChartFileFormat }> {\n\tconst Parser = options.DOMParser ?? (globalThis as { DOMParser?: ParserCtor }).DOMParser;\n\tif (!Parser) throw new OfficeChartsError('Reading Office files needs a DOMParser. In Node, pass one (e.g. from jsdom or @xmldom/xmldom) as { DOMParser }.');\n\tlet zip: ZipArchive;\n\ttry {\n\t\tzip = await readZip(bytes, options);\n\t} catch (error) {\n\t\tthrow new OfficeChartsError(`This is not an Office file: ${(error as Error).message}`, { cause: error });\n\t}\n\tconst r: Reader = { zip, Parser, max: options.maxCharts ?? 500, charts: [], seen: new Set() };\n\tconst main = await readMainPart(r);\n\tconst root = main.doc.documentElement.localName;\n\tconst format: OfficeChartFileFormat | undefined = root === 'workbook' ? 'xlsx' : root === 'presentation' ? 'pptx' : root === 'document' ? 'docx' : undefined;\n\tif (!format) throw new OfficeChartsError(`The main part ${main.path} is a <${root}>; expected an Excel workbook, PowerPoint presentation or Word document.`);\n\treturn { r, main, format };\n}\n\nconst READERS: Record<OfficeChartFileFormat, (r: Reader, main: { path: string; doc: Document }) => Promise<void>> = { xlsx: readXlsx, pptx: readPptx, docx: readDocx };\n\n/**\n * Reads every chart in an Office file, detecting whether it is a workbook (charts on each\n * worksheet's or chart sheet's drawing, with the sheet name and anchor cell), a presentation\n * (charts on each slide, with the slide number) or a Word document (charts in the body).\n * DrawingML and Office 2016 chartex parts are both read with `chartFromOoxml`; data comes\n * from the cached values. Throws `OfficeChartsError` when the bytes are not an Office file.\n */\nexport async function extractOfficeCharts(bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}): Promise<OfficeChartsResult> {\n\tconst { r, main, format } = await open(bytes, options);\n\tawait READERS[format](r, main);\n\treturn { format, charts: r.charts };\n}\n\nasync function extractAs(format: OfficeChartFileFormat, bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions): Promise<OfficeFileChart[]> {\n\tconst result = await extractOfficeCharts(bytes, options);\n\tif (result.format !== format) throw new OfficeChartsError(`This is a .${result.format} file, not a .${format} file.`);\n\treturn result.charts;\n}\n\n/** The charts in an Excel workbook (`xl/drawings/drawingN.xml` → `xl/charts/chartN.xml`), with sheet and anchor cell. */\nexport const extractXlsxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('xlsx', bytes, options);\n\n/** The charts in a PowerPoint deck (`p:graphicFrame` → `ppt/charts/chartN.xml`), with their slide number. */\nexport const extractPptxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('pptx', bytes, options);\n\n/** The charts in the body of a Word document (`word/charts/chartN.xml`). */\nexport const extractDocxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('docx', bytes, options);\n\n/** Where a chart sits, for labels: `Sheet1!B2`, `Slide 3`, `Document`. */\nexport function describeOfficeChartPlace(chart: OfficeFileChart): string {\n\tif (chart.sheet !== undefined) return chart.anchor ? `${chart.sheet}!${chart.anchor}` : chart.sheet;\n\tif (chart.slide !== undefined) return `Slide ${chart.slide}`;\n\treturn 'Document';\n}\n","import type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { describeOfficeChartPlace, extractOfficeCharts, type OfficeChartsResult, type OfficeFileChart } from './office-files.js';\n\ntype ParserCtor = { new (): DOMParser };\n\n/** A file the host has opened and lets the agent read charts from. */\nexport interface OfficeChartFile {\n\tname: string;\n\tdata: ArrayBuffer | ArrayBufferView;\n}\n\nexport interface OfficeChartToolProviderOptions {\n\t/** Provider id (unique per registry). Default `office-charts`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/**\n\t * Files the user opened. With it, the tools take a `file` name (and `list_open_files` lists\n\t * them); without it, they take the file's bytes as base64 `data`.\n\t */\n\tfiles?: () => readonly OfficeChartFile[];\n\t/** Enables `load_file_chart`, which replaces this chart with one from a file. */\n\tcontroller?: ChartController;\n\t/** The chart cannot be edited: `load_file_chart` is hidden. A string is the reason. */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** `DOMParser` constructor (default: the global one). */\n\tDOMParser?: ParserCtor;\n}\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nfunction fromBase64(data: string): Uint8Array {\n\tconst clean = data.replace(/^data:[^,]*,/, '').replace(/\\s+/g, '');\n\tlet binary: string;\n\ttry {\n\t\tbinary = atob(clean);\n\t} catch {\n\t\treturn fail('\"data\" is not valid base64. Pass the whole .xlsx, .pptx or .docx file encoded as base64 (a data: URL prefix is fine).');\n\t}\n\tconst out = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n\treturn out;\n}\n\n/** The fields of a chart an agent needs to pick one, without the full spec. */\nfunction chartSummary(chart: OfficeFileChart) {\n\treturn {\n\t\tid: chart.id,\n\t\tplace: describeOfficeChartPlace(chart),\n\t\t...(chart.sheet !== undefined ? { sheet: chart.sheet } : {}),\n\t\t...(chart.slide !== undefined ? { slide: chart.slide } : {}),\n\t\t...(chart.anchor ? { anchor: chart.anchor } : {}),\n\t\t...(chart.range ? { range: chart.range } : {}),\n\t\t...(chart.name ? { name: chart.name } : {}),\n\t\tpath: chart.path,\n\t\tpartKind: chart.partKind,\n\t\ttitle: chart.title,\n\t\ttype: chart.spec.type,\n\t\tseries: chart.spec.series.map((s) => s.name),\n\t\tcategories: chart.spec.categories.length,\n\t\tissues: chart.issues,\n\t\tunsupported: chart.unsupported,\n\t\tlossless: chart.lossless\n\t};\n}\n\n/**\n * Agent tools for reading charts out of Office files (`.xlsx`, `.pptx`, `.docx`), for a\n * `ToolRegistry`. `list_file_charts` lists every chart with where it sits (sheet and anchor\n * cell, slide number) and its read problems; `get_file_chart` returns one chart's full spec;\n * with a `controller`, `load_file_chart` replaces that chart editor's chart with one of them\n * as one undo step. With `files`, the tools address the files the user opened by name\n * (`list_open_files`); otherwise they take the file as base64.\n */\nexport function createOfficeChartToolProvider(options: OfficeChartToolProviderOptions = {}): AgentToolProvider {\n\tconst cache = new WeakMap<OfficeChartFile, Promise<OfficeChartsResult>>();\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (!r) return null;\n\t\treturn typeof r === 'string' ? r : 'This chart is read-only.';\n\t};\n\n\tconst source: Record<string, JsonSchema> = options.files\n\t\t? { file: { type: 'string', description: 'Name of an open file, as list_open_files returns it.' } }\n\t\t: { data: { type: 'string', description: 'The whole .xlsx, .pptx or .docx file as base64 (a data: URL prefix is allowed).' } };\n\tconst sourceKey = options.files ? 'file' : 'data';\n\n\tconst read = (args: Record<string, unknown>): Promise<OfficeChartsResult> => {\n\t\tif (!options.files) return extractOfficeCharts(fromBase64(String(args.data)), { DOMParser: options.DOMParser });\n\t\tconst files = options.files();\n\t\tconst file = files.find((f) => f.name === args.file);\n\t\tif (!file) return fail(`There is no open file \"${String(args.file)}\"; expected one of ${files.map((f) => JSON.stringify(f.name)).join(', ') || '(none; ask the user to open an .xlsx, .pptx or .docx file)'}.`);\n\t\tlet result = cache.get(file);\n\t\tif (!result) {\n\t\t\tresult = extractOfficeCharts(file.data, { DOMParser: options.DOMParser });\n\t\t\tcache.set(file, result);\n\t\t\tresult.catch(() => cache.delete(file));\n\t\t}\n\t\treturn result;\n\t};\n\tconst chartById = async (args: Record<string, unknown>) => {\n\t\tconst { charts } = await read(args);\n\t\tconst chart = charts.find((c) => c.id === args.chartId);\n\t\tif (!chart) fail(`There is no chart \"${String(args.chartId)}\" in this file; expected one of ${charts.map((c) => `\"${c.id}\" (${describeOfficeChartPlace(c)})`).join(', ') || '(none: the file has no charts)'}.`);\n\t\treturn chart!;\n\t};\n\tconst CHART_ID: JsonSchema = { type: 'string', description: 'Chart id from list_file_charts, e.g. \"chart-1\".' };\n\n\tconst listOpenFiles: AgentTool = {\n\t\tname: 'list_open_files',\n\t\ttitle: 'List open files',\n\t\tdescription: 'Lists the Office files the user opened that charts can be read from. Returns their names and sizes in bytes.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'List open files', ...READ },\n\t\thandler: () => ({ files: (options.files?.() ?? []).map((f) => ({ name: f.name, bytes: f.data.byteLength })) })\n\t};\n\n\tconst listCharts: AgentTool = {\n\t\tname: 'list_file_charts',\n\t\ttitle: 'List the charts in an Office file',\n\t\tdescription:\n\t\t\t'Reads an Excel workbook, PowerPoint deck or Word document and lists its charts in file order: id, where it sits (sheet name and anchor cell, or slide number), title, type, series names, number of categories, read problems, features the chart editor cannot hold, and whether it reads losslessly. Pass an id to get_file_chart or load_file_chart.',\n\t\tinputSchema: { type: 'object', properties: { ...source }, required: [sourceKey], additionalProperties: false },\n\t\tannotations: { title: 'List the charts in an Office file', ...READ },\n\t\thandler: async (args) => {\n\t\t\tconst result = await read(args);\n\t\t\treturn { format: result.format, charts: result.charts.map(chartSummary) };\n\t\t}\n\t};\n\n\tconst getChart: AgentTool = {\n\t\tname: 'get_file_chart',\n\t\ttitle: 'Get a chart from an Office file',\n\t\tdescription: 'Returns one chart of an Office file with its full chart spec (data, axes, series styles), where it sits and its read problems.',\n\t\tinputSchema: { type: 'object', properties: { ...source, chartId: CHART_ID }, required: [sourceKey, 'chartId'], additionalProperties: false },\n\t\tannotations: { title: 'Get a chart from an Office file', ...READ },\n\t\thandler: async (args) => {\n\t\t\tconst chart = await chartById(args);\n\t\t\treturn { ...chartSummary(chart), spec: chart.spec };\n\t\t}\n\t};\n\n\tconst loadChart: AgentTool = {\n\t\tname: 'load_file_chart',\n\t\ttitle: 'Load a chart from an Office file',\n\t\tdescription: 'Replaces the chart in the editor with a chart from an Office file, as one undo step. Returns the new spec, read problems and features the editor could not keep.',\n\t\tinputSchema: { type: 'object', properties: { ...source, chartId: CHART_ID }, required: [sourceKey, 'chartId'], additionalProperties: false },\n\t\tannotations: { title: 'Load a chart from an Office file', ...DESTRUCTIVE },\n\t\thandler: async (args) => {\n\t\t\tconst reason = readOnlyReason();\n\t\t\tif (reason) fail(reason);\n\t\t\tconst chart = await chartById(args);\n\t\t\tconst result = options.controller!.update({ ...chart.spec } as ChartSpecPatch, { label: 'Load chart from file' });\n\t\t\tif (!result.ok) fail(result.message ?? 'The chart could not be loaded.');\n\t\t\treturn { id: chart.id, place: describeOfficeChartPlace(chart), spec: options.controller!.toJSON(), issues: chart.issues, unsupported: chart.unsupported, lossless: chart.lossless };\n\t\t}\n\t};\n\n\treturn {\n\t\tid: options.id ?? 'office-charts',\n\t\t...(options.namespace ? { namespace: options.namespace } : {}),\n\t\ttools: () => [...(options.files ? [listOpenFiles] : []), listCharts, getChart, ...(options.controller && !readOnlyReason() ? [loadChart] : [])]\n\t};\n}\n"],"mappings":"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","names":["open","resolve","fail","READ","DESTRUCTIVE","fail"]}
1
+ {"version":3,"sources":["../../src/chart/raster.ts","../../src/chart/recommend.ts","../../src/chart/commands.ts","../../src/chart/interaction.ts","../../src/chart/tools.ts","../../src/chart/stream.ts","../../src/chart/presence.ts","../../src/chart/office-files.ts","../../src/chart/file-tools.ts"],"sourcesContent":["// Paint resolution before drawing to a canvas follows Ursula's src/react/export.ts `inlineSvgPaint`,\n// and the longest-side bound its `canvasSnapshot`.\nimport { chartToSvg } from './svg.js';\nimport type { ChartSpec, ChartTheme } from './types.js';\n\n/** Longest side, in pixels, of a rasterized chart unless `maxSize` says otherwise. */\nexport const CHART_RASTER_MAX_SIZE = 1024;\n\nexport interface ChartPaintScope {\n\t/**\n\t * Element whose CSS variables, `color` and `font-family` stand in for `var(--x)`,\n\t * `currentColor` and `inherit` (default: the document's root element). Pass the chart's\n\t * container when its theme is scoped (e.g. a `.dark` wrapper).\n\t */\n\tscope?: Element | null;\n\t/** Looks up a custom property (`--name`) instead of `getComputedStyle(scope)`. Return '' when unset. */\n\tlookup?: (name: string) => string;\n}\n\nexport interface RasterizeChartOptions extends ChartPaintScope {\n\t/** Size of the chart in CSS pixels (the SVG's own size). */\n\twidth: number;\n\theight: number;\n\t/** Pixels per CSS pixel (default 2), reduced so the longest side stays within `maxSize`. */\n\tscale?: number;\n\t/** Longest side of the image in pixels (default 1024). */\n\tmaxSize?: number;\n\t/** Fill behind the chart (default white; `transparent` keeps the alpha channel). */\n\tbackground?: string;\n\t/** Document to create the canvas and image in (default: the global one). */\n\tdocument?: Document;\n}\n\nexport interface ChartRasterImage {\n\t/** Base64 PNG, without the `data:` prefix. */\n\tdata: string;\n\tmimeType: 'image/png';\n\t/** Size of the image in pixels. */\n\twidth: number;\n\theight: number;\n}\n\n/** Pixel size of the image for a chart of `width` × `height` CSS pixels: `scale` × the size, longest side ≤ `maxSize`. */\nexport function chartRasterSize(width: number, height: number, scale = 2, maxSize = CHART_RASTER_MAX_SIZE): { width: number; height: number; scale: number } {\n\tif (!(width > 0) || !(height > 0)) throw new Error(`A chart image needs a positive width and height; got ${width} × ${height}.`);\n\tconst factor = Math.min(scale > 0 ? scale : 1, maxSize / Math.max(width, height));\n\treturn { width: Math.max(1, Math.round(width * factor)), height: Math.max(1, Math.round(height * factor)), scale: factor };\n}\n\n/** Index just past the `)` closing the parenthesis opened at `open`, or -1. */\nfunction closingParen(text: string, open: number): number {\n\tlet depth = 0;\n\tfor (let i = open; i < text.length; i++) {\n\t\tif (text[i] === '(') depth++;\n\t\telse if (text[i] === ')' && --depth === 0) return i + 1;\n\t}\n\treturn -1;\n}\n\n/** Replaces every `var(--name, fallback)` in a CSS value; unset variables without a fallback become ''. */\nfunction substituteVars(value: string, lookup: (name: string) => string, depth = 0): string {\n\tlet out = '';\n\tlet i = 0;\n\tfor (let at = value.indexOf('var(', i); at !== -1; at = value.indexOf('var(', i)) {\n\t\tconst end = closingParen(value, at + 3);\n\t\tif (end === -1) break;\n\t\tconst inner = value.slice(at + 4, end - 1);\n\t\tlet comma = -1;\n\t\tfor (let j = 0, d = 0; j < inner.length; j++) {\n\t\t\tif (inner[j] === '(') d++;\n\t\t\telse if (inner[j] === ')') d--;\n\t\t\telse if (inner[j] === ',' && d === 0) {\n\t\t\t\tcomma = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst name = (comma === -1 ? inner : inner.slice(0, comma)).trim();\n\t\tconst fallback = comma === -1 ? '' : inner.slice(comma + 1).trim();\n\t\tconst found = lookup(name).trim();\n\t\tconst resolved = found || fallback;\n\t\tout += value.slice(i, at) + (depth < 8 && resolved.includes('var(') ? substituteVars(resolved, lookup, depth + 1) : resolved);\n\t\ti = end;\n\t}\n\treturn out + value.slice(i);\n}\n\nconst PAINT_ATTRIBUTE = /(\\s)([\\w:-]+)=\"([^\"]*)\"/g;\n\n/**\n * Makes a chart SVG drawable on its own (as an `<img>` or on a canvas, where the page's CSS\n * does not apply): `var(--x, fallback)` becomes the variable's value on `scope` (or the\n * fallback), `currentColor` the scope's colour and `font-family=\"inherit\"` its font. An\n * attribute left empty is dropped, so the renderer's default applies instead of an invalid\n * paint. Text content is left alone.\n */\nexport function resolveChartSvgPaints(svg: string, options: ChartPaintScope = {}): string {\n\tconst doc = (globalThis as { document?: Document }).document;\n\tconst scope = options.scope ?? doc?.documentElement ?? null;\n\tconst view = scope?.ownerDocument?.defaultView ?? (globalThis as { getComputedStyle?: Window['getComputedStyle'] });\n\tlet computed: CSSStyleDeclaration | null | undefined;\n\tconst style = () => {\n\t\tif (computed === undefined) computed = scope && typeof view?.getComputedStyle === 'function' ? view.getComputedStyle(scope) : null;\n\t\treturn computed;\n\t};\n\tconst lookup = options.lookup ?? ((name: string) => style()?.getPropertyValue(name) ?? '');\n\treturn svg.replace(PAINT_ATTRIBUTE, (match, space: string, name: string, raw: string) => {\n\t\tlet value = raw;\n\t\tif (value.includes('var(')) value = substituteVars(value.replace(/&quot;/g, '\"'), lookup).replace(/\"/g, '&quot;');\n\t\tif (/currentcolor/i.test(value)) value = value.replace(/currentcolor/gi, style()?.color || '#000000');\n\t\tif (name === 'font-family' && /^(inherit|unset|initial)$/i.test(value.trim())) value = (style()?.fontFamily || 'sans-serif').replace(/\"/g, \"'\");\n\t\tif (value === raw) return match;\n\t\treturn value.trim() ? `${space}${name}=\"${value}\"` : '';\n\t});\n}\n\nconst NO_DOM =\n\t'Rasterizing a chart needs a browser DOM (document, Image and a 2D canvas). Outside a browser, render SVG with chartToSvg (or render_chart with format \"svg\") and convert it with an SVG renderer, or pass your own rasterize option to createChartToolProvider.';\n\n/** Draws an SVG document onto a canvas and returns the PNG as a data URL. */\nasync function svgToPngDataUrl(svg: string, options: RasterizeChartOptions): Promise<{ url: string; width: number; height: number }> {\n\tconst doc = options.document ?? (globalThis as { document?: Document }).document;\n\tconst ImageCtor = (doc?.defaultView as (Window & typeof globalThis) | null | undefined)?.Image ?? (globalThis as { Image?: typeof Image }).Image;\n\tif (!doc || typeof doc.createElement !== 'function' || !ImageCtor) throw new Error(NO_DOM);\n\tconst size = chartRasterSize(options.width, options.height, options.scale, options.maxSize);\n\tconst canvas = doc.createElement('canvas');\n\tcanvas.width = size.width;\n\tcanvas.height = size.height;\n\tlet context: CanvasRenderingContext2D | null = null;\n\ttry {\n\t\tcontext = canvas.getContext('2d');\n\t} catch {\n\t\tcontext = null;\n\t}\n\tif (!context) throw new Error(NO_DOM);\n\n\tconst drawable = resolveChartSvgPaints(svg, options);\n\tconst image = new ImageCtor();\n\tawait new Promise<void>((resolve, reject) => {\n\t\timage.onload = () => resolve();\n\t\timage.onerror = () => reject(new Error('The chart SVG could not be loaded as an image; check that it is a complete <svg> document with the SVG namespace.'));\n\t\timage.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(drawable)}`;\n\t});\n\tconst background = options.background ?? '#ffffff';\n\tif (background !== 'transparent') {\n\t\tcontext.fillStyle = background;\n\t\tcontext.fillRect(0, 0, size.width, size.height);\n\t}\n\tcontext.drawImage(image, 0, 0, size.width, size.height);\n\tconst url = canvas.toDataURL('image/png');\n\tif (!url.startsWith('data:image/png')) throw new Error('This canvas cannot export PNG (toDataURL returned no image).');\n\treturn { url, width: size.width, height: size.height };\n}\n\n/**\n * Turns a chart SVG (from `chartToSvg`, `chartSceneToSvg` or a live chart's `<svg>`) into a\n * PNG in the browser: resolves CSS-variable paints first (see `resolveChartSvgPaints`, without\n * which they draw black), draws it through an `Image` onto a canvas at `scale` (longest side\n * ≤ `maxSize`, default 1024) over `background`, and returns base64 data. Throws a message\n * saying what to do instead when there is no DOM or canvas.\n */\nexport async function rasterizeChartSvg(svg: string, options: RasterizeChartOptions): Promise<ChartRasterImage> {\n\tconst { url, width, height } = await svgToPngDataUrl(svg, options);\n\treturn { data: url.slice(url.indexOf(',') + 1), mimeType: 'image/png', width, height };\n}\n\n/**\n * A `rasterize` function for `createChartToolProvider` (so `render_chart { format: \"png\" }`\n * works), or `undefined` when there is no DOM to draw with. The React and Svelte\n * `useChartToolProvider` pass one by default.\n */\nexport function createChartRasterizer(\n\toptions: Omit<RasterizeChartOptions, 'width' | 'height'> = {}\n): ((svg: string, size: { width: number; height: number }) => Promise<ChartRasterImage>) | undefined {\n\tconst doc = options.document ?? (globalThis as { document?: Document }).document;\n\tif (!doc || typeof doc.createElement !== 'function') return undefined;\n\treturn (svg, size) => rasterizeChartSvg(svg, { ...options, ...size });\n}\n\nexport interface DownloadChartPngOptions extends Omit<RasterizeChartOptions, 'width' | 'height'> {\n\t/** Chart size in CSS pixels (default 800 × 450). */\n\twidth?: number;\n\theight?: number;\n\t/** File name (default: the chart title, else `chart`, plus `.png`). */\n\tfilename?: string;\n\t/** Colours and type (default: the light default theme, with concrete colours). */\n\ttheme?: Partial<ChartTheme>;\n}\n\n/** A file name for a chart: its title in lower case with dashes, else `chart`, plus the extension. */\nexport function chartFileName(spec: Pick<ChartSpec, 'title'>, extension: string): string {\n\tconst base = (spec.title ?? '')\n\t\t.toLowerCase()\n\t\t.replace(/[^\\p{L}\\p{N}]+/gu, '-')\n\t\t.replace(/^-+|-+$/g, '')\n\t\t.slice(0, 60);\n\treturn `${base || 'chart'}.${extension}`;\n}\n\n/** Renders a chart to PNG (see `rasterizeChartSvg`) and saves it through a download link. Returns the image and the file name. */\nexport async function downloadChartPng(spec: ChartSpec, options: DownloadChartPngOptions = {}): Promise<ChartRasterImage & { filename: string }> {\n\tconst { width = 800, height = 450, filename = chartFileName(spec, 'png'), theme, ...raster } = options;\n\tconst svg = chartToSvg(spec, { width, height, theme });\n\tconst { url, width: w, height: h } = await svgToPngDataUrl(svg, { ...raster, width, height });\n\tconst doc = (raster.document ?? (globalThis as { document?: Document }).document)!;\n\tconst link = doc.createElement('a');\n\tlink.href = url;\n\tlink.download = filename;\n\tlink.style.display = 'none';\n\tdoc.body?.appendChild(link);\n\tlink.click();\n\tlink.remove();\n\treturn { data: url.slice(url.indexOf(',') + 1), mimeType: 'image/png', width: w, height: h, filename };\n}\n","// Ported from gridcraft-main/crates/engine/src/cmd/insert.rs (`series_from_range`, `scatter_x_from_first`,\n// `recommend_charts`) (MIT OR Apache-2.0, © ArtCraft Team and contributors), extended for the chart types\n// this editor adds. See THIRD_PARTY_NOTICES.md.\nimport { parseChartDate } from './date.js';\nimport { chartDataFromTable, parseChartValue } from './spec.js';\nimport type { ChartIssue, ChartSeries, ChartStacking, ChartType } from './types.js';\n\nexport interface ChartTableShape {\n\t/** The first row holds series names (some text, every value cell text or blank). */\n\theaderRow: boolean;\n\t/** The first column holds category labels (all text, or a blank top-left cell above a header row). */\n\tlabelColumn: boolean;\n\t/** Series run along rows (the block is much wider than tall). */\n\tbyRows: boolean;\n\tseries: number;\n\t/** Points per series. */\n\tpoints: number;\n\tanyNumber: boolean;\n\tnonNegative: boolean;\n\tmixedSigns: boolean;\n\t/** The category labels read as dates. */\n\tdates: boolean;\n}\n\nconst blank = (c: unknown) => c === null || c === undefined || String(c).trim() === '';\nconst isText = (c: unknown) => blank(c) || parseChartValue(c) === undefined;\n\n/**\n * Reads the shape of a block of cells the way spreadsheets do: a header row when the first\n * row is text, a label column when the first column is text (or the top-left cell is blank\n * above a header row, the convention for years and x values), and series along the longer side.\n */\nexport function analyzeChartTable(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartTableShape {\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c)));\n\tconst height = grid.length;\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tconst cell = (r: number, c: number) => grid[r]?.[c];\n\tconst headerRow = height > 1 && grid[0].some((c) => !blank(c) && isText(c)) && Array.from({ length: width - 1 }, (_, i) => i + 1).every((c) => isText(cell(0, c)));\n\tconst blankCorner = headerRow && blank(cell(0, 0));\n\tconst labelColumn = width > 1 && (blankCorner || Array.from({ length: height - (headerRow ? 1 : 0) }, (_, i) => i + (headerRow ? 1 : 0)).every((r) => isText(cell(r, 0))));\n\tconst byRows = width > height + 1;\n\tconst dataRows = height - (headerRow ? 1 : 0);\n\tconst dataCols = width - (labelColumn ? 1 : 0);\n\tlet anyNumber = false;\n\tlet nonNegative = true;\n\tlet anyNegative = false;\n\tlet anyPositive = false;\n\tfor (let r = headerRow ? 1 : 0; r < height; r++)\n\t\tfor (let c = labelColumn ? 1 : 0; c < width; c++) {\n\t\t\tconst v = parseChartValue(cell(r, c));\n\t\t\tif (typeof v !== 'number') continue;\n\t\t\tanyNumber = true;\n\t\t\tif (v < 0) {\n\t\t\t\tnonNegative = false;\n\t\t\t\tanyNegative = true;\n\t\t\t} else if (v > 0) anyPositive = true;\n\t\t}\n\tconst labels = byRows ? grid[0]?.slice(labelColumn ? 1 : 0) ?? [] : grid.slice(headerRow ? 1 : 0).map((r) => r[0]);\n\tconst dates = (byRows ? headerRow : labelColumn) && labels.length > 1 && labels.filter((l) => !blank(l) && parseChartDate(String(l)) !== null).length >= labels.length * 0.8;\n\treturn {\n\t\theaderRow,\n\t\tlabelColumn,\n\t\tbyRows,\n\t\tseries: Math.max(0, byRows ? dataRows : dataCols),\n\t\tpoints: Math.max(0, byRows ? dataCols : dataRows),\n\t\tanyNumber,\n\t\tnonNegative,\n\t\tmixedSigns: anyNegative && anyPositive,\n\t\tdates\n\t};\n}\n\nexport interface ChartRecommendation {\n\ttype: ChartType;\n\tstacking?: ChartStacking;\n\tlabel: string;\n\t/** Why it suits the data, as a sentence. */\n\treason: string;\n}\n\n/**\n * Chart types that suit the shape of a block of cells, best first. A heuristic from the shape\n * (series count, points per series, text or date categories, negative values), not a copy of\n * any spreadsheet's ranking.\n */\nexport function recommendChartTypes(rows: ReadonlyArray<ReadonlyArray<unknown>>): ChartRecommendation[] {\n\tconst shape = analyzeChartTable(rows);\n\tif (!shape.anyNumber || !shape.series) return [];\n\treturn recommendForShape(shape);\n}\n\nexport function recommendForShape(shape: Omit<ChartTableShape, 'headerRow' | 'byRows'> & Partial<ChartTableShape>): ChartRecommendation[] {\n\tconst out: ChartRecommendation[] = [];\n\tconst add = (type: ChartType, label: string, reason: string, stacking?: ChartStacking) => out.push({ type, label, reason, ...(stacking ? { stacking } : {}) });\n\tif (shape.series === 2 && !shape.labelColumn && !shape.byRows) {\n\t\tadd('scatter', 'Scatter', 'Two numeric columns without labels: the first is x, the second y.');\n\t\tadd('line', 'Line', 'Shows the second column in order.');\n\t\tadd('bar', 'Column', 'Compares the values side by side.');\n\t\treturn out;\n\t}\n\tif (shape.series === 1 && !shape.labelColumn && shape.points > 20) {\n\t\tadd('histogram', 'Histogram', 'Many unlabelled values: shows how they are distributed.');\n\t\tadd('box', 'Box plot', 'Summarises the spread: quartiles, median and outliers.');\n\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\treturn out;\n\t}\n\tif (shape.dates) {\n\t\tadd('line', 'Line', 'The categories are dates: a line shows change over time.');\n\t\tadd('area', 'Area', 'Shows change over time with volume.');\n\t\tadd('bar', 'Column', 'Compares each period.');\n\t\tif (shape.series > 1) add('area', 'Stacked area', 'Shows how the parts add up over time.', 'stacked');\n\t\treturn out;\n\t}\n\tif (shape.series === 1) {\n\t\tif (shape.points > 12) {\n\t\t\tadd('line', 'Line', 'One long series: a line shows its shape.');\n\t\t\tadd('bar', 'Column', 'Compares every value.');\n\t\t\tadd('area', 'Area', 'Emphasises the volume under the series.');\n\t\t} else {\n\t\t\tadd('bar', 'Column', 'One short series: columns compare the values.');\n\t\t\tif (shape.mixedSigns) add('waterfall', 'Waterfall', 'Positive and negative values: shows how they add up to a total.');\n\t\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\t\tif (shape.nonNegative && shape.points >= 2) {\n\t\t\t\tadd('pie', 'Pie', 'Shares of a whole (all values are positive).');\n\t\t\t\tadd('donut', 'Donut', 'Shares of a whole with the total in the middle.');\n\t\t\t\tif (shape.points >= 5) add('treemap', 'Treemap', 'Compares many shares by area.');\n\t\t\t\tadd('funnel', 'Funnel', 'Shows stages that narrow down.');\n\t\t\t}\n\t\t\tadd('line', 'Line', 'Shows the values in order.');\n\t\t}\n\t\treturn out;\n\t}\n\tif (shape.points > 12) {\n\t\tadd('line', 'Line', 'Several long series: lines keep them readable.');\n\t\tadd('bar', 'Column', 'Compares the series at each category.');\n\t\tadd('area', 'Area', 'Emphasises volume.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t} else {\n\t\tadd('bar', 'Column', 'Several series: clustered columns compare them per category.');\n\t\tadd('bar', 'Bar', 'Horizontal bars fit long category names.');\n\t\tadd('bar', 'Stacked column', 'Shows how the series add up.', 'stacked');\n\t\tadd('line', 'Line', 'Shows the series in order.');\n\t\tif (shape.points >= 3 && shape.series <= 6) add('radar', 'Radar', 'Compares several measures across the series.');\n\t}\n\treturn out;\n}\n\nexport interface ChartFromTable {\n\ttype: ChartType;\n\tstacking: ChartStacking;\n\tcategories: string[];\n\tseries: ChartSeries[];\n\tissues: ChartIssue[];\n\tshape: ChartTableShape;\n}\n\n/**\n * Builds chart data from a block of cells (CSV, a clipboard grid or a spreadsheet range) using\n * the spreadsheet conventions of `analyzeChartTable`. `type: 'auto'` (the default) takes the\n * first recommendation. A scatter chart of a block without labels takes the first column as\n * the x values of the others.\n */\nexport function chartFromTable(rows: ReadonlyArray<ReadonlyArray<unknown>>, options: { type?: ChartType | 'auto' } = {}): ChartFromTable {\n\tconst shape = analyzeChartTable(rows);\n\tconst rec = (options.type ?? 'auto') === 'auto' ? recommendForShape(shape)[0] : undefined;\n\tconst type = rec?.type ?? (options.type === 'auto' || !options.type ? 'bar' : options.type);\n\tconst stacking = rec?.stacking ?? 'none';\n\tconst grid = rows.filter((r) => r.some((c) => !blank(c))).map((r) => [...r]);\n\t// Without a header row, invent one so chartDataFromTable reads every row as data.\n\tconst width = Math.max(0, ...grid.map((r) => r.length));\n\tlet table = grid;\n\tif (!shape.labelColumn) table = table.map((r, i) => [shape.headerRow && i === 0 ? '' : String(i + (shape.headerRow ? 0 : 1)), ...r]);\n\tif (!shape.headerRow) table = [['', ...Array.from({ length: width }, (_, i) => `Series ${i + 1}`)], ...table];\n\tconst xFromFirst = type === 'scatter' && !shape.labelColumn && !shape.byRows && shape.series > 1;\n\tif (xFromFirst) {\n\t\t// The first data column becomes x: move it into the label column.\n\t\ttable = table.map((r) => [r[1], ...r.slice(2)]);\n\t}\n\tconst data = chartDataFromTable(table, { seriesIn: shape.byRows ? 'rows' : 'columns', header: true, xFromFirstColumn: xFromFirst });\n\treturn { type, stacking, categories: data.categories, series: data.series, issues: data.issues, shape };\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartToOoxml } from './ooxml.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { recommendChartTypes } from './recommend.js';\nimport { CATEGORY_REF, CHART_UPDATE_PROPERTIES, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { chartColorsByCategory, chartDataToTable, chartSeriesColor, chartSliceColor } from './spec.js';\nimport { summarizeChart } from './summary.js';\nimport { chartToSvg } from './svg.js';\nimport type { ChartTrendline } from './types.js';\n\nexport interface ChartCommandOptions {\n\t/** Id prefix (default `chart.`); use one per chart when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Chart`). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst check = (result: { ok: boolean; message?: string }) => {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n};\n\n/**\n * Palette and agent commands for a chart: describe, update presentation, replace data, set\n * values, add / remove series, categories and trendlines, apply presets, switch rows and\n * columns, import CSV or Mermaid, export SVG, Mermaid or Office XML, recommend types and\n * check colours. Register them in a `CommandRegistry` and agents get them through\n * `createCommandToolProvider`; `createChartToolProvider` offers the same operations as\n * individual tools. Failures throw sentences, which the registry returns as\n * `{ ok: false, code: 'failed', message }`.\n */\nexport function createChartCommands(controller: ChartController, options: ChartCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'chart.';\n\tconst base = { group: options.group ?? 'Chart', ...(options.scope ? { scope: options.scope } : {}) };\n\tconst seriesIds = () => controller.getSpec().series.map((s) => s.id);\n\tconst resolveSeries = (ref: string) => {\n\t\tconst spec = controller.getSpec();\n\t\tconst series = spec.series.find((s) => s.id === ref) ?? spec.series.find((s) => s.name === ref);\n\t\tif (!series) fail(`There is no series \"${ref}\"; expected one of ${seriesIds().map((id) => `\"${id}\"`).join(', ') || '(none yet)'}.`);\n\t\treturn series!;\n\t};\n\tconst resolveCategory = (ref: string | number) => {\n\t\tconst categories = controller.getSpec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (index < 0 || index >= categories.length || !Number.isInteger(index)) fail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of the labels.`);\n\t\treturn index;\n\t};\n\tconst object = (properties: Record<string, unknown>, required?: string[]) => ({ type: 'object' as const, properties, ...(required ? { required } : {}), additionalProperties: false }) as any;\n\n\treturn [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}describe`,\n\t\t\tlabel: 'Describe Chart',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'data', 'spec', 'get', 'summary'],\n\t\t\tdescription: 'Returns the chart spec, its data as a table (series names in the header row) and a summary: per-series min / max / mean / trend, axes as drawn, layout warnings and a colour check.',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => {\n\t\t\t\tconst spec = controller.getSpec();\n\t\t\t\treturn { spec: controller.toJSON(), table: chartDataToTable(spec), summary: summarizeChart(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 }), issues: controller.getState().issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}update`,\n\t\t\tlabel: 'Change Chart…',\n\t\t\tkeywords: ['chart', 'title', 'axis', 'legend', 'stack', 'style', 'format', 'type'],\n\t\t\tdescription:\n\t\t\t\t'Changes chart presentation as one undo step: type, titles, axes (xAxis = categories, yAxis = values, yAxis2 = secondary values; reverse, and scale \"log\" on value axes), legend, stacking, orientation, curve, points, data labels, palette, donut hole, bar spacing, histogram bins or waterfall total. Invalid values change nothing and return why.',\n\t\t\tparams: object(CHART_UPDATE_PROPERTIES),\n\t\t\trun: (_ctx: unknown, params: ChartSpecPatch) => {\n\t\t\t\tcheck(controller.update(params));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setData`,\n\t\t\tlabel: 'Replace Chart Data…',\n\t\t\tkeywords: ['chart', 'data', 'series', 'categories'],\n\t\t\tdescription: 'Replaces the categories and series as one undo step. Each series has one value per category (padded with gaps).',\n\t\t\tparams: object({\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: { type: 'array', description: 'The new series.', items: object({ id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, ['name', 'values']) }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { categories?: string[]; series?: any[] }) => {\n\t\t\t\tcheck(controller.setData(params));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}setValues`,\n\t\t\tlabel: 'Set Chart Values…',\n\t\t\tkeywords: ['chart', 'value', 'cell', 'edit'],\n\t\t\tdescription: 'Sets individual values as one undo step. Series by id or name; category by index or label.',\n\t\t\tparams: object({ cells: { type: 'array', minItems: 1, description: 'Values to set.', items: object({ series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, ['series', 'category', 'value']) } }, ['cells']),\n\t\t\trun: (_ctx: unknown, params: { cells: { series: string; category: string | number; value: unknown }[] }) => {\n\t\t\t\tcheck(controller.setValues(params.cells.map((c) => ({ seriesId: resolveSeries(c.series).id, index: resolveCategory(c.category), value: c.value }))));\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addSeries`,\n\t\t\tlabel: 'Add Series',\n\t\t\tkeywords: ['chart', 'series', 'new'],\n\t\t\tdescription: 'Adds a series (default: an empty one at the end). Returns its id.',\n\t\t\tparams: object({ ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } }),\n\t\t\trun: (_ctx: unknown, params: { at?: number; name?: string; values?: unknown[] } = {}) => {\n\t\t\t\tconst { at, ...input } = params ?? {};\n\t\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\t\tconst result = controller.addSeries(clean as any, { at });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { id: (result as { id: string }).id };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}updateSeries`,\n\t\t\tlabel: 'Change Series…',\n\t\t\tkeywords: ['chart', 'series', 'rename', 'colour', 'color', 'hide', 'axis', 'marker'],\n\t\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn, including error bars (null resets a field).',\n\t\t\tparams: object({ series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & Record<string, unknown>) => {\n\t\t\t\tconst { series, ...patch } = params;\n\t\t\t\tconst id = resolveSeries(series).id;\n\t\t\t\tcheck(controller.updateSeries(id, patch as any));\n\t\t\t\treturn { series: controller.getSeries(id) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeSeries`,\n\t\t\tlabel: 'Delete Series',\n\t\t\tkeywords: ['chart', 'series', 'remove'],\n\t\t\tdescription: 'Deletes a series by id or name.',\n\t\t\tparams: object({ series: SERIES_REF }, ['series']),\n\t\t\trun: (_ctx: unknown, params: { series: string }) => {\n\t\t\t\tcheck(controller.removeSeries(resolveSeries(params.series).id));\n\t\t\t\treturn { series: seriesIds() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addCategory`,\n\t\t\tlabel: 'Add Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'label'],\n\t\t\tdescription: 'Inserts a category (gaps in every series) at `at` (default: the end).',\n\t\t\tparams: object({ label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } }),\n\t\t\trun: (_ctx: unknown, params: { label?: string; at?: number } = {}) => controller.addCategory(params?.label, { at: params?.at })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeCategory`,\n\t\t\tlabel: 'Delete Category',\n\t\t\tkeywords: ['chart', 'category', 'row', 'remove'],\n\t\t\tdescription: 'Deletes a category (and its values) by index or label.',\n\t\t\tparams: object({ category: CATEGORY_REF }, ['category']),\n\t\t\trun: (_ctx: unknown, params: { category: string | number }) => {\n\t\t\t\tcheck(controller.removeCategory(resolveCategory(params.category)));\n\t\t\t\treturn { categories: controller.getSpec().categories };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}addTrendline`,\n\t\t\tlabel: 'Add Trendline…',\n\t\t\tkeywords: ['chart', 'trend', 'regression', 'fit', 'forecast', 'moving average'],\n\t\t\tdescription: 'Fits a trendline to a series (linear, exponential, logarithmic, power, polynomial or moving average). Returns its index and the fit.',\n\t\t\tparams: object({ series: SERIES_REF, ...TRENDLINE_PROPS }, ['series', 'type']),\n\t\t\trun: (_ctx: unknown, params: { series: string } & ChartTrendline) => {\n\t\t\t\tconst { series, ...line } = params;\n\t\t\t\tconst result = controller.addTrendline(resolveSeries(series).id, line);\n\t\t\t\tcheck(result);\n\t\t\t\tconst ok = result as { index: number; fit: { coefficients: number[]; r2: number | null; equation: string } | null };\n\t\t\t\treturn { index: ok.index, ...(ok.fit ? { coefficients: ok.fit.coefficients, r2: ok.fit.r2, equation: ok.fit.equation } : {}) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}removeTrendline`,\n\t\t\tlabel: 'Delete Trendline',\n\t\t\tkeywords: ['chart', 'trend', 'remove'],\n\t\t\tdescription: 'Deletes a trendline from a series.',\n\t\t\tparams: object({ series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index (0 = first).' } }, ['series', 'index']),\n\t\t\trun: (_ctx: unknown, params: { series: string; index: number }) => {\n\t\t\t\tcheck(controller.removeTrendline(resolveSeries(params.series).id, params.index));\n\t\t\t\treturn { trendlines: controller.getSeries(resolveSeries(params.series).id)?.trendlines ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}applyPreset`,\n\t\t\tlabel: 'Apply Chart Style…',\n\t\t\tkeywords: ['chart', 'quick layout', 'style', 'colours', 'colors', 'monochrome', 'theme'],\n\t\t\tdescription: 'Applies a quick layout and / or colour scheme as one undo step.',\n\t\t\tparams: object({\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t}),\n\t\t\trun: (_ctx: unknown, params: { layout?: string; colors?: string } = {}) => {\n\t\t\t\tcheck(controller.applyPreset(params ?? {}));\n\t\t\t\treturn { spec: controller.toJSON() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}transpose`,\n\t\t\tlabel: 'Switch Rows and Columns',\n\t\t\tkeywords: ['chart', 'transpose', 'swap', 'rows', 'columns', 'series'],\n\t\t\tdescription: 'Swaps series and categories as one undo step.',\n\t\t\trun: () => {\n\t\t\t\tcheck(controller.transpose());\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importCsv`,\n\t\t\tlabel: 'Import Chart Data from CSV…',\n\t\t\tkeywords: ['chart', 'csv', 'tsv', 'paste', 'import'],\n\t\t\tdescription: 'Replaces the data with CSV / TSV text: by default the first column holds categories and the first row series names.',\n\t\t\tparams: object(\n\t\t\t\t{\n\t\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text.' },\n\t\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows.' },\n\t\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names (default true).' }\n\t\t\t\t},\n\t\t\t\t['csv']\n\t\t\t),\n\t\t\trun: (_ctx: unknown, params: { csv: string; seriesIn?: 'columns' | 'rows'; header?: boolean | 'auto' }) => {\n\t\t\t\tconst result = controller.importCsv(params.csv, { seriesIn: params.seriesIn, header: params.header });\n\t\t\t\tcheck(result);\n\t\t\t\treturn { table: chartDataToTable(controller.getSpec()), issues: result.issues ?? [] };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}importMermaid`,\n\t\t\tlabel: 'Import Mermaid Chart…',\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'xychart', 'pie', 'radar', 'import'],\n\t\t\tdescription: 'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text (one undo step). Unreadable lines are listed with line numbers.',\n\t\t\tparams: object({ mermaid: { type: 'string', description: 'Mermaid text.' } }, ['mermaid']),\n\t\t\trun: (_ctx: unknown, params: { mermaid: string }) => {\n\t\t\t\tconst read = chartFromMermaid(params.mermaid);\n\t\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\t\tcheck(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportMermaid`,\n\t\t\tlabel: 'Copy Chart as Mermaid',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'mermaid', 'markdown', 'export'],\n\t\t\tdescription: 'Returns the chart as Mermaid text (with a round-trip comment unless meta is false).',\n\t\t\tparams: object({ meta: { type: 'boolean', description: 'Include the %% @pixerate round-trip comment (default true).' } }),\n\t\t\trun: (_ctx: unknown, params: { meta?: boolean } = {}) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta: params?.meta }) })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportOoxml`,\n\t\t\tlabel: 'Export Chart as Office XML',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'office', 'word', 'powerpoint', 'docx', 'pptx', 'xml', 'export'],\n\t\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) and what could not be written.',\n\t\t\trun: () => chartToOoxml(controller.toJSON())\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}exportSvg`,\n\t\t\tlabel: 'Export Chart as SVG',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'svg', 'export', 'image'],\n\t\t\tdescription: 'Returns the chart drawn as a standalone, accessible SVG string (with <title> and <desc>).',\n\t\t\tparams: object({ width: WIDTH, height: HEIGHT }),\n\t\t\trun: (_ctx: unknown, params: { width?: number; height?: number } = {}) => ({\n\t\t\t\tsvg: chartToSvg(controller.toJSON(), { width: params?.width ?? 640, height: params?.height ?? 400 })\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}recommend`,\n\t\t\tlabel: 'Recommend Chart Types',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'recommend', 'suggest', 'type'],\n\t\t\tdescription: 'Suggests chart types for the current data (or CSV), best first, each with a reason.',\n\t\t\tparams: object({ csv: { type: 'string', description: 'CSV text to analyse instead of the current data.' } }),\n\t\t\trun: (_ctx: unknown, params: { csv?: string } = {}) => ({\n\t\t\t\trecommendations: recommendChartTypes(params?.csv !== undefined ? parseCsv(params.csv) : chartDataToTable(controller.getSpec()))\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}checkColors`,\n\t\t\tlabel: 'Check Chart Colours',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['chart', 'colour', 'color', 'accessibility', 'colour-blind', 'contrast'],\n\t\t\tdescription: 'Checks that the series colours can be told apart (including with colour-blindness) and stand out from the background.',\n\t\t\trun: () => {\n\t\t\t\tconst s = controller.getSpec();\n\t\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\t\tconst colors = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\t\treturn { colors, ...checkChartColors(colors) };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Chart Edit',\n\t\t\tkeywords: ['chart', 'undo'],\n\t\t\tenabled: () => controller.getState().canUndo || 'Nothing to undo',\n\t\t\trun: () => ({ undone: controller.undo() })\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Chart Edit',\n\t\t\tkeywords: ['chart', 'redo'],\n\t\t\tenabled: () => controller.getState().canRedo || 'Nothing to redo',\n\t\t\trun: () => ({ redone: controller.redo() })\n\t\t}\n\t];\n}\n","// Drag behaviour follows effectcraft-main/crates/ui-egui/src/panels/graph.rs and graph_tools.rs (the value axis\n// is frozen while a key is dragged, Shift locks to the axis that moved most, `snap_px` picks the nearest\n// candidate within a few screen pixels) and lightcraft-main's curve tests (Alt moves a tenth as far)\n// (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { ChartController } from './controller.js';\nimport { chartValueAtPoint, chartXAtPoint, snapChartValue } from './layout.js';\nimport { chartScaleToPixel } from './scale.js';\nimport { chartFamily } from './spec.js';\nimport type { ChartScene, ChartSelection, ChartValueScale } from './types.js';\n\n/** Scene coordinates of a pointer, given the rendered element's box (the scene is scaled to fit it). */\nexport function chartClientToScene(scene: Pick<ChartScene, 'width' | 'height'>, box: { left: number; top: number; width: number; height: number }, clientX: number, clientY: number): { x: number; y: number } {\n\tconst sx = box.width ? scene.width / box.width : 1;\n\tconst sy = box.height ? scene.height / box.height : 1;\n\treturn { x: (clientX - box.left) * sx, y: (clientY - box.top) * sy };\n}\n\n/**\n * Whether a point can be dragged to a new value in this scene: bar, line, area and scatter\n * charts (not percent-stacked), scatter and bubble charts with x values (x and y), and\n * waterfall steps. Hidden series and gaps cannot be dragged.\n */\nexport function canDragChartPoint(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined): target is Extract<ChartSelection, { kind: 'point' }> {\n\tif (target?.kind !== 'point' || !scene.valueScale || scene.percent) return false;\n\tconst spec = controller.getSpec();\n\tconst family = chartFamily(spec);\n\tif (family !== 'cartesian' && family !== 'xy' && family !== 'waterfall') return false;\n\tconst series = controller.getSeries(target.seriesId);\n\treturn !!series && !series.hidden && series.values[target.index] !== null;\n}\n\nexport interface ChartDragMoveOptions {\n\t/** Move a tenth as far as the pointer (fine adjustment; Alt). */\n\tfine?: boolean;\n\t/** Only change the axis the pointer has moved along most (scatter charts; Shift). */\n\tlockAxis?: boolean;\n\t/** Skip snapping to nearby values and ticks (e.g. while Ctrl / Cmd is held). */\n\tnoSnap?: boolean;\n}\n\nexport interface ChartPointDrag {\n\t/**\n\t * The value axis range when the drag started. Pass it to `layoutChart` (`valueDomain`)\n\t * until `end()` so the axis does not rescale under the pointer.\n\t */\n\treadonly valueDomain: { min: number; max: number };\n\t/** The secondary value axis range when the drag started (`layoutChart`'s `valueDomain2`). */\n\treadonly valueDomain2?: { min: number; max: number };\n\t/** The numeric x range of a scatter or bubble chart when the drag started (`xDomain`). */\n\treadonly xDomain?: { min: number; max: number };\n\t/** The point being dragged, for `layoutChart`'s `readout`. */\n\treadonly target: { seriesId: string; index: number };\n\t/** Moves the value with the pointer (scene coordinates). */\n\tmove(point: { x: number; y: number }, options?: ChartDragMoveOptions): void;\n\t/** Ends the drag (one undo step for the whole drag). */\n\tend(): void;\n\t/** Cancels the drag: the value goes back and no undo step is left (Escape). */\n\tcancel(): void;\n}\n\nexport interface ChartSnapOptions {\n\t/** Values to snap to when the pointer is within `tolerancePx` of them. */\n\tcandidates?: readonly number[];\n\t/** Screen distance that snaps (default 6). */\n\ttolerancePx?: number;\n\t/** Fallback step when no candidate is close (default: a tenth of the tick step). */\n\tstep?: number;\n\t/** The scale the value is on (default: the scene's value scale). */\n\tscale?: ChartValueScale;\n}\n\n/**\n * Snaps a dragged value: to the nearest candidate (other series at the same category, the\n * neighbouring values, zero, the start value, ticks) within `tolerancePx` screen pixels, or\n * else to a tenth of the tick step.\n */\nexport function snapChartDragValue(scene: ChartScene, value: number, options: ChartSnapOptions = {}): number {\n\tconst scale = options.scale ?? scene.valueScale;\n\tconst tolerance = options.tolerancePx ?? 6;\n\tif (scale) {\n\t\tconst px = (v: number) => chartScaleToPixel(v, scale);\n\t\tconst at = px(value);\n\t\tlet best: number | null = null;\n\t\tlet bestDist = tolerance;\n\t\tfor (const c of [...(options.candidates ?? []), ...scale.ticks]) {\n\t\t\tif (!Number.isFinite(c)) continue;\n\t\t\tconst d = Math.abs(px(c) - at);\n\t\t\tif (!Number.isFinite(d)) continue;\n\t\t\tif (d <= bestDist) {\n\t\t\t\tbest = c;\n\t\t\t\tbestDist = d;\n\t\t\t}\n\t\t}\n\t\tif (best !== null) return best;\n\t}\n\treturn snapChartValue(scene, value, options.step, scale?.ticks, scale?.logBase);\n}\n\n/**\n * Starts dragging a bar or point: the value follows the pointer along its value axis (and\n * along x on scatter and bubble charts), snapped to nearby values and then to a tenth of the\n * tick step (`step` overrides), and the whole drag is one undo step. Works for stacked bars\n * too (the drag changes the segment by the distance moved). Returns `null` when the target\n * cannot be dragged.\n */\nexport function startChartPointDrag(controller: ChartController, scene: ChartScene, target: ChartSelection | undefined, start: { x: number; y: number }, options: { step?: number; tolerancePx?: number } = {}): ChartPointDrag | null {\n\tif (!canDragChartPoint(controller, scene, target)) return null;\n\tconst { seriesId, index } = target;\n\tconst spec = controller.getSpec();\n\tconst series = controller.getSeries(seriesId)!;\n\tconst secondary = series.axis === 'secondary' && !!scene.valueScale2;\n\tconst scale = secondary ? scene.valueScale2! : scene.valueScale!;\n\tconst xy = chartFamily(spec) === 'xy' && !!scene.xScale;\n\tconst startValue = series.values[index] ?? 0;\n\tconst startX = series.x?.[index] ?? null;\n\tconst startAt = chartValueAtPoint(scene, start, secondary);\n\tconst startAtX = xy ? chartXAtPoint(scene, start) : undefined;\n\tif (startAt === undefined) return null;\n\t// Nearby values worth snapping to: zero, where the drag started, other series at this\n\t// category and this series' neighbours.\n\tconst candidates = [0, startValue];\n\tif (!xy) {\n\t\tfor (const s of spec.series) if (s.id !== seriesId && !s.hidden && (s.axis === 'secondary') === secondary) candidates.push(s.values[index] ?? NaN);\n\t\tcandidates.push(series.values[index - 1] ?? NaN, series.values[index + 1] ?? NaN);\n\t}\n\tcontroller.beginGesture(`drag:${seriesId}:${index}`);\n\tlet ended = false;\n\tconst [min, max] = scene.valueScale!.domain;\n\tconst label = `Drag ${series.name}`;\n\treturn {\n\t\tvalueDomain: { min, max },\n\t\t...(scene.valueScale2 ? { valueDomain2: { min: scene.valueScale2.domain[0], max: scene.valueScale2.domain[1] } } : {}),\n\t\t...(xy ? { xDomain: { min: scene.xScale!.domain[0], max: scene.xScale!.domain[1] } } : {}),\n\t\ttarget: { seriesId, index },\n\t\tmove(point, moveOptions = {}) {\n\t\t\tif (ended) return;\n\t\t\tconst at = chartValueAtPoint(scene, point, secondary);\n\t\t\tif (at === undefined) return;\n\t\t\tconst factor = moveOptions.fine ? 0.1 : 1;\n\t\t\t// Linear axes move by the distance the pointer moved; log axes by the ratio, so the\n\t\t\t// point stays under the pointer.\n\t\t\tconst moved = (from: number, to: number, s: ChartValueScale, value: number) =>\n\t\t\t\ts.logBase && value > 0 && from > 0 && to > 0 ? value * Math.pow(to / from, factor) : value + (to - from) * factor;\n\t\t\tlet moveY = true;\n\t\t\tlet moveX = false;\n\t\t\tlet atX: number | undefined;\n\t\t\tif (xy && startX !== null && startAtX !== undefined) {\n\t\t\t\tatX = chartXAtPoint(scene, point);\n\t\t\t\tmoveX = atX !== undefined;\n\t\t\t\tif (moveOptions.lockAxis) {\n\t\t\t\t\t// Keep the axis the pointer moved further along (in pixels).\n\t\t\t\t\tif (Math.abs(point.x - start.x) >= Math.abs(point.y - start.y)) moveY = false;\n\t\t\t\t\telse moveX = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst snap = (v: number, s: ChartValueScale, c: readonly number[]) => {\n\t\t\t\tif (moveOptions.noSnap) return Number(v.toPrecision(12));\n\t\t\t\tif (moveOptions.fine) {\n\t\t\t\t\tif (s.logBase && !options.step) return v > 0 ? Number(v.toPrecision(3)) : v;\n\t\t\t\t\tconst unit = options.step ? options.step / 10 : s.ticks.length > 1 ? (s.ticks[1] - s.ticks[0]) / 100 : undefined;\n\t\t\t\t\treturn snapChartValue(scene, v, unit, s.ticks);\n\t\t\t\t}\n\t\t\t\treturn snapChartDragValue(scene, v, { candidates: c, tolerancePx: options.tolerancePx, step: options.step, scale: s });\n\t\t\t};\n\t\t\tconst y = moveY ? snap(moved(startAt, at, scale, startValue), scale, candidates) : startValue;\n\t\t\tif (xy && startX !== null) {\n\t\t\t\tconst nextX = moveX ? moved(startAtX!, atX!, scene.xScale!, startX) : startX;\n\t\t\t\tconst x = nextX !== startX ? snap(nextX, scene.xScale!, [0, startX]) : startX;\n\t\t\t\tconst xs = [...(series.x ?? [])];\n\t\t\t\txs[index] = x;\n\t\t\t\tcontroller.setValue(seriesId, index, y, { label });\n\t\t\t\tif (x !== controller.getSeries(seriesId)?.x?.[index]) controller.updateSeries(seriesId, { x: xs });\n\t\t\t} else controller.setValue(seriesId, index, y, { label });\n\t\t},\n\t\tend() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.endGesture();\n\t\t},\n\t\tcancel() {\n\t\t\tif (ended) return;\n\t\t\tended = true;\n\t\t\tcontroller.cancelGesture();\n\t\t}\n\t};\n}\n\nexport interface ChartKeyInput {\n\tkey: string;\n\tshiftKey?: boolean;\n\taltKey?: boolean;\n\tmetaKey?: boolean;\n\tctrlKey?: boolean;\n}\n\n/**\n * Keyboard editing on a focused chart: arrows move a point selection between categories\n * (← →) and change its value (↑ ↓, a tenth of the tick step; Shift: a whole step; Alt: a\n * hundredth), Delete / Backspace deletes the selection, Escape cancels a drag or clears the\n * selection. Returns `true` when the key was used (call `preventDefault`).\n */\nexport function handleChartKey(controller: ChartController, scene: ChartScene | null, event: ChartKeyInput): boolean {\n\tif (event.metaKey || event.ctrlKey) return false;\n\tconst { selection, spec, gesture } = controller.getState();\n\tswitch (event.key) {\n\t\tcase 'Escape':\n\t\t\tif (gesture) {\n\t\t\t\tcontroller.cancelGesture();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!selection) return false;\n\t\t\tcontroller.select(null);\n\t\t\treturn true;\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (event.altKey || !selection || selection.kind === 'chart') return false;\n\t\t\tcontroller.deleteSelection();\n\t\t\treturn true;\n\t\tcase 'ArrowLeft':\n\t\tcase 'ArrowRight': {\n\t\t\tif (event.altKey || (selection?.kind !== 'point' && selection?.kind !== 'category')) return false;\n\t\t\tconst n = spec.categories.length;\n\t\t\tconst index = Math.max(0, Math.min(n - 1, selection.index + (event.key === 'ArrowRight' ? 1 : -1)));\n\t\t\tcontroller.select({ ...selection, index });\n\t\t\treturn true;\n\t\t}\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowDown': {\n\t\t\tif (selection?.kind !== 'point' || scene?.percent) return false;\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst secondary = series?.axis === 'secondary';\n\t\t\tconst scale = (secondary ? scene?.valueScale2 : null) ?? scene?.valueScale;\n\t\t\tconst ticks = scale?.ticks ?? [];\n\t\t\tconst up = event.key === 'ArrowUp';\n\t\t\tconst current = series?.values[selection.index] ?? null;\n\t\t\tif (scale?.logBase && current !== null && current > 0) {\n\t\t\t\t// Log axes step by ratios: a tenth of a power of the base (Shift: a whole power; Alt: a hundredth).\n\t\t\t\tconst power = event.shiftKey ? 1 : event.altKey ? 0.01 : 0.1;\n\t\t\t\tconst next = Number((current * Math.pow(scale.logBase, up ? power : -power)).toPrecision(event.altKey ? 4 : 3));\n\t\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, next - current);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst step = ticks.length > 1 ? ticks[1] - ticks[0] : 1;\n\t\t\tconst amount = event.shiftKey ? step : event.altKey ? step / 100 : step / 10;\n\t\t\tcontroller.nudgeValue(selection.seriesId, selection.index, amount * (up ? 1 : -1));\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A short description of the selection for an inspector heading or a screen reader. */\nexport function describeChartSelection(controller: ChartController, selection: ChartSelection | null = controller.getState().selection): string {\n\tif (!selection) return 'Nothing selected';\n\tconst spec = controller.getSpec();\n\tswitch (selection.kind) {\n\t\tcase 'chart':\n\t\t\treturn 'Chart';\n\t\tcase 'title':\n\t\t\treturn 'Title';\n\t\tcase 'subtitle':\n\t\t\treturn 'Subtitle';\n\t\tcase 'legend':\n\t\t\treturn 'Legend';\n\t\tcase 'axis':\n\t\t\treturn selection.axis === 'x' ? (chartFamily(spec) === 'xy' ? 'X axis' : 'Category axis') : selection.axis === 'y' ? 'Value axis' : 'Secondary value axis';\n\t\tcase 'series':\n\t\t\treturn `Series \"${controller.getSeries(selection.seriesId)?.name ?? selection.seriesId}\"`;\n\t\tcase 'category':\n\t\t\treturn `Category \"${spec.categories[selection.index] ?? selection.index}\"`;\n\t\tcase 'trendline': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst line = series?.trendlines?.[selection.index];\n\t\t\treturn `${line ? line.type.replace('-', ' ') : 'Trendline'} trendline on \"${series?.name ?? selection.seriesId}\"`;\n\t\t}\n\t\tcase 'point': {\n\t\t\tconst series = controller.getSeries(selection.seriesId);\n\t\t\tconst value = series?.values[selection.index];\n\t\t\tconst x = series?.x?.[selection.index];\n\t\t\tif (x !== undefined && x !== null && chartFamily(spec) === 'xy') return `${series?.name ?? selection.seriesId}: (${x}, ${value ?? 'blank'})`;\n\t\t\treturn `${series?.name ?? selection.seriesId} · ${spec.categories[selection.index] ?? selection.index}: ${value ?? 'blank'}`;\n\t\t}\n\t}\n}\n\n/**\n * The mark under a scene point (topmost first), for hosts without DOM events and for agents\n * that drive the pointer: rects, circles, lines (within 4 px) and text boxes. Returns the\n * mark's `target`, or `{ kind: 'chart' }` over the background, or `null` outside.\n */\nexport function chartHitTest(scene: ChartScene, point: { x: number; y: number }, measure: (text: string, size: number, weight?: number) => number = (t, s, w = 400) => t.length * s * (w >= 600 ? 0.6 : 0.56)): ChartSelection | null {\n\tfor (let i = scene.marks.length - 1; i >= 0; i--) {\n\t\tconst m = scene.marks[i];\n\t\tif (!m.target || m.role === 'selection' || m.role === 'background') continue;\n\t\tlet hit = false;\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect':\n\t\t\t\thit = point.x >= m.x && point.x <= m.x + m.width && point.y >= m.y && point.y <= m.y + m.height;\n\t\t\t\tbreak;\n\t\t\tcase 'circle':\n\t\t\t\thit = Math.hypot(point.x - m.cx, point.y - m.cy) <= Math.max(m.r, 4) + 2;\n\t\t\t\tbreak;\n\t\t\tcase 'line': {\n\t\t\t\tconst dx = m.x2 - m.x1;\n\t\t\t\tconst dy = m.y2 - m.y1;\n\t\t\t\tconst len2 = dx * dx + dy * dy;\n\t\t\t\tconst t = len2 ? Math.max(0, Math.min(1, ((point.x - m.x1) * dx + (point.y - m.y1) * dy) / len2)) : 0;\n\t\t\t\thit = Math.hypot(point.x - (m.x1 + t * dx), point.y - (m.y1 + t * dy)) <= 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tif (m.rotate) break;\n\t\t\t\tconst w = measure(m.text, m.size, m.weight);\n\t\t\t\tconst x0 = m.anchor === 'start' ? m.x : m.anchor === 'end' ? m.x - w : m.x - w / 2;\n\t\t\t\tconst y0 = m.baseline === 'top' ? m.y : m.baseline === 'bottom' ? m.y - m.size : m.y - m.size / 2;\n\t\t\t\thit = point.x >= x0 - 2 && point.x <= x0 + w + 2 && point.y >= y0 - 2 && point.y <= y0 + m.size + 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tif (hit) return m.target;\n\t}\n\treturn point.x >= 0 && point.y >= 0 && point.x <= scene.width && point.y <= scene.height ? { kind: 'chart' } : null;\n}\n","// The render-preview, pointer-gesture and key tools follow the conventions of the craft apps' MCP servers\n// (vectorcraft-main/crates/mcp/src/tools.rs `render_preview`, lightcraft-main `pointer_gesture`,\n// designcraft-main `key`) (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport { parseCsv } from '../spreadsheet/csv.js';\nimport { checkChartColors } from './color.js';\nimport type { ChartController, ChartSeriesPatch, ChartSpecPatch } from './controller.js';\nimport { chartHitTest, handleChartKey, startChartPointDrag } from './interaction.js';\nimport { layoutChart } from './layout.js';\nimport { chartFromMermaid, chartToMermaid } from './mermaid.js';\nimport { chartFromOoxml, chartToOoxml } from './ooxml.js';\nimport type { ChartDirector, ChartDirectorActor } from './presence.js';\nimport { CHART_COLOR_SCHEMES, CHART_LAYOUT_PRESETS } from './presets.js';\nimport { chartFromTable, recommendChartTypes } from './recommend.js';\nimport {\n\tparseChartValue,\n\tCHART_AXIS_KINDS,\n\tCHART_CURVES,\n\tCHART_LABEL_POSITIONS,\n\tCHART_LEGEND_POSITIONS,\n\tCHART_MARKERS,\n\tCHART_NUMBER_STYLES,\n\tCHART_ORIENTATIONS,\n\tCHART_SERIES_TYPES,\n\tCHART_STACKINGS,\n\tCHART_TRENDLINE_TYPES,\n\tCHART_TYPES,\n\tchartColorsByCategory,\n\tchartDataToTable,\n\tchartSeriesColor,\n\tchartSliceColor\n} from './spec.js';\nimport { AXIS, CATEGORY_REF, CHART_UPDATE_PROPERTIES, FORMAT, HEIGHT, SERIES_PROPS, SERIES_REF, TRENDLINE_PROPS, VALUE, WIDTH } from './schemas.js';\nimport { describeChart, summarizeChart } from './summary.js';\nimport { chartSceneToSvg } from './svg.js';\nimport type { ChartSelection, ChartTrendline } from './types.js';\n\ntype ParserCtor = { new (): DOMParser };\n\nexport interface ChartToolProviderOptions {\n\t/** Provider id (unique per registry). Default `chart`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/**\n\t * The chart cannot be edited: write tools are hidden and `get_chart` says why. A string\n\t * is the reason (\"The report is locked\").\n\t */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** Size used for summaries, previews and pointer gestures (default 640 × 400). */\n\tsize?: { width: number; height: number };\n\t/** Enables `import_chart_ooxml` (reading Office chart XML needs a DOMParser). Default: the global one, if any. */\n\tDOMParser?: ParserCtor;\n\t/**\n\t * Acts out `set_chart_values` and `select_chart_element` with a visible cursor (see\n\t * `ChartDirector`); each call is still one undo step. Without it, edits apply at once.\n\t */\n\tdirector?: ChartDirector;\n\t/** Who the cursor belongs to (default `{ id: 'agent', name: 'Agent' }`). */\n\tactor?: ChartDirectorActor;\n\t/** Turns SVG into an image so `render_chart` can return PNG (e.g. through a canvas). */\n\trasterize?: (svg: string, size: { width: number; height: number }) => Promise<{ data: string; mimeType: string }> | { data: string; mimeType: string };\n}\n\n/**\n * When to look at the chart, for `render_chart`'s description (after vectorcraft's\n * `render_preview` and Ursula's VIEW_DIAGRAM_INSTRUCTIONS).\n */\nexport const RENDER_CHART_INSTRUCTIONS =\n\t'Draws the chart without changing it so you can check how it looks: SVG text by default, or a PNG image with format \"png\" when the host can rasterize. Returns the layout warnings (hidden or thinned labels, dropped markers) alongside. An image costs tokens, so render after a batch of edits rather than after each one, and use it to check what text cannot tell you: overlapping or cut-off labels, a crowded legend, unreadable colours, whether the chart reads at the given size. For values, ids and warnings alone, get_chart is cheaper.';\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false } as const;\nconst WRITE_IDEMPOTENT = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nfunction resolve<T>(result: { ok: boolean; message?: string } & T): T {\n\tif (!result.ok) fail(result.message ?? 'The change was rejected.');\n\treturn result;\n}\n\n/**\n * Agent tools for a chart editor, for a `ToolRegistry`: one tool per operation with strict\n * schemas. Reads (`get_chart`, `render_chart`, `check_chart_colors`, `recommend_chart`,\n * `get_chart_trendline`, `list_chart_presets`, `export_chart_mermaid`, `export_chart_ooxml`)\n * are always there; writes (data, series, categories, presentation, trendlines, presets,\n * imports, selection, pointer and key input, undo / redo) are hidden while the chart is\n * read-only. Every write is one undo step and returns what it changed.\n */\nexport function createChartToolProvider(controller: ChartController, options: ChartToolProviderOptions = {}): AgentToolProvider {\n\tconst size = options.size ?? { width: 640, height: 400 };\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (!r) return null;\n\t\treturn typeof r === 'string' ? r : 'This chart is read-only.';\n\t};\n\tconst spec = () => controller.getSpec();\n\tconst seriesById = (ref: string) => {\n\t\tconst s = spec().series.find((x) => x.id === ref) ?? spec().series.find((x) => x.name === ref);\n\t\tif (!s) fail(`There is no series \"${ref}\"; expected one of ${spec().series.map((x) => `\"${x.id}\" (${x.name})`).join(', ') || '(none yet; add one with add_chart_series)'}.`);\n\t\treturn s!;\n\t};\n\tconst categoryIndex = (ref: string | number) => {\n\t\tconst categories = spec().categories;\n\t\tconst index = typeof ref === 'number' ? ref : categories.indexOf(ref);\n\t\tif (!Number.isInteger(index) || index < 0 || index >= categories.length)\n\t\t\tfail(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of ${categories.slice(0, 20).map((c) => JSON.stringify(c)).join(', ')}.`);\n\t\treturn index;\n\t};\n\tconst table = () => chartDataToTable(spec());\n\tconst Parser = (): ParserCtor | undefined => options.DOMParser ?? (globalThis as { DOMParser?: ParserCtor }).DOMParser;\n\n\tconst getChart: AgentTool = {\n\t\tname: 'get_chart',\n\t\ttitle: 'Read the chart',\n\t\tdescription:\n\t\t\t'Returns the chart spec (type, titles, axes, legend, series with ids and settings), its data as a table (header row of series names, then one row per category), the current selection, and a summary at the given size: per-series min / max / mean / trend, the axes as drawn, layout warnings (hidden labels, thinned lines), a colour check and a plain-language description. Use the series ids and category indexes it returns with the write tools.',\n\t\tinputSchema: { type: 'object', properties: { width: WIDTH, height: HEIGHT }, additionalProperties: false },\n\t\tannotations: { title: 'Read the chart', ...READ },\n\t\thandler: ({ width = size.width, height = size.height }) => {\n\t\t\tconst reason = readOnlyReason();\n\t\t\treturn {\n\t\t\t\tspec: controller.toJSON(),\n\t\t\t\ttable: table(),\n\t\t\t\tselection: controller.getState().selection,\n\t\t\t\tsummary: summarizeChart(controller.toJSON(), { width, height }),\n\t\t\t\tissues: controller.getState().issues,\n\t\t\t\t...(reason ? { readOnly: reason } : {})\n\t\t\t};\n\t\t}\n\t};\n\n\tconst renderChart: AgentTool = {\n\t\tname: 'render_chart',\n\t\ttitle: 'Render the chart',\n\t\tdescription: RENDER_CHART_INSTRUCTIONS,\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\twidth: WIDTH,\n\t\t\t\theight: HEIGHT,\n\t\t\t\tformat: { type: 'string', enum: ['svg', 'png'], description: 'svg (default): the SVG document as text. png: an image to look at (only when the host can rasterize; costs image tokens).' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Render the chart', ...READ },\n\t\thandler: async ({ width = size.width, height = size.height, format = 'svg' }) => {\n\t\t\tconst json = controller.toJSON();\n\t\t\tconst scene = layoutChart(json, { width, height, selection: null });\n\t\t\tconst svg = chartSceneToSvg(scene, { ariaLabel: json.title || undefined, description: describeChart(json) });\n\t\t\tconst warnings = scene.warnings;\n\t\t\tif (format === 'png') {\n\t\t\t\tif (!options.rasterize) fail('This host cannot rasterize charts; call render_chart with format \"svg\", or get_chart for the layout warnings.');\n\t\t\t\tconst image = await options.rasterize!(svg, { width, height });\n\t\t\t\tconst info = { width, height, mimeType: image.mimeType, warnings };\n\t\t\t\tconst note = warnings.length ? `Layout warnings: ${warnings.map((w) => w.message).join(' ')}` : 'No layout warnings.';\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: 'image', data: image.data, mimeType: image.mimeType },\n\t\t\t\t\t\t{ type: 'text', text: `Chart at ${width} × ${height}. ${note}` }\n\t\t\t\t\t],\n\t\t\t\t\tstructuredContent: info\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { svg, width, height, warnings };\n\t\t}\n\t};\n\n\tconst checkColors: AgentTool = {\n\t\tname: 'check_chart_colors',\n\t\ttitle: 'Check chart colours',\n\t\tdescription:\n\t\t\t'Checks that colours can be told apart with normal vision and with protanopia, deuteranopia and tritanopia (OKLab distance after simulation), and that they stand out from the background. Checks the chart\\'s own series (or slice) colours unless colours are given. Returns the closest pair per vision, contrast ratios and problems as sentences.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcolors: { type: 'array', items: { type: 'string' }, minItems: 1, description: 'Colours to check instead of the chart\\'s (hex or rgb()).' },\n\t\t\t\tsurface: { type: 'string', description: 'Background colour (default white).' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Check chart colours', ...READ },\n\t\thandler: ({ colors, surface }) => {\n\t\t\tconst s = spec();\n\t\t\tconst visible = s.series.filter((x) => !x.hidden);\n\t\t\tconst own = chartColorsByCategory(s.type) ? s.categories.map((_, i) => visible[0]?.pointColors?.[i] || chartSliceColor(s, i)) : visible.map((x) => chartSeriesColor(s, s.series.indexOf(x)));\n\t\t\treturn { colors: colors ?? own, ...checkChartColors(colors ?? own, { surface }) };\n\t\t}\n\t};\n\n\tconst recommend: AgentTool = {\n\t\tname: 'recommend_chart',\n\t\ttitle: 'Recommend chart types',\n\t\tdescription:\n\t\t\t'Suggests chart types for data, best first, each with a reason: from CSV text when given, else from the chart\\'s current data. Uses the shape of the data (series count, points, dates, negative values).',\n\t\tinputSchema: { type: 'object', properties: { csv: { type: 'string', description: 'CSV or TSV text to analyse instead of the current data (first row may be series names, first column categories).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Recommend chart types', ...READ },\n\t\thandler: ({ csv }) => {\n\t\t\tconst rows = csv !== undefined ? parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' }) : table();\n\t\t\tconst recommendations = recommendChartTypes(rows);\n\t\t\tif (!recommendations.length) fail('There are no numbers to chart: give CSV with at least one numeric column.');\n\t\t\treturn { recommendations };\n\t\t}\n\t};\n\n\tconst getTrendline: AgentTool = {\n\t\tname: 'get_chart_trendline',\n\t\ttitle: 'Read a trendline fit',\n\t\tdescription: 'Returns a trendline\\'s fitted coefficients (in x for category charts, x = 1, 2, 3, …), R², equation and the number of points, or the moving-average points.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Read a trendline fit', ...READ },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst line = s.trendlines?.[index];\n\t\t\tif (!line) fail(`\"${s.name}\" has no trendline ${index}; it has ${s.trendlines?.length ?? 0}.`);\n\t\t\tif (line!.type === 'moving-average') return { trendline: line, points: controller.trendlineMovingAverage(s.id, index) };\n\t\t\tconst fit = controller.trendlineFit(s.id, index);\n\t\t\tif (!fit) fail(`The ${line!.type} trendline on \"${s.name}\" cannot be fitted: it needs more points (and positive values for log, exponential and power fits).`);\n\t\t\treturn { trendline: line, coefficients: fit!.coefficients, r2: fit!.r2, equation: fit!.equation, points: fit!.points };\n\t\t}\n\t};\n\n\tconst listPresets: AgentTool = {\n\t\tname: 'list_chart_presets',\n\t\ttitle: 'List chart presets',\n\t\tdescription: 'Lists the quick layouts and colour schemes apply_chart_preset accepts, with what each changes.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'List chart presets', ...READ },\n\t\thandler: () => ({\n\t\t\tlayouts: CHART_LAYOUT_PRESETS.map(({ id, label, description }) => ({ id, label, description })),\n\t\t\tcolorSchemes: CHART_COLOR_SCHEMES.map(({ id, label, description, palette }) => ({ id, label, description, palette }))\n\t\t})\n\t};\n\n\tconst exportMermaid: AgentTool = {\n\t\tname: 'export_chart_mermaid',\n\t\ttitle: 'Export chart as Mermaid',\n\t\tdescription:\n\t\t\t'Returns the chart as Mermaid text (xychart-beta, pie or radar-beta) for Markdown or chat. With meta (default true) one \"%% @pixerate {…}\" comment keeps what Mermaid cannot express, so import_chart_mermaid gets the chart back exactly.',\n\t\tinputSchema: { type: 'object', properties: { meta: { type: 'boolean', description: 'Include the round-trip comment (default true).' } }, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Mermaid', ...READ },\n\t\thandler: ({ meta = true }) => ({ mermaid: chartToMermaid(controller.toJSON(), { meta }) })\n\t};\n\n\tconst exportOoxml: AgentTool = {\n\t\tname: 'export_chart_ooxml',\n\t\ttitle: 'Export chart as Office XML',\n\t\tdescription: 'Returns the chart as a DrawingML chart part (c:chartSpace) for Word or PowerPoint files, with what could not be written as sentences.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Export chart as Office XML', ...READ },\n\t\thandler: () => chartToOoxml(controller.toJSON())\n\t};\n\n\t// ---------------------------------------------------------------- writes\n\n\tconst updateChart: AgentTool = {\n\t\tname: 'update_chart',\n\t\ttitle: 'Change chart presentation',\n\t\tdescription:\n\t\t\t'Changes how the chart looks, as one undo step: type, titles, axes (xAxis = categories or numeric x, yAxis = values, yAxis2 = secondary values; each can be reversed, and value axes can be logarithmic with scale \"log\"), legend, stacking, orientation, curve, points, data labels and their position, palette, donut hole, bar spacing, histogram bins, waterfall total. All-or-nothing: invalid values change nothing and come back as sentences. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: CHART_UPDATE_PROPERTIES,\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change chart presentation', ...WRITE_IDEMPOTENT },\n\t\thandler: (args) => {\n\t\t\tif (!Object.keys(args).length) fail('Nothing to change: pass at least one field, e.g. {\"type\": \"line\"}.');\n\t\t\tresolve(controller.update(args as ChartSpecPatch));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst setData: AgentTool = {\n\t\tname: 'set_chart_data',\n\t\ttitle: 'Replace chart data',\n\t\tdescription: 'Replaces the categories and / or the series as one undo step. Each series has one value per category (padded with gaps). Returns the data table and the series ids.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcategories: { type: 'array', items: { type: 'string' }, description: 'Category labels in order.' },\n\t\t\t\tseries: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tdescription: 'The new series (replaces all).',\n\t\t\t\t\titems: { type: 'object', properties: { id: { type: 'string', description: 'Stable id (optional).' }, ...SERIES_PROPS }, required: ['name', 'values'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Replace chart data', ...DESTRUCTIVE },\n\t\thandler: (args) => {\n\t\t\tif (!args.categories && !args.series) fail('Pass categories, series or both.');\n\t\t\tresolve(controller.setData(args as any));\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst setValues: AgentTool = {\n\t\tname: 'set_chart_values',\n\t\ttitle: 'Set chart values',\n\t\tdescription: 'Sets individual values as one undo step (all-or-nothing). Series by id or name, category by index or label. Returns the values as stored.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcells: {\n\t\t\t\t\ttype: 'array',\n\t\t\t\t\tminItems: 1,\n\t\t\t\t\tdescription: 'Values to set.',\n\t\t\t\t\titems: { type: 'object', properties: { series: SERIES_REF, category: CATEGORY_REF, value: VALUE }, required: ['series', 'category', 'value'], additionalProperties: false }\n\t\t\t\t}\n\t\t\t},\n\t\t\trequired: ['cells'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Set chart values', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ cells }) => {\n\t\t\tconst resolved = (cells as { series: string; category: string | number; value: unknown }[]).map((c) => ({ seriesId: seriesById(c.series).id, index: categoryIndex(c.category), value: c.value }));\n\t\t\tconst parsed = resolved.map((c) => parseChartValue(c.value));\n\t\t\tconst bad = resolved.find((_, i) => parsed[i] === undefined);\n\t\t\tif (bad) fail(`\"${String(bad.value)}\" is not a number; pass a number, numeric text or null for a gap. Nothing was changed.`);\n\t\t\tif (options.director && parsed.every((v) => typeof v === 'number')) {\n\t\t\t\tconst results = await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, resolved.map((c, i) => ({ kind: 'setValue' as const, seriesId: c.seriesId, index: c.index, value: parsed[i] as number })));\n\t\t\t\tconst failed = results.find((r) => !r.ok);\n\t\t\t\tif (failed && !failed.ok) fail(failed.message);\n\t\t\t} else resolve(controller.setValues(resolved));\n\t\t\treturn { cells: resolved.map((c) => ({ series: c.seriesId, category: spec().categories[c.index], index: c.index, value: controller.getSeries(c.seriesId)!.values[c.index] })) };\n\t\t}\n\t};\n\n\tconst addSeries: AgentTool = {\n\t\tname: 'add_chart_series',\n\t\ttitle: 'Add a series',\n\t\tdescription: 'Adds a series (values padded to the categories) and selects it. Returns its id and stored values.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { ...SERIES_PROPS, id: { type: 'string', description: 'Id to use (default: series-N).' }, at: { type: 'integer', minimum: 0, description: 'Position (default: last).' } },\n\t\t\trequired: ['name'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a series', ...WRITE },\n\t\thandler: ({ at, ...input }) => {\n\t\t\tconst clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));\n\t\t\tconst result = resolve(controller.addSeries(clean as any, { at })) as { id: string };\n\t\t\tconst s = controller.getSeries(result.id)!;\n\t\t\treturn { id: s.id, name: s.name, values: s.values };\n\t\t}\n\t};\n\n\tconst updateSeries: AgentTool = {\n\t\tname: 'update_chart_series',\n\t\ttitle: 'Change a series',\n\t\tdescription: 'Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn (marker, curve, labels, format, x values, bubble sizes, point colours, error bars). null resets a field. Values change with set_chart_values. Returns the series.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, ...Object.fromEntries(Object.entries(SERIES_PROPS).filter(([k]) => k !== 'values')) },\n\t\t\trequired: ['series'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Change a series', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ series, ...patch }) => {\n\t\t\tconst id = seriesById(series).id;\n\t\t\tif (!Object.keys(patch).length) fail('Nothing to change: pass a field such as {\"color\": \"#e8710a\"} or {\"axis\": \"secondary\"}.');\n\t\t\tresolve(controller.updateSeries(id, patch as ChartSeriesPatch));\n\t\t\treturn { series: controller.getSeries(id) };\n\t\t}\n\t};\n\n\tconst removeSeries: AgentTool = {\n\t\tname: 'remove_chart_series',\n\t\ttitle: 'Delete a series',\n\t\tdescription: 'Deletes a series and its values. Returns the remaining series ids.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF }, required: ['series'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a series', ...DESTRUCTIVE },\n\t\thandler: ({ series }) => {\n\t\t\tresolve(controller.removeSeries(seriesById(series).id));\n\t\t\treturn { series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst addCategory: AgentTool = {\n\t\tname: 'add_chart_category',\n\t\ttitle: 'Add a category',\n\t\tdescription: 'Inserts a category (a gap in every series) and returns its index.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { label: { type: 'string', description: 'Category label (default: its number).' }, at: { type: 'integer', minimum: 0, description: 'Index to insert at (default: the end).' } },\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Add a category', ...WRITE },\n\t\thandler: ({ label, at }) => {\n\t\t\tconst result = controller.addCategory(label, { at });\n\t\t\treturn { index: result.index, categories: spec().categories };\n\t\t}\n\t};\n\n\tconst removeCategory: AgentTool = {\n\t\tname: 'remove_chart_category',\n\t\ttitle: 'Delete a category',\n\t\tdescription: 'Deletes a category and its value in every series. Returns the remaining categories.',\n\t\tinputSchema: { type: 'object', properties: { category: CATEGORY_REF }, required: ['category'], additionalProperties: false },\n\t\tannotations: { title: 'Delete a category', ...DESTRUCTIVE },\n\t\thandler: ({ category }) => {\n\t\t\tresolve(controller.removeCategory(categoryIndex(category)));\n\t\t\treturn { categories: spec().categories };\n\t\t}\n\t};\n\n\tconst importCsv: AgentTool = {\n\t\tname: 'import_chart_csv',\n\t\ttitle: 'Import chart data from CSV',\n\t\tdescription:\n\t\t\t'Replaces the data with CSV or TSV text as one undo step. By default the first row holds series names and the first column categories (detected when \"auto\"). chartType \"auto\" also picks the recommended chart type (two unlabelled numeric columns become a scatter of x against y). Returns the data table, the chart type and cells that were not numbers.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tcsv: { type: 'string', description: 'CSV or TSV text (tabs are detected).' },\n\t\t\t\tseriesIn: { type: 'string', enum: ['columns', 'rows'], description: 'Series run down columns (default) or along rows. Ignored with chartType \"auto\".' },\n\t\t\t\theader: { type: ['boolean', 'string'], enum: [true, false, 'auto'], description: 'The first row holds series names: true (default), false or \"auto\". Ignored with chartType \"auto\".' },\n\t\t\t\tchartType: { type: 'string', enum: ['keep', 'auto'], description: '\"keep\" (default) keeps the chart type; \"auto\" reads the table shape and picks a type.' }\n\t\t\t},\n\t\t\trequired: ['csv'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Import chart data from CSV', ...DESTRUCTIVE },\n\t\thandler: ({ csv, seriesIn, header, chartType = 'keep' }) => {\n\t\t\tif (chartType === 'auto') {\n\t\t\t\tconst rows = parseCsv(csv, { delimiter: csv.includes('\\t') ? '\\t' : ',' });\n\t\t\t\tconst built = chartFromTable(rows);\n\t\t\t\tif (!built.series.length || !built.categories.length) fail('There is no data to import: expected at least one row of numbers.');\n\t\t\t\tresolve(controller.update({ type: built.type, stacking: built.stacking, categories: built.categories, series: built.series }, { label: 'Import data' }));\n\t\t\t\treturn { type: built.type, table: table(), issues: built.issues };\n\t\t\t}\n\t\t\tconst result = resolve(controller.importCsv(csv, { seriesIn, header })) as { issues?: unknown[] };\n\t\t\treturn { type: spec().type, table: table(), issues: result.issues ?? [] };\n\t\t}\n\t};\n\n\tconst importMermaid: AgentTool = {\n\t\tname: 'import_chart_mermaid',\n\t\ttitle: 'Import a Mermaid chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with Mermaid xychart-beta, pie or radar-beta text as one undo step (a \"%% @pixerate\" comment from export_chart_mermaid restores everything else). Lines that cannot be read are skipped and listed with their line numbers. Returns the spec.',\n\t\tinputSchema: { type: 'object', properties: { mermaid: { type: 'string', description: 'Mermaid text, optionally inside a ```mermaid fence.' } }, required: ['mermaid'], additionalProperties: false },\n\t\tannotations: { title: 'Import a Mermaid chart', ...DESTRUCTIVE },\n\t\thandler: ({ mermaid }) => {\n\t\t\tconst fenced = /```(?:mermaid)?\\s*\\n([\\s\\S]*?)```/.exec(mermaid);\n\t\t\tconst read = chartFromMermaid(fenced ? fenced[1] : mermaid);\n\t\t\tif (!read.family) fail(read.issues.map((i) => i.message).join(' ') || 'Expected Mermaid starting with xychart-beta, pie or radar-beta.');\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Mermaid chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues };\n\t\t}\n\t};\n\n\tconst importOoxml: AgentTool = {\n\t\tname: 'import_chart_ooxml',\n\t\ttitle: 'Import an Office chart',\n\t\tdescription:\n\t\t\t'Replaces the chart with an Office chart part (DrawingML c:chartSpace, or chartex for waterfall, funnel, treemap, histogram and box charts) as one undo step. Returns the spec, problems, and the features the editor cannot hold.',\n\t\tinputSchema: { type: 'object', properties: { xml: { type: 'string', description: 'The chart part XML, e.g. word/charts/chart1.xml.' } }, required: ['xml'], additionalProperties: false },\n\t\tannotations: { title: 'Import an Office chart', ...DESTRUCTIVE },\n\t\thandler: ({ xml }) => {\n\t\t\tconst read = chartFromOoxml(xml, { DOMParser: Parser() });\n\t\t\tif (read.issues.some((i) => i.path === '' || i.path === 'plotArea')) fail(read.issues.map((i) => i.message).join(' '));\n\t\t\tresolve(controller.update({ ...read.spec } as ChartSpecPatch, { label: 'Import Office chart' }));\n\t\t\treturn { spec: controller.toJSON(), issues: read.issues.map((i) => i.message), unsupported: read.unsupported, lossless: read.lossless };\n\t\t}\n\t};\n\n\tconst addTrendline: AgentTool = {\n\t\tname: 'add_chart_trendline',\n\t\ttitle: 'Add a trendline',\n\t\tdescription: 'Fits a trendline to a series and draws it (unstacked bar, line, area, scatter and bubble charts). Returns its index and the fit: coefficients, R² and equation.',\n\t\tinputSchema: { type: 'object', properties: { series: SERIES_REF, ...TRENDLINE_PROPS }, required: ['series', 'type'], additionalProperties: false },\n\t\tannotations: { title: 'Add a trendline', ...WRITE },\n\t\thandler: ({ series, ...line }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tconst result = resolve(controller.addTrendline(s.id, line as ChartTrendline)) as { index: number; fit: ReturnType<ChartController['trendlineFit']> };\n\t\t\treturn { series: s.id, index: result.index, ...(result.fit ? { coefficients: result.fit.coefficients, r2: result.fit.r2, equation: result.fit.equation } : {}) };\n\t\t}\n\t};\n\n\tconst removeTrendline: AgentTool = {\n\t\tname: 'remove_chart_trendline',\n\t\ttitle: 'Delete a trendline',\n\t\tdescription: 'Deletes a trendline from a series. Returns the series\\' remaining trendlines.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: { series: SERIES_REF, index: { type: 'integer', minimum: 0, description: 'Trendline index on the series (0 = first).' } },\n\t\t\trequired: ['series', 'index'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Delete a trendline', ...DESTRUCTIVE },\n\t\thandler: ({ series, index }) => {\n\t\t\tconst s = seriesById(series);\n\t\t\tresolve(controller.removeTrendline(s.id, index));\n\t\t\treturn { series: s.id, trendlines: controller.getSeries(s.id)?.trendlines ?? [] };\n\t\t}\n\t};\n\n\tconst applyPreset: AgentTool = {\n\t\tname: 'apply_chart_preset',\n\t\ttitle: 'Apply a chart style',\n\t\tdescription: 'Applies a quick layout (legend, labels and grid lines together) and / or a colour scheme as one undo step. See list_chart_presets for the names. Returns the new spec.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tlayout: { type: 'string', enum: CHART_LAYOUT_PRESETS.map((p) => p.id), description: 'Quick layout id.' },\n\t\t\t\tcolors: { type: 'string', enum: CHART_COLOR_SCHEMES.map((p) => p.id), description: 'Colour scheme id.' }\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Apply a chart style', ...WRITE_IDEMPOTENT },\n\t\thandler: ({ layout, colors }) => {\n\t\t\tresolve(controller.applyPreset({ layout, colors }));\n\t\t\treturn { spec: controller.toJSON() };\n\t\t}\n\t};\n\n\tconst transpose: AgentTool = {\n\t\tname: 'transpose_chart',\n\t\ttitle: 'Switch rows and columns',\n\t\tdescription: 'Swaps series and categories (each category becomes a series) as one undo step. Per-series colours and settings are dropped. Returns the data table.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Switch rows and columns', ...WRITE },\n\t\thandler: () => {\n\t\t\tresolve(controller.transpose());\n\t\t\treturn { table: table(), series: spec().series.map((s) => ({ id: s.id, name: s.name })) };\n\t\t}\n\t};\n\n\tconst select: AgentTool = {\n\t\tname: 'select_chart_element',\n\t\ttitle: 'Select a chart element',\n\t\tdescription: 'Selects part of the chart (as a click would), for press_chart_key and for the user to see. kind \"none\" clears the selection. Returns the selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkind: { type: 'string', enum: ['none', 'chart', 'title', 'subtitle', 'legend', 'axis', 'series', 'point', 'category', 'trendline'], description: 'What to select.' },\n\t\t\t\tseries: { ...SERIES_REF, description: 'Series id or name (series, point, trendline).' },\n\t\t\t\tcategory: { ...CATEGORY_REF, description: 'Category index or label (point, category).' },\n\t\t\t\taxis: { type: 'string', enum: ['x', 'y', 'y2'], description: 'Axis (axis).' },\n\t\t\t\tindex: { type: 'integer', minimum: 0, description: 'Trendline index (trendline).' }\n\t\t\t},\n\t\t\trequired: ['kind'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Select a chart element', ...WRITE_IDEMPOTENT },\n\t\thandler: async ({ kind, series, category, axis, index }) => {\n\t\t\tlet sel: ChartSelection | null;\n\t\t\tconst need = (v: unknown, what: string) => v === undefined && fail(`kind \"${kind}\" needs ${what}.`);\n\t\t\tswitch (kind) {\n\t\t\t\tcase 'none':\n\t\t\t\t\tsel = null;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'axis':\n\t\t\t\t\tneed(axis, 'axis');\n\t\t\t\t\tsel = { kind, axis };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'series':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'point':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'category':\n\t\t\t\t\tneed(category, 'category');\n\t\t\t\t\tsel = { kind, index: categoryIndex(category) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'trendline':\n\t\t\t\t\tneed(series, 'series');\n\t\t\t\t\tneed(index, 'index');\n\t\t\t\t\tsel = { kind, seriesId: seriesById(series).id, index };\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsel = { kind } as ChartSelection;\n\t\t\t}\n\t\t\tif (options.director) await options.director.perform(options.actor ?? { id: 'agent', name: 'Agent' }, [{ kind: 'select', selection: sel }]);\n\t\t\telse controller.select(sel);\n\t\t\tconst now = controller.getState().selection;\n\t\t\tif (sel && !now) fail(`Nothing to select there (e.g. the chart has no ${kind} of that kind).`);\n\t\t\treturn { selection: now };\n\t\t}\n\t};\n\n\tconst drag: AgentTool = {\n\t\tname: 'drag_chart_point',\n\t\ttitle: 'Drag a chart point',\n\t\tdescription:\n\t\t\t'Drags on the chart as a pointer would, through the same code as the mouse: from a bar or point to a new position, with the same snapping (to other values, zero and ticks), fine adjustment (fine: Alt) and axis lock on scatter charts (lockAxis: Shift). Positions are 0–1 fractions of the chart\\'s width and height at the given size (use render_chart to see where marks are). One undo step. Returns what was dragged and the value before and after.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tfrom: { type: 'object', description: 'Start, as fractions of the chart (0,0 top-left).', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tto: { type: 'object', description: 'End, as fractions of the chart.', properties: { x: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the width.' }, y: { type: 'number', minimum: 0, maximum: 1, description: 'Fraction of the height.' } }, required: ['x', 'y'], additionalProperties: false },\n\t\t\t\tfine: { type: 'boolean', description: 'Move a tenth as far (Alt).' },\n\t\t\t\tlockAxis: { type: 'boolean', description: 'Scatter charts: change only the axis moved along most (Shift).' },\n\t\t\t\twidth: WIDTH,\n\t\t\t\theight: HEIGHT\n\t\t\t},\n\t\t\trequired: ['from', 'to'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Drag a chart point', ...WRITE },\n\t\thandler: ({ from, to, fine, lockAxis, width = size.width, height = size.height }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), { width, height });\n\t\t\tconst start = { x: from.x * width, y: from.y * height };\n\t\t\tconst target = chartHitTest(scene, start);\n\t\t\tif (target?.kind !== 'point') fail(`There is no bar or point at (${from.x}, ${from.y}); ${target ? `that is the ${target.kind}` : 'that is outside the chart'}. Use render_chart to find marks.`);\n\t\t\tconst t = target as Extract<ChartSelection, { kind: 'point' }>;\n\t\t\tconst before = controller.getSeries(t.seriesId)?.values[t.index] ?? null;\n\t\t\tconst session = startChartPointDrag(controller, scene, t, start);\n\t\t\tif (!session) fail('That point cannot be dragged here (percent-stacked charts, pies and gaps cannot be dragged).');\n\t\t\tsession!.move({ x: to.x * width, y: to.y * height }, { fine, lockAxis });\n\t\t\tsession!.end();\n\t\t\tconst s = controller.getSeries(t.seriesId)!;\n\t\t\treturn { series: s.id, category: spec().categories[t.index], index: t.index, before, after: s.values[t.index], ...(s.x ? { x: s.x[t.index] } : {}) };\n\t\t}\n\t};\n\n\tconst key: AgentTool = {\n\t\tname: 'press_chart_key',\n\t\ttitle: 'Press a key on the chart',\n\t\tdescription:\n\t\t\t'Sends a key to the chart as the keyboard would, acting on the selection (select_chart_element first): ← → move between categories, ↑ ↓ change the selected value by a tenth of a tick (shift: a whole tick, alt: a hundredth), Delete removes the selection, Escape clears it. Returns whether the key did anything and the new selection.',\n\t\tinputSchema: {\n\t\t\ttype: 'object',\n\t\t\tproperties: {\n\t\t\t\tkey: { type: 'string', enum: ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Delete', 'Backspace', 'Escape'], description: 'Key name.' },\n\t\t\t\tshift: { type: 'boolean', description: 'Hold Shift.' },\n\t\t\t\talt: { type: 'boolean', description: 'Hold Alt / Option.' }\n\t\t\t},\n\t\t\trequired: ['key'],\n\t\t\tadditionalProperties: false\n\t\t},\n\t\tannotations: { title: 'Press a key on the chart', ...DESTRUCTIVE },\n\t\thandler: ({ key: k, shift, alt }) => {\n\t\t\tconst scene = layoutChart(controller.toJSON(), size);\n\t\t\tconst used = handleChartKey(controller, scene, { key: k, shiftKey: shift, altKey: alt });\n\t\t\tconst sel = controller.getState().selection;\n\t\t\tconst value = sel?.kind === 'point' ? (controller.getSeries(sel.seriesId)?.values[sel.index] ?? null) : undefined;\n\t\t\treturn { used, selection: sel, ...(value !== undefined ? { value } : {}) };\n\t\t}\n\t};\n\n\tconst undo: AgentTool = {\n\t\tname: 'undo_chart',\n\t\ttitle: 'Undo a chart edit',\n\t\tdescription: 'Undoes the last chart edit. Returns whether something was undone and what the next undo would be.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Undo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().undoLabel;\n\t\t\tconst undone = controller.undo();\n\t\t\treturn { undone, ...(undone ? { label } : {}), next: controller.getState().undoLabel || null };\n\t\t}\n\t};\n\n\tconst redo: AgentTool = {\n\t\tname: 'redo_chart',\n\t\ttitle: 'Redo a chart edit',\n\t\tdescription: 'Redoes the last undone chart edit. Returns whether something was redone.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'Redo a chart edit', ...WRITE },\n\t\thandler: () => {\n\t\t\tconst label = controller.getState().redoLabel;\n\t\t\tconst redone = controller.redo();\n\t\t\treturn { redone, ...(redone ? { label } : {}) };\n\t\t}\n\t};\n\n\tconst reads = [getChart, renderChart, checkColors, recommend, getTrendline, listPresets, exportMermaid, exportOoxml];\n\tconst writes = [updateChart, setData, setValues, addSeries, updateSeries, removeSeries, addCategory, removeCategory, importCsv, importMermaid, addTrendline, removeTrendline, applyPreset, transpose, select, drag, key, undo, redo];\n\n\treturn {\n\t\tid: options.id ?? 'chart',\n\t\tnamespace: options.namespace,\n\t\ttools: () => {\n\t\t\tif (readOnlyReason()) return reads;\n\t\t\treturn [...reads, ...writes.slice(0, 10), ...(Parser() ? [importOoxml] : []), ...writes.slice(10)];\n\t\t},\n\t\tsubscribe: (notify) => {\n\t\t\t// Re-announce when read-only state may have changed.\n\t\t\tlet last = readOnlyReason();\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tconst now = readOnlyReason();\n\t\t\t\tif (now !== last) {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tnotify();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n}\n","// Streaming follows Ursula's MermaidStreamingView and src/graph/view.ts (`blendLayout`: marks are matched by id,\n// new ones appear at their target, missing ones drop out; layouts are adopted on a throttle and the scale is held\n// steady until the source is complete).\nimport { chartFromMermaid } from './mermaid.js';\nimport { normalizeChartSpec } from './spec.js';\nimport type { ChartIssue, ChartMark, ChartScene, ChartSpec } from './types.js';\n\n/**\n * Reads JSON that is still arriving: closes open strings, arrays and objects and drops a\n * dangling key or comma, so `{\"type\":\"bar\",\"series\":[{\"name\":\"A\",\"values\":[1,2` reads as far\n * as it goes. Returns `undefined` when nothing usable has arrived yet.\n */\nexport function parsePartialChartJson(text: string): unknown {\n\tconst src = text.trim();\n\tif (!src) return undefined;\n\ttry {\n\t\treturn JSON.parse(src);\n\t} catch {\n\t\t// fall through\n\t}\n\tconst stack: string[] = [];\n\tlet inString = false;\n\tlet escaped = false;\n\tlet out = '';\n\tfor (const ch of src) {\n\t\tout += ch;\n\t\tif (inString) {\n\t\t\tif (escaped) escaped = false;\n\t\t\telse if (ch === '\\\\') escaped = true;\n\t\t\telse if (ch === '\"') inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') inString = true;\n\t\telse if (ch === '{' || ch === '[') stack.push(ch === '{' ? '}' : ']');\n\t\telse if (ch === '}' || ch === ']') stack.pop();\n\t}\n\tif (inString) out += '\"';\n\t// Drop what cannot end a value: a trailing comma, colon, key without value or partial literal.\n\tfor (let attempt = 0; attempt < 6; attempt++) {\n\t\tconst trimmed = out.replace(/\\s+$/, '');\n\t\tconst candidate = trimmed + [...stack].reverse().join('');\n\t\ttry {\n\t\t\treturn JSON.parse(candidate);\n\t\t} catch {\n\t\t\tconst next = trimmed\n\t\t\t\t.replace(/,\\s*$/, '')\n\t\t\t\t.replace(/(?:,|\\{)\\s*\"[^\"]*\"\\s*:?\\s*$/, (m) => (m.trim().startsWith('{') ? '{' : ''))\n\t\t\t\t.replace(/:\\s*$/, ': null')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-|tr?u?|fa?l?s?|nu?l?)$/, '')\n\t\t\t\t.replace(/(?<=[\\[,:]\\s*)(-?\\d+\\.)$/, (m) => m.slice(0, -1));\n\t\t\tif (next === trimmed) break;\n\t\t\tout = next;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport type ChartStreamFormat = 'auto' | 'mermaid' | 'json';\n\nexport interface ChartStreamResult {\n\t/** The chart as far as it has arrived, or `null` before anything can be drawn. */\n\tspec: ChartSpec | null;\n\tissues: ChartIssue[];\n\t/**\n\t * The value range to lay out with while incomplete: it only grows, so the axis does not\n\t * jump as values arrive. `null` once complete (the chart's own scale takes over).\n\t */\n\tvalueDomain: { min: number; max: number } | null;\n}\n\n/**\n * Turns a chart source that is still being written (Mermaid or a JSON spec, e.g. streamed\n * from a model) into drawable specs. Series appear once their values start, axis bounds only\n * grow until `complete`, and parse problems are reported only once the source is complete.\n */\nexport class ChartStream {\n\tprivate lo = Infinity;\n\tprivate hi = -Infinity;\n\tprivate last: ChartSpec | null = null;\n\n\tconstructor(private readonly format: ChartStreamFormat = 'auto') {}\n\n\t/** Reads the source so far. `complete` when nothing more will arrive. */\n\tupdate(source: string, complete = false): ChartStreamResult {\n\t\tconst text = source.replace(/^\\s*```(?:mermaid|json)?\\s*\\n?/, '').replace(/```\\s*$/, '');\n\t\tconst format = this.format === 'auto' ? (/^\\s*[[{]/.test(text) ? 'json' : 'mermaid') : this.format;\n\t\tlet spec: ChartSpec | null = null;\n\t\tlet issues: ChartIssue[] = [];\n\t\tif (format === 'json') {\n\t\t\tconst value = complete ? safeParse(text) : parsePartialChartJson(text);\n\t\t\tif (value !== undefined) {\n\t\t\t\tconst read = normalizeChartSpec(value);\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t} else {\n\t\t\tconst read = chartFromMermaid(text, { partial: !complete });\n\t\t\tif (read.family) {\n\t\t\t\tspec = read.spec;\n\t\t\t\tissues = complete ? read.issues : [];\n\t\t\t}\n\t\t}\n\t\tif (spec && !spec.series.some((s) => s.values.some((v) => v !== null))) spec = complete ? spec : this.last;\n\t\tif (spec) this.last = spec;\n\t\tif (spec) {\n\t\t\tfor (const s of spec.series) for (const v of s.values) if (v !== null && Number.isFinite(v)) (this.lo = Math.min(this.lo, v)), (this.hi = Math.max(this.hi, v));\n\t\t}\n\t\tconst valueDomain = !complete && Number.isFinite(this.lo) && this.hi > this.lo ? { min: Math.min(0, this.lo), max: this.hi } : null;\n\t\treturn { spec, issues, valueDomain };\n\t}\n\n\t/** Forgets the axis bounds (a new source). */\n\treset(): void {\n\t\tthis.lo = Infinity;\n\t\tthis.hi = -Infinity;\n\t\tthis.last = null;\n\t}\n}\n\nfunction safeParse(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn parsePartialChartJson(text);\n\t}\n}\n\nconst mix = (a: number, b: number, t: number) => a + (b - a) * t;\n\n/** Paths with the same commands blend number by number; others switch at the end. */\nfunction blendPath(a: string, b: string, t: number): string {\n\tconst na = a.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tconst nb = b.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g);\n\tif (!na || !nb || na.length !== nb.length || a.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#') !== b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, '#')) return t < 1 ? a : b;\n\tlet i = 0;\n\treturn b.replace(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g, () => {\n\t\tconst v = mix(Number(na[i]), Number(nb[i]), t);\n\t\ti++;\n\t\treturn String(Math.round(v * 100) / 100);\n\t});\n}\n\n/**\n * A scene between two scenes, for animating changes (streamed data arriving, an agent's\n * edit): marks are matched by `key`; numbers and same-shaped paths move from `from` to `to`;\n * new marks fade in and marks that are gone are dropped. `t` runs from 0 to 1.\n */\nexport function blendChartScenes(from: ChartScene | null, to: ChartScene, t: number): ChartScene {\n\tif (!from || t >= 1) return to;\n\tconst k = Math.max(0, Math.min(1, t));\n\tconst before = new Map(from.marks.map((m) => [m.key, m]));\n\tconst marks: ChartMark[] = to.marks.map((m) => {\n\t\tconst a = before.get(m.key);\n\t\tif (!a || a.kind !== m.kind) return { ...m, opacity: (m.opacity ?? 1) * k };\n\t\tswitch (m.kind) {\n\t\t\tcase 'rect': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k), width: mix(p.width, m.width, k), height: mix(p.height, m.height, k) };\n\t\t\t}\n\t\t\tcase 'circle': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, cx: mix(p.cx, m.cx, k), cy: mix(p.cy, m.cy, k), r: mix(p.r, m.r, k) };\n\t\t\t}\n\t\t\tcase 'line': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x1: mix(p.x1, m.x1, k), y1: mix(p.y1, m.y1, k), x2: mix(p.x2, m.x2, k), y2: mix(p.y2, m.y2, k) };\n\t\t\t}\n\t\t\tcase 'text': {\n\t\t\t\tconst p = a as typeof m;\n\t\t\t\treturn { ...m, x: mix(p.x, m.x, k), y: mix(p.y, m.y, k) };\n\t\t\t}\n\t\t\tcase 'path':\n\t\t\t\treturn { ...m, d: blendPath((a as typeof m).d, m.d, k) };\n\t\t}\n\t});\n\treturn { ...to, marks };\n}\n\n/** Ease-out cubic, for tweens. */\nexport const easeChartTween = (t: number) => 1 - Math.pow(1 - Math.max(0, Math.min(1, t)), 3);\n","// Agent \"performances\" follow Ursula's remote control (src/remote/commands.ts `planCommand`, src/react/remote/director.ts,\n// presence.ts, clock.ts): a pure planner turns a command into cursor steps, a director acts them out per actor and\n// commits each command as one undo step, and the clock is injectable so performances are repeatable in tests.\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { linearMap } from './scale.js';\nimport type { ChartScene, ChartSelection, ChartSpec } from './types.js';\n\nimport {\n\tPRESENCE_COLORS,\n\tPerformanceQueue,\n\tPresenceStore,\n\tcreateInstantPresenceClock,\n\trealPresenceClock,\n\ttweenPresenceCursor,\n\ttype PresenceActor,\n\ttype PresenceActorInfo,\n\ttype PresenceClock,\n\ttype PresenceState\n} from '../animation/presence.js';\n\nexport type ChartPresenceActor = PresenceActor;\nexport type ChartPresenceState = PresenceState;\n\n/** Cursor positions and notes of agents acting on a chart, for an overlay. */\nexport class ChartPresence extends PresenceStore {}\n\nexport const CHART_PRESENCE_COLORS: readonly string[] = PRESENCE_COLORS;\n\n/** Time for performances: real timers, or an instant clock for tests and recordings. */\nexport type ChartClock = PresenceClock;\n\nexport const realChartClock: ChartClock = realPresenceClock;\n\n/** A clock whose waits finish at once while its time still advances (repeatable performances). */\nexport const createInstantChartClock = createInstantPresenceClock;\n\n/** What an agent asks for. Each command commits as one undo step. */\nexport type ChartAgentCommand =\n\t| { kind: 'setValue'; seriesId: string; index: number; value: number; note?: string }\n\t| { kind: 'select'; selection: ChartSelection | null; note?: string }\n\t| { kind: 'update'; patch: ChartSpecPatch; label?: string; note?: string }\n\t| { kind: 'say'; text: string };\n\nexport type ChartPerformanceStep =\n\t| { type: 'move'; to: { x: number; y: number }; ms: number }\n\t| { type: 'say'; text: string; ms: number }\n\t| { type: 'press' }\n\t| { type: 'drag'; to: { x: number; y: number }; ms: number; from: number; value: number }\n\t| { type: 'release' }\n\t| { type: 'commit' };\n\n/** Where a point or bar sits in the scene (its top for bars), or null when it is not drawn. */\nexport function chartPointAnchor(scene: ChartScene, seriesId: string, index: number): { x: number; y: number } | null {\n\tconst mark = scene.marks.find((m) => (m.role === 'bar' || m.role === 'point') && m.target?.kind === 'point' && m.target.seriesId === seriesId && m.target.index === index);\n\tif (!mark) return null;\n\tif (mark.kind === 'rect') return { x: mark.x + mark.width / 2, y: mark.y };\n\tif (mark.kind === 'circle') return { x: mark.cx, y: mark.cy };\n\treturn null;\n}\n\nconst anchorFor = (scene: ChartScene, role: string) => {\n\tconst m = scene.marks.find((x) => x.role === role);\n\tif (!m) return null;\n\tif (m.kind === 'text') return { x: m.x, y: m.y };\n\tif (m.kind === 'rect') return { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\tif (m.kind === 'line') return { x: (m.x1 + m.x2) / 2, y: (m.y1 + m.y2) / 2 };\n\treturn null;\n};\n\n/**\n * Plans how an agent acts out a command on the chart: cursor moves, a drag along the value\n * axis for a value change (its end at the new value), a note, then a commit. Pure: the same\n * scene and command give the same steps.\n */\nexport function planChartCommand(spec: ChartSpec, scene: ChartScene, command: ChartAgentCommand, speed = 1): ChartPerformanceStep[] {\n\tconst ms = (n: number) => Math.round(n / Math.max(0.1, speed));\n\tconst steps: ChartPerformanceStep[] = [];\n\tconst note = 'note' in command && command.note ? command.note : undefined;\n\tif (note) steps.push({ type: 'say', text: note, ms: ms(500) });\n\tswitch (command.kind) {\n\t\tcase 'say':\n\t\t\tsteps.push({ type: 'say', text: command.text, ms: ms(900) });\n\t\t\treturn steps;\n\t\tcase 'setValue': {\n\t\t\tconst at = chartPointAnchor(scene, command.seriesId, command.index);\n\t\t\tconst series = spec.series.find((s) => s.id === command.seriesId);\n\t\t\tconst from = series?.values[command.index] ?? 0;\n\t\t\tconst scale = series?.axis === 'secondary' ? (scene.valueScale2 ?? scene.valueScale) : scene.valueScale;\n\t\t\tif (at && scale) {\n\t\t\t\tconst px = linearMap(command.value, scale.domain, scale.range);\n\t\t\t\tconst to = scale.axis === 'y' ? { x: at.x, y: px } : { x: px, y: at.y };\n\t\t\t\tsteps.push({ type: 'move', to: at, ms: ms(380) }, { type: 'press' }, { type: 'drag', to, ms: ms(520), from, value: command.value }, { type: 'release' });\n\t\t\t} else steps.push({ type: 'drag', to: { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + scene.plot.height / 2 }, ms: ms(200), from, value: command.value });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'select': {\n\t\t\tconst sel = command.selection;\n\t\t\tlet to: { x: number; y: number } | null = null;\n\t\t\tif (sel?.kind === 'point') to = chartPointAnchor(scene, sel.seriesId, sel.index);\n\t\t\telse if (sel) {\n\t\t\t\tconst m = scene.marks.find((x) => x.target && JSON.stringify(x.target) === JSON.stringify(sel));\n\t\t\t\tif (m?.kind === 'text') to = { x: m.x, y: m.y };\n\t\t\t\telse if (m?.kind === 'rect') to = { x: m.x + m.width / 2, y: m.y + m.height / 2 };\n\t\t\t\telse if (m?.kind === 'circle') to = { x: m.cx, y: m.cy };\n\t\t\t}\n\t\t\tif (to) steps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' });\n\t\t\tsteps.push({ type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t\tcase 'update': {\n\t\t\tconst keys = Object.keys(command.patch);\n\t\t\tconst role = keys.includes('title') ? 'title' : keys.includes('legend') ? 'legend-label' : keys.some((k) => k === 'xAxis') ? 'axis' : keys.some((k) => k === 'yAxis' || k === 'yAxis2') ? 'tick-label' : null;\n\t\t\tconst to = (role && anchorFor(scene, role)) || { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + 12 };\n\t\t\tsteps.push({ type: 'move', to, ms: ms(380) }, { type: 'press' }, { type: 'release' }, { type: 'commit' });\n\t\t\treturn steps;\n\t\t}\n\t}\n}\n\nexport interface ChartDirectorOptions {\n\t/** The scene as currently drawn (for cursor targets), e.g. the canvas' last layout. */\n\tscene: () => ChartScene;\n\tclock?: ChartClock;\n\t/** 1 = natural speed; 2 = twice as fast. */\n\tspeed?: number;\n\t/** Hide each actor's cursor this long after its last command (ms, default 1500; 0 keeps it). */\n\tlinger?: number;\n}\n\nexport type ChartDirectorActor = PresenceActorInfo;\n\nexport type ChartPerformanceResult = { ok: true; command: ChartAgentCommand } | { ok: false; command: ChartAgentCommand; message: string };\n\n/**\n * Acts out agent commands on a chart: each actor's cursor moves to the target, drags values\n * into place (the chart updates live) and the command commits as one undo step, while the\n * user keeps editing. Commands queue per actor; a command whose target was deleted meanwhile\n * fails with a sentence instead of editing something else.\n */\nexport class ChartDirector {\n\tprivate readonly clock: ChartClock;\n\tprivate readonly queue: PerformanceQueue;\n\n\tconstructor(\n\t\tprivate readonly controller: ChartController,\n\t\treadonly presence: ChartPresence,\n\t\tprivate readonly options: ChartDirectorOptions\n\t) {\n\t\tthis.clock = options.clock ?? realChartClock;\n\t\tthis.queue = new PerformanceQueue(presence, {\n\t\t\tclock: this.clock,\n\t\t\tlinger: options.linger,\n\t\t\tbeginGesture: (key) => controller.beginGesture(key),\n\t\t\tendGesture: () => controller.endGesture()\n\t\t});\n\t}\n\n\t/** Acts out `commands` in order for `actor`. Resolves with one result per command. */\n\tperform(actor: ChartDirectorActor, commands: readonly ChartAgentCommand[]): Promise<ChartPerformanceResult[]> {\n\t\treturn this.queue.run(actor, async () => {\n\t\t\tconst results: ChartPerformanceResult[] = [];\n\t\t\tfor (const command of commands) results.push(await this.performOne(actor.id, command));\n\t\t\treturn results;\n\t\t});\n\t}\n\n\tprivate stale(command: ChartAgentCommand): string | null {\n\t\tconst spec = this.controller.getSpec();\n\t\tif (command.kind === 'setValue') {\n\t\t\tconst s = spec.series.find((x) => x.id === command.seriesId);\n\t\t\tif (!s) return `The series \"${command.seriesId}\" no longer exists.`;\n\t\t\tif (command.index < 0 || command.index >= spec.categories.length) return `Category ${command.index} no longer exists.`;\n\t\t\tif (!Number.isFinite(command.value)) return 'The value must be a finite number.';\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate move(id: string, from: { x: number; y: number }, to: { x: number; y: number }, ms: number, each?: (t: number) => void) {\n\t\treturn tweenPresenceCursor(this.presence, this.clock, id, from, to, ms, each);\n\t}\n\n\tprivate async performOne(id: string, command: ChartAgentCommand): Promise<ChartPerformanceResult> {\n\t\tconst stale = this.stale(command);\n\t\tif (stale) return { ok: false, command, message: stale };\n\t\tconst steps = planChartCommand(this.controller.getSpec(), this.options.scene(), command, this.options.speed);\n\t\tconst where = () => {\n\t\t\tconst a = this.presence.getState().actors.find((x) => x.id === id)!;\n\t\t\treturn { x: a.x, y: a.y };\n\t\t};\n\t\t{\n\t\t\tfor (const step of steps) {\n\t\t\t\tswitch (step.type) {\n\t\t\t\t\tcase 'say':\n\t\t\t\t\t\tthis.presence.set({ id, message: step.text });\n\t\t\t\t\t\tawait this.clock.wait(step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'move':\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'press':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: true });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'release':\n\t\t\t\t\t\tthis.presence.set({ id, pressed: false });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'drag': {\n\t\t\t\t\t\tif (command.kind !== 'setValue') break;\n\t\t\t\t\t\t// The value follows the cursor; the whole drag is one undo step.\n\t\t\t\t\t\tconst stale2 = this.stale(command);\n\t\t\t\t\t\tif (stale2) return { ok: false, command, message: stale2 };\n\t\t\t\t\t\tconst label = `${this.presence.getState().actors.find((a) => a.id === id)?.name ?? 'Agent'}: edit value`;\n\t\t\t\t\t\tawait this.move(id, where(), step.to, step.ms, (e) => {\n\t\t\t\t\t\t\tconst v = step.from + (step.value - step.from) * e;\n\t\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, Number(v.toPrecision(12)), { label });\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.controller.setValue(command.seriesId, command.index, step.value, { label });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'commit': {\n\t\t\t\t\t\tif (command.kind === 'select') this.controller.select(command.selection);\n\t\t\t\t\t\telse if (command.kind === 'update') {\n\t\t\t\t\t\t\tconst result = this.controller.update(command.patch, command.label ? { label: command.label } : {});\n\t\t\t\t\t\t\tif (!result.ok) return { ok: false, command, message: result.message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ok: true, command };\n\t\t}\n\t}\n}\n","import { readZip, type ZipArchive, type ZipReadOptions } from '../import/zip.js';\nimport { CHART_OOXML_NS, chartFromOoxml } from './ooxml.js';\nimport type { ChartSpec } from './types.js';\n\ntype ParserCtor = { new (): DOMParser };\n\n/** Office files charts can be read from. */\nexport type OfficeChartFileFormat = 'xlsx' | 'pptx' | 'docx';\n\n/** A chart found in an Excel workbook, PowerPoint deck or Word document. */\nexport interface OfficeFileChart {\n\t/** `chart-1`, `chart-2`, … in file order (sheets, slides or the document body). */\n\tid: string;\n\t/** The chart part, e.g. `xl/charts/chart1.xml` or `ppt/charts/chartEx1.xml`. */\n\tpath: string;\n\t/** `chart` for DrawingML (`c:chartSpace`), `chartex` for Office 2016 charts (`cx:chartSpace`). */\n\tpartKind: 'chart' | 'chartex';\n\t/** Worksheet or chart sheet name (xlsx). */\n\tsheet?: string;\n\t/** 1-based slide number (pptx). */\n\tslide?: number;\n\t/** Top-left cell the chart is anchored to, e.g. `B2` (xlsx worksheets). */\n\tanchor?: string;\n\t/** The cells the chart covers, e.g. `B2:H18` (xlsx two-cell anchors). */\n\trange?: string;\n\t/** The shape name (`cNvPr name`), e.g. `Chart 3`. */\n\tname?: string;\n\t/** The chart's title (may be empty). */\n\ttitle: string;\n\tspec: ChartSpec;\n\t/** Problems reading it, as sentences. */\n\tissues: string[];\n\t/** Features the chart editor cannot hold (3-D, stock, …). */\n\tunsupported: string[];\n\t/** Writing `spec` back loses nothing. */\n\tlossless: boolean;\n}\n\nexport interface OfficeChartsResult {\n\tformat: OfficeChartFileFormat;\n\tcharts: OfficeFileChart[];\n}\n\nexport interface OfficeChartsReadOptions extends ZipReadOptions {\n\t/** `DOMParser` constructor (default: the global one; pass jsdom's or xmldom's in Node). */\n\tDOMParser?: ParserCtor;\n\t/** Stop after this many charts (default 500). */\n\tmaxCharts?: number;\n}\n\n/** Thrown when the bytes are not a readable Office file of the expected kind. */\nexport class OfficeChartsError extends Error {\n\tconstructor(message: string, options?: { cause?: unknown }) {\n\t\tsuper(message, options);\n\t\tthis.name = 'OfficeChartsError';\n\t}\n}\n\nconst CHARTEX_NS = 'http://schemas.microsoft.com/office/drawing/2014/chartex';\nconst STRICT_CHART_NS = 'http://purl.oclc.org/ooxml/drawingml/chart';\n\ninterface Relationship {\n\ttype: string;\n\ttarget: string;\n\texternal: boolean;\n}\n\ninterface Reader {\n\tzip: ZipArchive;\n\tParser: ParserCtor;\n\tmax: number;\n\tcharts: OfficeFileChart[];\n\tseen: Set<string>;\n}\n\nconst dirname = (path: string) => path.slice(0, path.lastIndexOf('/') + 1);\n\nfunction resolvePartPath(baseDir: string, target: string): string {\n\tconst out: string[] = [];\n\tfor (const segment of (target.startsWith('/') ? target.slice(1) : baseDir + target).split('/')) {\n\t\tif (segment === '' || segment === '.') continue;\n\t\tif (segment === '..') out.pop();\n\t\telse out.push(segment);\n\t}\n\treturn out.join('/');\n}\n\nconst relsPathFor = (partPath: string) => `${dirname(partPath)}_rels/${partPath.slice(dirname(partPath).length)}.rels`;\n\nfunction elements(root: Document | Element, localName: string): Element[] {\n\treturn Array.from(root.getElementsByTagNameNS('*', localName));\n}\n\n/** A relationship id attribute (`r:id`, `r:embed`) in the transitional or strict namespace. */\nfunction relId(el: Element, localName = 'id'): string | undefined {\n\tfor (const a of Array.from(el.attributes)) {\n\t\tif (a.localName === localName && (a.namespaceURI?.includes('relationships') || a.prefix === 'r')) return a.value;\n\t}\n\treturn undefined;\n}\n\nconst firstChild = (el: Element | undefined, localName: string): Element | undefined =>\n\tel ? Array.from(el.children ?? el.childNodes).find((n): n is Element => n.nodeType === 1 && (n as Element).localName === localName) : undefined;\n\nasync function readXml(r: Reader, path: string): Promise<Document | null> {\n\tconst entry = r.zip.get(path) ?? r.zip.entries.find((e) => e.name.toLowerCase() === path.toLowerCase());\n\tif (!entry) return null;\n\tconst doc = new r.Parser().parseFromString(await r.zip.readText(entry), 'application/xml');\n\treturn doc.getElementsByTagName('parsererror').length ? null : doc;\n}\n\nasync function readRels(r: Reader, partPath: string): Promise<Map<string, Relationship>> {\n\tconst rels = new Map<string, Relationship>();\n\tconst doc = await readXml(r, relsPathFor(partPath));\n\tif (!doc) return rels;\n\tfor (const rel of elements(doc, 'Relationship')) {\n\t\tconst id = rel.getAttribute('Id');\n\t\tif (!id) continue;\n\t\tconst target = rel.getAttribute('Target') ?? '';\n\t\tconst external = rel.getAttribute('TargetMode')?.toLowerCase() === 'external';\n\t\trels.set(id, { type: rel.getAttribute('Type') ?? '', target: external ? target : resolvePartPath(dirname(partPath), target), external });\n\t}\n\treturn rels;\n}\n\nconst isChartRef = (el: Element) => el.localName === 'chart' && (el.namespaceURI === CHART_OOXML_NS || el.namespaceURI === STRICT_CHART_NS || el.namespaceURI === CHARTEX_NS);\n\n/** The `cNvPr name` of the graphic frame around a chart reference, if any. */\nfunction frameName(ref: Element): string | undefined {\n\tfor (let el: Element | null = ref.parentElement; el; el = el.parentElement) {\n\t\tif (el.localName === 'graphicFrame') {\n\t\t\tconst nv = elements(el, 'cNvPr')[0];\n\t\t\treturn nv?.getAttribute('name') || undefined;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Reads every chart a part references (`c:chart r:id`, `cx:chart r:id`) and adds it to `r.charts`. */\nasync function chartsInPart(r: Reader, root: Document | Element, rels: Map<string, Relationship>, place: (ref: Element) => Partial<OfficeFileChart>): Promise<void> {\n\tfor (const ref of elements(root, 'chart')) {\n\t\tif (r.charts.length >= r.max) return;\n\t\tif (!isChartRef(ref)) continue;\n\t\tconst rel = rels.get(relId(ref) ?? '');\n\t\tif (!rel || rel.external || r.seen.has(rel.target)) continue;\n\t\tconst entry = r.zip.get(rel.target);\n\t\tif (!entry) continue;\n\t\tr.seen.add(rel.target);\n\t\tconst read = chartFromOoxml(await r.zip.readText(entry), { DOMParser: r.Parser });\n\t\tconst name = frameName(ref);\n\t\tr.charts.push({\n\t\t\tid: `chart-${r.charts.length + 1}`,\n\t\t\tpath: rel.target,\n\t\t\tpartKind: ref.namespaceURI === CHARTEX_NS ? 'chartex' : 'chart',\n\t\t\t...place(ref),\n\t\t\t...(name ? { name } : {}),\n\t\t\ttitle: read.spec.title,\n\t\t\tspec: read.spec,\n\t\t\tissues: read.issues.map((i) => i.message),\n\t\t\tunsupported: read.unsupported,\n\t\t\tlossless: read.lossless\n\t\t});\n\t}\n}\n\n/** `0` → `A`, `27` → `AB`. */\nfunction columnName(index: number): string {\n\tlet name = '';\n\tfor (let n = index + 1; n > 0; n = Math.floor((n - 1) / 26)) name = String.fromCharCode(65 + ((n - 1) % 26)) + name;\n\treturn name;\n}\n\nfunction anchorCell(marker: Element | undefined): string | undefined {\n\tconst col = Number(firstChild(marker, 'col')?.textContent);\n\tconst row = Number(firstChild(marker, 'row')?.textContent);\n\treturn Number.isInteger(col) && Number.isInteger(row) && col >= 0 && row >= 0 ? `${columnName(col)}${row + 1}` : undefined;\n}\n\n/** The anchor (`xdr:twoCellAnchor`, `xdr:oneCellAnchor`) a chart reference sits in. */\nfunction drawingPlace(ref: Element): Partial<OfficeFileChart> {\n\tfor (let el: Element | null = ref.parentElement; el; el = el.parentElement) {\n\t\tif (el.localName === 'twoCellAnchor' || el.localName === 'oneCellAnchor') {\n\t\t\tconst anchor = anchorCell(firstChild(el, 'from'));\n\t\t\tconst to = el.localName === 'twoCellAnchor' ? anchorCell(firstChild(el, 'to')) : undefined;\n\t\t\treturn { ...(anchor ? { anchor } : {}), ...(anchor && to ? { range: `${anchor}:${to}` } : {}) };\n\t\t}\n\t\tif (el.localName === 'absoluteAnchor') return {};\n\t}\n\treturn {};\n}\n\nasync function readMainPart(r: Reader): Promise<{ path: string; doc: Document }> {\n\tconst rootRels = await readRels(r, '');\n\tconst main = [...rootRels.values()].find((rel) => /\\/officeDocument$/.test(rel.type) && !rel.external);\n\tconst doc = main ? await readXml(r, main.target) : null;\n\tif (!main || !doc) throw new OfficeChartsError('This is not an Office file: _rels/.rels names no main part (expected an .xlsx, .pptx or .docx file).');\n\treturn { path: main.target, doc };\n}\n\nasync function readXlsx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tconst rels = await readRels(r, main.path);\n\tfor (const sheet of elements(main.doc, 'sheet')) {\n\t\tconst rel = rels.get(relId(sheet) ?? '');\n\t\tif (!rel || rel.external) continue;\n\t\tconst doc = await readXml(r, rel.target);\n\t\tif (!doc) continue;\n\t\tconst sheetName = sheet.getAttribute('name') ?? rel.target;\n\t\tconst sheetRels = await readRels(r, rel.target);\n\t\tfor (const drawingRef of elements(doc, 'drawing')) {\n\t\t\tconst drawingRel = sheetRels.get(relId(drawingRef) ?? '');\n\t\t\tif (!drawingRel || drawingRel.external) continue;\n\t\t\tconst drawing = await readXml(r, drawingRel.target);\n\t\t\tif (!drawing) continue;\n\t\t\tconst drawingRels = await readRels(r, drawingRel.target);\n\t\t\tawait chartsInPart(r, drawing, drawingRels, (ref) => ({ sheet: sheetName, ...drawingPlace(ref) }));\n\t\t}\n\t}\n}\n\nasync function readPptx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tconst rels = await readRels(r, main.path);\n\tconst slides = elements(main.doc, 'sldId');\n\tfor (let i = 0; i < slides.length; i++) {\n\t\tconst rel = rels.get(relId(slides[i]) ?? '');\n\t\tif (!rel || rel.external) continue;\n\t\tconst doc = await readXml(r, rel.target);\n\t\tif (!doc) continue;\n\t\tawait chartsInPart(r, doc, await readRels(r, rel.target), () => ({ slide: i + 1 }));\n\t}\n}\n\nasync function readDocx(r: Reader, main: { path: string; doc: Document }): Promise<void> {\n\tawait chartsInPart(r, main.doc, await readRels(r, main.path), () => ({}));\n}\n\nasync function open(bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions): Promise<{ r: Reader; main: { path: string; doc: Document }; format: OfficeChartFileFormat }> {\n\tconst Parser = options.DOMParser ?? (globalThis as { DOMParser?: ParserCtor }).DOMParser;\n\tif (!Parser) throw new OfficeChartsError('Reading Office files needs a DOMParser. In Node, pass one (e.g. from jsdom or @xmldom/xmldom) as { DOMParser }.');\n\tlet zip: ZipArchive;\n\ttry {\n\t\tzip = await readZip(bytes, options);\n\t} catch (error) {\n\t\tthrow new OfficeChartsError(`This is not an Office file: ${(error as Error).message}`, { cause: error });\n\t}\n\tconst r: Reader = { zip, Parser, max: options.maxCharts ?? 500, charts: [], seen: new Set() };\n\tconst main = await readMainPart(r);\n\tconst root = main.doc.documentElement.localName;\n\tconst format: OfficeChartFileFormat | undefined = root === 'workbook' ? 'xlsx' : root === 'presentation' ? 'pptx' : root === 'document' ? 'docx' : undefined;\n\tif (!format) throw new OfficeChartsError(`The main part ${main.path} is a <${root}>; expected an Excel workbook, PowerPoint presentation or Word document.`);\n\treturn { r, main, format };\n}\n\nconst READERS: Record<OfficeChartFileFormat, (r: Reader, main: { path: string; doc: Document }) => Promise<void>> = { xlsx: readXlsx, pptx: readPptx, docx: readDocx };\n\n/**\n * Reads every chart in an Office file, detecting whether it is a workbook (charts on each\n * worksheet's or chart sheet's drawing, with the sheet name and anchor cell), a presentation\n * (charts on each slide, with the slide number) or a Word document (charts in the body).\n * DrawingML and Office 2016 chartex parts are both read with `chartFromOoxml`; data comes\n * from the cached values. Throws `OfficeChartsError` when the bytes are not an Office file.\n */\nexport async function extractOfficeCharts(bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}): Promise<OfficeChartsResult> {\n\tconst { r, main, format } = await open(bytes, options);\n\tawait READERS[format](r, main);\n\treturn { format, charts: r.charts };\n}\n\nasync function extractAs(format: OfficeChartFileFormat, bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions): Promise<OfficeFileChart[]> {\n\tconst result = await extractOfficeCharts(bytes, options);\n\tif (result.format !== format) throw new OfficeChartsError(`This is a .${result.format} file, not a .${format} file.`);\n\treturn result.charts;\n}\n\n/** The charts in an Excel workbook (`xl/drawings/drawingN.xml` → `xl/charts/chartN.xml`), with sheet and anchor cell. */\nexport const extractXlsxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('xlsx', bytes, options);\n\n/** The charts in a PowerPoint deck (`p:graphicFrame` → `ppt/charts/chartN.xml`), with their slide number. */\nexport const extractPptxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('pptx', bytes, options);\n\n/** The charts in the body of a Word document (`word/charts/chartN.xml`). */\nexport const extractDocxCharts = (bytes: ArrayBuffer | ArrayBufferView, options: OfficeChartsReadOptions = {}) => extractAs('docx', bytes, options);\n\n/** Where a chart sits, for labels: `Sheet1!B2`, `Slide 3`, `Document`. */\nexport function describeOfficeChartPlace(chart: OfficeFileChart): string {\n\tif (chart.sheet !== undefined) return chart.anchor ? `${chart.sheet}!${chart.anchor}` : chart.sheet;\n\tif (chart.slide !== undefined) return `Slide ${chart.slide}`;\n\treturn 'Document';\n}\n","import type { AgentTool, AgentToolProvider } from '../tools/registry.js';\nimport type { JsonSchema } from '../tools/schema.js';\nimport type { ChartController, ChartSpecPatch } from './controller.js';\nimport { describeOfficeChartPlace, extractOfficeCharts, type OfficeChartsResult, type OfficeFileChart } from './office-files.js';\n\ntype ParserCtor = { new (): DOMParser };\n\n/** A file the host has opened and lets the agent read charts from. */\nexport interface OfficeChartFile {\n\tname: string;\n\tdata: ArrayBuffer | ArrayBufferView;\n}\n\nexport interface OfficeChartToolProviderOptions {\n\t/** Provider id (unique per registry). Default `office-charts`. */\n\tid?: string;\n\t/** Always prefix tool names with `<namespace>__`. */\n\tnamespace?: string;\n\t/**\n\t * Files the user opened. With it, the tools take a `file` name (and `list_open_files` lists\n\t * them); without it, they take the file's bytes as base64 `data`.\n\t */\n\tfiles?: () => readonly OfficeChartFile[];\n\t/** Enables `load_file_chart`, which replaces this chart with one from a file. */\n\tcontroller?: ChartController;\n\t/** The chart cannot be edited: `load_file_chart` is hidden. A string is the reason. */\n\treadOnly?: boolean | string | (() => boolean | string);\n\t/** `DOMParser` constructor (default: the global one). */\n\tDOMParser?: ParserCtor;\n}\n\nconst READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false } as const;\nconst DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false } as const;\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nfunction fromBase64(data: string): Uint8Array {\n\tconst clean = data.replace(/^data:[^,]*,/, '').replace(/\\s+/g, '');\n\tlet binary: string;\n\ttry {\n\t\tbinary = atob(clean);\n\t} catch {\n\t\treturn fail('\"data\" is not valid base64. Pass the whole .xlsx, .pptx or .docx file encoded as base64 (a data: URL prefix is fine).');\n\t}\n\tconst out = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n\treturn out;\n}\n\n/** The fields of a chart an agent needs to pick one, without the full spec. */\nfunction chartSummary(chart: OfficeFileChart) {\n\treturn {\n\t\tid: chart.id,\n\t\tplace: describeOfficeChartPlace(chart),\n\t\t...(chart.sheet !== undefined ? { sheet: chart.sheet } : {}),\n\t\t...(chart.slide !== undefined ? { slide: chart.slide } : {}),\n\t\t...(chart.anchor ? { anchor: chart.anchor } : {}),\n\t\t...(chart.range ? { range: chart.range } : {}),\n\t\t...(chart.name ? { name: chart.name } : {}),\n\t\tpath: chart.path,\n\t\tpartKind: chart.partKind,\n\t\ttitle: chart.title,\n\t\ttype: chart.spec.type,\n\t\tseries: chart.spec.series.map((s) => s.name),\n\t\tcategories: chart.spec.categories.length,\n\t\tissues: chart.issues,\n\t\tunsupported: chart.unsupported,\n\t\tlossless: chart.lossless\n\t};\n}\n\n/**\n * Agent tools for reading charts out of Office files (`.xlsx`, `.pptx`, `.docx`), for a\n * `ToolRegistry`. `list_file_charts` lists every chart with where it sits (sheet and anchor\n * cell, slide number) and its read problems; `get_file_chart` returns one chart's full spec;\n * with a `controller`, `load_file_chart` replaces that chart editor's chart with one of them\n * as one undo step. With `files`, the tools address the files the user opened by name\n * (`list_open_files`); otherwise they take the file as base64.\n */\nexport function createOfficeChartToolProvider(options: OfficeChartToolProviderOptions = {}): AgentToolProvider {\n\tconst cache = new WeakMap<OfficeChartFile, Promise<OfficeChartsResult>>();\n\tconst readOnlyReason = (): string | null => {\n\t\tconst r = typeof options.readOnly === 'function' ? options.readOnly() : options.readOnly;\n\t\tif (!r) return null;\n\t\treturn typeof r === 'string' ? r : 'This chart is read-only.';\n\t};\n\n\tconst source: Record<string, JsonSchema> = options.files\n\t\t? { file: { type: 'string', description: 'Name of an open file, as list_open_files returns it.' } }\n\t\t: { data: { type: 'string', description: 'The whole .xlsx, .pptx or .docx file as base64 (a data: URL prefix is allowed).' } };\n\tconst sourceKey = options.files ? 'file' : 'data';\n\n\tconst read = (args: Record<string, unknown>): Promise<OfficeChartsResult> => {\n\t\tif (!options.files) return extractOfficeCharts(fromBase64(String(args.data)), { DOMParser: options.DOMParser });\n\t\tconst files = options.files();\n\t\tconst file = files.find((f) => f.name === args.file);\n\t\tif (!file) return fail(`There is no open file \"${String(args.file)}\"; expected one of ${files.map((f) => JSON.stringify(f.name)).join(', ') || '(none; ask the user to open an .xlsx, .pptx or .docx file)'}.`);\n\t\tlet result = cache.get(file);\n\t\tif (!result) {\n\t\t\tresult = extractOfficeCharts(file.data, { DOMParser: options.DOMParser });\n\t\t\tcache.set(file, result);\n\t\t\tresult.catch(() => cache.delete(file));\n\t\t}\n\t\treturn result;\n\t};\n\tconst chartById = async (args: Record<string, unknown>) => {\n\t\tconst { charts } = await read(args);\n\t\tconst chart = charts.find((c) => c.id === args.chartId);\n\t\tif (!chart) fail(`There is no chart \"${String(args.chartId)}\" in this file; expected one of ${charts.map((c) => `\"${c.id}\" (${describeOfficeChartPlace(c)})`).join(', ') || '(none: the file has no charts)'}.`);\n\t\treturn chart!;\n\t};\n\tconst CHART_ID: JsonSchema = { type: 'string', description: 'Chart id from list_file_charts, e.g. \"chart-1\".' };\n\n\tconst listOpenFiles: AgentTool = {\n\t\tname: 'list_open_files',\n\t\ttitle: 'List open files',\n\t\tdescription: 'Lists the Office files the user opened that charts can be read from. Returns their names and sizes in bytes.',\n\t\tinputSchema: { type: 'object', properties: {}, additionalProperties: false },\n\t\tannotations: { title: 'List open files', ...READ },\n\t\thandler: () => ({ files: (options.files?.() ?? []).map((f) => ({ name: f.name, bytes: f.data.byteLength })) })\n\t};\n\n\tconst listCharts: AgentTool = {\n\t\tname: 'list_file_charts',\n\t\ttitle: 'List the charts in an Office file',\n\t\tdescription:\n\t\t\t'Reads an Excel workbook, PowerPoint deck or Word document and lists its charts in file order: id, where it sits (sheet name and anchor cell, or slide number), title, type, series names, number of categories, read problems, features the chart editor cannot hold, and whether it reads losslessly. Pass an id to get_file_chart or load_file_chart.',\n\t\tinputSchema: { type: 'object', properties: { ...source }, required: [sourceKey], additionalProperties: false },\n\t\tannotations: { title: 'List the charts in an Office file', ...READ },\n\t\thandler: async (args) => {\n\t\t\tconst result = await read(args);\n\t\t\treturn { format: result.format, charts: result.charts.map(chartSummary) };\n\t\t}\n\t};\n\n\tconst getChart: AgentTool = {\n\t\tname: 'get_file_chart',\n\t\ttitle: 'Get a chart from an Office file',\n\t\tdescription: 'Returns one chart of an Office file with its full chart spec (data, axes, series styles), where it sits and its read problems.',\n\t\tinputSchema: { type: 'object', properties: { ...source, chartId: CHART_ID }, required: [sourceKey, 'chartId'], additionalProperties: false },\n\t\tannotations: { title: 'Get a chart from an Office file', ...READ },\n\t\thandler: async (args) => {\n\t\t\tconst chart = await chartById(args);\n\t\t\treturn { ...chartSummary(chart), spec: chart.spec };\n\t\t}\n\t};\n\n\tconst loadChart: AgentTool = {\n\t\tname: 'load_file_chart',\n\t\ttitle: 'Load a chart from an Office file',\n\t\tdescription: 'Replaces the chart in the editor with a chart from an Office file, as one undo step. Returns the new spec, read problems and features the editor could not keep.',\n\t\tinputSchema: { type: 'object', properties: { ...source, chartId: CHART_ID }, required: [sourceKey, 'chartId'], additionalProperties: false },\n\t\tannotations: { title: 'Load a chart from an Office file', ...DESTRUCTIVE },\n\t\thandler: async (args) => {\n\t\t\tconst reason = readOnlyReason();\n\t\t\tif (reason) fail(reason);\n\t\t\tconst chart = await chartById(args);\n\t\t\tconst result = options.controller!.update({ ...chart.spec } as ChartSpecPatch, { label: 'Load chart from file' });\n\t\t\tif (!result.ok) fail(result.message ?? 'The chart could not be loaded.');\n\t\t\treturn { id: chart.id, place: describeOfficeChartPlace(chart), spec: options.controller!.toJSON(), issues: chart.issues, unsupported: chart.unsupported, lossless: chart.lossless };\n\t\t}\n\t};\n\n\treturn {\n\t\tid: options.id ?? 'office-charts',\n\t\t...(options.namespace ? { namespace: options.namespace } : {}),\n\t\ttools: () => [...(options.files ? [listOpenFiles] : []), listCharts, getChart, ...(options.controller && !readOnlyReason() ? [loadChart] : [])]\n\t};\n}\n"],"mappings":"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","names":["open","resolve","fail","READ","DESTRUCTIVE","fail"]}