diff --git a/CHANGELOG.md b/CHANGELOG.md index 57e2253..5ffb22a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,41 @@ --- +## [v0.20] Sprint 18 -- File Preview Auto-Close + Thinking Display + Workspace Tree +*April 3, 2026 | 318 tests* + +### Features +- **File preview auto-close on directory navigation.** When viewing a file in + the right panel and navigating directories (breadcrumbs, up button, folder + clicks), the preview now automatically closes instead of showing stale + content. `clearPreview()` extracted as named function and called from + `loadDir()`. Unsaved preview edits prompt for confirmation before discarding. +- **Thinking/reasoning display.** Assistant messages with structured content + arrays containing `type:'thinking'` or `type:'reasoning'` blocks (Claude + extended thinking, o3 reasoning) now render as collapsible gold-themed cards + above the response text. Collapsed by default. Click the header to expand and + see the model's reasoning process. Uses `esc()` on all content for XSS safety. +- **Workspace tree view (Issue #22).** Directories expand/collapse in-place + with toggle arrows. Single-click toggles a directory open/closed. Double-click + navigates into it (breadcrumb view). Subdirectory contents fetched lazily from + the API and cached in `S._dirCache`. Nesting depth shown via indentation. + Empty directories show "(empty)" placeholder. Breadcrumb navigation still + works alongside the tree view. + +### Bug Fixes +- **Stale tree cache on session switch.** `S._dirCache` and `S._expandedDirs` + are now cleared when navigating to the root directory, preventing session B + from showing session A's cached file listings. +- **clearPreview() discards unsaved edits.** Navigation now checks + `_previewDirty` and prompts before discarding unsaved preview changes. + +### Architecture +- `clearPreview()` extracted from inline handler to named function in `boot.js`. +- Thinking card styles added to `style.css` (gold-themed, collapsible). +- Tree toggle and empty-directory styles added to `style.css`. + +--- + ## [v0.19] Sprint 17 -- Workspace Polish + Slash Commands + Settings *April 3, 2026 | 318 tests* @@ -614,4 +649,4 @@ Three-panel layout: sessions sidebar, chat area, workspace panel. --- -*Last updated: v0.18.1, April 2, 2026 | Tests: 289* +*Last updated: v0.20, April 3, 2026 | Tests: 318* diff --git a/SPRINTS.md b/SPRINTS.md index b7f2cca..1255775 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -1,6 +1,6 @@ # Hermes Web UI -- Forward Sprint Plan -> Current state: v0.19 | 318 tests | Daily driver ready +> Current state: v0.20 | 318 tests | Daily driver ready > This document plans the path from here to two targets: > > Target A: 1:1 feature parity with the Hermes CLI (everything you can do from the diff --git a/static/boot.js b/static/boot.js index cb76044..f0a8450 100644 --- a/static/boot.js +++ b/static/boot.js @@ -43,14 +43,16 @@ $('importFileInput').onchange=async(e)=>{ } }; // btnRefreshFiles is now panel-icon-btn in header (see HTML) -$('btnClearPreview').onclick=()=>{ - $('previewArea').classList.remove('visible'); - $('previewImg').src=''; - $('previewMd').innerHTML=''; - $('previewCode').textContent=''; - $('previewPathText').textContent=''; - $('fileTree').style.display=''; -}; +function clearPreview(){ + const pa=$('previewArea');if(pa)pa.classList.remove('visible'); + const pi=$('previewImg');if(pi)pi.src=''; + const pm=$('previewMd');if(pm)pm.innerHTML=''; + const pc=$('previewCode');if(pc)pc.textContent=''; + const pp=$('previewPathText');if(pp)pp.textContent=''; + const ft=$('fileTree');if(ft)ft.style.display=''; + _previewCurrentPath='';_previewCurrentMode='';_previewDirty=false; +} +$('btnClearPreview').onclick=clearPreview; // workspacePath click handler removed -- use topbar workspace chip dropdown instead $('modelSelect').onchange=async()=>{ if(!S.session)return; diff --git a/static/index.html b/static/index.html index 08c9990..862adc0 100644 --- a/static/index.html +++ b/static/index.html @@ -13,7 +13,7 @@