agent-database-cli 0.2.7
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 +72 -0
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/README_EN.md +341 -0
- package/SKILL.md +252 -0
- package/config/docker-test.json +40 -0
- package/dist/adapters/base-sql.d.ts +12 -0
- package/dist/adapters/base-sql.js +22 -0
- package/dist/adapters/base-sql.js.map +1 -0
- package/dist/adapters/factory.d.ts +2 -0
- package/dist/adapters/factory.js +26 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/mongodb.d.ts +14 -0
- package/dist/adapters/mongodb.js +137 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/mysql.d.ts +12 -0
- package/dist/adapters/mysql.js +38 -0
- package/dist/adapters/mysql.js.map +1 -0
- package/dist/adapters/oracle-sqlcl.d.ts +19 -0
- package/dist/adapters/oracle-sqlcl.js +334 -0
- package/dist/adapters/oracle-sqlcl.js.map +1 -0
- package/dist/adapters/oracle.d.ts +13 -0
- package/dist/adapters/oracle.js +47 -0
- package/dist/adapters/oracle.js.map +1 -0
- package/dist/adapters/postgres.d.ts +12 -0
- package/dist/adapters/postgres.js +40 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/adapters/redis.d.ts +15 -0
- package/dist/adapters/redis.js +91 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-manager.d.ts +24 -0
- package/dist/connection-manager.js +91 -0
- package/dist/connection-manager.js.map +1 -0
- package/dist/daemon/client.d.ts +3 -0
- package/dist/daemon/client.js +33 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/config-manager.d.ts +15 -0
- package/dist/daemon/config-manager.js +44 -0
- package/dist/daemon/config-manager.js.map +1 -0
- package/dist/daemon/control.d.ts +9 -0
- package/dist/daemon/control.js +53 -0
- package/dist/daemon/control.js.map +1 -0
- package/dist/daemon/paths.d.ts +5 -0
- package/dist/daemon/paths.js +18 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.js +119 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/output.d.ts +2 -0
- package/dist/output.js +39 -0
- package/dist/output.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +25 -0
- package/dist/runtime.js.map +1 -0
- package/dist/security.d.ts +8 -0
- package/dist/security.js +239 -0
- package/dist/security.js.map +1 -0
- package/dist/ssh-tunnel.d.ts +8 -0
- package/dist/ssh-tunnel.js +231 -0
- package/dist/ssh-tunnel.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/masking.d.ts +2 -0
- package/dist/utils/masking.js +14 -0
- package/dist/utils/masking.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import net from "node:net";
|
|
2
|
+
import { SOCKET_PATH } from "./paths.js";
|
|
3
|
+
export function sendDaemonRequest(request) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
const socket = net.createConnection(SOCKET_PATH);
|
|
6
|
+
let buffer = "";
|
|
7
|
+
socket.on("connect", () => {
|
|
8
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
9
|
+
});
|
|
10
|
+
socket.on("data", (chunk) => {
|
|
11
|
+
buffer += chunk.toString("utf8");
|
|
12
|
+
});
|
|
13
|
+
socket.on("error", reject);
|
|
14
|
+
socket.on("end", () => {
|
|
15
|
+
try {
|
|
16
|
+
resolve(JSON.parse(buffer));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
reject(new Error("daemon 返回了无效响应"));
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export async function isDaemonRunning() {
|
|
25
|
+
try {
|
|
26
|
+
const response = await sendDaemonRequest({ action: "status" });
|
|
27
|
+
return response.ok;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,iBAAiB,CAAC,OAAsB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmB,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConnectionManager } from "../connection-manager.js";
|
|
2
|
+
export declare class DaemonConfigManager {
|
|
3
|
+
private manager?;
|
|
4
|
+
private snapshot?;
|
|
5
|
+
getManager(configPath?: string): Promise<ConnectionManager>;
|
|
6
|
+
status(): {
|
|
7
|
+
connections: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
keepAliveSeconds: number;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
closeAll(): Promise<void>;
|
|
14
|
+
private replaceManager;
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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>;
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
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;
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function readDaemonPid(): Promise<number | undefined>;
|
|
@@ -0,0 +1,119 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
package/dist/output.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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;
|