@mcp-b/react-components 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/{AgentChat-Bm1qYbOo.d.ts → AgentChat-DHxdTjwF.d.ts} +34 -7
  2. package/dist/{CodeBlock-Cp67Njo3.js → CodeBlock-B3RLU3ez.js} +1 -1
  3. package/dist/{FileTree-DW60q1w7.js → FileTree-CYr5og0q.js} +1 -1
  4. package/dist/{Message-_-bEYLAO.js → Message-KlK8tlBZ.js} +1 -1
  5. package/dist/{ModelSelector-Brvj9Cab.js → ModelSelector-YTlqkIjs.js} +1 -1
  6. package/dist/{ThinkChat-E_HrfH76.js → ThinkChat-DVhCEjq-.js} +11 -2
  7. package/dist/{ThinkChatActivity-2BobmuvR.d.ts → ThinkChatActivity-DMTHKWrI.d.ts} +11 -9
  8. package/dist/{ThinkChatContext-DrsZqdaO.d.ts → ThinkChatContext-B-Nk84Wi.d.ts} +13 -1
  9. package/dist/{ThinkRecoveryNotice-DFIcG9UX.d.ts → ThinkRecoveryNotice-D6gYcBbr.d.ts} +1 -1
  10. package/dist/{WorkspaceFileView-rUEN2iox.js → WorkspaceFileView-CuMjXYQn.js} +3 -3
  11. package/dist/components/Activity.d.ts +11 -0
  12. package/dist/components/Activity.js +16 -4
  13. package/dist/components/AgentActivity.js +1 -1
  14. package/dist/components/AgentActivityPreview.js +1 -1
  15. package/dist/components/AgentChat.d.ts +1 -1
  16. package/dist/components/AgentChat.js +174 -94
  17. package/dist/components/AgentChatStartScreen.js +1 -1
  18. package/dist/components/AgentConnection.js +2 -2
  19. package/dist/components/AgentMessageParts.js +6 -2
  20. package/dist/components/AgentToolDetail.d.ts +1 -1
  21. package/dist/components/AgentToolDetail.js +2 -2
  22. package/dist/components/Approval.js +1 -1
  23. package/dist/components/Artifact.js +1 -1
  24. package/dist/components/BrowserLiveView.js +1 -1
  25. package/dist/components/BrowserReplay.js +1 -1
  26. package/dist/components/BrowserRunPanel.js +1 -1
  27. package/dist/components/ChainOfThought.d.ts +1 -1
  28. package/dist/components/ChainOfThought.js +1 -1
  29. package/dist/components/ChatGptSignInScreen.js +2 -2
  30. package/dist/components/Checkbox.js +1 -1
  31. package/dist/components/Checkpoint.js +1 -1
  32. package/dist/components/CodeBlock.js +1 -1
  33. package/dist/components/CodexModelSelector.js +1 -1
  34. package/dist/components/Commit.js +2 -2
  35. package/dist/components/ContextMenu.js +1 -1
  36. package/dist/components/Conversation.js +1 -1
  37. package/dist/components/EnvironmentVariables.js +2 -2
  38. package/dist/components/ExpansionState.d.ts +51 -0
  39. package/dist/components/ExpansionState.js +46 -0
  40. package/dist/components/FileTree.js +1 -1
  41. package/dist/components/Goal.d.ts +87 -0
  42. package/dist/components/Goal.js +92 -0
  43. package/dist/components/McpConnectionRequest.js +1 -1
  44. package/dist/components/McpPluginCatalog.js +1 -1
  45. package/dist/components/McpServerPicker.js +1 -1
  46. package/dist/components/MediaPreviewCard.js +13 -2
  47. package/dist/components/Menubar.js +1 -1
  48. package/dist/components/Message.js +1 -1
  49. package/dist/components/MessageScroller.js +1 -1
  50. package/dist/components/MessageScrollerVirtual.d.ts +72 -0
  51. package/dist/components/MessageScrollerVirtual.js +110 -0
  52. package/dist/components/ModelSelector.js +1 -1
  53. package/dist/components/Plan.js +1 -1
  54. package/dist/components/PricingPlanCard.js +1 -1
  55. package/dist/components/PromptInput.js +1 -1
  56. package/dist/components/Queue.js +1 -1
  57. package/dist/components/Reasoning.js +2 -2
  58. package/dist/components/ResponsiveSidebarShell.js +1 -1
  59. package/dist/components/SearchField.js +1 -1
  60. package/dist/components/Select.js +1 -1
  61. package/dist/components/SessionCompaction.d.ts +58 -0
  62. package/dist/components/SessionCompaction.js +117 -0
  63. package/dist/components/Sources.js +1 -1
  64. package/dist/components/Stepper.js +1 -1
  65. package/dist/components/SubagentRunIndicator.js +1 -1
  66. package/dist/components/Task.js +1 -1
  67. package/dist/components/Terminal.js +2 -2
  68. package/dist/components/TestResults.js +1 -1
  69. package/dist/components/ThemeModeControl.js +1 -1
  70. package/dist/components/ThinkChat.d.ts +6 -6
  71. package/dist/components/ThinkChat.js +1 -1
  72. package/dist/components/ThinkChatActivity.d.ts +1 -1
  73. package/dist/components/ThinkChatActivity.js +68 -14
  74. package/dist/components/ThinkChatContext.d.ts +2 -2
  75. package/dist/components/ThinkChatContext.js +5 -1
  76. package/dist/components/ThinkChatToolPanels.js +1 -1
  77. package/dist/components/ThinkExecutionDetail.js +1 -1
  78. package/dist/components/ThinkExecutionStatus.js +1 -1
  79. package/dist/components/ThinkExecutionWorkbench.d.ts +4 -3
  80. package/dist/components/ThinkExecutionWorkbench.js +7 -10
  81. package/dist/components/ThinkFullApp.js +65 -54
  82. package/dist/components/ThinkRecoveryNotice.d.ts +1 -1
  83. package/dist/components/ThinkRoutineBrowser.js +1 -1
  84. package/dist/components/ThinkRoutineForm.js +1 -1
  85. package/dist/components/ThinkRoutineLibrary.js +1 -1
  86. package/dist/components/ThinkThreadPicker.js +1 -1
  87. package/dist/components/Toast.js +1 -1
  88. package/dist/components/ToolInvocation.d.ts +8 -1
  89. package/dist/components/ToolInvocation.js +3 -2
  90. package/dist/components/WebPreview.js +1 -1
  91. package/dist/components/WorkspaceBrowser.js +1 -1
  92. package/dist/components/WorkspaceExplorer.js +1 -1
  93. package/dist/components/WorkspaceFileView.js +1 -1
  94. package/dist/components/WorkspaceHeader.js +1 -1
  95. package/dist/components/icons.d.ts +2 -2
  96. package/dist/components/icons.js +2 -2
  97. package/dist/{copy-button-TWq8nZhc.js → copy-button-Buxmtmp9.js} +1 -1
  98. package/dist/{icons-wP1yFUXF.d.ts → icons-Cih3W-zM.d.ts} +6 -1
  99. package/dist/{icons-ua6f_GH3.js → icons-w5PpKGRz.js} +3 -2
  100. package/dist/styles/activity.css +6 -0
  101. package/dist/styles/agent-chat.css +20 -4
  102. package/dist/styles/composition-motion.css +13 -23
  103. package/dist/styles/goal.css +57 -0
  104. package/dist/styles/index.css +1 -0
  105. package/dist/styles/message-scroller.css +25 -0
  106. package/dist/styles/responsive-sidebar-shell.css +12 -0
  107. package/dist/styles/think-full-app.css +22 -14
  108. package/package.json +7 -6
  109. package/dist/view-transitions-DyUP0lSg.js +0 -77
