From 6082aa61a310deec8cfb37515666feead61d9110 Mon Sep 17 00:00:00 2001 From: Douwe Osinga Date: Fri, 7 Nov 2025 16:29:36 -0500 Subject: [PATCH] Report errors --- crates/goose-server/src/routes/goose_apps.rs | 2 +- .../src/components/apps/GooseAppEditor.tsx | 58 ++++++++++--------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/crates/goose-server/src/routes/goose_apps.rs b/crates/goose-server/src/routes/goose_apps.rs index ce0ace6070..cc26fa54f9 100644 --- a/crates/goose-server/src/routes/goose_apps.rs +++ b/crates/goose-server/src/routes/goose_apps.rs @@ -143,7 +143,7 @@ async fn create_app( .get_file("Clock.gapp") .and_then(|f| f.contents_utf8()) .ok_or_else(|| ErrorResponse::internal("invalid or missing Clock.gapp"))?; - GooseApp::from_file_content(clock_gapp)? + GooseApp::from_file_content(&clock_gapp)? } else { request.app }; diff --git a/ui/desktop/src/components/apps/GooseAppEditor.tsx b/ui/desktop/src/components/apps/GooseAppEditor.tsx index 134058d8bd..c3e1cb1e54 100644 --- a/ui/desktop/src/components/apps/GooseAppEditor.tsx +++ b/ui/desktop/src/components/apps/GooseAppEditor.tsx @@ -77,40 +77,44 @@ export default function GooseAppEditor({ app, onReturn }: GooseAppEditorProps) { }; const handleUpdate = async () => { - setIsIterating(true); - setIterationMessage('Starting iteration...'); + try { + setIsIterating(true); + setIterationMessage('Starting iteration...'); - let currentJs = jsImplementation; - let done = false; + let currentJs = jsImplementation; + let done = false; - while (!done) { - const screenshot = await captureScreenshot(); - const arrayBuffer = await screenshot.arrayBuffer(); - const base64 = globalThis.btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); + while (!done) { + const screenshot = await captureScreenshot(); + const arrayBuffer = await screenshot.arrayBuffer(); + const base64 = globalThis.btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); - const response = await iterateApp({ - body: { - jsImplementation: currentJs, - prd, - screenshotBase64: base64, - errors: iframeErrors.join('\n'), - }, - throwOnError: true, - }); + const response = await iterateApp({ + body: { + jsImplementation: currentJs, + prd, + screenshotBase64: base64, + errors: iframeErrors.join('\n'), + }, + throwOnError: true, + }); - setIterationMessage(response.data.message); + setIterationMessage(response.data.message); - if (response.data.done) { - done = true; - setIterationMessage('Done! ' + response.data.message); - } else { - currentJs = response.data.jsImplementation!; - setJsImplementation(currentJs); - await new Promise((resolve) => setTimeout(resolve, 1000)); + if (response.data.done) { + done = true; + setIterationMessage('Done! ' + response.data.message); + } else { + currentJs = response.data.jsImplementation!; + setJsImplementation(currentJs); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } } + } catch (e) { + setIterationMessage('Iteration failed ' + errorMessage(e)); + } finally { + setIsIterating(false); } - - setIsIterating(false); }; const handleSave = async () => {