Repository navigation
Streamline agent creation and library controls - #966
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: 6e9ccb4e70
ℹ️ 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: a6bb9dc0f5
ℹ️ 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".
| /> | ||
| )} | ||
| </Dialog> | ||
| )} | ||
| {creating && ( | ||
| <AgentCreateDialog |
There was a problem hiding this comment.
Return focus after closing agent creation
When a keyboard user chooses “Create a new agent,” the focused opener is the transient menu item, which disappears as the dialog opens. AgentCreateDialog is mounted without a finalFocus target pointing to newAgentButton—unlike the import/marketplace dialog—so cancelling or closing creation can leave focus on the document body rather than the durable “New agent” trigger. Pass that trigger through the shared dialog finalFocus contract, as required by the menu-to-dialog focus rule in DESIGN.md.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
| agents={service} | ||
| agent={agent} | ||
| onRemoved={onRemoved} | ||
| trigger={menu} |
There was a problem hiding this comment.
Restore focus to the card menu after delete cancellation
When deletion is opened from the card overflow, the focused opener is the temporary “Delete agent” menu item. The new trigger callback only opens AgentDelete; its confirmation dialog has no finalFocus reference to the surviving “Actions for …” button, so Cancel, Close, or Escape can strand keyboard focus after the menu item has unmounted. Extend this trigger contract to retain the overflow-button ref and return focus through the shared dialog contract required by DESIGN.md.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6104e4c65f
ℹ️ 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".
| useEffect(() => { | ||
| void setup.check(); | ||
| }, [setup]); | ||
| if (!state.status || state.checking) |
There was a problem hiding this comment.
Keep focus anchored while Claude sign-in is replaced
When the Claude sign-in dialog is open and the login process completes, ClaudeSetup.run() starts the follow-up check, causing this branch to replace ClaudeSignIn immediately with the status text and then the model picker. That unmounts both the focused nested dialog and its opener, leaving keyboard focus on the document rather than a durable control. Keep the dialog mounted through the check and explicitly hand focus to the resulting model picker when it closes, as required by DESIGN.md’s modal focus-restoration contract.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2713264498
ℹ️ 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".
| height="stable-tall" | ||
| chromeSpacing="padded" |
There was a problem hiding this comment.
Avoid consuming unapproved proposed dialog variants
This feature immediately consumes stable-tall and chromeSpacing="padded" even though the same commit explicitly documents both as proposed and expands the shared Dialog owner to support them. Repository policy forbids silently promoting proposed guidance for a local treatment; keep creation on an adopted dialog composition, or obtain scope approval and promote the shared recipe before using these variants.
AGENTS.md reference: AGENTS.md:L42-L45
Useful? React with 👍 / 👎.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Changes requested at 27132644 (base main, merge-base fb9cad1a). Carl, an automated reviewer, commenting via Wes's GitHub account.
Since 722e2c65, the branch has a merge from main, which keeps main's conversation and transcript flows, plus three browser-test stabilization commits (voice notes, message overlays). The agent-flow findings below apply to the current head.
Merge criteria
- Blocker: model discovery must not start a CLI process per library card (inline on
AgentsPage.tsx). - Mediums: Claude and Codex sign-in owned once per type, a visible focus state on the name field, correct selection semantics for the agents grid, and Import and Browse reachable when the snapshot isn't ready.
- Lows and the product check on custom model IDs are non-blocking.
For Wes, not defects: two app-wide visual changes ride along with this agents PR. Every compact Select moves from capsule to control-radius corners (Select.tsx:115), and every dialog gets overscroll-behavior: none (overlays.css).
Validation gaps: this review is from source and lifecycle tracing only. Light, dark, narrow, and enlarged-text layouts were not rendered (the PR body lists these as pending too). One more CSS risk is unconfirmed: at narrow widths the dropzone focus ring may be clipped by .imageEditor's overflow: auto. CI on 27132644 was still running when this review was posted. Its result on 722e2c65 was green.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f2483689d
ℹ️ 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".
| if (state.status.state !== "ready" || state.running) | ||
| return <ClaudeSignIn setup={setup} disabled={props.disabled} />; |
There was a problem hiding this comment.
Show recovery for Claude setup errors
When checkClaude returns an error state—for example, when the executable exists but claude --version fails—this condition routes to ClaudeSignIn, where missing is false and the UI misleadingly offers only “Sign in” while discarding status.message. In the creation flow there is no alternate recovery control, so another login attempt cannot repair or explain the failed check; render the error and a “Check again” action, and reserve sign-in for signed-out. This conflicts with DESIGN.md’s states guidance to keep failed-loading feedback and retry beside the failed operation.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
Co-authored-by: Codex <[email protected]> Signed-off-by: klopez4212 <[email protected]>
2f24836 to
ce59a31
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ce59a31d4e
ℹ️ 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".
| service={service} | ||
| type={type} | ||
| onBuild={() => onBuild(agent.pubkey)} | ||
| onRemoved={() => onSelect()} |
There was a problem hiding this comment.
Preserve the selected card when deleting another agent
When agent A is selected in the master/detail view and the user deletes agent B from B’s overflow menu, this unconditional callback calls browse() without a key and closes A’s still-valid detail panel. Only clear the selection when the removed pubkey is the selected one; otherwise retain the current card and panel, as required by the collection recipe’s selection-preservation contract.
AGENTS.md reference: AGENTS.md:L22-L25
Useful? React with 👍 / 👎.
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 <[email protected]> Signed-off-by: klopez4212 <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3af03d856c
ℹ️ 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".
| const TABS = [ | ||
| { value: "yours", label: "Your agents", panelId: "agents-yours" }, | ||
| { value: "import", label: "Import", panelId: "agents-import" }, | ||
| { value: "browse", label: "Browse", panelId: "agents-browse" }, | ||
| { value: "teams", label: "Your teams", panelId: "agents-teams" }, | ||
| ] as const; |
There was a problem hiding this comment.
Hide team editing when native agents are unavailable
In the browser host, snapshot.status is unavailable, but this unconditional tab still exposes Your teams and its New team form. Submitting that form calls AgentsService.saveTeam(), which rejects whenever native is absent with “Agents run only in the desktop app,” so the newly exposed workflow can never succeed; existing teams can even expose a destructive Delete action because removeTeam() lacks the same guard. Hide or disable team management in the unavailable state while retaining the independently available Import/Marketplace actions, consistent with DESIGN.md’s states rule that setup actions are offered only when available.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
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 <[email protected]> Signed-off-by: klopez4212 <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4505e30709
ℹ️ 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".
| } | ||
|
|
||
| async check() { | ||
| async check(refreshModels = true) { |
There was a problem hiding this comment.
Preserve Claude's catalog during routine health checks
When at least one Claude model control is mounted, opening More → Provider settings invokes provider.check(), which reaches this method without an argument. Because refreshModels now defaults to true, even an unchanged readiness check empties the cached models and resets modelsLoaded; useSetupCatalog then starts another Claude discovery process and disables every mounted picker. Reopening the submenu repeatedly causes unnecessary subprocess churn, so routine health checks should preserve the catalog and reserve invalidation for completed install or sign-in operations.
Useful? React with 👍 / 👎.
| if (signedOut) | ||
| return <CodexSignIn login={login} disabled={props.disabled} />; |
There was a problem hiding this comment.
Transfer focus after successful Codex sign-in
When a keyboard user activates Sign in from a Codex creation or library control and login succeeds, the provider clears SIGN_IN_ERROR, so this branch unmounts the focused CodexSignIn button and replaces it with the model picker without moving focus. Focus therefore falls back to the document body; keep the control mounted through the transition or explicitly focus the resulting model trigger, consistent with the design guide's focus-restoration contract.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 13ed20a43b
ℹ️ 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".
| {props.inlinePicker && | ||
| props.imageOnly && | ||
| !preview ? null : props.triggerStyle === "dotted-squircle" ? ( |
There was a problem hiding this comment.
Focus the URL field when upload is unavailable
When agent creation is opened while the relay is disconnected, community is undefined, so choosing Use image removes this trigger and leaves the image editor's first button—the upload dropzone—disabled. AgentCreateHeader still tries to focus that first button after the previous collection button unmounts, which strands keyboard focus even though the Picture URL field remains usable. Keep a focusable trigger mounted or explicitly focus the first enabled control, such as the URL input.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Changes requested at 13ed20a4 (base main, merge-base 9e51c0fe). Carl, an automated reviewer, commenting via Wes's GitHub account.
Previous findings (27132644): all 11 threads hold up in source at this head. That covers the shared catalog, single-owner sign-in for both types, the name-field focus, grid semantics, Import/Browse reachability, the cleanup items, and the custom-ID product decision. The earlier blocker is resolved.
New merge criteria (inline):
- Medium: the Cancel button on the Codex card throws and never cancels the login.
- Medium: a failed Claude sign-in or install closes its own dialog, so the failure is never shown.
- Medium: hovering "Provider settings" starts a new Claude model-discovery process every time.
- Lows (non-blocking): the disabled title field styling, the "Unavailable model" label on cards, and grid arrow-key semantics.
Validation: I confirmed each medium with a throwaway Vitest case at 13ed20a4, then reverted it. Rendered layouts were not checked. Hosted CI was still running when this was posted.
| } | ||
| /* A title field: the value set as a page title, with no field around it. */ | ||
| .buzz-input[data-appearance="title"] { | ||
| .buzz-input:where([data-appearance="title"]) { |
There was a problem hiding this comment.
🤖 Low: lowering this selector to (0,1,0) fixed focus, but now .buzz-input:disabled (0,2,0, line 103) wins over background: transparent. While an agent is being created, the name field shows the grey --affordance-disabled box with zero inline padding. At the base, the title rule won through source order.
Fix: add a scoped :disabled override for the title appearance that keeps background: transparent.
| }); | ||
| const selected = items.find((model) => model.id === value) ?? fallback; | ||
| const choices = allowCustomModel ? [...items, CUSTOM_MODEL_ACTION] : items; | ||
| const choices = |
There was a problem hiding this comment.
🤖 Low: CreateModelChoices never passes allowCustomModel. A library card for an agent whose model was set to a custom ID in Settings (still supported, per the earlier product decision) therefore lists that model as "Unavailable model" (line 148), although the agent is using it.
Fix: pass allowCustomModel through for the description only, or use neutral copy such as "Custom model" when the value isn't in the catalog. Keep the finite list.
| /> | ||
| // biome-ignore lint/a11y/useSemanticElements: Layout grid rows group cards without table layout. | ||
| // biome-ignore lint/a11y/useFocusableInteractive: Roving focus belongs to the gridcell, not its row wrapper. | ||
| <div role="row" className="contents" key={agent.pubkey}> |
There was a problem hiding this comment.
🤖 Low: each agent is its own one-cell row, so assistive tech announces an N×1 grid. ArrowLeft/Right move between rows, and ArrowUp/Down jump by columns() (lines 697-700), so ArrowDown skips agents relative to the announced structure.
Fix: group the rows by visual row, or make Up/Down move one row. Non-blocking.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 No blockers at d8e68817. Carl, an automated reviewer, commenting via Wes's GitHub account.
d8e68817 resolves all three mediums from my last review:
- Codex Cancel: it is now an arrow callback, and the new test asserts the login process is killed.
- Claude setup dialog: it stays mounted through the post-step check, because only a missing status shows the placeholder. Failed install and sign-in output stay in the open dialog (new
it.each). - Repeated provider checks:
check()now defaults to no model refresh, and only Check again forces one. Repeated checks keep one shared probe (new test). The remainingsetup.check()callers are the initial checks,provider.check(the hover path) andperform(check(asked)). All of them now keep models unless the status changes.
The three earlier lows (the disabled title-field background, the "Unavailable model" label on cards, and the grid arrow-key semantics) are unchanged and remain non-blocking.
Validation: vitest run for src/bundled/{claude-code,codex,agents} and src/features/agents passes at d8e68817: 54 files, 642 tests.
Merge gate: hosted CI on this head shows Browser journeys (webkit, 6/9) and Flake check (webkit, 1/1) failing, which fails CI required. A GitHub API rate limit kept me from classifying those failures.
This is a comment, not an approval. My earlier changes-requested review stays on record until Wes approves or dismisses it.
d8e6881 to
20ef04c
Compare
…tion-library Signed-off-by: klopez4212 <[email protected]>
Signed-off-by: klopez4212 <[email protected]>
Signed-off-by: klopez4212 <[email protected]>
Signed-off-by: klopez4212 <[email protected]>
20ef04c to
9434107
Compare
Signed-off-by: klopez4212 <[email protected]>
Signed-off-by: klopez4212 <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ee2f795705
ℹ️ 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".
| const signedOut = error === SIGN_IN_ERROR; | ||
| const retry = () => void provider.check(); | ||
| if (signedOut) | ||
| return <CodexSignIn login={login} disabled={props.disabled} />; |
There was a problem hiding this comment.
Expose installation from the Codex model control
When Buzz's managed Codex binary is missing, provider.check() sets error to NOT_INSTALLED, but this branch special-cases only SIGN_IN_ERROR; the creation dialog therefore offers only “Try again,” which repeats the same check and cannot install Codex. Because the modal blocks access to the page-level Provider settings menu, users must abandon creation to recover. Handle NOT_INSTALLED here by exposing the setup install action, consistent with the design guide's requirement to keep recovery beside the failed operation.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
| .card:is([role="option"], [role="gridcell"]) { | ||
| cursor: pointer; |
There was a problem hiding this comment.
Restore hover feedback on selectable agent cards
Pointer users now get only a cursor change when hovering a selectable card: the previous .card[role="option"]:hover fill was removed while the cards moved to role="gridcell", and no gridcell hover treatment replaces it. This leaves the card's primary click target visually indistinguishable from its resting state, contrary to DESIGN.md's collection/state rules that hover, selection, and focus remain distinct; restore an appropriate card hover state without changing selected-card feedback.
AGENTS.md reference: AGENTS.md:L46-L50
Useful? React with 👍 / 👎.
Signed-off-by: klopez4212 <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eb26bfa2fd
ℹ️ 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".
| loading={state.modelsChecking} | ||
| error={state.modelsError} | ||
| retry={() => void setup.loadModels(true)} | ||
| onChange={(model) => onChange({ ...current, model })} |
There was a problem hiding this comment.
Clear unsupported effort when changing Claude models
When an existing Claude agent has an effort supported only by its current model—for example, xhigh on Sonnet—and the new library-card picker switches it to Haiku, this callback preserves the old current.effort. The settings picker explicitly clears levels absent from effortsFor, while the runtime passes every nonempty saved effort to the Claude process, so this shortcut can save an invalid model/effort pair and break subsequent runs. Apply the same effort normalization used by the settings picker before saving the compact choice.
Useful? React with 👍 / 👎.
…lation * origin/main: Streamline agent creation and library controls (#966) fix(agents): say that a timer's interval change starts after its next run (#953) feat(messages): add copy action to message code blocks (#1045) fix(codex): start the shared app-server before the first mention (#1057) fix(sessions): restore placement retry in retained conversations (#1099) Signed-off-by: John Tennant <[email protected]>
Take main's video-speed setup from #966, which repairs the same reading intent race this branch fixed in 1841e39. Co-authored-by: Carl <32a2e2c9d428ee08902cab75d956da2c1d235a22d4766b0dd4138bf6e2e5db1d@buzz.block.builderlab.xyz> Signed-off-by: Wes <[email protected]>
main's New agent dialog (#966) replaced the type menu with one compact Model field per type, also shown on library cards. Pi's field lists its provider's models, starting on Pi's default, with a Provider… button that opens the existing provider dialog: provider, API key, model and Test connection. CreateModelChoices gains an optional trailing action for it. The menu, its open-state store and its trigger label are gone. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Salman Mohammed <[email protected]>
main's #966 replaced CreateModelMenu and createModelLabel with a compact CreateModel field. goose now offers its provider's models there, with a Provider… button for its provider dialog, as Pi does. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Salman Mohammed <[email protected]>
Streamline agent creation with a name and avatar picker, provider sign-in dialogs, and compact model choices. The agent library uses matching cards and shared model controls.
Includes keyboard focus styling, avatar selection feedback, shared provider sign-in state, and access to Import and Browse during loading or errors.
The follow-up owner profile panel and its identity, memory, attention, and settings changes are being reviewed separately in #1083, stacked on this PR. They are not included in this PR's published code.
Validation at 13ed20a: synchronized with main through 9e51c0f. Required local push checks and hosted DCO passed; fresh hosted CI still fails WebKit journey shard 6 and the WebKit flake check (run 38593383586). Updating main did not resolve those failures.