




















@@ -1,6 +1,9 @@
11import type { PluginHealthErrorSummary } from "../../commands/health.types.js";
2+import { createConfigIO } from "../../config/io.js";
3+import type { OpenClawConfig } from "../../config/types.openclaw.js";
24import type { GatewayServiceRuntime } from "../../daemon/service-runtime.js";
35import type { GatewayService } from "../../daemon/service.js";
6+import { resolveGatewayProbeAuthSafeWithSecretInputs } from "../../gateway/probe-auth.js";
47import { probeGateway } from "../../gateway/probe.js";
58import {
69classifyPortListener,
@@ -61,6 +64,11 @@ type GatewayReachability = {
6164channelProbeErrors: Array<{ id: string; error: string }>;
6265};
636667+type GatewayRestartProbeAuth = {
68+token?: string;
69+password?: string;
70+};
71+6472function hasListenerAttributionGap(portUsage: PortUsage): boolean {
6573if (portUsage.status !== "busy" || portUsage.listeners.length > 0) {
6674return false;
@@ -228,9 +236,12 @@ function applyChannelProbeErrors(snapshot: GatewayRestartSnapshot): GatewayResta
228236async function confirmGatewayReachable(params: {
229237port: number;
230238includeHealthDetails?: boolean;
239+auth?: GatewayRestartProbeAuth;
231240}): Promise<GatewayReachability> {
232-const token = normalizeOptionalString(process.env.OPENCLAW_GATEWAY_TOKEN);
233-const password = normalizeOptionalString(process.env.OPENCLAW_GATEWAY_PASSWORD);
241+const token = normalizeOptionalString(params.auth?.token ?? process.env.OPENCLAW_GATEWAY_TOKEN);
242+const password = normalizeOptionalString(
243+params.auth?.password ?? process.env.OPENCLAW_GATEWAY_PASSWORD,
244+);
234245const probe = await probeGateway({
235246url: `ws://127.0.0.1:${params.port}`,
236247auth: token || password ? { token, password } : undefined,
@@ -251,13 +262,37 @@ async function confirmGatewayReachable(params: {
251262};
252263}
253264254-async function inspectGatewayPortHealth(port: number): Promise<GatewayPortHealthSnapshot> {
265+async function resolveGatewayRestartProbeAuth(
266+env: NodeJS.ProcessEnv | undefined,
267+): Promise<GatewayRestartProbeAuth | undefined> {
268+const mergedEnv = {
269+ ...(process.env as Record<string, string | undefined>),
270+ ...(env ?? undefined),
271+} as NodeJS.ProcessEnv;
272+const cfg = await createConfigIO({
273+env: mergedEnv,
274+pluginValidation: "skip",
275+})
276+.readBestEffortConfig()
277+.catch((): OpenClawConfig => ({}));
278+const resolved = await resolveGatewayProbeAuthSafeWithSecretInputs({
279+ cfg,
280+mode: "local",
281+env: mergedEnv,
282+});
283+return resolved.auth;
284+}
285+286+async function inspectGatewayPortHealth(params: {
287+port: number;
288+auth?: GatewayRestartProbeAuth;
289+}): Promise<GatewayPortHealthSnapshot> {
255290let portUsage: PortUsage;
256291try {
257-portUsage = await inspectPortUsage(port);
292+portUsage = await inspectPortUsage(params.port);
258293} catch (err) {
259294portUsage = {
260- port,
295+port: params.port,
261296status: "unknown",
262297listeners: [],
263298hints: [],
@@ -268,7 +303,12 @@ async function inspectGatewayPortHealth(port: number): Promise<GatewayPortHealth
268303let healthy = false;
269304if (portUsage.status === "busy") {
270305try {
271-healthy = (await confirmGatewayReachable({ port })).reachable;
306+healthy = (
307+await confirmGatewayReachable({
308+port: params.port,
309+auth: params.auth,
310+})
311+).reachable;
272312} catch {
273313// best-effort probe
274314}
@@ -283,6 +323,7 @@ export async function inspectGatewayRestart(params: {
283323env?: NodeJS.ProcessEnv;
284324expectedVersion?: string | null;
285325includeUnknownListenersAsStale?: boolean;
326+probeAuth?: GatewayRestartProbeAuth;
286327}): Promise<GatewayRestartSnapshot> {
287328const env = params.env ?? process.env;
288329const expectedVersion = normalizeOptionalString(params.expectedVersion);
@@ -294,6 +335,7 @@ export async function inspectGatewayRestart(params: {
294335reachability = await confirmGatewayReachable({
295336port: params.port,
296337includeHealthDetails: Boolean(expectedVersion),
338+auth: params.probeAuth,
297339});
298340activatedPluginErrors = reachability.activatedPluginErrors;
299341channelProbeErrors = reachability.channelProbeErrors;
@@ -477,12 +519,14 @@ export async function waitForGatewayHealthyRestart(params: {
477519const attempts = params.attempts ?? DEFAULT_RESTART_HEALTH_ATTEMPTS;
478520const delayMs = params.delayMs ?? DEFAULT_RESTART_HEALTH_DELAY_MS;
479521522+const probeAuth = await resolveGatewayRestartProbeAuth(params.env).catch(() => undefined);
480523let snapshot = await inspectGatewayRestart({
481524service: params.service,
482525port: params.port,
483526env: params.env,
484527expectedVersion: params.expectedVersion,
485528includeUnknownListenersAsStale: params.includeUnknownListenersAsStale,
529+ probeAuth,
486530});
487531488532let consecutiveStoppedFreeCount = 0;
@@ -523,6 +567,7 @@ export async function waitForGatewayHealthyRestart(params: {
523567env: params.env,
524568expectedVersion: params.expectedVersion,
525569includeUnknownListenersAsStale: params.includeUnknownListenersAsStale,
570+ probeAuth,
526571});
527572}
528573@@ -537,14 +582,21 @@ export async function waitForGatewayHealthyListener(params: {
537582const attempts = params.attempts ?? DEFAULT_RESTART_HEALTH_ATTEMPTS;
538583const delayMs = params.delayMs ?? DEFAULT_RESTART_HEALTH_DELAY_MS;
539584540-let snapshot = await inspectGatewayPortHealth(params.port);
585+const probeAuth = await resolveGatewayRestartProbeAuth(undefined).catch(() => undefined);
586+let snapshot = await inspectGatewayPortHealth({
587+port: params.port,
588+auth: probeAuth,
589+});
541590542591for (let attempt = 0; attempt < attempts; attempt += 1) {
543592if (snapshot.healthy) {
544593return snapshot;
545594}
546595await sleep(delayMs);
547-snapshot = await inspectGatewayPortHealth(params.port);
596+snapshot = await inspectGatewayPortHealth({
597+port: params.port,
598+auth: probeAuth,
599+});
548600}
549601550602return snapshot;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。