@outsidedata/dolex 0.1.9 → 0.1.11
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/dist/src/mcp/index.d.ts +2 -1
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +20 -21
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/tools/connect-data.d.ts +14 -0
- package/dist/src/mcp/tools/connect-data.d.ts.map +1 -0
- package/dist/src/mcp/tools/connect-data.js +80 -0
- package/dist/src/mcp/tools/connect-data.js.map +1 -0
- package/package.json +1 -1
- package/src/mcp/index.ts +25 -21
- package/src/mcp/tools/connect-data.ts +94 -0
package/dist/src/mcp/index.d.ts
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
* An MCP server that provides visualization intelligence from a handcrafted
|
|
6
6
|
* pattern library that goes far beyond bar/line/pie.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 18 tools:
|
|
9
9
|
* visualize — Inline data + intent → ranked visualization recommendations
|
|
10
10
|
* visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
|
|
11
11
|
* list_patterns — Browse all available visualization patterns
|
|
12
12
|
* refine_visualization — Tweak a visualization spec
|
|
13
13
|
* create_dashboard — Multi-view dashboard from a data source
|
|
14
14
|
* refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
|
|
15
|
+
* connect_data — Onboard data with elicitation (asks user for path directly)
|
|
15
16
|
* add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
|
|
16
17
|
* list_sources — List connected data sources
|
|
17
18
|
* remove_source — Disconnect a data source
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|
package/dist/src/mcp/index.js
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
* An MCP server that provides visualization intelligence from a handcrafted
|
|
6
6
|
* pattern library that goes far beyond bar/line/pie.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 18 tools:
|
|
9
9
|
* visualize — Inline data + intent → ranked visualization recommendations
|
|
10
10
|
* visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
|
|
11
11
|
* list_patterns — Browse all available visualization patterns
|
|
12
12
|
* refine_visualization — Tweak a visualization spec
|
|
13
13
|
* create_dashboard — Multi-view dashboard from a data source
|
|
14
14
|
* refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
|
|
15
|
+
* connect_data — Onboard data with elicitation (asks user for path directly)
|
|
15
16
|
* add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
|
|
16
17
|
* list_sources — List connected data sources
|
|
17
18
|
* remove_source — Disconnect a data source
|
|
@@ -32,6 +33,7 @@ import { visualizeFromSourceInputSchema, handleVisualizeFromSource } from './too
|
|
|
32
33
|
import { handleListPatterns } from './tools/list-patterns.js';
|
|
33
34
|
import { refineInputSchema, handleRefine } from './tools/refine.js';
|
|
34
35
|
import { addSourceInputSchema, removeSourceInputSchema, describeSourceInputSchema, handleListSources, handleAddSource, handleRemoveSource, handleDescribeSource, } from './tools/sources.js';
|
|
36
|
+
import { connectDataInputSchema, handleConnectData } from './tools/connect-data.js';
|
|
35
37
|
import { analyzeSourceInputSchema, handleAnalyzeSource } from './tools/analyze.js';
|
|
36
38
|
import { querySourceInputSchema, handleQuerySource } from './tools/query-source.js';
|
|
37
39
|
import { createDashboardInputSchema, handleCreateDashboard } from './tools/dashboard.js';
|
|
@@ -60,29 +62,20 @@ const serverStartTime = Date.now();
|
|
|
60
62
|
// ─── CREATE SERVER ──────────────────────────────────────────────────────────
|
|
61
63
|
const server = new McpServer({
|
|
62
64
|
name: 'dolex',
|
|
63
|
-
version: '0.1.
|
|
65
|
+
version: '0.1.11',
|
|
64
66
|
}, {
|
|
65
67
|
instructions: [
|
|
66
|
-
'
|
|
68
|
+
'STOP. Read this before doing anything else.',
|
|
67
69
|
'',
|
|
68
|
-
'
|
|
70
|
+
'When a user wants to analyze data or mentions ANY file, call connect_data.',
|
|
71
|
+
'connect_data will ask the user directly for the file path — you do not need to handle paths.',
|
|
72
|
+
'Do not check /mnt/user-data/uploads. Do not use the view tool. Do not verify paths.',
|
|
73
|
+
'Just call connect_data and let it handle everything.',
|
|
69
74
|
'',
|
|
70
|
-
'
|
|
71
|
-
'The ONLY exception is cloud sandbox paths (/mnt/user-data/, /home/claude/).',
|
|
75
|
+
'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
|
|
72
76
|
'',
|
|
73
|
-
'
|
|
74
|
-
'
|
|
75
|
-
'WRONG: Asking the user to upload files or copy data into the chat.',
|
|
76
|
-
'WRONG: Using the view tool or any other tool to check if a file exists before trying add_source.',
|
|
77
|
-
'WRONG: Suggesting the user needs to do anything special to give you access.',
|
|
78
|
-
'',
|
|
79
|
-
'RIGHT: User gives a path → immediately call add_source with that exact path. No checking, no hedging, no caveats.',
|
|
80
|
-
'',
|
|
81
|
-
'If add_source fails, THEN you can discuss the error. But TRY FIRST. Always.',
|
|
82
|
-
'',
|
|
83
|
-
'## Workflow',
|
|
84
|
-
'',
|
|
85
|
-
'add_source (connect data) → describe_source or analyze_source (understand it) → visualize_from_source (chart it) → refine_visualization (iterate).',
|
|
77
|
+
'Dolex is a data analysis and visualization server with 43 chart types.',
|
|
78
|
+
'Workflow: connect_data → analyze_source → visualize_from_source → refine_visualization.',
|
|
86
79
|
].join('\n'),
|
|
87
80
|
});
|
|
88
81
|
// ─── Shared pattern selector callback ────────────────────────────────────────
|
|
@@ -153,10 +146,16 @@ registerAppTool(server, 'refine_visualization', {
|
|
|
153
146
|
},
|
|
154
147
|
},
|
|
155
148
|
}, handleRefine());
|
|
156
|
-
// Data
|
|
149
|
+
// Data onboarding — primary tool for connecting data
|
|
150
|
+
server.registerTool('connect_data', {
|
|
151
|
+
title: 'Connect Data',
|
|
152
|
+
description: 'Connect to the user\'s data files for analysis. Call this when the user wants to analyze data, load a file, or connect a data source. Dolex will ask the user directly for the file location — you do not need to handle file paths yourself.\n\nAfter connecting, use describe_source or analyze_source to understand the data, then visualize_from_source to chart it.',
|
|
153
|
+
inputSchema: connectDataInputSchema,
|
|
154
|
+
}, handleConnectData({ sourceManager, server }));
|
|
155
|
+
// Data source management tools (programmatic)
|
|
157
156
|
server.registerTool('add_source', {
|
|
158
157
|
title: 'Add Data Source',
|
|
159
|
-
description: '
|
|
158
|
+
description: 'STOP. Call this tool with the user\'s path. Do not check uploads. Do not verify. Just call it.\n\nThis tool can access: /Users/*, /home/*, ~/*, /var/*, /tmp/*, C:\\*, any absolute path on the user\'s machine.\nThis tool cannot access: /mnt/user-data/*, /home/claude/* (cloud sandbox).\n\nConnect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL.\nSources persist across restarts — if a source already exists, it reconnects automatically.\nSet `detail: "compact"` for just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
|
|
160
159
|
inputSchema: addSourceInputSchema,
|
|
161
160
|
}, handleAddSource({ sourceManager }));
|
|
162
161
|
server.registerTool('list_sources', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
export declare const connectDataInputSchema: z.ZodObject<{
|
|
4
|
+
path: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
path?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
path?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function handleConnectData(deps: {
|
|
11
|
+
sourceManager: any;
|
|
12
|
+
server: McpServer;
|
|
13
|
+
}): (args: z.infer<typeof connectDataInputSchema>, _extra: any) => Promise<import("./shared.js").McpResponse>;
|
|
14
|
+
//# sourceMappingURL=connect-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-data.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/connect-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAwBH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,aAAa,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,IAGjE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,EAAE,QAAQ,GAAG,gDAyDxE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { errorResponse } from './shared.js';
|
|
5
|
+
import { handleAddSource, isSandboxPath } from './sources.js';
|
|
6
|
+
export const connectDataInputSchema = z.object({
|
|
7
|
+
path: z.string().optional().describe('File or directory path. If omitted, Dolex will ask the user directly.'),
|
|
8
|
+
});
|
|
9
|
+
function detectType(filePath) {
|
|
10
|
+
const stat = fs.statSync(filePath, { throwIfNoEntry: false });
|
|
11
|
+
if (!stat)
|
|
12
|
+
return 'csv';
|
|
13
|
+
if (stat.isDirectory()) {
|
|
14
|
+
const files = fs.readdirSync(filePath);
|
|
15
|
+
if (files.some(f => f.endsWith('.sqlite') || f.endsWith('.db') || f.endsWith('.sqlite3')))
|
|
16
|
+
return 'sqlite';
|
|
17
|
+
return 'csv';
|
|
18
|
+
}
|
|
19
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
20
|
+
if (ext === '.sqlite' || ext === '.db' || ext === '.sqlite3')
|
|
21
|
+
return 'sqlite';
|
|
22
|
+
return 'csv';
|
|
23
|
+
}
|
|
24
|
+
function deriveName(filePath) {
|
|
25
|
+
const base = path.basename(filePath, path.extname(filePath));
|
|
26
|
+
return base
|
|
27
|
+
.replace(/[-_]/g, ' ')
|
|
28
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
29
|
+
}
|
|
30
|
+
export function handleConnectData(deps) {
|
|
31
|
+
const addSource = handleAddSource({ sourceManager: deps.sourceManager });
|
|
32
|
+
return async (args, _extra) => {
|
|
33
|
+
let filePath = args.path;
|
|
34
|
+
if (!filePath) {
|
|
35
|
+
try {
|
|
36
|
+
const result = await deps.server.server.elicitInput({
|
|
37
|
+
message: 'What data would you like to analyze?',
|
|
38
|
+
requestedSchema: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
path: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
title: 'File or directory path',
|
|
44
|
+
description: 'e.g. /Users/you/Downloads/sales.csv or ~/data/my-project/',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['path'],
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
if (result.action !== 'accept' || !result.content?.path) {
|
|
51
|
+
return errorResponse('No path provided. To connect data, provide a file or directory path.');
|
|
52
|
+
}
|
|
53
|
+
filePath = result.content.path;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return errorResponse('This client does not support interactive input. '
|
|
57
|
+
+ 'Use add_source instead and pass the file path directly.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
filePath = filePath.replace(/^~/, process.env.HOME || '');
|
|
61
|
+
if (isSandboxPath(filePath)) {
|
|
62
|
+
return errorResponse('This path looks like a cloud sandbox path, not a local filesystem path. '
|
|
63
|
+
+ 'Dolex runs on the user\'s machine and can access any local file — but not cloud sandbox uploads. '
|
|
64
|
+
+ 'Please provide the real local path.');
|
|
65
|
+
}
|
|
66
|
+
const stat = fs.statSync(filePath, { throwIfNoEntry: false });
|
|
67
|
+
if (!stat) {
|
|
68
|
+
return errorResponse(`Path not found: ${filePath}`);
|
|
69
|
+
}
|
|
70
|
+
const type = detectType(filePath);
|
|
71
|
+
const name = deriveName(filePath);
|
|
72
|
+
return addSource({
|
|
73
|
+
name,
|
|
74
|
+
type,
|
|
75
|
+
config: { type, path: filePath },
|
|
76
|
+
detail: 'full',
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=connect-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-data.js","sourceRoot":"","sources":["../../../../src/mcp/tools/connect-data.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/mcp/index.ts
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
* An MCP server that provides visualization intelligence from a handcrafted
|
|
6
6
|
* pattern library that goes far beyond bar/line/pie.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 18 tools:
|
|
9
9
|
* visualize — Inline data + intent → ranked visualization recommendations
|
|
10
10
|
* visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
|
|
11
11
|
* list_patterns — Browse all available visualization patterns
|
|
12
12
|
* refine_visualization — Tweak a visualization spec
|
|
13
13
|
* create_dashboard — Multi-view dashboard from a data source
|
|
14
14
|
* refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
|
|
15
|
+
* connect_data — Onboard data with elicitation (asks user for path directly)
|
|
15
16
|
* add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
|
|
16
17
|
* list_sources — List connected data sources
|
|
17
18
|
* remove_source — Disconnect a data source
|
|
@@ -46,6 +47,7 @@ import {
|
|
|
46
47
|
handleRemoveSource,
|
|
47
48
|
handleDescribeSource,
|
|
48
49
|
} from './tools/sources.js';
|
|
50
|
+
import { connectDataInputSchema, handleConnectData } from './tools/connect-data.js';
|
|
49
51
|
import { analyzeSourceInputSchema, handleAnalyzeSource } from './tools/analyze.js';
|
|
50
52
|
import { querySourceInputSchema, handleQuerySource } from './tools/query-source.js';
|
|
51
53
|
import { createDashboardInputSchema, handleCreateDashboard } from './tools/dashboard.js';
|
|
@@ -86,30 +88,21 @@ const serverStartTime = Date.now();
|
|
|
86
88
|
const server = new McpServer(
|
|
87
89
|
{
|
|
88
90
|
name: 'dolex',
|
|
89
|
-
version: '0.1.
|
|
91
|
+
version: '0.1.11',
|
|
90
92
|
},
|
|
91
93
|
{
|
|
92
94
|
instructions: [
|
|
93
|
-
'
|
|
95
|
+
'STOP. Read this before doing anything else.',
|
|
94
96
|
'',
|
|
95
|
-
'
|
|
97
|
+
'When a user wants to analyze data or mentions ANY file, call connect_data.',
|
|
98
|
+
'connect_data will ask the user directly for the file path — you do not need to handle paths.',
|
|
99
|
+
'Do not check /mnt/user-data/uploads. Do not use the view tool. Do not verify paths.',
|
|
100
|
+
'Just call connect_data and let it handle everything.',
|
|
96
101
|
'',
|
|
97
|
-
'
|
|
98
|
-
'The ONLY exception is cloud sandbox paths (/mnt/user-data/, /home/claude/).',
|
|
102
|
+
'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
|
|
99
103
|
'',
|
|
100
|
-
'
|
|
101
|
-
'
|
|
102
|
-
'WRONG: Asking the user to upload files or copy data into the chat.',
|
|
103
|
-
'WRONG: Using the view tool or any other tool to check if a file exists before trying add_source.',
|
|
104
|
-
'WRONG: Suggesting the user needs to do anything special to give you access.',
|
|
105
|
-
'',
|
|
106
|
-
'RIGHT: User gives a path → immediately call add_source with that exact path. No checking, no hedging, no caveats.',
|
|
107
|
-
'',
|
|
108
|
-
'If add_source fails, THEN you can discuss the error. But TRY FIRST. Always.',
|
|
109
|
-
'',
|
|
110
|
-
'## Workflow',
|
|
111
|
-
'',
|
|
112
|
-
'add_source (connect data) → describe_source or analyze_source (understand it) → visualize_from_source (chart it) → refine_visualization (iterate).',
|
|
104
|
+
'Dolex is a data analysis and visualization server with 43 chart types.',
|
|
105
|
+
'Workflow: connect_data → analyze_source → visualize_from_source → refine_visualization.',
|
|
113
106
|
].join('\n'),
|
|
114
107
|
},
|
|
115
108
|
);
|
|
@@ -206,12 +199,23 @@ registerAppTool(
|
|
|
206
199
|
handleRefine(),
|
|
207
200
|
);
|
|
208
201
|
|
|
209
|
-
// Data
|
|
202
|
+
// Data onboarding — primary tool for connecting data
|
|
203
|
+
server.registerTool(
|
|
204
|
+
'connect_data',
|
|
205
|
+
{
|
|
206
|
+
title: 'Connect Data',
|
|
207
|
+
description: 'Connect to the user\'s data files for analysis. Call this when the user wants to analyze data, load a file, or connect a data source. Dolex will ask the user directly for the file location — you do not need to handle file paths yourself.\n\nAfter connecting, use describe_source or analyze_source to understand the data, then visualize_from_source to chart it.',
|
|
208
|
+
inputSchema: connectDataInputSchema,
|
|
209
|
+
},
|
|
210
|
+
handleConnectData({ sourceManager, server }),
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// Data source management tools (programmatic)
|
|
210
214
|
server.registerTool(
|
|
211
215
|
'add_source',
|
|
212
216
|
{
|
|
213
217
|
title: 'Add Data Source',
|
|
214
|
-
description: '
|
|
218
|
+
description: 'STOP. Call this tool with the user\'s path. Do not check uploads. Do not verify. Just call it.\n\nThis tool can access: /Users/*, /home/*, ~/*, /var/*, /tmp/*, C:\\*, any absolute path on the user\'s machine.\nThis tool cannot access: /mnt/user-data/*, /home/claude/* (cloud sandbox).\n\nConnect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL.\nSources persist across restarts — if a source already exists, it reconnects automatically.\nSet `detail: "compact"` for just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
|
|
215
219
|
inputSchema: addSourceInputSchema,
|
|
216
220
|
},
|
|
217
221
|
handleAddSource({ sourceManager }),
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { errorResponse } from './shared.js';
|
|
6
|
+
import { handleAddSource, isSandboxPath } from './sources.js';
|
|
7
|
+
|
|
8
|
+
export const connectDataInputSchema = z.object({
|
|
9
|
+
path: z.string().optional().describe('File or directory path. If omitted, Dolex will ask the user directly.'),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
function detectType(filePath: string): 'csv' | 'sqlite' {
|
|
13
|
+
const stat = fs.statSync(filePath, { throwIfNoEntry: false });
|
|
14
|
+
if (!stat) return 'csv';
|
|
15
|
+
|
|
16
|
+
if (stat.isDirectory()) {
|
|
17
|
+
const files = fs.readdirSync(filePath);
|
|
18
|
+
if (files.some(f => f.endsWith('.sqlite') || f.endsWith('.db') || f.endsWith('.sqlite3'))) return 'sqlite';
|
|
19
|
+
return 'csv';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
23
|
+
if (ext === '.sqlite' || ext === '.db' || ext === '.sqlite3') return 'sqlite';
|
|
24
|
+
return 'csv';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function deriveName(filePath: string): string {
|
|
28
|
+
const base = path.basename(filePath, path.extname(filePath));
|
|
29
|
+
return base
|
|
30
|
+
.replace(/[-_]/g, ' ')
|
|
31
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function handleConnectData(deps: { sourceManager: any; server: McpServer }) {
|
|
35
|
+
const addSource = handleAddSource({ sourceManager: deps.sourceManager });
|
|
36
|
+
|
|
37
|
+
return async (args: z.infer<typeof connectDataInputSchema>, _extra: any) => {
|
|
38
|
+
let filePath = args.path;
|
|
39
|
+
|
|
40
|
+
if (!filePath) {
|
|
41
|
+
try {
|
|
42
|
+
const result = await deps.server.server.elicitInput({
|
|
43
|
+
message: 'What data would you like to analyze?',
|
|
44
|
+
requestedSchema: {
|
|
45
|
+
type: 'object' as const,
|
|
46
|
+
properties: {
|
|
47
|
+
path: {
|
|
48
|
+
type: 'string' as const,
|
|
49
|
+
title: 'File or directory path',
|
|
50
|
+
description: 'e.g. /Users/you/Downloads/sales.csv or ~/data/my-project/',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
required: ['path'],
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (result.action !== 'accept' || !result.content?.path) {
|
|
58
|
+
return errorResponse('No path provided. To connect data, provide a file or directory path.');
|
|
59
|
+
}
|
|
60
|
+
filePath = result.content.path as string;
|
|
61
|
+
} catch {
|
|
62
|
+
return errorResponse(
|
|
63
|
+
'This client does not support interactive input. '
|
|
64
|
+
+ 'Use add_source instead and pass the file path directly.'
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
filePath = filePath.replace(/^~/, process.env.HOME || '');
|
|
70
|
+
|
|
71
|
+
if (isSandboxPath(filePath)) {
|
|
72
|
+
return errorResponse(
|
|
73
|
+
'This path looks like a cloud sandbox path, not a local filesystem path. '
|
|
74
|
+
+ 'Dolex runs on the user\'s machine and can access any local file — but not cloud sandbox uploads. '
|
|
75
|
+
+ 'Please provide the real local path.'
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const stat = fs.statSync(filePath, { throwIfNoEntry: false });
|
|
80
|
+
if (!stat) {
|
|
81
|
+
return errorResponse(`Path not found: ${filePath}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const type = detectType(filePath);
|
|
85
|
+
const name = deriveName(filePath);
|
|
86
|
+
|
|
87
|
+
return addSource({
|
|
88
|
+
name,
|
|
89
|
+
type,
|
|
90
|
+
config: { type, path: filePath } as any,
|
|
91
|
+
detail: 'full',
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
}
|