mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-22 18:35:21 -06:00
75fcaba919
* fix(voice-call): survive gateway in-process restart and stop CLI dead-ends The gateway's in-process restart (SIGUSR1 config reload) reuses the cached plugin registry, so service stop/start run on the same retained voice-call registration. Generation fencing from #120289 treated that restart as a stale actor: stop retired the generation forever, the next start silently bailed, and every voicecall.* RPC answered UNAVAILABLE "runtime generation is retired" while the webhook never rebound. - Registrations now hold a replaceable generation: service start after stop mints a fresh generation, takes over a running slot owned by a retired predecessor, and reports start failures to service health instead of silently returning. - The voicecall CLI classifies gateway failures with typed guards instead of message substrings: standalone/store fallback only when the gateway is genuinely absent; reachable-but-failed (request errors, auth, timeout) exits with actionable text; a standalone webhook port collision explains that a running Gateway probably owns the port instead of raw EADDRINUSE. - Plugin SDK gateway-runtime exports structural isGatewayTransportError / isGatewayClientRequestError guards (+2 documented surface budget). - Regression coverage: same-registration stop/start restart, retired-owner takeover, typed CLI fallback classification, and a real token-auth gateway server routing voicecall.status through callGatewayFromCli. * refactor(voice-call): split CLI modules and dedupe gateway fallbacks Collapse the four duplicated gateway-or-runtime command blocks (speak, dtmf, end, continue fallback) into one generic runGatewayManagerCommand helper — the continue command owns its legacy-method fallback and operation polling via a gatewayCall closure, so the helper carries no per-command policy. Smoke reuses the shared initiateVoiceCall path instead of a bespoke fallback. Split the 988-line cli.ts into concept modules (cli-gateway-call, cli-call-log, cli-command-io) and drop its grandfathered max-lines suppression plus the now-stale max-lines and assertion-safety baseline entries (shrink-only ratchet maintenance). Behavior-frozen: stdout/exit semantics unchanged; net -2 production LOC. * fix(voice-call): redact gateway URLs in CLI operational errors ClawSweeper P1: the operational-error formatter interpolated the raw connectionDetails.url, so a configured gateway URL with userinfo or query tokens would print credentials into terminal output. Redact the composed message once with the canonical net-policy redactor (also covers remote-controlled close-reason text), exported through the plugin SDK gateway-runtime subpath (+1 documented surface budget). Regression test covers a credential-bearing URL in both the URL and message fields.
56 lines
2.7 KiB
TypeScript
56 lines
2.7 KiB
TypeScript
// Public gateway/client helpers for plugins that talk to the host gateway surface.
|
|
|
|
export { addGatewayClientOptions, callGatewayFromCli } from "../cli/gateway-rpc.js";
|
|
export type { GatewayRpcOpts } from "../cli/gateway-rpc.js";
|
|
export { isGatewayClientRequestError, isGatewayTransportError } from "../gateway/call.js";
|
|
// Plugin CLIs echo gateway URLs/close reasons into operator-visible errors;
|
|
// they must use the canonical redactor so URL userinfo/tokens never print.
|
|
export { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url";
|
|
export { isLoopbackHost } from "../gateway/net.js";
|
|
export async function resolveAdvertisedLanHost(): Promise<string | null> {
|
|
const runtime = await import("../infra/advertised-lan-host.js");
|
|
return await runtime.resolveAdvertisedLanHostCore();
|
|
}
|
|
export { resolveHostedPluginSurfaceUrl } from "../gateway/hosted-plugin-surface-url.js";
|
|
export type { HostedPluginSurfaceUrlParams } from "../gateway/hosted-plugin-surface-url.js";
|
|
export {
|
|
buildPluginNodeCapabilityScopedHostUrl,
|
|
DEFAULT_PLUGIN_NODE_CAPABILITY_TTL_MS,
|
|
mintPluginNodeCapabilityToken,
|
|
normalizePluginNodeCapabilityScopedUrl,
|
|
PLUGIN_NODE_CAPABILITY_PATH_PREFIX,
|
|
} from "../gateway/plugin-node-capability.js";
|
|
export type { NormalizedPluginNodeCapabilityUrl } from "../gateway/plugin-node-capability.js";
|
|
export {
|
|
isNodeCommandAllowed,
|
|
resolveNodeCommandAllowlist,
|
|
} from "../gateway/node-command-policy.js";
|
|
export type { NodeSession } from "../gateway/node-registry.js";
|
|
export { resolveNodeFromNodeList } from "../shared/node-resolve.js";
|
|
export type { NodeMatchCandidate } from "../shared/node-match.js";
|
|
export {
|
|
parseGatewayPayload as safeParseJson,
|
|
respondUnavailableOnNodeInvokeError,
|
|
} from "../gateway/server-methods/nodes.helpers.js";
|
|
export type { GatewayRequestHandlers } from "../gateway/server-methods/types.js";
|
|
export { ensureGatewayStartupAuth } from "../gateway/startup-auth.js";
|
|
export { resolveGatewayAuth } from "../gateway/auth.js";
|
|
|
|
export { GatewayClient } from "../gateway/client.js";
|
|
export { startGatewayClientWhenEventLoopReady } from "../gateway/client-start-readiness.js";
|
|
// Compatibility for @tencent-connect/openclaw-qqbot@2.0.1. Remove after the pinned
|
|
// package migrates its approval handler to the dedicated approval runtime SDK.
|
|
export { createOperatorApprovalsGatewayClient } from "../gateway/operator-approvals-client.js";
|
|
|
|
export { ErrorCodes, errorShape } from "../../packages/gateway-protocol/src/schema/error-codes.js";
|
|
|
|
export type { GatewayRequestHandlerOptions } from "../gateway/server-methods/types.js";
|
|
|
|
export {
|
|
channelBlockedPatch,
|
|
channelReadyPatch,
|
|
channelStoppedPatch,
|
|
createConnectedChannelStatusPatch,
|
|
createTransportActivityStatusPatch,
|
|
} from "../gateway/channel-status-patches.js";
|