Repository navigation
Conversation
Adds automation_created (trigger, mode, origin) and split_view_opened (pane count after opening, 2-8) to the client telemetry allow-list. Automations emits from its server create path through the plugin SDK's system.experimental_recordTelemetryEvent, so the RPC and CLI paths report once each and failures never affect creation. The app reports split view from one watcher on the split layout, so every surface that adds a pane reports it and restoring a saved layout does not. The server still drops both when usage data sharing is off. Privacy copy, configuration docs, the API audit entry, and the Automations overview list the new events. Plugin SDK 0.6.40. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
brsbl
added this pull request to stack #5232
October 10, 2026 02:40
Automations' service receives a narrow ServiceApi, so the telemetry helper and that type now name system.experimental_recordTelemetryEvent explicitly, and the hand-built test SDKs stub it. Formats the PR's files with oxfmt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ation-split-view-thr_gqshddt6w2
brsbl
removed this pull request from stack #5232
October 12, 2026 21:28
brsbl
added this pull request to stack #5398
October 12, 2026 21:28
…5387) ## Human comments ## What was wrong Plugins had no supported way to render a multi-line block inside an assistant reply. `messageDirective` is single-line leaf syntax and stays literal until it closes, so a plugin that wanted generative UI had to scrape rendered `pre > code` elements and overlay its own UI (#5268). Separately, the built-in `inline-vis` plugin showed HTML in a fixed 224px card and Markdown in a box that scrolled inside the thread. ## What changed **New slot: `app.slots.experimental_codeFenceRenderer({ id, languages, component })`.** A plugin claims fence languages and renders those fenced code blocks in assistant and nested-agent message Markdown. The first two commits are @ComicBit's prototype from #5268 (registration validation, slot store, plugin guide card, test harness support). The third commit rebuilds the rendering side, and the contract differs from the issue's proposal: - `status: "streaming" | "closed" | "unclosed"` replaces `complete`, so a renderer can tell a block that is still being written from one the reply never closed. - The component for a fence is mounted once and kept for the whole reply; there is no remount when the fence closes or the reply finishes. The Markdown tree renders a placeholder, and a host around the message's Markdown (`CodeFenceRendererHost`) owns the component and portals it into a container that follows the placeholder from the streaming tail to the settled region. Where the browser has `Element.moveBefore`, an iframe inside the component is not reloaded by that move; elsewhere component state survives and the iframe reloads once. - A fence is identified by the source offset of its opening delimiter, the same way images are, so the settled text is not re-parsed to number fences. `index` (ordinal among fences of the same language) is computed at the message level. - A language claimed by two plugins renders BB's code block and logs a warning, matching `messageDirective`. - A throw affects one fence only, and BB tries the component again when that fence's `code` or `status` changes, so a renderer that fails on a half-streamed body recovers on the next chunk. `PluginSlotMount` gains `crashResetKey` for this; slots that do not pass it behave as before. - `mermaid` stays a core special case inside `Original`, because it renders on every Markdown surface and this slot is scoped to messages. `@get-bb/plugin-sdk` goes to 0.6.40. The plugin guide card, the authoring skill references, `bb-guide-plugins.md`, and the `docs/api_to_audit.md` entry describe the new contract and list what to audit before stabilizing. No server/daemon wire fields change. **inline-vis** (fourth commit): - An HTML file shown with `::inline-vis{file="…"}` is now a borderless sandboxed frame on the thread background that fits the page's height and follows bb's theme variables live, with a hover action to open the file. `preparePreview` returns the file's `content` and `sha256` for this. - A fenced `inline-vis` code block whose body is an HTML page renders the same way through the new slot, with no file. A status line shows while the block streams, and a hover action reveals the source. - A Markdown file shows in a card with its file name, copy and open actions, and a preview that expands in place ("Show more") instead of scrolling inside the card. - The bundled skill teaches both forms, the layout rules, and the theme variables. Behaviour changes for existing users of the directive: - An HTML page used to get a fixed 224px frame; it now fits its content and `height` is a cap. - `height` accepts 80–2000 (was 120–1200). For Markdown it is the preview height, 256px by default (was a 224px scrolling box). - The header toggle that hid a Markdown card, and its remembered `bb.inline-vis.collapsed` preference, are removed. ## How you verified - `pnpm exec turbo run typecheck lint --filter='...[origin/main]' --continue`: 137 tasks pass. - `pnpm exec turbo run test` for `@bb/app`, `@get-bb/plugin-sdk`, `bb-plugin-inline-vis`, `bb-plugin-plugin-api-docs`, `@bb/templates`, `@bb/domain`, `bb-plugin-bb-guide`: all pass (5,731 app tests, 369 SDK, 51 inline-vis, 73 plugin guide, 47 templates, 230 domain, 7 bb-guide). - Server plugin suites (`builtin-registry`, `plugin-app-bundle`, `bb-official-generator`, `sdk-compat`, `plugin-authoring-docs`): pass. - `node apps/app/scripts/check-bundle-budget.mjs` after building `@bb/app`, `node .github/workflows/check-plugin-sdk-version.mjs`, and `node packages/plugin-sdk/scripts/check-npm-version-guard.mjs`: pass. - New tests in `markdown-code-fence-renderers.test.tsx` cover: one component instance and its state kept from the first streamed line through the tail-to-settled move to the finished reply; `index` across the two streaming regions; `status` for unclosed, closed, list-nested, blockquoted, tilde, and over-indented fences; a crash isolated to one fence and retried when its code changes; a contested language falling back to BB's code block; and claims surviving the sanitized HTML pipeline. - Live, in a worktree dev app with a Claude Haiku thread: a reply containing an `inline-vis` block, an HTML file directive, and Markdown file directives rendered in light and dark themes and at phone width. During a streamed reply the status line showed, the page's iframe was inserted once, moved from the streaming tail to the settled region without being disconnected, and kept its document to the end of the reply. Not verified: Safari and the mobile WebView (no `moveBefore`, so an iframe reloads once when its block settles), and clicking the copy and open-in-sidebar actions in the live app (tests cover both). Fixes #5268 🤖 Generated with [Claude Code](https://claude.com/claude-code) > AGENT GENERATED --------- Co-authored-by: Leandro Piccione <ileocorp@gmail.com> Co-authored-by: Claude Code <noreply@anthropic.com>
🚨 **SLOP COP** 🚨 · `new-issue-autopilot` ## Human comments ## What was wrong Detached checkout of a short Git branch name triggers Git's implicit local-branch creation when the branch exists only under origin after cloning. Git rejects that combination before BB reads the marketplace manifest. Reproduced on trusted main in two clean checkouts: https://get-bb.github.io/reports/issues/5373.html. ## What changed - Resolve the requested ref to a verified commit, with an origin remote-tracking fallback, then detach at that commit. - Add real-Git regression coverage for a non-default branch, origin-qualified ref, annotated tag, commit hash, and branch refresh. - Keep the existing clone strategy and public interfaces unchanged; no dependency, protocol, schema, migration, or stored-data change. - Changed-line count against origin/main: **82** (75 additions + 7 deletions), across **2 files** in the existing plugin-catalog subsystem. ## How you verified - Before the fix, the focused regression fails for the short branch with Git exit 128; the other three cases pass. Repeated on a second clean checkout of the same trusted main commit. - After the fix, all four focused cases pass. Eight relevant catalog suites pass: **149 tests**, including existing default-branch lifecycle coverage. - `pnpm exec turbo run test --filter=@bb/server -- test/services/plugin-catalog/third-party-marketplaces.test.ts -t 'reads the selected catalog commit'` - Relevant suites run through Turbo with the eight test file paths under `test/services/plugin-catalog`, excluding the unrelated official generator suite. - `pnpm exec turbo run typecheck --filter=@bb/server`, focused `oxfmt --check`, and `git diff --check` pass; no binary changes. - A broader catalog-directory run has one pre-existing official-generator timestamp expectation failure: Git emits `+00:00` rather than `Z`. The same failure occurs on unchanged trusted main; it does not exercise the modified materializer and is not changed here. Fixes #5373 > AGENT GENERATED <!-- slopcop:rule=new-issue-autopilot run=run_pndur7immv53ds7l sha=issue-5373 kind=summary --> Co-authored-by: SawyerHood <sawyerjhood@gmail.com>
## Human comments ## What was wrong A git marketplace could only keep `marketplace.json` at the repository root. `materializeGit` cloned the repository and read `<checkout>/marketplace.json`, with no way to name another directory. A repository that holds plugins for several agent tools could not keep its bb files together in one folder (#5372). ## What changed `bb marketplace add git:<url>[@<ref>] --subdirectory <path>` reads `marketplace.json` and relative icons from that directory of the checkout. - **Server:** `plugin_marketplaces` gains a nullable `source_git_subdirectory` column (migration 0142). The add route accepts an optional `subdirectory`, and every refresh reuses the stored value. The path follows the rules of `bb plugin install --subdirectory`: relative, no `..`, no `.git`, and no symlink out of the checkout. A subdirectory on an https or `path:` source is refused. - **Contract and SDK:** `PluginMarketplace` gains `subdirectory: string | null`, and `plugins.marketplaces.add` accepts `subdirectory`. The contract change alters the plugin SDK's bundled types, so the SDK version moves to 0.6.41. - **CLI:** `bb marketplace add --subdirectory <path>`. `bb marketplace list` shows a Subdirectory column when a marketplace has one. - **Settings:** a Subdirectory field appears under the source field once the source starts with `git:`, and each marketplace row shows its subdirectory. - **Docs:** the CLI guide, the bb-cli and plugin-authoring skill references, and `docs/configuration.md`. Deviations from the issue's proposal: - Relative screenshot URLs are still skipped for git marketplaces, as they are for every non-https source. Only icons resolve next to the manifest. - `marketplace.json` and icons must resolve inside the subdirectory, not only inside the checkout. - `source` stays `git:<url>@<ref>` and the subdirectory is a separate field, matching `bb plugin install --subdirectory`, instead of a `#<path>` suffix. `source.git.subdir` in catalog entries stays relative to the repository root. No `HOST_DAEMON_PROTOCOL_VERSION` change: nothing crosses the server/daemon wire. ## How you verified - New server tests against a real git repository: add and refresh from a nested subdirectory, the root still read when no subdirectory is given, seven refused paths, a symlink out of the checkout (skipped on Windows), and a subdirectory on https and `path:` sources. Each failure leaves no staged checkout behind. - New route, CLI output, and Settings component tests for the request body, the list column, and the Subdirectory field. - `pnpm exec turbo run typecheck lint --continue --filter='...[origin/main]'` - `pnpm exec turbo run test` for `@bb/server` (plugin-catalog suites), `@bb/db`, `@bb/sdk`, `@bb/server-contract`, `@bb/templates`, `@bb/domain`, `@bb/cli` (marketplace output), and `@bb/app` (settings). - `node packages/plugin-sdk/scripts/check-npm-version-guard.mjs` passes with the version bump; it failed before the bump. - Against a dev server with a local repository that keeps its catalog in `bb/`: `bb marketplace add git:<repo>@main --subdirectory bb`, `bb marketplace list`, `bb marketplace refresh` after a new commit, the icon served from `bb/icons/`, and an add through Settings → Plugin marketplaces. Fixes #5372 🤖 Generated with [Claude Code](https://claude.com/claude-code) > AGENT GENERATED Co-authored-by: Claude Code <noreply@anthropic.com>
…dd a Help menu with License and Uninstall (#5384) ## Human comments ## What was wrong Google denied getbb.app's free-desktop-software certification twice. Four of its written requirements were unmet. The site never named the company that publishes bb. The privacy page said bb receives no data from your server, though the app sends anonymous usage events by default. There were no uninstall instructions. And the app had no link to its license. ## What changed - Every getbb.app page's footer now reads "© 2026 Terragon Labs, Inc." The year is computed. - The privacy page no longer says bb receives nothing from your server. A new paragraph says the app sends anonymous usage events through PostHog, why (to see how bb is used and decide what to improve), what they carry, that PostHog records IP and approximate location, and how to turn it off. - The privacy page's contact is now support@terragonlabs.com. - New /uninstall page: quit bb, remove the app on Mac, Windows, or Linux, and optionally delete `~/.bb`. It's `noindex`, not in the sitemap, and not blocked in robots.txt. - The desktop app has a new Help menu with "View License" (opens the MIT LICENSE, as VS Code, Cursor, and Zed do) and "How to Uninstall bb" (opens the uninstall page). ## How you verified - Chrome for Testing (Browser Automation) at 1440 wide on the branch site: footer, privacy paragraph and contact, and the uninstall page render as shown. The uninstall page carries `<meta name="robots" content="noindex">` and is absent from /sitemap.xml. - The privacy paragraph matches the code: the events and fields in apps/server/src/services/system/telemetry.ts, the opt-outs in apps/server/src/routes/system.ts and packages/config/src/env-vars.ts, and IP capture confirmed in the PostHog project settings. - Packaged desktop build of this branch (`pnpm desktop:worktree`): the menu bar reads Apple, bb, File, Edit, View, Window, Help, and Help contains "View License" and "How to Uninstall bb" (read through macOS accessibility). No screenshot of the open menu: the capture couldn't take focus from the host app. - Remote CI: passed. ### QA (qa-agent): PASS at `db6c4ac5e5` - Chrome for Testing 154.0.8037.92 (Browser Automation) and real Safari 26.5.2 on macOS. - Both at 1440×900 and 390×844, light and dark. In Safari, dark means the site's own `dark` class: the site sets it from `prefers-color-scheme`, and the system theme wasn't changed. - /privacy: the usage paragraph renders, and the contact is support@terragonlabs.com. - Footer: "© 2026 Terragon Labs, Inc."; Privacy and Software License links only. - /uninstall: three steps and `noindex`. It's absent from /sitemap.xml, and robots.txt allows it. - No horizontal overflow, and no console errors in Chrome. - Packaged desktop build of this head, launched with `--use-mock-keychain`: Help lists "View License" and "How to Uninstall bb". Captured below with the menu open. ### Screenshots Before: `3912f4aaef` (merge base) · After: `db6c4ac5e5` · Chrome for Testing, full window, captured at 2× | Screen / state | Viewport | Before | After | | --- | --- | --- | --- | | Privacy · 1. The bb apps | Desktop · 1440×900 · light |  |  | | Footer | Desktop · 1440×900 · light |  |  | | /uninstall | Desktop · 1440×900 · light | Not Found |  | | Footer | Phone · 390×844 · dark | — |  | | Privacy (real Safari) | Desktop · 1440×900 · light | — |  | | Footer (real Safari) | Phone · 390 · dark | — |  | | Desktop app · Help menu open (macOS, packaged build of this head) | Window 1280×900 + menu bar | No Help menu |  | BB-Thread: [🔥 𝒃𝒃 landing pages & guides](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_46gxq5dyzh) 🤖 Generated with [Claude Code](https://claude.com/claude-code) > AGENT GENERATED --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments ## What was wrong Threads spawned by another thread were called "children", "child" or nothing at all depending on the surface, and they shared a generic person icon with other assignment events. The archived filter, archive/delete confirmations, mention pills and the thread header each used different wording for the same thing. ## What changed - One copy helper (`apps/app/src/lib/child-thread-copy.ts`) for "child thread(s)" and its count, used by the archive/delete dialogs, the archive toast and thread actions. - A two-person `ChildThread` icon (shared-ui icon registry) for assignment events and the mention pill; mention pills read "child thread". - Archived threads filter: All threads / Threads / Child threads. - Archive and delete confirmations name the child thread count; the archive button reads "Archive". - The child thread header no longer shows a "child" pill; the parent picker drops its redundant heading; the settings copy says "child threads". UI copy only; data, API, SDK and CLI names are unchanged. ## How you verified CI. ### Screenshots Before: `d011a88bc1` · After: `c4b144a85a` · Captured at 2× | Screen / state | Viewport | Before | After | | --- | --- | --- | --- | | Child thread view: no "child" header pill | Desktop · 1280×720 |  |  | | @ mention from a parent: "child thread" pill | Desktop · 1280×720 |  |  | | Parent picker: no redundant heading | Desktop · 1280×720 |  |  | | Archived threads: filter and badge | Desktop · 1280×720 |  |  | | Archive confirmation | Desktop · 1280×720 |  |  | | Delete confirmation | Desktop · 1280×720 |  |  | | Settings: archive confirmation copy | Desktop · 1280×720 |  |  | BB-Thread: [Redesign child threads](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_7xmbr7vsqz) 🤖 Generated with [Claude Code](https://claude.com/claude-code) > AGENT GENERATED Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments ## What was wrong A parent's Info panel listed its forks but not its child threads, so there was no place outside the composer banner to see them. ## What changed - The Info panel shows a collapsible **Child threads** section above Forks (`RelatedThreadsSection`), using the ChildThread icon for idle child threads. - Its collapsed state saves under the `childThreads` section id, added to `docs/configuration.md` and the bb-cli app-settings reference. ## How you verified CI. ### Screenshots Before: `c4b144a85a` · After: `bad3b3f27d` · Captured at 2× | Screen / state | Viewport | Before | After | | --- | --- | --- | --- | | Info panel: Child threads section | Desktop · 1280×720 |  |  | | Info panel: section collapsed from its heading (no section before) | Desktop · 1280×720 |  |  | BB-Thread: [Redesign child threads](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_7xmbr7vsqz) 🤖 Generated with [Claude Code](https://claude.com/claude-code) > AGENT GENERATED Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments ## What was wrong Setup progress, agent readiness, sign-in results and rejected new-thread submissions were not observable in anonymous telemetry. ## What changed - Record anonymous setup progress, readiness, sign-in outcomes and new-thread submission outcomes through the opt-out-controlled telemetry route. - Accept fixed enums, booleans and explicit unknown values, without identifying fields or free-text error details. - Expose `useSetupComplete` and the experimental SDK method, and update configuration documentation. - Describe collection by usage category in Settings and the privacy page, while retaining purpose, identifiers, system details and opt-out instructions. Supersedes #5394. Independently based on main; no shared-component dependency. ## How you verified - [PR CI](https://github.com/get-bb/bb/actions/runs/38328259479) passed on `3bd09c3262585b764d77cca6761fc2328a21c3bd`. [Full CI](https://github.com/get-bb/bb/actions/runs/38328255967) also passed after retrying the Windows provider-replay job. - Scoped review has no P0/P1 findings; the subsequent copy-only change preserves the reviewed telemetry implementation. - Focused exact-head QA PASS: Chrome for Testing 154.0.8037.92, Settings and privacy, desktop and phone widths; real Safari 26.5.2, privacy. - Initial rendering, settled layout, hard reload and client navigation passed. Chrome reported no page or console errors during disclosure checks. - Exact-head telemetry delivery passed through the production-mode sender to an isolated local sink; the HogQL query parsed and ran. <details> <summary>Exact-head telemetry delivery QA</summary> Chrome for Testing 154.0.8037.92 exercised the branch web app at `3bd09c3262585b764d77cca6761fc2328a21c3bd` with fresh app data, telemetry enabled and the real production-mode server sender. - The sink received each action once: all four steps reached, Agent/Devices completed, Projects/Plugins skipped, and setup finished. - Readiness was observed from real installed agents. Checking again emitted no duplicate readiness event. - A real Codex sign-in command opened its sign-in guide; cancelling emitted one `started` and one `cancelled` outcome. - Temporarily disabling the selected provider before forwarding an unchanged submit request produced a real `409 provider_disabled`; the draft remained intact. - Re-enabling the provider produced `201`, one accepted outcome and a real Claude Code reply of “OK”. Each submission emitted one started outcome. - Captured payloads contained only the random install ID, standard system properties and the expected event fields; no identifying fields or free text. The default `0.0.0-dev` version intentionally disables the sender. This pass used `0.0.0-qa-onboarding-3bd09c3` and a transport-only preload redirecting the unchanged capture body to a loopback sink. That version is not excluded by the dashboard's exact dev-version filter, so no test events were sent to PostHog. Product source and event handlers were unchanged. Growth analytics independently executed the reached/ready/signed-in/submitted HogQL query against PostHog with no errors or warnings. This establishes query/schema compatibility; new-event ingestion after release remains unverified. Completing a new provider authentication was outside this pass: the real attempt was cancelled, and submission used an already-ready provider. </details> <details> <summary>Retained boundary checks and follow-up</summary> The unchanged implementation retains earlier API checks accepting allowed enum/null values and rejecting unknown enums, identifying extra fields and free text. Earlier sign-in startup-failure coverage used fixtures and was not a delivery check. Known P2 follow-up: abandonment during pending sign-in startup may be counted as failed when terminal creation later rejects. </details> Fresh full-viewport screenshots compare merge base `d34a3d219193d37bf4bb31b6b345dd113800c3f1` with exact head `3bd09c3262585b764d77cca6761fc2328a21c3bd`, using the same isolated fixture, routes and scroll anchors. Desktop: 1440 × 900 CSS pixels; phone: 390 × 844; both at 2×. | Surface | Before | After | | --- | --- | --- | | Usage-data setting / desktop |  |  | | Privacy policy / desktop |  |  | | Usage-data setting / phone |  |  | | Privacy policy / phone |  |  | The user approved the simplified disclosure screenshots at `3bd09c3` via Growth. Merge approval remains separate. BB-Thread-ID: thr_gt5eeahuym BB-Thread: [Onboarding](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_gt5eeahuym) > AGENT GENERATED
Collaborator
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Human comments
What was wrong
Core actions lack a shared usage contract, making coverage inconsistent across entry points.
What changed
feature_usedcontract with fixed capability, interaction, and trigger categories.How you verified
9cd045a7.654570f7; no unresolved P0/P1 findings.feature_usedwithperson/webattribution. Production PostHog traffic was intercepted locally.BB-Thread: Retention measurement
BB-Thread-ID: thr_gqshddt6w2