BloopAI/vibe-kanban · error · Error

This host pairing is outdated. Re-pair it in Relay settings.

Error message

This host pairing is outdated. Re-pair it in Relay settings.

What it means

The host is paired, but its pairing record has no signing_session_id, meaning the pairing predates the signing-session requirement or was created incompletely. The record exists but is not usable for secure relay communication, so resolveRemoteHostContext rejects it and asks for a re-pair.

Source

Thrown at packages/remote-web/src/shared/lib/relay/context.ts:32

const remoteSessionIdCache = new Map<string, string>();

subscribeRelayPairingChanges(({ hostId }) => {
  remoteSessionIdCache.delete(hostId);
});

export async function resolveRemoteHostContext(
  hostId: string,
): Promise<RelayHostContext> {
  const pairedHost = await findPairedHost(hostId);
  if (!pairedHost) {
    throw new Error(
      "This host is not paired with your browser. Pair it in Relay settings.",
    );
  }

  if (!pairedHost.signing_session_id) {
    throw new Error(
      "This host pairing is outdated. Re-pair it in Relay settings.",
    );
  }

  const browserSessionId = await getRemoteSessionId(hostId);
  return {
    pairedHost,
    sessionId: browserSessionId,
  };
}

export function invalidateRemoteSessionId(hostId: string): void {
  remoteSessionIdCache.delete(hostId);
}

export async function tryRefreshRelayHostSigningSession(
  context: RelayHostContext,
): Promise<RelayHostContext | null> {

View on GitHub (pinned to 4deb7eca8f)

Solutions

  1. Remove the host in Relay settings and re-pair it to generate a signing session.
  2. Check whether a recent Relay version upgrade requires re-pairing (migration notes).
  3. If many hosts show this, verify the pairing endpoint completed successfully and persist signing_session_id.
  4. Clear the stale pairing record from storage programmatically and re-run setup.

Example fix

// before
const ctx = await resolveRemoteHostContext(hostId); // throws on stale pairing
// after
try {
  return await resolveRemoteHostContext(hostId);
} catch (e) {
  if (e.message.includes('outdated')) await rePairHost(hostId);
  return await resolveRemoteHostContext(hostId);
}
Defensive patterns

Strategy: validation

Validate before calling

const host = await findPairedHost(hostId);
if (host && !host.signing_session_id) await rePairHost(hostId); // refresh stale pairing first

Type guard

function hasSigningSession(h: { signing_session_id?: string | null }): h is { signing_session_id: string } {
  return typeof h.signing_session_id === 'string' && h.signing_session_id.length > 0;
}

Try / catch

try {
  return await resolveRemoteHostContext(hostId);
} catch (e) {
  if (e instanceof Error && e.message.includes('outdated')) {
    await rePairHost(hostId);
    return await resolveRemoteHostContext(hostId);
  }
  throw e;
}

Prevention

When it happens

Trigger: resolveRemoteHostContext(hostId) finds pairedHost but pairedHost.signing_session_id is null/undefined — typically a pairing created by an older Relay version before signing sessions were introduced, or a partially completed pairing.

Common situations: Upgraded Relay server/client where old pairings were not migrated; pairing interrupted mid-handshake leaving the record without a signing session; storage partially cleared or corrupted.

Related errors


AI-assisted analysis of BloopAI/vibe-kanban@4deb7eca8f (2026-08-29). Data as JSON: /api/errors/0789b8dde244f505. Report an issue: GitHub.