Skip to content

Let users customize sidebar footer order and visibility - #3550

Merged
ymichael merged 3 commits into
mainfrom
bb/standalone-sidebar-footer-customization-thr_avdevumw57
Sep 12, 2026
Merged

ymichael merged 3 commits into
mainfrom
bb/standalone-sidebar-footer-customization-thr_avdevumw57

Conversation

@ymichael

Copy link
Copy Markdown
Collaborator

Human comments

What was wrong

Sidebar footer shortcuts had a fixed order and could not be hidden without losing access to an action or changing the plugin. Users need one customization surface for Settings, Report a bug, and registered plugin actions/disclosures.

What changed

Settings → Appearance now supports footer drag ordering and visibility. Right-click Hide moves an action into More; More only appears when hidden registered actions exist and links back to Appearance. Hiding an open disclosure closes it, and More can reopen it with Escape focus restoration.

Stable IDs persist through the existing SDK/CLI UI preferences (sidebar.footerOrder, sidebar.hiddenFooterItems). Unknown/disabled-plugin preferences survive reloads; new actions default visible. Updated configuration docs, CLI guide/skill reference, and Plugin Guide. Uses the shared mobile drawer and guards non-left pointer release in the context menu. No daemon wire or plugin API changes.

Standalone adaptation of reference commit 2114294 onto main at 001818f; no unrelated provider usage/RPC changes.

How you verified

  • Turbo app/domain/server/plugin-api-map typechecks passed.
  • 105 distinct targeted tests passed: footer behavior, preference synchronization/stored ordering, sidebar behavior, responsive drawer, and public UI-preference persistence/validation against a migrated database.
  • Optimized isolated pnpm start:worktree preview: actual right-click Hide, hidden action/disclosure activation, Escape focus restoration, Appearance restoration, mouse drag and reload, CLI plugin disable/enable/reload, unknown IDs, all-hidden keyboard navigation.
  • Chromium mobile touch: More drawer opens/closes/reopens, hidden disclosure works, Customize navigates, content stays mounted, app root is non-inert and not aria-hidden.
  • iOS Safari interaction blocked: Computer Use returned cgWindowNotFound for Simulator. Desktop Chromium emitted a focus/aria-hidden warning during menu transitions; observed focus and mobile root checks passed. Full test suite not run.

Remote isolated preview (owner Connect session required). Settings/Remote access visible; Provider usage/Report a bug in More. Unknown preference ID retained. Server is left running on 26501.

AGENT GENERATED

@ymichael
ymichael marked this pull request as ready for review September 12, 2026 03:55
@ymichael
ymichael merged commit 4baf82c into main Sep 12, 2026
16 checks passed
@ymichael
ymichael deleted the bb/standalone-sidebar-footer-customization-thr_avdevumw57 branch September 12, 2026 04:00
ymichael added a commit that referenced this pull request Sep 14, 2026
…sage (#3449)

## Human comments

## What was wrong

Plugins could call schema-validated RPC methods but could not discover
implementations or inspect their contracts. Usage displays had no common
resource model for pooled and machine-local accounts, targeted fetching,
or deduplicating known accounts. Usage settings lived in core instead of
the display plugin.

## What changed

- Add opt-in RPC publication with `experimental_discoverable`,
registration/method descriptions, JSON Schemas, and SDK discovery. CLI
supports `rpc list [plugin-id]`, `rpc inspect <plugin-id> [method]`, and
`rpc call`. Discovery advertises live registrations; it does not change
authorization or negotiate versions. SDK minimum is `0.4.87`.
- Provider Usage owns `provider-usage.v1.listResources` (cheap
inventory) and `provider-usage.v1.getResource` (actual usage for one
resource, with optional cache reuse through `refresh: false`). Account
Pooler, Codex, Claude Code, and ACP explicitly implement copied
contracts. No shared schema package or core adapter is introduced.
- Separate source-local resource IDs from provider-issued account
identities. Deduplicate known identities within the selected location,
never by email. Normalize plan/window labels; pooled Codex accounts
preserve plan metadata from usage responses.
- Move usage settings into Provider Usage, enable it by default on new
installations, and retain the temporary `/settings/usage` redirect.
Existing enable/disable choices remain intact. Settings and footer share
aggregation/cache; settings fetches the selected location and the footer
fetches its selected provider tab. Each settings account uses the same
provider icon/header, email and plan-tag layout.
- Preserve stale measurements after refresh failures and handle empty
pools, authentication, missing limits, offline hosts, loading and
removed resources. Sources remain independent of the display. Footer
customization uses the implementation already merged in PR #3550.
- Update Plugin Guide, API audit, CLI/configuration guidance and
verification recipes. Isolate server test loggers and restore spies to
prevent cross-test warning leakage.

## How you verified

- Relevant app/server/SDK/provider/CLI typechecks and RPC discovery
tests passed during implementation. Recent focused checks: 285 Account
Pooler tests, 20 Provider Usage tests, 607 CLI tests and 74 Plugin Guide
tests passed. The full server suite passed with 2,601 tests after logger
isolation.
- Source tests cover cheap inventories, targeted fetches, cache/force
concurrency, ownership, removed resources, offline hosts and account
identity normalization. Display tests cover source/provider selection,
empty/error/loading states and cached measurements.
- Dev Browser verified real pool and machine usage, consistent
per-account headers and plan tags, and the settings redirect. Browser
fixtures exercised empty/loading/error responses without changing saved
accounts. The preview runs with `pnpm start:worktree`.
- JSON Schema refinement/transform fidelity remains an experimental
stabilization audit. Safari interaction verification was blocked by
Computer Use `cgWindowNotFound`; no Safari pass is claimed.

Preview:
https://ymichael-latest--25451.getbb.app/settings/plugins/provider-usage

> AGENT GENERATED
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