From ff5802ab636b8c5c530f3c6bf3ae6c4a43665f8c Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Fri, 20 Mar 2026 20:58:42 +0100 Subject: [PATCH] fix: don't crash on 404, add sync debug logging ProjectKey.fetch_key now returns empty defaults instead of raising RuntimeError on API errors. Added logging to _syncFromSource and fetch_key to trace the seq=4001 vs seq=4 mismatch. Co-Authored-By: Claude Opus 4.6 --- project_loader.py | 11 ++++++++++- web/project_key.js | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/project_loader.py b/project_loader.py index ba7d1bc..ce361d9 100644 --- a/project_loader.py +++ b/project_loader.py @@ -264,10 +264,19 @@ class ProjectKey: file_name="", sequence_number=1): # source_label is used by JS to identify which ProjectSource to sync # config from. The actual config arrives via the optional widgets below. + logger.info("ProjectKey.fetch_key: source=%s key=%s url=%s project=%s file=%s seq=%s", + source_label, key_name, manager_url, project_name, file_name, sequence_number) data = _fetch_data(manager_url, project_name, file_name, sequence_number) if data.get("error") in ("http_error", "network_error", "parse_error"): msg = data.get("message", "Unknown error") - raise RuntimeError(f"Failed to fetch data: {msg}") + logger.warning("ProjectKey.fetch_key failed: %s", msg) + # Return empty/default instead of crashing the workflow + if key_type == "INT": + return (0,) + elif key_type == "FLOAT": + return (0.0,) + else: + return ("",) val = data.get(key_name, "") diff --git a/web/project_key.js b/web/project_key.js index f819416..eb7065c 100644 --- a/web/project_key.js +++ b/web/project_key.js @@ -121,11 +121,17 @@ app.registerExtension({ nodeType.prototype._syncFromSource = function () { const srcWidget = this.widgets?.find(w => w.name === "source_label"); const source = this._findSource(srcWidget?.value); - if (!source) return; + if (!source) { + console.log(`[ProjectKey] _syncFromSource id=${this.id}: no source found for label="${srcWidget?.value}"`); + return; + } for (const name of ["manager_url", "project_name", "file_name", "sequence_number"]) { const dst = this.widgets?.find(w => w.name === name); const src = source.widgets?.find(w => w.name === name); - if (dst && src) dst.value = src.value; + if (dst && src) { + dst.value = src.value; + console.log(`[ProjectKey] _syncFromSource id=${this.id}: ${name}="${src.value}"`); + } } };