@cyanheads/mcp-ts-core 0.8.8 → 0.8.9

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 (70) hide show
  1. package/CLAUDE.md +2 -0
  2. package/README.md +1 -1
  3. package/biome.json +1 -1
  4. package/changelog/0.8.x/0.8.9.md +34 -0
  5. package/dist/canvas/core/CanvasInstance.d.ts +43 -0
  6. package/dist/canvas/core/CanvasInstance.d.ts.map +1 -0
  7. package/dist/canvas/core/CanvasInstance.js +63 -0
  8. package/dist/canvas/core/CanvasInstance.js.map +1 -0
  9. package/dist/canvas/core/CanvasRegistry.d.ts +96 -0
  10. package/dist/canvas/core/CanvasRegistry.d.ts.map +1 -0
  11. package/dist/canvas/core/CanvasRegistry.js +250 -0
  12. package/dist/canvas/core/CanvasRegistry.js.map +1 -0
  13. package/dist/canvas/core/DataCanvas.d.ts +49 -0
  14. package/dist/canvas/core/DataCanvas.d.ts.map +1 -0
  15. package/dist/canvas/core/DataCanvas.js +85 -0
  16. package/dist/canvas/core/DataCanvas.js.map +1 -0
  17. package/dist/canvas/core/IDataCanvasProvider.d.ts +47 -0
  18. package/dist/canvas/core/IDataCanvasProvider.d.ts.map +1 -0
  19. package/dist/canvas/core/IDataCanvasProvider.js +10 -0
  20. package/dist/canvas/core/IDataCanvasProvider.js.map +1 -0
  21. package/dist/canvas/core/canvasFactory.d.ts +26 -0
  22. package/dist/canvas/core/canvasFactory.d.ts.map +1 -0
  23. package/dist/canvas/core/canvasFactory.js +63 -0
  24. package/dist/canvas/core/canvasFactory.js.map +1 -0
  25. package/dist/canvas/core/sqlGate.d.ts +107 -0
  26. package/dist/canvas/core/sqlGate.d.ts.map +1 -0
  27. package/dist/canvas/core/sqlGate.js +267 -0
  28. package/dist/canvas/core/sqlGate.js.map +1 -0
  29. package/dist/canvas/index.d.ts +21 -0
  30. package/dist/canvas/index.d.ts.map +1 -0
  31. package/dist/canvas/index.js +19 -0
  32. package/dist/canvas/index.js.map +1 -0
  33. package/dist/canvas/providers/duckdb/DuckdbProvider.d.ts +56 -0
  34. package/dist/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -0
  35. package/dist/canvas/providers/duckdb/DuckdbProvider.js +600 -0
  36. package/dist/canvas/providers/duckdb/DuckdbProvider.js.map +1 -0
  37. package/dist/canvas/providers/duckdb/exportWriter.d.ts +48 -0
  38. package/dist/canvas/providers/duckdb/exportWriter.d.ts.map +1 -0
  39. package/dist/canvas/providers/duckdb/exportWriter.js +119 -0
  40. package/dist/canvas/providers/duckdb/exportWriter.js.map +1 -0
  41. package/dist/canvas/providers/duckdb/schemaSniffer.d.ts +44 -0
  42. package/dist/canvas/providers/duckdb/schemaSniffer.d.ts.map +1 -0
  43. package/dist/canvas/providers/duckdb/schemaSniffer.js +134 -0
  44. package/dist/canvas/providers/duckdb/schemaSniffer.js.map +1 -0
  45. package/dist/canvas/types.d.ts +134 -0
  46. package/dist/canvas/types.d.ts.map +1 -0
  47. package/dist/canvas/types.js +9 -0
  48. package/dist/canvas/types.js.map +1 -0
  49. package/dist/config/index.d.ts +51 -15
  50. package/dist/config/index.d.ts.map +1 -1
  51. package/dist/config/index.js +44 -0
  52. package/dist/config/index.js.map +1 -1
  53. package/dist/core/app.d.ts +8 -0
  54. package/dist/core/app.d.ts.map +1 -1
  55. package/dist/core/app.js +11 -0
  56. package/dist/core/app.js.map +1 -1
  57. package/dist/core/worker.d.ts +7 -0
  58. package/dist/core/worker.d.ts.map +1 -1
  59. package/dist/core/worker.js +1 -0
  60. package/dist/core/worker.js.map +1 -1
  61. package/dist/logs/combined.log +4 -4
  62. package/dist/logs/error.log +4 -4
  63. package/package.json +14 -5
  64. package/skills/api-canvas/SKILL.md +260 -0
  65. package/skills/api-config/SKILL.md +18 -0
  66. package/skills/api-workers/SKILL.md +6 -0
  67. package/skills/report-issue-framework/SKILL.md +1 -0
  68. package/skills/report-issue-local/SKILL.md +2 -0
  69. package/templates/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
  70. package/templates/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
