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
- Enable and unlock the vault: set a master passphrase via `VaultService.setEnabled(true, passphrase)` so VaultFileProvider becomes available.
- If running in Electron, confirm the ElectronFileProvider is registered and its host window is initialized.
- Before calling `selectAndStoreFile`, guard with a pre-check: ensure at least one provider is available and surface a setup prompt if not.
- 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
- Drive users through vault setup during onboarding so a provider is always available.
- Pre-check availability in the UI before enabling 'store secret' buttons.
- Register an always-available fallback FileProvider for headless/test environments.
- Couple the vault-enable toggle with the UI affordances that depend on it.
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.