neural-loom 0.2.48 → 0.2.49
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -0
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
- package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/context/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/recents/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/connections/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/connections/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/connections/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/connections/route.js +6 -0
- package/.next/server/app/api/sql/connections/route.js.map +5 -0
- package/.next/server/app/api/sql/connections/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/connections/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/mcp/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/mcp/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/mcp/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/mcp/route.js +6 -0
- package/.next/server/app/api/sql/mcp/route.js.map +5 -0
- package/.next/server/app/api/sql/mcp/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/mcp/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/query/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/query/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/query/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/query/route.js +6 -0
- package/.next/server/app/api/sql/query/route.js.map +5 -0
- package/.next/server/app/api/sql/query/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/query/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/schema/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/schema/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/schema/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/schema/route.js +6 -0
- package/.next/server/app/api/sql/schema/route.js.map +5 -0
- package/.next/server/app/api/sql/schema/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/schema/route_client-reference-manifest.js +3 -0
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page/react-loadable-manifest.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -0
- package/.next/server/chunks/[root-of-the-server]__0.ptwor._.js +86 -0
- package/.next/server/chunks/[root-of-the-server]__0.ptwor._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__00l5btc._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__00l5btc._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__06men8g._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__06men8g._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0_o7_jj._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0_o7_jj._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0co.g5k._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__0co.g5k._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_connections_route_actions_11cib8~.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_connections_route_actions_11cib8~.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_mcp_route_actions_0wihfps.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_mcp_route_actions_0wihfps.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_query_route_actions_11x3q3c.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_query_route_actions_11x3q3c.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_schema_route_actions_015okwb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_schema_route_actions_015okwb.js.map +1 -0
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/03f4bqk_d65hs.js +6 -0
- package/.next/static/chunks/{15zf~gqr_i8s1.js → 0~6gm~u8rgtpd.js} +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/bin/cli.js +76 -0
- package/package.json +2 -2
- package/src/app/api/sql/connections/route.ts +60 -0
- package/src/app/api/sql/mcp/route.ts +27 -0
- package/src/app/api/sql/query/route.ts +56 -0
- package/src/app/api/sql/schema/route.ts +42 -0
- package/src/app/components/DbExplorer.tsx +1279 -0
- package/src/app/components/IdeLayout.tsx +27 -1
- package/src/lib/sql/ConnectionManager.ts +207 -0
- package/src/lib/sql/DbAdapter.ts +62 -0
- package/src/lib/sql/McpServer.ts +278 -0
- package/src/lib/sql/adapters/MysqlAdapter.ts +120 -0
- package/src/lib/sql/adapters/PostgresAdapter.ts +139 -0
- package/src/lib/sql/adapters/SqliteAdapter.ts +111 -0
- package/.next/static/chunks/0bclk7hf35ac4.js +0 -1
- /package/.next/static/{V3HKuGO63wx4G9xwdUktP → BoncS4SNz6CDpSdR8oY-K}/_buildManifest.js +0 -0
- /package/.next/static/{V3HKuGO63wx4G9xwdUktP → BoncS4SNz6CDpSdR8oY-K}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{V3HKuGO63wx4G9xwdUktP → BoncS4SNz6CDpSdR8oY-K}/_ssgManifest.js +0 -0
package/bin/cli.js
CHANGED
|
@@ -4,6 +4,82 @@
|
|
|
4
4
|
const { spawn } = require('child_process');
|
|
5
5
|
const path = require('path');
|
|
6
6
|
|
|
7
|
+
if (process.argv[2] === 'mcp') {
|
|
8
|
+
const readline = require('readline');
|
|
9
|
+
const http = require('http');
|
|
10
|
+
|
|
11
|
+
let wsRoot = process.argv[3] || process.env.ORIGINAL_CWD || process.cwd();
|
|
12
|
+
wsRoot = path.resolve(wsRoot).replace(/\\/g, '/');
|
|
13
|
+
|
|
14
|
+
console.error(`[NeuralLoom MCP Bridge] Workspace context: ${wsRoot}`);
|
|
15
|
+
console.error(`[NeuralLoom MCP Bridge] Connecting to Next.js server on http://localhost:3000...`);
|
|
16
|
+
|
|
17
|
+
const rl = readline.createInterface({
|
|
18
|
+
input: process.stdin,
|
|
19
|
+
output: process.stdout,
|
|
20
|
+
terminal: false
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
rl.on('line', (line) => {
|
|
24
|
+
if (!line.trim()) return;
|
|
25
|
+
|
|
26
|
+
let requestObj;
|
|
27
|
+
try {
|
|
28
|
+
requestObj = JSON.parse(line);
|
|
29
|
+
} catch (e) {
|
|
30
|
+
const errResponse = {
|
|
31
|
+
jsonrpc: "2.0",
|
|
32
|
+
id: null,
|
|
33
|
+
error: { code: -32700, message: "Parse error" }
|
|
34
|
+
};
|
|
35
|
+
process.stdout.write(JSON.stringify(errResponse) + "\n");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const payload = JSON.stringify(requestObj);
|
|
40
|
+
const options = {
|
|
41
|
+
hostname: 'localhost',
|
|
42
|
+
port: 3000,
|
|
43
|
+
path: '/api/sql/mcp',
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
'Content-Length': Buffer.byteLength(payload),
|
|
48
|
+
'x-workspace-root': wsRoot
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const req = http.request(options, (res) => {
|
|
53
|
+
let data = '';
|
|
54
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
55
|
+
res.on('end', () => {
|
|
56
|
+
if (res.statusCode === 204) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
process.stdout.write(data + "\n");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
req.on('error', (err) => {
|
|
64
|
+
console.error(`[NeuralLoom MCP Bridge ERROR] Failed to connect to local server: ${err.message}`);
|
|
65
|
+
const errResponse = {
|
|
66
|
+
jsonrpc: "2.0",
|
|
67
|
+
id: requestObj.id || null,
|
|
68
|
+
error: {
|
|
69
|
+
code: -32603,
|
|
70
|
+
message: "NeuralLoom backend server is offline. Please launch the dashboard first using 'npm run dev' or 'neural-loom'."
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
process.stdout.write(JSON.stringify(errResponse) + "\n");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
req.write(payload);
|
|
77
|
+
req.end();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
7
83
|
const originalCwd = process.cwd();
|
|
8
84
|
const fs = require('fs');
|
|
9
85
|
const os = require('os');
|
package/package.json
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { ConnectionManager } from "@/lib/sql/ConnectionManager";
|
|
3
|
+
|
|
4
|
+
export async function GET(request: Request) {
|
|
5
|
+
try {
|
|
6
|
+
const { searchParams } = new URL(request.url);
|
|
7
|
+
const root = searchParams.get("root") || undefined;
|
|
8
|
+
const data = await ConnectionManager.getProfiles(root);
|
|
9
|
+
return NextResponse.json({ success: true, ...data });
|
|
10
|
+
} catch (error: any) {
|
|
11
|
+
return NextResponse.json({ error: error.message || String(error) }, { status: 500 });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function POST(request: Request) {
|
|
16
|
+
try {
|
|
17
|
+
const body = await request.json();
|
|
18
|
+
const { action, profile, isGlobal, root, profileId } = body;
|
|
19
|
+
|
|
20
|
+
if (action === "save") {
|
|
21
|
+
if (!profile || !profile.id || !profile.name || !profile.type) {
|
|
22
|
+
return NextResponse.json({ error: "Missing required profile parameters" }, { status: 400 });
|
|
23
|
+
}
|
|
24
|
+
await ConnectionManager.saveProfile(profile, !!isGlobal, root);
|
|
25
|
+
return NextResponse.json({ success: true, message: "Profile saved successfully" });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (action === "delete") {
|
|
29
|
+
if (!profileId) {
|
|
30
|
+
return NextResponse.json({ error: "Missing required parameter 'profileId'" }, { status: 400 });
|
|
31
|
+
}
|
|
32
|
+
await ConnectionManager.deleteProfile(profileId, !!isGlobal, root);
|
|
33
|
+
return NextResponse.json({ success: true, message: "Profile deleted successfully" });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (action === "set_active") {
|
|
37
|
+
await ConnectionManager.setActiveProfile(profileId || null, !!isGlobal, root);
|
|
38
|
+
return NextResponse.json({ success: true, message: "Active profile updated successfully" });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (action === "test") {
|
|
42
|
+
if (!profile) {
|
|
43
|
+
return NextResponse.json({ error: "Missing required parameter 'profile'" }, { status: 400 });
|
|
44
|
+
}
|
|
45
|
+
const adapter = ConnectionManager.createAdapter(profile, root);
|
|
46
|
+
try {
|
|
47
|
+
await adapter.connect();
|
|
48
|
+
await adapter.listTables(); // Quick verify
|
|
49
|
+
await adapter.disconnect();
|
|
50
|
+
return NextResponse.json({ success: true, message: "Connection test successful!" });
|
|
51
|
+
} catch (err: any) {
|
|
52
|
+
return NextResponse.json({ success: false, error: err.message || String(err) });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return NextResponse.json({ error: "Invalid action" }, { status: 400 });
|
|
57
|
+
} catch (error: any) {
|
|
58
|
+
return NextResponse.json({ error: error.message || String(error) }, { status: 500 });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { McpServer } from "@/lib/sql/McpServer";
|
|
3
|
+
|
|
4
|
+
export async function POST(request: Request) {
|
|
5
|
+
try {
|
|
6
|
+
const workspaceRoot = request.headers.get("x-workspace-root") || undefined;
|
|
7
|
+
const body = await request.json();
|
|
8
|
+
|
|
9
|
+
const mcpServer = new McpServer(workspaceRoot);
|
|
10
|
+
const response = await mcpServer.handleMessage(body);
|
|
11
|
+
|
|
12
|
+
if (response === null) {
|
|
13
|
+
return new Response("", { status: 204 });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return NextResponse.json(response);
|
|
17
|
+
} catch (error: any) {
|
|
18
|
+
return NextResponse.json({
|
|
19
|
+
jsonrpc: "2.0",
|
|
20
|
+
id: null,
|
|
21
|
+
error: {
|
|
22
|
+
code: -32603,
|
|
23
|
+
message: "Internal server error: " + (error.message || String(error))
|
|
24
|
+
}
|
|
25
|
+
}, { status: 500 });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { ConnectionManager } from "@/lib/sql/ConnectionManager";
|
|
3
|
+
|
|
4
|
+
const isMutation = (sql: string): boolean => {
|
|
5
|
+
const clean = sql.trim().toLowerCase();
|
|
6
|
+
return (
|
|
7
|
+
clean.startsWith("insert") ||
|
|
8
|
+
clean.startsWith("update") ||
|
|
9
|
+
clean.startsWith("delete") ||
|
|
10
|
+
clean.startsWith("drop") ||
|
|
11
|
+
clean.startsWith("alter") ||
|
|
12
|
+
clean.startsWith("create") ||
|
|
13
|
+
clean.startsWith("truncate") ||
|
|
14
|
+
clean.startsWith("replace")
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export async function POST(request: Request) {
|
|
19
|
+
try {
|
|
20
|
+
const body = await request.json();
|
|
21
|
+
const { sql, root } = body;
|
|
22
|
+
|
|
23
|
+
if (!sql || !sql.trim()) {
|
|
24
|
+
return NextResponse.json({ error: "Missing parameter 'sql'" }, { status: 400 });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const active = await ConnectionManager.getActiveAdapter(root);
|
|
28
|
+
if (!active) {
|
|
29
|
+
return NextResponse.json({
|
|
30
|
+
error: "No active database connection configured. Please set up and select an active profile in the database panel."
|
|
31
|
+
}, { status: 400 });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const { adapter, profile } = active;
|
|
35
|
+
|
|
36
|
+
if (profile.readOnly && isMutation(sql)) {
|
|
37
|
+
return NextResponse.json({
|
|
38
|
+
error: "This connection profile is configured as Read-Only. Modifications are disabled."
|
|
39
|
+
}, { status: 403 });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
const result = await adapter.query(sql);
|
|
44
|
+
const durationMs = Date.now() - startTime;
|
|
45
|
+
|
|
46
|
+
return NextResponse.json({
|
|
47
|
+
success: true,
|
|
48
|
+
rows: result.rows,
|
|
49
|
+
fields: result.fields,
|
|
50
|
+
affectedRows: result.affectedRows,
|
|
51
|
+
durationMs
|
|
52
|
+
});
|
|
53
|
+
} catch (error: any) {
|
|
54
|
+
return NextResponse.json({ error: error.message || String(error) }, { status: 500 });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { ConnectionManager } from "@/lib/sql/ConnectionManager";
|
|
3
|
+
|
|
4
|
+
export async function GET(request: Request) {
|
|
5
|
+
try {
|
|
6
|
+
const { searchParams } = new URL(request.url);
|
|
7
|
+
const root = searchParams.get("root") || undefined;
|
|
8
|
+
const action = searchParams.get("action");
|
|
9
|
+
|
|
10
|
+
const active = await ConnectionManager.getActiveAdapter(root);
|
|
11
|
+
if (!active) {
|
|
12
|
+
return NextResponse.json({
|
|
13
|
+
error: "No active database connection configured."
|
|
14
|
+
}, { status: 400 });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { adapter } = active;
|
|
18
|
+
|
|
19
|
+
if (action === "list_tables") {
|
|
20
|
+
const tables = await adapter.listTables();
|
|
21
|
+
return NextResponse.json({ success: true, tables });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (action === "describe_table") {
|
|
25
|
+
const table = searchParams.get("table");
|
|
26
|
+
if (!table) {
|
|
27
|
+
return NextResponse.json({ error: "Missing required parameter 'table'" }, { status: 400 });
|
|
28
|
+
}
|
|
29
|
+
const columns = await adapter.describeTable(table);
|
|
30
|
+
return NextResponse.json({ success: true, columns });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (action === "summary") {
|
|
34
|
+
const summary = await adapter.getSchemaSummary();
|
|
35
|
+
return NextResponse.json({ success: true, summary });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return NextResponse.json({ error: "Invalid action. Must be 'list_tables', 'describe_table', or 'summary'" }, { status: 400 });
|
|
39
|
+
} catch (error: any) {
|
|
40
|
+
return NextResponse.json({ error: error.message || String(error) }, { status: 500 });
|
|
41
|
+
}
|
|
42
|
+
}
|