decolua/9router · error

${params.error_description || params.error}

Error message

${params.error_description || params.error}

What it means

Thrown by KimchiService._handleCallback() when the browser callback reports an OAuth-style error: the query string contains an `error` parameter, and the message relays `error_description` (or the bare code). Kimchi's browser login normally delivers a token directly on the callback; an `error` param means the Kimchi web app's login flow rejected or aborted the authentication.

Source

Thrown at src/lib/oauth/services/kimchi.js:75

    // Map can't grow unbounded across many logins.
    result.then((r) => {
      const s = sessions.get(state);
      if (!s) return;
      s.done = true;
      s.resolved = r;
      clearTimeout(s.timeout);
      try { s.close(); } catch { /* already closed */ }
      setTimeout(() => sessions.delete(state), SESSION_TTL_MS).unref?.();
    });

    const callbackUrl = `http://127.0.0.1:${port}${KIMCHI_CONFIG.callbackPath}`;
    const authUrl = buildKimchiAuthUrl(callbackUrl, state);
    return { authUrl, port, state, result, close };
  }

  async _handleCallback(params, expectedState) {
    if (params.error) {
      throw new Error(params.error_description || params.error);
    }
    const candidate = params.state;
    if (!candidate || candidate !== expectedState) {
      throw new Error("This request isn't valid. Please restart the Kimchi login flow.");
    }
    const token = params.token;
    if (!token) {
      throw new Error("No token was returned by the Kimchi authentication server");
    }
    const check = await this.validateToken(token);
    if (!check.valid) {
      throw new Error(check.error || "Kimchi token validation failed");
    }
    return { token };
  }

  async fetchProfile(token) {
    try {

View on GitHub (pinned to 90b52e06ff)

Solutions

  1. Read the message — error_description names the exact Kimchi-side reason.
  2. Restart the login flow (startLogin()) and complete the Kimchi browser step without canceling.
  3. Log into the Kimchi web app in the browser first to refresh the session, then retry.
  4. If the error persists for all attempts, check Kimchi service status / web app availability.

Example fix

null
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const { result } = await kimchiService.startLogin();
  const outcome = await result; // resolves to { token } or { error }
  if (outcome.error) throw new Error(outcome.error);
} catch (err) {
  if (/denied|cancel|error/i.test(err.message)) {
    console.log("Kimchi login aborted — restart the flow and complete the browser step.");
  } else { throw err; }
}

Prevention

When it happens

Trigger: The Kimchi web app redirects to the local callback with ?error=... — user canceled in the Kimchi UI, Kimchi session expired mid-flow, or Kimchi's backend refused the login (invalid credentials, SSO failure, backend outage).

Common situations: User closing/canceling the Kimchi login tab; Kimchi account session cookie expired; Kimchi service degradation; the CLI-auth page on the Kimchi web app failing validation and redirecting back with an error code.

Related errors


AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30). Data as JSON: /api/errors/693efb494ea8c161. Report an issue: GitHub.