| ... | @@ -361,12 +361,16 @@ const VscodeEntryIcon = memo(function VscodeEntryIcon(props: { | ... | @@ -361,12 +361,16 @@ const VscodeEntryIcon = memo(function VscodeEntryIcon(props: { |
| 361 | const ComposerCommandMenuItem = memo(function ComposerCommandMenuItem(props: { | 361 | const ComposerCommandMenuItem = memo(function ComposerCommandMenuItem(props: { |
| 362 | item: ComposerCommandItem; | 362 | item: ComposerCommandItem; |
| 363 | resolvedTheme: "light" | "dark"; | 363 | resolvedTheme: "light" | "dark"; |
| | 364 | isActive: boolean; |
| 364 | onSelect: (item: ComposerCommandItem) => void; | 365 | onSelect: (item: ComposerCommandItem) => void; |
| 365 | }) { | 366 | }) { |
| 366 | return ( | 367 | return ( |
| 367 | <CommandItem | 368 | <CommandItem |
| 368 | value={props.item.id} | 369 | value={props.item.id} |
| 369 | className="cursor-pointer select-none gap-2" | 370 | className={cn( |
| | 371 | "cursor-pointer select-none gap-2", |
| | 372 | props.isActive && "bg-accent text-accent-foreground", |
| | 373 | )} |
| 370 | onMouseDown={(event) => { | 374 | onMouseDown={(event) => { |
| 371 | event.preventDefault(); | 375 | event.preventDefault(); |
| 372 | }} | 376 | }} |
| ... | @@ -400,6 +404,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { | ... | @@ -400,6 +404,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { |
| 400 | resolvedTheme: "light" | "dark"; | 404 | resolvedTheme: "light" | "dark"; |
| 401 | isLoading: boolean; | 405 | isLoading: boolean; |
| 402 | triggerKind: ComposerTriggerKind | null; | 406 | triggerKind: ComposerTriggerKind | null; |
| | 407 | activeItemId: string | null; |
| 403 | onHighlightedItemChange: (itemId: string | null) => void; | 408 | onHighlightedItemChange: (itemId: string | null) => void; |
| 404 | onSelect: (item: ComposerCommandItem) => void; | 409 | onSelect: (item: ComposerCommandItem) => void; |
| 405 | }) { | 410 | }) { |
| ... | @@ -419,6 +424,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { | ... | @@ -419,6 +424,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { |
| 419 | key={item.id} | 424 | key={item.id} |
| 420 | item={item} | 425 | item={item} |
| 421 | resolvedTheme={props.resolvedTheme} | 426 | resolvedTheme={props.resolvedTheme} |
| | 427 | isActive={props.activeItemId === item.id} |
| 422 | onSelect={props.onSelect} | 428 | onSelect={props.onSelect} |
| 423 | /> | 429 | /> |
| 424 | ))} | 430 | ))} |
| ... | @@ -1389,6 +1395,26 @@ export default function ChatView({ threadId }: ChatViewProps) { | ... | @@ -1389,6 +1395,26 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 1389 | scheduleStickToBottom(); | 1395 | scheduleStickToBottom(); |
| 1390 | }, [phase, scheduleStickToBottom, timelineEntries]); | 1396 | }, [phase, scheduleStickToBottom, timelineEntries]); |
| 1391 | | 1397 | |
| | 1398 | useEffect(() => { |
| | 1399 | setExpandedWorkGroups({}); |
| | 1400 | }, [activeThread?.id]); |
| | 1401 | |
| | 1402 | useEffect(() => { |
| | 1403 | if (!composerMenuOpen) { |
| | 1404 | setComposerHighlightedItemId(null); |
| | 1405 | return; |
| | 1406 | } |
| | 1407 | setComposerHighlightedItemId((existing) => |
| | 1408 | existing && composerMenuItems.some((item) => item.id === existing) |
| | 1409 | ? existing |
| | 1410 | : (composerMenuItems[0]?.id ?? null), |
| | 1411 | ); |
| | 1412 | }, [composerMenuItems, composerMenuOpen]); |
| | 1413 | |
| | 1414 | useEffect(() => { |
| | 1415 | setIsRevertingCheckpoint(false); |
| | 1416 | }, [activeThread?.id]); |
| | 1417 | |
| 1392 | useEffect(() => { | 1418 | useEffect(() => { |
| 1393 | if (!activeThread?.id || terminalState.terminalOpen) return; | 1419 | if (!activeThread?.id || terminalState.terminalOpen) return; |
| 1394 | const frame = window.requestAnimationFrame(() => { | 1420 | const frame = window.requestAnimationFrame(() => { |
| ... | @@ -2274,12 +2300,14 @@ export default function ChatView({ threadId }: ChatViewProps) { | ... | @@ -2274,12 +2300,14 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 2274 | workspaceEntriesQuery.isLoading || | 2300 | workspaceEntriesQuery.isLoading || |
| 2275 | workspaceEntriesQuery.isFetching); | 2301 | workspaceEntriesQuery.isFetching); |
| 2276 | | 2302 | |
| 2277 | const onPromptChange = useCallback((nextPrompt: string, nextCursor: number) => { | 2303 | const onPromptChange = useCallback((nextPrompt: string, nextCursor: number, cursorAdjacentToMention: boolean) => { |
| 2278 | promptRef.current = nextPrompt; | 2304 | promptRef.current = nextPrompt; |
| 2279 | setPrompt(nextPrompt); | 2305 | setPrompt(nextPrompt); |
| 2280 | setComposerCursor(nextCursor); | 2306 | setComposerCursor(nextCursor); |
| 2281 | setComposerTrigger( | 2307 | setComposerTrigger( |
| 2282 | detectComposerTrigger(nextPrompt, expandCollapsedComposerCursor(nextPrompt, nextCursor)), | 2308 | cursorAdjacentToMention |
| | 2309 | ? null |
| | 2310 | : detectComposerTrigger(nextPrompt, expandCollapsedComposerCursor(nextPrompt, nextCursor)), |
| 2283 | ); | 2311 | ); |
| 2284 | }, [setPrompt]); | 2312 | }, [setPrompt]); |
| 2285 | | 2313 | |
| ... | @@ -2301,8 +2329,8 @@ export default function ChatView({ threadId }: ChatViewProps) { | ... | @@ -2301,8 +2329,8 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 2301 | const selectedItem = activeComposerMenuItemRef.current ?? currentItems[0]; | 2329 | const selectedItem = activeComposerMenuItemRef.current ?? currentItems[0]; |
| 2302 | if (selectedItem) { | 2330 | if (selectedItem) { |
| 2303 | onSelectComposerItem(selectedItem); | 2331 | onSelectComposerItem(selectedItem); |
| | 2332 | return true; |
| 2304 | } | 2333 | } |
| 2305 | return true; | | |
| 2306 | } | 2334 | } |
| 2307 | } | 2335 | } |
| 2308 | | 2336 | |
| ... | @@ -2464,6 +2492,7 @@ export default function ChatView({ threadId }: ChatViewProps) { | ... | @@ -2464,6 +2492,7 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 2464 | resolvedTheme={resolvedTheme} | 2492 | resolvedTheme={resolvedTheme} |
| 2465 | isLoading={isComposerMenuLoading} | 2493 | isLoading={isComposerMenuLoading} |
| 2466 | triggerKind={composerTriggerKind} | 2494 | triggerKind={composerTriggerKind} |
| | 2495 | activeItemId={activeComposerMenuItem?.id ?? null} |
| 2467 | onHighlightedItemChange={onComposerMenuItemHighlighted} | 2496 | onHighlightedItemChange={onComposerMenuItemHighlighted} |
| 2468 | onSelect={onSelectComposerItem} | 2497 | onSelect={onSelectComposerItem} |
| 2469 | /> | 2498 | /> |