diff --git a/app/scripts/e2e-web-session.sh b/app/scripts/e2e-web-session.sh index 3e1488c30..51aacae03 100755 --- a/app/scripts/e2e-web-session.sh +++ b/app/scripts/e2e-web-session.sh @@ -102,6 +102,12 @@ coding_provider = "e2e:e2e-mock-model" [update] enabled = false +[context] +# Deterministic e2e specs script the mock-LLM call sequence exactly; the +# default-on first-turn "super context" scout adds an extra agentic call that +# would perturb those sequences. No spec exercises super context, so disable it. +super_context_enabled = false + [[cloud_providers]] id = "p_e2e_mock" slug = "e2e" diff --git a/app/src/components/chat/ChatComposer.tsx b/app/src/components/chat/ChatComposer.tsx index 10f20d827..b3ce89b73 100644 --- a/app/src/components/chat/ChatComposer.tsx +++ b/app/src/components/chat/ChatComposer.tsx @@ -39,6 +39,14 @@ export interface ChatComposerProps { * attach button, hidden file input, and preview strip are not rendered. */ attachmentsEnabled: boolean; + /** + * Optional nodes stacked above the input box but *outside* its focus + * highlight — e.g. the queued-follow-ups strip and the thread-goal editor. + * They render within the overall composer component (so they move with it) + * yet are not wrapped by the blue focus-within ring/border of the input box. + * Entries that render `null` contribute nothing. + */ + headerSlots?: React.ReactNode[]; } /** @@ -66,6 +74,7 @@ export default function ChatComposer({ maxAttachments, allowedMimeTypes, attachmentsEnabled, + headerSlots = [], }: ChatComposerProps) { const { t } = useT(); @@ -93,155 +102,163 @@ export default function ChatComposer({ }, [inputValue, textInputRef]); return ( -
- {/* Hidden file input for attachment (gated — see attachmentsEnabled). */} - {attachmentsEnabled && ( - { - void onAttachFiles(e.target.files); - e.target.value = ''; - }} - /> - )} +
+ {/* Header stack (e.g. queued follow-ups, thread-goal editor): rendered + above the input box and OUTSIDE its blue focus highlight, but still + within the overall composer component so they move as one unit. */} + {headerSlots} - {/* Attachment preview strip */} - {attachmentsEnabled && attachments.length > 0 && ( -
- -
- )} - - {/* Single row: [+] textarea [mic] [send] */} -
- {/* Attach button */} + {/* The input box — only this carries the focus-within highlight. */} +
+ {/* Hidden file input for attachment (gated — see attachmentsEnabled). */} {attachmentsEnabled && ( + { + void onAttachFiles(e.target.files); + e.target.value = ''; + }} + /> + )} + + {/* Attachment preview strip */} + {attachmentsEnabled && attachments.length > 0 && ( +
+ +
+ )} + + {/* Single row: [+] textarea [mic] [send] */} +
+ {/* Attach button */} + {attachmentsEnabled && ( + + )} + + {/* Textarea with ghost completion */} +
+
+ {inputValue} + + {inlineCompletionSuffix} + +
+