@bytebase/dbhub 0.11.8 → 0.11.9
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/{demo-loader-EOVFD32T.js → demo-loader-PSMTLZ2T.js} +3 -3
- package/dist/index.js +78 -52
- package/dist/public/assets/{index-Cd_LdWco.js → index-BZTaHJm6.js} +11 -11
- package/dist/public/assets/postgres-BpcazhJg.svg +22 -0
- package/dist/public/assets/sqlserver-ByfFYYpV.svg +11 -0
- package/dist/public/index.html +1 -1
- package/package.json +1 -1
- package/dist/resources/employee-sqlite/object.sql +0 -74
- package/dist/resources/employee-sqlite/show_elapsed.sql +0 -4
- package/dist/resources/employee-sqlite/test_employee_md5.sql +0 -119
- /package/dist/{resources → demo}/employee-sqlite/employee.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_department.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_dept_emp.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_dept_manager.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_employee.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_salary1.sql +0 -0
- /package/dist/{resources → demo}/employee-sqlite/load_title.sql +0 -0
|
@@ -6,14 +6,14 @@ var __filename = fileURLToPath(import.meta.url);
|
|
|
6
6
|
var __dirname = path.dirname(__filename);
|
|
7
7
|
var DEMO_DATA_DIR;
|
|
8
8
|
var projectRootPath = path.join(__dirname, "..", "..", "..");
|
|
9
|
-
var projectResourcesPath = path.join(projectRootPath, "
|
|
10
|
-
var distPath = path.join(__dirname, "
|
|
9
|
+
var projectResourcesPath = path.join(projectRootPath, "demo", "employee-sqlite");
|
|
10
|
+
var distPath = path.join(__dirname, "demo", "employee-sqlite");
|
|
11
11
|
if (fs.existsSync(projectResourcesPath)) {
|
|
12
12
|
DEMO_DATA_DIR = projectResourcesPath;
|
|
13
13
|
} else if (fs.existsSync(distPath)) {
|
|
14
14
|
DEMO_DATA_DIR = distPath;
|
|
15
15
|
} else {
|
|
16
|
-
DEMO_DATA_DIR = path.join(process.cwd(), "
|
|
16
|
+
DEMO_DATA_DIR = path.join(process.cwd(), "demo", "employee-sqlite");
|
|
17
17
|
if (!fs.existsSync(DEMO_DATA_DIR)) {
|
|
18
18
|
throw new Error(`Could not find employee-sqlite resources in any of the expected locations:
|
|
19
19
|
- ${projectResourcesPath}
|
package/dist/index.js
CHANGED
|
@@ -2626,9 +2626,11 @@ function resolveSSHConfig() {
|
|
|
2626
2626
|
};
|
|
2627
2627
|
}
|
|
2628
2628
|
async function resolveSourceConfigs() {
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2629
|
+
if (!isDemoMode()) {
|
|
2630
|
+
const tomlConfig = loadTomlConfig();
|
|
2631
|
+
if (tomlConfig) {
|
|
2632
|
+
return tomlConfig;
|
|
2633
|
+
}
|
|
2632
2634
|
}
|
|
2633
2635
|
const dsnResult = resolveDSN();
|
|
2634
2636
|
if (dsnResult) {
|
|
@@ -2675,7 +2677,7 @@ async function resolveSourceConfigs() {
|
|
|
2675
2677
|
source.max_rows = maxRowsResult.maxRows;
|
|
2676
2678
|
}
|
|
2677
2679
|
if (dsnResult.isDemo) {
|
|
2678
|
-
const { getSqliteInMemorySetupSql } = await import("./demo-loader-
|
|
2680
|
+
const { getSqliteInMemorySetupSql } = await import("./demo-loader-PSMTLZ2T.js");
|
|
2679
2681
|
source.init_script = getSqliteInMemorySetupSql();
|
|
2680
2682
|
}
|
|
2681
2683
|
return {
|
|
@@ -3437,15 +3439,31 @@ async function procedureDetailResourceHandler(uri, variables, _extra) {
|
|
|
3437
3439
|
|
|
3438
3440
|
// src/resources/index.ts
|
|
3439
3441
|
function registerResources(server) {
|
|
3440
|
-
server.resource(
|
|
3442
|
+
server.resource(
|
|
3443
|
+
"schemas",
|
|
3444
|
+
"db://schemas",
|
|
3445
|
+
{
|
|
3446
|
+
description: "List all schemas/databases available in the connected database",
|
|
3447
|
+
mimeType: "application/json"
|
|
3448
|
+
},
|
|
3449
|
+
schemasResourceHandler
|
|
3450
|
+
);
|
|
3441
3451
|
server.resource(
|
|
3442
3452
|
"tables_in_schema",
|
|
3443
3453
|
new ResourceTemplate("db://schemas/{schemaName}/tables", { list: void 0 }),
|
|
3454
|
+
{
|
|
3455
|
+
description: "List all tables within a specific schema",
|
|
3456
|
+
mimeType: "application/json"
|
|
3457
|
+
},
|
|
3444
3458
|
tablesResourceHandler
|
|
3445
3459
|
);
|
|
3446
3460
|
server.resource(
|
|
3447
3461
|
"table_structure_in_schema",
|
|
3448
3462
|
new ResourceTemplate("db://schemas/{schemaName}/tables/{tableName}", { list: void 0 }),
|
|
3463
|
+
{
|
|
3464
|
+
description: "Get detailed structure information for a specific table, including columns, data types, and constraints",
|
|
3465
|
+
mimeType: "application/json"
|
|
3466
|
+
},
|
|
3449
3467
|
tableStructureResourceHandler
|
|
3450
3468
|
);
|
|
3451
3469
|
server.resource(
|
|
@@ -3453,11 +3471,19 @@ function registerResources(server) {
|
|
|
3453
3471
|
new ResourceTemplate("db://schemas/{schemaName}/tables/{tableName}/indexes", {
|
|
3454
3472
|
list: void 0
|
|
3455
3473
|
}),
|
|
3474
|
+
{
|
|
3475
|
+
description: "List all indexes defined on a specific table",
|
|
3476
|
+
mimeType: "application/json"
|
|
3477
|
+
},
|
|
3456
3478
|
indexesResourceHandler
|
|
3457
3479
|
);
|
|
3458
3480
|
server.resource(
|
|
3459
3481
|
"procedures_in_schema",
|
|
3460
3482
|
new ResourceTemplate("db://schemas/{schemaName}/procedures", { list: void 0 }),
|
|
3483
|
+
{
|
|
3484
|
+
description: "List all stored procedures/functions in a schema (not supported by SQLite)",
|
|
3485
|
+
mimeType: "application/json"
|
|
3486
|
+
},
|
|
3461
3487
|
proceduresResourceHandler
|
|
3462
3488
|
);
|
|
3463
3489
|
server.resource(
|
|
@@ -3465,6 +3491,10 @@ function registerResources(server) {
|
|
|
3465
3491
|
new ResourceTemplate("db://schemas/{schemaName}/procedures/{procedureName}", {
|
|
3466
3492
|
list: void 0
|
|
3467
3493
|
}),
|
|
3494
|
+
{
|
|
3495
|
+
description: "Get detailed information about a specific stored procedure, including parameters and definition (not supported by SQLite)",
|
|
3496
|
+
mimeType: "application/json"
|
|
3497
|
+
},
|
|
3468
3498
|
procedureDetailResourceHandler
|
|
3469
3499
|
);
|
|
3470
3500
|
}
|
|
@@ -4123,10 +4153,10 @@ See documentation for more details on configuring database connections.
|
|
|
4123
4153
|
await connectorManager.connectWithSources(sources);
|
|
4124
4154
|
const transportData = resolveTransport();
|
|
4125
4155
|
console.error(`MCP transport: ${transportData.type}`);
|
|
4126
|
-
|
|
4127
|
-
|
|
4128
|
-
|
|
4129
|
-
|
|
4156
|
+
const portData = transportData.type === "http" ? resolvePort() : null;
|
|
4157
|
+
if (portData) {
|
|
4158
|
+
console.error(`HTTP server port: ${portData.port} (source: ${portData.source})`);
|
|
4159
|
+
}
|
|
4130
4160
|
const readonly = isReadOnlyMode();
|
|
4131
4161
|
const activeModes = [];
|
|
4132
4162
|
const modeDescriptions = [];
|
|
@@ -4146,30 +4176,31 @@ See documentation for more details on configuring database connections.
|
|
|
4146
4176
|
console.error(`Running in ${activeModes.join(" and ")} mode - ${modeDescriptions.join(", ")}`);
|
|
4147
4177
|
}
|
|
4148
4178
|
console.error(generateBanner(SERVER_VERSION, activeModes));
|
|
4149
|
-
const app = express();
|
|
4150
|
-
app.use(express.json());
|
|
4151
|
-
app.use((req, res, next) => {
|
|
4152
|
-
const origin = req.headers.origin;
|
|
4153
|
-
if (origin && !origin.startsWith("http://localhost") && !origin.startsWith("https://localhost")) {
|
|
4154
|
-
return res.status(403).json({ error: "Forbidden origin" });
|
|
4155
|
-
}
|
|
4156
|
-
res.header("Access-Control-Allow-Origin", origin || "http://localhost");
|
|
4157
|
-
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
4158
|
-
res.header("Access-Control-Allow-Headers", "Content-Type, Mcp-Session-Id");
|
|
4159
|
-
res.header("Access-Control-Allow-Credentials", "true");
|
|
4160
|
-
if (req.method === "OPTIONS") {
|
|
4161
|
-
return res.sendStatus(200);
|
|
4162
|
-
}
|
|
4163
|
-
next();
|
|
4164
|
-
});
|
|
4165
|
-
const frontendPath = path3.join(__dirname2, "public");
|
|
4166
|
-
app.use(express.static(frontendPath));
|
|
4167
|
-
app.get("/healthz", (req, res) => {
|
|
4168
|
-
res.status(200).send("OK");
|
|
4169
|
-
});
|
|
4170
|
-
app.get("/api/sources", listSources);
|
|
4171
|
-
app.get("/api/sources/:sourceId", getSource);
|
|
4172
4179
|
if (transportData.type === "http") {
|
|
4180
|
+
const port = portData.port;
|
|
4181
|
+
const app = express();
|
|
4182
|
+
app.use(express.json());
|
|
4183
|
+
app.use((req, res, next) => {
|
|
4184
|
+
const origin = req.headers.origin;
|
|
4185
|
+
if (origin && !origin.startsWith("http://localhost") && !origin.startsWith("https://localhost")) {
|
|
4186
|
+
return res.status(403).json({ error: "Forbidden origin" });
|
|
4187
|
+
}
|
|
4188
|
+
res.header("Access-Control-Allow-Origin", origin || "http://localhost");
|
|
4189
|
+
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
4190
|
+
res.header("Access-Control-Allow-Headers", "Content-Type, Mcp-Session-Id");
|
|
4191
|
+
res.header("Access-Control-Allow-Credentials", "true");
|
|
4192
|
+
if (req.method === "OPTIONS") {
|
|
4193
|
+
return res.sendStatus(200);
|
|
4194
|
+
}
|
|
4195
|
+
next();
|
|
4196
|
+
});
|
|
4197
|
+
const frontendPath = path3.join(__dirname2, "public");
|
|
4198
|
+
app.use(express.static(frontendPath));
|
|
4199
|
+
app.get("/healthz", (req, res) => {
|
|
4200
|
+
res.status(200).send("OK");
|
|
4201
|
+
});
|
|
4202
|
+
app.get("/api/sources", listSources);
|
|
4203
|
+
app.get("/api/sources/:sourceId", getSource);
|
|
4173
4204
|
app.post("/mcp", async (req, res) => {
|
|
4174
4205
|
try {
|
|
4175
4206
|
const transport = new StreamableHTTPServerTransport({
|
|
@@ -4188,30 +4219,25 @@ See documentation for more details on configuring database connections.
|
|
|
4188
4219
|
}
|
|
4189
4220
|
}
|
|
4190
4221
|
});
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
} else {
|
|
4204
|
-
console.error(`Frontend accessible at http://0.0.0.0:${port}/`);
|
|
4205
|
-
}
|
|
4206
|
-
if (transportData.type === "http") {
|
|
4222
|
+
app.get("*", (req, res) => {
|
|
4223
|
+
res.sendFile(path3.join(frontendPath, "index.html"));
|
|
4224
|
+
});
|
|
4225
|
+
app.listen(port, "0.0.0.0", () => {
|
|
4226
|
+
if (process.env.NODE_ENV === "development") {
|
|
4227
|
+
console.error("Development mode detected!");
|
|
4228
|
+
console.error(" Admin console dev server (with HMR): http://localhost:5173");
|
|
4229
|
+
console.error(" Backend API: http://localhost:8080");
|
|
4230
|
+
console.error("");
|
|
4231
|
+
} else {
|
|
4232
|
+
console.error(`Admin console at http://0.0.0.0:${port}/`);
|
|
4233
|
+
}
|
|
4207
4234
|
console.error(`MCP server endpoint at http://0.0.0.0:${port}/mcp`);
|
|
4208
|
-
}
|
|
4209
|
-
}
|
|
4210
|
-
if (transportData.type === "stdio") {
|
|
4235
|
+
});
|
|
4236
|
+
} else {
|
|
4211
4237
|
const server = createServer2();
|
|
4212
4238
|
const transport = new StdioServerTransport();
|
|
4213
|
-
console.error("Starting MCP with STDIO transport");
|
|
4214
4239
|
await server.connect(transport);
|
|
4240
|
+
console.error("MCP server running on stdio");
|
|
4215
4241
|
process.on("SIGINT", async () => {
|
|
4216
4242
|
console.error("Shutting down...");
|
|
4217
4243
|
await transport.close();
|