diff --git a/CHANGELOG.md b/CHANGELOG.md index d6c7893b..c51e5bbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ ## [Unreleased] +## [v0.51.635] — 2026-06-24 — Release WP (no more "parse failed" note under JSON/YAML fragments) + +### Fixed + +- **JSON/YAML code blocks that aren't valid top-level documents no longer show a bare "parse failed" note.** The chat renderer's Tree-view affordance stamped an unstyled `parse failed` line below any fenced block it couldn't `JSON.parse` — but assistants routinely emit fragments (a bare `key: value` line, `…` snippets, trailing commas) that legitimately don't parse, so the note was pure noise under an otherwise-clean code box. Those blocks now fall through silently to the normal syntax-highlighted raw view; the per-block Raw/Tree toggle and the configurable default-view behavior are unchanged. Thanks @metaember. (#4858, #484) + ## [v0.51.634] — 2026-06-24 — Release WO (faster profile list — skill stats are cached with an mtime probe) ### Fixed diff --git a/static/ui.js b/static/ui.js index 45252c98..7f0a191a 100644 --- a/static/ui.js +++ b/static/ui.js @@ -13636,15 +13636,12 @@ function initTreeViews(container){ // Mark as initialised only after we've committed to a render decision wrap.setAttribute('data-tree-init','1'); if(!parsed || typeof parsed!=='object'){ - if(parseFailed){ - const hint=wrap.querySelector('.tree-raw-view'); - if(hint&&!hint.querySelector('.tree-parse-note')){ - const note=document.createElement('div'); - note.className='tree-parse-note'; - note.textContent=t('parse_failed_note')||'parse failed'; - hint.parentNode.insertBefore(note,hint.nextSibling); - } - } + // No tree view for non-object values or unparseable content. LLMs often + // emit JSON fragments (a bare "key": "val" line, snippets with ..., etc.) + // that legitimately fail JSON.parse; surfacing a "parse failed" note for + // those was pure noise. The block still renders as syntax-highlighted raw, + // so just fall through silently. (parseFailed is retained for clarity.) + void parseFailed; return; // leave as raw view } const lineCount=rawText.split('\n').length;