@sqlrooms/vega 0.29.0-rc.11 → 0.29.0-rc.13

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.
package/README.md CHANGED
@@ -146,9 +146,12 @@ These fields are supplied by the LLM when invoking the tool (not passed into
146
146
 
147
147
  ## Markdown document image assets
148
148
 
149
+ The host store must include `MarkdownDocumentsSliceState`; image assets are stored
150
+ in `store.markdownDocuments` alongside the document’s Markdown content.
151
+
149
152
  `createChartImageForMarkdownTool(store)` creates an AI-only companion tool that
150
153
  renders a Vega chart to SVG or PNG, stores it as an asset on a
151
- `@sqlrooms/documents` Markdown artifact, and returns a ready-to-insert Markdown
154
+ `@sqlrooms/documents` `markdown-document` artifact, and returns a ready-to-insert Markdown
152
155
  image link such as:
153
156
 
154
157
  ```md
@@ -168,5 +171,4 @@ and written into the SVG/PNG as a concrete color. The tool also accepts
168
171
 
169
172
  ## Example apps
170
173
 
171
- - Vega example: https://github.com/sqlrooms/examples/tree/main/vega
172
174
  - AI example (with chart tool): https://github.com/sqlrooms/examples/tree/main/ai
@@ -1,5 +1,5 @@
1
1
  import type { AiSliceState } from '@sqlrooms/ai-core';
2
- import type { DocumentsSliceState } from '@sqlrooms/documents';
2
+ import type { MarkdownDocumentsSliceState } from '@sqlrooms/documents';
3
3
  import { type DuckDbSliceState } from '@sqlrooms/duckdb';
4
4
  import { z } from 'zod';
5
5
  export declare const ChartImageForMarkdownToolParameters: z.ZodObject<{
@@ -40,7 +40,7 @@ export type ChartImageForMarkdownToolOutput = {
40
40
  type StoreLike<S> = {
41
41
  getState: () => S;
42
42
  };
43
- type ChartImageToolState = AiSliceState & DuckDbSliceState & DocumentsSliceState;
43
+ type ChartImageToolState = AiSliceState & DuckDbSliceState & MarkdownDocumentsSliceState;
44
44
  export declare function createChartImageForMarkdownTool<S extends ChartImageToolState = ChartImageToolState>(store: StoreLike<S>): import("ai").Tool<{
45
45
  documentArtifactId: string;
46
46
  format: "svg" | "png";
@@ -1 +1 @@
1
- {"version":3,"file":"ChartImageForMarkdownTool.d.ts","sourceRoot":"","sources":["../src/ChartImageForMarkdownTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAmB,KAAK,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAIzE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAStB,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBA6C7C,CAAC;AAEJ,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CACvD,OAAO,mCAAmC,CAC3C,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,GAAG,WAAW,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,SAAS,CAAC,CAAC,IAAI;IAClB,QAAQ,EAAE,MAAM,CAAC,CAAC;CACnB,CAAC;AAEF,KAAK,mBAAmB,GAAG,YAAY,GACrC,gBAAgB,GAChB,mBAAmB,CAAC;AAEtB,wBAAgB,+BAA+B,CAC7C,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,EACnD,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FpB"}
1
+ {"version":3,"file":"ChartImageForMarkdownTool.d.ts","sourceRoot":"","sources":["../src/ChartImageForMarkdownTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAmB,KAAK,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAIzE,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAStB,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBA6C7C,CAAC;AAEJ,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CACvD,OAAO,mCAAmC,CAC3C,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,GAAG,WAAW,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,SAAS,CAAC,CAAC,IAAI;IAClB,QAAQ,EAAE,MAAM,CAAC,CAAC;CACnB,CAAC;AAEF,KAAK,mBAAmB,GAAG,YAAY,GACrC,gBAAgB,GAChB,2BAA2B,CAAC;AAE9B,wBAAgB,+BAA+B,CAC7C,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,EACnD,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4FpB"}
@@ -85,7 +85,9 @@ For portable Markdown documents, the default renderTheme is light with a white b
85
85
  const timestamp = Date.now();
86
86
  const assetId = params.assetId ?? createChartAssetId(params, source.sourceToolCallId);
87
87
  const filename = `${assetId}.${params.format}`;
88
- store.getState().documents.upsertAsset(params.documentArtifactId, {
88
+ store
89
+ .getState()
90
+ .markdownDocuments.upsertAsset(params.documentArtifactId, {
89
91
  id: assetId,
90
92
  mediaType: image.mediaType,
91
93
  encoding: image.encoding,
@@ -1 +1 @@
1
- {"version":3,"file":"ChartImageForMarkdownTool.js","sourceRoot":"","sources":["../src/ChartImageForMarkdownTool.ts"],"names":[],"mappings":"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","sourcesContent":["import type {AiSliceState} from '@sqlrooms/ai-core';\nimport type {DocumentsSliceState} from '@sqlrooms/documents';\nimport {arrowTableToJson, type DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {tool} from 'ai';\nimport {parse as vegaParse, View} from 'vega';\nimport {compile, type TopLevelSpec} from 'vega-lite';\nimport {z} from 'zod';\nimport {darkTheme} from './themes/darkTheme';\nimport {lightTheme} from './themes/lightTheme';\nimport type {VegaChartToolOutput} from './VegaChartTool';\n\nconst TAILWIND_BACKGROUND_VARIABLE = '--background';\nconst FALLBACK_LIGHT_BACKGROUND = '#ffffff';\nconst FALLBACK_DARK_BACKGROUND = 'oklch(0.145 0 0)';\n\nexport const ChartImageForMarkdownToolParameters = z\n .object({\n documentArtifactId: z\n .string()\n .describe('Target Markdown document artifact ID.'),\n sourceToolCallId: z\n .string()\n .optional()\n .describe('Prior successful chart tool call ID to render.'),\n sqlQuery: z\n .string()\n .optional()\n .describe('SQL query to render when no sourceToolCallId is provided.'),\n vegaLiteSpec: z\n .string()\n .optional()\n .describe('Vega-Lite JSON spec string without inline data.'),\n format: z.enum(['svg', 'png']).optional().default('svg'),\n assetId: z.string().optional().describe('Stable document-local asset ID.'),\n alt: z.string().describe('Markdown image alt text.'),\n title: z.string().optional().describe('Optional image title.'),\n width: z.number().positive().optional().default(960),\n height: z.number().positive().optional().default(540),\n pngScale: z.number().positive().optional().default(2),\n renderTheme: z\n .enum(['light', 'dark'])\n .optional()\n .default('light')\n .describe(\n 'Static chart theme for the rendered image. Defaults to light for portable Markdown documents.',\n ),\n background: z\n .string()\n .optional()\n .describe(\n 'CSS color used as the exported image background. Defaults to the resolved Tailwind --background token for the requested theme when available.',\n ),\n })\n .refine(\n (input) =>\n Boolean(input.sourceToolCallId) ||\n (Boolean(input.sqlQuery) && Boolean(input.vegaLiteSpec)),\n {\n message: 'Provide sourceToolCallId or both sqlQuery and vegaLiteSpec.',\n },\n );\n\nexport type ChartImageForMarkdownToolParameters = z.infer<\n typeof ChartImageForMarkdownToolParameters\n>;\n\nexport type ChartImageForMarkdownToolOutput = {\n success: boolean;\n details: string;\n documentArtifactId: string;\n assetId?: string;\n markdown?: string;\n mediaType?: 'image/svg+xml' | 'image/png';\n encoding?: 'utf8' | 'base64';\n format?: 'svg' | 'png';\n renderTheme?: 'light' | 'dark';\n background?: string;\n error?: string;\n};\n\ntype StoreLike<S> = {\n getState: () => S;\n};\n\ntype ChartImageToolState = AiSliceState &\n DuckDbSliceState &\n DocumentsSliceState;\n\nexport function createChartImageForMarkdownTool<\n S extends ChartImageToolState = ChartImageToolState,\n>(store: StoreLike<S>) {\n return tool({\n description: `Render an existing Vega chart analysis as a static SVG or PNG image asset for a Markdown document.\nUse this before embedding chart images in document artifacts. The tool stores the image in the target document and returns a Markdown image link using asset://.\nFor portable Markdown documents, the default renderTheme is light with a white background. Only request dark rendering when the user explicitly wants a dark static image.`,\n inputSchema: ChartImageForMarkdownToolParameters,\n execute: async (params, options) => {\n const abortSignal = options?.abortSignal;\n try {\n const source = resolveChartSource(store.getState(), params);\n if (!source.success) {\n return {\n success: false,\n details: source.error,\n documentArtifactId: params.documentArtifactId,\n error: source.error,\n } satisfies ChartImageForMarkdownToolOutput;\n }\n\n const connector = await store.getState().db.getConnector();\n const queryResult = await connector.query(source.sqlQuery, {\n signal: abortSignal,\n });\n if (abortSignal?.aborted) {\n throw new Error('Chart image rendering was aborted');\n }\n\n const values = arrowTableToJson(queryResult);\n const image = await renderVegaLiteImage({\n spec: source.vegaLiteSpec,\n values,\n format: params.format,\n width: params.width,\n height: params.height,\n pngScale: params.pngScale,\n renderTheme: params.renderTheme,\n background: resolveRenderBackground(params),\n });\n const timestamp = Date.now();\n const assetId =\n params.assetId ?? createChartAssetId(params, source.sourceToolCallId);\n const filename = `${assetId}.${params.format}`;\n\n store.getState().documents.upsertAsset(params.documentArtifactId, {\n id: assetId,\n mediaType: image.mediaType,\n encoding: image.encoding,\n data: image.data,\n filename,\n alt: params.alt,\n title: params.title,\n provenance: {\n sourceToolCallId: source.sourceToolCallId,\n sqlQuery: source.sqlQuery,\n vegaLiteSpec: source.vegaLiteSpec,\n renderTheme: params.renderTheme,\n background: image.background,\n renderedAt: new Date(timestamp).toISOString(),\n },\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n\n return {\n success: true,\n details: `Stored ${params.format.toUpperCase()} chart image asset \"${assetId}\" in document \"${params.documentArtifactId}\".`,\n documentArtifactId: params.documentArtifactId,\n assetId,\n markdown: `![${escapeMarkdownAlt(params.alt)}](asset://${encodeURIComponent(assetId)})`,\n mediaType: image.mediaType,\n encoding: image.encoding,\n format: params.format,\n renderTheme: params.renderTheme,\n background: image.background,\n } satisfies ChartImageForMarkdownToolOutput;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n details: `Failed to render chart image: ${message}`,\n documentArtifactId: params.documentArtifactId,\n error: message,\n } satisfies ChartImageForMarkdownToolOutput;\n }\n },\n toModelOutput: ({output}) => ({\n type: 'text',\n value: JSON.stringify(output),\n }),\n });\n}\n\nfunction resolveChartSource(\n state: ChartImageToolState,\n params: ChartImageForMarkdownToolParameters,\n):\n | {\n success: true;\n sqlQuery: string;\n vegaLiteSpec: TopLevelSpec;\n sourceToolCallId?: string;\n }\n | {success: false; error: string} {\n if (params.sourceToolCallId) {\n const output = findChartToolOutput(state, params.sourceToolCallId);\n if (!output) {\n return {\n success: false,\n error: `No successful chart tool call found for \"${params.sourceToolCallId}\".`,\n };\n }\n if (!output.sqlQuery || !output.vegaLiteSpec) {\n return {\n success: false,\n error: `Chart tool call \"${params.sourceToolCallId}\" has no renderable SQL query or Vega-Lite spec.`,\n };\n }\n return {\n success: true,\n sqlQuery: output.sqlQuery,\n vegaLiteSpec: output.vegaLiteSpec,\n sourceToolCallId: params.sourceToolCallId,\n };\n }\n\n if (!params.sqlQuery || !params.vegaLiteSpec) {\n return {\n success: false,\n error: 'Provide sourceToolCallId or both sqlQuery and vegaLiteSpec.',\n };\n }\n\n try {\n return {\n success: true,\n sqlQuery: params.sqlQuery,\n vegaLiteSpec: JSON.parse(params.vegaLiteSpec) as TopLevelSpec,\n };\n } catch (error) {\n return {\n success: false,\n error: `Invalid Vega-Lite JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nfunction findChartToolOutput(\n state: ChartImageToolState,\n sourceToolCallId: string,\n): VegaChartToolOutput | undefined {\n const currentSession = state.ai.getCurrentSession();\n const messages = currentSession?.uiMessages ?? [];\n for (const message of messages) {\n if (message.role !== 'assistant') continue;\n for (const part of message.parts) {\n if (!('toolCallId' in part) || part.toolCallId !== sourceToolCallId) {\n continue;\n }\n if (\n part.state === 'output-available' &&\n 'output' in part &&\n isVegaChartToolOutput(part.output)\n ) {\n return part.output;\n }\n }\n }\n return undefined;\n}\n\nfunction isVegaChartToolOutput(value: unknown): value is VegaChartToolOutput {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n (value as VegaChartToolOutput).success === true &&\n 'sqlQuery' in value &&\n 'vegaLiteSpec' in value\n );\n}\n\nasync function renderVegaLiteImage({\n spec,\n values,\n format,\n width,\n height,\n pngScale,\n renderTheme,\n background,\n}: {\n spec: TopLevelSpec;\n values: Record<string, unknown>[];\n format: 'svg' | 'png';\n width: number;\n height: number;\n pngScale: number;\n renderTheme: 'light' | 'dark';\n background: string;\n}) {\n const themeConfig = renderTheme === 'dark' ? darkTheme : lightTheme;\n const specWithData = {\n padding: 10,\n ...spec,\n background,\n config: {\n ...themeConfig,\n ...(spec.config ?? {}),\n background,\n },\n data: {values},\n width,\n height,\n autosize: {contains: 'padding'},\n } as TopLevelSpec;\n const compiled = compile(specWithData).spec;\n const view = new View(vegaParse(compiled), {\n renderer: format === 'png' ? 'canvas' : 'none',\n });\n\n try {\n await view.runAsync();\n if (format === 'svg') {\n return {\n mediaType: 'image/svg+xml' as const,\n encoding: 'utf8' as const,\n background,\n data: await view.toSVG(),\n };\n }\n const canvas = await view.toCanvas(pngScale);\n return {\n mediaType: 'image/png' as const,\n encoding: 'base64' as const,\n background,\n data: await canvasToBase64(canvas),\n };\n } finally {\n view.finalize();\n }\n}\n\nasync function canvasToBase64(canvas: HTMLCanvasElement) {\n const dataUrl = canvas.toDataURL('image/png');\n return dataUrl.replace(/^data:image\\/png;base64,/, '');\n}\n\nfunction createChartAssetId(\n params: ChartImageForMarkdownToolParameters,\n sourceToolCallId?: string,\n) {\n const base = params.title || params.alt || sourceToolCallId || 'chart';\n const slug = base\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return `${slug || 'chart'}-${Date.now().toString(36)}`;\n}\n\nfunction escapeMarkdownAlt(value: string) {\n return value.replace(/]/g, '\\\\]');\n}\n\nfunction resolveRenderBackground(params: ChartImageForMarkdownToolParameters) {\n if (params.background) return params.background;\n const tailwindBackground = resolveTailwindBackgroundForTheme(\n params.renderTheme,\n );\n if (tailwindBackground) return tailwindBackground;\n return params.renderTheme === 'dark'\n ? FALLBACK_DARK_BACKGROUND\n : FALLBACK_LIGHT_BACKGROUND;\n}\n\nfunction resolveTailwindBackgroundForTheme(renderTheme: 'light' | 'dark') {\n if (typeof document === 'undefined') return undefined;\n const currentTheme = document.documentElement.classList.contains('dark')\n ? 'dark'\n : 'light';\n if (currentTheme !== renderTheme) return undefined;\n\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(TAILWIND_BACKGROUND_VARIABLE)\n .trim();\n return value || undefined;\n}\n"]}
1
+ {"version":3,"file":"ChartImageForMarkdownTool.js","sourceRoot":"","sources":["../src/ChartImageForMarkdownTool.ts"],"names":[],"mappings":"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","sourcesContent":["import type {AiSliceState} from '@sqlrooms/ai-core';\nimport type {MarkdownDocumentsSliceState} from '@sqlrooms/documents';\nimport {arrowTableToJson, type DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {tool} from 'ai';\nimport {parse as vegaParse, View} from 'vega';\nimport {compile, type TopLevelSpec} from 'vega-lite';\nimport {z} from 'zod';\nimport {darkTheme} from './themes/darkTheme';\nimport {lightTheme} from './themes/lightTheme';\nimport type {VegaChartToolOutput} from './VegaChartTool';\n\nconst TAILWIND_BACKGROUND_VARIABLE = '--background';\nconst FALLBACK_LIGHT_BACKGROUND = '#ffffff';\nconst FALLBACK_DARK_BACKGROUND = 'oklch(0.145 0 0)';\n\nexport const ChartImageForMarkdownToolParameters = z\n .object({\n documentArtifactId: z\n .string()\n .describe('Target Markdown document artifact ID.'),\n sourceToolCallId: z\n .string()\n .optional()\n .describe('Prior successful chart tool call ID to render.'),\n sqlQuery: z\n .string()\n .optional()\n .describe('SQL query to render when no sourceToolCallId is provided.'),\n vegaLiteSpec: z\n .string()\n .optional()\n .describe('Vega-Lite JSON spec string without inline data.'),\n format: z.enum(['svg', 'png']).optional().default('svg'),\n assetId: z.string().optional().describe('Stable document-local asset ID.'),\n alt: z.string().describe('Markdown image alt text.'),\n title: z.string().optional().describe('Optional image title.'),\n width: z.number().positive().optional().default(960),\n height: z.number().positive().optional().default(540),\n pngScale: z.number().positive().optional().default(2),\n renderTheme: z\n .enum(['light', 'dark'])\n .optional()\n .default('light')\n .describe(\n 'Static chart theme for the rendered image. Defaults to light for portable Markdown documents.',\n ),\n background: z\n .string()\n .optional()\n .describe(\n 'CSS color used as the exported image background. Defaults to the resolved Tailwind --background token for the requested theme when available.',\n ),\n })\n .refine(\n (input) =>\n Boolean(input.sourceToolCallId) ||\n (Boolean(input.sqlQuery) && Boolean(input.vegaLiteSpec)),\n {\n message: 'Provide sourceToolCallId or both sqlQuery and vegaLiteSpec.',\n },\n );\n\nexport type ChartImageForMarkdownToolParameters = z.infer<\n typeof ChartImageForMarkdownToolParameters\n>;\n\nexport type ChartImageForMarkdownToolOutput = {\n success: boolean;\n details: string;\n documentArtifactId: string;\n assetId?: string;\n markdown?: string;\n mediaType?: 'image/svg+xml' | 'image/png';\n encoding?: 'utf8' | 'base64';\n format?: 'svg' | 'png';\n renderTheme?: 'light' | 'dark';\n background?: string;\n error?: string;\n};\n\ntype StoreLike<S> = {\n getState: () => S;\n};\n\ntype ChartImageToolState = AiSliceState &\n DuckDbSliceState &\n MarkdownDocumentsSliceState;\n\nexport function createChartImageForMarkdownTool<\n S extends ChartImageToolState = ChartImageToolState,\n>(store: StoreLike<S>) {\n return tool({\n description: `Render an existing Vega chart analysis as a static SVG or PNG image asset for a Markdown document.\nUse this before embedding chart images in document artifacts. The tool stores the image in the target document and returns a Markdown image link using asset://.\nFor portable Markdown documents, the default renderTheme is light with a white background. Only request dark rendering when the user explicitly wants a dark static image.`,\n inputSchema: ChartImageForMarkdownToolParameters,\n execute: async (params, options) => {\n const abortSignal = options?.abortSignal;\n try {\n const source = resolveChartSource(store.getState(), params);\n if (!source.success) {\n return {\n success: false,\n details: source.error,\n documentArtifactId: params.documentArtifactId,\n error: source.error,\n } satisfies ChartImageForMarkdownToolOutput;\n }\n\n const connector = await store.getState().db.getConnector();\n const queryResult = await connector.query(source.sqlQuery, {\n signal: abortSignal,\n });\n if (abortSignal?.aborted) {\n throw new Error('Chart image rendering was aborted');\n }\n\n const values = arrowTableToJson(queryResult);\n const image = await renderVegaLiteImage({\n spec: source.vegaLiteSpec,\n values,\n format: params.format,\n width: params.width,\n height: params.height,\n pngScale: params.pngScale,\n renderTheme: params.renderTheme,\n background: resolveRenderBackground(params),\n });\n const timestamp = Date.now();\n const assetId =\n params.assetId ?? createChartAssetId(params, source.sourceToolCallId);\n const filename = `${assetId}.${params.format}`;\n\n store\n .getState()\n .markdownDocuments.upsertAsset(params.documentArtifactId, {\n id: assetId,\n mediaType: image.mediaType,\n encoding: image.encoding,\n data: image.data,\n filename,\n alt: params.alt,\n title: params.title,\n provenance: {\n sourceToolCallId: source.sourceToolCallId,\n sqlQuery: source.sqlQuery,\n vegaLiteSpec: source.vegaLiteSpec,\n renderTheme: params.renderTheme,\n background: image.background,\n renderedAt: new Date(timestamp).toISOString(),\n },\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n\n return {\n success: true,\n details: `Stored ${params.format.toUpperCase()} chart image asset \"${assetId}\" in document \"${params.documentArtifactId}\".`,\n documentArtifactId: params.documentArtifactId,\n assetId,\n markdown: `![${escapeMarkdownAlt(params.alt)}](asset://${encodeURIComponent(assetId)})`,\n mediaType: image.mediaType,\n encoding: image.encoding,\n format: params.format,\n renderTheme: params.renderTheme,\n background: image.background,\n } satisfies ChartImageForMarkdownToolOutput;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n details: `Failed to render chart image: ${message}`,\n documentArtifactId: params.documentArtifactId,\n error: message,\n } satisfies ChartImageForMarkdownToolOutput;\n }\n },\n toModelOutput: ({output}) => ({\n type: 'text',\n value: JSON.stringify(output),\n }),\n });\n}\n\nfunction resolveChartSource(\n state: ChartImageToolState,\n params: ChartImageForMarkdownToolParameters,\n):\n | {\n success: true;\n sqlQuery: string;\n vegaLiteSpec: TopLevelSpec;\n sourceToolCallId?: string;\n }\n | {success: false; error: string} {\n if (params.sourceToolCallId) {\n const output = findChartToolOutput(state, params.sourceToolCallId);\n if (!output) {\n return {\n success: false,\n error: `No successful chart tool call found for \"${params.sourceToolCallId}\".`,\n };\n }\n if (!output.sqlQuery || !output.vegaLiteSpec) {\n return {\n success: false,\n error: `Chart tool call \"${params.sourceToolCallId}\" has no renderable SQL query or Vega-Lite spec.`,\n };\n }\n return {\n success: true,\n sqlQuery: output.sqlQuery,\n vegaLiteSpec: output.vegaLiteSpec,\n sourceToolCallId: params.sourceToolCallId,\n };\n }\n\n if (!params.sqlQuery || !params.vegaLiteSpec) {\n return {\n success: false,\n error: 'Provide sourceToolCallId or both sqlQuery and vegaLiteSpec.',\n };\n }\n\n try {\n return {\n success: true,\n sqlQuery: params.sqlQuery,\n vegaLiteSpec: JSON.parse(params.vegaLiteSpec) as TopLevelSpec,\n };\n } catch (error) {\n return {\n success: false,\n error: `Invalid Vega-Lite JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nfunction findChartToolOutput(\n state: ChartImageToolState,\n sourceToolCallId: string,\n): VegaChartToolOutput | undefined {\n const currentSession = state.ai.getCurrentSession();\n const messages = currentSession?.uiMessages ?? [];\n for (const message of messages) {\n if (message.role !== 'assistant') continue;\n for (const part of message.parts) {\n if (!('toolCallId' in part) || part.toolCallId !== sourceToolCallId) {\n continue;\n }\n if (\n part.state === 'output-available' &&\n 'output' in part &&\n isVegaChartToolOutput(part.output)\n ) {\n return part.output;\n }\n }\n }\n return undefined;\n}\n\nfunction isVegaChartToolOutput(value: unknown): value is VegaChartToolOutput {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n (value as VegaChartToolOutput).success === true &&\n 'sqlQuery' in value &&\n 'vegaLiteSpec' in value\n );\n}\n\nasync function renderVegaLiteImage({\n spec,\n values,\n format,\n width,\n height,\n pngScale,\n renderTheme,\n background,\n}: {\n spec: TopLevelSpec;\n values: Record<string, unknown>[];\n format: 'svg' | 'png';\n width: number;\n height: number;\n pngScale: number;\n renderTheme: 'light' | 'dark';\n background: string;\n}) {\n const themeConfig = renderTheme === 'dark' ? darkTheme : lightTheme;\n const specWithData = {\n padding: 10,\n ...spec,\n background,\n config: {\n ...themeConfig,\n ...(spec.config ?? {}),\n background,\n },\n data: {values},\n width,\n height,\n autosize: {contains: 'padding'},\n } as TopLevelSpec;\n const compiled = compile(specWithData).spec;\n const view = new View(vegaParse(compiled), {\n renderer: format === 'png' ? 'canvas' : 'none',\n });\n\n try {\n await view.runAsync();\n if (format === 'svg') {\n return {\n mediaType: 'image/svg+xml' as const,\n encoding: 'utf8' as const,\n background,\n data: await view.toSVG(),\n };\n }\n const canvas = await view.toCanvas(pngScale);\n return {\n mediaType: 'image/png' as const,\n encoding: 'base64' as const,\n background,\n data: await canvasToBase64(canvas),\n };\n } finally {\n view.finalize();\n }\n}\n\nasync function canvasToBase64(canvas: HTMLCanvasElement) {\n const dataUrl = canvas.toDataURL('image/png');\n return dataUrl.replace(/^data:image\\/png;base64,/, '');\n}\n\nfunction createChartAssetId(\n params: ChartImageForMarkdownToolParameters,\n sourceToolCallId?: string,\n) {\n const base = params.title || params.alt || sourceToolCallId || 'chart';\n const slug = base\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return `${slug || 'chart'}-${Date.now().toString(36)}`;\n}\n\nfunction escapeMarkdownAlt(value: string) {\n return value.replace(/]/g, '\\\\]');\n}\n\nfunction resolveRenderBackground(params: ChartImageForMarkdownToolParameters) {\n if (params.background) return params.background;\n const tailwindBackground = resolveTailwindBackgroundForTheme(\n params.renderTheme,\n );\n if (tailwindBackground) return tailwindBackground;\n return params.renderTheme === 'dark'\n ? FALLBACK_DARK_BACKGROUND\n : FALLBACK_LIGHT_BACKGROUND;\n}\n\nfunction resolveTailwindBackgroundForTheme(renderTheme: 'light' | 'dark') {\n if (typeof document === 'undefined') return undefined;\n const currentTheme = document.documentElement.classList.contains('dark')\n ? 'dark'\n : 'light';\n if (currentTheme !== renderTheme) return undefined;\n\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(TAILWIND_BACKGROUND_VARIABLE)\n .trim();\n return value || undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/vega",
3
- "version": "0.29.0-rc.11",
3
+ "version": "0.29.0-rc.13",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/sqlrooms/sqlrooms.git"
@@ -25,14 +25,14 @@
25
25
  "typedoc": "typedoc"
26
26
  },
27
27
  "dependencies": {
28
- "@sqlrooms/ai-core": "0.29.0-rc.11",
29
- "@sqlrooms/codemirror": "0.29.0-rc.11",
30
- "@sqlrooms/documents": "0.29.0-rc.11",
31
- "@sqlrooms/duckdb": "0.29.0-rc.11",
32
- "@sqlrooms/monaco-editor": "0.29.0-rc.11",
33
- "@sqlrooms/sql-editor": "0.29.0-rc.11",
34
- "@sqlrooms/ui": "0.29.0-rc.11",
35
- "@sqlrooms/utils": "0.29.0-rc.11",
28
+ "@sqlrooms/ai-core": "0.29.0-rc.13",
29
+ "@sqlrooms/codemirror": "0.29.0-rc.13",
30
+ "@sqlrooms/documents": "0.29.0-rc.13",
31
+ "@sqlrooms/duckdb": "0.29.0-rc.13",
32
+ "@sqlrooms/monaco-editor": "0.29.0-rc.13",
33
+ "@sqlrooms/sql-editor": "0.29.0-rc.13",
34
+ "@sqlrooms/ui": "0.29.0-rc.13",
35
+ "@sqlrooms/utils": "0.29.0-rc.13",
36
36
  "ai": "^6.0.177",
37
37
  "lucide-react": "^0.556.0",
38
38
  "react-vega": "^8.0.0",
@@ -55,5 +55,5 @@
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "gitHead": "e451e434c67f59d16a45493689f092af134b207c"
58
+ "gitHead": "d183fe9164e5f67c23b358328ca03dbf77a035a4"
59
59
  }