@outsidedata/dolex 0.1.10 → 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 +17 -12
- 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 +22 -12
- 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,23 +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
|
-
'When a user
|
|
69
|
-
'
|
|
70
|
-
'
|
|
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.',
|
|
71
74
|
'',
|
|
72
|
-
'
|
|
73
|
-
'add_source CANNOT access: /mnt/user-data/*, /home/claude/* (cloud sandbox only).',
|
|
74
|
-
'',
|
|
75
|
-
'If user says "analyze /Users/bill/data/sales.csv" → call add_source with path=/Users/bill/data/sales.csv. Done.',
|
|
76
|
-
'If add_source returns an error, THEN discuss it. Never pre-emptively refuse.',
|
|
75
|
+
'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
|
|
77
76
|
'',
|
|
78
77
|
'Dolex is a data analysis and visualization server with 43 chart types.',
|
|
79
|
-
'Workflow:
|
|
78
|
+
'Workflow: connect_data → analyze_source → visualize_from_source → refine_visualization.',
|
|
80
79
|
].join('\n'),
|
|
81
80
|
});
|
|
82
81
|
// ─── Shared pattern selector callback ────────────────────────────────────────
|
|
@@ -147,7 +146,13 @@ registerAppTool(server, 'refine_visualization', {
|
|
|
147
146
|
},
|
|
148
147
|
},
|
|
149
148
|
}, handleRefine());
|
|
150
|
-
// 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)
|
|
151
156
|
server.registerTool('add_source', {
|
|
152
157
|
title: 'Add Data Source',
|
|
153
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.',
|
|
@@ -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,24 +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
|
-
'When a user
|
|
96
|
-
'
|
|
97
|
-
'
|
|
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.',
|
|
98
101
|
'',
|
|
99
|
-
'
|
|
100
|
-
'add_source CANNOT access: /mnt/user-data/*, /home/claude/* (cloud sandbox only).',
|
|
101
|
-
'',
|
|
102
|
-
'If user says "analyze /Users/bill/data/sales.csv" → call add_source with path=/Users/bill/data/sales.csv. Done.',
|
|
103
|
-
'If add_source returns an error, THEN discuss it. Never pre-emptively refuse.',
|
|
102
|
+
'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
|
|
104
103
|
'',
|
|
105
104
|
'Dolex is a data analysis and visualization server with 43 chart types.',
|
|
106
|
-
'Workflow:
|
|
105
|
+
'Workflow: connect_data → analyze_source → visualize_from_source → refine_visualization.',
|
|
107
106
|
].join('\n'),
|
|
108
107
|
},
|
|
109
108
|
);
|
|
@@ -200,7 +199,18 @@ registerAppTool(
|
|
|
200
199
|
handleRefine(),
|
|
201
200
|
);
|
|
202
201
|
|
|
203
|
-
// 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)
|
|
204
214
|
server.registerTool(
|
|
205
215
|
'add_source',
|
|
206
216
|
{
|
|
@@ -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
|
+
}
|