Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
232 commits
Select commit Hold shift + click to select a range
2590dfc
Make ‘This machine’ mean the client-local daemon (#2004)
ymichael Aug 20, 2026
ba14b81
Delete the newOnboarding experiment and the first-run flow (#2001)
ymichael Aug 20, 2026
b6cd01f
Bold option titles in pickers to distinguish them from descriptions (…
andrewkchan Aug 20, 2026
7be260d
Mobile: native thread header, collapsible composer, home compose dock…
SawyerHood Aug 20, 2026
1f92fda
Stabilize TipTap editor test teardown (#2010)
ymichael Aug 20, 2026
ce4e64d
Fix Claude resumed-input turn correlation (#2013)
ymichael Aug 20, 2026
2260f52
Fix sent-message editing across Codex and older browsers (#2012)
ymichael Aug 20, 2026
654d749
Fix plugin diff highlighting in development (#2007)
ymichael Aug 20, 2026
8a50f6a
Mobile: dark-safe scrims, keyboard gap, project folder icon, round st…
SawyerHood Aug 20, 2026
47a2ffd
Fix local editor helper discovery across machines (#2008)
ymichael Aug 20, 2026
ea61d17
Add host-owned SourceCode and Diff rendering for the app and plugins …
ymichael Aug 20, 2026
e93ce27
Fix intermittent new-thread submit blockers (#2017)
ymichael Aug 20, 2026
05cc16d
Show edit actions promptly after thread submit (#2016)
ymichael Aug 20, 2026
6c62596
Report pi and ACP turn acceptance on consumption (#2021)
ymichael Aug 20, 2026
08d3f73
Fix Cursor ACP dynamic tools (#2022)
ymichael Aug 20, 2026
78cd3c4
Fix Pi context usage updates during tool loops (#2024)
ymichael Aug 20, 2026
2ff5828
Fix long-thread database and event-loop stalls (#2025)
ymichael Aug 20, 2026
0b2723a
Let stale daemons reach protocol self-update (#2028)
ymichael Aug 20, 2026
c7c6642
Reduce conversation outline refetches during streaming (#2027)
ymichael Aug 20, 2026
5f4172b
Remove the working status from the mobile thread header (#2032)
SawyerHood Aug 20, 2026
c4a3dc5
Match mobile unread divider to web styling (#2033)
SawyerHood Aug 20, 2026
f4ab03f
Port the web sound-wave recording bar to the mobile composer (#2034)
SawyerHood Aug 20, 2026
6da2a7a
Replace the mobile left drawer with a workspace menu (#2036)
SawyerHood Aug 20, 2026
1a8958b
Connect the mobile app to EAS and add the nightly TestFlight job (#2038)
SawyerHood Aug 20, 2026
d2200de
Match the mobile app icon to the desktop app icon (#2039)
SawyerHood Aug 20, 2026
7af6934
Make plugin file openers reachable and give them a real height (#2026)
andrewkchan Aug 20, 2026
090324b
Enable provider retry by default (#2020)
ymichael Aug 20, 2026
23a4eae
Add production-style worktree start command (#2045)
ymichael Aug 20, 2026
7d99c4e
Refuse queued messages for threads whose environment is gone (#2043)
SawyerHood Aug 20, 2026
8e37200
Allow archiving a thread after its environment row is pruned (#2042)
SawyerHood Aug 20, 2026
4bf34b5
Make machine settings text-first and responsive (#2050)
ymichael Aug 20, 2026
3225431
Register start-bb signal handlers before spawning (#2055)
ymichael Aug 20, 2026
078adb1
Ignore nested node_modules and .git in the workspace root watch (#2041)
SawyerHood Aug 20, 2026
099f134
Reveal the selection head in the prompt input, not the anchor (#2053)
SawyerHood Aug 20, 2026
de8a740
Align the mobile thread list with the web sidebar and add section reo…
SawyerHood Aug 20, 2026
0056109
Make environment host labels responsive (#2056)
ymichael Aug 20, 2026
fe128ca
Match the PR check icon to the GitHub favicon geometry (#2057)
SawyerHood Aug 20, 2026
55f86b6
perf(app): activate plugin styles only while mounted (#2002)
ymichael Aug 20, 2026
418619c
Return tool-call images instead of dropping them (#1963)
sujeito-operator Aug 20, 2026
e2749bc
Support thread-storage files in Docs opener (#2061)
ymichael Aug 20, 2026
6be4505
Fix mobile compose project picker E2E race (#2060)
ymichael Aug 20, 2026
4e5a917
Add experiment-gated timeline row windowing (#2011)
ymichael Aug 20, 2026
5b85511
Avoid plugin update timer overflow with no eligible plugins (#2070)
ymichael Aug 20, 2026
d749741
Move provider state into provider bridge contract (#1879)
ymichael Aug 20, 2026
bfb8f87
Keep split-divider drag state off document.body (#2073)
ymichael Aug 20, 2026
5154a94
Render PDF file previews instead of "Preview not available" (#1979)
jsilets Aug 20, 2026
af868d9
Fix short user message bubble resizing (#2075)
ymichael Aug 20, 2026
cfd35d6
Remove unreachable ask-agent git failure flow (#2080)
ymichael Aug 20, 2026
3934ce0
Add a privacy policy page for App Store review (#2077)
SawyerHood Aug 20, 2026
9d758c2
Set app bundle budgets to 10% headroom (#2081)
ymichael Aug 20, 2026
fe0a9a8
Skip unrelated provider probes for installation status (#2078)
ymichael Aug 20, 2026
9768d55
Add plugin navigation primitives (#2005)
ymichael Aug 20, 2026
a77a391
Isolate provider installation status failures (#2076)
ymichael Aug 20, 2026
914e875
Stabilize changed-declaration bridge lifecycle test (#2084)
ymichael Aug 20, 2026
95f7f7f
Preserve persisted file opener source routing (#2083)
ymichael Aug 20, 2026
7f3d2ac
Load branch picker options before remote refresh (#2082)
ymichael Aug 20, 2026
9c096dd
Preserve Docs opener host routing (#2088)
ymichael Aug 20, 2026
09d72cd
Report the real app surface for desktop and API telemetry (#2087)
SawyerHood Aug 20, 2026
82422c2
Fix queued external file dispatch (#2089)
ymichael Aug 20, 2026
deb7230
Fix and simplify side panel splits (#2059)
ymichael Aug 20, 2026
3f4fdcc
Avoid eager work in host file previews (#2092)
ymichael Aug 20, 2026
ef14c60
Do not link removed pull request files (#2099)
ymichael Aug 20, 2026
82b9a00
Resolve Docs project-backed opener sources (#2101)
ymichael Aug 20, 2026
e171ceb
Restart Claude sessions after authentication failures (#2098)
ymichael Aug 20, 2026
63162f8
Preserve native semantics in plugin links (#2094)
ymichael Aug 21, 2026
8be3712
Resolve thread storage locations without listing (#2100)
ymichael Aug 21, 2026
10355d9
Delete the stale agent-provider-plugin-surface plan (#2111)
SawyerHood Aug 21, 2026
0251399
Add a mock bb server for App Store review, deployed from CI (#2110)
SawyerHood Aug 21, 2026
65f9e0a
Add streamer mode to hide custom models from model lists (#2107)
SawyerHood Aug 21, 2026
c9aef75
Fix Tasks stale-label persistence test race (#2112)
ymichael Aug 21, 2026
d20638b
Skip replayed turn/started events at daemon ingestion (#2126)
SawyerHood Aug 21, 2026
2ff8598
Route plugin service uncaught exceptions to the service supervisor (#…
SawyerHood Aug 21, 2026
703213a
Move the mobile attachment remove button onto the thumbnail and open …
SawyerHood Aug 21, 2026
ed97e55
Move a local plugin to a new directory without losing its settings (#…
SawyerHood Aug 21, 2026
ea2d56b
Keep the mobile composer typeahead below the native header (#2137)
SawyerHood Aug 21, 2026
d93d43d
Replace stacked mobile prompt cards with a chip row (#2138)
SawyerHood Aug 21, 2026
9d0b8a9
Delete the cascade and t3sidebar example plugins (#2143)
SawyerHood Aug 21, 2026
2c0b747
Omit a null hostId from thread tabs responses so older mobile builds …
SawyerHood Aug 21, 2026
9dff424
Remove dead code and simplify module surfaces (#2140)
SawyerHood Aug 21, 2026
f6fb434
Move the collapsed mobile stop button flush with the pill corner (#2146)
SawyerHood Aug 21, 2026
c942421
Use a no-break narrow space as the mobile inline code pad (#2172)
SawyerHood Aug 21, 2026
a36e691
Replace the mobile live dot with shimmering glyphs and fold the conte…
SawyerHood Aug 21, 2026
b1bd629
Add provider plugin v3 contract: vocabulary, presentation, extensions…
SawyerHood Aug 21, 2026
94988c3
[stacked on #2124] WS1a: generic assembler + published testing kit (#…
SawyerHood Aug 21, 2026
dacfaf4
[stacked on #2136 ← #2124] Add bridge record mode, real provider reco…
SawyerHood Aug 21, 2026
7a8e0da
[stacked on #2153 ← #2136 ← #2124] WS2a: bb.providers.register + sing…
SawyerHood Aug 21, 2026
aa5001f
[stacked on #2148 ← #2153 ← #2136 ← #2124] Pin provider baselines: co…
SawyerHood Aug 21, 2026
fcf9e61
[stacked on #2121 ← #2148 ← #2153 ← #2136 ← #2124] WS1b-codex: Codex …
SawyerHood Aug 21, 2026
7bc46ad
[stacked on #2164] WS1b-claude: Claude Code bridge to grammar v3 with…
SawyerHood Aug 21, 2026
810cf2e
[stacked on #2178] WS1b-acp: ACP bridge to grammar v3 with presentati…
SawyerHood Aug 21, 2026
98a741e
Classify Cloudflare challenges on Codex requests as transient (#2159)
SawyerHood Aug 21, 2026
eec134d
Enter Plan mode when a later Claude turn carries /plan (#2157)
SawyerHood Aug 21, 2026
0880d11
Detect bare repositories as worktree sources (#2158)
SawyerHood Aug 21, 2026
2845b3c
Make bb-app verify its server child's identity on /health (#2162)
SawyerHood Aug 21, 2026
e03b4a7
Keep a tool call's late completion in its spawning turn's details (#2…
SawyerHood Aug 21, 2026
e8f7968
Keep adjacent assistant answers visible in completed turns (#2133)
SawyerHood Aug 21, 2026
26d9ab5
Send the composer's execution selection with steers (#2149)
SawyerHood Aug 21, 2026
b0ac28c
Add bb tasks detach and list live task threads first (#2167)
SawyerHood Aug 21, 2026
e0175eb
Reject HEIC/HEIF attachment uploads with a reason (#2170)
SawyerHood Aug 21, 2026
ad7edf8
Recover from an unreachable saved remote server target (#2161)
SawyerHood Aug 21, 2026
78bd562
Show why the Server menu lists no Connect servers (#2168)
SawyerHood Aug 21, 2026
abde653
Load the thread storage file tree on demand (#2139)
SawyerHood Aug 21, 2026
1aafe4d
Close display math whose $$ delimiters are glued to the TeX (#2151)
SawyerHood Aug 21, 2026
d9f3f7f
Virtualize the CSV preview rows and remote path browser entries (#2163)
SawyerHood Aug 21, 2026
34a3ebb
Reserve the inline-vis preview height while loading (#2165)
SawyerHood Aug 21, 2026
d4b91c9
Keep app chrome out of text selection (#2171)
SawyerHood Aug 21, 2026
9dad3ae
Keep Shiki's RegExp feature probes out of the bundler's reach (#2173)
SawyerHood Aug 21, 2026
cf00cfe
Highlight shell and other chat fences with sugar-high v2 (#2175)
SawyerHood Aug 21, 2026
fcada5a
Add the provider-literal ratchet guardrail (G1) (#2120)
SawyerHood Aug 21, 2026
2ad4bfa
Stop advertising fork for acp-cursor and acp-grok (#2150)
SawyerHood Aug 21, 2026
15f21ad
Keep Codex stream-disconnect classification on the terminal error (#2…
SawyerHood Aug 21, 2026
b2e8035
Remove the URL QR toggle from the connect settings card (#2201)
SawyerHood Aug 21, 2026
75d6fc4
Pin the nightly iOS marketing version so TestFlight skips re-review (…
SawyerHood Aug 21, 2026
85eec4d
Add each submitted TestFlight build to the external group from CI (#2…
SawyerHood Aug 21, 2026
9e01148
Fix mobile smoke deep-link startup race (#2214)
ymichael Aug 21, 2026
3ca4c6c
Redact all GitHub token formats from provider recordings (#2213)
ymichael Aug 21, 2026
27d1017
Fix macOS bare worktree test path assertion (#2215)
ymichael Aug 21, 2026
d65cea9
Keep the model picker scrollable in short viewports (#1596)
Juns-g Aug 21, 2026
121dad4
(fix) Add copy link to desktop context menu (#1532)
MateoCerquetella Aug 21, 2026
b3e9c24
Add full-file context to experimental plugin diffs (#2106)
ymichael Aug 21, 2026
2e235c1
Open a sidebar HTML preview full-page in the external browser (#1638)
brsbl Aug 21, 2026
4f9a0a1
Prevent competing turns and false Codex session rebuilds (#2242)
ymichael Aug 21, 2026
2d27aea
Simplify the agent-generated trailer in AGENTS.md
SawyerHood Aug 21, 2026
b863016
Run the nightly desktop publish job on the nightly paths (#2247)
andrewkchan Aug 21, 2026
f4ce9be
Use login-shell PATH for daemon user tools (#2252)
ymichael Aug 21, 2026
1e50add
Stop the dev launcher's ~/.local/bin from shadowing the selected Node…
andrewkchan Aug 21, 2026
e27b930
Replace composer zen mode with collapse control (#2254)
ymichael Aug 21, 2026
9356793
Show full build details in the desktop About dialog (#2255)
andrewkchan Aug 21, 2026
38b1a41
Drop the desktop About dialog tests (#2256)
andrewkchan Aug 21, 2026
7d1f805
Cancel an inline sent-message edit with Escape (#1940)
davidondrej Aug 21, 2026
06d0703
Add a keyboard-first quick palette (#2114)
andrewkchan Aug 21, 2026
54e3e63
Show the drawer glyph on every right-panel trigger (#2259)
ymichael Aug 21, 2026
ad13915
Fix desktop spelling suggestions (#2244)
Roystbeef Aug 21, 2026
03d3c0e
Fix windowed timeline outline navigation (#2260)
ymichael Aug 21, 2026
26fbf43
Read ACP command exit codes from rawOutput instead of the status (#2131)
SawyerHood Aug 21, 2026
52083aa
Resolve a named default base branch against origin when spawning (#2152)
SawyerHood Aug 21, 2026
22d3622
Report a failed plugin reload instead of exit 0 (#2155)
SawyerHood Aug 21, 2026
b64ab2b
Add bb thread --plan for CLI/SDK parity with the composer's plan acti…
SawyerHood Aug 21, 2026
d41d1ab
Make bb thread log truncation visible and add --all paging (#2174)
SawyerHood Aug 21, 2026
6980768
Add Plugin API Tester (#2265)
ymichael Aug 21, 2026
bf21531
Patch sidebar rows from status-changed pushes instead of refetching (…
SawyerHood Aug 21, 2026
b3dd891
Record Pi extension messages as provider input (#2154)
SawyerHood Aug 21, 2026
9ed9a97
Clone source history into thread forks and honor sourceSeqEnd (#2142)
SawyerHood Aug 21, 2026
0e12ccc
Wait for machine project counts in settings test (#2266)
ymichael Aug 21, 2026
8a2150f
Fix MachineSettingsView response mock flake (#2267)
ymichael Aug 21, 2026
3f86b7c
Expose host execution controls to plugin apps (#1469)
brsbl Aug 21, 2026
411c777
Add dark mode to the marketing site (#2246)
brsbl Aug 21, 2026
24e89be
Migrate linting and formatting to Oxc (#2258)
smsunarto Aug 22, 2026
8201aa7
Let plugins add rows to the quick palette (#2270)
andrewkchan Aug 22, 2026
c3b588c
Bump the plugin SDK version, and fail CI when it is missed (#2271)
andrewkchan Aug 22, 2026
4844423
Bubble plugin statuses into collapsed sections (#2274)
brsbl Aug 22, 2026
f54b2f8
Keep each timeline message's action row inside its message (#2257)
brsbl Aug 22, 2026
fff3ae8
Let markdown tables and code blocks scroll sideways in mobile message…
SawyerHood Aug 22, 2026
836e216
Land the mobile-performance batch (#2277-#2281) and fix a scroll re-a…
SawyerHood Aug 22, 2026
08363a8
Share vitest workers for node-environment tests and cut fixed per-fil…
SawyerHood Aug 22, 2026
7bb7f26
Bundle the plugin SDK declaration files in parallel worker threads (#…
SawyerHood Aug 22, 2026
8bd6acc
Run the CI Checks job at turbo concurrency 4 (#2305)
SawyerHood Aug 22, 2026
7e10ea4
Add a quick palette command for the server and daemon logs (#2273)
andrewkchan Aug 23, 2026
5205d98
Scroll the desktop model picker as one region (#2310)
SawyerHood Aug 23, 2026
e42a4ef
Provider plugins: one API for Codex, Claude Code, pi, and ACP agents …
SawyerHood Aug 24, 2026
0f07d45
Fix packaged ACP provider logos (#2329)
SawyerHood Aug 24, 2026
6f7c918
Make the provider order draggable (#2330)
SawyerHood Aug 24, 2026
494f665
Fix model picker icons and isolate native ABI repairs (#2333)
SawyerHood Aug 24, 2026
e7a1084
Stop card and row padding from stacking in the Updates panel (#2340)
SawyerHood Aug 24, 2026
0cb39a5
Stabilize empty plugin update scheduler regression (#2338)
ymichael Aug 24, 2026
47643f5
Stabilize Pi bridge process-backed tests (#2337)
ymichael Aug 24, 2026
d027607
Stabilize host-daemon crash/stop race test (#2341)
ymichael Aug 24, 2026
b735da1
Harden plugin host watch test startup wait (#2339)
ymichael Aug 24, 2026
21cb6b6
Stabilize Pi settings process test budget (#2342)
ymichael Aug 24, 2026
19eedbb
perf: low-risk sweep fixes (F5, F3, F2, S3, D1, F4) (#2346)
SawyerHood Aug 24, 2026
30952cd
perf: load bb command groups on demand and split the CLI bundle (C1) …
SawyerHood Aug 24, 2026
5481fa4
Fix desktop tab scrolling stopping outside tab buttons (#2287)
kongenpei Aug 24, 2026
0782b0e
Handle each pi stdout line in its own event-loop turn (#2355)
SawyerHood Aug 24, 2026
42658f9
fix(server): never persist empty-input prompt history rows (#2295)
bradhallett Aug 24, 2026
a5afd97
Separate declaration key coverage from lifecycle startup (#2356)
ymichael Aug 24, 2026
fd16f6c
Fix runtime polling after scheduler stalls (#2352)
ymichael Aug 24, 2026
4344ae8
Wait for Codex fixture children before workspace cleanup (#2354)
ymichael Aug 24, 2026
f124986
Prevent timed-out preload setup from contaminating desktop tests (#2351)
ymichael Aug 24, 2026
5eb19fa
Recover one-way-stale remote daemon connections (#2359)
ymichael Aug 24, 2026
8e712e1
Separate Pi retry policy from lifecycle process coverage (#2353)
ymichael Aug 24, 2026
d6ac0ae
Speed up new thread submission (#2360)
ymichael Aug 24, 2026
7655bad
Wait for Pi catalog child before workspace cleanup (#2364)
ymichael Aug 24, 2026
755ab23
Add model search to the mobile model picker (#2366)
SawyerHood Aug 24, 2026
7fa66ab
Prebuild agent-runtime test bridges for recovery restarts (#2367)
ymichael Aug 25, 2026
c21e678
Stop update checks from replacing a downloaded update before Relaunch…
patleeman Aug 25, 2026
5f070f1
Apply turn options to the live Pi session (#2221)
SawyerHood Aug 25, 2026
fe58ab4
Hold messages for threads that await user interaction (#2129)
SawyerHood Aug 25, 2026
dc43d2e
Make `bb plugin new` scaffold an example todo plugin with a sidebar p…
SawyerHood Aug 25, 2026
4e2e91e
Preserve heartbeat grace after short suspension (#2372)
ymichael Aug 25, 2026
bb2c871
Refresh active bb Connect sessions (#2357)
ymichael Aug 25, 2026
b3d38e2
fix(bb-app): keep installed package repackable (#2373)
ymichael Aug 25, 2026
5ba5ffe
Fix ACP path-pending file change lifecycles (#2375)
ymichael Aug 25, 2026
98a929b
fix(acp): normalize omp command results (#2374)
ymichael Aug 25, 2026
fc43700
fix(acp): normalize OpenCode command results (#2376)
ymichael Aug 25, 2026
c2837e0
fix(cli): preserve plugin commands in split bundles (#2377)
ymichael Aug 25, 2026
e577d54
Avoid duplicate steers in expanded turn details (#2378)
ymichael Aug 25, 2026
787eb14
fix(host-daemon): retry provider probes after invalidation (#2381)
ymichael Aug 25, 2026
2ddd1b8
Preserve stale sends by re-steering the live turn (#2379)
ymichael Aug 25, 2026
42d2c1b
Fix Node 22 desktop dev startup (#2245)
Roystbeef Aug 25, 2026
5d787d9
fix(bb-app): reuse installed tarball in package smoke (#2410)
ymichael Aug 25, 2026
2231436
Preserve bb-app chunk cleanup on cached builds (#2413)
ymichael Aug 25, 2026
90db2ae
Fix rejected steer details ownership (#2412)
ymichael Aug 25, 2026
8f7c09d
Handle reserved plugin CLI name collisions (#2411)
ymichael Aug 25, 2026
edeb14e
Show plugin install counts in the store (#2282)
andrewkchan Aug 25, 2026
3658617
Allow branch checkout after workspace threads are archived (#2069)
hemaaanth Aug 25, 2026
93ff3af
Complete reserved plugin CLI command inventory (#2418)
ymichael Aug 25, 2026
69596f1
fix: retry read-only host RPC timeouts (#2369)
jshph Aug 25, 2026
3a6853e
Key bundled install counts by canonical plugin ID (#2420)
ymichael Aug 25, 2026
c65d2ec
fix(side-chat): deliver reply anchor on first turn (#2403)
kongenpei Aug 25, 2026
5d3e7dd
Fix Cursor always selecting fast mode (#1691)
georgecollier-nqu Aug 25, 2026
ce74ca6
Support multiword mention autocomplete sessions (#2345)
jshph Aug 25, 2026
ae677b2
test(ask-user-question): avoid repeated accessibility transforms (#2422)
ymichael Aug 25, 2026
4bc390f
add human comments section to PR template (#2425)
andrewkchan Aug 25, 2026
ca0f85c
Retain interactive PATH across host shell probe failures (#2424)
ymichael Aug 25, 2026
392c978
Fix timeline scroll anchor while older rows load (#2427)
ymichael Aug 25, 2026
e33574e
fix(side-chat): bind reply anchor to accepted turn (#2428)
ymichael Aug 25, 2026
7d3fe3f
Load provider plugin frontends eagerly with every other plugin (#2426)
SawyerHood Aug 25, 2026
d5465df
Remove the 8,000-character automation prompt cap (#2431)
SawyerHood Aug 25, 2026
1f064e5
Stabilize automations picker test under CI contention (#2430)
ymichael Aug 25, 2026
1b1791d
Fix persisted Cursor model IDs for parameterized ACP (#2432)
ymichael Aug 25, 2026
bf9aac2
Ignore background tasks that workflow agents start in the Claude brid…
SawyerHood Aug 25, 2026
6210805
Regenerate Codex app-server types from Codex 0.149.1 (#2436)
SawyerHood Aug 25, 2026
8ce7d0f
Declare every runtime-shimmed package for types in plugin scaffolds (…
SawyerHood Aug 25, 2026
71c56b0
Update Claude Agent SDK to 0.3.245 (#2437)
SawyerHood Aug 25, 2026
c21820e
Mobile perf: integrate #2385, #2386, #2388, #2389, #2392 with the rev…
SawyerHood Aug 25, 2026
052a508
Ship the Monaco editor as a builtin plugin (#2127)
andrewkchan Aug 25, 2026
2cfd2b5
Disable the Monaco editor by default and rename it to File Editor (#2…
SawyerHood Aug 25, 2026
83e1a50
Make Claude native-roots cap test deterministic (#2451)
ymichael Aug 26, 2026
ec7dfd5
Wait for exact replay completion before closing bridges (#2440)
ymichael Aug 26, 2026
f3cab2d
Prepare bb-app 0.40.0 (#2452)
SawyerHood Aug 26, 2026
d3f7a90
Theme the Monaco editor from bb's code theme, and let its file tree r…
andrewkchan Aug 26, 2026
680ca99
Sort Browse Plugins by install count, and default to it
andrewkchan Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,4 @@ body:
required: true
- label: I searched open and closed issues for the same problem.
required: true
- label: If an agent wrote this, the body ends with `> AGENT GENERATED: by <model>` and links the thread or report.
- label: If an agent wrote this, the body ends with `> AGENT GENERATED` and links the thread or report.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ body:
options:
- label: I searched open and closed issues for the same request.
required: true
- label: If an agent wrote this, the body ends with `> AGENT GENERATED: by <model>`.
- label: If an agent wrote this, the body ends with `> AGENT GENERATED`.
8 changes: 6 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
<!-- Keep the four sections. Delete this comment. See docs/filing-issues.md for the issue side. -->
<!-- Keep the below sections. Delete this comment. See docs/filing-issues.md for the issue side. -->

## Human comments

<!-- Agents: Do not fill in this section. This is for human users to fill in. -->

## What was wrong

Expand All @@ -15,4 +19,4 @@
Fixes #

<!-- Agents: end with the line below. -->
<!-- > AGENT GENERATED: by <model> -->
<!-- > AGENT GENERATED -->
81 changes: 81 additions & 0 deletions .github/workflows/check-plugin-sdk-version.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { execFileSync } from "node:child_process";

/**
* A change to the published plugin SDK surface must bump PLUGIN_SDK_VERSION.
*
* Pre-1.0 the major is the compatibility number and never moves for additive
* work, so the patch is the only thing a plugin author can point
* `engines.bbPluginSdk` at to say "I need a host new enough to have this" —
* `isPluginSdkRangeSatisfied` reads that range as a floor within the major.
* Ship a new export without a bump and a plugin using it has no version to
* require, so installing it on an older bb fails at runtime instead of
* legibly at load.
*
* Nothing else catches this: `version.test.ts` only checks that package.json
* and the constant agree with each other, and `app-contract.ts` has no
* enumerated export list the way the backend, rpc, and host contracts do.
*/
const SURFACE_PATHS = [
"packages/plugin-sdk/src/app-contract.ts",
"packages/plugin-sdk/src/app.ts",
"packages/plugin-sdk/src/backend-contract.ts",
"packages/plugin-sdk/src/host-contract.ts",
"packages/plugin-sdk/src/host.ts",
"packages/plugin-sdk/src/index.ts",
"packages/plugin-sdk/src/provider-bridge.ts",
"packages/plugin-sdk/src/rpc-contract.ts",
];

const VERSION_PATH = "packages/domain/src/plugin-sdk-version.ts";

function git(...args) {
return execFileSync("git", args, { encoding: "utf8" }).trim();
}

/**
* The commit this branch left the base at. Returns null when it cannot be
* resolved — an unattended push to a fork with no base, say — and the check
* then passes rather than failing on something the author cannot act on.
*/
function resolveMergeBase() {
const baseRef = process.env.GITHUB_BASE_REF || "main";
for (const candidate of [`origin/${baseRef}`, baseRef]) {
try {
return git("merge-base", candidate, "HEAD");
} catch {
continue;
}
}
return null;
}

const mergeBase = resolveMergeBase();
if (mergeBase === null) {
console.log("No base commit to compare against; skipping.");
process.exit(0);
}

const changed = new Set(
git("diff", "--name-only", `${mergeBase}...HEAD`).split("\n").filter(Boolean),
);
const changedSurface = SURFACE_PATHS.filter((path) => changed.has(path));

if (changedSurface.length === 0) {
console.log("Plugin SDK surface unchanged.");
process.exit(0);
}

if (!changed.has(VERSION_PATH)) {
console.error(
`The plugin SDK surface changed without a version bump:\n` +
changedSurface.map((path) => ` ${path}`).join("\n") +
`\n\nBump PLUGIN_SDK_VERSION in ${VERSION_PATH} (patch, pre-1.0) and` +
` keep packages/plugin-sdk/package.json in step, so a plugin using the` +
` new surface can require a host that has it.`,
);
process.exit(1);
}

console.log(
`Plugin SDK surface changed in ${changedSurface.length} file(s) with a version bump.`,
);
14 changes: 13 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,12 @@ jobs:
pnpm-version: ${{ env.PNPM_VERSION }}
cache-prefix: checks

# Four tasks for four vCPUs: TypeScript 7 and esbuild are multi-threaded,
# so turbo's default of ten concurrent tasks only adds contention here.
# Measured pinned to 4 CPUs, two rounds each: 96 s / 110 s at the
# default vs 90 s / 58 s at four.
- name: Build, typecheck, and lint
run: pnpm exec turbo run build typecheck lint --cache-dir=.turbo/cache --output-logs=new-only
run: pnpm exec turbo run build typecheck lint --cache-dir=.turbo/cache --output-logs=new-only --concurrency=4

# Runs after build and typecheck, so the guard's own turbo build is a
# cache hit and the package it packs is the one this commit really ships.
Expand Down Expand Up @@ -72,6 +76,14 @@ jobs:
- name: Check app bundle budgets
run: node apps/app/scripts/check-bundle-budget.mjs

# Provider-literal ratchet (G1 of the provider-plugin migration):
# core must never gain a new provider-id carve-out; the per-file
# baseline may only shrink. See docs/provider-plugin-api.md.
- name: Check provider-literal ratchet
run: |
git fetch --depth=1 origin "${{ github.base_ref || github.event.repository.default_branch }}" || true
node scripts/check-provider-literal-ratchet.mjs --base "origin/${{ github.base_ref || github.event.repository.default_branch }}"

# Exceeding the Actions cache quota is silent: GitHub evicts entries
# without failing or warning anything, so the only symptom is caches
# quietly ceasing to hit. Warn while there is still headroom.
Expand Down
84 changes: 84 additions & 0 deletions .github/workflows/deploy-demo-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Deploy Demo Server

# The bb demo server is the mock bb server an App Store reviewer connects to
# (apps/demo-server). It has no database, no secrets, and no route of its
# own, so this is the short form of deploy-connect.yml: install, typecheck
# and test, deploy. It serves from workers.dev; see the wrangler config for
# why it is not on demo.getbb.app.
#
# Paths: the worker bundles @bb/server-contract from source, and the
# contract is what its tests check the fixtures against, so a contract change
# redeploys the demo too. That is the point: a demo that has drifted from the
# contract is a demo that crashes in front of a reviewer.

on:
push:
branches:
- main
paths:
- "apps/demo-server/**"
- "packages/server-contract/**"
- ".github/workflows/deploy-demo-server.yml"
workflow_dispatch:

env:
NODE_VERSION: "22.x"
PNPM_VERSION: "9.15.0"

permissions:
contents: read

# One deploy at a time, and a queued one waits rather than being dropped, so
# the worker never ends up on a build older than main.
concurrency:
group: demo-server-deploy-${{ github.ref }}
cancel-in-progress: false

jobs:
deploy:
name: Deploy demo server to Cloudflare Workers
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 15

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up pnpm
uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
with:
version: ${{ env.PNPM_VERSION }}
run_install: false

- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline

# The tests parse every fixture with the contract's own schemas. Run
# them here too, not only in ci.yml: this job also fires on a contract
# change, and that is exactly when a fixture can go stale.
- name: Typecheck and test
run: pnpm exec turbo run typecheck test --filter=@bb/demo-server

# No build step: wrangler's esbuild bundles the worker and its workspace
# dependency straight from source. The account is pinned in
# wrangler.jsonc, so the token never has to pick one.
- name: Deploy demo server
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: pnpm --filter @bb/demo-server exec wrangler deploy | tee deploy.log

# The workers.dev URL is what goes in the App Store review notes. Surface
# it on the run so nobody has to open the Cloudflare dashboard for it.
- name: Report the URL
run: |
{
echo "## Demo server"
echo
grep -Eo 'https://[^ ]+\.workers\.dev' deploy.log | sort -u | sed 's/^/- /' || echo "- URL not found in the wrangler output; check the deploy step log."
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading