@cyanheads/brapi-mcp-server 0.4.13 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CLAUDE.md +25 -19
  2. package/README.md +40 -26
  3. package/changelog/0.4.x/0.4.13.md +15 -0
  4. package/changelog/0.4.x/0.4.14.md +22 -0
  5. package/changelog/0.5.x/0.5.0.md +59 -0
  6. package/dist/config/builtin-aliases.d.ts +1 -1
  7. package/dist/config/builtin-aliases.js +1 -1
  8. package/dist/config/server-config.d.ts +3 -3
  9. package/dist/config/server-config.d.ts.map +1 -1
  10. package/dist/config/server-config.js +13 -13
  11. package/dist/config/server-config.js.map +1 -1
  12. package/dist/index.js +62 -15
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +1 -1
  15. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -1
  16. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +3 -3
  17. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +8 -11
  19. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +15 -25
  21. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +6 -10
  23. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +6 -16
  25. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts +69 -0
  27. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts.map +1 -0
  28. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js +233 -0
  29. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js.map +1 -0
  30. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +19 -11
  31. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +80 -28
  33. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -1
  34. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +4 -6
  35. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +28 -36
  37. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
  38. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +3 -5
  39. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
  40. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +21 -17
  41. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
  42. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +4 -6
  43. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
  44. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +16 -16
  45. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
  46. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +3 -5
  47. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
  48. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +15 -15
  49. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
  50. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +4 -6
  51. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
  52. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -17
  53. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
  54. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +4 -6
  55. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
  56. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +17 -17
  57. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
  58. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +2 -4
  59. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
  60. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +60 -19
  61. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
  62. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +3 -5
  63. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
  64. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +15 -15
  65. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
  66. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -1
  67. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +6 -2
  68. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -1
  69. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +17 -2
  70. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -1
  71. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +51 -7
  72. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -1
  73. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +16 -2
  74. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
  75. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +51 -5
  76. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
  77. package/dist/mcp-server/tools/definitions/index.d.ts +141 -165
  78. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  79. package/dist/mcp-server/tools/definitions/index.js +28 -17
  80. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  81. package/dist/mcp-server/tools/shared/find-helpers.d.ts +79 -39
  82. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
  83. package/dist/mcp-server/tools/shared/find-helpers.js +167 -70
  84. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
  85. package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -1
  86. package/dist/mcp-server/tools/shared/raw-routing-hints.js +6 -6
  87. package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
  88. package/dist/services/canvas-bridge/canvas-bridge.d.ts +69 -44
  89. package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
  90. package/dist/services/canvas-bridge/canvas-bridge.js +220 -103
  91. package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
  92. package/dist/services/canvas-bridge/index.d.ts +1 -1
  93. package/dist/services/canvas-bridge/index.d.ts.map +1 -1
  94. package/dist/services/canvas-bridge/index.js +1 -1
  95. package/dist/services/canvas-bridge/index.js.map +1 -1
  96. package/dist/services/canvas-bridge/types.d.ts +11 -12
  97. package/dist/services/canvas-bridge/types.d.ts.map +1 -1
  98. package/dist/services/canvas-bridge/types.js +4 -4
  99. package/package.json +3 -11
  100. package/server.json +3 -3
  101. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +0 -13
  102. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +0 -1
  103. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +0 -26
  104. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +0 -1
  105. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +0 -89
  106. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +0 -1
  107. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +0 -306
  108. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +0 -1
  109. package/dist/services/dataset-store/dataset-store.d.ts +0 -44
  110. package/dist/services/dataset-store/dataset-store.d.ts.map +0 -1
  111. package/dist/services/dataset-store/dataset-store.js +0 -208
  112. package/dist/services/dataset-store/dataset-store.js.map +0 -1
  113. package/dist/services/dataset-store/index.d.ts +0 -8
  114. package/dist/services/dataset-store/index.d.ts.map +0 -1
  115. package/dist/services/dataset-store/index.js +0 -7
  116. package/dist/services/dataset-store/index.js.map +0 -1
  117. package/dist/services/dataset-store/types.d.ts +0 -72
  118. package/dist/services/dataset-store/types.d.ts.map +0 -1
  119. package/dist/services/dataset-store/types.js +0 -8
  120. package/dist/services/dataset-store/types.js.map +0 -1
@@ -2,31 +2,50 @@
2
2
  * @fileoverview CanvasBridge — server-side adapter over the framework's
