@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.
- package/CLAUDE.md +25 -19
- package/README.md +40 -26
- package/changelog/0.4.x/0.4.13.md +15 -0
- package/changelog/0.4.x/0.4.14.md +22 -0
- package/changelog/0.5.x/0.5.0.md +59 -0
- package/dist/config/builtin-aliases.d.ts +1 -1
- package/dist/config/builtin-aliases.js +1 -1
- package/dist/config/server-config.d.ts +3 -3
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +13 -13
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +62 -15
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +1 -1
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -1
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +3 -3
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +8 -11
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +15 -25
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +6 -10
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +6 -16
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts +69 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js +233 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +19 -11
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +80 -28
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +4 -6
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +28 -36
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +3 -5
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +21 -17
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +4 -6
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +16 -16
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +3 -5
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +15 -15
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +4 -6
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -17
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +4 -6
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +17 -17
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +2 -4
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +60 -19
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +3 -5
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +15 -15
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +6 -2
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +17 -2
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +51 -7
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +16 -2
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +51 -5
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +141 -165
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.js +28 -17
- package/dist/mcp-server/tools/definitions/index.js.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.d.ts +79 -39
- package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.js +167 -70
- package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
- package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/raw-routing-hints.js +6 -6
- package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.d.ts +69 -44
- package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.js +220 -103
- package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
- package/dist/services/canvas-bridge/index.d.ts +1 -1
- package/dist/services/canvas-bridge/index.d.ts.map +1 -1
- package/dist/services/canvas-bridge/index.js +1 -1
- package/dist/services/canvas-bridge/index.js.map +1 -1
- package/dist/services/canvas-bridge/types.d.ts +11 -12
- package/dist/services/canvas-bridge/types.d.ts.map +1 -1
- package/dist/services/canvas-bridge/types.js +4 -4
- package/package.json +3 -11
- package/server.json +3 -3
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +0 -13
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +0 -1
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +0 -26
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +0 -1
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +0 -89
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +0 -1
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +0 -306
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +0 -1
- package/dist/services/dataset-store/dataset-store.d.ts +0 -44
- package/dist/services/dataset-store/dataset-store.d.ts.map +0 -1
- package/dist/services/dataset-store/dataset-store.js +0 -208
- package/dist/services/dataset-store/dataset-store.js.map +0 -1
- package/dist/services/dataset-store/index.d.ts +0 -8
- package/dist/services/dataset-store/index.d.ts.map +0 -1
- package/dist/services/dataset-store/index.js +0 -7
- package/dist/services/dataset-store/index.js.map +0 -1
- package/dist/services/dataset-store/types.d.ts +0 -72
- package/dist/services/dataset-store/types.d.ts.map +0 -1
- package/dist/services/dataset-store/types.js +0 -8
- 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)
|
|
6
|
-
* SQL-safe table names
|
|
7
|
-
* originating-
|
|
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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
|
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
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
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
|
-
|
|
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
|
|
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-
|
|
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
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
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
|
|
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;
|
|
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)
|
|
6
|
-
* SQL-safe table names
|
|
7
|
-
* originating-
|
|
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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
-
/**
|
|
40
|
-
|
|
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
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
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-
|
|
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(
|
|
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
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
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
|
-
|
|
227
|
-
return `${
|
|
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(`
|
|
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.
|
|
270
|
-
*
|
|
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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"}
|