agent-database-cli 0.2.7 → 0.2.15
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/AI_INSTALL.md +1 -1
- package/README.md +81 -61
- package/README_EN.md +37 -11
- package/SKILL.md +2 -1
- package/bin/agent-database-cli.js +55 -0
- package/package.json +20 -27
- package/dist/adapters/base-sql.d.ts +0 -12
- package/dist/adapters/base-sql.js +0 -22
- package/dist/adapters/base-sql.js.map +0 -1
- package/dist/adapters/factory.d.ts +0 -2
- package/dist/adapters/factory.js +0 -26
- package/dist/adapters/factory.js.map +0 -1
- package/dist/adapters/mongodb.d.ts +0 -14
- package/dist/adapters/mongodb.js +0 -137
- package/dist/adapters/mongodb.js.map +0 -1
- package/dist/adapters/mysql.d.ts +0 -12
- package/dist/adapters/mysql.js +0 -38
- package/dist/adapters/mysql.js.map +0 -1
- package/dist/adapters/oracle-sqlcl.d.ts +0 -19
- package/dist/adapters/oracle-sqlcl.js +0 -334
- package/dist/adapters/oracle-sqlcl.js.map +0 -1
- package/dist/adapters/oracle.d.ts +0 -13
- package/dist/adapters/oracle.js +0 -47
- package/dist/adapters/oracle.js.map +0 -1
- package/dist/adapters/postgres.d.ts +0 -12
- package/dist/adapters/postgres.js +0 -40
- package/dist/adapters/postgres.js.map +0 -1
- package/dist/adapters/redis.d.ts +0 -15
- package/dist/adapters/redis.js +0 -91
- package/dist/adapters/redis.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -118
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -8
- package/dist/config.js +0 -147
- package/dist/config.js.map +0 -1
- package/dist/connection-manager.d.ts +0 -24
- package/dist/connection-manager.js +0 -91
- package/dist/connection-manager.js.map +0 -1
- package/dist/daemon/client.d.ts +0 -3
- package/dist/daemon/client.js +0 -33
- package/dist/daemon/client.js.map +0 -1
- package/dist/daemon/config-manager.d.ts +0 -15
- package/dist/daemon/config-manager.js +0 -44
- package/dist/daemon/config-manager.js.map +0 -1
- package/dist/daemon/control.d.ts +0 -9
- package/dist/daemon/control.js +0 -53
- package/dist/daemon/control.js.map +0 -1
- package/dist/daemon/paths.d.ts +0 -5
- package/dist/daemon/paths.js +0 -18
- package/dist/daemon/paths.js.map +0 -1
- package/dist/daemon/server.d.ts +0 -1
- package/dist/daemon/server.js +0 -119
- package/dist/daemon/server.js.map +0 -1
- package/dist/output.d.ts +0 -2
- package/dist/output.js +0 -39
- package/dist/output.js.map +0 -1
- package/dist/runtime.d.ts +0 -5
- package/dist/runtime.js +0 -25
- package/dist/runtime.js.map +0 -1
- package/dist/security.d.ts +0 -8
- package/dist/security.js +0 -239
- package/dist/security.js.map +0 -1
- package/dist/ssh-tunnel.d.ts +0 -8
- package/dist/ssh-tunnel.js +0 -231
- package/dist/ssh-tunnel.js.map +0 -1
- package/dist/types.d.ts +0 -69
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/masking.d.ts +0 -2
- package/dist/utils/masking.js +0 -14
- package/dist/utils/masking.js.map +0 -1
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { stat } from "node:fs/promises";
|
|
2
|
-
import { loadConfig, resolveConfigPath } from "../config.js";
|
|
3
|
-
import { ConnectionManager } from "../connection-manager.js";
|
|
4
|
-
export class DaemonConfigManager {
|
|
5
|
-
manager;
|
|
6
|
-
snapshot;
|
|
7
|
-
async getManager(configPath) {
|
|
8
|
-
const path = configPath || resolveConfigPath();
|
|
9
|
-
const snapshot = await readConfigSnapshot(path);
|
|
10
|
-
if (!this.manager || !this.snapshot || hasConfigChanged(this.snapshot, snapshot)) {
|
|
11
|
-
await this.replaceManager(snapshot);
|
|
12
|
-
}
|
|
13
|
-
return this.manager;
|
|
14
|
-
}
|
|
15
|
-
status() {
|
|
16
|
-
return this.manager?.status() ?? { connections: [] };
|
|
17
|
-
}
|
|
18
|
-
async closeAll() {
|
|
19
|
-
if (this.manager) {
|
|
20
|
-
await this.manager.closeAll();
|
|
21
|
-
this.manager = undefined;
|
|
22
|
-
this.snapshot = undefined;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
async replaceManager(snapshot) {
|
|
26
|
-
if (this.manager) {
|
|
27
|
-
await this.manager.closeAll();
|
|
28
|
-
}
|
|
29
|
-
this.manager = new ConnectionManager(await loadConfig(snapshot.path));
|
|
30
|
-
this.snapshot = snapshot;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function hasConfigChanged(current, next) {
|
|
34
|
-
return current.path !== next.path || current.mtimeMs !== next.mtimeMs || current.size !== next.size;
|
|
35
|
-
}
|
|
36
|
-
async function readConfigSnapshot(path) {
|
|
37
|
-
const stats = await stat(path);
|
|
38
|
-
return {
|
|
39
|
-
path,
|
|
40
|
-
mtimeMs: stats.mtimeMs,
|
|
41
|
-
size: stats.size
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/daemon/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQ7D,MAAM,OAAO,mBAAmB;IACtB,OAAO,CAAqB;IAC5B,QAAQ,CAAkB;IAElC,KAAK,CAAC,UAAU,CAAC,UAAmB;QAClC,MAAM,IAAI,GAAG,UAAU,IAAI,iBAAiB,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,OAAQ,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAwB;QACnD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,OAAuB,EAAE,IAAoB;IACrE,OAAO,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AACtG,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
package/dist/daemon/control.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare function startDaemon(): Promise<{
|
|
2
|
-
started: boolean;
|
|
3
|
-
socket: string;
|
|
4
|
-
}>;
|
|
5
|
-
export declare function stopDaemon(): Promise<{
|
|
6
|
-
stopped: boolean;
|
|
7
|
-
}>;
|
|
8
|
-
export declare function daemonStatus(): Promise<unknown>;
|
|
9
|
-
export declare function readPidFile(): Promise<string | undefined>;
|
package/dist/daemon/control.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { mkdir, readFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, resolve } from "node:path";
|
|
3
|
-
import { spawn } from "node:child_process";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { isDaemonRunning, sendDaemonRequest } from "./client.js";
|
|
6
|
-
import { PID_PATH, SOCKET_PATH } from "./paths.js";
|
|
7
|
-
export async function startDaemon() {
|
|
8
|
-
if (await isDaemonRunning()) {
|
|
9
|
-
return { started: false, socket: SOCKET_PATH };
|
|
10
|
-
}
|
|
11
|
-
await mkdir(dirname(SOCKET_PATH), { recursive: true });
|
|
12
|
-
const currentFile = fileURLToPath(import.meta.url);
|
|
13
|
-
const daemonFile = resolve(dirname(currentFile), "server.js");
|
|
14
|
-
const child = spawn(process.execPath, [daemonFile], {
|
|
15
|
-
detached: true,
|
|
16
|
-
stdio: "ignore",
|
|
17
|
-
env: process.env
|
|
18
|
-
});
|
|
19
|
-
child.unref();
|
|
20
|
-
for (let i = 0; i < 30; i += 1) {
|
|
21
|
-
await delay(100);
|
|
22
|
-
if (await isDaemonRunning()) {
|
|
23
|
-
return { started: true, socket: SOCKET_PATH };
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
throw new Error("daemon 启动超时");
|
|
27
|
-
}
|
|
28
|
-
export async function stopDaemon() {
|
|
29
|
-
const response = await sendDaemonRequest({ action: "stop" });
|
|
30
|
-
if (!response.ok) {
|
|
31
|
-
throw new Error(response.error || "daemon 停止失败");
|
|
32
|
-
}
|
|
33
|
-
return { stopped: true };
|
|
34
|
-
}
|
|
35
|
-
export async function daemonStatus() {
|
|
36
|
-
const response = await sendDaemonRequest({ action: "status" });
|
|
37
|
-
if (!response.ok) {
|
|
38
|
-
throw new Error(response.error || "daemon 状态查询失败");
|
|
39
|
-
}
|
|
40
|
-
return response.data;
|
|
41
|
-
}
|
|
42
|
-
export async function readPidFile() {
|
|
43
|
-
try {
|
|
44
|
-
return (await readFile(PID_PATH, "utf8")).trim();
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function delay(ms) {
|
|
51
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=control.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;QAClD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/daemon/paths.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export declare const RUNTIME_DIR: string;
|
|
2
|
-
export declare const SOCKET_PATH: string;
|
|
3
|
-
export declare const PID_PATH: string;
|
|
4
|
-
export declare function resolveSocketPath(platform: NodeJS.Platform, homeDir: string): string;
|
|
5
|
-
export declare function isWindowsNamedPipe(path: string): boolean;
|
package/dist/daemon/paths.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
4
|
-
export const RUNTIME_DIR = join(homedir(), ".agent-database-cli");
|
|
5
|
-
export const SOCKET_PATH = resolveSocketPath(process.platform, homedir());
|
|
6
|
-
export const PID_PATH = join(RUNTIME_DIR, "agent-database-cli.pid");
|
|
7
|
-
export function resolveSocketPath(platform, homeDir) {
|
|
8
|
-
if (platform === "win32") {
|
|
9
|
-
// Windows IPC 必须使用 named pipe,不能使用 Unix socket 文件路径。
|
|
10
|
-
const suffix = createHash("sha1").update(homeDir).digest("hex").slice(0, 12);
|
|
11
|
-
return `\\\\.\\pipe\\agent-database-cli-${suffix}`;
|
|
12
|
-
}
|
|
13
|
-
return join(homeDir, ".agent-database-cli", "agent-database-cli.sock");
|
|
14
|
-
}
|
|
15
|
-
export function isWindowsNamedPipe(path) {
|
|
16
|
-
return path.startsWith("\\\\.\\pipe\\");
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=paths.js.map
|
package/dist/daemon/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/daemon/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;AAEpE,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE,OAAe;IAC1E,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,qDAAqD;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,OAAO,mCAAmC,MAAM,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/daemon/server.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function readDaemonPid(): Promise<number | undefined>;
|
package/dist/daemon/server.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
-
import net from "node:net";
|
|
3
|
-
import { dirname } from "node:path";
|
|
4
|
-
import { toErrorMessage } from "../utils/masking.js";
|
|
5
|
-
import { DaemonConfigManager } from "./config-manager.js";
|
|
6
|
-
import { isWindowsNamedPipe, PID_PATH, SOCKET_PATH } from "./paths.js";
|
|
7
|
-
const DAEMON_IDLE_SECONDS = 300;
|
|
8
|
-
const configManager = new DaemonConfigManager();
|
|
9
|
-
let idleTimer;
|
|
10
|
-
async function handleRequest(request) {
|
|
11
|
-
if (request.action === "status") {
|
|
12
|
-
return { ok: true, data: configManager.status() };
|
|
13
|
-
}
|
|
14
|
-
if (request.action === "stop") {
|
|
15
|
-
setTimeout(() => {
|
|
16
|
-
void shutdown(0);
|
|
17
|
-
}, 10).unref();
|
|
18
|
-
return { ok: true, data: { stopped: true } };
|
|
19
|
-
}
|
|
20
|
-
if (!request.db) {
|
|
21
|
-
throw new Error("daemon 请求必须提供 db");
|
|
22
|
-
}
|
|
23
|
-
const current = await configManager.getManager(request.configPath);
|
|
24
|
-
if (request.action === "test") {
|
|
25
|
-
return { ok: true, data: await current.test(request.db) };
|
|
26
|
-
}
|
|
27
|
-
if (request.action === "execute") {
|
|
28
|
-
if (!request.command) {
|
|
29
|
-
throw new Error("execute 请求必须提供 command");
|
|
30
|
-
}
|
|
31
|
-
return { ok: true, data: await current.execute(request.db, request.command) };
|
|
32
|
-
}
|
|
33
|
-
if (request.action === "metadata") {
|
|
34
|
-
if (!request.metadata) {
|
|
35
|
-
throw new Error("metadata 请求必须提供 metadata");
|
|
36
|
-
}
|
|
37
|
-
return { ok: true, data: await current.metadata(request.db, request.metadata) };
|
|
38
|
-
}
|
|
39
|
-
if (request.action === "reset") {
|
|
40
|
-
return { ok: true, data: await current.reset(request.db) };
|
|
41
|
-
}
|
|
42
|
-
throw new Error(`不支持的 daemon action: ${request.action}`);
|
|
43
|
-
}
|
|
44
|
-
async function start() {
|
|
45
|
-
await mkdir(dirname(PID_PATH), { recursive: true });
|
|
46
|
-
if (!isWindowsNamedPipe(SOCKET_PATH)) {
|
|
47
|
-
await mkdir(dirname(SOCKET_PATH), { recursive: true, mode: 0o700 });
|
|
48
|
-
await chmod(dirname(SOCKET_PATH), 0o700);
|
|
49
|
-
await rm(SOCKET_PATH, { force: true });
|
|
50
|
-
}
|
|
51
|
-
const server = net.createServer((socket) => {
|
|
52
|
-
let input = "";
|
|
53
|
-
socket.on("data", (chunk) => {
|
|
54
|
-
input += chunk.toString("utf8");
|
|
55
|
-
if (!input.includes("\n")) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const line = input.slice(0, input.indexOf("\n"));
|
|
59
|
-
void respond(socket, line);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
server.on("error", (error) => {
|
|
63
|
-
console.error(toErrorMessage(error));
|
|
64
|
-
process.exit(1);
|
|
65
|
-
});
|
|
66
|
-
server.listen(SOCKET_PATH, async () => {
|
|
67
|
-
if (!isWindowsNamedPipe(SOCKET_PATH)) {
|
|
68
|
-
await chmod(SOCKET_PATH, 0o600);
|
|
69
|
-
}
|
|
70
|
-
await writeFile(PID_PATH, String(process.pid), "utf8");
|
|
71
|
-
process.stdout.write(`agent-database-cli daemon started: ${SOCKET_PATH}\n`);
|
|
72
|
-
touchDaemonIdleTimer();
|
|
73
|
-
});
|
|
74
|
-
process.on("SIGTERM", () => void shutdown(0));
|
|
75
|
-
process.on("SIGINT", () => void shutdown(0));
|
|
76
|
-
}
|
|
77
|
-
async function respond(socket, line) {
|
|
78
|
-
try {
|
|
79
|
-
touchDaemonIdleTimer();
|
|
80
|
-
const request = JSON.parse(line);
|
|
81
|
-
const response = await handleRequest(request);
|
|
82
|
-
touchDaemonIdleTimer();
|
|
83
|
-
socket.end(JSON.stringify(response));
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
touchDaemonIdleTimer();
|
|
87
|
-
socket.end(JSON.stringify({ ok: false, error: toErrorMessage(error) }));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
function touchDaemonIdleTimer() {
|
|
91
|
-
if (idleTimer) {
|
|
92
|
-
clearTimeout(idleTimer);
|
|
93
|
-
}
|
|
94
|
-
idleTimer = setTimeout(() => {
|
|
95
|
-
void shutdown(0);
|
|
96
|
-
}, DAEMON_IDLE_SECONDS * 1000);
|
|
97
|
-
idleTimer.unref();
|
|
98
|
-
}
|
|
99
|
-
async function shutdown(code) {
|
|
100
|
-
if (idleTimer) {
|
|
101
|
-
clearTimeout(idleTimer);
|
|
102
|
-
}
|
|
103
|
-
await configManager.closeAll();
|
|
104
|
-
if (!isWindowsNamedPipe(SOCKET_PATH)) {
|
|
105
|
-
await rm(SOCKET_PATH, { force: true });
|
|
106
|
-
}
|
|
107
|
-
await rm(PID_PATH, { force: true });
|
|
108
|
-
process.exit(code);
|
|
109
|
-
}
|
|
110
|
-
export async function readDaemonPid() {
|
|
111
|
-
try {
|
|
112
|
-
return Number((await readFile(PID_PATH, "utf8")).trim());
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
void start();
|
|
119
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
DELETED
package/dist/output.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export function writeOutput(data, format) {
|
|
2
|
-
if (format === "json") {
|
|
3
|
-
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
4
|
-
return;
|
|
5
|
-
}
|
|
6
|
-
process.stdout.write(`${formatTable(data)}\n`);
|
|
7
|
-
}
|
|
8
|
-
function formatTable(data) {
|
|
9
|
-
const rows = Array.isArray(data)
|
|
10
|
-
? data
|
|
11
|
-
: isObject(data) && Array.isArray(data.rows)
|
|
12
|
-
? data.rows
|
|
13
|
-
: [data];
|
|
14
|
-
if (rows.length === 0) {
|
|
15
|
-
return "";
|
|
16
|
-
}
|
|
17
|
-
const objects = rows.map((row) => (isObject(row) ? row : { value: row }));
|
|
18
|
-
const columns = [...new Set(objects.flatMap((row) => Object.keys(row)))];
|
|
19
|
-
const widths = columns.map((column) => Math.max(column.length, ...objects.map((row) => stringifyCell(row[column]).length)));
|
|
20
|
-
const header = columns.map((column, index) => column.padEnd(widths[index])).join(" ");
|
|
21
|
-
const divider = widths.map((width) => "-".repeat(width)).join(" ");
|
|
22
|
-
const body = objects
|
|
23
|
-
.map((row) => columns.map((column, index) => stringifyCell(row[column]).padEnd(widths[index])).join(" "))
|
|
24
|
-
.join("\n");
|
|
25
|
-
return [header, divider, body].join("\n");
|
|
26
|
-
}
|
|
27
|
-
function isObject(value) {
|
|
28
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
29
|
-
}
|
|
30
|
-
function stringifyCell(value) {
|
|
31
|
-
if (value === null || value === undefined) {
|
|
32
|
-
return "";
|
|
33
|
-
}
|
|
34
|
-
if (typeof value === "object") {
|
|
35
|
-
return JSON.stringify(value);
|
|
36
|
-
}
|
|
37
|
-
return String(value);
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=output.js.map
|
package/dist/output.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { MetadataRequest, QueryResult } from "./types.js";
|
|
2
|
-
export declare function runTest(db: string): Promise<unknown>;
|
|
3
|
-
export declare function runExecute(db: string, command: string): Promise<QueryResult>;
|
|
4
|
-
export declare function runMetadata(db: string, metadata: MetadataRequest): Promise<QueryResult>;
|
|
5
|
-
export declare function runReset(db: string): Promise<unknown>;
|
package/dist/runtime.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { resolveConfigPath } from "./config.js";
|
|
2
|
-
import { sendDaemonRequest } from "./daemon/client.js";
|
|
3
|
-
import { startDaemon } from "./daemon/control.js";
|
|
4
|
-
export async function runTest(db) {
|
|
5
|
-
return runViaDaemonOrLocal("test", db);
|
|
6
|
-
}
|
|
7
|
-
export async function runExecute(db, command) {
|
|
8
|
-
return runViaDaemonOrLocal("execute", db, command);
|
|
9
|
-
}
|
|
10
|
-
export async function runMetadata(db, metadata) {
|
|
11
|
-
return runViaDaemonOrLocal("metadata", db, undefined, metadata);
|
|
12
|
-
}
|
|
13
|
-
export async function runReset(db) {
|
|
14
|
-
return runViaDaemonOrLocal("reset", db);
|
|
15
|
-
}
|
|
16
|
-
async function runViaDaemonOrLocal(action, db, command, metadata) {
|
|
17
|
-
const configPath = resolveConfigPath();
|
|
18
|
-
await startDaemon();
|
|
19
|
-
const response = await sendDaemonRequest({ action, db, command, metadata, configPath });
|
|
20
|
-
if (!response.ok) {
|
|
21
|
-
throw new Error(response.error || "daemon 执行失败");
|
|
22
|
-
}
|
|
23
|
-
return response.data;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=runtime.js.map
|
package/dist/runtime.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACtC,OAAO,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU,EAAE,OAAe;IAC1D,OAAO,mBAAmB,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAyB,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU,EAAE,QAAyB;IACrE,OAAO,mBAAmB,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAyB,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAU;IACvC,OAAO,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAoB,EACpB,EAAU,EACV,OAAgB,EAChB,QAA0B;IAE1B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IACxF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
|
package/dist/security.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { DatabaseConfig, DatabaseType } from "./types.js";
|
|
2
|
-
export declare class SecurityError extends Error {
|
|
3
|
-
constructor(message: string);
|
|
4
|
-
}
|
|
5
|
-
export declare function normalizeCommand(command: string): string;
|
|
6
|
-
export declare function getCommandHead(command: string, type: DatabaseType): string;
|
|
7
|
-
export declare function assertCommandAllowed(config: DatabaseConfig, command: string): void;
|
|
8
|
-
export declare function isReadOnlyCommand(type: DatabaseType, command: string): boolean;
|
package/dist/security.js
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
const SQL_READ_COMMANDS = new Set(["select", "show", "describe", "desc", "explain", "with"]);
|
|
2
|
-
const SQL_WRITE_COMMANDS = [
|
|
3
|
-
"insert",
|
|
4
|
-
"update",
|
|
5
|
-
"delete",
|
|
6
|
-
"merge",
|
|
7
|
-
"replace",
|
|
8
|
-
"drop",
|
|
9
|
-
"truncate",
|
|
10
|
-
"alter",
|
|
11
|
-
"create",
|
|
12
|
-
"grant",
|
|
13
|
-
"revoke"
|
|
14
|
-
];
|
|
15
|
-
const REDIS_READ_COMMANDS = new Set([
|
|
16
|
-
"get",
|
|
17
|
-
"mget",
|
|
18
|
-
"exists",
|
|
19
|
-
"ttl",
|
|
20
|
-
"pttl",
|
|
21
|
-
"type",
|
|
22
|
-
"strlen",
|
|
23
|
-
"keys",
|
|
24
|
-
"scan",
|
|
25
|
-
"hget",
|
|
26
|
-
"hgetall",
|
|
27
|
-
"hmget",
|
|
28
|
-
"hexists",
|
|
29
|
-
"hlen",
|
|
30
|
-
"hkeys",
|
|
31
|
-
"hvals",
|
|
32
|
-
"lrange",
|
|
33
|
-
"llen",
|
|
34
|
-
"lindex",
|
|
35
|
-
"smembers",
|
|
36
|
-
"scard",
|
|
37
|
-
"sismember",
|
|
38
|
-
"zrange",
|
|
39
|
-
"zrevrange",
|
|
40
|
-
"zcard",
|
|
41
|
-
"zscore"
|
|
42
|
-
]);
|
|
43
|
-
const MONGO_READ_COMMANDS = new Set([
|
|
44
|
-
"find",
|
|
45
|
-
"findOne",
|
|
46
|
-
"aggregate",
|
|
47
|
-
"count",
|
|
48
|
-
"countDocuments",
|
|
49
|
-
"estimatedDocumentCount",
|
|
50
|
-
"distinct"
|
|
51
|
-
]);
|
|
52
|
-
export class SecurityError extends Error {
|
|
53
|
-
constructor(message) {
|
|
54
|
-
super(message);
|
|
55
|
-
this.name = "SecurityError";
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export function normalizeCommand(command) {
|
|
59
|
-
return command.trim().replace(/\s+/g, " ");
|
|
60
|
-
}
|
|
61
|
-
export function getCommandHead(command, type) {
|
|
62
|
-
const normalized = normalizeCommand(command);
|
|
63
|
-
if (type === "mongodb") {
|
|
64
|
-
return getMongoCommandName(normalized).toLowerCase();
|
|
65
|
-
}
|
|
66
|
-
return normalized.split(/\s+/)[0]?.replace(/;$/, "").toLowerCase() || "";
|
|
67
|
-
}
|
|
68
|
-
export function assertCommandAllowed(config, command) {
|
|
69
|
-
const normalized = normalizeCommand(command);
|
|
70
|
-
const head = getCommandHead(normalized, config.type);
|
|
71
|
-
assertNotBlacklisted(config, normalized, head);
|
|
72
|
-
// 默认开启只读,只有显式配置 readonly: false 才允许写操作。
|
|
73
|
-
if (isReadonlyEnabled(config) && !isReadOnlyCommand(config.type, normalized)) {
|
|
74
|
-
throw new SecurityError(`只读模式拒绝执行命令: ${head || normalized}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function assertNotBlacklisted(config, normalized, head) {
|
|
78
|
-
const commandForBlacklist = isSqlDatabase(config.type) ? stripSqlLiteralsAndComments(normalized) : normalized;
|
|
79
|
-
for (const item of config.blacklist || []) {
|
|
80
|
-
const black = normalizeCommand(item).toLowerCase();
|
|
81
|
-
if (!black) {
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (head === black || hasBlacklistedKeyword(commandForBlacklist, black)) {
|
|
85
|
-
throw new SecurityError(`黑名单拒绝执行命令: ${item}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
function hasBlacklistedKeyword(command, keyword) {
|
|
90
|
-
const normalized = command.toLowerCase();
|
|
91
|
-
const escaped = escapeRegExp(keyword).replace(/\s+/g, "\\s+");
|
|
92
|
-
// 黑名单按完整命令关键字匹配,避免 FCREATETIME 这类字段名误命中 create。
|
|
93
|
-
return new RegExp(`(?<![\\p{L}\\p{N}_$])${escaped}(?![\\p{L}\\p{N}_$])`, "u").test(normalized);
|
|
94
|
-
}
|
|
95
|
-
function escapeRegExp(value) {
|
|
96
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
97
|
-
}
|
|
98
|
-
function stripSqlLiteralsAndComments(command) {
|
|
99
|
-
let result = "";
|
|
100
|
-
let index = 0;
|
|
101
|
-
while (index < command.length) {
|
|
102
|
-
const char = command[index];
|
|
103
|
-
const next = command[index + 1];
|
|
104
|
-
if ((char === "q" || char === "Q") && next === "'") {
|
|
105
|
-
const endIndex = findOracleQuotedLiteralEnd(command, index);
|
|
106
|
-
if (endIndex !== -1) {
|
|
107
|
-
result += " ".repeat(endIndex - index);
|
|
108
|
-
index = endIndex;
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (char === "-" && next === "-") {
|
|
113
|
-
const endIndex = findLineEnd(command, index + 2);
|
|
114
|
-
result += " ".repeat(endIndex - index);
|
|
115
|
-
index = endIndex;
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
if (char === "#") {
|
|
119
|
-
const endIndex = findLineEnd(command, index + 1);
|
|
120
|
-
result += " ".repeat(endIndex - index);
|
|
121
|
-
index = endIndex;
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
if (char === "/" && next === "*") {
|
|
125
|
-
const endIndex = findBlockCommentEnd(command, index + 2);
|
|
126
|
-
result += " ".repeat(endIndex - index);
|
|
127
|
-
index = endIndex;
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
if (char === "'") {
|
|
131
|
-
const endIndex = findQuotedTokenEnd(command, index, "'", "'");
|
|
132
|
-
result += " ".repeat(endIndex - index);
|
|
133
|
-
index = endIndex;
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (char === '"') {
|
|
137
|
-
const endIndex = findQuotedTokenEnd(command, index, '"', '"');
|
|
138
|
-
result += " ".repeat(endIndex - index);
|
|
139
|
-
index = endIndex;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
if (char === "`") {
|
|
143
|
-
const endIndex = findQuotedTokenEnd(command, index, "`", "`");
|
|
144
|
-
result += " ".repeat(endIndex - index);
|
|
145
|
-
index = endIndex;
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
if (char === "[") {
|
|
149
|
-
const endIndex = findQuotedTokenEnd(command, index, "[", "]");
|
|
150
|
-
result += " ".repeat(endIndex - index);
|
|
151
|
-
index = endIndex;
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
result += char;
|
|
155
|
-
index += 1;
|
|
156
|
-
}
|
|
157
|
-
return result;
|
|
158
|
-
}
|
|
159
|
-
function findLineEnd(command, start) {
|
|
160
|
-
const lineEnd = command.indexOf("\n", start);
|
|
161
|
-
return lineEnd === -1 ? command.length : lineEnd;
|
|
162
|
-
}
|
|
163
|
-
function findBlockCommentEnd(command, start) {
|
|
164
|
-
const commentEnd = command.indexOf("*/", start);
|
|
165
|
-
return commentEnd === -1 ? command.length : commentEnd + 2;
|
|
166
|
-
}
|
|
167
|
-
function findQuotedTokenEnd(command, start, open, close) {
|
|
168
|
-
let index = start + open.length;
|
|
169
|
-
while (index < command.length) {
|
|
170
|
-
if (command[index] === close) {
|
|
171
|
-
if (command[index + close.length] === close) {
|
|
172
|
-
index += close.length * 2;
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
return index + close.length;
|
|
176
|
-
}
|
|
177
|
-
if (command[index] === "\\" && close !== "]") {
|
|
178
|
-
index += 2;
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
index += 1;
|
|
182
|
-
}
|
|
183
|
-
return command.length;
|
|
184
|
-
}
|
|
185
|
-
function findOracleQuotedLiteralEnd(command, start) {
|
|
186
|
-
const open = command[start + 2];
|
|
187
|
-
if (!open) {
|
|
188
|
-
return -1;
|
|
189
|
-
}
|
|
190
|
-
const close = getOracleQuotedLiteralClose(open);
|
|
191
|
-
const closeSequence = `${close}'`;
|
|
192
|
-
const contentStart = start + 3;
|
|
193
|
-
const closeIndex = command.indexOf(closeSequence, contentStart);
|
|
194
|
-
return closeIndex === -1 ? -1 : closeIndex + closeSequence.length;
|
|
195
|
-
}
|
|
196
|
-
function getOracleQuotedLiteralClose(open) {
|
|
197
|
-
if (open === "[") {
|
|
198
|
-
return "]";
|
|
199
|
-
}
|
|
200
|
-
if (open === "(") {
|
|
201
|
-
return ")";
|
|
202
|
-
}
|
|
203
|
-
if (open === "{") {
|
|
204
|
-
return "}";
|
|
205
|
-
}
|
|
206
|
-
if (open === "<") {
|
|
207
|
-
return ">";
|
|
208
|
-
}
|
|
209
|
-
return open;
|
|
210
|
-
}
|
|
211
|
-
function isSqlDatabase(type) {
|
|
212
|
-
return type === "mysql" || type === "postgres" || type === "oracle";
|
|
213
|
-
}
|
|
214
|
-
export function isReadOnlyCommand(type, command) {
|
|
215
|
-
const head = getCommandHead(command, type);
|
|
216
|
-
if (type === "redis") {
|
|
217
|
-
return REDIS_READ_COMMANDS.has(head);
|
|
218
|
-
}
|
|
219
|
-
if (type === "mongodb") {
|
|
220
|
-
return MONGO_READ_COMMANDS.has(getMongoCommandName(command));
|
|
221
|
-
}
|
|
222
|
-
if (!SQL_READ_COMMANDS.has(head)) {
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
const sanitizedCommand = stripSqlLiteralsAndComments(command);
|
|
226
|
-
return !SQL_WRITE_COMMANDS.some((keyword) => hasBlacklistedKeyword(sanitizedCommand, keyword));
|
|
227
|
-
}
|
|
228
|
-
function isReadonlyEnabled(config) {
|
|
229
|
-
return config.readonly !== false;
|
|
230
|
-
}
|
|
231
|
-
function getMongoCommandName(command) {
|
|
232
|
-
const parsed = JSON.parse(command);
|
|
233
|
-
const firstKey = Object.keys(parsed)[0];
|
|
234
|
-
if (!firstKey) {
|
|
235
|
-
throw new SecurityError("MongoDB 命令 JSON 不能为空");
|
|
236
|
-
}
|
|
237
|
-
return firstKey;
|
|
238
|
-
}
|
|
239
|
-
//# sourceMappingURL=security.js.map
|
package/dist/security.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/ssh-tunnel.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { DatabaseConfig, DatabaseType, RedisClusterConnectionConfig } from "./types.js";
|
|
2
|
-
export interface StartedSshTunnel {
|
|
3
|
-
url: string;
|
|
4
|
-
redisCluster?: RedisClusterConnectionConfig;
|
|
5
|
-
close(): Promise<void>;
|
|
6
|
-
}
|
|
7
|
-
export declare function startSshTunnel(config: DatabaseConfig): Promise<StartedSshTunnel | undefined>;
|
|
8
|
-
export declare function rewriteDatabaseUrl(type: DatabaseType, url: string, host: string, port: number): string;
|