tinyhumansai/openhuman · error · Error
[transport:manager] lan profile missing rpcUrl
Error message
[transport:manager] lan profile missing rpcUrl
What it means
The selected ConnectionProfile has kind 'lan' but no rpcUrl, so TransportManager cannot construct the LanHttpTransport. LAN profiles must carry the desktop core's LAN address (host:port of its RPC listener); nothing is dialed before this throw.
Source
Thrown at app/src/services/transport/TransportManager.ts:90
const t = new LocalTransport(this.localRpcUrl, this.localToken);
log('[transport:manager] → LocalTransport');
return t;
}
if (kind === 'cloud') {
const { rpcUrl, sessionToken } = this.profile;
if (!rpcUrl) {
throw new Error('[transport:manager] cloud profile missing rpcUrl');
}
const t = new CloudHttpTransport(rpcUrl, sessionToken ?? null);
log('[transport:manager] → CloudHttpTransport rpcUrl=%s', rpcUrl);
return t;
}
if (kind === 'lan') {
const { rpcUrl } = this.profile;
if (!rpcUrl) {
throw new Error('[transport:manager] lan profile missing rpcUrl');
}
const t = new LanHttpTransport(rpcUrl);
log('[transport:manager] → LanHttpTransport rpcUrl=%s', rpcUrl);
return t;
}
if (kind === 'tunnel') {
return this.raceLanAndTunnel();
}
throw new Error(`[transport:manager] unknown profile kind: ${kind}`);
}
/**
* Race LAN (with 2 s timeout) against Tunnel.
* Whichever responds to `openhuman.ping` first wins.
* If LAN wins but later fails, caller should call reset() to re-race.
*/View on GitHub (pinned to a221052e0d)
Solutions
- Re-run LAN discovery / re-pair so the profile records the core's LAN rpcUrl
- Verify the desktop core actually advertises a LAN address and both devices share the network
- Validate profiles at load time and rebuild incomplete ones instead of failing at first RPC
Example fix
// before
const tm = createTransportManager(profile, opts);
// after
if (profile.kind === 'lan' && !profile.rpcUrl) {
await reDiscoverLan(profile.id); // refresh address, then rebuild
}
const tm = createTransportManager(profile, opts); Defensive patterns
Strategy: validation
Validate before calling
function assertProfileComplete(p: ConnectionProfile): void {
if ((p.kind === 'cloud' || p.kind === 'lan') && !p.rpcUrl) {
throw new Error(`profile ${p.id} (${p.kind}) is missing rpcUrl — re-run discovery/pairing`);
}
} Prevention
- Treat a LAN profile without rpcUrl as incomplete pairing — re-run LAN discovery before use
- Check the desktop core advertises its LAN address on the shared network
- Validate profiles at load and rebuild incomplete ones
When it happens
Trigger: manager.getTransport() with { kind: 'lan', rpcUrl: undefined } — typically a profile recorded before LAN discovery filled the address, or a deserialized profile from an older schema (e.g. iOS client pairing that did not complete discovery).
Common situations: Mobile/remote client pairing interrupted before the core's LAN address was captured; persisted profile from before a schema change; hand-built profile fixtures in tests.
Related errors
- [transport:lan] HTTP ${response.status}: ${text || response.
- [transport:manager] cloud profile missing rpcUrl
- [transport:lan] ${method} timed out after ${this.timeoutMs}m
- LAN RPC returned an error
- [transport:lan] response missing result
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/308f72eeecc40108.
Report an issue: GitHub.