| ... | ... | @@ -361,12 +361,16 @@ const VscodeEntryIcon = memo(function VscodeEntryIcon(props: { |
| 361 | 361 | const ComposerCommandMenuItem = memo(function ComposerCommandMenuItem(props: { |
| 362 | 362 | item: ComposerCommandItem; |
| 363 | 363 | resolvedTheme: "light" | "dark"; |
| 364 | isActive: boolean; |
| 364 | 365 | onSelect: (item: ComposerCommandItem) => void; |
| 365 | 366 | }) { |
| 366 | 367 | return ( |
| 367 | 368 | <CommandItem |
| 368 | 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 | 374 | onMouseDown={(event) => { |
| 371 | 375 | event.preventDefault(); |
| 372 | 376 | }} |
| ... | ... | @@ -400,6 +404,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { |
| 400 | 404 | resolvedTheme: "light" | "dark"; |
| 401 | 405 | isLoading: boolean; |
| 402 | 406 | triggerKind: ComposerTriggerKind | null; |
| 407 | activeItemId: string | null; |
| 403 | 408 | onHighlightedItemChange: (itemId: string | null) => void; |
| 404 | 409 | onSelect: (item: ComposerCommandItem) => void; |
| 405 | 410 | }) { |
| ... | ... | @@ -419,6 +424,7 @@ const ComposerCommandMenu = memo(function ComposerCommandMenu(props: { |
| 419 | 424 | key={item.id} |
| 420 | 425 | item={item} |
| 421 | 426 | resolvedTheme={props.resolvedTheme} |
| 427 | isActive={props.activeItemId === item.id} |
| 422 | 428 | onSelect={props.onSelect} |
| 423 | 429 | /> |
| 424 | 430 | ))} |
| ... | ... | @@ -1389,6 +1395,26 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 1389 | 1395 | scheduleStickToBottom(); |
| 1390 | 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 | 1418 | useEffect(() => { |
| 1393 | 1419 | if (!activeThread?.id || terminalState.terminalOpen) return; |
| 1394 | 1420 | const frame = window.requestAnimationFrame(() => { |
| ... | ... | @@ -2274,12 +2300,14 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 2274 | 2300 | workspaceEntriesQuery.isLoading || |
| 2275 | 2301 | workspaceEntriesQuery.isFetching); |
| 2276 | 2302 | |
| 2277 | | const onPromptChange = useCallback((nextPrompt: string, nextCursor: number) => { |
| 2303 | const onPromptChange = useCallback((nextPrompt: string, nextCursor: number, cursorAdjacentToMention: boolean) => { |
| 2278 | 2304 | promptRef.current = nextPrompt; |
| 2279 | 2305 | setPrompt(nextPrompt); |
| 2280 | 2306 | setComposerCursor(nextCursor); |
| 2281 | 2307 | setComposerTrigger( |
| 2282 | | detectComposerTrigger(nextPrompt, expandCollapsedComposerCursor(nextPrompt, nextCursor)), |
| 2308 | cursorAdjacentToMention |
| 2309 | ? null |
| 2310 | : detectComposerTrigger(nextPrompt, expandCollapsedComposerCursor(nextPrompt, nextCursor)), |
| 2283 | 2311 | ); |
| 2284 | 2312 | }, [setPrompt]); |
| 2285 | 2313 | |
| ... | ... | @@ -2301,8 +2329,8 @@ export default function ChatView({ threadId }: ChatViewProps) { |
| 2301 | 2329 | const selectedItem = activeComposerMenuItemRef.current ?? currentItems[0]; |
| 2302 | 2330 | if (selectedItem) { |
| 2303 | 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 | 2492 | resolvedTheme={resolvedTheme} |
| 2465 | 2493 | isLoading={isComposerMenuLoading} |
| 2466 | 2494 | triggerKind={composerTriggerKind} |
| 2495 | activeItemId={activeComposerMenuItem?.id ?? null} |
| 2467 | 2496 | onHighlightedItemChange={onComposerMenuItemHighlighted} |
| 2468 | 2497 | onSelect={onSelectComposerItem} |
| 2469 | 2498 | /> |