Camera never delegated to widget iframe — sandbox.permissions only lists microphone, no prompt/NotAllowedError (regression, worked ~1 week ago)

We have an MCP App (ChatGPT Apps SDK / @modelcontextprotocol/ext-apps@1.7.4) that requests camera access from a widget via:
const stream = await window.navigator.mediaDevices.getUserMedia({
video: { facingMode: 'user' },
audio: false,
});

This worked correctly until roughly a week ago. It now fails consistently on desktop and mobile web (macOS Chrome and Android Chrome), with no OS/browser permission prompt ever appearing.

Console output:
navigator.permissions camera state: denied
document.featurePolicy.allowsFeature("camera"): false
[Violation] Permissions policy violation: camera is not allowed in this document.
Full error: NotAllowedError: Permission denied

We instrumented app.getHostCapabilities() from @modelcontextprotocol/ext-apps to see what the host actually advertises for this session:
host sandbox.permissions: { microphone: {…} }

camera is absent — even though our resource _meta.ui.permissions.camera = {} is declared correctly (matches the SDK’s McpUiResourceMeta/McpUiHostCapabilities type schema). This confirms the host is not delegating camera into the widget’s sandboxed iframe at all in this session, regardless of what we request.

This matches what’s shown in Camera access on ChatGPT Apps?, where the rendered iframe’s allow attribute was:
allow="local-network-access *; microphone *; midi *"

camera missing there too.

Questions:

  1. Is camera delegation to widget iframes currently gated behind app review/publication (vs. Developer Mode / local test connectors)? Our test connector is a local dev tunnel, not yet submitted for review.
  2. Is this a recent regression, or was camera ever consistently supported for widget iframes in production?
  3. Is there a supported workaround (e.g., a host-mediated capture API, similar to window.openai.uploadFile, instead of raw getUserMedia) for apps that need live camera preview?