| ... | ... | @@ -158,7 +158,11 @@ import { |
| 158 | 158 | import { ProjectFavicon } from "./ProjectFavicon"; |
| 159 | 159 | import { ProviderInstanceIcon } from "./chat/ProviderInstanceIcon"; |
| 160 | 160 | import { getTriggerDisplayModelLabel } from "./chat/providerIconUtils"; |
| 161 | | import { deriveProviderInstanceEntries, type ProviderInstanceEntry } from "../providerInstances"; |
| 161 | import { |
| 162 | deriveProviderInstanceEntries, |
| 163 | shouldShowInstanceBadge, |
| 164 | type ProviderInstanceEntry, |
| 165 | } from "../providerInstances"; |
| 162 | 166 | import { primaryServerProvidersAtom } from "../state/server"; |
| 163 | 167 | import { useThreadRunningTerminalIds } from "../state/terminalSessions"; |
| 164 | 168 | import { stackedThreadToast, toastManager } from "./ui/toast"; |
| ... | ... | @@ -247,7 +251,8 @@ function SidebarThreadTooltip({ |
| 247 | 251 | projectCwd, |
| 248 | 252 | projectFaviconPath, |
| 249 | 253 | environmentLabel, |
| 250 | | driverKind, |
| 254 | providerEntry, |
| 255 | showInstanceBadge, |
| 251 | 256 | modelInstanceId, |
| 252 | 257 | modelLabel, |
| 253 | 258 | branchMismatch, |
| ... | ... | @@ -259,7 +264,8 @@ function SidebarThreadTooltip({ |
| 259 | 264 | projectCwd: string | null; |
| 260 | 265 | projectFaviconPath: string | null; |
| 261 | 266 | environmentLabel: string | null; |
| 262 | | driverKind: ProviderInstanceEntry["driverKind"] | null; |
| 267 | providerEntry: ProviderInstanceEntry | null; |
| 268 | showInstanceBadge: boolean; |
| 263 | 269 | modelInstanceId: string; |
| 264 | 270 | modelLabel: string; |
| 265 | 271 | branchMismatch: { |
| ... | ... | @@ -269,6 +275,7 @@ function SidebarThreadTooltip({ |
| 269 | 275 | terminalStatus: TerminalStatusIndicator | null; |
| 270 | 276 | terminalProcessCount: number; |
| 271 | 277 | }) { |
| 278 | const driverKind = providerEntry?.driverKind ?? null; |
| 272 | 279 | return ( |
| 273 | 280 | <TooltipPopup |
| 274 | 281 | side="right" |
| ... | ... | @@ -317,10 +324,21 @@ function SidebarThreadTooltip({ |
| 317 | 324 | <div className="flex min-w-0 items-center gap-2"> |
| 318 | 325 | <ProviderInstanceIcon |
| 319 | 326 | driverKind={driverKind} |
| 320 | | displayName={thread.session?.providerName ?? modelInstanceId} |
| 327 | displayName={ |
| 328 | providerEntry?.displayName ?? thread.session?.providerName ?? modelInstanceId |
| 329 | } |
| 330 | accentColor={providerEntry?.accentColor} |
| 331 | // Initials would swallow a size-3 glyph: accent dot, name in label. |
| 332 | showBadge={showInstanceBadge && providerEntry?.accentColor !== undefined} |
| 333 | badgeContent="none" |
| 334 | badgeClassName="h-2 min-w-2 px-0" |
| 321 | 335 | iconClassName="size-3 shrink-0 grayscale opacity-60" |
| 322 | 336 | /> |
| 323 | | <div className="min-w-0 truncate text-foreground/75">{modelLabel}</div> |
| 337 | <div className="min-w-0 truncate text-foreground/75"> |
| 338 | {showInstanceBadge && providerEntry |
| 339 | ? `${modelLabel} · ${providerEntry.displayName}` |
| 340 | : modelLabel} |
| 341 | </div> |
| 324 | 342 | </div> |
| 325 | 343 | ) : null} |
| 326 | 344 | {terminalStatus ? ( |
| ... | ... | @@ -867,6 +885,9 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 867 | 885 | const modelInstanceId = thread.session?.providerInstanceId ?? thread.modelSelection.instanceId; |
| 868 | 886 | const providerEntry = props.providerEntryByInstanceId.get(modelInstanceId) ?? null; |
| 869 | 887 | const driverKind = providerEntry?.driverKind ?? null; |
| 888 | const showInstanceBadge = |
| 889 | providerEntry !== null && |
| 890 | shouldShowInstanceBadge(providerEntry, props.providerEntryByInstanceId.values()); |
| 870 | 891 | const selectedModel = providerEntry?.models.find( |
| 871 | 892 | (model) => model.slug === thread.modelSelection.model, |
| 872 | 893 | ); |
| ... | ... | @@ -884,7 +905,8 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 884 | 905 | projectCwd={props.projectCwd} |
| 885 | 906 | projectFaviconPath={props.projectFaviconPath} |
| 886 | 907 | environmentLabel={props.environmentLabel} |
| 887 | | driverKind={driverKind} |
| 908 | providerEntry={providerEntry} |
| 909 | showInstanceBadge={showInstanceBadge} |
| 888 | 910 | modelInstanceId={modelInstanceId} |
| 889 | 911 | modelLabel={modelLabel} |
| 890 | 912 | branchMismatch={branchMismatch} |
| ... | ... | @@ -1481,11 +1503,19 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: { |
| 1481 | 1503 | </span> |
| 1482 | 1504 | ) : null} |
| 1483 | 1505 | {driverKind ? ( |
| 1484 | | <span className="inline-flex shrink-0 items-center opacity-60"> |
| 1506 | <span className="inline-flex shrink-0 items-center"> |
| 1485 | 1507 | <ProviderInstanceIcon |
| 1486 | 1508 | driverKind={driverKind} |
| 1487 | | displayName={thread.session?.providerName ?? modelInstanceId} |
| 1488 | | iconClassName="size-3.5" |
| 1509 | displayName={ |
| 1510 | providerEntry?.displayName ?? |
| 1511 | thread.session?.providerName ?? |
| 1512 | modelInstanceId |
| 1513 | } |
| 1514 | accentColor={providerEntry?.accentColor} |
| 1515 | showBadge={showInstanceBadge} |
| 1516 | // Glyph dims, badge stays saturated; offset matches the composer trigger. |
| 1517 | iconClassName="size-3.5 opacity-60" |
| 1518 | badgeClassName="right-[-0.1875rem] bottom-[-0.1875rem] h-3 min-w-3 px-0.5 text-[7px]" |
| 1489 | 1519 | /> |
| 1490 | 1520 | </span> |
| 1491 | 1521 | ) : null} |
| ... | ... | @@ -1542,7 +1572,9 @@ const SidebarSearchResultRow = memo(function SidebarSearchResultRow(props: { |
| 1542 | 1572 | }); |
| 1543 | 1573 | const modelInstanceId = thread.session?.providerInstanceId ?? thread.modelSelection.instanceId; |
| 1544 | 1574 | const providerEntry = props.providerEntryByInstanceId.get(modelInstanceId) ?? null; |
| 1545 | | const driverKind = providerEntry?.driverKind ?? null; |
| 1575 | const showInstanceBadge = |
| 1576 | providerEntry !== null && |
| 1577 | shouldShowInstanceBadge(providerEntry, props.providerEntryByInstanceId.values()); |
| 1546 | 1578 | const selectedModel = providerEntry?.models.find( |
| 1547 | 1579 | (model) => model.slug === thread.modelSelection.model, |
| 1548 | 1580 | ); |
| ... | ... | @@ -1600,7 +1632,8 @@ const SidebarSearchResultRow = memo(function SidebarSearchResultRow(props: { |
| 1600 | 1632 | projectCwd={props.projectCwd} |
| 1601 | 1633 | projectFaviconPath={props.projectFaviconPath} |
| 1602 | 1634 | environmentLabel={props.environmentLabel} |
| 1603 | | driverKind={driverKind} |
| 1635 | providerEntry={providerEntry} |
| 1636 | showInstanceBadge={showInstanceBadge} |
| 1604 | 1637 | modelInstanceId={modelInstanceId} |
| 1605 | 1638 | modelLabel={modelLabel} |
| 1606 | 1639 | branchMismatch={branchMismatch} |