@zqagent/core 0.2.7 → 0.2.10
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/cli/index.cjs +310 -88
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +310 -88
- package/dist/cli/index.js.map +1 -1
- package/dist/server/index.cjs +201 -45
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +201 -45
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.cjs
CHANGED
|
@@ -3741,10 +3741,10 @@ var OpenAIProvider = class {
|
|
|
3741
3741
|
let timer;
|
|
3742
3742
|
try {
|
|
3743
3743
|
for (; ; ) {
|
|
3744
|
-
const idle = new Promise((
|
|
3744
|
+
const idle = new Promise((resolve24) => {
|
|
3745
3745
|
timer = setTimeout(() => {
|
|
3746
3746
|
onIdle();
|
|
3747
|
-
|
|
3747
|
+
resolve24({ timedOut: true });
|
|
3748
3748
|
}, idleMs);
|
|
3749
3749
|
});
|
|
3750
3750
|
const next = iter.next();
|
|
@@ -6065,12 +6065,12 @@ function makeSink(maxBuffer) {
|
|
|
6065
6065
|
};
|
|
6066
6066
|
}
|
|
6067
6067
|
function execAsync(file, argv, opts = {}) {
|
|
6068
|
-
return new Promise((
|
|
6068
|
+
return new Promise((resolve24) => {
|
|
6069
6069
|
const maxBuffer = opts.maxBuffer ?? DEFAULT_MAX_BUFFER;
|
|
6070
6070
|
const out = makeSink(maxBuffer);
|
|
6071
6071
|
const err = makeSink(maxBuffer);
|
|
6072
6072
|
if (opts.signal?.aborted) {
|
|
6073
|
-
|
|
6073
|
+
resolve24({
|
|
6074
6074
|
status: null,
|
|
6075
6075
|
stdout: Buffer.alloc(0),
|
|
6076
6076
|
stderr: Buffer.alloc(0),
|
|
@@ -6091,7 +6091,7 @@ function execAsync(file, argv, opts = {}) {
|
|
|
6091
6091
|
windowsHide: true
|
|
6092
6092
|
});
|
|
6093
6093
|
} catch (e) {
|
|
6094
|
-
|
|
6094
|
+
resolve24({
|
|
6095
6095
|
status: null,
|
|
6096
6096
|
stdout: Buffer.alloc(0),
|
|
6097
6097
|
stderr: Buffer.alloc(0),
|
|
@@ -6128,7 +6128,7 @@ function execAsync(file, argv, opts = {}) {
|
|
|
6128
6128
|
};
|
|
6129
6129
|
if (aborted) result.aborted = true;
|
|
6130
6130
|
if (spawnError) result.error = spawnError;
|
|
6131
|
-
|
|
6131
|
+
resolve24(result);
|
|
6132
6132
|
};
|
|
6133
6133
|
const killAndSettle = () => {
|
|
6134
6134
|
killTree(child.pid);
|
|
@@ -10218,8 +10218,8 @@ var InputRouter = class {
|
|
|
10218
10218
|
}
|
|
10219
10219
|
/** 询问一行:显示 prompt,返回该行内容 */
|
|
10220
10220
|
ask(prompt) {
|
|
10221
|
-
return new Promise((
|
|
10222
|
-
this.pendingAsks.push({ prompt, resolve:
|
|
10221
|
+
return new Promise((resolve24) => {
|
|
10222
|
+
this.pendingAsks.push({ prompt, resolve: resolve24 });
|
|
10223
10223
|
this.pumpAsks();
|
|
10224
10224
|
});
|
|
10225
10225
|
}
|
|
@@ -10316,16 +10316,16 @@ var import_chalk2 = __toESM(require("chalk"), 1);
|
|
|
10316
10316
|
var BRAND_TEXT = "ZQAGENT";
|
|
10317
10317
|
var BRAND_TAGLINE = "ZQAgent \xB7 AI Agent CLI";
|
|
10318
10318
|
var GLYPHS = {
|
|
10319
|
-
Z: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
10320
|
-
Q: [" \u2588\u2588\u2588\u2588\u2588\u2588
|
|
10321
|
-
A: [" \u2588\u2588\u2588\u2588\u2588\
|
|
10322
|
-
G: [" \u2588\u2588\u2588\u2588\u2588\u2588
|
|
10323
|
-
E: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
10324
|
-
N: ["\u2588\u2588\u2588\
|
|
10325
|
-
T: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
10319
|
+
Z: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ", " \u2588\u2588\u2588 ", " \u2588\u2588\u2588 ", " \u2588\u2588\u2588 ", "\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ", " "],
|
|
10320
|
+
Q: [" \u2588\u2588\u2588\u2588\u2588\u2588 ", "\u2588\u2588 \u2588\u2588", "\u2588\u2588 \u2588\u2588", "\u2588\u2588 \u2584\u2584 \u2588\u2588", " \u2588\u2588\u2588\u2588\u2588\u2588 ", " \u2580\u2580 "],
|
|
10321
|
+
A: [" \u2588\u2588\u2588\u2588\u2588\u2588 ", "\u2588\u2588 \u2588\u2588", "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588", "\u2588\u2588 \u2588\u2588", "\u2588\u2588 \u2588\u2588", " "],
|
|
10322
|
+
G: [" \u2588\u2588\u2588\u2588\u2588\u2588 ", "\u2588\u2588 ", "\u2588\u2588 \u2588\u2588\u2588", "\u2588\u2588 \u2588\u2588", " \u2588\u2588\u2588\u2588\u2588\u2588 ", " "],
|
|
10323
|
+
E: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ", "\u2588\u2588 ", "\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ", "\u2588\u2588 ", "\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ", " "],
|
|
10324
|
+
N: ["\u2588\u2588 \u2588\u2588", "\u2588\u2588\u2588 \u2588\u2588", "\u2588\u2588\u2588\u2588 \u2588\u2588", "\u2588\u2588 \u2588\u2588 \u2588\u2588", "\u2588\u2588 \u2588\u2588\u2588\u2588", " "],
|
|
10325
|
+
T: ["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588", " \u2588\u2588 ", " \u2588\u2588 ", " \u2588\u2588 ", " \u2588\u2588 ", " "]
|
|
10326
10326
|
};
|
|
10327
10327
|
var GLYPH_ROWS = 6;
|
|
10328
|
-
var GLYPH_COLS =
|
|
10328
|
+
var GLYPH_COLS = 9;
|
|
10329
10329
|
var GRADIENT = [
|
|
10330
10330
|
[34, 211, 238],
|
|
10331
10331
|
[99, 102, 241],
|
|
@@ -10930,15 +10930,36 @@ function parseServeArgs(argv) {
|
|
|
10930
10930
|
return { dataDir, host, port };
|
|
10931
10931
|
}
|
|
10932
10932
|
function buildHotCandidates(explicitDataDir, discovered, fallback) {
|
|
10933
|
-
|
|
10934
|
-
return [{ dataDir: path20.resolve(explicitDataDir), ...fallback }];
|
|
10935
|
-
}
|
|
10936
|
-
const out = [{ dataDir: path20.resolve(DEFAULT_DATA_DIR), ...fallback }];
|
|
10933
|
+
const out = explicitDataDir ? [{ dataDir: path20.resolve(explicitDataDir), ...fallback }] : [{ dataDir: path20.resolve(DEFAULT_DATA_DIR), ...fallback }];
|
|
10937
10934
|
for (const inst of discovered) {
|
|
10938
10935
|
if (!out.some((o) => o.dataDir === inst.dataDir)) out.push(inst);
|
|
10939
10936
|
}
|
|
10940
10937
|
return out;
|
|
10941
10938
|
}
|
|
10939
|
+
function isWindowsAbsolute(p) {
|
|
10940
|
+
return /^[A-Za-z]:[\\/]/.test(p) || /^\\\\/.test(p);
|
|
10941
|
+
}
|
|
10942
|
+
function isAbsolutePath(p) {
|
|
10943
|
+
return path20.isAbsolute(p) || isWindowsAbsolute(p);
|
|
10944
|
+
}
|
|
10945
|
+
function normalizePath(p) {
|
|
10946
|
+
return isWindowsAbsolute(p) ? path20.win32.normalize(p) : path20.normalize(p);
|
|
10947
|
+
}
|
|
10948
|
+
function parseServeCommandLine(line) {
|
|
10949
|
+
if (!/(?:^|\s)["']?serve["']?(?=\s|$)/.test(line)) return null;
|
|
10950
|
+
const m = /--data-dir(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(.+?))(?=\s+--\w|\s*$)/.exec(line);
|
|
10951
|
+
const rawDataDir = (m?.[1] ?? m?.[2] ?? m?.[3] ?? "").trim();
|
|
10952
|
+
if (!rawDataDir || !isAbsolutePath(rawDataDir)) return null;
|
|
10953
|
+
const host = /--host(?:=|\s+)(?:"([^"]+)"|'([^']+)'|(\S+))/.exec(line);
|
|
10954
|
+
const rawHost = (host?.[1] ?? host?.[2] ?? host?.[3] ?? DEFAULT_SERVE_HOST).trim();
|
|
10955
|
+
const portMatch = /--port(?:=|\s+)(\d+)/.exec(line);
|
|
10956
|
+
const port = Number(portMatch?.[1] ?? DEFAULT_SERVE_PORT);
|
|
10957
|
+
return {
|
|
10958
|
+
dataDir: normalizePath(rawDataDir),
|
|
10959
|
+
host: rawHost === "0.0.0.0" || rawHost === "::" || rawHost === "" ? DEFAULT_SERVE_HOST : rawHost,
|
|
10960
|
+
port: Number.isFinite(port) && port > 0 ? port : DEFAULT_SERVE_PORT
|
|
10961
|
+
};
|
|
10962
|
+
}
|
|
10942
10963
|
function processCwd(pid) {
|
|
10943
10964
|
try {
|
|
10944
10965
|
return fs18.readlinkSync(`/proc/${pid}/cwd`);
|
|
@@ -10994,23 +11015,28 @@ function discoverFromPs() {
|
|
|
10994
11015
|
const res = (0, import_node_child_process4.spawnSync)("ps", ["-axo", "command="], { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] });
|
|
10995
11016
|
if (res.status !== 0 || !res.stdout) return out;
|
|
10996
11017
|
for (const line of res.stdout.split("\n")) {
|
|
10997
|
-
|
|
10998
|
-
|
|
10999
|
-
|
|
11000
|
-
|
|
11001
|
-
|
|
11002
|
-
|
|
11003
|
-
|
|
11004
|
-
|
|
11005
|
-
|
|
11006
|
-
|
|
11007
|
-
|
|
11008
|
-
}
|
|
11018
|
+
const inst = parseServeCommandLine(line);
|
|
11019
|
+
if (inst) out.push(inst);
|
|
11020
|
+
}
|
|
11021
|
+
return out;
|
|
11022
|
+
}
|
|
11023
|
+
function discoverFromWindows() {
|
|
11024
|
+
const out = [];
|
|
11025
|
+
const script = `[Console]::OutputEncoding=[Text.Encoding]::UTF8; Get-CimInstance Win32_Process -Filter "Name='zqagent.exe' OR Name='node.exe'" | ForEach-Object { $_.CommandLine }`;
|
|
11026
|
+
const res = (0, import_node_child_process4.spawnSync)(
|
|
11027
|
+
"powershell.exe",
|
|
11028
|
+
["-NoProfile", "-NonInteractive", "-Command", script],
|
|
11029
|
+
{ encoding: "utf-8", timeout: 15e3, windowsHide: true, stdio: ["ignore", "pipe", "ignore"] }
|
|
11030
|
+
);
|
|
11031
|
+
if (res.status !== 0 || !res.stdout) return out;
|
|
11032
|
+
for (const line of res.stdout.replace(/^\uFEFF/, "").split(/\r?\n/)) {
|
|
11033
|
+
const inst = parseServeCommandLine(line);
|
|
11034
|
+
if (inst) out.push(inst);
|
|
11009
11035
|
}
|
|
11010
11036
|
return out;
|
|
11011
11037
|
}
|
|
11012
11038
|
function discoverRunningServeInstances() {
|
|
11013
|
-
const found = process.platform === "linux" ? discoverFromProc() : discoverFromPs();
|
|
11039
|
+
const found = process.platform === "linux" ? discoverFromProc() : process.platform === "win32" ? discoverFromWindows() : discoverFromPs();
|
|
11014
11040
|
const seen = /* @__PURE__ */ new Set();
|
|
11015
11041
|
return found.filter((inst) => {
|
|
11016
11042
|
if (seen.has(inst.dataDir)) return false;
|
|
@@ -11020,6 +11046,18 @@ function discoverRunningServeInstances() {
|
|
|
11020
11046
|
}
|
|
11021
11047
|
|
|
11022
11048
|
// src/cli/link.ts
|
|
11049
|
+
function expandHome(p) {
|
|
11050
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
11051
|
+
if (!home) return p;
|
|
11052
|
+
if (p === "~") return home;
|
|
11053
|
+
if (p.startsWith("~/") || p.startsWith("~\\")) return path21.join(home, p.slice(2));
|
|
11054
|
+
return p;
|
|
11055
|
+
}
|
|
11056
|
+
function installDataDirHint() {
|
|
11057
|
+
if (process.platform === "darwin") return "$HOME/Library/Application Support/zqagent";
|
|
11058
|
+
if (process.platform === "win32") return "%LOCALAPPDATA%\\zqagent";
|
|
11059
|
+
return "/var/lib/zqagent\uFF08\u9700 root\uFF1B\u666E\u901A\u7528\u6237\u7528 ~/.zqagent_data\uFF09";
|
|
11060
|
+
}
|
|
11023
11061
|
function parseLinkArgs(argv) {
|
|
11024
11062
|
const out = {};
|
|
11025
11063
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -11093,10 +11131,12 @@ async function enrollViaServer(host, port, adminKey, opts) {
|
|
|
11093
11131
|
return payload?.data;
|
|
11094
11132
|
}
|
|
11095
11133
|
async function linkNode(opts) {
|
|
11096
|
-
const
|
|
11134
|
+
const rawDataDir = opts.dataDir?.trim() || process.env.DATA_DIR?.trim() || void 0;
|
|
11135
|
+
const explicitDataDir = rawDataDir ? expandHome(rawDataDir) : void 0;
|
|
11097
11136
|
const host = opts.host?.trim() || process.env.HOST?.trim() || DEFAULT_SERVE_HOST;
|
|
11098
11137
|
const port = opts.port ?? Number(process.env.PORT ?? DEFAULT_SERVE_PORT);
|
|
11099
|
-
const
|
|
11138
|
+
const running = discoverRunningServeInstances();
|
|
11139
|
+
const candidates = buildHotCandidates(explicitDataDir, running, { host, port });
|
|
11100
11140
|
for (const inst of candidates) {
|
|
11101
11141
|
const store2 = new Store(inst.dataDir);
|
|
11102
11142
|
const adminKey = process.env.ADMIN_API_KEY ?? store2.loadAdminKey();
|
|
@@ -11113,18 +11153,36 @@ async function linkNode(opts) {
|
|
|
11113
11153
|
nodeId,
|
|
11114
11154
|
label: opts.label
|
|
11115
11155
|
});
|
|
11116
|
-
|
|
11117
|
-
|
|
11118
|
-
|
|
11119
|
-
|
|
11120
|
-
|
|
11156
|
+
try {
|
|
11157
|
+
store.saveFleetCredential({
|
|
11158
|
+
...cred,
|
|
11159
|
+
label: opts.label ?? cred.label,
|
|
11160
|
+
enrolledAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
11161
|
+
});
|
|
11162
|
+
} catch (e) {
|
|
11163
|
+
const err = e;
|
|
11164
|
+
if (err.code === "EACCES" || err.code === "EPERM") {
|
|
11165
|
+
throw new Error(
|
|
11166
|
+
`\u65E0\u6CD5\u5199\u5165\u6570\u636E\u76EE\u5F55 ${dataDir}\uFF08${err.code}: ${err.message}\uFF09
|
|
11167
|
+
\u8BE5\u76EE\u5F55\u5F53\u524D\u7528\u6237\u6CA1\u6709\u5199\u6743\u9650\u3002\u4E24\u79CD\u6539\u6CD5\uFF1A
|
|
11168
|
+
1) \u53BB\u6389 --data-dir\uFF0C\u8BA9 link \u81EA\u52A8\u53D1\u73B0\u672C\u673A\u8FD0\u884C\u7684\u8282\u70B9\uFF08\u63A8\u8350\uFF09\uFF1B
|
|
11169
|
+
2) \u7528\u5F53\u524D\u7528\u6237\u53EF\u5199\u7684\u76EE\u5F55\uFF0C\u672C\u5E73\u53F0\u5B89\u88C5\u811A\u672C\u9ED8\u8BA4\uFF1A${installDataDirHint()}
|
|
11170
|
+
\uFF08\u63A5\u5165\u7801\u4E00\u6B21\u6027\uFF0C\u9700\u8981\u91CD\u65B0\u751F\u6210\uFF09`
|
|
11171
|
+
);
|
|
11172
|
+
}
|
|
11173
|
+
throw e;
|
|
11174
|
+
}
|
|
11175
|
+
const otherRunningDirs = [
|
|
11176
|
+
...new Set(running.map((r) => r.dataDir).filter((d) => d !== dataDir))
|
|
11177
|
+
];
|
|
11121
11178
|
return {
|
|
11122
11179
|
mode: "saved",
|
|
11123
11180
|
nodeId,
|
|
11124
11181
|
gatewayUrl: cred.gatewayUrl,
|
|
11125
11182
|
label: opts.label,
|
|
11126
11183
|
dataDir,
|
|
11127
|
-
explicitDataDir: Boolean(explicitDataDir)
|
|
11184
|
+
explicitDataDir: Boolean(explicitDataDir),
|
|
11185
|
+
runningServiceDirs: otherRunningDirs
|
|
11128
11186
|
};
|
|
11129
11187
|
}
|
|
11130
11188
|
function printLinkHelp() {
|
|
@@ -11166,13 +11224,21 @@ async function runLinkCommand(argv) {
|
|
|
11166
11224
|
cliLog(` \u7F51\u5173: ${r.gatewayUrl ?? "\uFF08\u672A\u4E0B\u53D1\uFF09"}`);
|
|
11167
11225
|
cliLog(` \u6570\u636E\u76EE\u5F55: ${r.dataDir}`);
|
|
11168
11226
|
cliLog(" \u4E0B\u6B21\u542F\u52A8 server \u5373\u81EA\u52A8\u63A5\u5165\uFF1B\u6216\u8FD0\u884C zqagent serve \u5E38\u9A7B\u4E3A\u8282\u70B9\u3002");
|
|
11169
|
-
if (
|
|
11227
|
+
if (r.runningServiceDirs.length > 0) {
|
|
11228
|
+
cliLog("");
|
|
11229
|
+
cliLog("\u26A0\uFE0F \u672C\u673A\u6709\u6B63\u5728\u8FD0\u884C\u7684\u8282\u70B9\uFF0C\u4F46\u6570\u636E\u76EE\u5F55\u4E0E\u672C\u6B21\u5199\u5165\u7684\u4E0D\u4E00\u81F4\uFF1A");
|
|
11230
|
+
cliLog(` \u672C\u6B21\u5199\u5165: ${r.dataDir}`);
|
|
11231
|
+
for (const d of r.runningServiceDirs) cliLog(` \u670D\u52A1\u4F7F\u7528: ${d}`);
|
|
11232
|
+
cliLog(" \u6B63\u5728\u8FD0\u884C\u7684\u670D\u52A1\u8BFB\u4E0D\u5230\u8FD9\u4EFD\u51ED\u636E\uFF0CHub \u4F1A\u4E00\u76F4\u663E\u793A\u672A\u63A5\u5165\u3002");
|
|
11233
|
+
cliLog(" \u8BF7\u786E\u8BA4\u670D\u52A1\u7684\u6570\u636E\u76EE\u5F55\u540E\u91CD\u65B0\u6267\u884C\uFF08\u63A5\u5165\u7801\u4E00\u6B21\u6027\uFF0C\u9700\u8981\u91CD\u65B0\u751F\u6210\uFF09\uFF1A");
|
|
11234
|
+
cliLog(` zqagent link --hub <Hub\u5730\u5740> --code <\u65B0\u63A5\u5165\u7801> --data-dir "${r.runningServiceDirs[0]}"`);
|
|
11235
|
+
} else if (!r.explicitDataDir) {
|
|
11170
11236
|
cliLog("");
|
|
11171
11237
|
cliLog("\u26A0\uFE0F \u672A\u6307\u5B9A --data-dir\uFF0C\u51ED\u636E\u5199\u5165\u4E86\u5F53\u524D\u76EE\u5F55\u4E0B\u7684 .zqagent_data\u3002");
|
|
11172
11238
|
cliLog(" \u82E5\u672C\u673A\u670D\u52A1\u662F\u7531\u5B89\u88C5\u811A\u672C\uFF08systemd / launchd\uFF09\u542F\u52A8\u7684\uFF0C\u5B83\u8BFB\u4E0D\u5230\u8FD9\u4EFD\u51ED\u636E\uFF0C");
|
|
11173
11239
|
cliLog(" Hub \u4F1A\u4E00\u76F4\u663E\u793A\u672A\u5728\u7EBF\u3002\u8BF7\u7528\u670D\u52A1\u7684\u6570\u636E\u76EE\u5F55\u91CD\u65B0\u6267\u884C\uFF1A");
|
|
11174
11240
|
cliLog(" zqagent link --hub <Hub\u5730\u5740> --code <\u65B0\u63A5\u5165\u7801> --data-dir <\u670D\u52A1\u6570\u636E\u76EE\u5F55>");
|
|
11175
|
-
cliLog(
|
|
11241
|
+
cliLog(` \uFF08\u672C\u5E73\u53F0\u5B89\u88C5\u811A\u672C\u9ED8\u8BA4\uFF1A${installDataDirHint()}\uFF1B\u63A5\u5165\u7801\u4E00\u6B21\u6027\uFF0C\u9700\u8981\u91CD\u65B0\u751F\u6210\uFF09`);
|
|
11176
11242
|
}
|
|
11177
11243
|
}
|
|
11178
11244
|
return true;
|
|
@@ -12023,11 +12089,11 @@ function isAffirmative(answer) {
|
|
|
12023
12089
|
return /^(yes|approve|同意|批准|允许|确定|可以|好的|确认)/.test(a);
|
|
12024
12090
|
}
|
|
12025
12091
|
function defer() {
|
|
12026
|
-
let
|
|
12092
|
+
let resolve24;
|
|
12027
12093
|
const promise = new Promise((r) => {
|
|
12028
|
-
|
|
12094
|
+
resolve24 = r;
|
|
12029
12095
|
});
|
|
12030
|
-
return { promise, resolve:
|
|
12096
|
+
return { promise, resolve: resolve24 };
|
|
12031
12097
|
}
|
|
12032
12098
|
var SessionManager = class {
|
|
12033
12099
|
constructor(store, approvalTimeoutMs = APPROVAL_TIMEOUT_MS, opts = {}) {
|
|
@@ -12599,11 +12665,11 @@ data: ${JSON.stringify({ sessionId, seq: entry.seq, ts: entry.ts, data: entry.da
|
|
|
12599
12665
|
status: "pending",
|
|
12600
12666
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
12601
12667
|
};
|
|
12602
|
-
const { promise, resolve:
|
|
12668
|
+
const { promise, resolve: resolve24 } = defer();
|
|
12603
12669
|
const timer = setTimeout(() => {
|
|
12604
12670
|
this._recycleApproval(rt, id);
|
|
12605
12671
|
}, this.approvalTimeoutMs);
|
|
12606
|
-
rt.pendingApprovals.set(id, { promise, resolve:
|
|
12672
|
+
rt.pendingApprovals.set(id, { promise, resolve: resolve24, record, timer });
|
|
12607
12673
|
rt.approvals.set(id, record);
|
|
12608
12674
|
this._setStatus(rt, "waiting_approval");
|
|
12609
12675
|
this._persist(rt);
|
|
@@ -12681,11 +12747,11 @@ data: ${JSON.stringify({ sessionId, seq: entry.seq, ts: entry.ts, data: entry.da
|
|
|
12681
12747
|
status: "pending",
|
|
12682
12748
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
12683
12749
|
};
|
|
12684
|
-
const { promise, resolve:
|
|
12750
|
+
const { promise, resolve: resolve24 } = defer();
|
|
12685
12751
|
const timer = setTimeout(() => {
|
|
12686
12752
|
this._recycleQuestion(rt, qid);
|
|
12687
12753
|
}, this.approvalTimeoutMs);
|
|
12688
|
-
rt.pendingQuestions.set(qid, { promise, resolve:
|
|
12754
|
+
rt.pendingQuestions.set(qid, { promise, resolve: resolve24, record, timer });
|
|
12689
12755
|
rt.questions.set(qid, record);
|
|
12690
12756
|
this._setStatus(rt, "waiting_question");
|
|
12691
12757
|
this._persist(rt);
|
|
@@ -12994,7 +13060,7 @@ data: ${JSON.stringify(entry.data)}
|
|
|
12994
13060
|
if (rt.mcpReady) {
|
|
12995
13061
|
await Promise.race([
|
|
12996
13062
|
rt.mcpReady,
|
|
12997
|
-
new Promise((
|
|
13063
|
+
new Promise((resolve24) => setTimeout(resolve24, 15e3))
|
|
12998
13064
|
]).catch(() => void 0);
|
|
12999
13065
|
}
|
|
13000
13066
|
for await (const event of gen) {
|
|
@@ -13579,7 +13645,7 @@ function buildNodeInfo(store, opts) {
|
|
|
13579
13645
|
nodeId: opts.nodeId ?? ensureNodeId2(store),
|
|
13580
13646
|
platform: process.platform,
|
|
13581
13647
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
13582
|
-
version: "0.2.
|
|
13648
|
+
version: "0.2.10",
|
|
13583
13649
|
admin: opts.admin,
|
|
13584
13650
|
projects: opts.projects
|
|
13585
13651
|
};
|
|
@@ -14572,7 +14638,7 @@ function buildNodeHost(store, manager, diskPath) {
|
|
|
14572
14638
|
arch: process.arch,
|
|
14573
14639
|
release: os6.release(),
|
|
14574
14640
|
uptimeSec: Math.round(os6.uptime()),
|
|
14575
|
-
version: "0.2.
|
|
14641
|
+
version: "0.2.10",
|
|
14576
14642
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
14577
14643
|
cpu: {
|
|
14578
14644
|
count: cpus2.length,
|
|
@@ -14616,7 +14682,7 @@ function saveNotifications(tenant, secretBox, notifications) {
|
|
|
14616
14682
|
var API_PREFIX = "/api/v1";
|
|
14617
14683
|
var MAX_BODY_BYTES = 10 * 1024 * 1024;
|
|
14618
14684
|
function readBody(req2) {
|
|
14619
|
-
return new Promise((
|
|
14685
|
+
return new Promise((resolve24, reject) => {
|
|
14620
14686
|
const chunks = [];
|
|
14621
14687
|
let size = 0;
|
|
14622
14688
|
req2.on("data", (c) => {
|
|
@@ -14629,9 +14695,9 @@ function readBody(req2) {
|
|
|
14629
14695
|
chunks.push(c);
|
|
14630
14696
|
});
|
|
14631
14697
|
req2.on("end", () => {
|
|
14632
|
-
if (chunks.length === 0) return
|
|
14698
|
+
if (chunks.length === 0) return resolve24(void 0);
|
|
14633
14699
|
try {
|
|
14634
|
-
|
|
14700
|
+
resolve24(JSON.parse(Buffer.concat(chunks).toString("utf-8")));
|
|
14635
14701
|
} catch {
|
|
14636
14702
|
reject(new ApiError(400, "bad_request", "\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON"));
|
|
14637
14703
|
}
|
|
@@ -15147,8 +15213,18 @@ function createApp(store, manager, opts = {}) {
|
|
|
15147
15213
|
applyProvidersPatch(tenant, raw);
|
|
15148
15214
|
if (typeof raw.workspaceRoot === "string") {
|
|
15149
15215
|
const ws = raw.workspaceRoot.trim();
|
|
15150
|
-
|
|
15151
|
-
|
|
15216
|
+
const next = ws ? path29.resolve(ws) : void 0;
|
|
15217
|
+
if (tenant.workspaceRoot) {
|
|
15218
|
+
if (next !== tenant.workspaceRoot) {
|
|
15219
|
+
throw new ApiError(
|
|
15220
|
+
409,
|
|
15221
|
+
"workspace_locked",
|
|
15222
|
+
"\u8BE5\u9879\u76EE\u5DF2\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u4E0D\u80FD\u518D\u4FEE\u6539"
|
|
15223
|
+
);
|
|
15224
|
+
}
|
|
15225
|
+
} else if (next) {
|
|
15226
|
+
tenant.workspaceRoot = next;
|
|
15227
|
+
}
|
|
15152
15228
|
}
|
|
15153
15229
|
if (typeof raw.name === "string" && raw.name.trim()) {
|
|
15154
15230
|
tenant.name = raw.name.trim();
|
|
@@ -16124,7 +16200,7 @@ function createApp(store, manager, opts = {}) {
|
|
|
16124
16200
|
json(res, 200, {
|
|
16125
16201
|
status: "ok",
|
|
16126
16202
|
// 版本让运维/探针能确认线上跑的是哪个构建(更新与回滚据此判断)
|
|
16127
|
-
version: "0.2.
|
|
16203
|
+
version: "0.2.10",
|
|
16128
16204
|
features: { mcp: hasServerMcpConfig() }
|
|
16129
16205
|
});
|
|
16130
16206
|
return;
|
|
@@ -16240,8 +16316,8 @@ async function cachedFetchModels(baseURL, apiKey) {
|
|
|
16240
16316
|
try {
|
|
16241
16317
|
result = await Promise.race([
|
|
16242
16318
|
fetchModels(baseURL, apiKey),
|
|
16243
|
-
new Promise((
|
|
16244
|
-
const t = setTimeout(() =>
|
|
16319
|
+
new Promise((resolve24) => {
|
|
16320
|
+
const t = setTimeout(() => resolve24(null), MODEL_FETCH_TIMEOUT_MS);
|
|
16245
16321
|
t.unref?.();
|
|
16246
16322
|
})
|
|
16247
16323
|
]);
|
|
@@ -16266,8 +16342,8 @@ async function cachedFetchModelsEnriched(baseURL, apiKey, preferred) {
|
|
|
16266
16342
|
if (!target) return r;
|
|
16267
16343
|
const ctx = await Promise.race([
|
|
16268
16344
|
fetchModelContext(baseURL, apiKey, target),
|
|
16269
|
-
new Promise((
|
|
16270
|
-
const t = setTimeout(() =>
|
|
16345
|
+
new Promise((resolve24) => {
|
|
16346
|
+
const t = setTimeout(() => resolve24(void 0), MODEL_FETCH_TIMEOUT_MS);
|
|
16271
16347
|
t.unref?.();
|
|
16272
16348
|
})
|
|
16273
16349
|
]);
|
|
@@ -17396,13 +17472,13 @@ var EVENT_FLUSH_MAX_EVENTS = 60;
|
|
|
17396
17472
|
var EVENT_FLUSH_MAX_BYTES = 200 * 1024;
|
|
17397
17473
|
var LOOP_LAG_WARN_MS = 2e3;
|
|
17398
17474
|
function withTimeout(p, ms) {
|
|
17399
|
-
return new Promise((
|
|
17475
|
+
return new Promise((resolve24, reject) => {
|
|
17400
17476
|
const timer = setTimeout(() => reject(new Error(`\u5B50\u6307\u4EE4\u8D85\u65F6\uFF08${ms}ms\uFF09`)), ms);
|
|
17401
17477
|
timer.unref?.();
|
|
17402
17478
|
p.then(
|
|
17403
17479
|
(v) => {
|
|
17404
17480
|
clearTimeout(timer);
|
|
17405
|
-
|
|
17481
|
+
resolve24(v);
|
|
17406
17482
|
},
|
|
17407
17483
|
(e) => {
|
|
17408
17484
|
clearTimeout(timer);
|
|
@@ -17762,7 +17838,7 @@ var FleetNodeBridge = class {
|
|
|
17762
17838
|
label: this.opts.deps.store.loadNodeLabel() ?? void 0,
|
|
17763
17839
|
platform: process.platform,
|
|
17764
17840
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
17765
|
-
version: "0.2.
|
|
17841
|
+
version: "0.2.10",
|
|
17766
17842
|
ip: primaryIp()
|
|
17767
17843
|
};
|
|
17768
17844
|
}
|
|
@@ -17817,7 +17893,7 @@ var FleetNodeBridge = class {
|
|
|
17817
17893
|
label: this.opts.deps.store.loadNodeLabel() ?? void 0,
|
|
17818
17894
|
platform: process.platform,
|
|
17819
17895
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
17820
|
-
version: "0.2.
|
|
17896
|
+
version: "0.2.10",
|
|
17821
17897
|
ip: primaryIp(),
|
|
17822
17898
|
projects,
|
|
17823
17899
|
totals,
|
|
@@ -19294,8 +19370,10 @@ var PLATFORM_NAMES = {
|
|
|
19294
19370
|
linux: "linux",
|
|
19295
19371
|
win32: "windows"
|
|
19296
19372
|
};
|
|
19373
|
+
var LIBC_VARIANT = "";
|
|
19297
19374
|
function platformKey(platform = process.platform, arch = process.arch) {
|
|
19298
|
-
|
|
19375
|
+
const base = `${PLATFORM_NAMES[platform] ?? platform}-${arch}`;
|
|
19376
|
+
return LIBC_VARIANT ? `${base}-${LIBC_VARIANT}` : base;
|
|
19299
19377
|
}
|
|
19300
19378
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
19301
19379
|
function isRecord(v) {
|
|
@@ -19482,10 +19560,12 @@ function selfCheck(binPath, expectedVersion) {
|
|
|
19482
19560
|
// src/update/platform.ts
|
|
19483
19561
|
init_cjs_shims();
|
|
19484
19562
|
var fs27 = __toESM(require("fs"), 1);
|
|
19563
|
+
var os8 = __toESM(require("os"), 1);
|
|
19485
19564
|
var path33 = __toESM(require("path"), 1);
|
|
19565
|
+
var import_node_child_process6 = require("child_process");
|
|
19486
19566
|
var import_node_module3 = require("module");
|
|
19487
19567
|
function currentVersion() {
|
|
19488
|
-
const injected = "0.2.
|
|
19568
|
+
const injected = "0.2.10"?.trim();
|
|
19489
19569
|
if (injected) return injected;
|
|
19490
19570
|
try {
|
|
19491
19571
|
const req2 = (0, import_node_module3.createRequire)(importMetaUrl);
|
|
@@ -19501,6 +19581,7 @@ function isSeaRuntime() {
|
|
|
19501
19581
|
return base !== "node" && base !== "nodejs";
|
|
19502
19582
|
}
|
|
19503
19583
|
var DEFAULT_SERVICE_NAME = "zqagent";
|
|
19584
|
+
var DEFAULT_SERVICE_LABEL = "com.zqagent.node";
|
|
19504
19585
|
function serviceManagerFromCgroup(cgroup, serviceName = DEFAULT_SERVICE_NAME) {
|
|
19505
19586
|
const unitName = `${serviceName}.service`;
|
|
19506
19587
|
for (const line of cgroup.split("\n")) {
|
|
@@ -19511,7 +19592,46 @@ function serviceManagerFromCgroup(cgroup, serviceName = DEFAULT_SERVICE_NAME) {
|
|
|
19511
19592
|
}
|
|
19512
19593
|
return null;
|
|
19513
19594
|
}
|
|
19595
|
+
function launchdDomain() {
|
|
19596
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
19597
|
+
return uid === 0 ? "system" : `gui/${uid}`;
|
|
19598
|
+
}
|
|
19599
|
+
function launchdLabel() {
|
|
19600
|
+
return process.env.ZQAGENT_SERVICE_LABEL?.trim() || DEFAULT_SERVICE_LABEL;
|
|
19601
|
+
}
|
|
19602
|
+
function launchdPlistPath() {
|
|
19603
|
+
const label = launchdLabel();
|
|
19604
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
19605
|
+
if (uid === 0) return `/Library/LaunchDaemons/${label}.plist`;
|
|
19606
|
+
return path33.join(os8.homedir(), "Library", "LaunchAgents", `${label}.plist`);
|
|
19607
|
+
}
|
|
19608
|
+
function serviceManagerFromLaunchctl(output, pid, execPath, sea = true) {
|
|
19609
|
+
const pidMatch = /^\s*pid = (\d+)\s*$/m.exec(output);
|
|
19610
|
+
if (pidMatch && Number(pidMatch[1]) === pid) return "launchd";
|
|
19611
|
+
const program = /^\s*program = (.+?)\s*$/m.exec(output);
|
|
19612
|
+
if (program) {
|
|
19613
|
+
const shown = program[1].replace(/^"|"$/g, "");
|
|
19614
|
+
if (path33.resolve(shown) === path33.resolve(execPath)) return "launchd";
|
|
19615
|
+
}
|
|
19616
|
+
if (!sea && /^\s*state = /m.test(output)) return "launchd";
|
|
19617
|
+
return null;
|
|
19618
|
+
}
|
|
19619
|
+
function parseLaunchdEnvironment(xml) {
|
|
19620
|
+
const out = {};
|
|
19621
|
+
const marker = xml.indexOf("<key>EnvironmentVariables</key>");
|
|
19622
|
+
if (marker < 0) return out;
|
|
19623
|
+
const open = xml.indexOf("<dict>", marker);
|
|
19624
|
+
if (open < 0) return out;
|
|
19625
|
+
const close = xml.indexOf("</dict>", open);
|
|
19626
|
+
if (close < 0) return out;
|
|
19627
|
+
const body = xml.slice(open + "<dict>".length, close);
|
|
19628
|
+
for (const m of body.matchAll(/<key>([^<]+)<\/key>\s*<string>([^<]*)<\/string>/g)) {
|
|
19629
|
+
out[m[1]] = m[2];
|
|
19630
|
+
}
|
|
19631
|
+
return out;
|
|
19632
|
+
}
|
|
19514
19633
|
function detectServiceManager() {
|
|
19634
|
+
if (process.platform === "darwin") return detectLaunchd();
|
|
19515
19635
|
if (process.platform !== "linux") return null;
|
|
19516
19636
|
const serviceName = process.env.ZQAGENT_SERVICE_NAME?.trim() || DEFAULT_SERVICE_NAME;
|
|
19517
19637
|
try {
|
|
@@ -19523,11 +19643,71 @@ function detectServiceManager() {
|
|
|
19523
19643
|
return null;
|
|
19524
19644
|
}
|
|
19525
19645
|
}
|
|
19646
|
+
function detectLaunchd() {
|
|
19647
|
+
try {
|
|
19648
|
+
const res = (0, import_node_child_process6.spawnSync)(
|
|
19649
|
+
"launchctl",
|
|
19650
|
+
["print", `${launchdDomain()}/${launchdLabel()}`],
|
|
19651
|
+
{ encoding: "utf8", timeout: 3e3 }
|
|
19652
|
+
);
|
|
19653
|
+
if (res.status !== 0 || !res.stdout) return null;
|
|
19654
|
+
return serviceManagerFromLaunchctl(
|
|
19655
|
+
res.stdout,
|
|
19656
|
+
process.pid,
|
|
19657
|
+
process.execPath,
|
|
19658
|
+
isSeaRuntime()
|
|
19659
|
+
);
|
|
19660
|
+
} catch {
|
|
19661
|
+
return null;
|
|
19662
|
+
}
|
|
19663
|
+
}
|
|
19526
19664
|
function serviceManager() {
|
|
19527
19665
|
const v = process.env.ZQAGENT_SERVICE_MANAGER?.trim().toLowerCase();
|
|
19528
19666
|
if (v === "systemd" || v === "launchd") return v;
|
|
19529
19667
|
return detectServiceManager();
|
|
19530
19668
|
}
|
|
19669
|
+
function parseServiceEnvironment(raw) {
|
|
19670
|
+
const out = {};
|
|
19671
|
+
for (const token of raw.trim().split(/\s+/)) {
|
|
19672
|
+
const idx = token.indexOf("=");
|
|
19673
|
+
if (idx > 0) out[token.slice(0, idx)] = token.slice(idx + 1);
|
|
19674
|
+
}
|
|
19675
|
+
return out;
|
|
19676
|
+
}
|
|
19677
|
+
var cachedServiceEnv = null;
|
|
19678
|
+
function readServiceEnvironment() {
|
|
19679
|
+
const serviceName = process.env.ZQAGENT_SERVICE_NAME?.trim() || DEFAULT_SERVICE_NAME;
|
|
19680
|
+
try {
|
|
19681
|
+
const res = (0, import_node_child_process6.spawnSync)(
|
|
19682
|
+
"systemctl",
|
|
19683
|
+
["show", serviceName, "--property=Environment", "--value", "--no-pager"],
|
|
19684
|
+
{ encoding: "utf8", timeout: 3e3 }
|
|
19685
|
+
);
|
|
19686
|
+
if (res.status !== 0 || !res.stdout) return {};
|
|
19687
|
+
return parseServiceEnvironment(res.stdout);
|
|
19688
|
+
} catch {
|
|
19689
|
+
return {};
|
|
19690
|
+
}
|
|
19691
|
+
}
|
|
19692
|
+
function serviceEnvValue(key) {
|
|
19693
|
+
if (process.platform === "darwin") {
|
|
19694
|
+
if (serviceManager() !== "launchd") return void 0;
|
|
19695
|
+
cachedLaunchdEnv ??= readLaunchdEnvironment();
|
|
19696
|
+
return cachedLaunchdEnv[key];
|
|
19697
|
+
}
|
|
19698
|
+
if (process.platform !== "linux") return void 0;
|
|
19699
|
+
if (serviceManager() !== "systemd") return void 0;
|
|
19700
|
+
cachedServiceEnv ??= readServiceEnvironment();
|
|
19701
|
+
return cachedServiceEnv[key];
|
|
19702
|
+
}
|
|
19703
|
+
var cachedLaunchdEnv = null;
|
|
19704
|
+
function readLaunchdEnvironment() {
|
|
19705
|
+
try {
|
|
19706
|
+
return parseLaunchdEnvironment(fs27.readFileSync(launchdPlistPath(), "utf8"));
|
|
19707
|
+
} catch {
|
|
19708
|
+
return {};
|
|
19709
|
+
}
|
|
19710
|
+
}
|
|
19531
19711
|
function selfUpdateCapability(hasPublicKey) {
|
|
19532
19712
|
if (!isSeaRuntime()) {
|
|
19533
19713
|
return {
|
|
@@ -19680,7 +19860,9 @@ function readRollbackTarget(dataDir) {
|
|
|
19680
19860
|
var DEFAULT_BASE = "https://agent.cd-zq.com/downloads/zqagent";
|
|
19681
19861
|
function env(key) {
|
|
19682
19862
|
const v = process.env[key]?.trim();
|
|
19683
|
-
|
|
19863
|
+
if (v) return v;
|
|
19864
|
+
const fromService = serviceEnvValue(key)?.trim();
|
|
19865
|
+
return fromService ? fromService : void 0;
|
|
19684
19866
|
}
|
|
19685
19867
|
function num(key, fallback) {
|
|
19686
19868
|
const n = Number(env(key));
|
|
@@ -19717,7 +19899,7 @@ var UpdateController = class {
|
|
|
19717
19899
|
return parsePublicKey(env("ZQAGENT_UPDATE_PUBKEY") ?? "");
|
|
19718
19900
|
}
|
|
19719
19901
|
get autoUpdateOff() {
|
|
19720
|
-
return
|
|
19902
|
+
return env("ZQAGENT_AUTO_UPDATE") === "0";
|
|
19721
19903
|
}
|
|
19722
19904
|
get enabled() {
|
|
19723
19905
|
return !this.autoUpdateOff && selfUpdateCapability(Boolean(this.publicKey)).ok;
|
|
@@ -19910,11 +20092,11 @@ var UpdateController = class {
|
|
|
19910
20092
|
const minUptime = num("ZQAGENT_UPDATE_MIN_UPTIME_MS", 10 * 60 * 1e3);
|
|
19911
20093
|
const idleMs = num("ZQAGENT_UPDATE_IDLE_MS", 60 * 1e3);
|
|
19912
20094
|
let idleSince = null;
|
|
19913
|
-
return new Promise((
|
|
20095
|
+
return new Promise((resolve24) => {
|
|
19914
20096
|
const timer = setInterval(() => {
|
|
19915
20097
|
if (this.stopped) {
|
|
19916
20098
|
clearInterval(timer);
|
|
19917
|
-
|
|
20099
|
+
resolve24(false);
|
|
19918
20100
|
return;
|
|
19919
20101
|
}
|
|
19920
20102
|
if (Date.now() - this.startedAt < minUptime || !this.opts.isIdle()) {
|
|
@@ -19924,7 +20106,7 @@ var UpdateController = class {
|
|
|
19924
20106
|
idleSince ??= Date.now();
|
|
19925
20107
|
if (Date.now() - idleSince >= idleMs) {
|
|
19926
20108
|
clearInterval(timer);
|
|
19927
|
-
|
|
20109
|
+
resolve24(true);
|
|
19928
20110
|
}
|
|
19929
20111
|
}, 1e3);
|
|
19930
20112
|
timer.unref();
|
|
@@ -20105,6 +20287,46 @@ function exitWhenOrphaned() {
|
|
|
20105
20287
|
}, 1500);
|
|
20106
20288
|
timer.unref();
|
|
20107
20289
|
}
|
|
20290
|
+
var PORT_FALLBACK_LIMIT = 20;
|
|
20291
|
+
function listenWithPortFallback(server, startPort, host, dataDir, limit = PORT_FALLBACK_LIMIT) {
|
|
20292
|
+
return new Promise((resolve24, reject) => {
|
|
20293
|
+
let attempts = 0;
|
|
20294
|
+
const tryListen = (port) => {
|
|
20295
|
+
server.removeAllListeners("listening");
|
|
20296
|
+
const onError = (err) => {
|
|
20297
|
+
if (err.code === "EADDRINUSE" && attempts < limit) {
|
|
20298
|
+
attempts += 1;
|
|
20299
|
+
const next = port + 1;
|
|
20300
|
+
console.warn(`[server] \u7AEF\u53E3 ${port} \u5DF2\u88AB\u5360\u7528\uFF08EADDRINUSE\uFF09\uFF0C\u5C1D\u8BD5 ${next} \u2026`);
|
|
20301
|
+
tryListen(next);
|
|
20302
|
+
return;
|
|
20303
|
+
}
|
|
20304
|
+
server.removeListener("error", onError);
|
|
20305
|
+
console.error(
|
|
20306
|
+
`[server] \u65E0\u6CD5\u76D1\u542C ${host}:${port}\uFF1A${err.message}` + (err.code === "EADDRINUSE" ? `\uFF08\u5DF2\u5C1D\u8BD5 ${attempts + 1} \u4E2A\u7AEF\u53E3\u5747\u88AB\u5360\u7528\uFF09` : "")
|
|
20307
|
+
);
|
|
20308
|
+
reject(err);
|
|
20309
|
+
};
|
|
20310
|
+
server.once("error", onError);
|
|
20311
|
+
server.listen(port, host, () => {
|
|
20312
|
+
server.removeListener("error", onError);
|
|
20313
|
+
const addr = server.address();
|
|
20314
|
+
const actualPort = typeof addr === "object" && addr !== null ? addr.port : port;
|
|
20315
|
+
if (actualPort !== startPort) {
|
|
20316
|
+
console.warn(`[server] \u5DF2\u6539\u7528\u7AEF\u53E3 ${actualPort}\uFF08\u539F\u5B9A ${startPort} \u88AB\u5360\u7528\uFF09`);
|
|
20317
|
+
}
|
|
20318
|
+
try {
|
|
20319
|
+
fs31.mkdirSync(dataDir, { recursive: true });
|
|
20320
|
+
fs31.writeFileSync(path37.join(dataDir, "server-port"), `${actualPort}
|
|
20321
|
+
`);
|
|
20322
|
+
} catch {
|
|
20323
|
+
}
|
|
20324
|
+
resolve24(actualPort);
|
|
20325
|
+
});
|
|
20326
|
+
};
|
|
20327
|
+
tryListen(startPort);
|
|
20328
|
+
});
|
|
20329
|
+
}
|
|
20108
20330
|
function startServer(opts = {}) {
|
|
20109
20331
|
const dataDir = path37.resolve(opts.dataDir ?? env2("DATA_DIR") ?? DEFAULT_DATA_DIR);
|
|
20110
20332
|
const port = opts.port ?? Number(env2("PORT") ?? 8787);
|
|
@@ -20330,11 +20552,11 @@ function startServer(opts = {}) {
|
|
|
20330
20552
|
server.timeout = 0;
|
|
20331
20553
|
server.keepAliveTimeout = 65e3;
|
|
20332
20554
|
server.headersTimeout = 66e3;
|
|
20333
|
-
const ready = new Promise((
|
|
20334
|
-
server
|
|
20555
|
+
const ready = new Promise((resolve24, reject) => {
|
|
20556
|
+
listenWithPortFallback(server, port, host, dataDir).then((actualPort) => {
|
|
20335
20557
|
const info = {
|
|
20336
20558
|
host,
|
|
20337
|
-
port,
|
|
20559
|
+
port: actualPort,
|
|
20338
20560
|
dataDir,
|
|
20339
20561
|
adminKey,
|
|
20340
20562
|
fleetNodeId: fleet ? fleet.getNodeId() : void 0,
|
|
@@ -20347,8 +20569,8 @@ function startServer(opts = {}) {
|
|
|
20347
20569
|
printReady(info, qq);
|
|
20348
20570
|
}
|
|
20349
20571
|
updater?.start();
|
|
20350
|
-
|
|
20351
|
-
});
|
|
20572
|
+
resolve24(info);
|
|
20573
|
+
}, reject);
|
|
20352
20574
|
});
|
|
20353
20575
|
return {
|
|
20354
20576
|
store,
|
|
@@ -20484,7 +20706,7 @@ async function runWizard(rl2, store, opts) {
|
|
|
20484
20706
|
}
|
|
20485
20707
|
async function askHidden(rl2, prompt) {
|
|
20486
20708
|
if (!process.stdin.isTTY) return (await rl2.question(prompt)).trim();
|
|
20487
|
-
return new Promise((
|
|
20709
|
+
return new Promise((resolve24) => {
|
|
20488
20710
|
const saved = process.stdin.listeners("data");
|
|
20489
20711
|
process.stdin.removeAllListeners("data");
|
|
20490
20712
|
cliWrite(prompt);
|
|
@@ -20506,13 +20728,13 @@ async function askHidden(rl2, prompt) {
|
|
|
20506
20728
|
if (ch === "\r" || ch === "\n") {
|
|
20507
20729
|
cleanup();
|
|
20508
20730
|
cliWrite("\n");
|
|
20509
|
-
|
|
20731
|
+
resolve24(buf);
|
|
20510
20732
|
return;
|
|
20511
20733
|
}
|
|
20512
20734
|
if (ch === "") {
|
|
20513
20735
|
cleanup();
|
|
20514
20736
|
cliWrite("\n");
|
|
20515
|
-
|
|
20737
|
+
resolve24("");
|
|
20516
20738
|
return;
|
|
20517
20739
|
}
|
|
20518
20740
|
if (ch === "\x7F" || ch === "\b") {
|
|
@@ -20701,7 +20923,7 @@ function updateSessionMetaFile(stateDir2, sessionId, patch) {
|
|
|
20701
20923
|
// src/cli/debug.ts
|
|
20702
20924
|
init_cjs_shims();
|
|
20703
20925
|
var fs33 = __toESM(require("fs"), 1);
|
|
20704
|
-
var
|
|
20926
|
+
var os9 = __toESM(require("os"), 1);
|
|
20705
20927
|
var path41 = __toESM(require("path"), 1);
|
|
20706
20928
|
var LOG_NAME = "zqagent-debug.log";
|
|
20707
20929
|
var TRUTHY = /^(1|true|yes|on)$/i;
|
|
@@ -20715,7 +20937,7 @@ function resolveLogFile() {
|
|
|
20715
20937
|
const explicit = process.env.ZQAGENT_DEBUG_LOG;
|
|
20716
20938
|
if (explicit) return path41.resolve(explicit);
|
|
20717
20939
|
const dir = process.env.ZQAGENT_DEBUG_DIR;
|
|
20718
|
-
return path41.join(dir ? path41.resolve(dir) :
|
|
20940
|
+
return path41.join(dir ? path41.resolve(dir) : os9.tmpdir(), LOG_NAME);
|
|
20719
20941
|
}
|
|
20720
20942
|
function enableDebug(argv = process.argv) {
|
|
20721
20943
|
if (enabled) return true;
|
|
@@ -21173,7 +21395,7 @@ function question(prompt) {
|
|
|
21173
21395
|
}
|
|
21174
21396
|
function readPassword(prompt) {
|
|
21175
21397
|
if (!process.stdin.isTTY) return question(prompt);
|
|
21176
|
-
return new Promise((
|
|
21398
|
+
return new Promise((resolve24) => {
|
|
21177
21399
|
const savedDataListeners = process.stdin.listeners("data");
|
|
21178
21400
|
process.stdin.removeAllListeners("data");
|
|
21179
21401
|
cliWrite(prompt);
|
|
@@ -21189,13 +21411,13 @@ function readPassword(prompt) {
|
|
|
21189
21411
|
if (ch === "\r" || ch === "\n") {
|
|
21190
21412
|
cleanup();
|
|
21191
21413
|
cliWrite("\n");
|
|
21192
|
-
|
|
21414
|
+
resolve24(buf);
|
|
21193
21415
|
return;
|
|
21194
21416
|
}
|
|
21195
21417
|
if (ch === "") {
|
|
21196
21418
|
cleanup();
|
|
21197
21419
|
cliWrite("\n");
|
|
21198
|
-
|
|
21420
|
+
resolve24("");
|
|
21199
21421
|
return;
|
|
21200
21422
|
}
|
|
21201
21423
|
if (ch === "\x7F" || ch === "\b") {
|
|
@@ -21630,7 +21852,7 @@ async function offerTerminalSetup(engine, canUseAgent) {
|
|
|
21630
21852
|
}
|
|
21631
21853
|
var KNOWN_SUBCOMMANDS = /* @__PURE__ */ new Set(["link", "serve", "update"]);
|
|
21632
21854
|
function cliVersion() {
|
|
21633
|
-
const env3 = "0.2.
|
|
21855
|
+
const env3 = "0.2.10"?.trim();
|
|
21634
21856
|
if (env3) return env3;
|
|
21635
21857
|
try {
|
|
21636
21858
|
const req2 = (0, import_module.createRequire)(importMetaUrl);
|