@@ -1,15 +1,14 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { Button } from "./Button.js";
3
- import { C as FileIcon, Z as TerminalIcon, c as BoxIcon, f as ChevronDownIcon } from "../icons-ua6f_GH3.js";
3
+ import { C as FileIcon, Q as TerminalIcon, c as BoxIcon, f as ChevronDownIcon, q as SpinnerIcon } from "../icons-w5PpKGRz.js";
4
4
  import { a as WorkspaceNavigationRestorationBoundary, i as WorkspaceNavigationFocusRestorer, n as WorkspaceNavigationProvider } from "../WorkspaceLink-BYYeTQLf.js";
5
5
  import { n as mergeRefs } from "../merge-refs-DF_7w2x_.js";
6
6
  import { AppTopBar } from "./AppTopBar.js";
7
- import { c as resolveThinkApprovalProps, s as useThinkPendingExecutionApprovals, t as ThinkChat } from "../ThinkChat-E_HrfH76.js";
7
+ import { c as resolveThinkApprovalProps, s as useThinkPendingExecutionApprovals, t as ThinkChat } from "../ThinkChat-DVhCEjq-.js";
8
8
  import { useWorkspace } from "./Workspace.js";
9
9
  import { WorkspaceExplorer } from "./WorkspaceExplorer.js";
10
10
  import { ScrollArea } from "./ScrollArea.js";
11
11
  import { McpPluginCatalog } from "./McpPluginCatalog.js";
12
- import { n as runViewTransition } from "../view-transitions-DyUP0lSg.js";
13
12
  import { ResizableSidePanel } from "./ResizableSidePanel.js";
14
13
  import { ThinkExecutionWorkbench } from "./ThinkExecutionWorkbench.js";
15
14
  import { ThinkFullAppViewSwitch } from "./ThinkFullAppViewSwitch.js";
