fix: improve device pairing error message for remote connections
Fixes #4531 When accessing the Web UI from a different machine on the LAN, users were getting a cryptic 'disconnected (1008): pairing required' error with no indication of how to resolve it. Changes: 1. Enhanced server error message to include: - Clear explanation of the pairing requirement - Step-by-step CLI instructions (openclaw devices list/approve) - The specific request ID to approve - Note that approval must be done on the server machine - Alternative method (localhost Control UI) 2. Updated Web UI to propagate the full error message from the server instead of the generic 'connect failed' message Impact: - Non-breaking change (only improves error messaging) - Backwards compatible with existing clients - Significantly improves UX for LAN/remote access scenarios Before: Error: disconnected (1008): pairing required After: Error: Device pairing required. On the OpenClaw server machine, run: 'openclaw devices list' to see pending requests, then 'openclaw devices approve <request-id>' to approve this device. Alternatively, access the Control UI from the server's localhost to approve.
This commit is contained in:
parent
3aa6d0503d
commit
d2c1fd3c61
@ -664,12 +664,25 @@ export function attachGatewayWsMessageHandler(params: {
|
|||||||
requestId: pairing.request.requestId,
|
requestId: pairing.request.requestId,
|
||||||
reason,
|
reason,
|
||||||
});
|
});
|
||||||
|
const helpMessage =
|
||||||
|
`Device pairing required. ` +
|
||||||
|
`On the OpenClaw server machine, run: ` +
|
||||||
|
`'openclaw devices list' to see pending requests, then ` +
|
||||||
|
`'openclaw devices approve ${pairing.request.requestId}' to approve this device. ` +
|
||||||
|
`Alternatively, access the Control UI from the server's localhost to approve.`;
|
||||||
send({
|
send({
|
||||||
type: "res",
|
type: "res",
|
||||||
id: frame.id,
|
id: frame.id,
|
||||||
ok: false,
|
ok: false,
|
||||||
error: errorShape(ErrorCodes.NOT_PAIRED, "pairing required", {
|
error: errorShape(ErrorCodes.NOT_PAIRED, helpMessage, {
|
||||||
details: { requestId: pairing.request.requestId },
|
details: {
|
||||||
|
requestId: pairing.request.requestId,
|
||||||
|
deviceId: device.id,
|
||||||
|
instructions: {
|
||||||
|
list: "openclaw devices list",
|
||||||
|
approve: `openclaw devices approve ${pairing.request.requestId}`,
|
||||||
|
}
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
close(1008, "pairing required");
|
close(1008, "pairing required");
|
||||||
|
|||||||
@ -219,11 +219,13 @@ export class GatewayBrowserClient {
|
|||||||
this.backoffMs = 800;
|
this.backoffMs = 800;
|
||||||
this.opts.onHello?.(hello);
|
this.opts.onHello?.(hello);
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch((err) => {
|
||||||
if (canFallbackToShared && deviceIdentity) {
|
if (canFallbackToShared && deviceIdentity) {
|
||||||
clearDeviceAuthToken({ deviceId: deviceIdentity.deviceId, role });
|
clearDeviceAuthToken({ deviceId: deviceIdentity.deviceId, role });
|
||||||
}
|
}
|
||||||
this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "connect failed");
|
// Extract the error message to pass to onClose handler
|
||||||
|
const errorMessage = err instanceof Error ? err.message : "connect failed";
|
||||||
|
this.ws?.close(CONNECT_FAILED_CLOSE_CODE, errorMessage);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user