Eugeny/tabby · warning · Error

Not supported

Error message

Not supported

What it means

Thrown by `ElectronPlatformService.isProcessRunning` on any platform other than Windows. The implementation uses `windows-process-tree`'s native `getProcessList`, which is Windows-only; on macOS/Linux it has no equivalent and the API explicitly rejects rather than returning a misleading false.

Source

Thrown at tabby-electron/src/services/platform.service.ts:103

    }

    async installPlugin (name: string, version: string): Promise<void> {
        await (promiseIpc as RendererProcessType).send('plugin-manager:install', name, version)
    }

    async uninstallPlugin (name: string): Promise<void> {
        await (promiseIpc as RendererProcessType).send('plugin-manager:uninstall', name)
    }

    async isProcessRunning (name: string): Promise<boolean> {
        if (this.hostApp.platform === Platform.Windows) {
            return new Promise<boolean>(resolve => {
                windowsProcessTreeNative.getProcessList(list => { // eslint-disable-line block-scoped-var
                    resolve(list.some(x => x.name === name))
                }, 0)
            })
        } else {
            throw new Error('Not supported')
        }
    }

    getWinSCPPath (): string|null {
        const key = wnr.getRegistryKey(wnr.HK.CR, 'WinSCP.Url\\DefaultIcon')
        if (key?.['']) {
            let detectedPath = key[''].value?.split(',')[0]
            detectedPath = detectedPath?.substring(1, detectedPath.length - 1)
            return detectedPath
        }
        return null
    }

    async exec (app: string, argv: string[]): Promise<void> {
        await execFile(app, argv)
    }

    isShellIntegrationSupported (): boolean {

View on GitHub (pinned to 14e2d60b9b)

Solutions

  1. Gate the call on platform: `if (hostApp.platform === Platform.Windows) { return isProcessRunning(name) } else { return false }`.
  2. Implement a fallback for POSIX using `pgrep`/`ps` if cross-platform support is required.
  3. Catch the error and degrade to `false` (treat 'not supported' as 'not running') when the result is non-critical.
  4. Move the call out of platform-agnostic code paths so non-Windows hosts never reach it.

Example fix

// before
async isProcessRunning (name: string): Promise<boolean> {
    if (this.hostApp.platform === Platform.Windows) { ... }
    else throw new Error('Not supported')
}

// caller guard
if (this.platform.hostApp.platform === Platform.Windows) {
    running = await this.platform.isProcessRunning('WinSCP')
}
Defensive patterns

Strategy: validation

Validate before calling

function canCheckProcessRunning (hostApp: { platform: Platform }): boolean {
    return hostApp.platform === Platform.Windows
}

if (canCheckProcessRunning(this.hostApp)) {
    running = await this.platform.isProcessRunning(name)
} else {
    running = false
}

Type guard

function isWindowsHost (p: { platform: Platform }): boolean {
    return p.platform === Platform.Windows
}

Try / catch

try {
    return await this.platform.isProcessRunning(name)
} catch (e) {
    if (e instanceof Error && e.message === 'Not supported') return false  // non-Windows: treat as not running
    throw e
}

Prevention

When it happens

Trigger: Calling `isProcessRunning(name)` when `hostApp.platform !== Platform.Windows`. Reachable on macOS/Linux for any feature that checks for a running process (e.g. WinSCP detection, single-instance guards, dependency checks).

Common situations: Cross-platform feature that forgets to gate the call on platform; a Windows-only plugin loaded on Linux; testing on a developer's Mac for code that only runs in prod on Windows.

Related errors


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