Skip to content

Add independent draft composers, split navigation, and sidebar lifecycle filters - #3531

Open
brsbl wants to merge 8 commits into
bb/server-draft-resources-thr_8j56at3ii2from
bb/draft-composers-sidebar-thr_8j56at3ii2
Open

brsbl wants to merge 8 commits into
bb/server-draft-resources-thr_8j56at3ii2from
bb/draft-composers-sidebar-thr_8j56at3ii2

Conversation

@brsbl

@brsbl brsbl commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

Human comments

What was wrong

The app shared one New thread composer buffer across panes. A second draft could replace the first, and saved draft resources had no app navigation or lifecycle discovery.

What changed

  • New thread creates an independent durable draft, including text, attachments, destination, and composer options.
  • Drafts survive reload, pane closure, switching, and submission of a neighboring draft; New thread supports modifier-click and drag splits.
  • Sidebar lifecycle filtering defaults to Active; Drafts and Archived are opt-in. Existing follow-up pencil status remains distinct.
  • Added sdk.drafts.open, bb thread draft open --split, and inspect/set/reset parity for sidebar.lifecycleFilter.
  • Existing singleton data imports only after acknowledgment. Local recovery retains unsaved and conflicting edits without another window taking ownership.
  • Existing API, CLI, plugin, and daemon contracts remain compatible. Split persistence keeps a v1 rollback projection; Plugin SDK 0.4.85 adds declarations.

This layer depends only on the durable resource foundation. Core palette delivery remains independent; its coordinated draft/filter adapter follows separately.

How you verified

Current head 79b0dd25a4f30045cc2204bee3dc7caa9ceaf318 is verified against parent d70cb6fe262bf3ad7ad98d29c820dd2c63bd94ec. Both incorporate main’s machine-provider release.

  • Exact-head remote CI and all required PR checks passed, including Node compatibility and package smoke jobs.
  • Chrome for Testing 153.0.8010.36 passed desktop and compact draft, split, recovery, project, model, archive, and lifecycle interactions.
  • Real source SDK/CLI verified shared drafts, open/split navigation, lifecycle preference parity, and submission without consuming neighboring drafts.
  • The single permitted review is complete. All six validated P1 findings are fixed; no second review ran.
Focused verification and review disposition

The isolated branch app was launched with scripts/bb-dev-app current using Node 22.19.0. Browser checks used one Chrome for Testing profile, with 1440 × 960 desktop and 390 × 844 phone CSS viewports at 2× density.

  • Independent text and permission changes survived hard reload and close/reopen through the CLI.
  • The real Send later flow submitted one draft into a scheduled thread while preserving two other draft identities and contents.
  • Passive windows opened both before editing and after an interrupted save did not cancel autosave or claim the editor's checkpoint. Closing/reopening the editor recovered the pending save.
  • Creating a project retained the originating draft ID, prompt, and attachment; the copied attachment was readable in the new project.
  • Selecting GPT-5.5 from a draft saved with Ultra reasoning persisted supported Extra High reasoning. An unset provider resolved to a ready provider.
  • Modifier-click and drag opened focused independent composers. Compact lifecycle selection and reset used the existing drawer. System dark/light changes preserved the draft state.
  • Replacing an active pane with an already archived thread preserved the pane and archive state. Archiving an active thread still removed its existing pane.
  • Remote regressions cover true competing writers, delayed provider discovery, saved unavailable options, attachment migration, singleton import, and persisted layout compatibility.
  • After main integration, repeated only affected flows: independent restoration/focus, compact layout, lifecycle selection/reset and SDK readback, fresh modifier splits, and durable provider-machine destination/options. All passed at the final head.

Review fixes were limited to passive recovery ownership, archived-pane identity, fresh split activation, project creation in the current draft, dependent reasoning selection, and ready-provider initialization.

P2 follow-up, intentionally excluded: independent browser stores with identical legacy prompt bytes but different options can collide on the import identity. The server rejects the mismatched retry and the local bytes remain preserved.

No local tests, typechecks, or lint were run. Browser fault injection blocked only an owned draft's save URL. The native folder picker was cancelled in the isolated daemon to exercise the real path-entry fallback. Temporary synthetic submission/project fixtures were removed.

Before and after

Both revisions use the same isolated fixture data, route /?draft=drf_ui_regression_list, theme, viewport, and layout-restore sequence. Before is parent head d70cb6fe262bf3ad7ad98d29c820dd2c63bd94ec; after is exact head 79b0dd25a4f30045cc2204bee3dc7caa9ceaf318. Desktop restoration previously shared the singleton; compact restoration previously returned to the welcome state.

Layout Before After
Desktop · 1440 × 960 CSS · 2× before-desktop.png after-desktop.png
Phone · 390 × 844 CSS · 2× before-mobile.png after-mobile.png

Compact lifecycle controls, after opting into Drafts and Archived:

after-mobile-lifecycle.png

BB-Thread-ID: thr_8j56at3ii2

AGENT GENERATED

@brsbl
brsbl added this pull request to stack #3532 September 11, 2026 20:31
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