Skip to content

Commit 36fec6d

Browse files
author
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7
committed
Merge remote-tracking branch 'origin/main' into duncan/dream-harness-work
* origin/main: (25 commits) fix(thread): stop mid-scroll content jump in live threads (#1397) fix(ci): restore main to green — tauri fmt, personas.rs file-size split, Windows path test (#1399) fix(desktop): enable buzz-dev-mcp MCP server for Codex agents (#1394) fix(ci): restore E2E flakiness fixes for pgschema, docker-pull, and spec timing (#1396) fix(personas): persist pack-backed persona UI edits across reboot (#1392) fix(buzz-acp): clear steer_rx on all run_prompt_task exit paths (#1391) Restore channel date divider rule (#1395) Speed up profile wave action (#1379) Restore visible links for rich previews (#1378) Mobile channel list polish (#1367) style(desktop): unify corner radii to rounded-2xl (16px) (#1393) fix(desktop): skip keychain write when blob contents are unchanged (#1377) fix(desktop): stop clipping the agent-activity row under the composer (#1371) Constrain macOS overscroll to conversations (#1317) Mobile appearance foundation (#1366) chore(release): release Buzz Desktop version 0.3.38 (#1375) feat(desktop): provider-agnostic model selection + databricks discovery (#1307) release(helm): buzz chart 0.1.1 (#1374) Harden relay attack surfaces (#1369) ci(helm): publish chart to GHCR on chart-v* tags (#1372) ...
2 parents 30e25b4 + 42ec17f commit 36fec6d

192 files changed

Lines changed: 12973 additions & 2522 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ RELAY_URL=ws://localhost:3000
5858
# {path}/{owner_hex}/{repo_id}.git/. Default: ./repos (relative to CWD).
5959
# Set an absolute path to keep repos stable across worktrees.
6060
# BUZZ_GIT_REPO_PATH=./repos
61+
# BUZZ_GIT_MAX_PACK_BYTES=524288000
62+
# BUZZ_GIT_MAX_REPO_BYTES=1048576000
63+
64+
# -----------------------------------------------------------------------------
65+
# Media Upload Admission
66+
# -----------------------------------------------------------------------------
67+
# Bound image/video parser and storage work admitted by one relay process.
68+
# BUZZ_MEDIA_MAX_CONCURRENT_UPLOADS=8
69+
# BUZZ_MEDIA_MAX_CONCURRENT_UPLOADS_PER_PUBKEY=2
70+
# BUZZ_MEDIA_UPLOADS_PER_MINUTE=30
6171

6272
# -----------------------------------------------------------------------------
6373
# Ephemeral Channels (TTL testing)

.github/workflows/auto-tag-on-release-pr-merge.yml

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
name: Auto-tag on Release PR Merge
22

3-
# Three release lanes share this one workflow — adding a lane is one more branch
3+
# Four release lanes share this one workflow — adding a lane is one more branch
44
# prefix, never a forked copy:
55
#
66
# version-bump/<v> → tag v<v> → dispatch release.yml (desktop app)
77
# relay-release/<v> → tag relay-v<v> → dispatch docker.yml (relay image)
8+
# chart-release/<v> → tag chart-v<v> → dispatch helm-chart.yml (helm chart)
89
# mobile-release/<v> → tag mobile-v<v> → (manual sprout_ref for buzz-releases build — see below)
910
#
10-
# Both the desktop and relay lanes dispatch their build workflow rather than
11+
# The desktop, relay, and chart lanes dispatch their build workflow rather than
1112
# relying on the consumer's `on.push.tags` trigger: auto-tag pushes the tag
1213
# with the default GITHUB_TOKEN, which GitHub's recursion guard blocks from
13-
# firing any `on: push` trigger. So release.yml and docker.yml both have a
14-
# `push.tags` trigger that is dead for auto-pushed tags — the dispatch is the
15-
# real path. Each dispatch passes the bare version and the tag ref so the
16-
# consumer builds the tagged commit (github.ref on a dispatch is `main`).
14+
# firing any `on: push` trigger. So release.yml, docker.yml, and helm-chart.yml
15+
# all have a `push.tags` trigger that is dead for auto-pushed tags — the
16+
# dispatch is the real path. Each dispatch passes the bare version and the tag
17+
# ref so the consumer builds the tagged commit (github.ref on a dispatch is
18+
# `main`).
1719
#
1820
# The mobile lane is push-only by infosec necessity: OSS `block/buzz` CI must
1921
# not trigger CI in the private `buzz-releases` repo, so auto-dispatch across
@@ -36,6 +38,7 @@ jobs:
3638
github.event.pull_request.merged == true &&
3739
(startsWith(github.event.pull_request.head.ref, 'version-bump/') ||
3840
startsWith(github.event.pull_request.head.ref, 'relay-release/') ||
41+
startsWith(github.event.pull_request.head.ref, 'chart-release/') ||
3942
startsWith(github.event.pull_request.head.ref, 'mobile-release/')) &&
4043
github.event.pull_request.head.repo.full_name == github.repository
4144
runs-on: ubuntu-latest
@@ -60,6 +63,10 @@ jobs:
6063
VERSION="${BRANCH#relay-release/}"
6164
TAG_PREFIX="relay-v"
6265
DISPATCH="docker" ;;
66+
chart-release/*)
67+
VERSION="${BRANCH#chart-release/}"
68+
TAG_PREFIX="chart-v"
69+
DISPATCH="helm-chart" ;;
6370
mobile-release/*)
6471
VERSION="${BRANCH#mobile-release/}"
6572
TAG_PREFIX="mobile-v"
@@ -113,6 +120,7 @@ jobs:
113120
case "$DISPATCH" in
114121
release) WORKFLOW="release.yml" ;;
115122
docker) WORKFLOW="docker.yml" ;;
123+
helm-chart) WORKFLOW="helm-chart.yml" ;;
116124
*)
117125
echo "::error::Unhandled dispatch target: '$DISPATCH'"
118126
exit 1 ;;

.github/workflows/ci.yml

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,18 @@ jobs:
305305
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
306306
- uses: cashapp/activate-hermit@e49f5cb4dd64ff0b0b659d1d8df499595451155a # v1
307307
- name: Start integration services
308-
run: docker compose up -d postgres redis minio minio-init
308+
run: |
309+
for attempt in 1 2 3; do
310+
if docker compose up -d postgres redis minio minio-init; then
311+
break
312+
fi
313+
if [ "$attempt" -eq 3 ]; then
314+
echo "docker compose up failed after 3 attempts" >&2
315+
exit 1
316+
fi
317+
echo "docker compose up failed (attempt $attempt), retrying in $((attempt * 5))s..." >&2
318+
sleep $((attempt * 5))
319+
done
309320
- name: Get pnpm store directory
310321
id: pnpm-cache
311322
run: echo "STORE_PATH=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"
@@ -380,6 +391,13 @@ jobs:
380391
PGUSER: buzz
381392
PGPASSWORD: buzz_dev
382393
PGDATABASE: buzz
394+
# Use the already-running docker postgres for desired-state planning instead of
395+
# downloading an embedded Postgres from Maven Central (transient-fetch flake source).
396+
PGSCHEMA_PLAN_HOST: localhost
397+
PGSCHEMA_PLAN_PORT: "5432"
398+
PGSCHEMA_PLAN_DB: buzz
399+
PGSCHEMA_PLAN_USER: buzz
400+
PGSCHEMA_PLAN_PASSWORD: buzz_dev
383401
run: |
384402
./bin/pgschema apply --file schema/schema.sql --auto-approve
385403
docker exec -i -e PGPASSWORD=buzz_dev buzz-postgres \
@@ -471,7 +489,18 @@ jobs:
471489
with:
472490
save-if: ${{ github.event_name != 'pull_request' }}
473491
- name: Start integration services
474-
run: docker compose up -d postgres redis minio minio-init
492+
run: |
493+
for attempt in 1 2 3; do
494+
if docker compose up -d postgres redis minio minio-init; then
495+
break
496+
fi
497+
if [ "$attempt" -eq 3 ]; then
498+
echo "docker compose up failed after 3 attempts" >&2
499+
exit 1
500+
fi
501+
echo "docker compose up failed (attempt $attempt), retrying in $((attempt * 5))s..." >&2
502+
sleep $((attempt * 5))
503+
done
475504
- name: Wait for integration services
476505
run: |
477506
wait_healthy() {
@@ -513,6 +542,13 @@ jobs:
513542
PGUSER: buzz
514543
PGPASSWORD: buzz_dev
515544
PGDATABASE: buzz
545+
# Use the already-running docker postgres for desired-state planning instead of
546+
# downloading an embedded Postgres from Maven Central (transient-fetch flake source).
547+
PGSCHEMA_PLAN_HOST: localhost
548+
PGSCHEMA_PLAN_PORT: "5432"
549+
PGSCHEMA_PLAN_DB: buzz
550+
PGSCHEMA_PLAN_USER: buzz
551+
PGSCHEMA_PLAN_PASSWORD: buzz_dev
516552
run: |
517553
./bin/pgschema apply --file schema/schema.sql --auto-approve
518554
docker exec -i -e PGPASSWORD=buzz_dev buzz-postgres \

.github/workflows/helm-chart.yml

Lines changed: 163 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,72 @@
11
name: helm chart
22

3+
# Lints + unit-tests + render-checks the chart on every PR/main push, and
4+
# PUBLISHES it to GHCR as an OCI artifact on `chart-v*` tags.
5+
#
6+
# Publishing mirrors the relay image (see docker.yml): the chart is versioned
7+
# independently of the desktop app and the relay via its own `chart-v*` tags
8+
# (Chart.yaml `version`, cut by merging a `chart-release/<version>` PR). Only
9+
# `chart-v*` tags publish — `main` pushes and PRs stay lint/render-only so we
10+
# never overwrite a released chart version from an in-progress `main`.
11+
#
12+
# Why workflow_dispatch carries version/ref inputs (same reason as docker.yml):
13+
# auto-tag-on-release-pr-merge.yml pushes `chart-v*` with the default
14+
# GITHUB_TOKEN, which GitHub's recursion guard blocks from firing any
15+
# `on: push` trigger. So the `push.tags` trigger below is dead for
16+
# auto-pushed tags — auto-tag instead dispatches this workflow with the bare
17+
# version + tag ref, and the publish job checks out inputs.ref and packages at
18+
# inputs.version. On a real manual `git push` of a `chart-v*` tag the
19+
# push.tags trigger fires and inputs are empty.
20+
321
on:
422
workflow_dispatch:
23+
inputs:
24+
version:
25+
description: "Chart semver e.g. 0.1.0 (no chart-v prefix) — for chart-tag rescue dispatch"
26+
required: false
27+
ref:
28+
description: "Chart tag ref to publish, e.g. chart-v0.1.0 (required when version is set)"
29+
required: false
30+
default: main
531
push:
32+
# No `paths` filter here: GitHub applies a push `paths` filter to tag
33+
# pushes too, so a `chart-v*` tag whose commit didn't touch a chart file
34+
# would be filtered out and never publish. docker.yml / release.yml / sprig
35+
# all keep `paths` out of a tag-carrying `push` for exactly this reason —
36+
# PR runs stay scoped via `pull_request.paths` below; main pushes lint
37+
# unconditionally (cheap), and tag pushes always run so publish can fire.
638
branches: [main]
7-
paths:
8-
- "deploy/charts/buzz/**"
9-
- ".github/workflows/helm-chart.yml"
10-
- "ct.yaml"
39+
tags: ["chart-v[0-9]*"]
1140
pull_request:
1241
paths:
1342
- "deploy/charts/buzz/**"
1443
- ".github/workflows/helm-chart.yml"
1544
- "ct.yaml"
1645

46+
# Match docker.yml: deny-by-default, each job grants only what it needs.
47+
permissions: {}
48+
49+
env:
50+
# Single source of truth for the OCI chart repository (helm appends the chart
51+
# name `buzz`, yielding oci://ghcr.io/block/buzz/charts/buzz, which is exactly
52+
# the install ref documented in deploy/charts/buzz/README.md). Set
53+
# GHCR_CHART_REPO as a repo variable to override (e.g., forks pushing to their
54+
# own namespace without editing this file) — mirrors docker.yml's GHCR_IMAGE.
55+
CHART_REPO: ${{ vars.GHCR_CHART_REPO != '' && vars.GHCR_CHART_REPO || 'oci://ghcr.io/block/buzz/charts' }}
56+
1757
jobs:
1858
lint-and-unittest:
1959
name: lint + unittest + render matrix
2060
runs-on: ubuntu-latest
61+
permissions:
62+
contents: read
2163
steps:
2264
- uses: actions/checkout@v4
2365
with:
66+
# On chart-tag rescue dispatch, lint/render the tagged commit that the
67+
# publish job will package, not whatever `main` is when the dispatch
68+
# runs. Empty string = default ref for push/PR events.
69+
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.ref || '' }}
2470
fetch-depth: 0
2571

2672
- name: Set up Helm
@@ -62,10 +108,15 @@ jobs:
62108
# exist and to embed Max's startup migrations. Runs only after Sami's
63109
# image PR merges (`workflow_dispatch`) or on a schedule once main carries
64110
# both prerequisites. Render/lint above is the per-PR signal.
111+
#
112+
# `inputs.version == ''` excludes the chart-tag rescue dispatch (which
113+
# carries a version): that path only packages+publishes, it does not install.
65114
name: install on kind (gated)
66-
if: github.event_name == 'workflow_dispatch'
115+
if: github.event_name == 'workflow_dispatch' && inputs.version == ''
67116
runs-on: ubuntu-latest
68117
needs: lint-and-unittest
118+
permissions:
119+
contents: read
69120
steps:
70121
- uses: actions/checkout@v4
71122
with:
@@ -95,3 +146,110 @@ jobs:
95146

96147
- name: ct install (quickstart profile)
97148
run: ct install --config ct.yaml --charts deploy/charts/buzz --helm-extra-args "--timeout 600s"
149+
150+
publish:
151+
# Packages the chart and pushes it to GHCR as an OCI artifact. Fires only on
152+
# a `chart-v*` tag push (manual) or the auto-tag rescue dispatch (which
153+
# carries inputs.version) — never on `main` pushes or PRs, so an in-progress
154+
# `main` can never overwrite a released chart version. Mirrors docker.yml's
155+
# GHCR publish (login with GITHUB_TOKEN, packages: write, fork override var).
156+
name: publish chart to GHCR
157+
if: >
158+
startsWith(github.ref, 'refs/tags/chart-v') ||
159+
(github.event_name == 'workflow_dispatch' && inputs.version != '')
160+
runs-on: ubuntu-latest
161+
needs: lint-and-unittest
162+
timeout-minutes: 15
163+
permissions:
164+
contents: read
165+
packages: write # push the chart to GHCR
166+
steps:
167+
- name: Checkout
168+
uses: actions/checkout@v4
169+
with:
170+
# On the rescue dispatch, build the tagged commit (github.ref is
171+
# `main` there); on a tag push, the default ref is already the tag.
172+
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.ref || '' }}
173+
fetch-depth: 0
174+
persist-credentials: false
175+
176+
- name: Set up Helm
177+
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
178+
with:
179+
version: v3.16.4
180+
181+
- name: Resolve chart version
182+
id: ver
183+
env:
184+
# Bare on the rescue dispatch; empty on a tag push (derive from ref).
185+
INPUT_VERSION: ${{ inputs.version }}
186+
REF_NAME: ${{ github.ref_name }}
187+
run: |
188+
set -euo pipefail
189+
if [ -n "$INPUT_VERSION" ]; then
190+
version="$INPUT_VERSION"
191+
tag_ref="refs/tags/chart-v${version}"
192+
tag_sha="$(git rev-parse -q --verify "${tag_ref}^{commit}" || true)"
193+
head_sha="$(git rev-parse HEAD)"
194+
if [ -z "$tag_sha" ] || [ "$head_sha" != "$tag_sha" ]; then
195+
echo "::error::workflow_dispatch with version '$version' must check out matching tag 'chart-v${version}' (HEAD=$head_sha, tag=${tag_sha:-missing})"
196+
exit 1
197+
fi
198+
else
199+
# refs/tags/chart-v0.1.0 → github.ref_name is `chart-v0.1.0`.
200+
version="${REF_NAME#chart-v}"
201+
fi
202+
if ! echo "$version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then
203+
echo "::error::Resolved chart version '$version' is not valid semver"
204+
exit 1
205+
fi
206+
# The tag is the source of truth, but the published artifact's version
207+
# comes from Chart.yaml — they must agree or we'd publish a mislabeled
208+
# chart. Fail loudly on drift rather than silently shipping a mismatch.
209+
chart_version="$(helm show chart deploy/charts/buzz | awk '/^version:/ {print $2}')"
210+
if [ "$chart_version" != "$version" ]; then
211+
echo "::error::Tag version '$version' != Chart.yaml version '$chart_version'. Bump Chart.yaml to match the tag."
212+
exit 1
213+
fi
214+
echo "version=$version" >> "$GITHUB_OUTPUT"
215+
echo "Publishing chart version $version"
216+
217+
- name: Log in to GHCR
218+
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
219+
with:
220+
registry: ghcr.io
221+
username: ${{ github.repository_owner }}
222+
password: ${{ secrets.GITHUB_TOKEN }}
223+
224+
- name: Build chart dependencies
225+
run: helm dependency build deploy/charts/buzz
226+
227+
- name: Package chart
228+
run: helm package deploy/charts/buzz --destination dist
229+
230+
- name: Push chart to GHCR
231+
env:
232+
CHART_REPO: ${{ env.CHART_REPO }}
233+
VERSION: ${{ steps.ver.outputs.version }}
234+
run: |
235+
set -euo pipefail
236+
helm push "dist/buzz-${VERSION}.tgz" "$CHART_REPO"
237+
238+
- name: Summary
239+
env:
240+
CHART_REPO: ${{ env.CHART_REPO }}
241+
VERSION: ${{ steps.ver.outputs.version }}
242+
run: |
243+
# CHART_REPO is oci://ghcr.io/block/buzz/charts; helm push appends the
244+
# chart name, so the install ref is .../charts/buzz.
245+
INSTALL_REF="${CHART_REPO}/buzz"
246+
{
247+
echo "### Published chart \`buzz\` \`${VERSION}\`"
248+
echo
249+
echo "**OCI ref:** \`${INSTALL_REF}:${VERSION}\`"
250+
echo
251+
echo "Install:"
252+
echo '```'
253+
echo "helm install buzz ${INSTALL_REF} --version ${VERSION}"
254+
echo '```'
255+
} >> "$GITHUB_STEP_SUMMARY"

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ description. See [PR #803](https://github.com/block/buzz/pull/803).
412412
4. **Worktrees: `cd` in the same command** — shell CWD doesn't persist between tool calls. Use `cd /path && cargo build` as one command.
413413
5. **Desktop crate excluded from root workspace**`cargo test` at repo root does NOT run desktop tests. Use `cargo test --manifest-path desktop/src-tauri/Cargo.toml` explicitly.
414414
6. **Desktop Tauri fmt fails in worktrees and blocks commits** — the pre-commit hook runs `just desktop-tauri-fmt`, which fails in git worktrees because `cargo fmt` resolves workspace paths relative to the worktree root. Run `just desktop-tauri-fmt` from the main checkout to apply the fix, then re-stage and commit. CI is unaffected.
415+
7. **React render perf: `React.memo` is all-or-nothing** — it only skips a re-render when *every* prop is reference-stable; one unstable prop (inline arrow/JSX, or a hook returning a fresh `{}`/`[]`/`Map` each render) defeats it. Two repeat offenders: (a) React Query results (`useMutation`/`useQuery`) are a **new object each render** — depend on the stable method (`mutation.mutateAsync`), not the object; (b) derived `Map`/array state that recomputes on a version bump — wrap in a content-equality ref cache (`shared/hooks/useStableReference.ts`). When chasing interaction lag, **measure with DevTools closed and no perf probes** (an open Web Inspector + per-keystroke `console.log` inflate the numbers), and isolate by removing one suspect at a time rather than guessing.
415416

416417
---
417418

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# Changelog
22

3+
## v0.3.38
4+
5+
- feat(desktop): provider-agnostic model selection + databricks discovery ([#1307](https://github.com/block/buzz/pull/1307)) ([`eacbbe880`](https://github.com/block/buzz/commit/eacbbe880a50acf400ff7c162b5bc8705ab0063f))
6+
- release(helm): buzz chart 0.1.1 ([#1374](https://github.com/block/buzz/pull/1374)) ([`2561cbd06`](https://github.com/block/buzz/commit/2561cbd069a4f7a0ca4824f780867aa30ea9f744))
7+
- Harden relay attack surfaces ([#1369](https://github.com/block/buzz/pull/1369)) ([`29368cf17`](https://github.com/block/buzz/commit/29368cf17b7d5924fe571512b2194e3f48b21a16))
8+
- ci(helm): publish chart to GHCR on chart-v* tags ([#1372](https://github.com/block/buzz/pull/1372)) ([`2722ce422`](https://github.com/block/buzz/commit/2722ce4226838272ab36dc8630feacd2a90e1775))
9+
- feat(buzz-agent): add databricks_v2 provider for AI Gateway v2 ([#1311](https://github.com/block/buzz/pull/1311)) ([`15a73aa27`](https://github.com/block/buzz/commit/15a73aa27feb9db72c9535a8b1113189d2be8dd4))
10+
- refactor(desktop): centralize auxiliary panel shell ([#1343](https://github.com/block/buzz/pull/1343)) ([`e6738c501`](https://github.com/block/buzz/commit/e6738c50153cdb3f78448c912a2e8cd660da5779))
11+
- perf(desktop): stop typing from re-rendering the channel pane + timeline ([#1364](https://github.com/block/buzz/pull/1364)) ([`db1b617ab`](https://github.com/block/buzz/commit/db1b617ab12792b6c5d90d988e52b9a86d7aa361))
12+
- fix(desktop): check PGID in orphan sweep and signal correct process groups ([#1359](https://github.com/block/buzz/pull/1359)) ([`59be27ff3`](https://github.com/block/buzz/commit/59be27ff3fa4c0b0b95688565e945f6f5e0d60ef))
13+
- feat(desktop): harness-agnostic config bridge ([#887](https://github.com/block/buzz/pull/887)) ([`c65989a61`](https://github.com/block/buzz/commit/c65989a61bba7050e4fbc1798630f96d541ab8db))
14+
- fix(acp): enable sandbox network access for Codex MCP subprocesses ([#1363](https://github.com/block/buzz/pull/1363)) ([`401bb51bf`](https://github.com/block/buzz/commit/401bb51bf2dd64776a1862575548cb25ab41ff70))
15+
- perf(desktop): don't block channel create on channel-list refetch ([#1360](https://github.com/block/buzz/pull/1360)) ([`cf57bcbea`](https://github.com/block/buzz/commit/cf57bcbea4af355774d499e109238a5d527ae39e))
16+
- refactor(desktop): split global styles and markdown renderers ([#1361](https://github.com/block/buzz/pull/1361)) ([`c27b4251a`](https://github.com/block/buzz/commit/c27b4251a9304911f2359a3ee22b6f26b13af78b))
17+
- feat(read-state): multi-slot splitting + no-op suppression for oversized blobs ([#1309](https://github.com/block/buzz/pull/1309)) ([`2612324fd`](https://github.com/block/buzz/commit/2612324fd935b3f19ef78e07885aa05f7ef907f1))
18+
- fix: unconditionally replace CLI symlink on boot ([#1357](https://github.com/block/buzz/pull/1357)) ([`50873ef98`](https://github.com/block/buzz/commit/50873ef98d9080614720cd770781698c9b16313d))
19+
20+
321
## v0.3.37
422

523
- feat(buzz-acp): steering as the default mid-turn mention delivery ([#1160](https://github.com/block/buzz/pull/1160)) ([`e567491a`](https://github.com/block/buzz/commit/e567491a196396658ef4c1d4ff6128efd8b2744e))

0 commit comments

Comments
 (0)