Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
fae411d
Prototype discoverable plugin RPC and usage sources
ymichael Sep 10, 2026
cc60ebe
Preserve existing usage settings presentation with RPC sources
ymichael Sep 10, 2026
378b9d8
Have Provider Usage define and consume the usage source contract
ymichael Sep 10, 2026
2be60a0
Version discoverable RPC SDK and allow CI time for sidebar integratio…
ymichael Sep 11, 2026
9b6b616
Include plugin RPC commands in the CLI skill index
ymichael Sep 11, 2026
5f3eb7e
Group pooled usage accounts under branded provider tabs
ymichael Sep 11, 2026
6f66f88
Compact pooled usage and align labels, plan tiers, and default selection
ymichael Sep 11, 2026
dde0b10
Use email for pooled usage account headings
ymichael Sep 11, 2026
1d8aa53
Show reset countdowns alongside compact usage rows
ymichael Sep 11, 2026
4f16747
Handle usage refresh failures with a graceful retry state
ymichael Sep 11, 2026
7ece03f
Use compact usage rows for all sources with content-sized columns
ymichael Sep 11, 2026
712c59c
Slightly widen usage row column gaps
ymichael Sep 11, 2026
e240e62
Use Account Pooler as the plugin display name
ymichael Sep 11, 2026
3b7db8f
Let usage sources label shared groups independently of plugin names
ymichael Sep 11, 2026
1473cf9
Separate pooled and machine usage in settings source picker
ymichael Sep 11, 2026
574a2a7
Handle empty and failed usage sources and fix unfiltered RPC discovery
ymichael Sep 11, 2026
8c1b86c
Split usage inventory from targeted resource measurement
ymichael Sep 11, 2026
8d2bd14
Keep usage adaptation plugin-owned and normalize account observations
ymichael Sep 11, 2026
f92a017
Implement usage contracts explicitly in provider plugins
ymichael Sep 11, 2026
211b938
Reconcile usage contracts with current host and SDK APIs
ymichael Sep 11, 2026
cd1e3d9
Group settings usage accounts under consistent provider headings
ymichael Sep 11, 2026
2f4166e
Restore main's usage header alignment within provider groups
ymichael Sep 11, 2026
60ea588
Align usage selector icons labels and connection status
ymichael Sep 11, 2026
3e435d5
Remove usage selector connection dots
ymichael Sep 11, 2026
e37e860
Move usage settings into Provider Usage and make its footer optional
ymichael Sep 11, 2026
fb58021
Keep a temporary redirect for usage settings
ymichael Sep 11, 2026
68093f6
Let users reorder and hide sidebar footer actions
ymichael Sep 11, 2026
54d9281
Fix SDK version and test regressions after rebase
ymichael Sep 12, 2026
64879ed
Isolate loggers between server test harnesses
ymichael Sep 12, 2026
8ec3e76
Preserve pooled Codex plan metadata from usage refreshes
ymichael Sep 12, 2026
aa600b9
Use consistent provider headers for every usage account
ymichael Sep 12, 2026
63d79b4
Add positional filters to plugin RPC discovery commands
ymichael Sep 12, 2026
3b58c9e
Keep RPC command index entries as bare command paths
ymichael Sep 12, 2026
2ffa26b
Remove redundant Provider Usage skill
ymichael Sep 12, 2026
09719a0
Remove stale usage plan and simplify settings layout
ymichael Sep 12, 2026
fee42f0
Remove usage contract internals from provider skills
ymichael Sep 12, 2026
1b2ad69
Remove remaining usage prototype documentation and dead types
ymichael Sep 12, 2026
fc45101
Match footer usage source picker to settings
ymichael Sep 14, 2026
828dbb7
Reconcile discoverable RPC with registration normalizer
ymichael Sep 14, 2026
4522764
Preserve provider order in usage surfaces
ymichael Sep 14, 2026
7b6ca66
Bump Plugin SDK for discoverable RPC
ymichael Sep 14, 2026
58ffd24
Restore compact usage disclosure header
ymichael Sep 14, 2026
4358f77
Constrain usage disclosure selector label
ymichael Sep 14, 2026
0866d9a
Size usage source selector to available space
ymichael Sep 14, 2026
f7b9640
Add Provider Usage state stories
ymichael Sep 14, 2026
438a528
Consolidate Provider Usage stories
ymichael Sep 14, 2026
df1f76a
Fix Provider Usage disclosure header height
ymichael Sep 14, 2026
cc7857b
Simplify usage machine menu items
ymichael Sep 14, 2026
2c327e5
Unify Provider Usage feedback states
ymichael Sep 14, 2026
d35d7ce
Remove inline usage retry actions
ymichael Sep 14, 2026
48d0282
Style Provider Usage notices
ymichael Sep 14, 2026
22a7723
Keep usage loading feedback quiet
ymichael Sep 14, 2026
d5a7339
Remove Provider Usage configuration docs
ymichael Sep 14, 2026
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
24 changes: 19 additions & 5 deletions .bb/skills/verify-bb/features/plugin-provider-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Status: **2026-09-05: 2 passed, 1 partial/blocked**. See [the audit](../MAINTENA

## Setup and entry points

Enable Provider usage; configure at least one provider advertising usage maintenance. Open its usage card and Settings → Usage.
Enable Provider usage and a provider implementing the usage RPC contract. Open its usage card and Settings → Installed plugins → Provider usage.

Use the main skill’s isolated targets and evidence rules. A plugin can be present
in this checkout but disabled in an installation. Enable it only in the test
Expand All @@ -17,14 +17,19 @@ SKILL.md. Inspect nested `--help` before selecting flags and IDs.
- `plugins/provider-usage/package.json`
- `plugins/provider-usage/server.ts`
- `plugins/provider-usage/app.tsx`
- `plugins/provider-codex/src/usage-source.ts`
- `plugins/provider-claude-code/src/usage-source.ts`
- `plugins/provider-acp/src/usage-source.ts`
- `plugins/account-pool/src/usage-source.ts`
- `plugins/provider-usage/settings.tsx`

## Feature recipes

| Feature | Drive | Observable success |
| --- | --- | --- |
| All capable providers | Refresh with two supported providers and one unsupported provider. | Cards show only supported data using current provider names/icons and configured ordering. |
| Quota windows and errors | Inspect real returned windows/resets and a controlled refresh failure. | Values match the provider response; unknown/unavailable data is distinct from exhausted quota. |
| CLI and SDK parity | Compare bb settings usage --json with bb.sdk.system.usageLimits() and the visible card. | All surfaces represent the same underlying provider maintenance data. |
| CLI and SDK parity | Inspect `bb plugin rpc list --method provider-usage.v1.listResources --json`, list a provider plugin’s resources, and fetch one returned resource ID. Compare its selected host/provider with `bb settings usage --json`. | Discovery is independent of display plugins, inventory collects no quota, and fetch returns only the chosen resource. Pool resources remain separate from direct host maintenance. |

## Evidence and cleanup

Expand All @@ -35,6 +40,15 @@ failed attempts and missing prerequisites as unverified results. Restore plugin
configuration and remove only this run’s fixtures, registrations, and workers.
External account changes use authorized disposable targets.

## Maintenance notes

- Open Settings → Usage limits and the sidebar Provider usage disclosure. Compare core settings usage / sdk.system.usageLimits with plugin getUsage, which wraps per-machine providers and normalizes optional fields; it is not byte-for-byte the core response. Source: `plugins/provider-usage/app.tsx:112`.
## Contract verification

- Test a source with the display plugin disabled. Each provider implementation
publishes both source methods independently of the display.
- Check empty pools, loading, first-load errors, stale measurements after failed
refresh, disconnected hosts, and removed resources on both displays.
- Verify matching window and plan labels, account order, default pool selection,
and explicit machine selection. Do not deduplicate by email; known account
identities are deduplicated only within the selected location.
- The settings page fetches resources for the selected location; the footer
fetches only its selected provider tab. Compare shared pool sources through
their RPC contract; `bb settings usage` remains the direct host-maintenance view.
1 change: 1 addition & 0 deletions apps/app/.ladle/config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export default {
"src/**/*.stories.tsx",
"../../plugins/workflows/**/*.stories.tsx",
"../../plugins/ask-user-question/*.stories.tsx",
"../../plugins/provider-usage/*.stories.tsx",
],
defaultStory: "",
viteConfig: "./.ladle/vite.config.ts",
Expand Down
1 change: 1 addition & 0 deletions apps/app/.ladle/ladle.css
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
the plugin's CSS separately. */
@source "../../../plugins/automations";
@source "../../../plugins/provider-retry";
@source "../../../plugins/provider-usage";

.ladle-main {
padding: 0;
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/App.legacy-skill-route.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ describe("legacy resource redirects", () => {
);

it.each([
["/settings/usage", "/settings/plugins/provider-usage"],
["/settings/plugins", "/settings/plugins"],
["/extensions?view=installed#catalog", "/plugins?view=installed#catalog"],
["/extensions/plugins", "/plugins"],
Expand Down
12 changes: 12 additions & 0 deletions apps/app/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import {
getAutomationDetailRoutePath,
getAutomationEditRoutePath,
getAutomationsRoutePath,
getPluginConfigurationRoutePath,
getSettingsRoutePath,
getSettingsProjectRoutePath,
} from "./lib/route-paths";
Expand Down Expand Up @@ -264,6 +265,17 @@ export function AppRoutes() {
<AppLayout>
<Suspense fallback={null}>
<Routes>
<Route
path="/settings/usage"
element={
<Navigate
to={getPluginConfigurationRoutePath({
pluginId: "provider-usage",
})}
replace
/>
}
/>
<Route path={SETTINGS_ROUTE_PATH} element={<SettingsView />} />
<Route
path={SETTINGS_SECTION_ROUTE_PATH}
Expand Down
2 changes: 1 addition & 1 deletion apps/app/src/components/commands/CommandPalette.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ describe("CommandPalette", () => {
expect((searchField() as HTMLInputElement).value).toBe(">");
const titles = optionTitles();
expect(titles?.[0]).toContain("New thread");
expect(titles).toHaveLength(19);
expect(titles).toHaveLength(18);
});

it("filters as the user types and keeps the selection on a live row", async () => {
Expand Down

This file was deleted.

Loading
Loading