Eugeny/tabby · error · Error

No available file providers

Error message

No available file providers

What it means

Thrown by `FileProvidersService.selectProvider` when no registered FileProvider reports `isAvailable() === true`. Availability typically requires the vault to be enabled and unlocked (for VaultFileProvider) or the host to support native dialogs (ElectronFileProvider). The user is also shown a notification that the vault master passphrase must be set.

Source

Thrown at tabby-core/src/services/fileProviders.service.ts:41

            try {
                return await p.retrieveFile(key)
            } catch {
                continue
            }
        }
        throw new Error('Not found')
    }

    async selectProvider (): Promise<FileProvider> {
        const providers: FileProvider[] = []
        await Promise.all(this.fileProviders.map(async p => {
            if (await p.isAvailable()) {
                providers.push(p)
            }
        }))
        if (!providers.length) {
            this.notifications.error(this.translate.instant('Vault master passphrase needs to be set to allow storing secrets'))
            throw new Error('No available file providers')
        }
        if (providers.length === 1) {
            return providers[0]
        }
        return this.selector.show(
            this.translate.instant('Select file storage'),
            providers.map(p => ({
                name: p.name,
                result: p,
            })),
        )
    }
}

View on GitHub (pinned to 14e2d60b9b)

Solutions

  1. Enable and unlock the vault: set a master passphrase via `VaultService.setEnabled(true, passphrase)` so VaultFileProvider becomes available.
  2. If running in Electron, confirm the ElectronFileProvider is registered and its host window is initialized.
  3. Before calling `selectAndStoreFile`, guard with a pre-check: ensure at least one provider is available and surface a setup prompt if not.
  4. For headless/automated contexts, inject a custom FileProvider that satisfies `isAvailable()` and stores to a known location.

Example fix

// before
async selectAndStoreFile (description: string): Promise<string> {
    return this.selectProvider().then(p => p.selectAndStoreFile(description))
}

// after - pre-flight check with actionable guidance
async selectAndStoreFile (description: string): Promise<string> {
    const available = (await Promise.all(this.fileProviders.map(p => p.isAvailable()))).some(Boolean)
    if (!available && !this.vault.isEnabled()) {
        await this.vault.setEnabled(true, await promptForPassphrase())
    }
    return this.selectProvider().then(p => p.selectAndStoreFile(description))
}
Defensive patterns

Strategy: validation

Validate before calling

async function ensureProviderAvailable (providers: FileProvider[], vault: VaultService): Promise<void> {
    const anyAvailable = (await Promise.all(providers.map(p => p.isAvailable()))).some(Boolean)
    if (!anyAvailable) {
        if (!vault.isEnabled()) await vault.setEnabled(true, await promptForPassphrase())
    }
}

Try / catch

try {
    return await fileProviders.selectAndStoreFile(description)
} catch (e) {
    if (e instanceof Error && e.message === 'No available file providers') {
        await vault.setEnabled(true, await promptForPassphrase())
        return await fileProviders.selectAndStoreFile(description)  // retry
    }
    throw e
}

Prevention

When it happens

Trigger: Calling `selectAndStoreFile` while the vault is disabled/locked AND the electron file provider is unavailable (e.g. running outside Electron, or its dialog host missing). Every provider's `isAvailable()` returned false.

Common situations: First-run setup with no vault passphrase set; running in a non-Electron host (e.g. web/headless test) where no provider qualifies; vault disabled by the user but a feature still tries to store a secret (e.g. saving an SSH private key).

Related errors


AI-assisted analysis of Eugeny/tabby@14e2d60b9b (2026-08-12). Data as JSON: /api/errors/17ff5157d26731b7. Report an issue: GitHub.