Repository navigation
Unify owned agent profile panels - #1083
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eadec29921
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
eadec29 to
2740830
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2740830cdb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 004f99c0c9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
Changes requested. The profile consolidation is the right direction. It currently loses user edits in three places, changes a shared design-system recipe app-wide, and drops two existing behaviors.
Confirmed existing threads (blocking):
- Split settings drafts are discarded across tabs: #1083 (comment). Base UI panels unmount by default (
keepMounted=false), so Identity and Settings are separateSettingsTabinstances. An edit on one tab is silently lost when you switch to the other and save there. - View activity opens Identity for owned agents: #1083 (comment)
- Remove avatar is no longer reachable in edit mode: #1083 (comment)
Confirmed, should fix: Add interest focus restoration (#1083 (comment)) and SettingsGroup repainting (#1083 (comment)).
New inline findings: four blocking (shared field-trigger restyle, missing name-field focus, Escape discarding an avatar pick, Memory refresh removed), one non-blocking, two optional.
Validation gaps
- WebKit at
004f99c0: bothagent-library.spec.mjstests fail on Browser journeys (webkit, 6/9), and the WebKit flake check fails the card-selection test 3 of 3 times. Twomessages.spec.mjsWebKit failures in 8/9 aren't attributed to this PR. - No test covers the activity entry point for owned agents (
AgentsPage.test.tsx:1294-1329covers onlyprofileTarget, and the browser spec never renders the chatProfilePanel). The split-tab draft path and Memory refresh after load aren't covered either. - This review is static. No light/dark rendering, narrow width or enlarged-text pass was done.
Exit criteria: fix the 7 blocking items above with regression tests for split-tab drafts, activity routing and Memory refresh, get WebKit agent-library green, then retarget to main after #966 merges and recheck the diff.
| @@ -68,6 +73,8 @@ | |||
| white-space: nowrap; | |||
| } | |||
| .actions { | |||
| --interaction-fill: var(--interaction-selected); | |||
There was a problem hiding this comment.
🤖 Non-blocking: hover and pressed feedback is gone on these actions.
Rebinding --interaction-fill to selected and --interaction-hover to pressed here (and in AgentsPage.module.css:165-166 for .identityActions) collapses the states. In dark mode, selected and pressed both resolve to neutral-5 (tokens.css:645,654). The card's Message button and the profile actions trigger then look identical at rest, on hover, while pressed and with the menu open. In light mode, hover and pressed are the same. This is local repainting of shared control states, which root AGENTS.md asks features not to do. Prefer a shared button variant if the resting fill needs to differ.
| @@ -14,7 +14,7 @@ type IconButtonSize = | |||
| | "xs" | |||
| | "toolbar" | |||
| | "large"; | |||
| type IconButtonShape = "control" | "round" | "row-end"; | |||
| type IconButtonShape = "control" | "round" | "row-end" | "squircle"; | |||
There was a problem hiding this comment.
🤖 Optional: the new squircle IconButton shape has no production caller.
Only the specimen uses it. The registry describes it as the "prominent avatar edit action", but AvatarEditor.tsx:209 still uses shape="round". It also has a specificity bug: the prominent :active/[aria-expanded] rule (0,4,0) beats the squircle's (0,3,0) background: transparent, so pressing it, or opening it as a menu trigger, paints an unmasked rectangle behind the squircle. Suggest dropping it until there is a caller.
| {type.title} | ||
| </span> | ||
| } | ||
| actions={<div ref={setFooter} className="contents" />} |
There was a problem hiding this comment.
🤖 Optional: this always renders an actions slot. Only Codex portals into it, so Claude Code and BuilderLab provider dialogs get an empty <footer> that adds a space-4 gap of dead space at the bottom. Render the slot only when the provider supplies actions.
20ef04c to
9434107
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7882d2f7b0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c9a5d2dbf2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| disabled: boolean; | ||
| }) { | ||
| const footer = useContext(AgentSaveFooter); | ||
| if (disabled && !saving) return null; |
There was a problem hiding this comment.
Keep the focused Save action mounted after success
When a keyboard user submits a successful Codex or Claude settings change, the service publishes the updated config before the save promise completes; once saving returns to false, this branch removes the currently focused portal button because the draft is clean. Focus consequently falls back to the page body, whereas the replaced buttons deliberately stayed focusable while disabled. Retain the disabled action until focus has moved to a stable target, or explicitly hand focus off before hiding it.
AGENTS.md reference: AGENTS.md:L46-L51
Useful? React with 👍 / 👎.
| const back = | ||
| avatarActive && | ||
| (!initialAvatarPicker || (avatarCanGoBack && !pictureChanged)) | ||
| ? () => avatarNavigation.current?.back() |
There was a problem hiding this comment.
Preserve a pointer path back to avatar collections
In Change avatar, after a pointer user opens a pack and selects an avatar, pictureChanged becomes true and this condition removes the Back button while leaving the user inside that pack. Escape still returns to collections via the separate avatarCanGoBack branch, but pointer users can only cancel, lose the draft, and reopen the picker to choose another collection. Keep Back available when the pack view can go back; returning to collections need not discard the selected draft.
AGENTS.md reference: AGENTS.md:L46-L51
Useful? React with 👍 / 👎.
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Reconcile managed provider installations with the approved creation controls. Share Codex setup for login, preserve Claude model discovery across unchanged background checks, and require safe-mode-capable Claude releases. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Keep recording-specific voice metadata and stable per-upload IDs while preserving main's fallback media type and settled-upload browser checks. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
…tion-library Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
…tion-library Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Preserve the unified profile and current UI refinements alongside upstream fixes. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Move provider controls into Settings, deduplicate default models, and remove the nested instructions field boundary. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
Use the surrounding background for agent instructions, remove redundant DM helper text, and keep focused invalid fields red. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
c9a5d2d to
8318c0a
Compare
Keep visited non-split panels mounted without eagerly loading unopened tabs. Cover hosted instructions and failed-save state across Identity and Settings navigation. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
Changes requested at 8318c0ad. Most of the last round is fixed: split-settings drafts, activity routing, avatar removal, Escape on a picked avatar, Add interest focus, SettingsGroup repainting, the shared field-trigger recipe, name-field keyboard focus, and the invalid-border specificity bug. Three blockers remain.
Blocking
- Non-split panels still unmount on a tab switch. An unsaved BuilderLab Instructions draft resets after Settings → Instructions; a local probe reproduced it, and it breaks
DESIGN.md:99-101: #1083 (comment) - Partial Memory listings have no recovery path: #1083 (comment)
Selecttrigger shape changes app-wide (inline below).
Should fix
- After a successful save, the focused Save button unmounts and focus falls to
body(a probe confirmed it): #1083 (comment) - Pointer users lose Back after picking an avatar inside a pack: #1083 (comment).
AgentsPage.test.tsx:1319-1321currently asserts that Back is absent. - The settings Accordion
aria-labeloverrides the visible title (inline below).
Non-blocking, still open: the card action state roles: #1083 (comment)
Optional: forms.css:422 has specificity (0,3,1), so it would beat the invalid stroke on a keyboard-focused title or heading input (none can be invalid today; wrap it in :where()). In dark mode the outlined instructions' resting border is about 1.07:1 against the creation dialog. AgentInstructions keeps an unused creation prop. The squircle IconButton still has no production caller.
Validation gaps: CI for 8318c0ad is still running. At c9a5d2db CI failed on AgentCard formatting and the surface-interactions invalid-border assertion; both are fixed in source. The draft and focus probes ran locally at c9a5d2db, and the affected files are unchanged at 8318c0ad. Rendering was checked only for the dark creation dialog in Chromium; no narrow-width or enlarged-text pass.
Exit criteria: fix the three blockers, with regression tests for non-split draft retention across tabs and partial-listing retry, and get CI green on the final head.
| <BaseAccordion.Trigger className="buzz-accordion-trigger text-body"> | ||
| <BaseAccordion.Trigger | ||
| className="buzz-accordion-trigger text-body" | ||
| aria-label={variant === "settings" ? item.value : undefined} |
There was a problem hiding this comment.
🤖 Should fix (a11y): this replaces the trigger's visible title with its value key.
For variant="settings", the accessible name becomes item.value. That happens to match in Memory, where the value is the slug, but the specimen already breaks it (value: "memory", title “Core memory”). That fails label-in-name (WCAG 2.5.3) for any future caller whose key differs from its title. The label isn't needed either: the trigger's text content already names it, and Memory's timestamp is aria-hidden.
Fix: remove the aria-label.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8318c0ade1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Retain loaded memories during partial-list retries and limit control-shaped selects to preference rows. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 796284c6cf
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 50789496d3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
Changes requested at 50789496. All three blockers from the 8318c0ad review are fixed:
- Non-split drafts survive tab switches, with an Instructions draft and failed-save regression test.
- Partial Memory listings now offer "Retry loading memories", with a test that holds the retry and checks recovery.
Selectshape is scoped topreference, with a test asserting capsule for inline and compact.
The retention fix introduced one new blocker: visited Memory panels never re-read and keep a memory-view slot (inline below). Mongo independently confirmed it.
Still open from the last review (the files are unchanged since 8318c0ad): Save focus falls to body after a successful save, pointer users lose Back after picking an avatar, and the settings Accordion aria-label overrides its visible title. All three are should-fix, not blocking. The card action state roles item remains non-blocking.
Validation: CI is green at 50789496 (32 passed, 1 skipped). This re-review covered only the 8318c0ad..50789496 delta and was source-only, with nothing rendered.
Exit criteria: stop retaining Memory (or retain only draft-owning panels), add a leave-and-return Memory test, and keep CI green.
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
Changes requested at d08c0fc1. The stale-Memory blocker from the 50789496 review is fixed. Memory is excluded from tab retention, and the new AgentTabs.test.tsx checks that leaving Memory frees its view slot and that returning reads fresh data. Editable panels still keep their drafts.
Blocking: an explicit model override that equals the device default is shown as inherited (Codex's earlier finding, confirmed with Mongo): #1083 (comment)
Still open, should fix (files unchanged since 8318c0ad):
- Save focus falls to
bodyafter a successful save: #1083 (comment) - Pointer users lose Back after picking an avatar: #1083 (comment)
- The settings Accordion
aria-labeloverrides the visible title: #1083 (comment)
The card action state roles item remains non-blocking.
Validation: CI is green at d08c0fc1 (32 passed, 1 skipped). Source-only re-review of 50789496..d08c0fc1 plus the ModelPicker finding; nothing rendered.
Exit criteria: keep the inherited and explicit model states distinct, with an updated test, and keep CI green.
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9efe036402
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6b42fa5fb2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| !connection.session.agentChoices | ||
| .snapshot() | ||
| .identities.some((agent) => agent.managed && agent.pubkey === pubkey) | ||
| ) { |
There was a problem hiding this comment.
Disable Message when hosted agents fail admission
When a finished hosted agent is opened from the library, AgentDetails renders this Message action as enabled, but hosted agents are absent from the local identity list and therefore appear in session.agentChoices with managed: false (choices.ts:116-128). This predicate consequently rejects every attempt with “not ready to message,” making the visible action deterministically unusable for hosted agents. Include the same eligibility check in the button's availability or pass an explicit authorization policy for owned hosted agents.
AGENTS.md reference: AGENTS.md:L87-L90
Useful? React with 👍 / 👎.
| <PreferenceRow | ||
| title={label} | ||
| subtitle={description} | ||
| disabled={disabled} | ||
| trailing={control} |
There was a problem hiding this comment.
Associate preference-select help and errors with the control
When a preference Select has help or an error—currently the Claude model selector does after catalog loading fails—passing control as an opaque trailing node prevents PreferenceRow from supplying its aria-describedby relationship, while the separate error paragraph also never marks or describes the combobox. A screen-reader user revisiting the field therefore cannot discover its help or failure state after the one-time live alert. Use the row's trailing render callback and include the error in the described state, as required by src/shared/design-system/DESIGN.md:126-134.
AGENTS.md reference: AGENTS.md:L229-L233
Useful? React with 👍 / 👎.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
No blockers at 6b42fa5f. The Memory retention blocker from 50789496 is fixed. agent:memory is excluded from retention, so it unmounts, releases its view slot and reads fresh data on return. The new AgentTabs regression uses the real memory service to verify the second read and slot release. The other two commits also look correct: the Your teams draft retention has a test, and the ModelPicker pinned-vs-inherited distinction is in place.
Non-blocking: a narrower Memory retention path through the hidden aside (inline below).
Still open, should-fix (files unchanged): Save focus falls to body after a successful save, pointer users lose Back after picking an avatar, and the settings Accordion aria-label overrides its visible title. The card action state roles item remains non-blocking.
Validation: CI is green at 6b42fa5f (32 passed, 1 skipped). This re-review covered only the 50789496..6b42fa5f delta and was source-only, with nothing rendered.
| </div> | ||
| </FullPageSurface> | ||
| {panel && selected && ( | ||
| <aside className={styles.side} hidden={tab !== "yours"}> |
There was a problem hiding this comment.
🤖 Non-blocking: keeping the profile mounted under hidden while Your teams is open also keeps Memory mounted, if Memory was the active section when the user switched. In that case, coming back shows the same listing without a fresh read, and it holds one memory-view slot while hidden. That's the same staleness d08c0fc1 fixed inside the profile, through a narrower path. One option is to keep the draft retention and release Memory when the aside is hidden (for example, pass a hidden/inactive flag into AgentTabs and treat Memory as unselected).
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: klopez4212 <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8938a6cdd7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <p role="status">Opening destination…</p> | ||
| ) : settings ? ( | ||
| <Settings | ||
| agents={services.agents} |
There was a problem hiding this comment.
Obtain approval before editing the foundation startup file
This new wiring modifies App.tsx, which is explicitly marked FOUNDATION, but neither the reviewed commit message nor the supplied context records the required human authorization. Obtain and document that guidance before landing this edit, or move the dependency wiring to a non-foundation owner.
AGENTS.md reference: AGENTS.md:L14-L15
Useful? React with 👍 / 👎.
…-drag * origin/main: (34 commits) fix(channels): resolve template agents from ready inventory (#922) [buzz-app] Fit uploaded videos to the relay's 4K envelope and name video rejections (#1129) feat(github): reveal the PR comment a link points at (#947) fix(messages): stop WebKit freeze from muted composer video previews (#1143) test(browser): fix route-unroute and virtua-hold webkit flakes (#1149) test(browser): let dnd-kit see its first resize before text shrinks (#1150) fix(previews): keep a hovered preview through scroll anchoring (#1138) Unify owned agent profile panels (#1083) feat(agents): import old Buzz teams from the Teams tab (#985) Mark Me chats as personal in the session description for remote agents (#1058) feat(messages): optional way to open buzz message links in a thread tab (#1113) Distinguish thread originals and tighten conversation spacing (#929) fix(buzz-mcp): page channel reads past the relay limit (#1131) fix(inbox): show a session's top-level timeline as one conversation (#1094) feat: reorder sidebar groups by dragging their headers (#1118) fix(avatars): request the cached relay thumbnail at every avatar site (#1054) fix(messages): soften quote styling and tighten spacing (#1098) fix(emoji): shrink and raise inline custom emoji (#1097) fix: follow host theme in media review chrome (#1117) Highlight an already-open thread tab when reopening it (#1050) ... Signed-off-by: John Tennant <jtennant@block.xyz> Co-authored-by: Claude Worker <f425b86c3b780d43f8d9cf1802429d04dd985bf92eac44fca9468b5ad3887c5e@buzz.block.builderlab.xyz> # Conflicts: # src/features/channel-navigation/ChannelSidebarDnd.tsx
Opening an owned agent from the library or a chat now shows the same profile panel, with Identity, Memory, Attention, and Settings together. The agent-creation work in #966 has merged; this PR targets main and includes those upstream changes.
The profile supports inline name editing, avatar editing with explicit Save changes and Cancel, provider setup dialogs, and retained drafts with save controls. Provider, Model, and Thinking share one settings container with dividers and compact dropdowns. The preference-row Select variant owns its control corners; ordinary inline and compact Selects retain their capsule shape. The inherited default appears at the top as “Model name · Default,” retaining its catalog description; the closed control shows only the model name. When a saved explicit pin equals that default, its separate model option remains selected so inheritance is not falsely implied. Selecting “· Default” explicitly clears the pin; otherwise the default model is not repeated. Device-wide provider controls now live at the top of Settings → Agents under AI defaults. The library overflow menu is removed; Teams remains available through its tab. Thinking shows the resolved level in the closed control and
· Defaultin its menu; Claude uses Automatic when its catalog does not report a default level.Memory disclosures use the shared Accordion. The whole header row expands the content, the chevron is decorative, and one container encloses the header and body with a divider. Expansion and collapse animate, with immediate reduced-motion and keyboard behavior. Complete listings have no refresh button; failed and partial reads retain recovery. A partial listing offers Retry loading memories while keeping successfully loaded entries visible. Memories load when opened, rather than continuously refreshing in the background.
The Agents profile uses the shared draggable splitter, including keyboard resizing and double-click reset. The library grid reflows down to one column and scales avatars with the available width.
Intentional interaction design: agent-name fields in both Create agent and inline profile-name editing remain borderless when entered by pointer or autofocus. The caret indicates editing; a full-width field border is intentionally omitted. Keyboard navigation retains a visible focus border. Please preserve this distinction rather than restoring a border for pointer/autofocus entry.
Intentional instructions-field design: creation and profile instructions use a single outlined textarea over the surrounding background, without a gray inset fill or a second container. Focus strengthens the same perimeter. Please preserve this appearance rather than restoring the inset fill or nested border. The redundant “DMs always share one conversation” helper text is removed.
Validation: the final UI batch passed 68 focused model/provider tests, 45 settings/library integration tests, and the instructions tests during iteration. After rebasing onto main (including #1062), the resulting tree was verified against the previous PR plus main. All eight agent-library and surface-interaction cases passed in Chromium and WebKit, covering layout, focus, outlined instructions in light/dark themes, and invalid-field borders. Existing browser cases were extended rather than adding duplicate journeys. Full formatting passed. The CI failures at the previous head were traced to AgentCard formatting and focus-selector specificity overriding invalid-field borders; both are fixed and verified locally. Required local push checks passed at 5078949: TypeScript and the full related unit-test selection, design-system checks, and the repository’s remaining push gates. Hosted CI and required reviewer/code-owner approval remain pending. Native acceptance and a full rendered design sweep have not been repeated.
Blocking-review follow-up: visited non-split agent panels retain drafts and failed-save state across tab switches, without eagerly loading unopened panels. The hosted Builderlab editor regression passed along with the library tests (33 focused tests). Partial-memory recovery and scoped Select-shape regressions passed (19 tests), plus all eight agent-library/surface-interaction cases in Chromium and WebKit. Optional and non-blocking review suggestions remain outside this batch.
Model inheritance blocker: fixed at 9efe036. All 14 model-picker tests pass, including a matching explicit pin, changes to the device default, and explicitly clearing the pin. Required TypeScript/related unit tests and design-system push checks pass. Hosted CI for this head and reviewer approval remain pending. No additional browser cases were added; this state/selection contract is covered through the real shared Select in the component tests.