@sqlrooms/canvas 0.25.0-rc.0 → 0.26.0-rc.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasSlice.d.ts","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasSlice.d.ts","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { AiSliceConfig, createAiSlice, createDefaultAiConfig, } from '@sqlrooms/ai';
2
+ import { createAiSlice, createDefaultAiTools, createDefaultAiInstructions, } from '@sqlrooms/ai';
3
3
  import { escapeId } from '@sqlrooms/duckdb';
4
4
  import { createSlice, useBaseRoomShellStore, } from '@sqlrooms/room-shell';
5
5
  import { createVegaChartTool } from '@sqlrooms/vega';
@@ -51,40 +51,38 @@ export const CanvasEdgeSchema = z.object({
51
51
  source: z.string(),
52
52
  target: z.string(),
53
53
  });
54
- export const CanvasSliceConfig = z
55
- .object({
56
- canvas: z.object({
57
- viewport: z.object({
58
- x: z.number(),
59
- y: z.number(),
60
- zoom: z.number(),
61
- }),
62
- nodes: z.array(CanvasNodeSchema).default([]),
63
- edges: z.array(CanvasEdgeSchema).default([]),
54
+ export const CanvasSliceConfig = z.object({
55
+ viewport: z.object({
56
+ x: z.number(),
57
+ y: z.number(),
58
+ zoom: z.number(),
64
59
  }),
65
- })
66
- .merge(AiSliceConfig);
67
- export function createDefaultCanvasConfig(props = {}) {
60
+ nodes: z.array(CanvasNodeSchema).default([]),
61
+ edges: z.array(CanvasEdgeSchema).default([]),
62
+ });
63
+ export function createDefaultCanvasConfig(props) {
68
64
  return {
69
- canvas: {
70
- viewport: { x: 0, y: 0, zoom: 1 },
71
- nodes: [],
72
- edges: [],
73
- ...props,
74
- },
75
- ...createDefaultAiConfig({}),
65
+ viewport: { x: 0, y: 0, zoom: 1 },
66
+ nodes: [],
67
+ edges: [],
68
+ ...props,
76
69
  };
77
70
  }
78
71
  export function createCanvasSlice(props) {
79
72
  return createSlice((set, get, store) => ({
80
73
  ...createAiSlice({
81
- ...props,
82
- customTools: {
74
+ getInstructions: () => {
75
+ return createDefaultAiInstructions(store);
76
+ },
77
+ tools: {
78
+ ...createDefaultAiTools(store),
83
79
  chart: createVegaChartTool(),
84
- ...props.customTools,
80
+ ...props.ai?.tools,
85
81
  },
82
+ ...props.ai,
86
83
  })(set, get, store),
87
84
  canvas: {
85
+ config: createDefaultCanvasConfig(props.config),
88
86
  isAssistantOpen: false,
89
87
  sqlResults: {},
90
88
  setAssistantOpen: (isAssistantOpen) => {
@@ -94,12 +92,12 @@ export function createCanvasSlice(props) {
94
92
  },
95
93
  async initialize() {
96
94
  // Execute SQL nodes in topological order based on edges
97
- const nodes = get().config.canvas.nodes;
98
- const edges = get().config.canvas.edges;
95
+ const nodes = get().canvas.config.nodes;
96
+ const edges = get().canvas.config.edges;
99
97
  const order = topoSortAll(nodes, edges);
100
98
  // Execute SQL nodes sequentially to ensure parents finish before children
101
99
  for (const nodeId of order) {
102
- const node = findNodeById(get().config.canvas.nodes, nodeId);
100
+ const node = findNodeById(get().canvas.config.nodes, nodeId);
103
101
  if (!node || !isSqlData(node.data))
104
102
  continue;
105
103
  const sqlText = node.data.sql || '';
@@ -114,7 +112,7 @@ export function createCanvasSlice(props) {
114
112
  const newId = createId();
115
113
  set((state) => produce(state, (draft) => {
116
114
  const parent = parentId
117
- ? findNodeById(draft.config.canvas.nodes, parentId)
115
+ ? findNodeById(draft.canvas.config.nodes, parentId)
118
116
  : undefined;
119
117
  const position = initialPosition
120
118
  ? initialPosition
@@ -124,8 +122,8 @@ export function createCanvasSlice(props) {
124
122
  y: parent.position.y,
125
123
  }
126
124
  : {
127
- x: draft.config.canvas.viewport.x + 100,
128
- y: draft.config.canvas.viewport.y + 100,
125
+ x: draft.canvas.config.viewport.x + 100,
126
+ y: draft.canvas.config.viewport.y + 100,
129
127
  };
130
128
  const firstTable = draft.db.tables.find((t) => t.table.schema === 'main');
131
129
  const getInitialSqlForNewSqlNode = () => {
@@ -142,9 +140,9 @@ export function createCanvasSlice(props) {
142
140
  ? `SELECT * FROM ${firstTable.table.table}`
143
141
  : `SELECT 1`;
144
142
  };
145
- const newSqlTitle = getUniqueSqlTitle(draft.config.canvas.nodes, 'Query');
143
+ const newSqlTitle = getUniqueSqlTitle(draft.canvas.config.nodes, 'Query');
146
144
  const initialSql = getInitialSqlForNewSqlNode();
147
- draft.config.canvas.nodes.push({
145
+ draft.canvas.config.nodes.push({
148
146
  id: newId,
149
147
  position,
150
148
  width: DEFAULT_NODE_WIDTH,
@@ -162,7 +160,7 @@ export function createCanvasSlice(props) {
162
160
  }),
163
161
  });
164
162
  if (parentId) {
165
- draft.config.canvas.edges.push({
163
+ draft.canvas.config.edges.push({
166
164
  id: `${parentId}-${newId}`,
167
165
  source: parentId,
168
166
  target: newId,
@@ -172,8 +170,8 @@ export function createCanvasSlice(props) {
172
170
  return newId;
173
171
  },
174
172
  executeDownstreamFrom: async (nodeId) => {
175
- const allNodes = get().config.canvas.nodes;
176
- const allEdges = get().config.canvas.edges;
173
+ const allNodes = get().canvas.config.nodes;
174
+ const allEdges = get().canvas.config.edges;
177
175
  const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);
178
176
  for (const childId of downstreamOrder) {
179
177
  const child = findNodeById(allNodes, childId);
@@ -188,24 +186,24 @@ export function createCanvasSlice(props) {
188
186
  },
189
187
  addEdge: (connection) => {
190
188
  set((state) => produce(state, (draft) => {
191
- draft.config.canvas.edges = addEdge(connection, draft.config.canvas.edges);
189
+ draft.canvas.config.edges = addEdge(connection, draft.canvas.config.edges);
192
190
  }));
193
191
  },
194
192
  updateNode: (nodeId, updater) => {
195
193
  set((state) => produce(state, (draft) => {
196
- const node = findNodeById(draft.config.canvas.nodes, nodeId);
194
+ const node = findNodeById(draft.canvas.config.nodes, nodeId);
197
195
  if (node) {
198
196
  node.data = updater(node.data);
199
197
  }
200
198
  }));
201
199
  },
202
200
  renameNode: async (nodeId, newTitle) => {
203
- const node = findNodeById(get().config.canvas.nodes, nodeId);
201
+ const node = findNodeById(get().canvas.config.nodes, nodeId);
204
202
  if (!node)
205
203
  throw new Error('Node not found');
206
204
  if (!isSqlData(node.data)) {
207
205
  set((state) => produce(state, (draft) => {
208
- const dnode = findNodeById(draft.config.canvas.nodes, nodeId);
206
+ const dnode = findNodeById(draft.canvas.config.nodes, nodeId);
209
207
  if (dnode)
210
208
  dnode.data.title = newTitle;
211
209
  }));
@@ -215,7 +213,7 @@ export function createCanvasSlice(props) {
215
213
  if (prevTitle === newTitle)
216
214
  return;
217
215
  // Ensure title uniqueness among SQL nodes by adjusting to a unique variant
218
- const uniqueTitle = getUniqueSqlTitle(get().config.canvas.nodes, newTitle, nodeId);
216
+ const uniqueTitle = getUniqueSqlTitle(get().canvas.config.nodes, newTitle, nodeId);
219
217
  const connector = await get().db.getConnector();
220
218
  await connector.query(`CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`);
221
219
  const result = get().canvas.sqlResults[nodeId];
@@ -225,7 +223,7 @@ export function createCanvasSlice(props) {
225
223
  await connector.query(`ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`);
226
224
  const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;
227
225
  set((state) => produce(state, (draft) => {
228
- const dnode = findNodeById(draft.config.canvas.nodes, nodeId);
226
+ const dnode = findNodeById(draft.canvas.config.nodes, nodeId);
229
227
  if (dnode)
230
228
  dnode.data.title = uniqueTitle;
231
229
  const r = draft.canvas.sqlResults[nodeId];
@@ -238,7 +236,7 @@ export function createCanvasSlice(props) {
238
236
  },
239
237
  deleteNode: (nodeId) => {
240
238
  const current = get();
241
- const node = findNodeById(current.config.canvas.nodes, nodeId);
239
+ const node = findNodeById(current.canvas.config.nodes, nodeId);
242
240
  let tableToDrop;
243
241
  if (node && isSqlData(node.data)) {
244
242
  const title = node.data.title || 'result';
@@ -249,13 +247,13 @@ export function createCanvasSlice(props) {
249
247
  : `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;
250
248
  }
251
249
  set((state) => produce(state, (draft) => {
252
- draft.config.canvas.nodes = draft.config.canvas.nodes.filter((n) => n.id !== nodeId);
253
- draft.config.canvas.edges = draft.config.canvas.edges.filter((e) => e.source !== nodeId && e.target !== nodeId);
250
+ draft.canvas.config.nodes = draft.canvas.config.nodes.filter((n) => n.id !== nodeId);
251
+ draft.canvas.config.edges = draft.canvas.config.edges.filter((e) => e.source !== nodeId && e.target !== nodeId);
254
252
  // Clear stored result for the node
255
253
  delete draft.canvas.sqlResults[nodeId];
256
- if (draft.config.canvas.nodes.length === 0) {
257
- draft.config.canvas.viewport.x = 0;
258
- draft.config.canvas.viewport.y = 0;
254
+ if (draft.canvas.config.nodes.length === 0) {
255
+ draft.canvas.config.viewport.x = 0;
256
+ draft.canvas.config.viewport.y = 0;
259
257
  }
260
258
  }));
261
259
  if (tableToDrop) {
@@ -274,21 +272,21 @@ export function createCanvasSlice(props) {
274
272
  },
275
273
  applyNodeChanges: (changes) => {
276
274
  set((state) => produce(state, (draft) => {
277
- draft.config.canvas.nodes = applyNodeChanges(changes, draft.config.canvas.nodes);
275
+ draft.canvas.config.nodes = applyNodeChanges(changes, draft.canvas.config.nodes);
278
276
  }));
279
277
  },
280
278
  applyEdgeChanges: (changes) => {
281
279
  set((state) => produce(state, (draft) => {
282
- draft.config.canvas.edges = applyEdgeChanges(changes, draft.config.canvas.edges);
280
+ draft.canvas.config.edges = applyEdgeChanges(changes, draft.canvas.config.edges);
283
281
  }));
284
282
  },
285
283
  setViewport: (viewport) => {
286
284
  set((state) => produce(state, (draft) => {
287
- draft.config.canvas.viewport = viewport;
285
+ draft.canvas.config.viewport = viewport;
288
286
  }));
289
287
  },
290
288
  executeSqlNodeQuery: async (nodeId, opts) => {
291
- const node = findNodeById(get().config.canvas.nodes, nodeId);
289
+ const node = findNodeById(get().canvas.config.nodes, nodeId);
292
290
  if (!node || !isSqlData(node.data))
293
291
  return;
294
292
  const sql = node.data.sql || '';
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasSlice.js","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AiSliceState,\n createAiSlice,\n createDefaultAiConfig,\n} from '@sqlrooms/ai';\nimport {escapeId} from '@sqlrooms/duckdb';\nimport {\n BaseRoomConfig,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {createVegaChartTool} from '@sqlrooms/vega';\nimport type {Viewport, XYPosition} from '@xyflow/react';\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n Connection,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {findNodeById, topoSortAll, topoSortDownstream} from './dag';\n\nconst DEFAULT_NODE_WIDTH = 800;\nconst DEFAULT_NODE_HEIGHT = 600;\nconst CANVAS_SCHEMA_NAME = 'canvas';\n\nexport const CanvasNodeTypes = z.enum(['sql', 'vega']);\nexport type CanvasNodeTypes = z.infer<typeof CanvasNodeTypes>;\n\nexport const CanvasNodeData = z.discriminatedUnion('type', [\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('sql'),\n sql: z.string().optional(),\n }),\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('vega'),\n sql: z.string().optional(),\n vegaSpec: z.any().optional(),\n }),\n]);\nexport type CanvasNodeData = z.infer<typeof CanvasNodeData>;\n\ntype SqlData = Extract<CanvasNodeData, {type: 'sql'}>;\nfunction isSqlData(data: CanvasNodeData): data is SqlData {\n return data.type === 'sql';\n}\n\nfunction getUniqueSqlTitle(\n nodes: CanvasNodeSchema[],\n baseTitle: string,\n excludeNodeId?: string,\n): string {\n const existing = new Set(\n nodes\n .filter((n) => n.type === 'sql' && n.id !== (excludeNodeId || ''))\n .map((n) => n.data.title || ''),\n );\n if (!existing.has(baseTitle)) return baseTitle;\n let counter = 1;\n while (existing.has(`${baseTitle} ${counter}`)) counter += 1;\n return `${baseTitle} ${counter}`;\n}\n\nexport const CanvasNodeSchema = z.object({\n id: z.string(),\n position: z.object({x: z.number(), y: z.number()}),\n type: CanvasNodeTypes,\n data: CanvasNodeData,\n width: z.number(),\n height: z.number(),\n});\nexport type CanvasNodeSchema = z.infer<typeof CanvasNodeSchema>;\n\nexport const CanvasEdgeSchema = z.object({\n id: z.string(),\n source: z.string(),\n target: z.string(),\n});\nexport type CanvasEdgeSchema = z.infer<typeof CanvasEdgeSchema>;\n\nexport type SqlNodeQueryResult =\n | {status: 'idle'}\n | {status: 'loading'}\n | {status: 'error'; error: string}\n | {status: 'success'; tableName: string; lastQueryStatement: string};\n\nexport const CanvasSliceConfig = z\n .object({\n canvas: z.object({\n viewport: z.object({\n x: z.number(),\n y: z.number(),\n zoom: z.number(),\n }),\n nodes: z.array(CanvasNodeSchema).default([]),\n edges: z.array(CanvasEdgeSchema).default([]),\n }),\n })\n .merge(AiSliceConfig);\nexport type CanvasSliceConfig = z.infer<typeof CanvasSliceConfig>;\n\nexport type CanvasSliceState = AiSliceState & {\n canvas: {\n isAssistantOpen: boolean;\n sqlResults: Record<string, SqlNodeQueryResult>;\n initialize: () => Promise<void>;\n setViewport: (viewport: Viewport) => void;\n setAssistantOpen: (isAssistantOpen: boolean) => void;\n addNode: (params: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => string;\n executeDownstreamFrom: (nodeId: string) => Promise<void>;\n renameNode: (nodeId: string, newTitle: string) => Promise<void>;\n updateNode: (\n nodeId: string,\n updater: (data: CanvasNodeData) => CanvasNodeData,\n ) => void;\n deleteNode: (nodeId: string) => void;\n applyNodeChanges: (changes: NodeChange<CanvasNodeSchema>[]) => void;\n applyEdgeChanges: (changes: EdgeChange<CanvasEdgeSchema>[]) => void;\n addEdge: (edge: Connection) => void;\n executeSqlNodeQuery: (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => Promise<void>;\n };\n};\n\nexport function createDefaultCanvasConfig(\n props: Partial<CanvasSliceConfig['canvas']> = {},\n): CanvasSliceConfig {\n return {\n canvas: {\n viewport: {x: 0, y: 0, zoom: 1},\n nodes: [],\n edges: [],\n ...props,\n },\n ...createDefaultAiConfig({}),\n };\n}\n\nexport function createCanvasSlice<\n PC extends BaseRoomConfig & CanvasSliceConfig,\n>(props: Parameters<typeof createAiSlice<PC>>[0]) {\n return createSlice<PC, CanvasSliceState>((set, get, store) => ({\n ...createAiSlice({\n ...props,\n customTools: {\n chart: createVegaChartTool(),\n ...props.customTools,\n },\n })(set, get, store),\n canvas: {\n isAssistantOpen: false,\n sqlResults: {},\n setAssistantOpen: (isAssistantOpen) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.isAssistantOpen = isAssistantOpen;\n }),\n );\n },\n\n async initialize() {\n // Execute SQL nodes in topological order based on edges\n const nodes = get().config.canvas.nodes;\n const edges = get().config.canvas.edges;\n\n const order = topoSortAll(nodes, edges);\n\n // Execute SQL nodes sequentially to ensure parents finish before children\n for (const nodeId of order) {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node || !isSqlData(node.data)) continue;\n const sqlText = node.data.sql || '';\n if (!sqlText.trim()) continue;\n // Await ensures table creation completes before children execute\n await get().canvas.executeSqlNodeQuery(nodeId, {cascade: false});\n }\n\n await get().db.refreshTableSchemas();\n },\n\n addNode: ({\n parentId,\n nodeType = 'sql',\n initialPosition,\n }: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => {\n const newId = createId();\n set((state) =>\n produce(state, (draft) => {\n const parent = parentId\n ? findNodeById(draft.config.canvas.nodes, parentId)\n : undefined;\n const position: XYPosition = initialPosition\n ? initialPosition\n : parent\n ? {\n x: parent.position.x + parent.width + 100,\n y: parent.position.y,\n }\n : {\n x: draft.config.canvas.viewport.x + 100,\n y: draft.config.canvas.viewport.y + 100,\n };\n const firstTable = draft.db.tables.find(\n (t) => t.table.schema === 'main',\n );\n\n const getInitialSqlForNewSqlNode = () => {\n if (parent && isSqlData(parent.data)) {\n const parentResults = draft.canvas.sqlResults[parent.id];\n const parentTitle = parent.data.title || 'Query';\n const fallbackParentTable = `${CANVAS_SCHEMA_NAME}.${escapeId(parentTitle)}`;\n const parentTableName =\n parentResults && parentResults.status === 'success'\n ? parentResults.tableName\n : fallbackParentTable;\n return `SELECT * FROM ${parentTableName}`;\n }\n return firstTable\n ? `SELECT * FROM ${firstTable.table.table}`\n : `SELECT 1`;\n };\n\n const newSqlTitle = getUniqueSqlTitle(\n draft.config.canvas.nodes,\n 'Query',\n );\n const initialSql = getInitialSqlForNewSqlNode();\n\n draft.config.canvas.nodes.push({\n id: newId,\n position,\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n type: nodeType,\n data: (nodeType === 'sql'\n ? {\n title: newSqlTitle,\n type: 'sql',\n sql: initialSql,\n }\n : {\n title: 'Chart',\n type: 'vega',\n }) as CanvasNodeData,\n });\n if (parentId) {\n draft.config.canvas.edges.push({\n id: `${parentId}-${newId}`,\n source: parentId,\n target: newId,\n });\n }\n }),\n );\n return newId;\n },\n\n executeDownstreamFrom: async (nodeId: string) => {\n const allNodes = get().config.canvas.nodes;\n const allEdges = get().config.canvas.edges;\n const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);\n for (const childId of downstreamOrder) {\n const child = findNodeById(allNodes, childId);\n if (!child || !isSqlData(child.data)) continue;\n const text = child.data.sql || '';\n if (!text.trim()) continue;\n await get().canvas.executeSqlNodeQuery(childId, {cascade: false});\n }\n await get().db.refreshTableSchemas();\n },\n\n addEdge: (connection) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.edges = addEdge(\n connection,\n draft.config.canvas.edges,\n );\n }),\n );\n },\n\n updateNode: (nodeId, updater) => {\n set((state) =>\n produce(state, (draft) => {\n const node = findNodeById(draft.config.canvas.nodes, nodeId);\n if (node) {\n node.data = updater(node.data as CanvasNodeData);\n }\n }),\n );\n },\n\n renameNode: async (nodeId: string, newTitle: string) => {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node) throw new Error('Node not found');\n if (!isSqlData(node.data)) {\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.config.canvas.nodes, nodeId);\n if (dnode) dnode.data.title = newTitle;\n }),\n );\n return;\n }\n\n const prevTitle = node.data.title || 'result';\n if (prevTitle === newTitle) return;\n\n // Ensure title uniqueness among SQL nodes by adjusting to a unique variant\n const uniqueTitle = getUniqueSqlTitle(\n get().config.canvas.nodes,\n newTitle,\n nodeId,\n );\n\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const result = get().canvas.sqlResults[nodeId];\n const oldTableName =\n result && result.status === 'success'\n ? result.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(prevTitle)}`;\n\n await connector.query(\n `ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`,\n );\n\n const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.config.canvas.nodes, nodeId);\n if (dnode) dnode.data.title = uniqueTitle;\n const r = draft.canvas.sqlResults[nodeId];\n if (r && r.status === 'success') r.tableName = newQualified;\n }),\n );\n\n await get().db.refreshTableSchemas();\n\n // Recompute children since upstream table name changed\n await get().canvas.executeDownstreamFrom(nodeId);\n },\n\n deleteNode: (nodeId) => {\n const current = get();\n const node = findNodeById(current.config.canvas.nodes, nodeId);\n let tableToDrop: string | undefined;\n if (node && isSqlData(node.data)) {\n const title = node.data.title || 'result';\n const res = current.canvas.sqlResults[nodeId];\n tableToDrop =\n res && res.status === 'success'\n ? res.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.nodes = draft.config.canvas.nodes.filter(\n (n) => n.id !== nodeId,\n );\n draft.config.canvas.edges = draft.config.canvas.edges.filter(\n (e) => e.source !== nodeId && e.target !== nodeId,\n );\n // Clear stored result for the node\n delete draft.canvas.sqlResults[nodeId];\n if (draft.config.canvas.nodes.length === 0) {\n draft.config.canvas.viewport.x = 0;\n draft.config.canvas.viewport.y = 0;\n }\n }),\n );\n\n if (tableToDrop) {\n (async () => {\n try {\n const connector = await get().db.getConnector();\n await connector.query(`DROP TABLE IF EXISTS ${tableToDrop}`);\n await get().db.refreshTableSchemas();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n '[canvas.deleteNode] Failed to drop table for node',\n nodeId,\n e,\n );\n }\n })();\n }\n },\n\n applyNodeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.nodes = applyNodeChanges(\n changes,\n draft.config.canvas.nodes,\n );\n }),\n );\n },\n\n applyEdgeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.edges = applyEdgeChanges(\n changes,\n draft.config.canvas.edges,\n );\n }),\n );\n },\n\n setViewport: (viewport) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.viewport = viewport;\n }),\n );\n },\n\n executeSqlNodeQuery: async (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node || !isSqlData(node.data)) return;\n const sql = node.data.sql || '';\n const title = node.data.title || 'result';\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {status: 'loading'};\n }),\n );\n\n try {\n // Validate it's a single select\n const parsed = await get().db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(\n parsed.error_message || 'Not a valid SELECT statement',\n );\n }\n\n // Create schema and table\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const tableName = `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n await connector.query(\n `CREATE OR REPLACE TABLE ${tableName} AS ${sql}`,\n );\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'success',\n tableName,\n lastQueryStatement: sql,\n };\n }),\n );\n\n // Cascade execution to downstream SQL nodes (topologically) unless disabled\n if (opts?.cascade !== false) {\n await get().canvas.executeDownstreamFrom(nodeId);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'error',\n error: message,\n };\n }),\n );\n }\n },\n },\n }));\n}\n\n// Types to integrate with room-shell selector\nexport type RoomConfigWithCanvas = BaseRoomConfig & CanvasSliceConfig;\nexport type RoomShellSliceStateWithCanvas =\n RoomShellSliceState<RoomConfigWithCanvas> & CanvasSliceState;\n\nexport function useStoreWithCanvas<T>(\n selector: (state: RoomShellSliceStateWithCanvas) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & CanvasSliceConfig,\n RoomShellSliceState<RoomConfigWithCanvas>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithCanvas));\n}\n"]}
1
+ {"version":3,"file":"CanvasSlice.js","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceState,\n createAiSlice,\n createDefaultAiTools,\n createDefaultAiInstructions,\n} from '@sqlrooms/ai';\nimport {escapeId} from '@sqlrooms/duckdb';\nimport {\n BaseRoomConfig,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {createVegaChartTool} from '@sqlrooms/vega';\nimport type {Viewport, XYPosition} from '@xyflow/react';\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n Connection,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {findNodeById, topoSortAll, topoSortDownstream} from './dag';\n\nconst DEFAULT_NODE_WIDTH = 800;\nconst DEFAULT_NODE_HEIGHT = 600;\nconst CANVAS_SCHEMA_NAME = 'canvas';\n\nexport const CanvasNodeTypes = z.enum(['sql', 'vega']);\nexport type CanvasNodeTypes = z.infer<typeof CanvasNodeTypes>;\n\nexport const CanvasNodeData = z.discriminatedUnion('type', [\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('sql'),\n sql: z.string().optional(),\n }),\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('vega'),\n sql: z.string().optional(),\n vegaSpec: z.any().optional(),\n }),\n]);\nexport type CanvasNodeData = z.infer<typeof CanvasNodeData>;\n\ntype SqlData = Extract<CanvasNodeData, {type: 'sql'}>;\nfunction isSqlData(data: CanvasNodeData): data is SqlData {\n return data.type === 'sql';\n}\n\nfunction getUniqueSqlTitle(\n nodes: CanvasNodeSchema[],\n baseTitle: string,\n excludeNodeId?: string,\n): string {\n const existing = new Set(\n nodes\n .filter((n) => n.type === 'sql' && n.id !== (excludeNodeId || ''))\n .map((n) => n.data.title || ''),\n );\n if (!existing.has(baseTitle)) return baseTitle;\n let counter = 1;\n while (existing.has(`${baseTitle} ${counter}`)) counter += 1;\n return `${baseTitle} ${counter}`;\n}\n\nexport const CanvasNodeSchema = z.object({\n id: z.string(),\n position: z.object({x: z.number(), y: z.number()}),\n type: CanvasNodeTypes,\n data: CanvasNodeData,\n width: z.number(),\n height: z.number(),\n});\nexport type CanvasNodeSchema = z.infer<typeof CanvasNodeSchema>;\n\nexport const CanvasEdgeSchema = z.object({\n id: z.string(),\n source: z.string(),\n target: z.string(),\n});\nexport type CanvasEdgeSchema = z.infer<typeof CanvasEdgeSchema>;\n\nexport type SqlNodeQueryResult =\n | {status: 'idle'}\n | {status: 'loading'}\n | {status: 'error'; error: string}\n | {status: 'success'; tableName: string; lastQueryStatement: string};\n\nexport const CanvasSliceConfig = z.object({\n viewport: z.object({\n x: z.number(),\n y: z.number(),\n zoom: z.number(),\n }),\n nodes: z.array(CanvasNodeSchema).default([]),\n edges: z.array(CanvasEdgeSchema).default([]),\n});\nexport type CanvasSliceConfig = z.infer<typeof CanvasSliceConfig>;\n\nexport type CanvasSliceState = AiSliceState & {\n canvas: {\n config: CanvasSliceConfig;\n isAssistantOpen: boolean;\n sqlResults: Record<string, SqlNodeQueryResult>;\n initialize: () => Promise<void>;\n setViewport: (viewport: Viewport) => void;\n setAssistantOpen: (isAssistantOpen: boolean) => void;\n addNode: (params: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => string;\n executeDownstreamFrom: (nodeId: string) => Promise<void>;\n renameNode: (nodeId: string, newTitle: string) => Promise<void>;\n updateNode: (\n nodeId: string,\n updater: (data: CanvasNodeData) => CanvasNodeData,\n ) => void;\n deleteNode: (nodeId: string) => void;\n applyNodeChanges: (changes: NodeChange<CanvasNodeSchema>[]) => void;\n applyEdgeChanges: (changes: EdgeChange<CanvasEdgeSchema>[]) => void;\n addEdge: (edge: Connection) => void;\n executeSqlNodeQuery: (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => Promise<void>;\n };\n};\n\nexport function createDefaultCanvasConfig(\n props?: Partial<CanvasSliceConfig>,\n): CanvasSliceConfig {\n return {\n viewport: {x: 0, y: 0, zoom: 1},\n nodes: [],\n edges: [],\n ...props,\n };\n}\n\nexport function createCanvasSlice<\n PC extends BaseRoomConfig = BaseRoomConfig,\n>(props: {\n config?: Partial<CanvasSliceConfig>;\n ai?: Partial<Parameters<typeof createAiSlice<PC>>[0]>;\n}) {\n return createSlice<PC, CanvasSliceState>((set, get, store) => ({\n ...createAiSlice({\n getInstructions: () => {\n return createDefaultAiInstructions(store);\n },\n tools: {\n ...createDefaultAiTools(store),\n chart: createVegaChartTool(),\n ...props.ai?.tools,\n },\n ...props.ai,\n })(set, get, store),\n canvas: {\n config: createDefaultCanvasConfig(props.config),\n isAssistantOpen: false,\n sqlResults: {},\n setAssistantOpen: (isAssistantOpen) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.isAssistantOpen = isAssistantOpen;\n }),\n );\n },\n\n async initialize() {\n // Execute SQL nodes in topological order based on edges\n const nodes = get().canvas.config.nodes;\n const edges = get().canvas.config.edges;\n\n const order = topoSortAll(nodes, edges);\n\n // Execute SQL nodes sequentially to ensure parents finish before children\n for (const nodeId of order) {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node || !isSqlData(node.data)) continue;\n const sqlText = node.data.sql || '';\n if (!sqlText.trim()) continue;\n // Await ensures table creation completes before children execute\n await get().canvas.executeSqlNodeQuery(nodeId, {cascade: false});\n }\n\n await get().db.refreshTableSchemas();\n },\n\n addNode: ({\n parentId,\n nodeType = 'sql',\n initialPosition,\n }: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => {\n const newId = createId();\n set((state) =>\n produce(state, (draft) => {\n const parent = parentId\n ? findNodeById(draft.canvas.config.nodes, parentId)\n : undefined;\n const position: XYPosition = initialPosition\n ? initialPosition\n : parent\n ? {\n x: parent.position.x + parent.width + 100,\n y: parent.position.y,\n }\n : {\n x: draft.canvas.config.viewport.x + 100,\n y: draft.canvas.config.viewport.y + 100,\n };\n const firstTable = draft.db.tables.find(\n (t) => t.table.schema === 'main',\n );\n\n const getInitialSqlForNewSqlNode = () => {\n if (parent && isSqlData(parent.data)) {\n const parentResults = draft.canvas.sqlResults[parent.id];\n const parentTitle = parent.data.title || 'Query';\n const fallbackParentTable = `${CANVAS_SCHEMA_NAME}.${escapeId(parentTitle)}`;\n const parentTableName =\n parentResults && parentResults.status === 'success'\n ? parentResults.tableName\n : fallbackParentTable;\n return `SELECT * FROM ${parentTableName}`;\n }\n return firstTable\n ? `SELECT * FROM ${firstTable.table.table}`\n : `SELECT 1`;\n };\n\n const newSqlTitle = getUniqueSqlTitle(\n draft.canvas.config.nodes,\n 'Query',\n );\n const initialSql = getInitialSqlForNewSqlNode();\n\n draft.canvas.config.nodes.push({\n id: newId,\n position,\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n type: nodeType,\n data: (nodeType === 'sql'\n ? {\n title: newSqlTitle,\n type: 'sql',\n sql: initialSql,\n }\n : {\n title: 'Chart',\n type: 'vega',\n }) as CanvasNodeData,\n });\n if (parentId) {\n draft.canvas.config.edges.push({\n id: `${parentId}-${newId}`,\n source: parentId,\n target: newId,\n });\n }\n }),\n );\n return newId;\n },\n\n executeDownstreamFrom: async (nodeId: string) => {\n const allNodes = get().canvas.config.nodes;\n const allEdges = get().canvas.config.edges;\n const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);\n for (const childId of downstreamOrder) {\n const child = findNodeById(allNodes, childId);\n if (!child || !isSqlData(child.data)) continue;\n const text = child.data.sql || '';\n if (!text.trim()) continue;\n await get().canvas.executeSqlNodeQuery(childId, {cascade: false});\n }\n await get().db.refreshTableSchemas();\n },\n\n addEdge: (connection) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.edges = addEdge(\n connection,\n draft.canvas.config.edges,\n );\n }),\n );\n },\n\n updateNode: (nodeId, updater) => {\n set((state) =>\n produce(state, (draft) => {\n const node = findNodeById(draft.canvas.config.nodes, nodeId);\n if (node) {\n node.data = updater(node.data as CanvasNodeData);\n }\n }),\n );\n },\n\n renameNode: async (nodeId: string, newTitle: string) => {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node) throw new Error('Node not found');\n if (!isSqlData(node.data)) {\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.canvas.config.nodes, nodeId);\n if (dnode) dnode.data.title = newTitle;\n }),\n );\n return;\n }\n\n const prevTitle = node.data.title || 'result';\n if (prevTitle === newTitle) return;\n\n // Ensure title uniqueness among SQL nodes by adjusting to a unique variant\n const uniqueTitle = getUniqueSqlTitle(\n get().canvas.config.nodes,\n newTitle,\n nodeId,\n );\n\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const result = get().canvas.sqlResults[nodeId];\n const oldTableName =\n result && result.status === 'success'\n ? result.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(prevTitle)}`;\n\n await connector.query(\n `ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`,\n );\n\n const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.canvas.config.nodes, nodeId);\n if (dnode) dnode.data.title = uniqueTitle;\n const r = draft.canvas.sqlResults[nodeId];\n if (r && r.status === 'success') r.tableName = newQualified;\n }),\n );\n\n await get().db.refreshTableSchemas();\n\n // Recompute children since upstream table name changed\n await get().canvas.executeDownstreamFrom(nodeId);\n },\n\n deleteNode: (nodeId) => {\n const current = get();\n const node = findNodeById(current.canvas.config.nodes, nodeId);\n let tableToDrop: string | undefined;\n if (node && isSqlData(node.data)) {\n const title = node.data.title || 'result';\n const res = current.canvas.sqlResults[nodeId];\n tableToDrop =\n res && res.status === 'success'\n ? res.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.nodes = draft.canvas.config.nodes.filter(\n (n) => n.id !== nodeId,\n );\n draft.canvas.config.edges = draft.canvas.config.edges.filter(\n (e) => e.source !== nodeId && e.target !== nodeId,\n );\n // Clear stored result for the node\n delete draft.canvas.sqlResults[nodeId];\n if (draft.canvas.config.nodes.length === 0) {\n draft.canvas.config.viewport.x = 0;\n draft.canvas.config.viewport.y = 0;\n }\n }),\n );\n\n if (tableToDrop) {\n (async () => {\n try {\n const connector = await get().db.getConnector();\n await connector.query(`DROP TABLE IF EXISTS ${tableToDrop}`);\n await get().db.refreshTableSchemas();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n '[canvas.deleteNode] Failed to drop table for node',\n nodeId,\n e,\n );\n }\n })();\n }\n },\n\n applyNodeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.nodes = applyNodeChanges(\n changes,\n draft.canvas.config.nodes,\n );\n }),\n );\n },\n\n applyEdgeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.edges = applyEdgeChanges(\n changes,\n draft.canvas.config.edges,\n );\n }),\n );\n },\n\n setViewport: (viewport) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.viewport = viewport;\n }),\n );\n },\n\n executeSqlNodeQuery: async (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node || !isSqlData(node.data)) return;\n const sql = node.data.sql || '';\n const title = node.data.title || 'result';\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {status: 'loading'};\n }),\n );\n\n try {\n // Validate it's a single select\n const parsed = await get().db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(\n parsed.error_message || 'Not a valid SELECT statement',\n );\n }\n\n // Create schema and table\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const tableName = `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n await connector.query(\n `CREATE OR REPLACE TABLE ${tableName} AS ${sql}`,\n );\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'success',\n tableName,\n lastQueryStatement: sql,\n };\n }),\n );\n\n // Cascade execution to downstream SQL nodes (topologically) unless disabled\n if (opts?.cascade !== false) {\n await get().canvas.executeDownstreamFrom(nodeId);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'error',\n error: message,\n };\n }),\n );\n }\n },\n },\n }));\n}\n\n// Types to integrate with room-shell selector\nexport type RoomConfigWithCanvas = BaseRoomConfig & CanvasSliceConfig;\nexport type RoomShellSliceStateWithCanvas =\n RoomShellSliceState<RoomConfigWithCanvas> & CanvasSliceState;\n\nexport function useStoreWithCanvas<T>(\n selector: (state: RoomShellSliceStateWithCanvas) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & CanvasSliceConfig,\n RoomShellSliceState<RoomConfigWithCanvas>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithCanvas));\n}\n"]}
@@ -18,7 +18,7 @@ const PROMPT_PLACEHOLDER = {
18
18
  */
19
19
  export const CanvasNodeContainer = ({ id, className, headerRight, children }) => {
20
20
  const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);
21
- const node = useStoreWithCanvas((s) => s.config.canvas.nodes.find((n) => n.id === id));
21
+ const node = useStoreWithCanvas((s) => s.canvas.config.nodes.find((n) => n.id === id));
22
22
  const title = node?.data.title;
23
23
  const onTitleChange = useCallback(async (v) => {
24
24
  await renameNode(id, v);
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {QueryControls} from '@sqlrooms/ai';\nimport {\n Button,\n EditableText,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Handle, NodeResizer, Position} from '@xyflow/react';\nimport {PlusIcon, SparklesIcon} from 'lucide-react';\nimport {FC, PropsWithChildren, ReactNode, useCallback} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\nimport {AddNodePopover} from './AddNodePopover';\n\nconst PROMPT_PLACEHOLDER = {\n sql: 'What would you like to learn about the data?',\n vega: 'How would you like to visualize the data?',\n default: 'What would you like to do?',\n};\n\n/**\n * Container applied to every canvas node. Provides resizing, connection handles,\n * and a standard \"add child\" affordance that creates downstream nodes.\n * Also renders an optional shared header with editable title and customizable right-side content.\n */\nexport const CanvasNodeContainer: FC<\n PropsWithChildren<{\n id: string;\n className?: string;\n /** Right-side header content (e.g. buttons, badges). */\n headerRight?: ReactNode;\n }>\n> = ({id, className, headerRight, children}) => {\n const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);\n const node = useStoreWithCanvas((s) =>\n s.config.canvas.nodes.find((n) => n.id === id),\n );\n const title = node?.data.title;\n const onTitleChange = useCallback(\n async (v: string) => {\n await renameNode(id, v);\n },\n [id, renameNode],\n );\n const setAssistantOpen = useStoreWithCanvas((s) => s.canvas.setAssistantOpen);\n return (\n <div\n className={cn(\n `bg-background relative flex h-full w-full rounded-md border shadow-sm`,\n className,\n )}\n >\n <NodeResizer minWidth={200} minHeight={200} />\n <div className=\"flex h-full min-h-0 w-full flex-col items-center\">\n {(title !== undefined || headerRight) && (\n <div className=\"flex w-full items-center justify-between gap-2 border-b px-3 py-2\">\n <EditableText\n className=\"text-sm font-medium\"\n value={title ?? ''}\n onChange={(v) => onTitleChange?.(v)}\n />\n <div className=\"flex items-center gap-2\">{headerRight}</div>\n </div>\n )}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n >\n <SparklesIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"max-h-[50vh] w-[400px] overflow-auto\">\n <QueryControls\n placeholder={`✨ ${PROMPT_PLACEHOLDER[node?.type ?? 'default']}`}\n onRun={() => {\n setAssistantOpen(true);\n }}\n />\n </PopoverContent>\n </Popover>\n <div className=\"w-full flex-1 overflow-auto\">{children}</div>\n </div>\n <AddNodePopover className=\"absolute -right-10 top-1/2\" parentId={id}>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n title=\"Add child node\"\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n </AddNodePopover>\n <Handle type=\"source\" position={Position.Right} />\n <Handle type=\"target\" position={Position.Left} />\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {QueryControls} from '@sqlrooms/ai';\nimport {\n Button,\n EditableText,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Handle, NodeResizer, Position} from '@xyflow/react';\nimport {PlusIcon, SparklesIcon} from 'lucide-react';\nimport {FC, PropsWithChildren, ReactNode, useCallback} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\nimport {AddNodePopover} from './AddNodePopover';\n\nconst PROMPT_PLACEHOLDER = {\n sql: 'What would you like to learn about the data?',\n vega: 'How would you like to visualize the data?',\n default: 'What would you like to do?',\n};\n\n/**\n * Container applied to every canvas node. Provides resizing, connection handles,\n * and a standard \"add child\" affordance that creates downstream nodes.\n * Also renders an optional shared header with editable title and customizable right-side content.\n */\nexport const CanvasNodeContainer: FC<\n PropsWithChildren<{\n id: string;\n className?: string;\n /** Right-side header content (e.g. buttons, badges). */\n headerRight?: ReactNode;\n }>\n> = ({id, className, headerRight, children}) => {\n const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);\n const node = useStoreWithCanvas((s) =>\n s.canvas.config.nodes.find((n) => n.id === id),\n );\n const title = node?.data.title;\n const onTitleChange = useCallback(\n async (v: string) => {\n await renameNode(id, v);\n },\n [id, renameNode],\n );\n const setAssistantOpen = useStoreWithCanvas((s) => s.canvas.setAssistantOpen);\n return (\n <div\n className={cn(\n `bg-background relative flex h-full w-full rounded-md border shadow-sm`,\n className,\n )}\n >\n <NodeResizer minWidth={200} minHeight={200} />\n <div className=\"flex h-full min-h-0 w-full flex-col items-center\">\n {(title !== undefined || headerRight) && (\n <div className=\"flex w-full items-center justify-between gap-2 border-b px-3 py-2\">\n <EditableText\n className=\"text-sm font-medium\"\n value={title ?? ''}\n onChange={(v) => onTitleChange?.(v)}\n />\n <div className=\"flex items-center gap-2\">{headerRight}</div>\n </div>\n )}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n >\n <SparklesIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"max-h-[50vh] w-[400px] overflow-auto\">\n <QueryControls\n placeholder={`✨ ${PROMPT_PLACEHOLDER[node?.type ?? 'default']}`}\n onRun={() => {\n setAssistantOpen(true);\n }}\n />\n </PopoverContent>\n </Popover>\n <div className=\"w-full flex-1 overflow-auto\">{children}</div>\n </div>\n <AddNodePopover className=\"absolute -right-10 top-1/2\" parentId={id}>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n title=\"Add child node\"\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n </AddNodePopover>\n <Handle type=\"source\" position={Position.Right} />\n <Handle type=\"target\" position={Position.Left} />\n </div>\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/canvas",
3
- "version": "0.25.0-rc.0",
3
+ "version": "0.26.0-rc.1",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -19,17 +19,17 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@paralleldrive/cuid2": "^2.2.2",
22
- "@sqlrooms/ai": "0.25.0-rc.0",
23
- "@sqlrooms/data-table": "0.25.0-rc.0",
24
- "@sqlrooms/duckdb": "0.25.0-rc.0",
25
- "@sqlrooms/room-shell": "0.25.0-rc.0",
26
- "@sqlrooms/sql-editor": "0.25.0-rc.0",
27
- "@sqlrooms/ui": "0.25.0-rc.0",
28
- "@sqlrooms/vega": "0.25.0-rc.0",
29
- "@xyflow/react": "^12.0.2",
30
- "immer": "^10.1.1",
22
+ "@sqlrooms/ai": "0.26.0-rc.1",
23
+ "@sqlrooms/data-table": "0.26.0-rc.1",
24
+ "@sqlrooms/duckdb": "0.26.0-rc.1",
25
+ "@sqlrooms/room-shell": "0.26.0-rc.1",
26
+ "@sqlrooms/sql-editor": "0.26.0-rc.1",
27
+ "@sqlrooms/ui": "0.26.0-rc.1",
28
+ "@sqlrooms/vega": "0.26.0-rc.1",
29
+ "@xyflow/react": "^12.8.5",
30
+ "immer": "^10.1.3",
31
31
  "lucide-react": "^0.474.0",
32
- "zod": "^3.25.73"
32
+ "zod": "^3.25.76"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": ">=18",
@@ -42,5 +42,5 @@
42
42
  "typecheck": "tsc --noEmit",
43
43
  "typedoc": "typedoc"
44
44
  },
45
- "gitHead": "063d7608fe608031c690ea3b2e67bb1f4e25a8dd"
46
- }
45
+ "gitHead": "803cf5fa875f7099746a48db15a3111aee5c0359"
46
+ }