Commit Graph
19 Commits
Author SHA1 Message Date
Tianyi Cui 27389e0899 fix(client): preserve unmounted settings and composer ownership 2026-09-17 11:19:07 +08:00
imccyu 6d3b5d4526 test(client): migrate Session reference coverage 2026-09-17 05:28:19 +08:00
07akioni 5c369a0a1f fix: carry session writer failures by typed remote code 2026-09-16 15:38:34 +08:00
07akioni e0f170b8d0 fix: explain session writer contention in toasts 2026-09-16 14:50:38 +08:00
liukx0205 b263581e92 fix(client): answer the review bot's findings on the keyboard hand-offs
- The model seat decides before consuming: a focused control that is not a row
  (a retry button) keeps the browser's traversal, and Tab enters the list only
  from the trigger.
- A launcher-opened menu is a fresh intent, so the dismissal that closed the
  same token earlier no longer silences it.
- Comments and JSDoc now match the implementation: the near-end entry resumes
  from the walk's last index, Shift+Tab leaves whenever the menu is open, and
  the anchor hand-back names the control that opened the menu.
- The e2e focus assertions all go through `expect.poll`.
- Regression coverage for a rowless pane (the trigger keeps the keyboard) and
  for a focused retry keeping its Tab, in the seat and the popup shell.
- The PR records the two public-surface changes (`SessionInput.focus()` in,
  `bindComposerFocus` out) and the row-fill focus decision.
2026-09-15 14:21:00 +08:00
liukx0205 5c3081eeaa fix(client): tighten the keyboard hand-offs, and drop the dialog Escape layering
Review follow-ups on the hand-offs this branch added:

- Menu gives the keyboard back to the control that opened it (an anchor may
  wrap several, as a split button does), falls back to a disabled-free anchor
  button, leaves a Tab it cannot use to the browser, and no longer moves focus
  while the owner keeps the list open.
- The model seat settles only real rows with Tab and keeps the keyboard on its
  trigger when a pane's rows are disabled or absent.
- The popup shell leaves Tab to the browser when nothing can be settled (the
  error strip's retry button stays reachable), and a dismissal caused by a
  stale catalog returns the keyboard like the other paths.
- A frozen-tier track is the submit gesture's own bookkeeping and no longer
  re-arms a menu the user dismissed.
- The launcher reuses the shared caret-preserving focus helper; the option
  contract records that `active` is the row an accept gesture confirms; the
  conversation README documents the composer's key and focus behavior.

The dialog/menu Escape layering this branch also carried is out of scope here
and has been removed again.
2026-09-15 14:16:14 +08:00
liukx0205 c47a469aec feat(client): accept and leave with Enter, Tab, and Escape in the composer
The popup select panel and the model seat hold focus while open, and their Tab
fell through to the browser's traversal, leaving an open surface that only a
pointer press clears. Both now settle on Enter or Tab, leave on Escape or
Shift+Tab, walk with the arrows, and park on the value in use: the panel's
highlight on the row its options mark current, the seat's drilled pane on its
checked row, with the keyboard handed back to the cell that drilled in when the
pane is left.

Dismissal rides the conversation's own focus(), so the caret returns where the
draft left it instead of at the start.
2026-09-15 13:35:04 +08:00
creatixchu 6c4a2fb294 Merge remote-tracking branch 'origin/master' into worktree/issue-3515-feedback-dialog
# Conflicts:
#	packages/client/ui-model-selection/tests/browser-plugin.client.spec.ts
2026-09-09 14:27:15 +08:00
creatixchu f2f9700de2 feat(feedback): open one feedback dialog from /feedback and Dislike, with categories and a toast
Dislike and a bare /feedback open the Session's feedback dialog, which
collects one of seven fixed categories and an optional description and
records through the messageFeedback put or the new sessionFeedback
Remote; Like records at once. A recorded rating shows the filled glyph
and every submission is acknowledged by a toast. feedback/record and
MessageFeedbackItem carry the optional category; the note popover, its
layout scenario, and the clearNote/clear verbs are removed. ui-commands
gains the action command kind the /feedback decoration runs as.

Closes #3515
2026-09-09 10:20:24 +08:00
Turtle 555c04bdfc fix(web): localize Chinese model copy 2026-09-08 21:05:31 +08:00
Yif 5813c14dee fix(client): portal composer menus over the sidebar and float toasts near the top
ModelSelect renders its dropdown through a body portal with viewport-clamped
fixed placement, so the panel keeps its full width instead of being cut by the
sidebar edge. The preset seat passes Menu an anchor class with an icon-only
min-width floor and moves its label ellipsis onto a dedicated span, keeping the
chip's overflow degradation breakpoint-free. Toasts move to the viewport top
and shrink to fit their text.
2026-09-04 20:19:42 +08:00
imccyu 804b1ffbfc refactor(api): converge the Remote failure vocabulary and client surface
Single RemoteError with a merge-extensible, domain-prefixed code map;
owners throw at the failure point; streams surface marked failures;
clients consume ctx.remote directly with isRemoteFailure as the only
discrimination point and construct no failure instances.
2026-08-28 22:37:36 +08:00
imccyu 160706be60 test(api): refresh Remote migration artifacts 2026-08-27 21:57:56 +08:00
Yichen Jiang b6c5aa7516 fix(web): hide model selector descriptions
Refs #3077
2026-08-25 21:19:21 +08:00
imccyu 822d735356 feat(session): persist model selection and share its catalog 2026-08-25 06:07:42 +08:00
imccyu be531688f3 refactor(client): migrate consumers and remove Runtime 2026-08-23 16:28:18 +08:00
imccyu d26acfa2e3 refactor(session): move APIs into Session Controller 2026-08-23 16:16:02 +08:00
Chinesezjc 94135092a5 fix(locale): open in English when the browser names no shipped language
The provisional locale fell back to zh, so a browser asking for neither
zh nor en (fr, de) opened the product in Chinese. Resolve to en instead,
and use en as the dictionary fallback: the shipped zh/en dictionaries
declare identical key sets, so one constant serves both roles.

Add scripts/locale-dictionary-parity.spec.ts to gate that symmetry, and
set the asserted locale explicitly in specs that had relied on the old
zh fallback through a dead usePinnedBrowserLanguages call (those files
declare no jsdom environment, so browser detection never ran there).
2026-08-17 18:55:28 +08:00
Tianyi Cui a2d0f7f411 refactor: apply repository naming contract
Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
2026-08-13 00:54:38 +08:00