| ... | ... | @@ -237,13 +237,15 @@ export function getThreadListV2OrderedSection(input: { |
| 237 | 237 | readonly snoozeEnvironmentIds?: ReadonlySet<EnvironmentId>; |
| 238 | 238 | readonly queuedThreadKeys?: ReadonlySet<string>; |
| 239 | 239 | }): EnvironmentThreadShell[] { |
| 240 | // An empty set is treated as absent so `?.` skips building the key. |
| 241 | const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined; |
| 240 | 242 | const threads = input.threads.filter((thread) => { |
| 241 | 243 | if (thread.archivedAt !== null || thread.lineage.relationshipToParent === "subagent") |
| 242 | 244 | return false; |
| 243 | 245 | if ( |
| 244 | 246 | (input.settlementEnvironmentIds?.has(thread.environmentId) ?? true) && |
| 245 | 247 | thread.settledOverride === "settled" && |
| 246 | | input.queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) !== true |
| 248 | queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) !== true |
| 247 | 249 | ) { |
| 248 | 250 | return false; |
| 249 | 251 | } |
| ... | ... | @@ -509,6 +511,8 @@ export function buildThreadListV2ListItems(input: { |
| 509 | 511 | onto both shelf headers so the disabled state reaches recycled cells. */ |
| 510 | 512 | readonly shelfPreferencesLoading?: boolean; |
| 511 | 513 | }): ThreadListV2ListItem[] { |
| 514 | // An empty set is treated as absent so `?.` skips building the key. |
| 515 | const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined; |
| 512 | 516 | const threadItems = input.items.map((item): ThreadListV2ListItem => { |
| 513 | 517 | const snoozeWakeLabelText = |
| 514 | 518 | item.snoozed && item.thread.snoozedUntil != null && input.snoozeLabelNow !== undefined |
| ... | ... | @@ -539,7 +543,7 @@ export function buildThreadListV2ListItems(input: { |
| 539 | 543 | snoozePresetMinute, |
| 540 | 544 | showTrailingDivider: false, |
| 541 | 545 | hasQueuedMessages: |
| 542 | | input.queuedThreadKeys?.has(`${item.thread.environmentId}:${item.thread.id}`) === true, |
| 546 | queuedThreadKeys?.has(`${item.thread.environmentId}:${item.thread.id}`) === true, |
| 543 | 547 | canMoveUp: move?.canMoveUp === true, |
| 544 | 548 | canMoveDown: move?.canMoveDown === true, |
| 545 | 549 | }; |
| ... | ... | @@ -675,6 +679,8 @@ export function buildThreadListV2Items(input: { |
| 675 | 679 | const settled: EnvironmentThreadShell[] = []; |
| 676 | 680 | const snoozed: EnvironmentThreadShell[] = []; |
| 677 | 681 | let nextSnoozeWakeAt: string | null = null; |
| 682 | // An empty set is treated as absent so `?.` skips building the key. |
| 683 | const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined; |
| 678 | 684 | for (const thread of input.threads) { |
| 679 | 685 | if (thread.archivedAt !== null || thread.lineage.relationshipToParent === "subagent") continue; |
| 680 | 686 | // The server stamps settledOverride for the tail. |
| ... | ... | @@ -712,7 +718,7 @@ export function buildThreadListV2Items(input: { |
| 712 | 718 | continue; |
| 713 | 719 | } |
| 714 | 720 | const hasQueuedMessages = |
| 715 | | input.queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) === true; |
| 721 | queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) === true; |
| 716 | 722 | if (supportsSettlement && thread.settledOverride === "settled" && !hasQueuedMessages) { |
| 717 | 723 | settled.push(thread); |
| 718 | 724 | } else if (thread.pinnedAt != null) { |
| ... | ... | @@ -752,9 +758,12 @@ export function buildThreadListV2Items(input: { |
| 752 | 758 | const settledLimit = input.settledLimit ?? Number.POSITIVE_INFINITY; |
| 753 | 759 | const pagedSettled = |
| 754 | 760 | orderedSettled.length > settledLimit ? orderedSettled.slice(0, settledLimit) : orderedSettled; |
| 755 | | const selectedSettled = orderedSettled |
| 756 | | .slice(pagedSettled.length) |
| 757 | | .find((thread) => `${thread.environmentId}:${thread.id}` === selectedThreadKey); |
| 761 | const selectedSettled = |
| 762 | selectedThreadKey === null |
| 763 | ? undefined |
| 764 | : orderedSettled |
| 765 | .slice(pagedSettled.length) |
| 766 | .find((thread) => `${thread.environmentId}:${thread.id}` === selectedThreadKey); |
| 758 | 767 | if (selectedSettled !== undefined) pagedSettled.push(selectedSettled); |
| 759 | 768 | const visibleSettled = |
| 760 | 769 | input.settledShelfExpanded !== false |