Toolbar buttons fold into a dropdown menu when space is constrained,
preserving minimum address bar width. ArtifactPublishButton gains
controlled popover state with optional virtual anchoring. Tour-pinned
tools stay visible while others fold in priority order.
* fix: release dictation session listeners when speech workers exit
* fix(i18n): restore diff note draft catalog entries
* fix(i18n): make AI the recipient of diff notes
* test(persistence): start the fault timer after the real worker is ready
---------
Co-authored-by: m4air <m4air@m4airs-Air.localdomain>
Co-authored-by: OrcaWin <alpha-eng@stably.ai>
* docs: clarify native chat document ownership
* fix: restore catalog entries required by the current CI baseline
* fix(i18n): make AI the recipient of diff notes
* fix: fence callbacks from retired emulator streams
* fix: restore catalog entries required by the current CI baseline
* fix(i18n): make AI the recipient of diff notes
* perf: scope relay capacity checks to the requested cell
* fix: restore catalog entries required by the current CI baseline
* fix(i18n): make AI the recipient of diff notes
* fix: observe abandoned linked-issue lookups on desktop and runtime
* fix: restore catalog entries required by the current CI baseline
* fix(i18n): make AI the recipient of diff notes
* fix(i18n): restore diff note draft catalog entries
* fix(i18n): make AI the recipient of diff notes
---------
Co-authored-by: m4air <m4air@m4airs-Air.localdomain>
Co-authored-by: Neil <neil@stably.ai>
- Replace .filter().flatMap() chains with .flatMap() using conditionals
- Use constructor parameter shorthand in PreflightHandler
- More concise conditional filtering across agent detection and tab rebasing
* fix(i18n): correct duration and turn-status copy across locales
The Cmd+J session-age badge and the native-chat turn row carried
machine-translated strings that read wrong in several locales:
- zh read the "m" in the age badge as the metre character (米), so a
session showed as "17米" instead of "17分".
- zh/ja/ko/fr rendered "Working for N" as a location/preposition phrase
("为 N 工作", "N で働いています", "N에서 근무", "Travailler pour N"),
i.e. "works for/at N" rather than "has been working N".
- The turn-details aria-label read the conversation "turn" as a road turn
(转弯 / 회전 / virage) in zh/ko/fr.
- ja/ko left the age-badge and cleanup duration units as bare Latin
"m/h/d"; ko's cleanup "N days ago" mixed "d" with 전.
The English source values are ambiguous ("{{value0}}m", "Working for N"),
so a value-only re-translation cannot disambiguate them. Pin the reviewed
strings per locale and guard them with a focused test.
* fix(i18n): use a type guard instead of an assertion in the guard test
CI's type-aware lint rejects `as Record<string, unknown>`; narrow with an
`isStringRecord` predicate instead.
* feat(diff-comments): draft inline notes as editor view zones
Move comment drafting from floating popover to inline view zone. The draft card now appears in the editor flow, preventing overlap with code and integrating naturally with the diff layout. Includes styled margin indicator, auto-resizing textarea, and keyboard/submission handling.
* Preserve inline draft comments when switching diff views
- Reanchor draft zones to new models when file/line mapping changes
- Disable draft mode on large diffs to maintain performance
- Enhance draft card UX: shadow depth, outside-click handling, toast errors
- Carry draft body and position when reopening comments
* Ensure draft comment textarea auto-focuses and preserve drafts through e
- Focus textarea on mount via requestAnimationFrame for reliable focusing
- Add onDomNodeTop callback to focus textarea when zone reaches viewport
- Preserve pending draft when editor model refreshes and re-anchor on reload
- Add editor.getModel() checks before opening and re-anchoring drafts
- Test that textarea is focused on creation and errors are surfaced
* fix(diff-comments): prevent draft loss and duplicate submission on swap
- Track submission state to prevent carrying in-flight text to new cards
- Restore failed submissions for retry after model swap with unmount safety
- Use effects for proper ref management per React patterns
- Add isDraftOpen() guard to prevent re-opening the keyboard chord while composing
- Separate concerns between user clicks and draft-open state in decorator
* fix(diff-comments): show save error and restore focus intelligently
- Toast error when draft submission fails, so users see why it didn't save
- Return focus to editor only if the card still holds it when save completes, preventing focus theft on slow saves
* minor fix
* fix(diff-comments): park focus before submit button disables
Chromium moves focus to <body> when a focused button becomes
disabled, causing the draft zone to lose focus context. By
explicitly moving focus to the textarea before the button disables,
the zone can properly return focus to the editor after save.
* add all translation