Repository navigation
Conversation
#905 (iOS app, one pairing for every machine) and #926 (localized errors) merged independently. #905 moved herdr-automate's binary, checksum, and platform failures into host_build::Error and added herdr_client::Error::TerminalAttach, remote control's app::Error::Enroll, and the root Error::Nearby, none of which had a Localize mapping, so main no longer compiled. Each new enum gets its own mapping and .ftl file, as #926 set out: host_build (error-host-build.ftl, which takes over the three automation messages), terminal_attach (error-client-terminal-attach.ftl), nearby (error-nearby.ftl), and enroll (in error-remote-control.ftl). Per-variant tests cover each. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BFavh5CsF9aiVsJURUwioh
…gh Fluent Part of Phase 2 of docs/i18n.md. browser/ is marked migrated: every text it shows comes from browser.ftl, browser-notes.ftl, browser-vscode.ftl, and browser-px0.ftl. Errors a page, VS Code's server, or px0 report go through localize() instead of to_string(). Tab titles stay saved in English, as the command line lists them; the window shows the title the app gives a tab it draws (Review, Orchestrator, Devices, Terminal, New Tab) in its language. The prompt an agent receives with page notes stays English, marked as data. Inline test modules of three files move to their own tests.rs, and the browser gains an en-XA leak test.
Under en-XB the page toolbar kept its left-to-right order, so Back pointed away from the side it should lead from. The row now runs from the start side, and Back and Forward point along it.
Part of Phase 2 of docs/i18n.md. chat/ is marked migrated: everything a chat pane shows comes from chat.ftl and chat-text.ftl, with Fluent selectors for its plurals (files, lines, steps, what still runs). - Errors a chat shows go through localize() instead of to_string(). chat::pasted, chat::page, chat::visual, and chat::widgets are now nameable, so their errors and herdr-chat-protocol's Rejection have mappings in error-chat.ftl. A chat page's own words (too large, no folder) become a page::Error instead of io::Error::other text. - Durations and turn summaries: chat::text writes them from herdr-chat-protocol's typed values instead of its English display helpers, which herdr-acp's own view keeps using. - A tool call's state is a ToolState enum instead of matched strings. - The agent's own words (compaction section titles), shell scripts, and the opt-in rich chat preview fixture are marked as data. - A chat's en-XA leak test draws a working turn in every layout and its running table. The running table test reads the time before the frame it checks, so a slow frame no longer fails it.
Collaborator
Author
|
|
[Medium impact] The PR appears safe to merge; no outstanding findings remain. SummaryMoves app-owned chat text, durations, turn summaries, and errors into Fluent messages.
Reviews (3) · Last reviewed commit: "perf(i18n): stop idle chat composers fro..." · Reviewed by Greptile |
# Conflicts: # crates/herdr-gpui/locales/en-US/error-client-terminal-attach.ftl # crates/herdr-gpui/locales/en-US/error-host-build.ftl # crates/herdr-gpui/locales/en-US/error-nearby.ftl # crates/herdr-gpui/locales/en-US/error-remote-control.ftl # crates/herdr-gpui/src/i18n/errors/client/terminal_attach.rs # crates/herdr-gpui/src/i18n/errors/host_build.rs # crates/herdr-gpui/src/i18n/errors/nearby.rs # crates/herdr-gpui/src/i18n/errors/remote_control.rs # crates/herdr-gpui/src/i18n/errors/tests/nearby.rs
… own line rustfmt had pulled the keep-sorted end marker onto the match arm's closing brace, so just check-sorted failed on main.
Prepared chat bodies and their selectable text were cached by transcript revision alone, so after a language switch a question's headings and a cut answer's note stayed in the old language while tool headers and turn summaries changed, and the drawn label no longer matched its selectable segment. The window's chat poll now compares the shown locale like it compares the layout and width, and on a change each pane forgets its prepared text (keeping decoded pictures) and prepares it again. The chat visual error test now also covers Base64, Decode, Fetch, and MathParse. The native sidebar fixture's 20 second deadline also covered the debug build's startup and catalog loading, which already took about 17 seconds on main's windows-2025 runner; the extra chat messages pushed it past the bound on every attempt. It is a bound on a hung fixture, not a performance budget, so it is now 40 seconds.
Collaborator
Author
|
@greptileai review |
The window's chat poll sets each composer's localized placeholder every frame. set_placeholder_with always dropped the input's layout and notified, so an idle chat kept requesting redraws and laying its text out again. It now lays out and notifies only when the formatted text differs, as set_placeholder already did, and still keeps the closure so a language switch formats it again.
Collaborator
Author
|
@greptileai review |
Each Terminal::next reads one chunk, and the core may split or join what the mock sends, so the test could read the chunk before "hi" first and then assert on a batch one step behind, as on CI's windows-2025 leg. It now reads until the update it expects arrives, within the same bounded wait, and still checks the mode is reported once.
✅ Deploy Preview for herdr-ui canceled.
|
# Conflicts: # crates/herdr-core-client/src/tests/backend.rs # crates/herdr-gpui/src/browser/store.rs # docs/i18n.md
This was referenced Nov 1, 2026
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.
Stacked on #942 (base
i18n/rest-chat-browser). Merge #942 first; this PR's base then becomesmain. Both branches are merged withmainand no longer depend on #937, which main's own fix (3f18590) made redundant.Summary
Part of Phase 2 of
docs/i18n.md(string migration), following #880, #924, #925, #926, and #928. This PR covers agent chats. With it and #942,chat/andbrowser/are covered by// i18n: migratedmarkers.chat/is marked// i18n: migratedas a whole. Its text comes fromchat.ftl(header, composer, tool cards, pages and pictures, the plan rail, what still runs, forms) and a newchat-text.ftl(durations and turn summaries).localize().chat::pasted::Error, which docs/i18n.md listed as unnameable, is nowpub(crate)and mapped.chat::page::Error, which is new: a page's own words such as "the page is too large" used to beio::Error::othertext. Also mapped:chat::visual::Error(pictures, diagrams, formulas),chat::widgets::Error(interactive cards), and herdr-chat-protocol'sRejection, which the composer shows when the program refuses a command.i18n/errors/chat.rsanderror-chat.ftl, with per-variant tests.herdr_chat_protocol::display::{duration, TurnSummary::describe}write English for herdr-acp's own terminal view. The window now writes them through a newchat::text, which uses the protocol's typed values. A test checks that English output reads exactly as the protocol writes it. Token counts keep the protocol's short form (18.6k).&'static strmatched for its color. It is now aToolStateenum.// i18n: data.set_placeholder_with, so they follow a language change.chat/tests/en_xa.rsdraws a working turn in every layout, with a user prompt, an answer, a tool call and its output, a plan, and a shell left running, then opens the running table. It caught the working row adding "…" in Rust, which is now part of the message.the_row_opens_a_table_and_clears_once_everything_endedread the time after drawing the frame it checked, so a slow frame under load could fail it. It now reads the time first. It failed once in a fulljust cirun during this work.docs/i18n.md: "What is left" no longer lists chats orchat::pasted::Error, and the leak-test list is updated.Screenshots
Native macOS captures from a debug build of this branch, run against an isolated sandbox daemon.
herdr-acp --name Claudewraps a stub ACP agent that answers with a plan, a tool call, and a reply. The prompt was sent withherdr pane send-text, and the language was switched withherdr-gpui language set; no synthetic input was used. Message text, tool titles, output, and plan steps are the agent's own, so they stay as written.Under en-XB, the timeline and composer mirror, but the plan rail stays on the right. The reversed "Worked 1ms" also loses the space around its isolated duration, because pseudo-bidi reverses each run separately. Neither is changed here; RTL layout of the chat pane is left for a Phase 4 follow-up.
QA
just formatjust cionfdf37f70b(macOS arm64, after merging main): passedjust lint-linuxandjust lint-windowson the same commit: passedpasted,page,visual,widgets, andRejectionchat::text: English reads asherdr_chat_protocol::displaywrites it🤖 Generated with Claude Code
https://claude.ai/code/session_01BFavh8DuqfoT8UKWKk97Kq