@@ -49,8 +48,8 @@ function PluginsPanel({ config }) {
49
48
  /** Combines ThinkChat with an optional resizable workbench shell. */
50
49
  function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat, className, defaultMobileView, defaultWorkbenchView, defaultThreadSidebarOpen, hideAppBarInWorkbench = false, messages, mobileView, onMobileViewChange, onThreadSidebarOpenChange, onWorkbenchViewChange, plugins, ref, renderAgentToolRunLink, renderExecutionRunLink, selectedExecutionRun, showAgentTools = true, showExecutionWorkbench = true, showMobileViewSwitch = true, sourceKey, style, threadSidebar, threadSidebarOpen, threadStatusSummary, workbenchPanels, workbenchView, workspace, ...props }) {
51
50
  const appRef = React.useRef(null);
52
- const viewScopeRef = React.useRef(null);
53
51
  const workbenchPanelRef = React.useRef(null);
52
+ const pendingPanelFocusRef = React.useRef(null);
54
53
  const approvals = useThinkPendingExecutionApprovals(agent.stub, sourceKey, `${chat.messages.length}:${chat.status}`, messages?.approvalsEnabled !== false);
55
54
  const resolvedMessages = React.useMemo(() => {
56
55
  const approvalProps = resolveThinkApprovalProps({
@@ -91,10 +90,7 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
91
90
  onMobileViewChange?.(next);
92
91
  }, [mobileView, onMobileViewChange]);
93
92
  const updateAppView = React.useCallback((update) => {
94
- return runViewTransition({
95
- scope: viewScopeRef.current,
96
- update
97
- });
93
+ React.startTransition(update);
98
94
  }, []);
99
95
  const panelContext = React.useMemo(() => ({
100
96
  agent,
@@ -116,12 +112,20 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
116
112
  id: "execution",
117
113
  label: "Execution",
118
114
  icon: /* @__PURE__ */ jsx(TerminalIcon, {}),
119
- render: ({ agent }) => /* @__PURE__ */ jsx(ThinkExecutionWorkbench, {
120
- source: agent.stub,
121
- sourceKey,
122
- title: "Execution",
123
- selectedRun: selectedExecutionRun,
124
- renderRunLink: renderExecutionRunLink
115
+ render: ({ agent }) => /* @__PURE__ */ jsx(React.Suspense, {
116
+ fallback: /* @__PURE__ */ jsx("div", {
117
+ className: "think-full-app__workbench",
118
+ role: "status",
119
+ "aria-label": "Loading execution",
120
+ children: /* @__PURE__ */ jsx(SpinnerIcon, {})
121
+ }),
122
+ children: /* @__PURE__ */ jsx(ThinkExecutionWorkbench, {
123
+ source: agent.stub,
124
+ sourceKey,
125
+ title: "Execution",
126
+ selectedRun: selectedExecutionRun,
127
+ renderRunLink: renderExecutionRunLink
128
+ })
125
129
  })
126
130
  });
127
131
  if (plugins) availableWorkbenchPanels.push({
@@ -139,20 +143,21 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
139
143
  const workbenchViews = availableWorkbenchPanels;
140
144
  const shouldRenderInlineAppBar = !threadSidebar && (Boolean(appBarActions || appBarLeading || appBarTitle || threadSidebar) || hasWorkbench);
141
145
  const hasAppBarRow = shouldRenderInlineAppBar;
146
+ React.useLayoutEffect(() => {
147
+ const pendingFocus = pendingPanelFocusRef.current;
148
+ if (!pendingFocus || pendingFocus.id !== activeWorkbenchView) return;
149
+ pendingPanelFocusRef.current = null;
150
+ Array.from(workbenchPanelRef.current?.querySelectorAll("button") ?? []).find((button) => button.getAttribute("aria-label") === pendingFocus.label)?.focus({ preventScroll: true });
151
+ }, [activeWorkbenchView]);
142
152
  const updateWorkbenchPanel = (next) => {
143
153
  const activeElement = document.activeElement;
144
154
  const restorePanelSwitchFocus = activeElement instanceof HTMLElement && workbenchPanelRef.current?.contains(activeElement);
145
155
  const nextLabel = availableWorkbenchPanels.find((panel) => panel.id === next)?.label;
146
- const restoreFocus = () => {
147
- if (!restorePanelSwitchFocus || !nextLabel) return;
148
- Array.from(workbenchPanelRef.current?.querySelectorAll("button") ?? []).find((button) => button.getAttribute("aria-label") === nextLabel)?.focus({ preventScroll: true });
149
- };
150
- const transition = runViewTransition({
151
- scope: workbenchPanelRef.current,
152
- update: () => setWorkbenchView(next)
153
- });
154
- if (transition) transition.updateCallbackDone.then(restoreFocus, restoreFocus);
155
- else requestAnimationFrame(restoreFocus);
156
+ pendingPanelFocusRef.current = restorePanelSwitchFocus && nextLabel ? {
157
+ id: next,
158
+ label: nextLabel
159
+ } : null;
160
+ React.startTransition(() => setWorkbenchView(next));
156
161
  };
157
162
  const renderAppTopBar = (sidebarControls) => /* @__PURE__ */ jsxs(AppTopBar.Root, {
158
163
  className: "think-full-app__app-bar",
@@ -230,42 +235,48 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
230
235
  ...props,
231
236
  children: [
232
237
  shouldRenderInlineAppBar ? renderAppTopBar() : null,
233
- /* @__PURE__ */ jsxs("div", {
234
- ref: viewScopeRef,
235
- className: "think-full-app__view-scope",
236
- "data-recipe": "application-plane",
237
- children: [/* @__PURE__ */ jsx("section", {
238
- className: "think-full-app__chat-surface",
239
- "data-workspace-restoration-scope": "chat",
240
- "aria-label": "Chat",
241
- children: /* @__PURE__ */ jsx("div", {
242
- className: "think-full-app__chat",
238
+ /* @__PURE__ */ jsx(React.ViewTransition, {
239
+ default: "sigvelo-layout-transition",
240
+ children: /* @__PURE__ */ jsxs("div", {
241
+ className: "think-full-app__view-scope",
242
+ "data-recipe": "application-plane",
243
+ "data-mobile-view": activeMobileView,
244
+ children: [/* @__PURE__ */ jsx("section", {
245
+ className: "think-full-app__chat-surface",
246
+ "data-workspace-restoration-scope": "chat",
247
+ "aria-label": "Chat",
243
248
  children: /* @__PURE__ */ jsx("div", {
244
- className: "think-full-app__chat-inner",
245
- children: /* @__PURE__ */ jsx(ThinkChat.Provider, {
246
- chat,
247
- agentTools,
248
- children: /* @__PURE__ */ jsx(ThinkChat.Messages, {
249
- ...resolvedMessages,
250
- renderAgentToolRunLink: showAgentTools ? renderAgentToolRunLink : void 0
249
+ className: "think-full-app__chat",
250
+ children: /* @__PURE__ */ jsx("div", {
251
+ className: "think-full-app__chat-inner",
252
+ children: /* @__PURE__ */ jsx(ThinkChat.Provider, {
253
+ chat,
254
+ agentTools,
255
+ children: /* @__PURE__ */ jsx(ThinkChat.Messages, {
256
+ ...resolvedMessages,
257
+ renderAgentToolRunLink: showAgentTools ? renderAgentToolRunLink : void 0
258
+ })
251
259
  })
252
260
  })
253
261
  })
254
- })
255
- }), activePanel ? /* @__PURE__ */ jsx("aside", {
256
- className: "think-full-app__aside",
257
- "aria-label": "Workbench",
258
- children: /* @__PURE__ */ jsx("div", {
259
- className: "think-full-app__workbench-slot",
262
+ }), activePanel ? /* @__PURE__ */ jsx("aside", {
263
+ className: "think-full-app__aside",
264
+ "aria-label": "Workbench",
260
265
  children: /* @__PURE__ */ jsx("div", {
261
- ref: workbenchPanelRef,
262
- className: "think-full-app__workbench-panel",
263
- "data-view": activeWorkbenchView,
264
- tabIndex: -1,
265
- children: activePanel.render(panelContext)
266
+ className: "think-full-app__workbench-slot",
267
+ children: /* @__PURE__ */ jsx(React.ViewTransition, {
268
+ default: "sigvelo-layout-transition",
269
+ children: /* @__PURE__ */ jsx("div", {
270
+ ref: workbenchPanelRef,
271
+ className: "think-full-app__workbench-panel",
272
+ "data-view": activeWorkbenchView,
273
+ tabIndex: -1,
274
+ children: activePanel.render(panelContext)
275
+ })
276
+ })
266
277
  })
267
- })
268
- }) : null]
278
+ }) : null]
279
+ })
269
280
  }),
270
281
  activePanel ? /* @__PURE__ */ jsx(ResizableSidePanel.Handle, { className: "think-full-app__resizer" }) : null
271
282
  ]
@@ -1,2 +1,2 @@
1
- import { n as ThinkRecoveryNoticeProps, t as ThinkRecoveryNotice } from "../ThinkRecoveryNotice-DFIcG9UX.js";
1
+ import { n as ThinkRecoveryNoticeProps, t as ThinkRecoveryNotice } from "../ThinkRecoveryNotice-D6gYcBbr.js";
2
2
  export { ThinkRecoveryNotice, ThinkRecoveryNoticeProps };
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { buttonVariants } from "./Button.js";
3
- import { H as PlusIcon } from "../icons-ua6f_GH3.js";
3
+ import { H as PlusIcon } from "../icons-w5PpKGRz.js";
4
4
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
5
5
  import { Tooltip } from "./Tooltip.js";
6
6
  import { t as capitalize } from "../format-S6uWyoSb.js";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { Button, buttonVariants } from "./Button.js";
3
- import { q as SpinnerIcon } from "../icons-ua6f_GH3.js";
3
+ import { q as SpinnerIcon } from "../icons-w5PpKGRz.js";
4
4
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
5
5
  import { Select } from "./Select.js";
6
6
  import { Field } from "./Field.js";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { Button, buttonVariants } from "./Button.js";
3
- import { $ as WarningIcon, V as PlayIcon, b as EllipsisIcon, f as ChevronDownIcon, q as SpinnerIcon } from "../icons-ua6f_GH3.js";
3
+ import { V as PlayIcon, b as EllipsisIcon, et as WarningIcon, f as ChevronDownIcon, q as SpinnerIcon } from "../icons-w5PpKGRz.js";
4
4
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
5
5
  import { Menu } from "./Menu.js";
6
6
  import { AppTopBar } from "./AppTopBar.js";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { Button, buttonVariants } from "./Button.js";
3
- import { $ as WarningIcon, H as PlusIcon, q as SpinnerIcon, t as ArchiveIcon, v as DotIcon } from "../icons-ua6f_GH3.js";
3
+ import { H as PlusIcon, et as WarningIcon, q as SpinnerIcon, t as ArchiveIcon, v as DotIcon } from "../icons-w5PpKGRz.js";
4
4
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
5
5
  import { EmptyState } from "./EmptyState.js";
6
6
  import { SearchField } from "./SearchField.js";
@@ -1,6 +1,6 @@
1
1
  import { n as mergeBaseClassName } from "../class-names-BiMDVpUo.js";
2
2
  import { buttonVariants } from "./Button.js";
3
- import { tt as XIcon } from "../icons-ua6f_GH3.js";
3
+ import { nt as XIcon } from "../icons-w5PpKGRz.js";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { Toast as Toast$1 } from "@base-ui/react/toast";
@@ -8,6 +8,12 @@ interface ToolInvocationProps {
8
8
  part: ToolInvocationPart;
9
9
  /** Render the existing Activity disclosure expanded initially. */
10
10
  defaultOpen?: boolean;
11
+ /**
12
+ * Overrides the part-derived shimmer. Callers that know the run has settled
13
+ * pass false so a part stuck in a working state (denied approval, aborted
14
+ * stream) doesn't shimmer forever.
15
+ */
16
+ isStreaming?: boolean;
11
17
  }
12
18
  /**
13
19
  * Read-only generic disclosure for one upstream AI SDK tool invocation.
@@ -20,7 +26,8 @@ interface ToolInvocationProps {
20
26
  */
21
27
  declare function ToolInvocation({
22
28
  part,
23
- defaultOpen
29
+ defaultOpen,
30
+ isStreaming
24
31
  }: ToolInvocationProps): import("react").JSX.Element;
25
32
  //#endregion
26
33
  export { ToolInvocation, ToolInvocationPart, ToolInvocationProps };
@@ -45,7 +45,7 @@ function describeToolPart(part) {
45
45
  * transcript renderer. ThinkChat may replace this fallback with richer panels
46
46
  * for known workspace, browser, fetch, session, skill, and execute tools.
47
47
  */
48
- function ToolInvocation({ part, defaultOpen }) {
48
+ function ToolInvocation({ part, defaultOpen, isStreaming }) {
49
49
  const state = getToolPartState(part);
50
50
  const failed = isToolPartFailed(part);
51
51
  const deniedReason = part.state === "output-denied" ? part.approval.reason : void 0;
@@ -53,8 +53,9 @@ function ToolInvocation({ part, defaultOpen }) {
53
53
  const inputStatus = part.state === "approval-requested" ? "awaiting approval" : part.state === "approval-responded" ? part.approval.approved ? "approved" : "denied" : void 0;
54
54
  const outputStatus = state === "denied" ? "denied" : failed ? "error" : part.state === "output-available" && part.preliminary ? "preliminary" : void 0;
55
55
  return /* @__PURE__ */ jsxs(Activity, {
56
- isStreaming: isToolPartWorking(part),
56
+ isStreaming: isStreaming ?? isToolPartWorking(part),
57
57
  defaultOpen,
58
+ stateKey: part.toolCallId,
58
59
  children: [/* @__PURE__ */ jsx(ActivityTrigger, { action: describeToolPart(part) }), /* @__PURE__ */ jsxs(ActivityContent, { children: [/* @__PURE__ */ jsx(ActivityPanel, {
59
60
  label: part.title ?? getToolName(part),
60
61
  text: formatToolValue(getToolInput(part)),
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { Collapsible } from "./Collapsible.js";
3
- import { W as RefreshIcon, f as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../icons-ua6f_GH3.js";
3
+ import { W as RefreshIcon, f as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../icons-w5PpKGRz.js";
4
4
  import { IconButton } from "./IconButton.js";
5
5
  import { Badge } from "./Badge.js";
6
6
  import { Input } from "./Input.js";
@@ -1,4 +1,4 @@
1
- import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-DW60q1w7.js";
1
+ import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-CYr5og0q.js";
2
2
  import { SearchField } from "./SearchField.js";
3
3
  import { WorkspaceHeader } from "./WorkspaceHeader.js";
4
4
  import * as React from "react";
@@ -3,7 +3,7 @@ import { a as WorkspaceNavigationRestorationBoundary, n as WorkspaceNavigationPr
3
3
  import { n as mergeRefs } from "../merge-refs-DF_7w2x_.js";
4
4
  import { inferWorkspaceLanguage, inferWorkspaceMedia, isWorkspaceMarkdownPath, isWorkspaceMediaPath, isWorkspaceSkillPath, parseWorkspaceSkill } from "./WorkspaceFile.js";
5
5
  import { WorkspaceBrowser } from "./WorkspaceBrowser.js";
6
- import { t as WorkspaceFileView } from "../WorkspaceFileView-rUEN2iox.js";
6
+ import { t as WorkspaceFileView } from "../WorkspaceFileView-CuMjXYQn.js";
7
7
  import { useWorkspace, workspaceBinaryFileQueryOptions, workspaceDirectoryQueryOptions, workspaceFileAssetQueryOptions, workspaceFileStatQueryOptions, workspaceInfoQueryOptions, workspaceQueryKey, workspaceTextFileQueryOptions } from "./Workspace.js";
8
8
  import * as React from "react";
9
9
  import { jsx } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { t as WorkspaceFileView } from "../WorkspaceFileView-rUEN2iox.js";
1
+ import { t as WorkspaceFileView } from "../WorkspaceFileView-CuMjXYQn.js";
2
2
  export { WorkspaceFileView };
@@ -1,4 +1,4 @@
1
- import { W as RefreshIcon } from "../icons-ua6f_GH3.js";
1
+ import { W as RefreshIcon } from "../icons-w5PpKGRz.js";
2
2
  import { AppTopBar } from "./AppTopBar.js";
3
3
  import "react";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { $ as TerminalIcon, A as InfoIcon, B as PaperclipIcon, C as EyeOffIcon, D as HashIcon, E as FolderOpenIcon, F as MicrophoneIcon, G as QueueIcon, H as PencilIcon, I as MinusIcon, J as SidebarIcon, K as RefreshIcon, L as MonitorIcon, M as MaximizeIcon, N as McpIcon, O as IconProps, P as MessageSquareIcon, Q as SunIcon, R as MoonIcon, S as EyeIcon, T as FolderIcon, U as PlayIcon, V as PauseIcon, W as PlusIcon, X as SquareIcon, Y as SpinnerIcon, Z as StopIcon, _ as CopyIcon, a as ArrowUpIcon, b as DownloadIcon, c as BoxIcon, d as CalendarIcon, et as TrashIcon, f as CheckIcon, g as CodeIcon, h as ChevronRightIcon, i as ArrowRightIcon, j as LinkIcon, k as ImageIcon, l as BrainIcon, m as ChevronLeftIcon, n as ArrowDownIcon, nt as WrenchIcon, o as ArrowUpRightIcon, p as ChevronDownIcon, q as SearchIcon, r as ArrowLeftIcon, rt as XIcon, s as BookmarkIcon, t as ArchiveIcon, tt as WarningIcon, u as BrandIconProps, v as DiscordIcon, w as FileIcon, x as EllipsisIcon, y as DotIcon, z as MoveToFrontIcon } from "../icons-wP1yFUXF.js";
2
- export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, BrandIconProps, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, IconProps, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { $ as TargetIcon, A as InfoIcon, B as PaperclipIcon, C as EyeOffIcon, D as HashIcon, E as FolderOpenIcon, F as MicrophoneIcon, G as QueueIcon, H as PencilIcon, I as MinusIcon, J as SidebarIcon, K as RefreshIcon, L as MonitorIcon, M as MaximizeIcon, N as McpIcon, O as IconProps, P as MessageSquareIcon, Q as SunIcon, R as MoonIcon, S as EyeIcon, T as FolderIcon, U as PlayIcon, V as PauseIcon, W as PlusIcon, X as SquareIcon, Y as SpinnerIcon, Z as StopIcon, _ as CopyIcon, a as ArrowUpIcon, b as DownloadIcon, c as BoxIcon, d as CalendarIcon, et as TerminalIcon, f as CheckIcon, g as CodeIcon, h as ChevronRightIcon, i as ArrowRightIcon, it as XIcon, j as LinkIcon, k as ImageIcon, l as BrainIcon, m as ChevronLeftIcon, n as ArrowDownIcon, nt as WarningIcon, o as ArrowUpRightIcon, p as ChevronDownIcon, q as SearchIcon, r as ArrowLeftIcon, rt as WrenchIcon, s as BookmarkIcon, t as ArchiveIcon, tt as TrashIcon, u as BrandIconProps, v as DiscordIcon, w as FileIcon, x as EllipsisIcon, y as DotIcon, z as MoveToFrontIcon } from "../icons-Cih3W-zM.js";
2
+ export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, BrandIconProps, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, IconProps, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,2 +1,2 @@
1
- import { $ as WarningIcon, A as MaximizeIcon, B as PencilIcon, C as FileIcon, D as ImageIcon, E as HashIcon, F as MonitorIcon, G as SearchIcon, H as PlusIcon, I as MoonIcon, J as SquareIcon, K as SidebarIcon, L as MoveToFrontIcon, M as MessageSquareIcon, N as MicrophoneIcon, O as InfoIcon, P as MinusIcon, Q as TrashIcon, R as PaperclipIcon, S as EyeOffIcon, T as FolderOpenIcon, U as QueueIcon, V as PlayIcon, W as RefreshIcon, X as SunIcon, Y as StopIcon, Z as TerminalIcon, _ as DiscordIcon, a as ArrowUpIcon, b as EllipsisIcon, c as BoxIcon, d as CheckIcon, et as WrenchIcon, f as ChevronDownIcon, g as CopyIcon, h as CodeIcon, i as ArrowRightIcon, j as McpIcon, k as LinkIcon, l as BrainIcon, m as ChevronRightIcon, n as ArrowDownIcon, o as ArrowUpRightIcon, p as ChevronLeftIcon, q as SpinnerIcon, r as ArrowLeftIcon, s as BookmarkIcon, t as ArchiveIcon, tt as XIcon, u as CalendarIcon, v as DotIcon, w as FolderIcon, x as EyeIcon, y as DownloadIcon, z as PauseIcon } from "../icons-ua6f_GH3.js";
2
- export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { $ as TrashIcon, A as MaximizeIcon, B as PencilIcon, C as FileIcon, D as ImageIcon, E as HashIcon, F as MonitorIcon, G as SearchIcon, H as PlusIcon, I as MoonIcon, J as SquareIcon, K as SidebarIcon, L as MoveToFrontIcon, M as MessageSquareIcon, N as MicrophoneIcon, O as InfoIcon, P as MinusIcon, Q as TerminalIcon, R as PaperclipIcon, S as EyeOffIcon, T as FolderOpenIcon, U as QueueIcon, V as PlayIcon, W as RefreshIcon, X as SunIcon, Y as StopIcon, Z as TargetIcon, _ as DiscordIcon, a as ArrowUpIcon, b as EllipsisIcon, c as BoxIcon, d as CheckIcon, et as WarningIcon, f as ChevronDownIcon, g as CopyIcon, h as CodeIcon, i as ArrowRightIcon, j as McpIcon, k as LinkIcon, l as BrainIcon, m as ChevronRightIcon, n as ArrowDownIcon, nt as XIcon, o as ArrowUpRightIcon, p as ChevronLeftIcon, q as SpinnerIcon, r as ArrowLeftIcon, s as BookmarkIcon, t as ArchiveIcon, tt as WrenchIcon, u as CalendarIcon, v as DotIcon, w as FolderIcon, x as EyeIcon, y as DownloadIcon, z as PauseIcon } from "../icons-w5PpKGRz.js";
2
+ export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,4 +1,4 @@
1
- import { d as CheckIcon, g as CopyIcon } from "./icons-ua6f_GH3.js";
1
+ import { d as CheckIcon, g as CopyIcon } from "./icons-w5PpKGRz.js";
2
2
  import { IconButton } from "./components/IconButton.js";
3
3
  import * as React from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -281,10 +281,15 @@ declare const SunIcon: ({
281
281
  strokeWidth,
282
282
  ...props
283
283
  }: IconProps) => import("react").JSX.Element;
284
+ declare const TargetIcon: ({
285
+ size,
286
+ strokeWidth,
287
+ ...props
288
+ }: IconProps) => import("react").JSX.Element;
284
289
  declare const MaximizeIcon: ({
285
290
  size,
286
291
  strokeWidth,
287
292
  ...props
288
293
  }: IconProps) => import("react").JSX.Element;
289
294
  //#endregion
290
- export { TerminalIcon as $, InfoIcon as A, PaperclipIcon as B, EyeOffIcon as C, HashIcon as D, FolderOpenIcon as E, MicrophoneIcon as F, QueueIcon as G, PencilIcon as H, MinusIcon as I, SidebarIcon as J, RefreshIcon as K, MonitorIcon as L, MaximizeIcon as M, McpIcon as N, IconProps as O, MessageSquareIcon as P, SunIcon as Q, MoonIcon as R, EyeIcon as S, FolderIcon as T, PlayIcon as U, PauseIcon as V, PlusIcon as W, SquareIcon as X, SpinnerIcon as Y, StopIcon as Z, CopyIcon as _, ArrowUpIcon as a, DownloadIcon as b, BoxIcon as c, CalendarIcon as d, TrashIcon as et, CheckIcon as f, CodeIcon as g, ChevronRightIcon as h, ArrowRightIcon as i, LinkIcon as j, ImageIcon as k, BrainIcon as l, ChevronLeftIcon as m, ArrowDownIcon as n, WrenchIcon as nt, ArrowUpRightIcon as o, ChevronDownIcon as p, SearchIcon as q, ArrowLeftIcon as r, XIcon as rt, BookmarkIcon as s, ArchiveIcon as t, WarningIcon as tt, BrandIconProps as u, DiscordIcon as v, FileIcon as w, EllipsisIcon as x, DotIcon as y, MoveToFrontIcon as z };
295
+ export { TargetIcon as $, InfoIcon as A, PaperclipIcon as B, EyeOffIcon as C, HashIcon as D, FolderOpenIcon as E, MicrophoneIcon as F, QueueIcon as G, PencilIcon as H, MinusIcon as I, SidebarIcon as J, RefreshIcon as K, MonitorIcon as L, MaximizeIcon as M, McpIcon as N, IconProps as O, MessageSquareIcon as P, SunIcon as Q, MoonIcon as R, EyeIcon as S, FolderIcon as T, PlayIcon as U, PauseIcon as V, PlusIcon as W, SquareIcon as X, SpinnerIcon as Y, StopIcon as Z, CopyIcon as _, ArrowUpIcon as a, DownloadIcon as b, BoxIcon as c, CalendarIcon as d, TerminalIcon as et, CheckIcon as f, CodeIcon as g, ChevronRightIcon as h, ArrowRightIcon as i, XIcon as it, LinkIcon as j, ImageIcon as k, BrainIcon as l, ChevronLeftIcon as m, ArrowDownIcon as n, WarningIcon as nt, ArrowUpRightIcon as o, ChevronDownIcon as p, SearchIcon as q, ArrowLeftIcon as r, WrenchIcon as rt, BookmarkIcon as s, ArchiveIcon as t, TrashIcon as tt, BrandIconProps as u, DiscordIcon as v, FileIcon as w, EllipsisIcon as x, DotIcon as y, MoveToFrontIcon as z };
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "./class-names-BiMDVpUo.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpRight, Bookmark, Box, Brain, CalendarDays, Check, ChevronDown, ChevronLeft, ChevronRight, CircleStop, CodeXml, Copy, CornerDownRight, Dot, Download, Ellipsis, Eye, EyeOff, File, Folder, FolderOpen, Hash, Image, Info, Link2, ListRestart, LoaderCircle, Maximize2, MessageSquare, Mic, Minus, Monitor, Moon, PanelLeft, Paperclip, Pause, Pencil, Play, Plus, RefreshCw, Search, Square, Sun, Terminal, Trash2, TriangleAlert, Wrench, X } from "lucide-react";
3
+ import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpRight, Bookmark, Box, Brain, CalendarDays, Check, ChevronDown, ChevronLeft, ChevronRight, CircleStop, CodeXml, Copy, CornerDownRight, Dot, Download, Ellipsis, Eye, EyeOff, File, Folder, FolderOpen, Hash, Image, Info, Link2, ListRestart, LoaderCircle, Maximize2, MessageSquare, Mic, Minus, Monitor, Moon, PanelLeft, Paperclip, Pause, Pencil, Play, Plus, RefreshCw, Search, Square, Sun, Target, Terminal, Trash2, TriangleAlert, Wrench, X } from "lucide-react";
4
4
  import { SiDiscord, SiModelcontextprotocol } from "react-icons/si";
5
5
  //#region src/components/_internal/icons.tsx
6
6
  function icon(Component) {
@@ -87,6 +87,7 @@ const McpIcon = brandIcon(SiModelcontextprotocol);
87
87
  const DiscordIcon = brandIcon(SiDiscord);
88
88
  const MoonIcon = icon(Moon);
89
89
  const SunIcon = icon(Sun);
90
+ const TargetIcon = icon(Target);
90
91
  const MaximizeIcon = icon(Maximize2);
91
92
  //#endregion
92
- export { WarningIcon as $, MaximizeIcon as A, PencilIcon as B, FileIcon as C, ImageIcon as D, HashIcon as E, MonitorIcon as F, SearchIcon as G, PlusIcon as H, MoonIcon as I, SquareIcon as J, SidebarIcon as K, MoveToFrontIcon as L, MessageSquareIcon as M, MicrophoneIcon as N, InfoIcon as O, MinusIcon as P, TrashIcon as Q, PaperclipIcon as R, EyeOffIcon as S, FolderOpenIcon as T, QueueIcon as U, PlayIcon as V, RefreshIcon as W, SunIcon as X, StopIcon as Y, TerminalIcon as Z, DiscordIcon as _, ArrowUpIcon as a, EllipsisIcon as b, BoxIcon as c, CheckIcon as d, WrenchIcon as et, ChevronDownIcon as f, CopyIcon as g, CodeIcon as h, ArrowRightIcon as i, McpIcon as j, LinkIcon as k, BrainIcon as l, ChevronRightIcon as m, ArrowDownIcon as n, ArrowUpRightIcon as o, ChevronLeftIcon as p, SpinnerIcon as q, ArrowLeftIcon as r, BookmarkIcon as s, ArchiveIcon as t, XIcon as tt, CalendarIcon as u, DotIcon as v, FolderIcon as w, EyeIcon as x, DownloadIcon as y, PauseIcon as z };
93
+ export { TrashIcon as $, MaximizeIcon as A, PencilIcon as B, FileIcon as C, ImageIcon as D, HashIcon as E, MonitorIcon as F, SearchIcon as G, PlusIcon as H, MoonIcon as I, SquareIcon as J, SidebarIcon as K, MoveToFrontIcon as L, MessageSquareIcon as M, MicrophoneIcon as N, InfoIcon as O, MinusIcon as P, TerminalIcon as Q, PaperclipIcon as R, EyeOffIcon as S, FolderOpenIcon as T, QueueIcon as U, PlayIcon as V, RefreshIcon as W, SunIcon as X, StopIcon as Y, TargetIcon as Z, DiscordIcon as _, ArrowUpIcon as a, EllipsisIcon as b, BoxIcon as c, CheckIcon as d, WarningIcon as et, ChevronDownIcon as f, CopyIcon as g, CodeIcon as h, ArrowRightIcon as i, McpIcon as j, LinkIcon as k, BrainIcon as l, ChevronRightIcon as m, ArrowDownIcon as n, XIcon as nt, ArrowUpRightIcon as o, ChevronLeftIcon as p, SpinnerIcon as q, ArrowLeftIcon as r, BookmarkIcon as s, ArchiveIcon as t, WrenchIcon as tt, CalendarIcon as u, DotIcon as v, FolderIcon as w, EyeIcon as x, DownloadIcon as y, PauseIcon as z };
@@ -85,6 +85,12 @@
85
85
  padding-inline: var(--sigvelo-spacing-2);
86
86
  }
87
87
 
88
+ /* Reveal row for step logs capped at the trailing window. */
89
+ .activity__show-earlier {
90
+ align-self: flex-start;
91
+ color: var(--sigvelo-color-text-muted);
92
+ }
93
+
88
94
  .activity__item {
89
95
  display: flex;
90
96
  align-items: baseline;
@@ -1,5 +1,6 @@
1
1
  .agent-chat {
2
2
  --agent-chat-content-max-inline-size: 64rem;
3
+ --agent-chat-composer-scrim-fade: 2.5rem;
3
4
 
4
5
  container: agent-chat / inline-size;
5
6
  position: relative;
@@ -21,13 +22,20 @@
21
22
  /* Room for the last message to scroll clear of the floating composer.
22
23
  --agent-chat-composer-size is set from a ResizeObserver in AgentChat. */
23
24
  .agent-chat__transcript-content {
24
- gap: var(--sigvelo-spacing-3);
25
+ /* Also the virtual rows' block-start offset — keep padding and rows in
26
+ lockstep (see .message-scroller__virtual-item). Row spacing is NOT css
27
+ gap: rows are absolutely positioned, so the virtualizer's JS gap option
28
+ owns it (see VirtualMessageScroller). */
29
+ --message-scroller-virtual-block-start: var(--sigvelo-spacing-8);
30
+
25
31
  min-inline-size: 0;
26
32
  max-inline-size: 100%;
27
33
  inline-size: min(100%, var(--agent-chat-content-max-inline-size));
28
34
  margin-inline: auto;
29
- padding-block: var(--sigvelo-spacing-8)
30
- calc(var(--agent-chat-composer-size, 5rem) + var(--sigvelo-spacing-2));
35
+ /* Clearance = composer + its scrim band, so a transcript resting at the
36
+ bottom never sits inside the fade. */
37
+ padding-block: var(--message-scroller-virtual-block-start)
38
+ calc(var(--agent-chat-composer-size, 5rem) + var(--agent-chat-composer-scrim-fade));
31
39
  padding-inline: var(--sigvelo-spacing-4);
32
40
  }
33
41
 
@@ -272,13 +280,21 @@
272
280
  padding: 0 var(--sigvelo-spacing-6) var(--sigvelo-spacing-6);
273
281
  }
274
282
 
283
+ /* Solid behind the composer itself, dissolving upward so passing transcript
284
+ content fades into the surface instead of hitting a hard edge (Codex and
285
+ Claude both ship an equivalent bottom fade band). */
275
286
  .agent-chat__composer::after {
276
287
  position: absolute;
277
288
  z-index: -1;
278
289
  inset: 0;
290
+ inset-block-start: calc(-1 * var(--agent-chat-composer-scrim-fade));
279
291
  content: "";
280
292
  pointer-events: none;
281
- background-color: var(--sigvelo-color-surface);
293
+ background: linear-gradient(
294
+ to bottom,
295
+ transparent,
296
+ var(--sigvelo-color-surface) var(--agent-chat-composer-scrim-fade)
297
+ );
282
298
  }
283
299
 
284
300
  .agent-chat__composer > .prompt-input {
@@ -52,32 +52,22 @@
52
52
  }
53
53
  }
54
54
 
55
- /*
56
- * Native snapshot motion uses the major-layout rhythm instead of Chrome's UA
57
- * default. Element-scoped pseudo-trees attach to their transition root, while
58
- * the :root selector also covers the document fallback.
59
- */
60
- :where(
61
- :root,
62
- .workspace-explorer,
63
- .responsive-sidebar-shell__frame,
64
- .think-execution-workbench,
65
- .think-routine-library,
66
- .think-full-app__view-scope,
67
- .think-full-app__workbench-panel
68
- )::view-transition {
55
+ /* React owns native snapshots; the class comes from <ViewTransition>. */
56
+ ::view-transition {
69
57
  pointer-events: none;
70
58
  }
71
59
 
72
- :where(
73
- :root,
74
- .workspace-explorer,
75
- .responsive-sidebar-shell__frame,
76
- .think-execution-workbench,
77
- .think-routine-library,
78
- .think-full-app__view-scope,
79
- .think-full-app__workbench-panel
80
- )::view-transition-group(*) {
60
+ ::view-transition-group(.sigvelo-layout-transition) {
81
61
  animation-duration: var(--sigvelo-motion-duration-layout);
82
62
  animation-timing-function: var(--sigvelo-motion-ease-change);
83
63
  }
64
+
65
+ @media (prefers-reduced-motion: reduce) {
66
+ ::view-transition-group(.sigvelo-layout-transition) {
67
+ animation: none !important;
68
+ }
69
+ }
70
+
71
+ :root[data-motion="reduce"]::view-transition-group(.sigvelo-layout-transition) {
72
+ animation: none !important;
73
+ }
@@ -0,0 +1,57 @@
1
+ .goal {
2
+ display: flex;
3
+ align-items: center;
4
+ min-inline-size: 0;
5
+ min-block-size: var(--sigvelo-spacing-6);
6
+ gap: var(--sigvelo-spacing-1-5);
7
+ padding-block: var(--sigvelo-spacing-1);
8
+ padding-inline: var(--sigvelo-spacing-2-5);
9
+ color: var(--sigvelo-color-text);
10
+ font-size: var(--sigvelo-text-compact);
11
+ line-height: var(--sigvelo-leading-snug);
12
+ }
13
+
14
+ .goal__icon {
15
+ display: inline-flex;
16
+ flex: none;
17
+ color: var(--sigvelo-color-text-muted);
18
+ }
19
+
20
+ .goal__content {
21
+ display: flex;
22
+ flex: 1;
23
+ flex-wrap: wrap;
24
+ gap: 0 var(--sigvelo-spacing-1);
25
+ align-items: baseline;
26
+ min-inline-size: 0;
27
+ overflow-wrap: anywhere;
28
+ }
29
+
30
+ .goal__title {
31
+ min-inline-size: 0;
32
+ font-weight: var(--sigvelo-font-weight-semibold);
33
+ }
34
+
35
+ .goal__objective {
36
+ min-inline-size: 0;
37
+ color: var(--sigvelo-color-text-muted);
38
+ }
39
+
40
+ .goal__meta {
41
+ min-inline-size: 0;
42
+ color: var(--sigvelo-color-text-muted);
43
+ }
44
+
45
+ .goal__objective + .goal__meta::before,
46
+ .goal__title + .goal__meta::before {
47
+ content: "\00b7";
48
+ margin-inline-end: var(--sigvelo-spacing-1);
49
+ }
50
+
51
+ .goal__actions {
52
+ display: inline-flex;
53
+ flex: none;
54
+ gap: var(--sigvelo-spacing-1);
55
+ align-items: center;
56
+ margin-inline-start: auto;
57
+ }
@@ -98,6 +98,7 @@
98
98
  @import "./codex-model-selector.css" layer(components);
99
99
  @import "./environment-variables.css" layer(components);
100
100
  @import "./file-tree.css" layer(components);
101
+ @import "./goal.css" layer(components);
101
102
  @import "./inline-citation.css" layer(components);
102
103
  @import "./message.css" layer(components);
103
104
  @import "./model-selector.css" layer(components);
@@ -41,6 +41,31 @@
41
41
  .message-scroller__item {
42
42
  min-width: 0;
43
43
  flex-shrink: 0;
44
+ /* Off-screen rows skip layout/paint entirely (Codex ships the same pair on
45
+ turn content). `auto` keeps the last rendered size once measured; 15rem is
46
+ only the pre-first-render estimate, so scroll math stays sane. */
47
+ content-visibility: auto;
48
+ contain-intrinsic-size: auto 15rem;
49
+ }
50
+
51
+ /* Virtualized variant: rows are windowed and absolutely positioned by
52
+ TanStack Virtual, so no gap/content-visibility here — the window itself
53
+ bounds DOM cost, and translateY replaces flow layout. */
54
+ .message-scroller__virtual-content {
55
+ position: relative;
56
+ width: 100%;
57
+ }
58
+
59
+ /* Absolutely positioned rows resolve against the wrapper's padding box, so
60
+ its padding never insets them. Rows inherit the inline padding to restore
61
+ the gutters, and start below the block-start padding via the variable the
62
+ padded wrapper re-exports (0 when the wrapper is unpadded). */
63
+ .message-scroller__virtual-item {
64
+ position: absolute;
65
+ inset-block-start: var(--message-scroller-virtual-block-start, 0px);
66
+ inset-inline: 0;
67
+ min-width: 0;
68
+ padding-inline: inherit;
44
69
  }
45
70
 
46
71
  .message-scroller__button {
@@ -92,6 +92,18 @@
92
92
  }
93
93
 
94
94
  @container responsive-sidebar-shell (inline-size <= 56rem) {
95
+ /* Narrow hosts flatten the application plane: no desktop chrome remains
96
+ around it, so margins and elevation would read as a card in a frame. */
97
+ .responsive-sidebar-shell__main {
98
+ margin: 0;
99
+ border-radius: 0;
100
+ box-shadow: none;
101
+ }
102
+
103
+ .responsive-sidebar-shell > .app-top-bar {
104
+ background: var(--sigvelo-color-surface);
105
+ }
106
+
95
107
  .responsive-sidebar-shell__frame {
96
108
  grid-template-columns: minmax(0, 1fr);
97
109
  }