@@ -0,0 +1,600 @@
1
+ /**
2
+ * @fileoverview DuckDB-backed implementation of {@link IDataCanvasProvider}.
3
+ * One DuckDB instance per canvasId for memory isolation; a shared connection
4
+ * for control-plane work (DDL, describe, drop) and per-query connections for
5
+ * data-plane work so that {@link DuckDBConnection.interrupt} cancels exactly
6
+ * the in-flight query without disturbing concurrent ops on the same canvas.
7
+ *
8
+ * Lazy-loaded via {@link lazyImport} so `@duckdb/node-api` stays a true peer
9
+ * dependency — servers that don't enable canvas pay no install cost.
10
+ *
11
+ * @module src/canvas/providers/duckdb/DuckdbProvider
12
+ */
13
+ import { databaseError, notFound, validationError } from '../../../types-global/errors.js';
14
+ import { lazyImport } from '../../../utils/internal/lazyImport.js';
15
+ import { logger } from '../../../utils/internal/logger.js';
16
+ import { requestContextService } from '../../../utils/internal/requestContext.js';
17
+ import { assertPlanReadOnly, assertSelectOnly, assertValidIdentifier, quoteIdentifier, } from '../../core/sqlGate.js';
18
+ import { copyFormatClause, isPathTarget, pipeFileToStream, resolveExportPath, safeSizeBytes, tempFilePathFor, } from './exportWriter.js';
19
+ import { sniffSchema } from './schemaSniffer.js';
20
+ /** Lazy import binding — preserves bundler-friendly module specifiers. */
21
+ const importDuckDB = lazyImport(() => import('@duckdb/node-api'), 'Install "@duckdb/node-api" to use the DuckDB canvas provider: bun add @duckdb/node-api');
22
+ /** DuckDB SELECT statement-type id (matches `StatementType.SELECT === 1`). */
23
+ const STATEMENT_TYPE_SELECT_ID = 1;
24
+ export class DuckdbProvider {
25
+ options;
26
+ name = 'duckdb';
27
+ duck;
28
+ canvases = new Map();
29
+ constructor(options) {
30
+ this.options = options;
31
+ }
32
+ // ---------------------------------------------------------------------
33
+ // Lifecycle
34
+ // ---------------------------------------------------------------------
35
+ async initCanvas(canvasId, _context) {
36
+ if (this.canvases.has(canvasId))
37
+ return;
38
+ const duck = await this.getModule();
39
+ const instance = await duck.DuckDBInstance.create(':memory:', {
40
+ memory_limit: `${this.options.memoryLimitMb}MB`,
41
+ // Disable secrets/extensions install paths for safety in canvas mode.
42
+ autoinstall_known_extensions: 'false',
43
+ autoload_known_extensions: 'false',
44
+ });
45
+ const controlConnection = await instance.connect();
46
+ // Belt-and-suspenders — also set the limit on the connection.
47
+ await controlConnection.run(`SET memory_limit = '${this.options.memoryLimitMb}MB'`);
48
+ this.canvases.set(canvasId, { instance, controlConnection });
49
+ }
50
+ // biome-ignore lint/suspicious/useAwait: async is required by IDataCanvasProvider; close is sync for DuckDB.
51
+ async destroyCanvas(canvasId, _context) {
52
+ const record = this.canvases.get(canvasId);
53
+ if (!record)
54
+ return;
55
+ this.canvases.delete(canvasId);
56
+ const closeContext = requestContextService.createRequestContext({
57
+ operation: 'DuckdbProvider.destroyCanvas',
58
+ canvasId,
59
+ });
60
+ try {
61
+ record.controlConnection.closeSync();
62
+ }
63
+ catch (err) {
64
+ logger.warning('DuckDB control connection close failed.', {
65
+ ...closeContext,
66
+ error: err instanceof Error ? err.message : String(err),
67
+ });
68
+ }
69
+ try {
70
+ record.instance.closeSync();
71
+ }
72
+ catch (err) {
73
+ logger.warning('DuckDB instance close failed.', {
74
+ ...closeContext,
75
+ error: err instanceof Error ? err.message : String(err),
76
+ });
77
+ }
78
+ }
79
+ async healthCheck() {
80
+ try {
81
+ const duck = await this.getModule();
82
+ const instance = await duck.DuckDBInstance.create(':memory:');
83
+ const conn = await instance.connect();
84
+ await conn.run('SELECT 1');
85
+ conn.closeSync();
86
+ instance.closeSync();
87
+ return true;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ async shutdown() {
94
+ const context = requestContextService.createRequestContext({
95
+ operation: 'DuckdbProvider.shutdown',
96
+ });
97
+ const ids = [...this.canvases.keys()];
98
+ for (const id of ids) {
99
+ await this.destroyCanvas(id, context);
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------
103
+ // Data plane
104
+ // ---------------------------------------------------------------------
105
+ async registerTable(canvasId, name, rows, _context, options) {
106
+ const record = this.requireCanvas(canvasId);
107
+ assertValidIdentifier(name, 'table');
108
+ options?.signal?.throwIfAborted();
109
+ const isAsyncIterable = typeof rows[Symbol.asyncIterator] === 'function';
110
+ let schema;
111
+ let bufferedRows;
112
+ if (options?.schema) {
113
+ schema = options.schema;
114
+ }
115
+ else if (isAsyncIterable) {
116
+ throw validationError('Schema must be provided explicitly when registering rows from an AsyncIterable.', { reason: 'async_iterable_requires_schema', tableName: name });
117
+ }
118
+ else {
119
+ const sniffed = sniffSchema(rows, this.options.schemaSniffRows);
120
+ schema = sniffed.schema;
121
+ bufferedRows = sniffed.sniffedRows;
122
+ }
123
+ for (const col of schema)
124
+ assertValidIdentifier(col.name, 'column');
125
+ // Re-create the table — the issue's lifecycle guarantees a fresh canvasId
126
+ // per acquire, but explicit drop+create makes register idempotent under
127
+ // re-registration of the same name.
128
+ const ddl = buildCreateTableSql(name, schema);
129
+ await record.controlConnection.run(`DROP TABLE IF EXISTS ${quoteIdentifier(name)}`);
130
+ await record.controlConnection.run(ddl);
131
+ options?.signal?.throwIfAborted();
132
+ const appender = await record.controlConnection.createAppender(name);
133
+ let count = 0;
134
+ try {
135
+ const appendOne = (row) => {
136
+ for (const col of schema) {
137
+ appendValue(appender, col, row[col.name]);
138
+ }
139
+ appender.endRow();
140
+ count += 1;
141
+ };
142
+ if (bufferedRows) {
143
+ for (const row of bufferedRows) {
144
+ options?.signal?.throwIfAborted();
145
+ appendOne(row);
146
+ }
147
+ }
148
+ // Drain whatever's left of the iterable.
149
+ if (isAsyncIterable) {
150
+ for await (const row of rows) {
151
+ options?.signal?.throwIfAborted();
152
+ appendOne(row);
153
+ }
154
+ }
155
+ else if (!bufferedRows) {
156
+ for (const row of rows) {
157
+ options?.signal?.throwIfAborted();
158
+ appendOne(row);
159
+ }
160
+ }
161
+ else {
162
+ // Sniffer consumed bufferedRows but the iterable may have more.
163
+ for (const row of skipFirst(rows, bufferedRows.length)) {
164
+ options?.signal?.throwIfAborted();
165
+ appendOne(row);
166
+ }
167
+ }
168
+ }
169
+ finally {
170
+ appender.closeSync();
171
+ }
172
+ return {
173
+ tableName: name,
174
+ rowCount: count,
175
+ columns: schema.map((c) => c.name),
176
+ };
177
+ }
178
+ async query(canvasId, sql, _context, options) {
179
+ const record = this.requireCanvas(canvasId);
180
+ options?.signal?.throwIfAborted();
181
+ // Step 1: parse and type-check before invoking EXPLAIN.
182
+ const extracted = await record.controlConnection.extractStatements(sql);
183
+ const statementCount = extracted.count;
184
+ let statementType;
185
+ if (statementCount === 1) {
186
+ const prepared = await extracted.prepare(0);
187
+ try {
188
+ statementType = prepared.statementType;
189
+ }
190
+ finally {
191
+ prepared.destroySync();
192
+ }
193
+ }
194
+ assertSelectOnly({
195
+ statementCount,
196
+ statementType: statementTypeIdToString(statementType),
197
+ });
198
+ // Step 2: walk the plan with the allowlist (defense in depth).
199
+ const planJson = await this.runExplain(record.controlConnection, `EXPLAIN (FORMAT JSON) ${sql}`);
200
+ assertPlanReadOnly(planJson);
201
+ // Step 3: per-query connection so cancellation is scoped to this call.
202
+ const conn = await record.instance.connect();
203
+ let cancelled = false;
204
+ const onAbort = () => {
205
+ cancelled = true;
206
+ try {
207
+ conn.interrupt();
208
+ }
209
+ catch {
210
+ // interrupt is best-effort; closeSync still cleans up.
211
+ }
212
+ };
213
+ options?.signal?.addEventListener('abort', onAbort, { once: true });
214
+ const rowLimit = options?.rowLimit ?? this.options.defaultRowLimit;
215
+ const preview = options?.preview ?? rowLimit;
216
+ try {
217
+ let registeredAs;
218
+ let rowsToReturn = [];
219
+ let columns = [];
220
+ let totalRowCount = 0;
221
+ if (options?.registerAs) {
222
+ assertValidIdentifier(options.registerAs, 'table');
223
+ // Reject clash with existing canvas table.
224
+ await ensureTableMissing(record.controlConnection, options.registerAs);
225
+ const ctas = `CREATE TABLE ${quoteIdentifier(options.registerAs)} AS ${sql}`;
226
+ await conn.run(ctas);
227
+ registeredAs = options.registerAs;
228
+ // Read a preview off the new table (cheap because rows are local).
229
+ const reader = await conn.runAndReadUntil(`SELECT * FROM ${quoteIdentifier(options.registerAs)} LIMIT ${preview}`, preview);
230
+ rowsToReturn = reader.getRowObjectsJson();
231
+ columns = reader.columnNames();
232
+ const countReader = await conn.runAndReadAll(`SELECT COUNT(*) AS n FROM ${quoteIdentifier(options.registerAs)}`);
233
+ const countRow = countReader.getRowObjectsJson()[0];
234
+ totalRowCount = Number(countRow?.n ?? 0);
235
+ }
236
+ else {
237
+ const reader = await conn.runAndReadAll(sql);
238
+ const allRows = reader.getRowObjectsJson();
239
+ columns = reader.columnNames();
240
+ totalRowCount = allRows.length;
241
+ rowsToReturn = allRows.slice(0, Math.min(preview, rowLimit));
242
+ }
243
+ return {
244
+ rows: rowsToReturn,
245
+ columns,
246
+ rowCount: totalRowCount,
247
+ ...(registeredAs && { tableName: registeredAs }),
248
+ };
249
+ }
250
+ catch (err) {
251
+ if (cancelled) {
252
+ throw validationError('Canvas query was cancelled.', { reason: 'cancelled' }, { cause: err });
253
+ }
254
+ throw classifyDuckdbError(err);
255
+ }
256
+ finally {
257
+ options?.signal?.removeEventListener('abort', onAbort);
258
+ try {
259
+ conn.closeSync();
260
+ }
261
+ catch {
262
+ // Connection may already be torn down by interrupt — ignore.
263
+ }
264
+ }
265
+ }
266
+ async export(canvasId, tableName, target, _context, options) {
267
+ const record = this.requireCanvas(canvasId);
268
+ assertValidIdentifier(tableName, 'table');
269
+ options?.signal?.throwIfAborted();
270
+ const formatClause = copyFormatClause(target.format);
271
+ const conn = await record.instance.connect();
272
+ const onAbort = () => {
273
+ try {
274
+ conn.interrupt();
275
+ }
276
+ catch {
277
+ /* noop */
278
+ }
279
+ };
280
+ options?.signal?.addEventListener('abort', onAbort, { once: true });
281
+ try {
282
+ // Row count from the table — cheap, used for the result payload.
283
+ const countReader = await conn.runAndReadAll(`SELECT COUNT(*) AS n FROM ${quoteIdentifier(tableName)}`);
284
+ const countRow = countReader.getRowObjectsJson()[0];
285
+ const rowCount = Number(countRow?.n ?? 0);
286
+ if (isPathTarget(target)) {
287
+ const absolutePath = await resolveExportPath(this.options.exportRootPath, target.path);
288
+ await conn.run(`COPY ${quoteIdentifier(tableName)} TO '${escapeSqlString(absolutePath)}' ${formatClause}`);
289
+ const sizeBytes = await safeSizeBytes(absolutePath);
290
+ return {
291
+ format: target.format,
292
+ path: absolutePath,
293
+ sizeBytes,
294
+ rowCount,
295
+ };
296
+ }
297
+ // Stream branch: copy to temp file in sandbox, pipe to caller's stream,
298
+ // then unlink. tempFilePathFor() creates the sandbox root if missing.
299
+ const tempPath = await tempFilePathFor(this.options.exportRootPath, target.format);
300
+ await conn.run(`COPY ${quoteIdentifier(tableName)} TO '${escapeSqlString(tempPath)}' ${formatClause}`);
301
+ const { sizeBytes } = await pipeFileToStream(tempPath, target.stream);
302
+ return {
303
+ format: target.format,
304
+ sizeBytes,
305
+ rowCount,
306
+ };
307
+ }
308
+ catch (err) {
309
+ throw classifyDuckdbError(err);
310
+ }
311
+ finally {
312
+ options?.signal?.removeEventListener('abort', onAbort);
313
+ try {
314
+ conn.closeSync();
315
+ }
316
+ catch {
317
+ /* noop */
318
+ }
319
+ }
320
+ }
321
+ async describe(canvasId, _context, options) {
322
+ const record = this.requireCanvas(canvasId);
323
+ if (options?.tableName !== undefined) {
324
+ assertValidIdentifier(options.tableName, 'table');
325
+ }
326
+ const filter = options?.tableName
327
+ ? ` AND table_name = '${escapeSqlString(options.tableName)}'`
328
+ : '';
329
+ const reader = await record.controlConnection.runAndReadAll(`SELECT table_name FROM information_schema.tables WHERE table_schema = 'main'${filter} ORDER BY table_name`);
330
+ const tableRows = reader.getRowObjectsJson();
331
+ const result = [];
332
+ for (const row of tableRows) {
333
+ const tableName = row.table_name;
334
+ const colReader = await record.controlConnection.runAndReadAll(`SELECT column_name, data_type, is_nullable FROM information_schema.columns ` +
335
+ `WHERE table_schema = 'main' AND table_name = '${escapeSqlString(tableName)}' ` +
336
+ `ORDER BY ordinal_position`);
337
+ const colRows = colReader.getRowObjectsJson();
338
+ const columns = colRows.map((c) => ({
339
+ name: c.column_name,
340
+ type: dataTypeToColumnType(c.data_type),
341
+ nullable: c.is_nullable === 'YES',
342
+ }));
343
+ const countReader = await record.controlConnection.runAndReadAll(`SELECT COUNT(*) AS n FROM ${quoteIdentifier(tableName)}`);
344
+ const countRow = countReader.getRowObjectsJson()[0];
345
+ result.push({
346
+ name: tableName,
347
+ rowCount: Number(countRow?.n ?? 0),
348
+ columns,
349
+ });
350
+ }
351
+ return result;
352
+ }
353
+ async drop(canvasId, name, _context) {
354
+ const record = this.requireCanvas(canvasId);
355
+ assertValidIdentifier(name, 'table');
356
+ const checkReader = await record.controlConnection.runAndReadAll(`SELECT 1 FROM information_schema.tables WHERE table_schema = 'main' AND table_name = '${escapeSqlString(name)}' LIMIT 1`);
357
+ if (checkReader.getRowsJson().length === 0)
358
+ return false;
359
+ await record.controlConnection.run(`DROP TABLE ${quoteIdentifier(name)}`);
360
+ return true;
361
+ }
362
+ async clear(canvasId, _context) {
363
+ const record = this.requireCanvas(canvasId);
364
+ const reader = await record.controlConnection.runAndReadAll(`SELECT table_name FROM information_schema.tables WHERE table_schema = 'main'`);
365
+ const rows = reader.getRowObjectsJson();
366
+ for (const row of rows) {
367
+ await record.controlConnection.run(`DROP TABLE ${quoteIdentifier(row.table_name)}`);
368
+ }
369
+ return rows.length;
370
+ }
371
+ // ---------------------------------------------------------------------
372
+ // Internals
373
+ // ---------------------------------------------------------------------
374
+ requireCanvas(canvasId) {
375
+ const record = this.canvases.get(canvasId);
376
+ if (!record) {
377
+ throw notFound('Canvas not found in DuckDB provider.', { canvasId });
378
+ }
379
+ return record;
380
+ }
381
+ async getModule() {
382
+ if (!this.duck)
383
+ this.duck = await importDuckDB();
384
+ return this.duck;
385
+ }
386
+ async runExplain(connection, explainSql) {
387
+ const reader = await connection.runAndReadAll(explainSql);
388
+ const rows = reader.getRowObjectsJson();
389
+ // EXPLAIN returns a single row with an `explain_value` column containing
390
+ // the JSON tree as a string.
391
+ const value = rows[0]?.explain_value;
392
+ if (typeof value === 'string') {
393
+ try {
394
+ return JSON.parse(value);
395
+ }
396
+ catch (err) {
397
+ throw databaseError('Failed to parse EXPLAIN plan JSON.', undefined, { cause: err });
398
+ }
399
+ }
400
+ return rows;
401
+ }
402
+ }
403
+ // ---------------------------------------------------------------------------
404
+ // Helpers
405
+ // ---------------------------------------------------------------------------
406
+ function buildCreateTableSql(tableName, schema) {
407
+ if (schema.length === 0) {
408
+ throw validationError('Table schema must contain at least one column.', { tableName });
409
+ }
410
+ const cols = schema.map((c) => {
411
+ const nullable = c.nullable === false ? ' NOT NULL' : '';
412
+ return `${quoteIdentifier(c.name)} ${columnTypeToSql(c.type)}${nullable}`;
413
+ });
414
+ return `CREATE TABLE ${quoteIdentifier(tableName)} (${cols.join(', ')})`;
415
+ }
416
+ function columnTypeToSql(type) {
417
+ switch (type) {
418
+ case 'VARCHAR':
419
+ return 'VARCHAR';
420
+ case 'INTEGER':
421
+ return 'INTEGER';
422
+ case 'BIGINT':
423
+ return 'BIGINT';
424
+ case 'DOUBLE':
425
+ return 'DOUBLE';
426
+ case 'BOOLEAN':
427
+ return 'BOOLEAN';
428
+ case 'TIMESTAMP':
429
+ return 'TIMESTAMP';
430
+ case 'DATE':
431
+ return 'DATE';
432
+ case 'JSON':
433
+ return 'JSON';
434
+ case 'BLOB':
435
+ return 'BLOB';
436
+ }
437
+ }
438
+ /** Map DuckDB `information_schema.columns.data_type` strings back to {@link ColumnType}. */
439
+ function dataTypeToColumnType(dataType) {
440
+ const upper = dataType.toUpperCase();
441
+ if (upper.startsWith('VARCHAR') || upper === 'STRING' || upper === 'TEXT')
442
+ return 'VARCHAR';
443
+ if (upper === 'INTEGER' || upper === 'INT' || upper === 'INT4')
444
+ return 'INTEGER';
445
+ if (upper === 'BIGINT' || upper === 'INT8' || upper === 'LONG')
446
+ return 'BIGINT';
447
+ if (upper === 'DOUBLE' || upper === 'FLOAT8' || upper === 'REAL' || upper === 'FLOAT')
448
+ return 'DOUBLE';
449
+ if (upper === 'BOOLEAN' || upper === 'BOOL')
450
+ return 'BOOLEAN';
451
+ if (upper.startsWith('TIMESTAMP'))
452
+ return 'TIMESTAMP';
453
+ if (upper === 'DATE')
454
+ return 'DATE';
455
+ if (upper === 'JSON')
456
+ return 'JSON';
457
+ if (upper === 'BLOB' || upper === 'BYTEA')
458
+ return 'BLOB';
459
+ return 'VARCHAR';
460
+ }
461
+ /** Convert a DuckDB `StatementType` numeric id to a string the gate can match. */
462
+ function statementTypeIdToString(id) {
463
+ switch (id) {
464
+ case 1:
465
+ return 'SELECT';
466
+ case 2:
467
+ return 'INSERT';
468
+ case 3:
469
+ return 'UPDATE';
470
+ case 4:
471
+ return 'EXPLAIN';
472
+ case 5:
473
+ return 'DELETE';
474
+ case 6:
475
+ return 'PREPARE';
476
+ case 7:
477
+ return 'CREATE';
478
+ case 8:
479
+ return 'EXECUTE';
480
+ case 9:
481
+ return 'ALTER';
482
+ case 10:
483
+ return 'TRANSACTION';
484
+ case 11:
485
+ return 'COPY';
486
+ case 12:
487
+ return 'ANALYZE';
488
+ case 13:
489
+ return 'VARIABLE_SET';
490
+ case 14:
491
+ return 'CREATE_FUNC';
492
+ case 15:
493
+ return 'DROP';
494
+ case 16:
495
+ return 'EXPORT';
496
+ case 17:
497
+ return 'PRAGMA';
498
+ case 18:
499
+ return 'VACUUM';
500
+ case 19:
501
+ return 'CALL';
502
+ case 20:
503
+ return 'SET';
504
+ case 21:
505
+ return 'LOAD';
506
+ case 22:
507
+ return 'RELATION';
508
+ case 23:
509
+ return 'EXTENSION';
510
+ case 24:
511
+ return 'LOGICAL_PLAN';
512
+ case 25:
513
+ return 'ATTACH';
514
+ case 26:
515
+ return 'DETACH';
516
+ case 27:
517
+ return 'MULTI';
518
+ default:
519
+ return 'UNKNOWN';
520
+ }
521
+ }
522
+ /** Re-export for tests and consumer-side parsing. */
523
+ export { STATEMENT_TYPE_SELECT_ID };
524
+ /** Append a single value via the DuckDB appender, dispatched on column type. */
525
+ function appendValue(appender, col, value) {
526
+ if (value === null || value === undefined) {
527
+ appender.appendNull();
528
+ return;
529
+ }
530
+ switch (col.type) {
531
+ case 'VARCHAR':
532
+ appender.appendVarchar(String(value));
533
+ return;
534
+ case 'INTEGER':
535
+ appender.appendInteger(Number(value));
536
+ return;
537
+ case 'BIGINT':
538
+ appender.appendBigInt(typeof value === 'bigint' ? value : BigInt(Math.trunc(Number(value))));
539
+ return;
540
+ case 'DOUBLE':
541
+ appender.appendDouble(Number(value));
542
+ return;
543
+ case 'BOOLEAN':
544
+ appender.appendBoolean(Boolean(value));
545
+ return;
546
+ case 'JSON':
547
+ appender.appendVarchar(typeof value === 'string' ? value : JSON.stringify(value));
548
+ return;
549
+ case 'TIMESTAMP':
550
+ case 'DATE':
551
+ case 'BLOB':
552
+ // Use varchar fallback; DuckDB casts on insert when the schema allows.
553
+ appender.appendVarchar(String(value));
554
+ return;
555
+ }
556
+ }
557
+ function* skipFirst(iter, n) {
558
+ let skipped = 0;
559
+ for (const item of iter) {
560
+ if (skipped < n) {
561
+ skipped += 1;
562
+ continue;
563
+ }
564
+ yield item;
565
+ }
566
+ }
567
+ /** Escape a string literal for safe inclusion in `'...'` SQL contexts. */
568
+ function escapeSqlString(value) {
569
+ return value.replace(/'/g, "''");
570
+ }
571
+ async function ensureTableMissing(connection, tableName) {
572
+ const reader = await connection.runAndReadAll(`SELECT 1 FROM information_schema.tables WHERE table_schema = 'main' AND table_name = '${escapeSqlString(tableName)}' LIMIT 1`);
573
+ if (reader.getRowsJson().length > 0) {
574
+ throw validationError(`Canvas table "${tableName}" already exists. Drop it before reusing the name.`, { reason: 'register_as_clash', tableName });
575
+ }
576
+ }
577
+ /**
578
+ * Map a DuckDB-thrown error to a framework error class.
579
+ * @internal Exported for unit testing — not re-exported from the canvas barrel.
580
+ */
581
+ export function classifyDuckdbError(err) {
582
+ if (err instanceof Error) {
583
+ const msg = err.message;
584
+ // DuckDB tends to throw `Error` with a descriptive message; keep its
585
+ // identity as the cause and attach a structured message.
586
+ if (/parser error|syntax/i.test(msg)) {
587
+ return validationError(`Canvas SQL rejected: ${msg}`, { reason: 'sql_parse_error' }, {
588
+ cause: err,
589
+ });
590
+ }
591
+ if (/permission|read.?only/i.test(msg)) {
592
+ return validationError(`Canvas SQL rejected: ${msg}`, { reason: 'sql_read_only' }, {
593
+ cause: err,
594
+ });
595
+ }
596
+ return databaseError(msg, undefined, { cause: err });
597
+ }
598
+ return databaseError('DuckDB threw a non-Error value.', { value: String(err) });
599
+ }
600
+ //# sourceMappingURL=DuckdbProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DuckdbProvider.js","sourceRoot":"","sources":["../../../../src/canvas/providers/duckdb/DuckdbProvider.ts"],"names":[],"mappings":"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"}