3
3
  * `DataCanvas` primitive. Owns three concerns the framework leaves to the
4
4
  * consumer: (1) per-tenant default canvas resolution (the agent never passes
5
- * `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) deriving
6
- * SQL-safe table names from UUID-shaped dataset IDs, and (3) tracking
7
- * originating-dataset provenance so `brapi_dataframe_describe` can surface it.
5
+ * `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) generating
6
+ * SQL-safe `df_<uuid>` table names for spilled find_* results, and (3) tracking
7
+ * originating-source provenance so `brapi_dataframe_describe` can surface it.
8
8
  *
9
- * No-ops cleanly when the framework canvas service is undefined or when
10
- * `BRAPI_CANVAS_ENABLED=false` `isEnabled()` is the single gate every caller
11
- * checks before hitting any canvas op.
9
+ * Canvas is mandatory `core.canvas` must be configured (DuckDB) for the
10
+ * server to start. There is no on/off toggle; spillover always lands on the
11
+ * canvas.
12
12
  *
13
13
  * @module services/canvas-bridge/canvas-bridge
14
14
  */
15
15
  import type { Context } from '@cyanheads/mcp-ts-core';
16
- import type { CanvasInstance, DataCanvas, QueryResult, RegisterTableResult } from '@cyanheads/mcp-ts-core/canvas';
16
+ import type { CanvasInstance, DataCanvas, ExportResult, ExportTarget, QueryResult, RegisterTableResult } from '@cyanheads/mcp-ts-core/canvas';
17
17
  import type { ServerConfig } from '../../config/server-config.js';
18
- import type { DatasetMetadata } from '../../services/dataset-store/index.js';
19
18
  import type { DescribedTable } from './types.js';
19
+ /** Input to {@link CanvasBridge.registerDataframe}. */
20
+ export interface RegisterDataframeInput {
21
+ /** Originating BrAPI baseUrl. */
22
+ baseUrl: string;
23
+ /** Cap that fired before the upstream was exhausted. Omit when no cap fired. */
24
+ maxRows?: number;
25
+ /** Original filter map / query — provenance for reproducibility. */
26
+ query: unknown;
27
+ /** Row payload to materialize. */
28
+ rows: Record<string, unknown>[];
29
+ /** Originating tool (e.g. `find_observations`). */
30
+ source: string;
31
+ /** True when the producer hit a row/page cap before exhausting upstream. */
32
+ truncated?: boolean;
33
+ }
34
+ /** Result of {@link CanvasBridge.registerDataframe} — the dataframe handle. */
35
+ export interface RegisterDataframeResult {
36
+ columns: string[];
37
+ createdAt: string;
38
+ expiresAt: string;
39
+ maxRows?: number;
40
+ rowCount: number;
41
+ tableName: string;
42
+ truncated?: boolean;
43
+ }
20
44
  /** Bridge for `core.canvas` that adds per-tenant default-canvas semantics. */
