From b7d803213428b071451ed350cd9986ef56df54eb Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Tue, 2 Jun 2026 14:42:20 +0200 Subject: [PATCH] fix: synthesize value wrapper on draft-only raw_app response --- .../apps_raw/edit/[...path]/+page.svelte | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.svelte index fda12fa01c..15c029fe06 100644 --- a/frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/apps_raw/edit/[...path]/+page.svelte @@ -191,16 +191,31 @@ newPath = '' return } - const backendApp = await AppService.getAppByPath({ + const backendApp = (await AppService.getAppByPath({ path: page.params.path ?? '', workspace: $workspaceStore!, getDraft: true, rawApp: true - }) + })) as any if (tok !== loadAppToken) return if (backendApp.is_draft) { sendUserToast('Loaded your saved draft') } + // When the backend falls back to `fetch_draft_only` (no deployed + // row at this path, only a per-user draft), the response's inner + // is the raw draft JSON — flat `{files, runnables, data, summary, + // policy, custom_path}`, no `.value` wrapper. The rest of this + // loader (and `extractRawApp` below) expects the deployed shape + // where those live under `.value`. Synthesize the wrapper here + // so both paths are uniform downstream. + if (backendApp.is_draft && backendApp.value === undefined) { + backendApp.value = { + files: backendApp.files ?? {}, + runnables: backendApp.runnables ?? {}, + data: backendApp.data + } + if (backendApp.policy === undefined) backendApp.policy = {} + } const backendApp_ = structuredClone(stateSnapshot(backendApp)) savedApp = { summary: backendApp_.summary,