Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
da6a85b
fix(web): respect panel motion in composer transitions (#11064)
gsimone Sep 22, 2026
7c2702d
fix(web): read panel animation settings in the composer (#13098)
juliusmarminge Sep 22, 2026
f25a8e4
feat(models): add opus 5.5 without changing existing aliases (#13094)
t3-code[bot] Sep 22, 2026
17e3477
Update model manifest with new timestamps and models
juliusmarminge Sep 22, 2026
c0490e9
refactor(web): use ghost-muted where ghost buttons restyled to muted …
juliusmarminge Sep 22, 2026
1a81ea8
refactor(web): fold repeated overrides into ui defaults (#13021)
juliusmarminge Sep 22, 2026
ce98d41
refactor(web): mark the current menu value with MenuRadioGroup (#13022)
juliusmarminge Sep 22, 2026
ed85694
refactor(web): add an active prop to CommandItem (#13023)
juliusmarminge Sep 22, 2026
bbd5cc0
chore(lint): exempt CollapsibleTrigger from no-restyle (#13024)
juliusmarminge Sep 22, 2026
9515016
refactor(web): use icon-xs where icon buttons were forced to size-6 (…
juliusmarminge Sep 22, 2026
b4f1f18
refactor(web): add radius="none" to ScrollArea (#13026)
juliusmarminge Sep 22, 2026
7b54af9
refactor(web): add font="mono" to Input (#13027)
juliusmarminge Sep 22, 2026
be80e36
refactor(web): add SidebarInput (#13028)
juliusmarminge Sep 22, 2026
8d02447
refactor(web): add a label variant to Badge (#13029)
juliusmarminge Sep 22, 2026
7d658c2
refactor(web): give Skeleton three shapes (#13030)
juliusmarminge Sep 22, 2026
aa2b25d
refactor(web): one wrap width for tooltips, plus a code variant (#13031)
juliusmarminge Sep 22, 2026
f3d3fe4
refactor(web): one vertical rhythm for dialog bodies (#13032)
juliusmarminge Sep 22, 2026
18aa703
refactor(web): ghost-muted icons follow the text; add ghost-destructi…
juliusmarminge Sep 22, 2026
4c9fbf1
refactor(web): InlineButton underlines on hover and takes a tone (#13…
juliusmarminge Sep 22, 2026
d7736e0
refactor(web): one minimum width for menus, three widths for popovers…
juliusmarminge Sep 22, 2026
da89e10
refactor(web): every textarea caps its growth; the diff comment box i…
juliusmarminge Sep 22, 2026
016cdb9
refactor(web): stacked sidebar groups share one inset (#13037)
juliusmarminge Sep 22, 2026
e420ef9
refactor(web): Collapsible stays a plain container (#13038)
juliusmarminge Sep 22, 2026
0fa4a85
refactor(web): show more / show less are ordinary sidebar sub-rows (#…
juliusmarminge Sep 22, 2026
0ee02eb
refactor(web): Empty has three sizes (#13040)
juliusmarminge Sep 22, 2026
4321aa2
refactor(web): one row height for select, combobox and radio items (#…
juliusmarminge Sep 22, 2026
1c2f933
refactor(web): render menu and popover triggers through Button (#13042)
juliusmarminge Sep 22, 2026
83bbfa7
refactor(web): sidebar alerts use the standard variants; one keycap (…
juliusmarminge Sep 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 55 additions & 5 deletions apps/server/src/provider/model-manifest.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
{
"version": 1,
"updatedAt": "2026-09-12T00:41:55Z",
"updatedAt": "2026-09-22T19:42:55Z",
"currentModels": {
"codex": [
"gpt-6-astra",
"gpt-5.6-luna",
"gpt-5.6-terra",
"gpt-5.6-sol",
"gpt-6-luna",
"gpt-6-sol",
"gpt-daybreak-blue-latest",
"gpt-daybreak-red-latest"
],
"claudeAgent": ["claude-fable-5-1", "claude-opus-5", "claude-sonnet-5"],
"claudeAgent": ["claude-fable-5-1", "claude-opus-5-5", "claude-sonnet-5"],
"antigravity": ["gemini-3.8-flash-high", "gemini-3.8-flash-medium", "gemini-3.8-flash-low"]
},
"providers": {
Expand Down Expand Up @@ -96,6 +95,48 @@
}
}
},
"opus-5-5": {
"capabilities": {
"optionDescriptors": [
{
"id": "effort",
"label": "Reasoning",
"type": "select",
"options": [
{ "id": "low", "label": "Low" },
{ "id": "medium", "label": "Medium", "isDefault": true },
{ "id": "high", "label": "High" },
{ "id": "xhigh", "label": "Extra High" },
{ "id": "max", "label": "Max" },
{
"id": "ultracode",
"label": "Ultracode",
"description": "xhigh effort plus multi-agent workflow orchestration"
},
{ "id": "ultrathink", "label": "Ultrathink" }
],
"promptInjectedValues": ["ultrathink"]
},
{ "id": "fastMode", "label": "Fast Mode", "type": "boolean" },
{
"id": "contextWindow",
"label": "Context Window",
"type": "select",
"options": [
{ "id": "200k", "label": "200k" },
{ "id": "1m", "label": "1M", "isDefault": true }
]
}
]
},
"adapter": {
"claudeCode": {
"effortMap": { "ultracode": "xhigh", "ultrathink": null },
"modelSuffixes": { "contextWindow": { "1m": "[1m]" } },
"contextWindowTokens": { "200k": 200000, "1m": 1000000 }
}
}
},
"opus-5": {
"capabilities": {
"optionDescriptors": [
Expand Down Expand Up @@ -554,6 +595,15 @@
}
},
"models": [
{
"slug": "claude-opus-5-5",
"name": "Claude Opus 5.5",
"aliases": ["opus-5.5", "claude-opus-5.5"],
"status": "current",
"badge": "new",
"profile": "opus-5-5",
"adapter": { "claudeCode": { "minVersion": "2.1.280" } }
},
{
"slug": "claude-fable-5-1",
"name": "Claude Fable 5.1",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/browser/BrowserDeviceToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ export function BrowserDeviceToolbar({
>
<SelectValue />
</SelectTrigger>
<SelectPopup align="start" alignItemWithTrigger={false} className="min-w-64">
<SelectPopup align="start" alignItemWithTrigger={false}>
<SelectItem value={RESPONSIVE_VALUE}>Responsive</SelectItem>
<SelectGroup>
<SelectGroupLabel>Standard</SelectGroupLabel>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/BranchToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ const MobileRunContextSelector = memo(function MobileRunContextSelector({
{triggerContent}
<ChevronDownIcon className="size-3 shrink-0 opacity-50" />
</MenuTrigger>
<MenuPopup align="start" side="top" className="w-64" {...composerFloatingLayerProps}>
<MenuPopup align="start" side="top" {...composerFloatingLayerProps}>
{showEnvironmentPicker && availableEnvironments && onEnvironmentChange ? (
<>
<MenuGroup>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/BranchToolbarBranchSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,7 @@ export function BranchToolbarBranchSelector({
</label>
}
/>
<TooltipPopup side="top" className="max-w-72 whitespace-normal leading-tight">
<TooltipPopup side="top">
Creates the worktree from the latest matching branch on origin instead of your local
branch.
</TooltipPopup>
Expand Down
63 changes: 28 additions & 35 deletions apps/web/src/components/ChatMarkdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ function MarkdownTable({ children, ...props }: React.ComponentProps<"table">) {
className="chat-markdown-table-container"
data-expanded={expanded ? "true" : "false"}
>
<ScrollArea chainVerticalScroll scrollFade className="w-full max-w-full rounded-none">
<ScrollArea radius="none" chainVerticalScroll scrollFade className="w-full max-w-full">
<table ref={tableRef} {...props}>
{children}
</table>
Expand Down Expand Up @@ -844,32 +844,33 @@ function MarkdownDetails({
const content = childNodes.filter((_, index) => index !== summaryIndex);

return (
<Collapsible
defaultOpen={open}
onOpenChange={setIsOpen}
className="chat-markdown-details my-2 border-y border-border/60"
data-markdown-details=""
data-markdown-details-open={isOpen ? "true" : "false"}
>
<CollapsibleTrigger
className="flex w-full items-center gap-2 py-2 text-left text-sm font-medium text-foreground data-panel-open:[&_svg]:rotate-90"
data-markdown-details-summary=""
<div className="my-2 border-y border-border/60">
<Collapsible
defaultOpen={open}
onOpenChange={setIsOpen}
data-markdown-details=""
data-markdown-details-open={isOpen ? "true" : "false"}
>
<ChevronRightIcon
className="size-4 shrink-0 text-muted-foreground transition-transform"
aria-hidden
/>
<span>{summary}</span>
</CollapsibleTrigger>
<CollapsiblePanel>
<div
className="pb-3 ps-6 text-foreground/[calc(80%+var(--appearance-contrast-boost)/5)]"
data-markdown-details-content=""
<CollapsibleTrigger
className="flex w-full items-center gap-2 py-2 text-left text-sm font-medium text-foreground data-panel-open:[&_svg]:rotate-90"
data-markdown-details-summary=""
>
{content}
</div>
</CollapsiblePanel>
</Collapsible>
<ChevronRightIcon
className="size-4 shrink-0 text-muted-foreground transition-transform"
aria-hidden
/>
<span>{summary}</span>
</CollapsibleTrigger>
<CollapsiblePanel>
<div
className="pb-3 ps-6 text-foreground/[calc(80%+var(--appearance-contrast-boost)/5)]"
data-markdown-details-content=""
>
{content}
</div>
</CollapsiblePanel>
</Collapsible>
</div>
);
}

Expand Down Expand Up @@ -2209,10 +2210,7 @@ const MarkdownFileLink = memo(function MarkdownFileLink({
)
}
/>
<TooltipPopup
side="top"
className="max-w-[min(40rem,calc(100vw-2rem))] font-mono text-[11px] leading-tight"
>
<TooltipPopup side="top" variant="code">
{/* The full path: the chip already shows the shortened form, and a link
to the workspace root collapses to a bare label that repeats it. */}
<div className="overflow-x-auto whitespace-nowrap [scrollbar-color:color-mix(in_srgb,var(--contrast-border)_78%,transparent)_transparent] [scrollbar-width:thin] [&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-[color-mix(in_srgb,var(--contrast-border)_78%,transparent)] [&::-webkit-scrollbar-track]:bg-transparent">
Expand Down Expand Up @@ -3062,12 +3060,7 @@ const CHAT_MARKDOWN_COMPONENTS = {
return (
<Tooltip>
<TooltipTrigger render={link} />
<TooltipPopup
side="top"
className="max-w-[min(36rem,calc(100vw-2rem))] whitespace-normal leading-tight wrap-anywhere"
>
{href}
</TooltipPopup>
<TooltipPopup side="top">{href}</TooltipPopup>
</Tooltip>
);
}
Expand Down
44 changes: 27 additions & 17 deletions apps/web/src/components/ChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,6 @@ import {
import { deriveLatestContextWindowSnapshot, formatContextWindowTokens } from "../lib/contextWindow";
import {
DRAFT_HERO_TRANSITION_ANIMATION_ID,
DRAFT_HERO_TRANSITION_DURATION_MS,
DRAFT_HERO_TRANSITION_EASING,
MOBILE_COMPOSER_VIEW_TRANSITION_NAME,
MOBILE_DRAFT_HEADLINE_VIEW_TRANSITION_NAME,
Expand Down Expand Up @@ -539,7 +538,11 @@ const EMPTY_PROVIDERS: ServerProvider[] = [];
const EMPTY_USAGE_LIMIT_SOURCES: UsageLimitSourceSnapshots = [];
const EMPTY_PROVIDER_SKILLS: ServerProvider["skills"] = [];
const EMPTY_PENDING_USER_INPUT_ANSWERS: Record<string, PendingUserInputDraftAnswer> = {};
function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {
function useDraftHeroLayoutTransition(
isDraftHeroState: boolean,
animationsActive: boolean,
animationDurationMs: number,
) {
const transitionGroupRef = useRef<HTMLDivElement | null>(null);
const composerAnchorRef = useRef<HTMLDivElement | null>(null);
const previousStateRef = useRef(isDraftHeroState);
Expand All @@ -559,9 +562,6 @@ function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {
const transitionGroup = transitionGroupRef.current;
const nextComposerRect = composerAnchorRef.current?.getBoundingClientRect() ?? null;
const stateChanged = previousStateRef.current !== isDraftHeroState;
const prefersReducedMotion =
typeof window !== "undefined" &&
window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
const mobileComposerTransitionActive =
typeof document !== "undefined" &&
document.documentElement.dataset.mobileComposerRouteTransition === "true";
Expand All @@ -572,7 +572,7 @@ function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {
const previousComposerRect = previousComposerRectRef.current;
if (
stateChanged &&
!prefersReducedMotion &&
animationsActive &&
!mobileComposerTransitionActive &&
transitionGroup &&
previousComposerRect &&
Expand All @@ -588,7 +588,7 @@ function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {
{ transform: "translate3d(0, 0, 0)" },
],
{
duration: DRAFT_HERO_TRANSITION_DURATION_MS,
duration: animationDurationMs,
easing: DRAFT_HERO_TRANSITION_EASING,
},
);
Expand All @@ -607,7 +607,7 @@ function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {

previousStateRef.current = isDraftHeroState;
previousComposerRectRef.current = nextComposerRect;
}, [isDraftHeroState]);
}, [animationDurationMs, animationsActive, isDraftHeroState]);

return [attachTransitionGroupRef, attachComposerAnchorRef, captureComposerRect] as const;
}
Expand Down Expand Up @@ -3634,7 +3634,11 @@ export default function ChatView(props: ChatViewProps) {
attachDraftHeroTransitionGroupRef,
attachDraftHeroComposerAnchorRef,
captureDraftHeroComposerRect,
] = useDraftHeroLayoutTransition(isDraftHeroState);
] = useDraftHeroLayoutTransition(
isDraftHeroState,
panelAnimationsActive,
panelAnimationDurationMs,
);

const gitCwd = activeProject
? projectScriptCwd({
Expand Down Expand Up @@ -6529,7 +6533,7 @@ export default function ChatView(props: ChatViewProps) {
</code>
}
/>
<TooltipPopup side="top" className="max-w-80">
<TooltipPopup side="top">
This thread last ran on {localCheckoutBranchMismatch.threadBranch}. Sending will
continue on {localCheckoutBranchMismatch.currentBranch}.
</TooltipPopup>
Expand Down Expand Up @@ -7877,13 +7881,19 @@ export default function ChatView(props: ChatViewProps) {
const dockStarted = new Promise<void>((resolve) => {
resolveDockStarted = resolve;
});
const dockTransition = runMobileComposerTransition(() => {
flushSync(() => {
captureDraftHeroComposerRect();
setDockedDraftHeroThreadKey(activeThreadKey);
});
resolveDockStarted?.();
});
const dockTransition = runMobileComposerTransition(
() => {
flushSync(() => {
captureDraftHeroComposerRect();
setDockedDraftHeroThreadKey(activeThreadKey);
});
resolveDockStarted?.();
},
{
active: panelAnimationsActive,
durationMs: panelAnimationDurationMs,
},
);
void dockTransition.catch(() => resolveDockStarted?.());
await dockStarted;
}
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/CommandPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2874,7 +2874,7 @@ function OpenCommandPaletteDialog(props: {
}
>
<span>{isRemoteProjectPending ? "Working" : remoteProjectButtonLabel}</span>
<KbdGroup className="pointer-events-none -me-0.5 items-center gap-1">
<KbdGroup className="pointer-events-none -me-0.5">
<Kbd>Enter</Kbd>
</KbdGroup>
</TooltipTrigger>
Expand Down Expand Up @@ -2917,7 +2917,7 @@ function OpenCommandPaletteDialog(props: {
<span>
{isCloneDestinationStep && isRemoteProjectPending ? "Cloning" : submitActionLabel}
</span>
<KbdGroup className="pointer-events-none -me-0.5 items-center gap-1">
<KbdGroup className="pointer-events-none -me-0.5">
<Kbd>{hasHighlightedBrowseItem ? `${submitModifierLabel} Enter` : "Enter"}</Kbd>
</KbdGroup>
</TooltipTrigger>
Expand Down
8 changes: 4 additions & 4 deletions apps/web/src/components/CommandPaletteContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export function CommandPaletteContent({
<CommandPanel className={panelClassName}>{children}</CommandPanel>
<CommandFooter className="gap-3 max-sm:flex-col max-sm:items-start">
<div className="flex items-center gap-3">
<KbdGroup className="items-center gap-1.5">
<KbdGroup>
<Kbd>
<ArrowUpIcon />
</Kbd>
Expand All @@ -62,18 +62,18 @@ export function CommandPaletteContent({
<span>Navigate</span>
</KbdGroup>
{footerActionLabel !== undefined ? (
<KbdGroup className="items-center gap-1.5">
<KbdGroup>
<Kbd>Enter</Kbd>
<span>{footerActionLabel}</span>
</KbdGroup>
) : null}
{showBackHint ? (
<KbdGroup className="items-center gap-1.5">
<KbdGroup>
<Kbd>Backspace</Kbd>
<span>Back</span>
</KbdGroup>
) : null}
<KbdGroup className="items-center gap-1.5">
<KbdGroup>
<Kbd>Esc</Kbd>
<span>{escapeLabel}</span>
</KbdGroup>
Expand Down
7 changes: 2 additions & 5 deletions apps/web/src/components/CommandPaletteResults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import {
CommandShortcut,
} from "./ui/command";
import { ThreadSearchMatchExcerpt } from "./ThreadSearchMatch";
import { cn } from "~/lib/utils";

interface CommandPaletteResultsProps {
emptyStateMessage?: string;
Expand Down Expand Up @@ -109,10 +108,8 @@ function CommandPaletteResultRow(props: {
return (
<CommandItem
value={props.item.value}
className={cn(
"cursor-pointer gap-2 hover:bg-transparent hover:text-inherit data-highlighted:bg-transparent data-highlighted:text-inherit data-selected:bg-transparent data-selected:text-inherit [&[data-highlighted][data-selected]]:bg-transparent [&[data-highlighted][data-selected]]:text-inherit",
props.isActive && "bg-accent! text-accent-foreground!",
)}
active={props.isActive}
className="gap-2"
onMouseDown={(event) => {
event.preventDefault();
}}
Expand Down
7 changes: 1 addition & 6 deletions apps/web/src/components/ComposerPromptEditorTiptap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,7 @@ function ComposerMentionNodeView({ node }: NodeViewProps) {
<NodeViewWrapper as="span" className={COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME}>
<Tooltip>
<TooltipTrigger render={chip} />
<TooltipPopup
side="top"
className="max-w-120 whitespace-normal leading-tight wrap-anywhere"
>
{path}
</TooltipPopup>
<TooltipPopup side="top">{path}</TooltipPopup>
</Tooltip>
</NodeViewWrapper>
);
Expand Down
Loading
Loading