diff --git a/packages/web-ui/src/components/SandboxedIframe.ts b/packages/web-ui/src/components/SandboxedIframe.ts index 8d9655df..47155016 100644 --- a/packages/web-ui/src/components/SandboxedIframe.ts +++ b/packages/web-ui/src/components/SandboxedIframe.ts @@ -329,9 +329,29 @@ export class SandboxIframe extends LitElement { (async () => { try { ${userCode} + + // Call completion callbacks before complete() + if (window.__completionCallbacks && window.__completionCallbacks.length > 0) { + try { + await Promise.all(window.__completionCallbacks.map(cb => cb(true))); + } catch (e) { + console.error('Completion callback error:', e); + } + } + window.complete(); } catch (error) { console.error(error?.stack || error?.message || String(error)); + + // Call completion callbacks before complete() (error path) + if (window.__completionCallbacks && window.__completionCallbacks.length > 0) { + try { + await Promise.all(window.__completionCallbacks.map(cb => cb(false))); + } catch (e) { + console.error('Completion callback error:', e); + } + } + window.complete({ message: error?.message || String(error), stack: error?.stack || new Error().stack diff --git a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts index 642aa15a..00ebeac2 100644 --- a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +++ b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts @@ -143,15 +143,6 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider { } } }; - - // Fallback timeout for HTML artifacts that don't call complete() - if (document.readyState === "complete" || document.readyState === "interactive") { - setTimeout(() => (window as any).complete(), 2000); - } else { - window.addEventListener("load", () => { - setTimeout(() => (window as any).complete(), 2000); - }); - } }; }