mirror of
https://github.com/block/buzz.git
synced 2026-10-30 05:51:46 +00:00
Slice B. A third, purely additive `conversation` transcript variant for the
full-cover reading surface: the human's prompt as a right-aligned bubble, the
agent's reply as unboxed prose at a comfortable measure, reasoning behind a
"Thinking… / Thought for Ns" disclosure, the plan as a live checklist, and
session/status noise receded to quiet dividers.
The transcript previously had two presentations — the dense `default` activity
feed and `compactPreview` — both tuned for a 380px panel. Read at full width
they are a scan surface, not something you read a turn in.
Threaded through `ManagedAgentSessionPanel` and `AgentSessionThreadPanel` as
an optional prop. Tool items deliberately route through the same
`ToolActivity` presenter as `default`, which is what lets the tool-chain card
work in slice C land on top without conflict.
The byte-for-byte guarantee for the existing two variants is enforced by a
captured-markup fixture rather than by inspection: the baseline was produced
by mounting the same transcript on unmodified code, so the test fails on any
drift in `default` or `compactPreview` output.
Three defects found and fixed while building it, each with a
non-vacuous test:
- The author row resolved its name through `resolveUserLabel`'s
`fallbackName: item.title`, whose value describes the *trigger* that started
the turn ("@Mention", "Prompt", a title-cased Buzz event kind) and is never
an identity. Harmless where it only seeded avatar initials; the conversation
author row promotes it to displayed text, so an unresolved sender rendered
as if "@Mention" were their name. Identity now stops at the profile —
display name, NIP-05 handle, truncated pubkey — and the title stays as
trigger chrome in the footer. The existing test was asserting the bug.
- The captured-markup fixture embeds formatted timestamps, so it was
zone-sensitive; pinning `TZ` then exposed that it is locale-sensitive too.
Assigning `process.env.LANG` at runtime does not fix it — node resolves its
default locale once at startup, unlike `TZ`, which `Date` reads lazily. Both
formatting surfaces the render path reaches are overridden, including
`Date.prototype.toLocale*`, which does not route through
`Intl.DateTimeFormat`. `Intl.DateTimeFormat` must be replaced with a plain
function, not an arrow: the render path calls it with `new`.
Squashed from ss-dev-01/conversation-variant (#6538) at 5e3faf443.
Co-authored-by: ss-dev-01 <11939edb7df583f855dbef923f2358f1184538f88ca452e19e7e35e42ad6d796@buzz.block.builderlab.xyz>
Co-authored-by: Bradley Axen <baxen@squareup.com>
Signed-off-by: Bradley Axen <baxen@squareup.com>
Signed-off-by: ss-dev-00 <a02c4e0850e5e612b4ddf95dbe2f5c56467cf27c6552203bc833ff438fb31971@buzz.block.builderlab.xyz>
Buzz
Desktop chat shell with:
- Tauri + React + TypeScript + Vite
- Tailwind CSS
- shadcn/ui-ready shared components
- Biome (lint/format/check)
- Feature-driven frontend structure
Scripts
pnpm dev- run the web frontendpnpm tauri dev- run the desktop apppnpm build- typecheck and build frontendpnpm typecheck- TypeScript checkspnpm lint- Biome lintpnpm format- Biome format (write)pnpm check- Biome check
Structure
src/shared- reusable app-wide code (ui,lib,styles)src/features- feature modules (vertical slices)src/app- top-level app composition