21
45
  export declare class CanvasBridge {
22
46
  private readonly canvas;
23
47
  private readonly serverConfig;
24
- constructor(canvas: DataCanvas | undefined, serverConfig: ServerConfig);
25
- /**
26
- * True when both the framework canvas service and the server-side gate are
27
- * on. Every caller must check this before any canvas op.
28
- */
29
- isEnabled(): boolean;
48
+ constructor(canvas: DataCanvas, serverConfig: ServerConfig);
30
49
  /**
31
50
  * Acquire the per-tenant default canvas. The canvasId is cached in
32
51
  * `ctx.state` so subsequent calls reuse the same canvas (sliding TTL on the
@@ -36,22 +55,12 @@ export declare class CanvasBridge {
36
55
  */
37
56
  getInstance(ctx: Context): Promise<CanvasInstance>;
38
57
  /**
39
- * Auto-register a spilled dataset on the canvas. Called from `DatasetStore`
40
- * after a successful create. Logs a warning and swallows on failure —
41
- * canvas registration is a best-effort enrichment of the spillover, not a
42
- * blocking step.
43
- */
44
- registerDataset(ctx: Context, metadata: DatasetMetadata, rows: Record<string, unknown>[]): Promise<{
45
- registered: boolean;
46
- tableName?: string;
47
- }>;
48
- /**
49
- * Drop the canvas table corresponding to a deleted dataset. Mirrors
50
- * `registerDataset` — best-effort, never throws.
58
+ * Materialize a spilled `find_*` result as a canvas dataframe. Generates a
59
+ * `df_<uuid>` table name, registers the rows with an all-nullable schema,
60
+ * persists provenance metadata in `ctx.state`, and returns the full
61
+ * dataframe handle.
51
62
  */
52
- dropDataset(ctx: Context, datasetId: string): Promise<{
53
- dropped: boolean;
54
- }>;
63
+ registerDataframe(ctx: Context, input: RegisterDataframeInput): Promise<RegisterDataframeResult>;
55
64
  /**
56
65
  * Run a SQL query against the per-tenant default canvas. Caps `rowLimit` to
57
66
  * `BRAPI_CANVAS_MAX_ROWS` so a missing/excessive caller value can't bypass
@@ -65,35 +74,51 @@ export declare class CanvasBridge {
65
74
  }): Promise<QueryResult>;
66
75
  /**
67
76
  * Register an explicitly-named table (used by the rare consumer that wants
68
- * to push rows directly without going through DatasetStore spillover).
77
+ * to push rows directly without going through the spillover path).
69
78
  */
70
79
  registerTable(ctx: Context, name: string, rows: Record<string, unknown>[]): Promise<RegisterTableResult>;
71
80
  /** Drop a single canvas table by name. Returns true when found and removed. */
72
81
  drop(ctx: Context, name: string): Promise<boolean>;
82
+ /**
83
+ * Export a canvas table to a path target. The framework resolves the
84
+ * relative path against `CANVAS_EXPORT_PATH` and rejects absolute /
85
+ * traversal inputs — the bridge only forwards.
86
+ *
87
+ * Tracking the resulting path under the *source* dataframe name (so a
88
+ * subsequent `drop(sourceName)` can unlink it) is the caller's job. The
89
+ * bridge can't infer "source name" when the export reads from a transient
90
+ * derived table (e.g. a projection materialized for one export call) —
91
+ * auto-tracking under whatever `tableName` was passed would unlink the
92
+ * file the moment the derived table is dropped. See
93
+ * `pairExportToSourceDataframe` in `brapi-dataframe-export.tool.ts`.
94
+ */
95
+ export(ctx: Context, tableName: string, target: ExportTarget, options?: {
96
+ signal?: AbortSignal;
97
+ }): Promise<ExportResult>;
98
+ /**
99
+ * Track an exported file path under a source dataframe name so that a
100
+ * later `drop(sourceName)` unlinks it. Persisted in `ctx.state` with the
101
+ * remaining TTL of the source dataframe; if the dataframe expires via
102
+ * TTL, the entry disappears and the file is reaped opportunistically by
103
+ * the export tool's mtime sweep.
104
+ */
105
+ trackExport(ctx: Context, sourceName: string, path: string): Promise<void>;
106
+ private unlinkTrackedExports;
73
107
  /**
74
108
  * Describe one or all canvas tables, augmenting the framework's `TableInfo`
75
- * with originating-dataset provenance for auto-registered tables.
109
+ * with originating-source provenance for auto-registered tables.
76
110
  */
77
111
  describe(ctx: Context, options?: {
78
112
  tableName?: string;
79
113
  }): Promise<DescribedTable[]>;
80
114
  private augmentTableInfo;
81
- private requireCanvas;
82
115
  }
83
116
  /**
84
- * Derive a SQL-safe table name from a DatasetStore dataset ID. UUIDs from
85
- * `crypto.randomUUID()` carry hyphens which fail the canvas identifier gate;
86
- * we replace them with underscores and prefix with `ds_` so the namespace is
87
- * unambiguous. Reversible — `tableNameToDatasetId(datasetTableName(id)) === id`.
88
- */
89
- export declare function datasetTableName(datasetId: string): string;
90
- /** Inverse of {@link datasetTableName}. Returns `undefined` for non-`ds_` names. */
91
- export declare function tableNameToDatasetId(tableName: string): string | undefined;
92
- /**
93
- * Initialize the singleton bridge. Pass the framework canvas (which is
94
- * `undefined` when `CANVAS_PROVIDER_TYPE !== 'duckdb'` or on Workers).
117
+ * Initialize the singleton bridge. The framework canvas is mandatory the
118
+ * caller is responsible for ensuring `core.canvas` is defined before this
119
+ * runs (`createApp` setup hook should fail closed when it isn't).
95
120
  */
