jackwener/OpenCLI · error · CommandExecutionError

Instagram mixed-media posting requires Browser Bridge file u

Error message

Instagram mixed-media posting requires Browser Bridge file upload support

What it means

During uploadMedia's retry loop, if setFileInput fails with an 'Unknown action' / 'set-file-input' / 'not supported' error, the library checks whether any media item is a video. Mixed image+video batches cannot use the image-only browser-injection fallback, so it throws this variant to say the driver must natively support setFileInput for media uploads.

Source

Thrown at clis/instagram/post.js:637

        try {
            await page.setFileInput(mediaPaths, activeSelector);
            await dispatchUploadEvents(page, activeSelector);
            return;
        }
        catch (error) {
            const message = error instanceof Error ? error.message : String(error);
            const staleSelector = message.includes('No element found matching selector')
                || message.includes('Could not find node with given id')
                || message.includes('No node with given id found');
            if (staleSelector && attempt === 0) {
                activeSelector = await resolveFreshUploadSelector(page, activeSelector, mediaItems);
                continue;
            }
            if (!message.includes('Unknown action') && !message.includes('set-file-input') && !message.includes('not supported')) {
                throw error;
            }
            if (mediaItems.some((item) => item.type === 'video')) {
                throw new CommandExecutionError('Instagram mixed-media posting requires Browser Bridge file upload support', 'Use Browser Bridge or another browser mode that supports setFileInput for image/video uploads');
            }
            await injectImageViaBrowser(page, mediaPaths, activeSelector);
            return;
        }
    }
}
function describePostDetail(mediaItems) {
    if (mediaItems.every((item) => item.type === 'image')) {
        return mediaItems.length === 1
            ? 'Single image post shared successfully'
            : `${mediaItems.length}-image carousel post shared successfully`;
    }
    return mediaItems.length === 1
        ? 'Single mixed-media post shared successfully'
        : `${mediaItems.length}-item mixed-media carousel post shared successfully`;
}
function getCommandAttemptBudget(mediaItems) {
    if (mediaItems.length >= 10)

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Use Browser Bridge mode which supports setFileInput for image and video uploads
  2. Post the images via the fallback path and upload the video separately if the driver cannot handle mixed media
  3. Upgrade the browser driver to one with full setFileInput support
  4. Retry with an image-only batch to confirm the driver's capability boundary

Example fix

// before
await postMedia(page, ['a.jpg', 'b.mp4']); // mixed batch on unsupported driver
// after
if (!page.setFileInput) {
  await postMedia(page, ['a.jpg']); // image-only can use browser injection
  await postMedia(page, ['b.mp4']); // video posted separately via supported mode
} else {
  await postMedia(page, ['a.jpg', 'b.mp4']);
}
Defensive patterns

Strategy: validation

Validate before calling

const hasVideo = mediaItems.some(i => i.type === 'video');
if (hasVideo && typeof page.setFileInput !== 'function') {
  throw new Error('Video posts require Browser Bridge setFileInput support');
}

Type guard

function canUploadMixedMedia(page, items) {
  return !items.some(i => i.type === 'video') || typeof page.setFileInput === 'function';
}

Try / catch

try {
  await uploadMedia(page, mediaItems, selector);
} catch (e) {
  if (String(e.message).includes('mixed-media posting requires')) {
    // split: images via fallback, video via supported path
    await uploadMedia(page, mediaItems.filter(i => i.type !== 'video'), selector);
    await uploadVideoViaApi(mediaItems.find(i => i.type === 'video'));
  } else throw e;
}

Prevention

When it happens

Trigger: Posting a media set containing at least one video while page.setFileInput either does not exist or rejects the call with 'Unknown action', 'set-file-input', or 'not supported'; the code path reaches the mediaItems.some(type === 'video') branch and throws.

Common situations: Carousel posts combining photos and a video in a non-Browser-Bridge mode, driver versions that only support image file injection, or remote browsers blocking the set-file-input action.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/f27204c1282fe955. Report an issue: GitHub.