Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .bb/skills/verify-bb/features/settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ command’s `--help` before mutation. Use fresh browser snapshots for controls.
| Voice configuration | Load microphones, select one, pick the Voice input service in Settings → AI services, and transcribe a harmless fixture. | Choice is applied to recording/transcription; the microphone hides when the selected service is not ready or Voice input is Off. |
| Usage | Inspect Usage limits and settings usage; compare provider-reported windows. | Unavailable data remains unavailable rather than zero. |
| AI services picker | Open Settings → AI services. For Thread titles and Commit messages pick Automatic, a registered service, and Off; press Test; mirror with `settings ai-services`, `settings ai-services set <task> <choice>`, and `settings ai-services test <task>`. Create a thread and use the Commit action under each choice. | Each row lists only services that handle the task, with their status line; Automatic names the first ready builtin service; a picked service is used alone and a failure falls back to prompt-text titles and `bb: automated commit`; Off never calls a service; a failed Test shows the reason in the row; choices persist across reload and match the CLI. |
| Experiments | Exercise changelogPreview, serverMove, and navigationRail on/off in isolated data. For navigationRail, open Settings, Plugins, Skills, and a plugin panel from the rail on a wide window and confirm the rail stays, the matching tab is current, and Home returns to the last thread. | Only the named feature gate changes; disabled routes/actions fail or disappear as designed; state restores. |
| Experiments | Exercise changelogPreview and serverMove on/off in isolated data. | Only the named feature gate changes; disabled routes/actions fail or disappear as designed; state restores. |
| Navigation rail | Open Settings, Plugins, Skills, and a plugin panel from the rail on a wide window and in the compact drawer; confirm the rail stays, the matching destination is current, and Home returns to the last thread. Hide and reorder a destination through More → Customize rail. | Rail order and visibility persist in `sidebar.pluginPanelOrder` and `sidebar.visiblePluginPanels`; in the drawer, Home, Plugins, Skills, and Settings leave it open and a plugin page closes it. |
| Storage & retention plugin | Enable bb--storage-retention in a fresh instance. Verify Never/off defaults, immediate saves without success toasts, failed-save rollback, reload persistence, CLI parity, scans, background cleanup progress, and inline deletion confirmations. Using disposable fixtures, verify archive storage cleanup after the undo grace, cancellation on unarchive/pin, and development cleanup after checkout removal, including offline/reload recovery. | Automatic cleanup requires the corresponding opt-in. Clearing files preserves conversations and attachment originals; large-file cleanup preserves small files. Pins exempt affected groups; automation protection is deferred. Removal-feed cursors and pending work survive reload; expired cursors trigger reconciliation. Disabling stops plugin schedules and actions; re-enabling preserves policy. Verify compact Safari without app-root inert/aria-hidden. |
| Debug events | Toggle Show unhandled provider events and render a trusted unsupported-event fixture. | The diagnostic row visibility follows the toggle without changing persisted event data. |
| Community and update surfaces | Open Community links, version/update view, changelog, and CLI skills status. | Destinations and installed/latest status are correct; viewing does not perform an update. |
Expand Down
3 changes: 0 additions & 3 deletions apps/app/.ladle/plugin-sdk-app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ export const {
experimental_useSidebarThreadActions,
experimental_useSidebarThreadPullRequest,
experimental_useSidebarThreadSplit,
experimental_useSidebarNavigation,
experimental_useSidebarNavigationSplit,
experimental_SidebarNavigationIcon,
useSidebarThreadDraft,
useSidebarThreadDraftIds,
useSidebarThreadRowStatus,
Expand Down
26 changes: 14 additions & 12 deletions apps/app/.ladle/story-settings-chrome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
type SettingsSectionId,
} from "@/components/settings/settings-sections";
import {
Sidebar,
SidebarInset,
SidebarProvider,
SidebarTrigger,
Expand Down Expand Up @@ -65,18 +66,19 @@ export function SettingsStoryChrome({
className="h-screen min-h-[640px] bg-background"
style={{ "--bb-shell-height": "100vh" } as CSSProperties}
>
<SettingsSidebarContent
appRoutePath="/"
isResizing={false}
navigation={{
activePluginId: null,
activeSection: resolvedActiveSection,
pluginEntries: [],
sections: SETTINGS_NAV_SECTIONS,
}}
onResizeMouseDown={() => {}}
testIdPrefix="settings-story"
/>
<Sidebar>
<SettingsSidebarContent
isResizing={false}
navigation={{
activePluginId: null,
activeSection: resolvedActiveSection,
pluginEntries: [],
sections: SETTINGS_NAV_SECTIONS,
}}
onResizeMouseDown={() => {}}
testIdPrefix="settings-story"
/>
</Sidebar>
<SidebarInset>
<div className="relative flex h-full min-h-0 min-w-0 flex-col">
<AppPageHeader
Expand Down
1 change: 0 additions & 1 deletion apps/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@
"bb-plugin-automations": "workspace:*",
"bb-plugin-bb-guide": "workspace:*",
"bb-plugin-environment-modal-sandbox": "workspace:*",
"bb-plugin-navigation": "workspace:*",
"bb-plugin-provider-pi": "workspace:*",
"bb-plugin-secrets": "workspace:*",
"bb-plugin-thread-list": "workspace:*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
const viewportState = vi.hoisted(() => ({
compact: false,
macosChrome: false,
navigationRail: false,
}));

vi.mock("@bb/shared-ui/hooks/use-compact-viewport", () => ({
Expand All @@ -43,7 +42,6 @@ vi.mock("@/hooks/queries/system-queries", () => ({
changelogPreview: false,
serverMove: false,
performanceDiagnostics: false,
navigationRail: viewportState.navigationRail,
},
},
}),
Expand Down Expand Up @@ -210,7 +208,6 @@ describe("AppLayout plugin panel header", () => {
beforeEach(() => {
viewportState.compact = false;
viewportState.macosChrome = false;
viewportState.navigationRail = false;
setCompactSecondaryPanelPresentation("closed");
});

Expand Down Expand Up @@ -287,7 +284,6 @@ describe("AppLayout plugin panel header", () => {

it("moves the trigger and history controls into a window title bar beside the macOS rail", () => {
viewportState.macosChrome = true;
viewportState.navigationRail = true;
renderPluginPanelRoute();

const titleBar = screen.getByTestId("app-window-title-bar");
Expand All @@ -303,22 +299,15 @@ describe("AppLayout plugin panel header", () => {
expect(screen.queryByTestId("app-desktop-sidebar-trigger")).toBeNull();
});

it("keeps the floating macOS trigger without the rail and on compact windows", () => {
it("keeps the floating macOS trigger on compact windows", () => {
viewportState.macosChrome = true;
viewportState.compact = true;
renderPluginPanelRoute();

expect(screen.queryByTestId("app-window-title-bar")).toBeNull();
expect(screen.getByTestId("app-desktop-sidebar-trigger")).toBeTruthy();
expect(
screen.getByTestId("app-layout-root").dataset.framed,
).toBeUndefined();

cleanup();
viewportState.compact = true;
viewportState.navigationRail = true;
renderPluginPanelRoute();

expect(screen.queryByTestId("app-window-title-bar")).toBeNull();
expect(screen.getByTestId("app-desktop-sidebar-trigger")).toBeTruthy();
});
});
21 changes: 3 additions & 18 deletions apps/app/src/components/layout/AppLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ import { dispatchBrowserViewBoundsSync } from "@/lib/browser-view-bounds-sync";
import { useFaviconBadge } from "@/lib/favicon-color-preference";
import { shouldShowFaviconAttentionDot } from "./faviconAttentionDot";
import { AppLayoutSidebar } from "./AppLayoutSidebar";
import { useNavigationRailExperiment } from "@/components/sidebar/navigationRailExperiment";
import { NAV_RAIL_COLLAPSED_SIDEBAR_WIDTH } from "@/components/sidebar/navRailWidth";
import { SidebarHistoryNavigationControls } from "@/components/sidebar/SidebarHistoryNavigationControls";
import {
Expand Down Expand Up @@ -179,19 +178,14 @@ const sidebarOpenAtom = atomWithStorage<boolean>(
);

interface SidebarStateBridgeProps {
navigationRail: boolean;
framed: boolean;
children: ReactNode;
}

type SidebarResizeMouseEvent = ReactMouseEvent<HTMLDivElement>;
type SidebarOpenChangeHandler = (open: boolean) => void;

function SidebarStateBridge({
navigationRail,
framed,
children,
}: SidebarStateBridgeProps) {
function SidebarStateBridge({ framed, children }: SidebarStateBridgeProps) {
const [open, setOpen] = useAtom(sidebarOpenAtom);
const sidebarWidth = useAtomValue(sidebarWidthAtom);
const sidebarLiveWidth = useAtomValue(sidebarLiveWidthAtom);
Expand All @@ -209,9 +203,7 @@ function SidebarStateBridge({
return (
<SidebarProvider
width={`${sidebarLiveWidth ?? sidebarWidth}px`}
collapsedRailWidth={
navigationRail ? NAV_RAIL_COLLAPSED_SIDEBAR_WIDTH : undefined
}
collapsedRailWidth={NAV_RAIL_COLLAPSED_SIDEBAR_WIDTH}
framed={framed}
data-testid="app-layout-root"
open={open}
Expand Down Expand Up @@ -487,7 +479,6 @@ export function AppLayout({ children }: AppLayoutProps) {
const navigate = useNavigate();
const { appRoutePath, settingsRoutePath, toolsBackRoutePath } =
useAppSettingsRouteMemory();
const navigationRail = useNavigationRailExperiment();
const setRootComposeProjectId = useSetRootComposeProjectId();
useEffect(
() =>
Expand Down Expand Up @@ -830,10 +821,7 @@ export function AppLayout({ children }: AppLayoutProps) {
sections={sidebarNavigationQuery.data?.sections ?? []}
>
<ThreadActionsProvider>
<SidebarStateBridge
navigationRail={navigationRail}
framed={usesDesktopChrome && navigationRail}
>
<SidebarStateBridge framed={usesDesktopChrome}>
{backToAppRoutePath !== null && !isSidebarResizing ? (
<BackToAppCommandHandler routePath={backToAppRoutePath} />
) : null}
Expand All @@ -848,12 +836,9 @@ export function AppLayout({ children }: AppLayoutProps) {
? "skills"
: "app"
}
navigationRail={navigationRail}
onResizeMouseDown={handleResizeMouseDown}
isResizing={isSidebarResizing}
appRoutePath={appRoutePath}
settingsRoutePath={settingsRoutePath}
toolsBackRoutePath={toolsBackRoutePath}
/>
<SidebarInset>
<div
Expand Down
Loading
Loading