96
- export declare function initCanvasBridge(canvas: DataCanvas | undefined, serverConfig: ServerConfig): CanvasBridge;
121
+ export declare function initCanvasBridge(canvas: DataCanvas, serverConfig: ServerConfig): CanvasBridge;
97
122
  export declare function getCanvasBridge(): CanvasBridge;
98
123
  /** Test-only — clear the singleton between suites. */
99
124
  export declare function resetCanvasBridge(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-bridge.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,YAAY,CAAC;AA4BlE,8EAA8E;AAC9E,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,YAAY,EAAE,YAAY;IAG7C;;;OAGG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;OAMG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBxD;;;;;OAKG;IACG,eAAe,CACnB,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC9B,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoCvD;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAkBjF;;;;;OAKG;IACG,KAAK,CACT,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GACzE,OAAO,CAAC,WAAW,CAAC;IAkBvB;;;OAGG;IACG,aAAa,CACjB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC9B,OAAO,CAAC,mBAAmB,CAAC;IAK/B,+EAA+E;IACzE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxD;;;OAGG;IACG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAQ/E,gBAAgB;IAkB9B,OAAO,CAAC,aAAa;CAQtB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1E;AAsCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,YAAY,EAAE,YAAY,GACzB,YAAY,CAGd;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
1
+ {"version":3,"file":"canvas-bridge.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,17 @@
2
2
  * @fileoverview CanvasBridge — server-side adapter over the framework's
3
3
  * `DataCanvas` primitive. Owns three concerns the framework leaves to the
4
4
  * consumer: (1) per-tenant default canvas resolution (the agent never passes
5
- * `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) deriving
6
- * SQL-safe table names from UUID-shaped dataset IDs, and (3) tracking
7
- * originating-dataset provenance so `brapi_dataframe_describe` can surface it.
5
+ * `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) generating
6
+ * SQL-safe `df_<uuid>` table names for spilled find_* results, and (3) tracking
7
+ * originating-source provenance so `brapi_dataframe_describe` can surface it.
8
8
  *
9
- * No-ops cleanly when the framework canvas service is undefined or when
10
- * `BRAPI_CANVAS_ENABLED=false` `isEnabled()` is the single gate every caller
11
- * checks before hitting any canvas op.
9
+ * Canvas is mandatory `core.canvas` must be configured (DuckDB) for the
10
+ * server to start. There is no on/off toggle; spillover always lands on the
11
+ * canvas.
12
12
  *
13
13
  * @module services/canvas-bridge/canvas-bridge
14
14
  */
15
+ import { unlink } from 'node:fs/promises';
15
16
  import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
16
17
  /**
17
18
  * Construct a `RequestContext` slice from the handler `Context`. The
@@ -36,8 +37,17 @@ function asRequestContext(ctx) {
36
37
  const DEFAULT_CANVAS_KEY = 'brapi/canvas/default';
37
38
  /** Prefix for per-table provenance entries — keyed by canvas table name. */
38
39
  const TABLE_META_PREFIX = 'brapi/canvas/tablemeta/';
39
- /** Auto-registered dataset-table prefix. Anything else is user-derived (registerAs). */
40
- const DATASET_TABLE_PREFIX = 'ds_';
40
+ /**
41
+ * Prefix for export-path tracking entries — keyed by canvas table name. The
42
+ * value is a list of absolute paths written by `brapi_dataframe_export` for
43
+ * that dataframe, persisted with the same TTL as the dataframe's provenance.
44
+ * Used by `drop()` to remove paired files when an explicit drop happens; if
45
+ * the dataframe expires via TTL the state entry simply disappears and the
46
+ * file is reaped opportunistically by the export tool's mtime sweep.
47
+ */
48
+ const EXPORT_PATHS_PREFIX = 'brapi/canvas/exports/';
49
+ /** Auto-registered dataframe-table prefix. Anything else is user-derived (registerAs). */
50
+ const DATAFRAME_TABLE_PREFIX = 'df_';
41
51
  /** Bridge for `core.canvas` that adds per-tenant default-canvas semantics. */
42
52
  export class CanvasBridge {
43
53
  canvas;
@@ -46,13 +56,6 @@ export class CanvasBridge {
46
56
  this.canvas = canvas;
47
57
  this.serverConfig = serverConfig;
48
58
  }
49
- /**
50
- * True when both the framework canvas service and the server-side gate are
51
- * on. Every caller must check this before any canvas op.
52
- */
53
- isEnabled() {
54
- return this.canvas !== undefined && this.serverConfig.canvasEnabled;
55
- }
56
59
  /**
57
60
  * Acquire the per-tenant default canvas. The canvasId is cached in
58
61
  * `ctx.state` so subsequent calls reuse the same canvas (sliding TTL on the
@@ -61,10 +64,9 @@ export class CanvasBridge {
61
64
  * "omit on retry" recovery hint without surfacing the token to the agent.
62
65
  */
63
66
  async getInstance(ctx) {
64
- const canvas = this.requireCanvas();
65
67
  const cached = await ctx.state.get(DEFAULT_CANVAS_KEY);
66
68
  try {
67
- const instance = await canvas.acquire(cached ?? undefined, asRequestContext(ctx));
69
+ const instance = await this.canvas.acquire(cached ?? undefined, asRequestContext(ctx));
68
70
  if (!cached || instance.isNew) {
69
71
  await ctx.state.set(DEFAULT_CANVAS_KEY, instance.canvasId);
70
72
  }
@@ -73,7 +75,7 @@ export class CanvasBridge {
73
75
  catch (err) {
74
76
  if (cached && isCanvasNotFound(err)) {
75
77
  await ctx.state.delete(DEFAULT_CANVAS_KEY);
76
- const fresh = await canvas.acquire(undefined, asRequestContext(ctx));
78
+ const fresh = await this.canvas.acquire(undefined, asRequestContext(ctx));
77
79
  await ctx.state.set(DEFAULT_CANVAS_KEY, fresh.canvasId);
78
80
  return fresh;
79
81
  }
@@ -81,67 +83,54 @@ export class CanvasBridge {
81
83
  }
82
84
  }
83
85
  /**
84
- * Auto-register a spilled dataset on the canvas. Called from `DatasetStore`
85
- * after a successful create. Logs a warning and swallows on failure —
86
- * canvas registration is a best-effort enrichment of the spillover, not a
87
- * blocking step.
88
- */
89
- async registerDataset(ctx, metadata, rows) {
90
- if (!this.isEnabled())
91
- return { registered: false };
92
- const tableName = datasetTableName(metadata.datasetId);
93
- try {
94
- const instance = await this.getInstance(ctx);
95
- await instance.registerTable(tableName, rows);
96
- const tableMeta = {
97
- datasetId: metadata.datasetId,
98
- source: metadata.source,
99
- baseUrl: metadata.baseUrl,
100
- query: metadata.query,
101
- createdAt: metadata.createdAt,
102
- expiresAt: metadata.expiresAt,
103
- };
104
- await ctx.state.set(tableMetaKey(tableName), tableMeta, {
105
- ttl: this.serverConfig.datasetTtlSeconds,
106
- });
107
- ctx.log.debug('Canvas auto-register succeeded', {
108
- datasetId: metadata.datasetId,
109
- tableName,
110
- rowCount: metadata.rowCount,
111
- });
112
- return { registered: true, tableName };
113
- }
114
- catch (err) {
115
- ctx.log.warning('Canvas auto-register failed; dataset still available via brapi_manage_dataset', {
116
- datasetId: metadata.datasetId,
117
- tableName,
118
- error: err instanceof Error ? err.message : String(err),
119
- });
120
- return { registered: false };
121
- }
122
- }
123
- /**
124
- * Drop the canvas table corresponding to a deleted dataset. Mirrors
125
- * `registerDataset` — best-effort, never throws.
86
+ * Materialize a spilled `find_*` result as a canvas dataframe. Generates a
87
+ * `df_<uuid>` table name, registers the rows with an all-nullable schema,
88
+ * persists provenance metadata in `ctx.state`, and returns the full
89
+ * dataframe handle.
126
90
  */
127
- async dropDataset(ctx, datasetId) {
128
- if (!this.isEnabled())
129
- return { dropped: false };
130
- const tableName = datasetTableName(datasetId);
131
- try {
132
- const instance = await this.getInstance(ctx);
133
- const dropped = await instance.drop(tableName);
134
- await ctx.state.delete(tableMetaKey(tableName));
135
- return { dropped };
136
- }
137
- catch (err) {
138
- ctx.log.warning('Canvas auto-drop failed', {
139
- datasetId,
140
- tableName,
141
- error: err instanceof Error ? err.message : String(err),
142
- });
143
- return { dropped: false };
144
- }
91
+ async registerDataframe(ctx, input) {
92
+ const tableName = generateDataframeName();
93
+ const ttl = this.serverConfig.datasetTtlSeconds;
94
+ const now = new Date();
95
+ const expiresAt = new Date(now.getTime() + ttl * 1000);
96
+ const createdAt = now.toISOString();
97
+ const expiresAtIso = expiresAt.toISOString();
98
+ const instance = await this.getInstance(ctx);
99
+ // Pre-compute an explicit all-nullable schema. The framework's default
100
+ // path sniffs the first N rows and infers `nullable: false` for any
101
+ // column that happened to be non-null in the sample — DuckDB then
102
+ // creates the table with NOT NULL constraints, and the appender rolls
103
+ // back the entire batch the first time a later row carries a null for
104
+ // that column. Sniffed schemas can never prove non-nullability from a
105
+ // sample, so we walk every row, classify types ourselves, and emit
106
+ // `nullable: true` for every column.
107
+ const schema = deriveAllNullableSchema(input.rows);
108
+ const registered = await instance.registerTable(tableName, input.rows, { schema });
109
+ const tableMeta = {
110
+ source: input.source,
111
+ baseUrl: input.baseUrl,
112
+ query: input.query,
113
+ createdAt,
114
+ expiresAt: expiresAtIso,
115
+ };
116
+ await ctx.state.set(tableMetaKey(tableName), tableMeta, { ttl });
117
+ ctx.log.debug('Canvas dataframe registered', {
118
+ tableName,
119
+ rowCount: registered.rowCount,
120
+ source: input.source,
121
+ });
122
+ const result = {
123
+ tableName,
124
+ rowCount: registered.rowCount,
125
+ columns: registered.columns,
126
+ createdAt,
127
+ expiresAt: expiresAtIso,
128
+ };
129
+ if (input.truncated)
130
+ result.truncated = true;
131
+ if (typeof input.maxRows === 'number')
132
+ result.maxRows = input.maxRows;
133
+ return result;
145
134
  }
146
135
  /**
147
136
  * Run a SQL query against the per-tenant default canvas. Caps `rowLimit` to
@@ -165,7 +154,7 @@ export class CanvasBridge {
165
154
  }
166
155
  /**
167
156
  * Register an explicitly-named table (used by the rare consumer that wants
168
- * to push rows directly without going through DatasetStore spillover).
157
+ * to push rows directly without going through the spillover path).
169
158
  */
170
159
  async registerTable(ctx, name, rows) {
171
160
  const instance = await this.getInstance(ctx);
@@ -175,13 +164,73 @@ export class CanvasBridge {
175
164
  async drop(ctx, name) {
176
165
  const instance = await this.getInstance(ctx);
177
166
  const dropped = await instance.drop(name);
178
- if (dropped)
167
+ if (dropped) {
179
168
  await ctx.state.delete(tableMetaKey(name));
169
+ await this.unlinkTrackedExports(ctx, name);
170
+ }
180
171
  return dropped;
181
172
  }
173
+ /**
174
+ * Export a canvas table to a path target. The framework resolves the
175
+ * relative path against `CANVAS_EXPORT_PATH` and rejects absolute /
176
+ * traversal inputs — the bridge only forwards.
177
+ *
178
+ * Tracking the resulting path under the *source* dataframe name (so a
179
+ * subsequent `drop(sourceName)` can unlink it) is the caller's job. The
180
+ * bridge can't infer "source name" when the export reads from a transient
181
+ * derived table (e.g. a projection materialized for one export call) —
182
+ * auto-tracking under whatever `tableName` was passed would unlink the
183
+ * file the moment the derived table is dropped. See
184
+ * `pairExportToSourceDataframe` in `brapi-dataframe-export.tool.ts`.
185
+ */
186
+ async export(ctx, tableName, target, options = {}) {
187
+ const instance = await this.getInstance(ctx);
188
+ const exportOpts = {};
189
+ if (options.signal !== undefined)
190
+ exportOpts.signal = options.signal;
191
+ return await instance.export(tableName, target, exportOpts);
192
+ }
193
+ /**
194
+ * Track an exported file path under a source dataframe name so that a
195
+ * later `drop(sourceName)` unlinks it. Persisted in `ctx.state` with the
196
+ * remaining TTL of the source dataframe; if the dataframe expires via
197
+ * TTL, the entry disappears and the file is reaped opportunistically by
198
+ * the export tool's mtime sweep.
199
+ */
200
+ async trackExport(ctx, sourceName, path) {
201
+ const key = exportPathsKey(sourceName);
202
+ const meta = await ctx.state.get(tableMetaKey(sourceName));
203
+ const remainingTtlSeconds = meta
204
+ ? Math.max(1, Math.floor((Date.parse(meta.expiresAt) - Date.now()) / 1000))
205
+ : this.serverConfig.datasetTtlSeconds;
206
+ const existing = (await ctx.state.get(key)) ?? [];
207
+ if (existing.includes(path))
208
+ return;
209
+ existing.push(path);
210
+ await ctx.state.set(key, existing, { ttl: remainingTtlSeconds });
211
+ }
212
+ async unlinkTrackedExports(ctx, tableName) {
213
+ const key = exportPathsKey(tableName);
214
+ const paths = await ctx.state.get(key);
215
+ if (!paths || paths.length === 0)
216
+ return;
217
+ await Promise.allSettled(paths.map(async (path) => {
218
+ try {
219
+ await unlink(path);
220
+ }
221
+ catch (err) {
222
+ ctx.log.debug('Paired export unlink failed (likely already removed)', {
223
+ tableName,
224
+ path,
225
+ error: err instanceof Error ? err.message : String(err),
226
+ });
227
+ }
228
+ }));
229
+ await ctx.state.delete(key);
230
+ }
182
231
  /**
183
232
  * Describe one or all canvas tables, augmenting the framework's `TableInfo`
184
- * with originating-dataset provenance for auto-registered tables.
233
+ * with originating-source provenance for auto-registered tables.
185
234
  */
186
235
  async describe(ctx, options = {}) {
187
236
  const instance = await this.getInstance(ctx);
@@ -203,41 +252,108 @@ export class CanvasBridge {
203
252
  };
204
253
  if (table.approxSizeBytes !== undefined)
205
254
  out.approxSizeBytes = table.approxSizeBytes;
206
- if (table.name.startsWith(DATASET_TABLE_PREFIX)) {
255
+ if (table.name.startsWith(DATAFRAME_TABLE_PREFIX)) {
207
256
  const meta = await ctx.state.get(tableMetaKey(table.name));
208
257
  if (meta)
209
258
  out.provenance = meta;
210
259
  }
211
260
  return out;
212
261
  }
213
- requireCanvas() {
214
- if (!this.canvas) {
215
- throw new Error('CanvasBridge.getInstance() called while canvas is disabled. Call isEnabled() first.');
216
- }
217
- return this.canvas;
218
- }
219
262
  }
220
263
  /**
221
- * Derive a SQL-safe table name from a DatasetStore dataset ID. UUIDs from
222
- * `crypto.randomUUID()` carry hyphens which fail the canvas identifier gate;
223
- * we replace them with underscores and prefix with `ds_` so the namespace is
224
- * unambiguous. Reversible — `tableNameToDatasetId(datasetTableName(id)) === id`.
264
+ * Generate a fresh canvas-safe dataframe name. Hyphens in `crypto.randomUUID()`
265
+ * fail the canvas identifier gate, so we replace them with underscores and
266
+ * prefix with `df_` to mark the namespace as auto-registered.
225
267
  */
226
- export function datasetTableName(datasetId) {
227
- return `${DATASET_TABLE_PREFIX}${datasetId.replace(/-/g, '_')}`;
228
- }
229
- /** Inverse of {@link datasetTableName}. Returns `undefined` for non-`ds_` names. */
230
- export function tableNameToDatasetId(tableName) {
231
- if (!tableName.startsWith(DATASET_TABLE_PREFIX))
232
- return;
233
- return tableName.slice(DATASET_TABLE_PREFIX.length).replace(/_/g, '-');
268
+ function generateDataframeName() {
269
+ return `${DATAFRAME_TABLE_PREFIX}${crypto.randomUUID().replace(/-/g, '_')}`;
234
270
  }
235
271
  function tableMetaKey(tableName) {
236
272
  return `${TABLE_META_PREFIX}${tableName}`;
237
273
  }
274
+ function exportPathsKey(tableName) {
275
+ return `${EXPORT_PATHS_PREFIX}${tableName}`;
276
+ }
238
277
  function isCanvasNotFound(err) {
239
278
  return err instanceof McpError && err.code === JsonRpcErrorCode.NotFound;
240
279
  }
280
+ /**
281
+ * Walk every row, union the JS-side types per column, and emit a
282
+ * `ColumnSchema[]` with `nullable: true` on every column. Mirrors the
283
+ * framework's sniffer type classification (string/integer/double/bigint/
284
+ * boolean/object) so the inferred DuckDB types stay identical, but never
285
+ * emits NOT NULL constraints — sample-based sniffing cannot prove the
286
+ * absence of nulls, and a wrong NOT NULL inference rolls back the entire
287
+ * appender batch when the first violating row appears later.
288
+ *
289
+ * Walks the full row set rather than a sample so that columns appearing
290
+ * only in late rows still show up in the schema. We already hold every
291
+ * row in memory at this point (the spillover persisted them), so the
292
+ * extra pass is cheap.
293
+ */
294
+ function deriveAllNullableSchema(rows) {
295
+ const observedByCol = new Map();
296
+ const columnOrder = [];
297
+ for (const row of rows) {
298
+ for (const key of Object.keys(row)) {
299
+ let bag = observedByCol.get(key);
300
+ if (!bag) {
301
+ bag = new Set();
302
+ observedByCol.set(key, bag);
303
+ columnOrder.push(key);
304
+ }
305
+ bag.add(classifyValue(row[key]));
306
+ }
307
+ }
308
+ return columnOrder.map((name) => ({
309
+ name,
310
+ type: unionToColumnType(observedByCol.get(name) ?? new Set(['null'])),
311
+ nullable: true,
312
+ }));
313
+ }
314
+ function classifyValue(value) {
315
+ if (value === null || value === undefined)
316
+ return 'null';
317
+ if (typeof value === 'string')
318
+ return 'string';
319
+ if (typeof value === 'boolean')
320
+ return 'boolean';
321
+ if (typeof value === 'bigint')
322
+ return 'bigint';
323
+ if (typeof value === 'number')
324
+ return Number.isInteger(value) ? 'integer' : 'double';
325
+ return 'object';
326
+ }
327
+ function unionToColumnType(observed) {
328
+ const nonNull = new Set(observed);
329
+ nonNull.delete('null');
330
+ if (nonNull.size === 0)
331
+ return 'VARCHAR';
332
+ if (nonNull.size === 1) {
333
+ const [only] = nonNull;
334
+ switch (only) {
335
+ case 'string':
336
+ return 'VARCHAR';
337
+ case 'integer':
338
+ case 'bigint':
339
+ return 'BIGINT';
340
+ case 'double':
341
+ return 'DOUBLE';
342
+ case 'boolean':
343
+ return 'BOOLEAN';
344
+ case 'object':
345
+ return 'JSON';
346
+ default:
347
+ return 'VARCHAR';
348
+ }
349
+ }
350
+ const allNumeric = [...nonNull].every((t) => t === 'integer' || t === 'double' || t === 'bigint');
351
+ if (allNumeric)
352
+ return nonNull.has('double') ? 'DOUBLE' : 'BIGINT';
353
+ if (!nonNull.has('string') && nonNull.has('object'))
354
+ return 'JSON';
355
+ return 'VARCHAR';
356
+ }
241
357
  /**
242
358
  * Compose the caller's AbortSignal with a wall-clock timeout. Returns the
243
359
  * caller's signal directly when no timeout is configured or the parent is
@@ -252,7 +368,7 @@ function composeSignal(parent, timeoutMs) {
252
368
  return parent;
253
369
  const controller = new AbortController();
254
370
  const timer = setTimeout(() => {
255
- controller.abort(new Error(`Canvas query timed out after ${timeoutMs}ms`));
371
+ controller.abort(new Error(`Dataframe query timed out after ${timeoutMs}ms`));
256
372
  }, timeoutMs);
257
373
  // Forward parent abort; `signal: controller.signal` auto-removes this
258
374
  // listener if the controller aborts first (timer fire), so it can't fire
@@ -266,8 +382,9 @@ function composeSignal(parent, timeoutMs) {
266
382
  }
267
383
  let _bridge;
268
384
  /**
269
- * Initialize the singleton bridge. Pass the framework canvas (which is
270
- * `undefined` when `CANVAS_PROVIDER_TYPE !== 'duckdb'` or on Workers).
385
+ * Initialize the singleton bridge. The framework canvas is mandatory — the
386
+ * caller is responsible for ensuring `core.canvas` is defined before this
387
+ * runs (`createApp` setup hook should fail closed when it isn't).
271
388
  */
272
389
  export function initCanvasBridge(canvas, serverConfig) {
273
390
  _bridge = new CanvasBridge(canvas, serverConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-bridge.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-bridge.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}