Conversation
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 22dd4fd932
ℹ️ 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".
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
91c9023 to
ea17702
Compare
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
9b16e98 to
3253b02
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3253b02e5e
ℹ️ 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".
3253b02 to
ed3b2f8
Compare
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
94dc760 to
6237d8d
Compare
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
cf8f3dc to
0ea503b
Compare
0ea503b to
02f7f79
Compare
|
@codex review |
🚨 Unused i18next Keys DetectedThe following translation keys are defined in
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bb93796dc5
ℹ️ 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: c18cad1f57
ℹ️ 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".
c18cad1 to
2f6dad3
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f6dad3827
ℹ️ 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".
|
@codex review |
Stripping a replayed reasoning override that no longer validates removed only the metadata field, while the resume had already replayed the paused turn's model parameters with the override applied into the endpoint option, so the provider still received what validation had refused. The strip now inverts the application from the replayed base: the recorded pre-override value returns and the thinking flag the override forced on comes off.
The attach target returned the conversation or agent's saved useResponsesApi flag, so an Azure chat auto-routed to the Responses API by responsesApiRouting preflighted its uploads against the chat completions route and lost provider-document uploads. The resolver now applies resolveEffectiveUseResponsesApi with the endpoint, model, web-search state and routing policy, the same resolution the during-run upload target makes.
The during-run hint advertised Alt+Enter Interrupt & send even when the chord had been claimed: a submitMessage rebound to Alt+Enter, a chord yielded to a global shortcut, or shortcuts disabled altogether each make the keydown resolver return something else. The hint now reads the same resolver verdict the during-run send button does and omits the chord it no longer owns.
…seline The tab title counts every unseen conversation, and a shared verification run leaves legitimately-unseen conversations from earlier scenarios behind, so the three title-count scenarios failed on other scenarios' leftovers instead of the behavior they seed. Each now reads its baseline and asserts the count it adds and clears.
The away poll that lights a dot also discovers conversations the client had not counted yet, so on the mobile project the title count can jump past any baseline taken mid-test. Opening still has to clear this conversation's contribution and an away reply still has to raise the count, which is what the assertions now hold.
The MCP Apps integration spec still drove the old composer's MCP Servers menu, which the redesign replaced with toggleable rows in the attach-and-tools palette; the lane failed on the missing menu on every run. The helper now opens the palette, waits for the server wave, and flips the row's pressed state.
2132ae9 to
723e137
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 723e1371dd
ℹ️ 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".
| ...(message.parentMessageId != null && | ||
| message.expectedPredecessorCreatedAt != null && { | ||
| lineage: { | ||
| parentMessageId: message.parentMessageId, | ||
| predecessorCreatedAt: message.expectedPredecessorCreatedAt, |
There was a problem hiding this comment.
Preserve durability when requeuing recovered steers
When a receipt-bound recovered steer is edited after an aborted or failed run, discardQueued cancels its durable recovery source; if the user occupies the composer during that await, this requeue supplies lineage only when the original row already had both anchor fields. Fresh evidence beyond the resolved server-row thread is that useSteerConvert creates ordinary recovered rows with recoverySteerId but no parentMessageId or expectedPredecessorCreatedAt, so enqueue now has neither a live generation nor explicit lineage and creates only a client-local row that is lost on reload. Preserve a durable anchor for recovered rows before cancelling their parked source, or replace that source atomically.
AGENTS.md reference: AGENTS.md:L31-L34
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in c2bdafd. A recovered row is now handed to the composer before its parked steer is cancelled, so a refusing composer leaves the parked copy untouched; a cancel that fails after the composer took the words holds the row out of the run-end drain. Covered by Queue.spec (handing a recovered row to the composer).
| return { text: localize('com_ui_composer_hint_typing'), kind: 'tip' }; | ||
| } | ||
|
|
||
| return { text: localize('com_ui_composer_hint_idle'), kind: 'tip' }; |
There was a problem hiding this comment.
Derive idle hints from enabled composer actions
When a user disables slash or mention commands, lacks prompt or multi-conversation access, uses an Assistants endpoint, or cannot attach files, this unconditional idle copy still says / for prompts · @ for models · + to attach. Hints also exposes it through the textarea's always-present aria-describedby, so screen-reader users are told to invoke actions that the key handler deliberately suppresses. Pass the resolved command and upload availability into the hint and omit unavailable actions.
AGENTS.md reference: AGENTS.md:L31-L34
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in 2ba2b35. The idle hint is now built from idleActions resolved in ChatForm: / only with prompts access and the slash command on, @ only with the @ command on, + only when the attach target accepts files. Covered by useComposerHint.spec.
…kes it A recovered row's only durable copy is the steer parked on the server, and once its run has ended nothing can re-create it, so a composer that refused the row after the cancel left the words in memory until the next reload. The composer now takes the words first; a cancel that then fails holds the row out of the run-end drain instead of sending it a second time.
972001c to
2ba2b35
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ba2b352d0
ℹ️ 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 queryClient = useQueryClient(); | ||
| const cachedMessages = | ||
| queryClient.getQueryData<TMessage[]>([QueryKeys.messages, conversationId]) ?? []; | ||
| const latestMessage = useLatestMessage(index, conversationId); |
There was a problem hiding this comment.
Bind pause checks to the rendered conversation
When a cached branched conversation renders before conversationIdByIndex(index) catches up during initial load or warm navigation, this override selects the new message query but useLatestMessage still uses the stale pane conversation ID as its root sibling key—and returns null entirely if that ID is absent. Because the multi-message branch below treats a null or wrong tail as unpaused, Escalate becomes actionable while the rendered branch is paused on approval or a question. Fresh evidence beyond the earlier pane-index thread is that passing the correct pane index does not replace this stale root identity; gate the control until the pane owns conversationId, or let the hook accept that ID for both query and root selection.
AGENTS.md reference: AGENTS.md:L31-L34
Useful? React with 👍 / 👎.
Summary
Redesigns the input composer from scattered tool/badge controls into a cohesive system: a unified palette merges the attach menu, badge row, and tool dropdown into one searchable catalog with favorites; a composer bar holds active tools as chips with model effort and speech controls; a tray stages files and manual context; and a queue rail buffers messages while a reply is running. Removes ~40 old component files and replaces them with 8 new ones in
Composer/plus supporting hooks.Change Type
Testing
Run from
client/:Manual verification (light and dark mode):
+in composer → palette opens with search, section headers, mode toggles for Artifacts⌘D(Mac) orCtrl+D(Windows/Linux) → moves to Favourites⌘⏎/Ctrl+⏎sends while recordingTest Configuration
Node 24, MongoDB in-memory via
mongodb-memory-serverChecklist
Screenshots
Captured with the same local account, light theme, desktop viewport, and Ollama model. Before images use a clean
devcheckout at33e42e6d, which predates the redesign. After images use the current local redesign worktree, including the latest follow-up fixes that were not yet pushed when captured.Composer redesign
Palette, active tools, uploads, and thinking
Staged file tray
Queue and steering during a run
Preferences and controls