Eugeny/tabby · warning · Error

Unsupported

Error message

Unsupported

What it means

Thrown by WebPlatformService.startDownloadDirectory(), the web (browser) implementation of the abstract PlatformService method. Browsers cannot stream an entire remote directory as a single download object the way Electron can, so the operation is intentionally unsupported in the web build. The base contract declares it abstract, so each platform must implement it.

Source

Thrown at tabby-web/src/platform.ts:118

            const response = await modal.result
            return { response }
        } catch {
            return { response: options.cancelId ?? 1 }
        }
    }

    quit (): void {
        window.close()
    }

    async startDownload (name: string, mode: number, size: number): Promise<FileDownload|null> {
        const transfer = new HTMLFileDownload(name, mode, size)
        this.fileTransferStarted.next(transfer)
        return transfer
    }

    async startDownloadDirectory (_name: string, _estimatedSize?: number): Promise<DirectoryDownload|null> {
        throw new Error('Unsupported')
    }

    startUpload (options?: FileUploadOptions): Promise<FileUpload[]> {
        return new Promise(resolve => {
            this.fileSelector.onchange = () => {
                const transfers: FileUpload[] = []
                const fileList = this.fileSelector.files!
                // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
                for (let i = 0; i < (fileList.length ?? 0); i++) {
                    const file = fileList[i]
                    const transfer = new HTMLFileUpload(file)
                    this.fileTransferStarted.next(transfer)
                    transfers.push(transfer)
                    if (!options?.multiple) {
                        break
                    }
                }
                resolve(transfers)

View on GitHub (pinned to 14e2d60b9b)

Solutions

  1. Guard the UI/action with a capability check before offering folder download on the web build.
  2. On web, fall back to recursively downloading files individually via startDownload, or zip them server-side first.
  3. Use the Electron/desktop build of Tabby when directory download is required.
  4. Catch 'Unsupported' and show a user-facing message explaining the limitation.

Example fix

// before
const transfer = await this.platform.startDownloadDirectory(folder.name, 0)
// after
if (this.platform instanceof WebPlatformService) {
    this.notifications.error('Directory download is not available in the web build')
    return
}
const transfer = await this.platform.startDownloadDirectory(folder.name, 0)
Defensive patterns

Strategy: fallback

Validate before calling

import { Platform } from 'tabby-core'
function supportsDirDownload (platform: Platform | string): boolean {
    return platform !== Platform.Web
}

Type guard

import { WebPlatformService } from 'tabby-web'
function isWebPlatform (p: unknown): p is WebPlatformService {
    return p instanceof WebPlatformService
}

Try / catch

try {
    await this.platform.startDownloadDirectory(folder.name, 0)
} catch (e) {
    if (e.message === 'Unsupported') {
        // web: fall back to per-file downloads
    } else throw e
}

Prevention

When it happens

Trigger: Code calls platform.startDownloadDirectory(name, size) while running under the Web platform service. The SFTP panel (sftpPanel.component.ts:257) calls this when the user chooses 'Download' on a folder in a web Tabby session.

Common situations: User opens the SFTP panel in the web build and tries to download a remote directory; a plugin assumes directory download is available on all platforms; the same UI is shared between Electron (supported) and Web (unsupported) builds.

Related errors


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