ComposioHQ/composio · warning · KeyringError

NoEntry

NoEntry

Error message

NoEntry

What it means

getSecret on the secret-tool store ran `secret-tool lookup` successfully but stdout was empty, meaning no matching credential exists. KeyringError kind 'NoEntry' is the canonical not-found signal.

Source

Thrown at ts/packages/cli-keyring/src/stores/linux-secret-tool.ts:190

        ),
      });
    }

    const args = ['lookup', ...attributeArgs(service, user, modifiers)];

    let result: SpawnResult;
    try {
      result = await runCommand({ command: SECRET_TOOL_BIN, args });
    } catch (err) {
      throw this.spawnErrorToKeyringError(err);
    }

    if (result.code === 0) {
      const stdout = bytesToUtf8(result.stdout);
      // `secret-tool lookup` prints the password without a trailing
      // newline when found, and prints nothing (exit 0) when not found.
      if (stdout.length === 0) {
        throw new KeyringError({ kind: 'NoEntry' });
      }
      try {
        return decodeSecret(stdout);
      } catch (err) {
        throw new KeyringError({
          kind: 'BadDataFormat',
          bytes: new Uint8Array(result.stdout),
          cause: err,
        });
      }
    }

    // Exit 1 can mean many things — stderr is the real signal.
    throw classifyFailure(result, 'secret-tool lookup');
  }

  async deleteCredential(service: string, user: string, modifiers: EntryModifiers): Promise<void> {
    validateSpecifier(service, user);

View on GitHub (pinned to 64b1b85502)

Solutions

  1. Handle NoEntry as 'credential missing' and trigger your login/authorization flow
  2. Verify the exact service/user/attribute strings match what was stored
  3. Re-create the credential

Example fix

// before
const secret = await store.getSecret(service, user, mods);
// after
try { const secret = await store.getSecret(service, user, mods); }
catch (e) { if (e instanceof KeyringError && e.kind === 'NoEntry') await promptLogin(); else throw e; }
Defensive patterns

Strategy: try-catch

Try / catch

catch (e) { if (e instanceof KeyringError && e.kind === 'NoEntry') { await startLoginFlow(); return; } throw e; }

Prevention

When it happens

Trigger: Looking up a (service, user) pair that was never stored, was deleted, or whose attributes don't match exactly.

Common situations: First-run before login/authorization, changed attribute schema between versions, or a cleared keyring.

Related errors


AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28). Data as JSON: /api/errors/1d58e3caaa854049. Report an issue: GitHub.