Skip to content

feat(app): sidebar navigation, lazy file tree, task notifications, terminal and toolset expansion - #31

Merged
oustery merged 4 commits into
mainfrom
feat/ux-expansion
Nov 11, 2026
Merged

oustery merged 4 commits into
mainfrom
feat/ux-expansion

Conversation

@oustery

@oustery oustery commented Nov 11, 2026

Copy link
Copy Markdown
Owner

Four user-reported pain points, one batch:

1. Files explorer: folders now expand

The old design rescanned the whole workspace on every folder tap — a global scan whose first unreadable entry or lost race silently killed expansion, and the chevron never moved. The explorer is rebuilt around a lazily loaded tree:

  • every directory loads its own single level on expand (FileTree.flatten, pure + JVM-tested); expanding never rescans the rest of the tree
  • the chevron answers the tap synchronously with an animated rotation
  • loading directories show a spinner; per-directory errors mark only that row (tap it to retry) instead of failing the whole scan
  • files gain human-readable sizes, loaded directories a child count
  • dotfiles (.git, .env, …) stay hidden behind a header eye toggle (reloads affected levels)

2. Background resilience + task-status notification

  • the persistent notification doubles as a task board: a shared AgentActivity state (fed by the chat busy flag) renders "running… / finished" with an indeterminate progress bar, so a prompt keeps its status visible after the user leaves the app
  • a bounded (30 min) partial WAKE_LOCK keeps a streaming run alive with the screen off (permission added to the manifest)
  • a running task also keeps the foreground service up in remote-only mode, where it used to be stopped

3. Terminal conveniences

  • de-duplicated command history chips (24 entries); recall fills the composer for editing instead of firing blindly
  • copy-all-output header action
  • A-/A+ font zoom (0.7–1.6×) for output and composer
  • more quick commands (git log --oneline -5, rg --version, python3 --version, node --version)

4. Sidebar navigation

  • the bottom bar is replaced by a Material 3 modal drawer: menu button in every screen header, NavigationDrawerItem destinations, live server + agent status chips in the sheet
  • the wide-layout rail stays permanent; the header menu button renders only when a drawer is available (never during bootstrap)

5. Initial toolset expansion

Bootstrap now ships jq, fd-find (fdfind), tree, zip, unzip and python3 on top of git/curl/ripgrep/less/procps/ca-certificates. Tarballs rebuilt with tools/build_toolset.py and published as assets of the new toolset-v1 release, sha256 re-pinned in Pins.


No new dependencies; all strings localized (en + ru); tools/check_ui_policy.py green; new FileTreeTest covers flatten/sort/format/hidden-name logic.

…rminal and toolset expansion

Four user-reported pain points, one batch:

1. Files explorer rebuilt around a lazily loaded tree. The old design
   rescanned the whole workspace on every folder tap (a global scan whose
   first bad entry or lost race silently killed expansion), and the chevron
   never moved. Now every directory loads its own single level on expand
   (FileTree.flatten, pure + JVM-tested), the chevron answers the tap
   synchronously with an animated rotation, loading dirs show a spinner,
   per-directory errors mark only that row (tap to retry), files gain
   human-readable sizes and loaded dirs a child count, and dotfiles like
   .git stay hidden behind a header toggle.

2. Background resilience + task board. The shell/agent work now drives the
   persistent notification: a shared AgentActivity state (fed by the chat
   busy flag) renders 'running…/finished' with an indeterminate progress
   bar, a tap opens the app, and a bounded (30 min) partial wake lock keeps
   a streaming run alive with the screen off. A running task also keeps the
   foreground service up in remote-only mode, where it used to be stopped.

3. Terminal conveniences: de-duplicated command history chips (recall fills
   the composer instead of firing blindly), copy-all-output header action,
   A-/A+ font zoom for output and composer, and more quick commands.

4. Sidebar navigation: the bottom bar is replaced by a Material 3 modal
   drawer (menu button in every screen header, NavigationDrawerItem
   destinations, live server + agent status chips), the wide-layout rail
   stays permanent. ScreenHeader gains NavMenuButton, Settings uses
   navigationIcon on LargeFlexibleTopAppBar.

5. Toolset expansion: bootstrap now ships jq, fd-find (fdfind), tree, zip,
   unzip and python3 on top of git/curl/ripgrep; tarballs rebuilt with
   tools/build_toolset.py and re-pinned (toolset-v1 release assets).

No new dependencies; all strings localized (en+ru); UI policy green.
… attr

The app theme has no colorControlNormal (no AppCompat bridge); a tint
attribute pointing at it breaks resource linking. Both icons now follow
the Lucide stroke style every other drawable uses — Icon() applies the
tone at composition time anyway.
AtomicLong and the app R class were referenced without imports; the
third reported error was a cascade of the first.
The divisor loop divided 102400 B into 100 but then labelled it MB:
the value after the first division is in KB, so the unit index must
start there. 102400 B now renders as 100 KB.
@oustery
oustery merged commit 2a71ec0 into main Nov 11, 2026
1 check passed
@oustery
oustery deleted the feat/ux-expansion branch November 11, 2026 09:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant