@zqagent/core 0.2.8 → 0.2.11
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/README.md +2 -0
- package/README.oss.en.md +1 -1
- package/README.oss.md +1 -1
- package/README.oss.zh-TW.md +1 -1
- package/dist/cli/index.cjs +733 -351
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +739 -357
- package/dist/cli/index.js.map +1 -1
- package/dist/server/index.cjs +167 -43
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +167 -43
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -5147,10 +5147,10 @@ var OpenAIProvider = class {
|
|
|
5147
5147
|
let timer;
|
|
5148
5148
|
try {
|
|
5149
5149
|
for (; ; ) {
|
|
5150
|
-
const idle = new Promise((
|
|
5150
|
+
const idle = new Promise((resolve19) => {
|
|
5151
5151
|
timer = setTimeout(() => {
|
|
5152
5152
|
onIdle();
|
|
5153
|
-
|
|
5153
|
+
resolve19({ timedOut: true });
|
|
5154
5154
|
}, idleMs);
|
|
5155
5155
|
});
|
|
5156
5156
|
const next = iter.next();
|
|
@@ -5778,12 +5778,12 @@ function makeSink(maxBuffer) {
|
|
|
5778
5778
|
};
|
|
5779
5779
|
}
|
|
5780
5780
|
function execAsync(file, argv, opts = {}) {
|
|
5781
|
-
return new Promise((
|
|
5781
|
+
return new Promise((resolve19) => {
|
|
5782
5782
|
const maxBuffer = opts.maxBuffer ?? DEFAULT_MAX_BUFFER;
|
|
5783
5783
|
const out = makeSink(maxBuffer);
|
|
5784
5784
|
const err = makeSink(maxBuffer);
|
|
5785
5785
|
if (opts.signal?.aborted) {
|
|
5786
|
-
|
|
5786
|
+
resolve19({
|
|
5787
5787
|
status: null,
|
|
5788
5788
|
stdout: Buffer.alloc(0),
|
|
5789
5789
|
stderr: Buffer.alloc(0),
|
|
@@ -5804,7 +5804,7 @@ function execAsync(file, argv, opts = {}) {
|
|
|
5804
5804
|
windowsHide: true
|
|
5805
5805
|
});
|
|
5806
5806
|
} catch (e) {
|
|
5807
|
-
|
|
5807
|
+
resolve19({
|
|
5808
5808
|
status: null,
|
|
5809
5809
|
stdout: Buffer.alloc(0),
|
|
5810
5810
|
stderr: Buffer.alloc(0),
|
|
@@ -5841,7 +5841,7 @@ function execAsync(file, argv, opts = {}) {
|
|
|
5841
5841
|
};
|
|
5842
5842
|
if (aborted) result.aborted = true;
|
|
5843
5843
|
if (spawnError) result.error = spawnError;
|
|
5844
|
-
|
|
5844
|
+
resolve19(result);
|
|
5845
5845
|
};
|
|
5846
5846
|
const killAndSettle = () => {
|
|
5847
5847
|
killTree(child.pid);
|
|
@@ -9840,11 +9840,11 @@ function isAffirmative(answer) {
|
|
|
9840
9840
|
return /^(yes|approve|同意|批准|允许|确定|可以|好的|确认)/.test(a);
|
|
9841
9841
|
}
|
|
9842
9842
|
function defer() {
|
|
9843
|
-
let
|
|
9843
|
+
let resolve19;
|
|
9844
9844
|
const promise = new Promise((r) => {
|
|
9845
|
-
|
|
9845
|
+
resolve19 = r;
|
|
9846
9846
|
});
|
|
9847
|
-
return { promise, resolve:
|
|
9847
|
+
return { promise, resolve: resolve19 };
|
|
9848
9848
|
}
|
|
9849
9849
|
var SessionManager = class {
|
|
9850
9850
|
constructor(store, approvalTimeoutMs = APPROVAL_TIMEOUT_MS, opts = {}) {
|
|
@@ -10416,11 +10416,11 @@ data: ${JSON.stringify({ sessionId, seq: entry.seq, ts: entry.ts, data: entry.da
|
|
|
10416
10416
|
status: "pending",
|
|
10417
10417
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
10418
10418
|
};
|
|
10419
|
-
const { promise, resolve:
|
|
10419
|
+
const { promise, resolve: resolve19 } = defer();
|
|
10420
10420
|
const timer = setTimeout(() => {
|
|
10421
10421
|
this._recycleApproval(rt, id);
|
|
10422
10422
|
}, this.approvalTimeoutMs);
|
|
10423
|
-
rt.pendingApprovals.set(id, { promise, resolve:
|
|
10423
|
+
rt.pendingApprovals.set(id, { promise, resolve: resolve19, record, timer });
|
|
10424
10424
|
rt.approvals.set(id, record);
|
|
10425
10425
|
this._setStatus(rt, "waiting_approval");
|
|
10426
10426
|
this._persist(rt);
|
|
@@ -10498,11 +10498,11 @@ data: ${JSON.stringify({ sessionId, seq: entry.seq, ts: entry.ts, data: entry.da
|
|
|
10498
10498
|
status: "pending",
|
|
10499
10499
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
10500
10500
|
};
|
|
10501
|
-
const { promise, resolve:
|
|
10501
|
+
const { promise, resolve: resolve19 } = defer();
|
|
10502
10502
|
const timer = setTimeout(() => {
|
|
10503
10503
|
this._recycleQuestion(rt, qid);
|
|
10504
10504
|
}, this.approvalTimeoutMs);
|
|
10505
|
-
rt.pendingQuestions.set(qid, { promise, resolve:
|
|
10505
|
+
rt.pendingQuestions.set(qid, { promise, resolve: resolve19, record, timer });
|
|
10506
10506
|
rt.questions.set(qid, record);
|
|
10507
10507
|
this._setStatus(rt, "waiting_question");
|
|
10508
10508
|
this._persist(rt);
|
|
@@ -10811,7 +10811,7 @@ data: ${JSON.stringify(entry.data)}
|
|
|
10811
10811
|
if (rt.mcpReady) {
|
|
10812
10812
|
await Promise.race([
|
|
10813
10813
|
rt.mcpReady,
|
|
10814
|
-
new Promise((
|
|
10814
|
+
new Promise((resolve19) => setTimeout(resolve19, 15e3))
|
|
10815
10815
|
]).catch(() => void 0);
|
|
10816
10816
|
}
|
|
10817
10817
|
for await (const event of gen) {
|
|
@@ -11396,7 +11396,7 @@ function buildNodeInfo(store, opts) {
|
|
|
11396
11396
|
nodeId: opts.nodeId ?? ensureNodeId(store),
|
|
11397
11397
|
platform: process.platform,
|
|
11398
11398
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
11399
|
-
version: "0.2.
|
|
11399
|
+
version: "0.2.11",
|
|
11400
11400
|
admin: opts.admin,
|
|
11401
11401
|
projects: opts.projects
|
|
11402
11402
|
};
|
|
@@ -12389,7 +12389,7 @@ function buildNodeHost(store, manager, diskPath) {
|
|
|
12389
12389
|
arch: process.arch,
|
|
12390
12390
|
release: os6.release(),
|
|
12391
12391
|
uptimeSec: Math.round(os6.uptime()),
|
|
12392
|
-
version: "0.2.
|
|
12392
|
+
version: "0.2.11",
|
|
12393
12393
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
12394
12394
|
cpu: {
|
|
12395
12395
|
count: cpus2.length,
|
|
@@ -12433,7 +12433,7 @@ function saveNotifications(tenant, secretBox, notifications) {
|
|
|
12433
12433
|
var API_PREFIX = "/api/v1";
|
|
12434
12434
|
var MAX_BODY_BYTES = 10 * 1024 * 1024;
|
|
12435
12435
|
function readBody(req2) {
|
|
12436
|
-
return new Promise((
|
|
12436
|
+
return new Promise((resolve19, reject) => {
|
|
12437
12437
|
const chunks = [];
|
|
12438
12438
|
let size = 0;
|
|
12439
12439
|
req2.on("data", (c) => {
|
|
@@ -12446,9 +12446,9 @@ function readBody(req2) {
|
|
|
12446
12446
|
chunks.push(c);
|
|
12447
12447
|
});
|
|
12448
12448
|
req2.on("end", () => {
|
|
12449
|
-
if (chunks.length === 0) return
|
|
12449
|
+
if (chunks.length === 0) return resolve19(void 0);
|
|
12450
12450
|
try {
|
|
12451
|
-
|
|
12451
|
+
resolve19(JSON.parse(Buffer.concat(chunks).toString("utf-8")));
|
|
12452
12452
|
} catch {
|
|
12453
12453
|
reject(new ApiError(400, "bad_request", "\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON"));
|
|
12454
12454
|
}
|
|
@@ -12964,8 +12964,18 @@ function createApp(store, manager, opts = {}) {
|
|
|
12964
12964
|
applyProvidersPatch(tenant, raw);
|
|
12965
12965
|
if (typeof raw.workspaceRoot === "string") {
|
|
12966
12966
|
const ws = raw.workspaceRoot.trim();
|
|
12967
|
-
|
|
12968
|
-
|
|
12967
|
+
const next = ws ? path26.resolve(ws) : void 0;
|
|
12968
|
+
if (tenant.workspaceRoot) {
|
|
12969
|
+
if (next !== tenant.workspaceRoot) {
|
|
12970
|
+
throw new ApiError(
|
|
12971
|
+
409,
|
|
12972
|
+
"workspace_locked",
|
|
12973
|
+
"\u8BE5\u9879\u76EE\u5DF2\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u4E0D\u80FD\u518D\u4FEE\u6539"
|
|
12974
|
+
);
|
|
12975
|
+
}
|
|
12976
|
+
} else if (next) {
|
|
12977
|
+
tenant.workspaceRoot = next;
|
|
12978
|
+
}
|
|
12969
12979
|
}
|
|
12970
12980
|
if (typeof raw.name === "string" && raw.name.trim()) {
|
|
12971
12981
|
tenant.name = raw.name.trim();
|
|
@@ -13941,7 +13951,7 @@ function createApp(store, manager, opts = {}) {
|
|
|
13941
13951
|
json(res, 200, {
|
|
13942
13952
|
status: "ok",
|
|
13943
13953
|
// 版本让运维/探针能确认线上跑的是哪个构建(更新与回滚据此判断)
|
|
13944
|
-
version: "0.2.
|
|
13954
|
+
version: "0.2.11",
|
|
13945
13955
|
features: { mcp: hasServerMcpConfig() }
|
|
13946
13956
|
});
|
|
13947
13957
|
return;
|
|
@@ -14057,8 +14067,8 @@ async function cachedFetchModels(baseURL, apiKey) {
|
|
|
14057
14067
|
try {
|
|
14058
14068
|
result = await Promise.race([
|
|
14059
14069
|
fetchModels(baseURL, apiKey),
|
|
14060
|
-
new Promise((
|
|
14061
|
-
const t = setTimeout(() =>
|
|
14070
|
+
new Promise((resolve19) => {
|
|
14071
|
+
const t = setTimeout(() => resolve19(null), MODEL_FETCH_TIMEOUT_MS);
|
|
14062
14072
|
t.unref?.();
|
|
14063
14073
|
})
|
|
14064
14074
|
]);
|
|
@@ -14083,8 +14093,8 @@ async function cachedFetchModelsEnriched(baseURL, apiKey, preferred) {
|
|
|
14083
14093
|
if (!target) return r;
|
|
14084
14094
|
const ctx = await Promise.race([
|
|
14085
14095
|
fetchModelContext(baseURL, apiKey, target),
|
|
14086
|
-
new Promise((
|
|
14087
|
-
const t = setTimeout(() =>
|
|
14096
|
+
new Promise((resolve19) => {
|
|
14097
|
+
const t = setTimeout(() => resolve19(void 0), MODEL_FETCH_TIMEOUT_MS);
|
|
14088
14098
|
t.unref?.();
|
|
14089
14099
|
})
|
|
14090
14100
|
]);
|
|
@@ -15278,13 +15288,13 @@ var EVENT_FLUSH_MAX_EVENTS = 60;
|
|
|
15278
15288
|
var EVENT_FLUSH_MAX_BYTES = 200 * 1024;
|
|
15279
15289
|
var LOOP_LAG_WARN_MS = 2e3;
|
|
15280
15290
|
function withTimeout(p, ms) {
|
|
15281
|
-
return new Promise((
|
|
15291
|
+
return new Promise((resolve19, reject) => {
|
|
15282
15292
|
const timer = setTimeout(() => reject(new Error(`\u5B50\u6307\u4EE4\u8D85\u65F6\uFF08${ms}ms\uFF09`)), ms);
|
|
15283
15293
|
timer.unref?.();
|
|
15284
15294
|
p.then(
|
|
15285
15295
|
(v) => {
|
|
15286
15296
|
clearTimeout(timer);
|
|
15287
|
-
|
|
15297
|
+
resolve19(v);
|
|
15288
15298
|
},
|
|
15289
15299
|
(e) => {
|
|
15290
15300
|
clearTimeout(timer);
|
|
@@ -15644,7 +15654,7 @@ var FleetNodeBridge = class {
|
|
|
15644
15654
|
label: this.opts.deps.store.loadNodeLabel() ?? void 0,
|
|
15645
15655
|
platform: process.platform,
|
|
15646
15656
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
15647
|
-
version: "0.2.
|
|
15657
|
+
version: "0.2.11",
|
|
15648
15658
|
ip: primaryIp()
|
|
15649
15659
|
};
|
|
15650
15660
|
}
|
|
@@ -15699,7 +15709,7 @@ var FleetNodeBridge = class {
|
|
|
15699
15709
|
label: this.opts.deps.store.loadNodeLabel() ?? void 0,
|
|
15700
15710
|
platform: process.platform,
|
|
15701
15711
|
mode: process.env.NODE_MODE ?? "standalone",
|
|
15702
|
-
version: "0.2.
|
|
15712
|
+
version: "0.2.11",
|
|
15703
15713
|
ip: primaryIp(),
|
|
15704
15714
|
projects,
|
|
15705
15715
|
totals,
|
|
@@ -17228,8 +17238,10 @@ var PLATFORM_NAMES = {
|
|
|
17228
17238
|
linux: "linux",
|
|
17229
17239
|
win32: "windows"
|
|
17230
17240
|
};
|
|
17241
|
+
var LIBC_VARIANT = "";
|
|
17231
17242
|
function platformKey(platform = process.platform, arch = process.arch) {
|
|
17232
|
-
|
|
17243
|
+
const base = `${PLATFORM_NAMES[platform] ?? platform}-${arch}`;
|
|
17244
|
+
return LIBC_VARIANT ? `${base}-${LIBC_VARIANT}` : base;
|
|
17233
17245
|
}
|
|
17234
17246
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
17235
17247
|
function isRecord(v) {
|
|
@@ -17416,11 +17428,12 @@ function selfCheck(binPath, expectedVersion) {
|
|
|
17416
17428
|
// src/update/platform.ts
|
|
17417
17429
|
init_esm_shims();
|
|
17418
17430
|
import * as fs25 from "fs";
|
|
17431
|
+
import * as os8 from "os";
|
|
17419
17432
|
import * as path30 from "path";
|
|
17420
17433
|
import { spawnSync as spawnSync3 } from "child_process";
|
|
17421
17434
|
import { createRequire as createRequire3 } from "module";
|
|
17422
17435
|
function currentVersion() {
|
|
17423
|
-
const injected = "0.2.
|
|
17436
|
+
const injected = "0.2.11"?.trim();
|
|
17424
17437
|
if (injected) return injected;
|
|
17425
17438
|
try {
|
|
17426
17439
|
const req2 = createRequire3(import.meta.url);
|
|
@@ -17436,6 +17449,7 @@ function isSeaRuntime() {
|
|
|
17436
17449
|
return base !== "node" && base !== "nodejs";
|
|
17437
17450
|
}
|
|
17438
17451
|
var DEFAULT_SERVICE_NAME = "zqagent";
|
|
17452
|
+
var DEFAULT_SERVICE_LABEL = "com.zqagent.node";
|
|
17439
17453
|
function serviceManagerFromCgroup(cgroup, serviceName = DEFAULT_SERVICE_NAME) {
|
|
17440
17454
|
const unitName = `${serviceName}.service`;
|
|
17441
17455
|
for (const line of cgroup.split("\n")) {
|
|
@@ -17446,7 +17460,46 @@ function serviceManagerFromCgroup(cgroup, serviceName = DEFAULT_SERVICE_NAME) {
|
|
|
17446
17460
|
}
|
|
17447
17461
|
return null;
|
|
17448
17462
|
}
|
|
17463
|
+
function launchdDomain() {
|
|
17464
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
17465
|
+
return uid === 0 ? "system" : `gui/${uid}`;
|
|
17466
|
+
}
|
|
17467
|
+
function launchdLabel() {
|
|
17468
|
+
return process.env.ZQAGENT_SERVICE_LABEL?.trim() || DEFAULT_SERVICE_LABEL;
|
|
17469
|
+
}
|
|
17470
|
+
function launchdPlistPath() {
|
|
17471
|
+
const label2 = launchdLabel();
|
|
17472
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
17473
|
+
if (uid === 0) return `/Library/LaunchDaemons/${label2}.plist`;
|
|
17474
|
+
return path30.join(os8.homedir(), "Library", "LaunchAgents", `${label2}.plist`);
|
|
17475
|
+
}
|
|
17476
|
+
function serviceManagerFromLaunchctl(output, pid, execPath, sea = true) {
|
|
17477
|
+
const pidMatch = /^\s*pid = (\d+)\s*$/m.exec(output);
|
|
17478
|
+
if (pidMatch && Number(pidMatch[1]) === pid) return "launchd";
|
|
17479
|
+
const program = /^\s*program = (.+?)\s*$/m.exec(output);
|
|
17480
|
+
if (program) {
|
|
17481
|
+
const shown = program[1].replace(/^"|"$/g, "");
|
|
17482
|
+
if (path30.resolve(shown) === path30.resolve(execPath)) return "launchd";
|
|
17483
|
+
}
|
|
17484
|
+
if (!sea && /^\s*state = /m.test(output)) return "launchd";
|
|
17485
|
+
return null;
|
|
17486
|
+
}
|
|
17487
|
+
function parseLaunchdEnvironment(xml) {
|
|
17488
|
+
const out = {};
|
|
17489
|
+
const marker = xml.indexOf("<key>EnvironmentVariables</key>");
|
|
17490
|
+
if (marker < 0) return out;
|
|
17491
|
+
const open = xml.indexOf("<dict>", marker);
|
|
17492
|
+
if (open < 0) return out;
|
|
17493
|
+
const close = xml.indexOf("</dict>", open);
|
|
17494
|
+
if (close < 0) return out;
|
|
17495
|
+
const body = xml.slice(open + "<dict>".length, close);
|
|
17496
|
+
for (const m of body.matchAll(/<key>([^<]+)<\/key>\s*<string>([^<]*)<\/string>/g)) {
|
|
17497
|
+
out[m[1]] = m[2];
|
|
17498
|
+
}
|
|
17499
|
+
return out;
|
|
17500
|
+
}
|
|
17449
17501
|
function detectServiceManager() {
|
|
17502
|
+
if (process.platform === "darwin") return detectLaunchd();
|
|
17450
17503
|
if (process.platform !== "linux") return null;
|
|
17451
17504
|
const serviceName = process.env.ZQAGENT_SERVICE_NAME?.trim() || DEFAULT_SERVICE_NAME;
|
|
17452
17505
|
try {
|
|
@@ -17458,6 +17511,24 @@ function detectServiceManager() {
|
|
|
17458
17511
|
return null;
|
|
17459
17512
|
}
|
|
17460
17513
|
}
|
|
17514
|
+
function detectLaunchd() {
|
|
17515
|
+
try {
|
|
17516
|
+
const res = spawnSync3(
|
|
17517
|
+
"launchctl",
|
|
17518
|
+
["print", `${launchdDomain()}/${launchdLabel()}`],
|
|
17519
|
+
{ encoding: "utf8", timeout: 3e3 }
|
|
17520
|
+
);
|
|
17521
|
+
if (res.status !== 0 || !res.stdout) return null;
|
|
17522
|
+
return serviceManagerFromLaunchctl(
|
|
17523
|
+
res.stdout,
|
|
17524
|
+
process.pid,
|
|
17525
|
+
process.execPath,
|
|
17526
|
+
isSeaRuntime()
|
|
17527
|
+
);
|
|
17528
|
+
} catch {
|
|
17529
|
+
return null;
|
|
17530
|
+
}
|
|
17531
|
+
}
|
|
17461
17532
|
function serviceManager() {
|
|
17462
17533
|
const v = process.env.ZQAGENT_SERVICE_MANAGER?.trim().toLowerCase();
|
|
17463
17534
|
if (v === "systemd" || v === "launchd") return v;
|
|
@@ -17487,11 +17558,24 @@ function readServiceEnvironment() {
|
|
|
17487
17558
|
}
|
|
17488
17559
|
}
|
|
17489
17560
|
function serviceEnvValue(key) {
|
|
17561
|
+
if (process.platform === "darwin") {
|
|
17562
|
+
if (serviceManager() !== "launchd") return void 0;
|
|
17563
|
+
cachedLaunchdEnv ??= readLaunchdEnvironment();
|
|
17564
|
+
return cachedLaunchdEnv[key];
|
|
17565
|
+
}
|
|
17490
17566
|
if (process.platform !== "linux") return void 0;
|
|
17491
17567
|
if (serviceManager() !== "systemd") return void 0;
|
|
17492
17568
|
cachedServiceEnv ??= readServiceEnvironment();
|
|
17493
17569
|
return cachedServiceEnv[key];
|
|
17494
17570
|
}
|
|
17571
|
+
var cachedLaunchdEnv = null;
|
|
17572
|
+
function readLaunchdEnvironment() {
|
|
17573
|
+
try {
|
|
17574
|
+
return parseLaunchdEnvironment(fs25.readFileSync(launchdPlistPath(), "utf8"));
|
|
17575
|
+
} catch {
|
|
17576
|
+
return {};
|
|
17577
|
+
}
|
|
17578
|
+
}
|
|
17495
17579
|
function selfUpdateCapability(hasPublicKey) {
|
|
17496
17580
|
if (!isSeaRuntime()) {
|
|
17497
17581
|
return {
|
|
@@ -17876,11 +17960,11 @@ var UpdateController = class {
|
|
|
17876
17960
|
const minUptime = num("ZQAGENT_UPDATE_MIN_UPTIME_MS", 10 * 60 * 1e3);
|
|
17877
17961
|
const idleMs = num("ZQAGENT_UPDATE_IDLE_MS", 60 * 1e3);
|
|
17878
17962
|
let idleSince = null;
|
|
17879
|
-
return new Promise((
|
|
17963
|
+
return new Promise((resolve19) => {
|
|
17880
17964
|
const timer = setInterval(() => {
|
|
17881
17965
|
if (this.stopped) {
|
|
17882
17966
|
clearInterval(timer);
|
|
17883
|
-
|
|
17967
|
+
resolve19(false);
|
|
17884
17968
|
return;
|
|
17885
17969
|
}
|
|
17886
17970
|
if (Date.now() - this.startedAt < minUptime || !this.opts.isIdle()) {
|
|
@@ -17890,7 +17974,7 @@ var UpdateController = class {
|
|
|
17890
17974
|
idleSince ??= Date.now();
|
|
17891
17975
|
if (Date.now() - idleSince >= idleMs) {
|
|
17892
17976
|
clearInterval(timer);
|
|
17893
|
-
|
|
17977
|
+
resolve19(true);
|
|
17894
17978
|
}
|
|
17895
17979
|
}, 1e3);
|
|
17896
17980
|
timer.unref();
|
|
@@ -18071,6 +18155,46 @@ function exitWhenOrphaned() {
|
|
|
18071
18155
|
}, 1500);
|
|
18072
18156
|
timer.unref();
|
|
18073
18157
|
}
|
|
18158
|
+
var PORT_FALLBACK_LIMIT = 20;
|
|
18159
|
+
function listenWithPortFallback(server, startPort, host, dataDir, limit = PORT_FALLBACK_LIMIT) {
|
|
18160
|
+
return new Promise((resolve19, reject) => {
|
|
18161
|
+
let attempts = 0;
|
|
18162
|
+
const tryListen = (port) => {
|
|
18163
|
+
server.removeAllListeners("listening");
|
|
18164
|
+
const onError = (err) => {
|
|
18165
|
+
if (err.code === "EADDRINUSE" && attempts < limit) {
|
|
18166
|
+
attempts += 1;
|
|
18167
|
+
const next = port + 1;
|
|
18168
|
+
console.warn(`[server] \u7AEF\u53E3 ${port} \u5DF2\u88AB\u5360\u7528\uFF08EADDRINUSE\uFF09\uFF0C\u5C1D\u8BD5 ${next} \u2026`);
|
|
18169
|
+
tryListen(next);
|
|
18170
|
+
return;
|
|
18171
|
+
}
|
|
18172
|
+
server.removeListener("error", onError);
|
|
18173
|
+
console.error(
|
|
18174
|
+
`[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` : "")
|
|
18175
|
+
);
|
|
18176
|
+
reject(err);
|
|
18177
|
+
};
|
|
18178
|
+
server.once("error", onError);
|
|
18179
|
+
server.listen(port, host, () => {
|
|
18180
|
+
server.removeListener("error", onError);
|
|
18181
|
+
const addr = server.address();
|
|
18182
|
+
const actualPort = typeof addr === "object" && addr !== null ? addr.port : port;
|
|
18183
|
+
if (actualPort !== startPort) {
|
|
18184
|
+
console.warn(`[server] \u5DF2\u6539\u7528\u7AEF\u53E3 ${actualPort}\uFF08\u539F\u5B9A ${startPort} \u88AB\u5360\u7528\uFF09`);
|
|
18185
|
+
}
|
|
18186
|
+
try {
|
|
18187
|
+
fs29.mkdirSync(dataDir, { recursive: true });
|
|
18188
|
+
fs29.writeFileSync(path34.join(dataDir, "server-port"), `${actualPort}
|
|
18189
|
+
`);
|
|
18190
|
+
} catch {
|
|
18191
|
+
}
|
|
18192
|
+
resolve19(actualPort);
|
|
18193
|
+
});
|
|
18194
|
+
};
|
|
18195
|
+
tryListen(startPort);
|
|
18196
|
+
});
|
|
18197
|
+
}
|
|
18074
18198
|
function startServer(opts = {}) {
|
|
18075
18199
|
const dataDir = path34.resolve(opts.dataDir ?? env2("DATA_DIR") ?? DEFAULT_DATA_DIR);
|
|
18076
18200
|
const port = opts.port ?? Number(env2("PORT") ?? 8787);
|
|
@@ -18296,11 +18420,11 @@ function startServer(opts = {}) {
|
|
|
18296
18420
|
server.timeout = 0;
|
|
18297
18421
|
server.keepAliveTimeout = 65e3;
|
|
18298
18422
|
server.headersTimeout = 66e3;
|
|
18299
|
-
const ready = new Promise((
|
|
18300
|
-
server
|
|
18423
|
+
const ready = new Promise((resolve19, reject) => {
|
|
18424
|
+
listenWithPortFallback(server, port, host, dataDir).then((actualPort) => {
|
|
18301
18425
|
const info = {
|
|
18302
18426
|
host,
|
|
18303
|
-
port,
|
|
18427
|
+
port: actualPort,
|
|
18304
18428
|
dataDir,
|
|
18305
18429
|
adminKey,
|
|
18306
18430
|
fleetNodeId: fleet ? fleet.getNodeId() : void 0,
|
|
@@ -18313,8 +18437,8 @@ function startServer(opts = {}) {
|
|
|
18313
18437
|
printReady(info, qq);
|
|
18314
18438
|
}
|
|
18315
18439
|
updater?.start();
|
|
18316
|
-
|
|
18317
|
-
});
|
|
18440
|
+
resolve19(info);
|
|
18441
|
+
}, reject);
|
|
18318
18442
|
});
|
|
18319
18443
|
return {
|
|
18320
18444
|
store,
|
|
@@ -18450,7 +18574,7 @@ async function runWizard(rl, store, opts) {
|
|
|
18450
18574
|
}
|
|
18451
18575
|
async function askHidden(rl, prompt) {
|
|
18452
18576
|
if (!process.stdin.isTTY) return (await rl.question(prompt)).trim();
|
|
18453
|
-
return new Promise((
|
|
18577
|
+
return new Promise((resolve19) => {
|
|
18454
18578
|
const saved = process.stdin.listeners("data");
|
|
18455
18579
|
process.stdin.removeAllListeners("data");
|
|
18456
18580
|
cliWrite(prompt);
|
|
@@ -18472,13 +18596,13 @@ async function askHidden(rl, prompt) {
|
|
|
18472
18596
|
if (ch === "\r" || ch === "\n") {
|
|
18473
18597
|
cleanup();
|
|
18474
18598
|
cliWrite("\n");
|
|
18475
|
-
|
|
18599
|
+
resolve19(buf);
|
|
18476
18600
|
return;
|
|
18477
18601
|
}
|
|
18478
18602
|
if (ch === "") {
|
|
18479
18603
|
cleanup();
|
|
18480
18604
|
cliWrite("\n");
|
|
18481
|
-
|
|
18605
|
+
resolve19("");
|
|
18482
18606
|
return;
|
|
18483
18607
|
}
|
|
18484
18608
|
if (ch === "\x7F" || ch === "\b") {
|