@mcp-b/react-components 0.5.3 → 0.5.5

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 (47) hide show
  1. package/dist/{CodeBlock-D-a84xBL.js → CodeBlock-BK0sOAbV.js} +1 -1
  2. package/dist/{FileTree-D8rtTLgK.js → FileTree-BWQZ0FSi.js} +1 -1
  3. package/dist/components/Activity.js +1 -1
  4. package/dist/components/AgentChat.d.ts +3 -0
  5. package/dist/components/AgentChat.js +15 -4
  6. package/dist/components/AgentConnection.js +2 -2
  7. package/dist/components/Artifact.js +1 -1
  8. package/dist/components/BrowserLiveView.js +1 -1
  9. package/dist/components/BrowserReplay.js +1 -1
  10. package/dist/components/ChainOfThought.d.ts +1 -1
  11. package/dist/components/ChainOfThought.js +1 -1
  12. package/dist/components/CodeBlock.js +1 -1
  13. package/dist/components/Commit.js +1 -1
  14. package/dist/components/ContextMenu.js +1 -1
  15. package/dist/components/Conversation.js +1 -1
  16. package/dist/components/Dialog.js +1 -1
  17. package/dist/components/EnvironmentVariables.js +1 -1
  18. package/dist/components/FileTree.js +1 -1
  19. package/dist/components/McpServerPicker.d.ts +39 -0
  20. package/dist/components/McpServerPicker.js +140 -0
  21. package/dist/components/Menubar.js +1 -1
  22. package/dist/components/Message.js +1 -1
  23. package/dist/components/ModelSelector.js +1 -1
  24. package/dist/components/NavigationMenu.js +1 -1
  25. package/dist/components/PromptInput.d.ts +2 -2
  26. package/dist/components/PromptInput.js +6 -6
  27. package/dist/components/Queue.js +1 -1
  28. package/dist/components/Reasoning.js +1 -1
  29. package/dist/components/Select.js +1 -1
  30. package/dist/components/Sources.js +1 -1
  31. package/dist/components/Stepper.js +1 -1
  32. package/dist/components/Task.js +1 -1
  33. package/dist/components/Terminal.js +2 -2
  34. package/dist/components/TestResults.js +1 -1
  35. package/dist/components/ThinkChat.d.ts +2 -0
  36. package/dist/components/ThinkChat.js +1 -1
  37. package/dist/components/WebPreview.js +1 -1
  38. package/dist/components/WorkspaceExplorer.js +3 -3
  39. package/dist/components/icons.d.ts +2 -2
  40. package/dist/components/icons.js +2 -2
  41. package/dist/{copy-button-BmJEAKuP.js → copy-button-CB2MWcau.js} +1 -1
  42. package/dist/{icons-CZRH4FVH.js → icons-BCNawx-T.js} +5 -1
  43. package/dist/{icons-CmO7-pNY.d.ts → icons-BYpJY6L2.d.ts} +2 -1
  44. package/dist/styles/agent-chat.css +13 -0
  45. package/dist/styles/index.css +1 -0
  46. package/dist/styles/mcp-server-picker.css +138 -0
  47. package/package.json +7 -2
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "./class-names-9UtZwb0J.js";
2
2
  import { Select, SelectContent, SelectItem, SelectList, SelectTrigger, SelectValue } from "./components/Select.js";
3
- import { t as CopyButton } from "./copy-button-BmJEAKuP.js";
3
+ import { t as CopyButton } from "./copy-button-CB2MWcau.js";
4
4
  import * as React from "react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import { createHighlighter } from "shiki";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "./class-names-9UtZwb0J.js";
2
- import { c as ChevronRightIcon, g as FolderOpenIcon, h as FolderIcon, m as FileIcon } from "./icons-CZRH4FVH.js";
2
+ import { c as ChevronRightIcon, g as FolderOpenIcon, h as FolderIcon, m as FileIcon } from "./icons-BCNawx-T.js";
3
3
  import * as React from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/_internal/use-file-tree-nav.ts
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { c as ChevronRightIcon } from "../icons-CZRH4FVH.js";
3
+ import { c as ChevronRightIcon } from "../icons-BCNawx-T.js";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/Activity.tsx
@@ -30,6 +30,8 @@ interface AgentChatProps<MessageT extends UIMessage = UIMessage> {
30
30
  emptyState?: React.ReactNode;
31
31
  /** Extra controls rendered in the composer toolbar. */
32
32
  composerTools?: React.ReactNode;
33
+ /** Extra rows rendered in the built-in plus menu after files. */
34
+ composerAddMenuItems?: React.ReactNode;
33
35
  /**
34
36
  * Transient status rendered between the transcript and the composer —
35
37
  * e.g. a "Reconnecting…" pill. `ThinkChat.Messages` fills this from the
@@ -86,6 +88,7 @@ declare function AgentChat<MessageT extends UIMessage = UIMessage>({
86
88
  disabled,
87
89
  emptyState,
88
90
  composerTools,
91
+ composerAddMenuItems,
89
92
  notice,
90
93
  onRegenerate,
91
94
  onApprovalResponse,
@@ -1,10 +1,10 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { D as RefreshIcon, E as PlusIcon } from "../icons-CZRH4FVH.js";
2
+ import { D as PlusIcon, O as RefreshIcon } from "../icons-BCNawx-T.js";
3
3
  import { Activity, ActivityContent, ActivityPanel, ActivityTrigger } from "./Activity.js";
4
4
  import { Context, ContextContent, ContextContentBody, ContextContentHeader, ContextTrigger, getContextUsage, getContextUsedTokens } from "./Context.js";
5
5
  import { Conversation, ConversationContent, ConversationEmptyState, ConversationScrollButton } from "./Conversation.js";
6
6
  import { Message, MessageAction, MessageActions, MessageAttachment, MessageContent, MessageResponse } from "./Message.js";
7
- import { PromptInput, PromptInputApproval, PromptInputAttachments, PromptInputBody, PromptInputButton, PromptInputFooter, PromptInputPermissionSelector, PromptInputSubmit, PromptInputTextarea, PromptInputTools, getApprovalRequestId, getPendingToolApprovals, usePromptInputAttachments } from "./PromptInput.js";
7
+ import { PromptInput, PromptInputActionAddAttachments, PromptInputActionMenu, PromptInputActionMenuContent, PromptInputActionMenuTrigger, PromptInputApproval, PromptInputAttachments, PromptInputBody, PromptInputButton, PromptInputFooter, PromptInputPermissionSelector, PromptInputSubmit, PromptInputTextarea, PromptInputTools, getApprovalRequestId, getPendingToolApprovals, usePromptInputAttachments } from "./PromptInput.js";
8
8
  import { Reasoning, ReasoningContent, ReasoningTrigger } from "./Reasoning.js";
9
9
  import * as React from "react";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -18,6 +18,17 @@ function AgentChatAttachButton() {
18
18
  children: /* @__PURE__ */ jsx(PlusIcon, {})
19
19
  });
20
20
  }
21
+ function AgentChatAddMenu({ children }) {
22
+ if (!children) return /* @__PURE__ */ jsx(AgentChatAttachButton, {});
23
+ return /* @__PURE__ */ jsxs(PromptInputActionMenu, { children: [/* @__PURE__ */ jsx(PromptInputActionMenuTrigger, { "aria-label": "Add context" }), /* @__PURE__ */ jsxs(PromptInputActionMenuContent, {
24
+ side: "top",
25
+ align: "start",
26
+ sideOffset: 12,
27
+ collisionPadding: 8,
28
+ className: "agent-chat__add-menu",
29
+ children: [/* @__PURE__ */ jsx(PromptInputActionAddAttachments, {}), children]
30
+ })] });
31
+ }
21
32
  function isCompactedPart(message, part, partIndex) {
22
33
  const metadata = message.metadata;
23
34
  if (isTextUIPart(part)) return Array.isArray(metadata?.compactedTextParts) && metadata.compactedTextParts.includes(partIndex);
@@ -88,7 +99,7 @@ function renderDefaultPart(part) {
88
99
  * transport. Use it directly with plain AI SDK `useChat` or a read-only
89
100
  * transcript; if you have a Cloudflare Think agent, use `ThinkChat` instead.
90
101
  */
91
- function AgentChat({ className, messages, status = "ready", onSubmit, onStop, placeholder = "Ask anything...", disabled, emptyState, composerTools, notice, onRegenerate, onApprovalResponse, executionApprovals, contextWindow, renderPart, renderMessageAfter, ref }) {
102
+ function AgentChat({ className, messages, status = "ready", onSubmit, onStop, placeholder = "Ask anything...", disabled, emptyState, composerTools, composerAddMenuItems, notice, onRegenerate, onApprovalResponse, executionApprovals, contextWindow, renderPart, renderMessageAfter, ref }) {
92
103
  const handleSubmit = React.useCallback((message) => {
93
104
  onSubmit?.(message);
94
105
  }, [onSubmit]);
@@ -194,7 +205,7 @@ function AgentChat({ className, messages, status = "ready", onSubmit, onStop, pl
194
205
  disabled
195
206
  }) }),
196
207
  /* @__PURE__ */ jsxs(PromptInputFooter, { children: [/* @__PURE__ */ jsxs(PromptInputTools, { children: [
197
- /* @__PURE__ */ jsx(AgentChatAttachButton, {}),
208
+ /* @__PURE__ */ jsx(AgentChatAddMenu, { children: composerAddMenuItems }),
198
209
  approvalsWired ? /* @__PURE__ */ jsx(PromptInputPermissionSelector, {
199
210
  value: permissionMode,
200
211
  onValueChange: setPermissionMode
@@ -1,8 +1,8 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { y as LinkIcon } from "../icons-CZRH4FVH.js";
2
+ import { y as LinkIcon } from "../icons-BCNawx-T.js";
3
3
  import { Popover } from "./Popover.js";
4
4
  import { Button } from "./Button.js";
5
- import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../CodeBlock-D-a84xBL.js";
5
+ import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../CodeBlock-BK0sOAbV.js";
6
6
  import * as React from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region src/components/AgentConnection.tsx
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { P as XIcon } from "../icons-CZRH4FVH.js";
2
+ import { F as XIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
5
  import "react";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { b as MaximizeIcon, k as SpinnerIcon } from "../icons-CZRH4FVH.js";
2
+ import { A as SpinnerIcon, b as MaximizeIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Dialog, DialogContent, DialogTitle } from "./Dialog.js";
5
5
  import { Badge } from "./Badge.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { C as PauseIcon, T as PlayIcon } from "../icons-CZRH4FVH.js";
2
+ import { E as PlayIcon, w as PauseIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Slider, SliderControl, SliderIndicator, SliderThumb, SliderTrack } from "./Slider.js";
5
5
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import { CollapsiblePanelProps, CollapsibleRootProps, CollapsibleTriggerProps } from "./Collapsible.js";
2
- import { _ as IconProps } from "../icons-CmO7-pNY.js";
2
+ import { _ as IconProps } from "../icons-BYpJY6L2.js";
3
3
  import * as React from "react";
4
4
 
5
5
  //#region src/components/ChainOfThought.d.ts
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { a as CheckIcon, c as ChevronRightIcon, k as SpinnerIcon, u as DotIcon } from "../icons-CZRH4FVH.js";
3
+ import { A as SpinnerIcon, a as CheckIcon, c as ChevronRightIcon, u as DotIcon } from "../icons-BCNawx-T.js";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/ChainOfThought.tsx
@@ -1,2 +1,2 @@
1
- import { a as CodeBlockCopyButton, c as CodeBlockLanguageSelector, d as CodeBlockLanguageSelectorTrigger, f as CodeBlockLanguageSelectorValue, h as CODE_BLOCK_LANGUAGES, i as CodeBlockContent, l as CodeBlockLanguageSelectorContent, m as highlightCode, n as CodeBlockActions, o as CodeBlockFilename, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock, u as CodeBlockLanguageSelectorItem } from "../CodeBlock-D-a84xBL.js";
1
+ import { a as CodeBlockCopyButton, c as CodeBlockLanguageSelector, d as CodeBlockLanguageSelectorTrigger, f as CodeBlockLanguageSelectorValue, h as CODE_BLOCK_LANGUAGES, i as CodeBlockContent, l as CodeBlockLanguageSelectorContent, m as highlightCode, n as CodeBlockActions, o as CodeBlockFilename, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock, u as CodeBlockLanguageSelectorItem } from "../CodeBlock-BK0sOAbV.js";
2
2
  export { CODE_BLOCK_LANGUAGES, CodeBlock, CodeBlockActions, CodeBlockContainer, CodeBlockContent, CodeBlockCopyButton, CodeBlockFilename, CodeBlockHeader, CodeBlockLanguageSelector, CodeBlockLanguageSelectorContent, CodeBlockLanguageSelectorItem, CodeBlockLanguageSelectorTrigger, CodeBlockLanguageSelectorValue, CodeBlockTitle, highlightCode };
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { a as CheckIcon, c as ChevronRightIcon, l as CopyIcon, m as FileIcon } from "../icons-CZRH4FVH.js";
3
+ import { a as CheckIcon, c as ChevronRightIcon, l as CopyIcon, m as FileIcon } from "../icons-BCNawx-T.js";
4
4
  import { Button } from "./Button.js";
5
5
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
6
6
  import { Avatar } from "./Avatar.js";
@@ -1,4 +1,4 @@
1
- import { a as CheckIcon, c as ChevronRightIcon, u as DotIcon } from "../icons-CZRH4FVH.js";
1
+ import { a as CheckIcon, c as ChevronRightIcon, u as DotIcon } from "../icons-BCNawx-T.js";
2
2
  import "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { d as DownloadIcon, t as ArrowDownIcon } from "../icons-CZRH4FVH.js";
2
+ import { d as DownloadIcon, t as ArrowDownIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { useStickToBottom } from "./useStickToBottom.js";
5
5
  import * as React from "react";
@@ -1,4 +1,4 @@
1
- import { P as XIcon } from "../icons-CZRH4FVH.js";
1
+ import { F as XIcon } from "../icons-BCNawx-T.js";
2
2
  import "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Dialog as Dialog$1 } from "@base-ui/react/dialog";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { a as CheckIcon, f as EyeIcon, l as CopyIcon, p as EyeOffIcon } from "../icons-CZRH4FVH.js";
2
+ import { a as CheckIcon, f as EyeIcon, l as CopyIcon, p as EyeOffIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
5
  import { Badge } from "./Badge.js";
@@ -1,2 +1,2 @@
1
- import { a as FileTreeIcon, i as FileTreeFolder, n as FileTreeActions, o as FileTreeName, r as FileTreeFile, t as FileTree } from "../FileTree-D8rtTLgK.js";
1
+ import { a as FileTreeIcon, i as FileTreeFolder, n as FileTreeActions, o as FileTreeName, r as FileTreeFile, t as FileTree } from "../FileTree-BWQZ0FSi.js";
2
2
  export { FileTree, FileTreeActions, FileTreeFile, FileTreeFolder, FileTreeIcon, FileTreeName };
@@ -0,0 +1,39 @@
1
+ import * as React from "react";
2
+ import { Icon } from "@modelcontextprotocol/sdk/types.js";
3
+
4
+ //#region src/components/McpServerPicker.d.ts
5
+ type McpServerPickerStatus = "connecting" | "needs-auth" | "authenticating" | "ready" | "failed";
6
+ interface McpServerCard {
7
+ id: string;
8
+ name: string;
9
+ url: string;
10
+ description?: string;
11
+ category?: string;
12
+ icon?: React.ReactNode | string | Icon;
13
+ status?: McpServerPickerStatus;
14
+ statusLabel?: string;
15
+ }
16
+ interface McpServerPickerProps {
17
+ /** MCP servers to show in the plus-menu picker. */
18
+ servers: readonly McpServerCard[];
19
+ /** Called when the user chooses a server; hosts own OAuth and connection state. */
20
+ onConnect: (server: McpServerCard) => void | Promise<void>;
21
+ /** Offset from the plus trigger to the menu, useful for prompt composers. */
22
+ sideOffset?: number;
23
+ }
24
+ type McpServerPickerItemsProps = Pick<McpServerPickerProps, "servers" | "onConnect">;
25
+ /**
26
+ * Prompt plus-menu picker for choosing an MCP server and handing connection
27
+ * work back to the host app.
28
+ */
29
+ declare function McpServerPicker({
30
+ servers,
31
+ onConnect,
32
+ sideOffset
33
+ }: McpServerPickerProps): React.JSX.Element;
34
+ declare function McpServerPickerItems({
35
+ servers,
36
+ onConnect
37
+ }: McpServerPickerItemsProps): React.JSX.Element | React.JSX.Element[];
38
+ //#endregion
39
+ export { McpServerCard, McpServerPicker, McpServerPickerItems, McpServerPickerItemsProps, McpServerPickerProps, McpServerPickerStatus };
@@ -0,0 +1,140 @@
1
+ import { A as SpinnerIcon, D as PlusIcon, N as WarningIcon, a as CheckIcon } from "../icons-BCNawx-T.js";
2
+ import { Button } from "./Button.js";
3
+ import { MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuRoot, MenuShortcut, MenuTrigger } from "./Menu.js";
4
+ import * as React from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/McpServerPicker.tsx
7
+ /**
8
+ * Prompt plus-menu picker for choosing an MCP server and handing connection
9
+ * work back to the host app.
10
+ */
11
+ function McpServerPicker({ servers, onConnect, sideOffset = 80 }) {
12
+ return /* @__PURE__ */ jsx("div", {
13
+ className: "mcp-server-picker",
14
+ children: /* @__PURE__ */ jsxs(MenuRoot, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(Button, {
15
+ type: "button",
16
+ variant: "ghost",
17
+ color: "neutral",
18
+ size: "icon-xs",
19
+ className: "mcp-server-picker__trigger",
20
+ "aria-label": "Add MCP server",
21
+ children: /* @__PURE__ */ jsx(PlusIcon, {})
22
+ }) }), /* @__PURE__ */ jsx(MenuContent, {
23
+ side: "top",
24
+ align: "start",
25
+ sideOffset,
26
+ collisionPadding: 8,
27
+ "aria-label": "MCP servers",
28
+ className: "mcp-server-picker__popup",
29
+ children: /* @__PURE__ */ jsx(McpServerPickerItems, {
30
+ servers,
31
+ onConnect
32
+ })
33
+ })] })
34
+ });
35
+ }
36
+ function McpServerPickerItems({ servers, onConnect }) {
37
+ const groups = groupServers(servers);
38
+ const showHeadings = groups.some((group) => group.category);
39
+ if (servers.length === 0) return /* @__PURE__ */ jsx(MenuItem, {
40
+ disabled: true,
41
+ className: "mcp-server-picker__empty",
42
+ children: "No MCP servers available."
43
+ });
44
+ return groups.map((group) => /* @__PURE__ */ jsxs(MenuGroup, {
45
+ className: "mcp-server-picker__group",
46
+ children: [showHeadings ? /* @__PURE__ */ jsx(MenuGroupLabel, { children: group.category || "Servers" }) : null, group.servers.map((server) => /* @__PURE__ */ jsx(McpServerPickerRow, {
47
+ server,
48
+ onConnect
49
+ }, server.id))]
50
+ }, group.category));
51
+ }
52
+ function McpServerPickerRow({ server, onConnect }) {
53
+ const descriptionId = React.useId();
54
+ const statusText = server.statusLabel ?? getStatusLabel(server.status);
55
+ const busy = server.status === "connecting" || server.status === "authenticating";
56
+ return /* @__PURE__ */ jsxs(MenuItem, {
57
+ className: "mcp-server-picker__row",
58
+ "data-status": server.status,
59
+ "aria-busy": busy || void 0,
60
+ "aria-describedby": server.description ? descriptionId : void 0,
61
+ onClick: () => void onConnect(server),
62
+ children: [
63
+ /* @__PURE__ */ jsx("span", {
64
+ className: "mcp-server-picker__icon",
65
+ children: renderIcon(server.icon, server.name)
66
+ }),
67
+ /* @__PURE__ */ jsxs("span", {
68
+ className: "mcp-server-picker__copy",
69
+ children: [/* @__PURE__ */ jsx("span", {
70
+ className: "mcp-server-picker__name",
71
+ children: server.name
72
+ }), server.description ? /* @__PURE__ */ jsx("span", {
73
+ id: descriptionId,
74
+ className: "mcp-server-picker__description",
75
+ children: server.description
76
+ }) : null]
77
+ }),
78
+ statusText ? /* @__PURE__ */ jsxs(MenuShortcut, {
79
+ className: "mcp-server-picker__meta",
80
+ children: [/* @__PURE__ */ jsx(StatusIcon, { status: server.status }), /* @__PURE__ */ jsx("span", { children: statusText })]
81
+ }) : null
82
+ ]
83
+ });
84
+ }
85
+ function StatusIcon({ status }) {
86
+ if (status === "ready") return /* @__PURE__ */ jsx(CheckIcon, { size: 14 });
87
+ if (status === "failed" || status === "needs-auth") return /* @__PURE__ */ jsx(WarningIcon, { size: 14 });
88
+ if (status === "connecting" || status === "authenticating") return /* @__PURE__ */ jsx(SpinnerIcon, {
89
+ className: "mcp-server-picker__spinner",
90
+ size: 14
91
+ });
92
+ return null;
93
+ }
94
+ function getStatusLabel(status) {
95
+ if (status === "ready") return "Connected";
96
+ if (status === "failed") return "Failed";
97
+ if (status === "needs-auth") return "Authorize";
98
+ if (status === "authenticating") return "Authenticating";
99
+ if (status === "connecting") return "Connecting";
100
+ return "";
101
+ }
102
+ function renderIcon(icon, name) {
103
+ if (React.isValidElement(icon)) return icon;
104
+ if (typeof icon === "string") return /* @__PURE__ */ jsx(IconImage, { src: icon });
105
+ if (isMcpIcon(icon)) return /* @__PURE__ */ jsx(IconImage, { src: icon.src });
106
+ return /* @__PURE__ */ jsx("span", {
107
+ className: "mcp-server-picker__fallback-icon",
108
+ children: name.slice(0, 1)
109
+ });
110
+ }
111
+ function IconImage({ src }) {
112
+ return /* @__PURE__ */ jsx("img", {
113
+ src,
114
+ alt: "",
115
+ loading: "lazy",
116
+ decoding: "async",
117
+ referrerPolicy: "no-referrer"
118
+ });
119
+ }
120
+ function isMcpIcon(icon) {
121
+ return Boolean(icon && typeof icon === "object" && "src" in icon && typeof icon.src === "string");
122
+ }
123
+ function groupServers(servers) {
124
+ const groups = [];
125
+ for (const server of servers) {
126
+ const category = server.category ?? "";
127
+ let group = groups.find((candidate) => candidate.category === category);
128
+ if (!group) {
129
+ group = {
130
+ category,
131
+ servers: []
132
+ };
133
+ groups.push(group);
134
+ }
135
+ group.servers.push(server);
136
+ }
137
+ return groups;
138
+ }
139
+ //#endregion
140
+ export { McpServerPicker, McpServerPickerItems };
@@ -1,4 +1,4 @@
1
- import { a as CheckIcon, c as ChevronRightIcon, u as DotIcon } from "../icons-CZRH4FVH.js";
1
+ import { a as CheckIcon, c as ChevronRightIcon, u as DotIcon } from "../icons-BCNawx-T.js";
2
2
  import "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Menu } from "@base-ui/react/menu";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { m as FileIcon, n as ArrowLeftIcon, r as ArrowRightIcon } from "../icons-CZRH4FVH.js";
2
+ import { m as FileIcon, n as ArrowLeftIcon, r as ArrowRightIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
5
  import { t as AttachmentPreview } from "../attachment-preview-ChtC3HiU.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { O as SearchIcon, o as ChevronDownIcon } from "../icons-CZRH4FVH.js";
2
+ import { k as SearchIcon, o as ChevronDownIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Dialog, DialogBackdrop, DialogPopup, DialogPortal, DialogTitle, DialogTrigger } from "./Dialog.js";
5
5
  import * as React from "react";
@@ -1,4 +1,4 @@
1
- import { o as ChevronDownIcon } from "../icons-CZRH4FVH.js";
1
+ import { o as ChevronDownIcon } from "../icons-BCNawx-T.js";
2
2
  import * as React from "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { NavigationMenu as NavigationMenu$1 } from "@base-ui/react/navigation-menu";
@@ -1,6 +1,6 @@
1
1
  import { A as SelectTriggerProps, M as SelectValueProps, S as SelectProps, f as SelectOption, j as SelectValue, r as SelectContentProps, s as SelectItemProps, t as Select } from "../Select-CRsKCJ9x.js";
2
2
  import { c as ComboboxGroup, d as ComboboxLabel, f as ComboboxList, g as ComboboxTrigger, h as ComboboxSeparator, l as ComboboxInput, m as ComboboxPositioner, p as ComboboxPopup, s as ComboboxEmpty, t as Combobox, u as ComboboxItem } from "../Combobox-D9anamNr.js";
3
- import { h as MenuItemProps, w as MenuProps, y as MenuPopupProps } from "../Menu-B5vDqZe_.js";
3
+ import { h as MenuItemProps, l as MenuContentProps, w as MenuProps } from "../Menu-B5vDqZe_.js";
4
4
  import { c as TabsList, n as TabPanel, t as Tab } from "../Tabs-D9EAq09D.js";
5
5
  import { r as ButtonProps } from "../Button-Ct5I6aTu.js";
6
6
  import * as React from "react";
@@ -261,7 +261,7 @@ declare function PromptInputActionMenuTrigger({
261
261
  children,
262
262
  ...props
263
263
  }: PromptInputActionMenuTriggerProps): React.JSX.Element;
264
- type PromptInputActionMenuContentProps = MenuPopupProps;
264
+ type PromptInputActionMenuContentProps = MenuContentProps;
265
265
  declare function PromptInputActionMenuContent({
266
266
  className,
267
267
  children,
@@ -1,10 +1,10 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { A as SquareIcon, E as PlusIcon, M as WarningIcon, P as XIcon, S as MonitorIcon, _ as ImageIcon, i as ArrowUpIcon, k as SpinnerIcon, m as FileIcon, o as ChevronDownIcon, w as PencilIcon } from "../icons-CZRH4FVH.js";
2
+ import { A as SpinnerIcon, C as PaperclipIcon, D as PlusIcon, F as XIcon, N as WarningIcon, S as MonitorIcon, T as PencilIcon, i as ArrowUpIcon, j as SquareIcon, m as FileIcon, o as ChevronDownIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
5
  import { t as AttachmentPreview } from "../attachment-preview-ChtC3HiU.js";
6
6
  import { Combobox, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxList, ComboboxSeparator } from "./Combobox.js";
7
- import { MenuItem, MenuPopup, MenuPortal, MenuPositioner, MenuRadioGroup, MenuRadioItem, MenuRadioItemIndicator, MenuRoot, MenuTrigger } from "./Menu.js";
7
+ import { MenuContent, MenuItem, MenuPopup, MenuPortal, MenuPositioner, MenuRadioGroup, MenuRadioItem, MenuRadioItemIndicator, MenuRoot, MenuTrigger } from "./Menu.js";
8
8
  import { Select, SelectContent, SelectItem, SelectPortal, SelectPositioner, SelectTrigger, SelectValue } from "./Select.js";
9
9
  import { Tab, TabPanel, TabsList } from "./Tabs.js";
10
10
  import * as React from "react";
@@ -538,11 +538,11 @@ function PromptInputActionMenuTrigger({ className, children, ...props }) {
538
538
  }) });
539
539
  }
540
540
  function PromptInputActionMenuContent({ className, children, ...props }) {
541
- return /* @__PURE__ */ jsx(MenuPortal, { children: /* @__PURE__ */ jsx(MenuPositioner, { children: /* @__PURE__ */ jsx(MenuPopup, {
541
+ return /* @__PURE__ */ jsx(MenuContent, {
542
542
  className: cx("prompt-input__action-menu", className),
543
543
  ...props,
544
544
  children
545
- }) }) });
545
+ });
546
546
  }
547
547
  function PromptInputActionMenuItem({ className, ...props }) {
548
548
  return /* @__PURE__ */ jsx(MenuItem, {
@@ -550,7 +550,7 @@ function PromptInputActionMenuItem({ className, ...props }) {
550
550
  ...props
551
551
  });
552
552
  }
553
- function PromptInputActionAddAttachments({ label = "Add photos or files", onClick, children, ...props }) {
553
+ function PromptInputActionAddAttachments({ label = "Files and folders", onClick, children, ...props }) {
554
554
  const attachments = usePromptInputAttachments();
555
555
  return /* @__PURE__ */ jsx(PromptInputActionMenuItem, {
556
556
  ...props,
@@ -558,7 +558,7 @@ function PromptInputActionAddAttachments({ label = "Add photos or files", onClic
558
558
  onClick?.(event);
559
559
  if (!event.defaultPrevented) attachments.openFileDialog();
560
560
  },
561
- children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ImageIcon, { className: "prompt-input__action-menu-icon" }), label] })
561
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(PaperclipIcon, { className: "prompt-input__action-menu-icon" }), label] })
562
562
  });
563
563
  }
564
564
  function PromptInputActionAddScreenshot({ label = "Take screenshot", onClick, children, ...props }) {
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { a as CheckIcon, c as ChevronRightIcon, m as FileIcon, u as DotIcon } from "../icons-CZRH4FVH.js";
3
+ import { a as CheckIcon, c as ChevronRightIcon, m as FileIcon, u as DotIcon } from "../icons-BCNawx-T.js";
4
4
  import { Button } from "./Button.js";
5
5
  import { Badge } from "./Badge.js";
6
6
  import { ScrollArea } from "./ScrollArea.js";
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { c as ChevronRightIcon } from "../icons-CZRH4FVH.js";
3
+ import { c as ChevronRightIcon } from "../icons-BCNawx-T.js";
4
4
  import * as React from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { cjk } from "@streamdown/cjk";
@@ -1,4 +1,4 @@
1
- import { a as CheckIcon, i as ArrowUpIcon, t as ArrowDownIcon } from "../icons-CZRH4FVH.js";
1
+ import { a as CheckIcon, i as ArrowUpIcon, t as ArrowDownIcon } from "../icons-BCNawx-T.js";
2
2
  import * as React from "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Select as Select$1 } from "@base-ui/react/select";
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { c as ChevronRightIcon, y as LinkIcon } from "../icons-CZRH4FVH.js";
3
+ import { c as ChevronRightIcon, y as LinkIcon } from "../icons-BCNawx-T.js";
4
4
  import "react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/Sources.tsx
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { a as CheckIcon, k as SpinnerIcon } from "../icons-CZRH4FVH.js";
2
+ import { A as SpinnerIcon, a as CheckIcon } from "../icons-BCNawx-T.js";
3
3
  import * as React from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/Stepper.tsx
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { O as SearchIcon, c as ChevronRightIcon, m as FileIcon } from "../icons-CZRH4FVH.js";
3
+ import { c as ChevronRightIcon, k as SearchIcon, m as FileIcon } from "../icons-BCNawx-T.js";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/Task.tsx
@@ -1,8 +1,8 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { P as XIcon, j as TerminalIcon } from "../icons-CZRH4FVH.js";
2
+ import { F as XIcon, M as TerminalIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
- import { t as CopyButton } from "../copy-button-BmJEAKuP.js";
5
+ import { t as CopyButton } from "../copy-button-CB2MWcau.js";
6
6
  import { Badge } from "./Badge.js";
7
7
  import { ScrollArea } from "./ScrollArea.js";
8
8
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import { CollapsiblePanel, CollapsibleRoot, CollapsibleTrigger } from "./Collapsible.js";
2
2
  import { t as cx } from "../class-names-9UtZwb0J.js";
3
- import { P as XIcon, a as CheckIcon, c as ChevronRightIcon, k as SpinnerIcon } from "../icons-CZRH4FVH.js";
3
+ import { A as SpinnerIcon, F as XIcon, a as CheckIcon, c as ChevronRightIcon } from "../icons-BCNawx-T.js";
4
4
  import { Badge } from "./Badge.js";
5
5
  import * as React from "react";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -31,6 +31,8 @@ interface ThinkChatMessagesProps extends ThinkChatActivityRendererOptions {
31
31
  emptyState?: React.ReactNode;
32
32
  /** Extra controls rendered inside the composer, next to the send button. */
33
33
  composerTools?: React.ReactNode;
34
+ /** Extra rows rendered in the built-in plus menu after files. */
35
+ composerAddMenuItems?: AgentChatProps["composerAddMenuItems"];
34
36
  /** Composer placeholder text. */
35
37
  placeholder?: string;
36
38
  /** Rendered after each message (e.g. per-message actions). */
@@ -1,7 +1,7 @@
1
1
  import { Activity, ActivityContent, ActivityItem, ActivityItemGroup, ActivityOutput, ActivityPanel, ActivityText, ActivityTrigger } from "./Activity.js";
2
2
  import { Tab, TabPanel, Tabs, TabsList } from "./Tabs.js";
3
3
  import { AgentChat } from "./AgentChat.js";
4
- import { t as CodeBlock } from "../CodeBlock-D-a84xBL.js";
4
+ import { t as CodeBlock } from "../CodeBlock-BK0sOAbV.js";
5
5
  import { BrowserLiveView } from "./BrowserLiveView.js";
6
6
  import { BrowserReplay } from "./BrowserReplay.js";
7
7
  import { WorkspaceExplorer, inferWorkspaceLanguage, useWorkspace } from "./WorkspaceExplorer.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { D as RefreshIcon, n as ArrowLeftIcon, o as ChevronDownIcon, r as ArrowRightIcon } from "../icons-CZRH4FVH.js";
2
+ import { O as RefreshIcon, n as ArrowLeftIcon, o as ChevronDownIcon, r as ArrowRightIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./Tooltip.js";
5
5
  import { Badge } from "./Badge.js";
@@ -1,8 +1,8 @@
1
1
  import { t as cx } from "../class-names-9UtZwb0J.js";
2
- import { D as RefreshIcon, O as SearchIcon, m as FileIcon, n as ArrowLeftIcon } from "../icons-CZRH4FVH.js";
2
+ import { O as RefreshIcon, k as SearchIcon, m as FileIcon, n as ArrowLeftIcon } from "../icons-BCNawx-T.js";
3
3
  import { Button } from "./Button.js";
4
- import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, o as CodeBlockFilename, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../CodeBlock-D-a84xBL.js";
5
- import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-D8rtTLgK.js";
4
+ import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, o as CodeBlockFilename, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../CodeBlock-BK0sOAbV.js";
5
+ import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-BWQZ0FSi.js";
6
6
  import * as React from "react";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region src/components/WorkspaceExplorer.tsx
@@ -1,2 +1,2 @@
1
- import { A as SpinnerIcon, C as MonitorIcon, D as PlusIcon, E as PlayIcon, F as XIcon, M as TerminalIcon, N as WarningIcon, O as RefreshIcon, P as WrenchIcon, S as MinusIcon, T as PencilIcon, _ as IconProps, a as CheckIcon, b as LinkIcon, c as ChevronRightIcon, d as DownloadIcon, f as EyeIcon, g as FolderOpenIcon, h as FolderIcon, i as ArrowUpIcon, j as SquareIcon, k as SearchIcon, l as CopyIcon, m as FileIcon, n as ArrowLeftIcon, o as ChevronDownIcon, p as EyeOffIcon, r as ArrowRightIcon, s as ChevronLeftIcon, t as ArrowDownIcon, u as DotIcon, v as ImageIcon, w as PauseIcon, x as MaximizeIcon, y as InfoIcon } from "../icons-CmO7-pNY.js";
2
- export { ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DotIcon, DownloadIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, IconProps, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, MinusIcon, MonitorIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, RefreshIcon, SearchIcon, SpinnerIcon, SquareIcon, TerminalIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { A as SearchIcon, C as MonitorIcon, D as PlayIcon, E as PencilIcon, F as WrenchIcon, I as XIcon, M as SquareIcon, N as TerminalIcon, O as PlusIcon, P as WarningIcon, S as MinusIcon, T as PauseIcon, _ as IconProps, a as CheckIcon, b as LinkIcon, c as ChevronRightIcon, d as DownloadIcon, f as EyeIcon, g as FolderOpenIcon, h as FolderIcon, i as ArrowUpIcon, j as SpinnerIcon, k as RefreshIcon, l as CopyIcon, m as FileIcon, n as ArrowLeftIcon, o as ChevronDownIcon, p as EyeOffIcon, r as ArrowRightIcon, s as ChevronLeftIcon, t as ArrowDownIcon, u as DotIcon, v as ImageIcon, w as PaperclipIcon, x as MaximizeIcon, y as InfoIcon } from "../icons-BYpJY6L2.js";
2
+ export { ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DotIcon, DownloadIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, IconProps, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, MinusIcon, MonitorIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, RefreshIcon, SearchIcon, SpinnerIcon, SquareIcon, TerminalIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,2 +1,2 @@
1
- import { A as SquareIcon, C as PauseIcon, D as RefreshIcon, E as PlusIcon, M as WarningIcon, N as WrenchIcon, O as SearchIcon, P as XIcon, S as MonitorIcon, T as PlayIcon, _ as ImageIcon, a as CheckIcon, b as MaximizeIcon, c as ChevronRightIcon, d as DownloadIcon, f as EyeIcon, g as FolderOpenIcon, h as FolderIcon, i as ArrowUpIcon, j as TerminalIcon, k as SpinnerIcon, l as CopyIcon, m as FileIcon, n as ArrowLeftIcon, o as ChevronDownIcon, p as EyeOffIcon, r as ArrowRightIcon, s as ChevronLeftIcon, t as ArrowDownIcon, u as DotIcon, v as InfoIcon, w as PencilIcon, x as MinusIcon, y as LinkIcon } from "../icons-CZRH4FVH.js";
2
- export { ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DotIcon, DownloadIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, MinusIcon, MonitorIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, RefreshIcon, SearchIcon, SpinnerIcon, SquareIcon, TerminalIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { A as SpinnerIcon, C as PaperclipIcon, D as PlusIcon, E as PlayIcon, F as XIcon, M as TerminalIcon, N as WarningIcon, O as RefreshIcon, P as WrenchIcon, S as MonitorIcon, T as PencilIcon, _ as ImageIcon, a as CheckIcon, b as MaximizeIcon, c as ChevronRightIcon, d as DownloadIcon, f as EyeIcon, g as FolderOpenIcon, h as FolderIcon, i as ArrowUpIcon, j as SquareIcon, k as SearchIcon, l as CopyIcon, m as FileIcon, n as ArrowLeftIcon, o as ChevronDownIcon, p as EyeOffIcon, r as ArrowRightIcon, s as ChevronLeftIcon, t as ArrowDownIcon, u as DotIcon, v as InfoIcon, w as PauseIcon, x as MinusIcon, y as LinkIcon } from "../icons-BCNawx-T.js";
2
+ export { ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DotIcon, DownloadIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, MinusIcon, MonitorIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, RefreshIcon, SearchIcon, SpinnerIcon, SquareIcon, TerminalIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,4 +1,4 @@
1
- import { a as CheckIcon, l as CopyIcon } from "./icons-CZRH4FVH.js";
1
+ import { a as CheckIcon, l as CopyIcon } from "./icons-BCNawx-T.js";
2
2
  import { Button } from "./components/Button.js";
3
3
  import { Tooltip, TooltipPopup, TooltipPortal, TooltipPositioner, TooltipTrigger } from "./components/Tooltip.js";
4
4
  import * as React from "react";
@@ -80,6 +80,10 @@ const FileIcon = (props) => /* @__PURE__ */ jsxs(Icon, {
80
80
  ...props,
81
81
  children: [/* @__PURE__ */ jsx("path", { d: "M9 1.5H4A1.5 1.5 0 0 0 2.5 3v10A1.5 1.5 0 0 0 4 14.5h8A1.5 1.5 0 0 0 13.5 13V6L9 1.5Z" }), /* @__PURE__ */ jsx("path", { d: "M9 1.5V6h4.5" })]
82
82
  });
83
+ const PaperclipIcon = (props) => /* @__PURE__ */ jsxs(Icon, {
84
+ ...props,
85
+ children: [/* @__PURE__ */ jsx("path", { d: "M5.25 8.25 9.9 3.6a2.45 2.45 0 0 1 3.5 3.45l-5.6 5.6a3.25 3.25 0 0 1-4.6-4.6l5.4-5.4" }), /* @__PURE__ */ jsx("path", { d: "M6.6 9.6 11 5.2" })]
86
+ });
83
87
  const PlusIcon = (props) => /* @__PURE__ */ jsx(Icon, {
84
88
  ...props,
85
89
  children: /* @__PURE__ */ jsx("path", { d: "M8 3v10M3 8h10" })
@@ -248,4 +252,4 @@ const MaximizeIcon = (props) => /* @__PURE__ */ jsxs(Icon, {
248
252
  ]
249
253
  });
250
254
  //#endregion
251
- export { SquareIcon as A, PauseIcon as C, RefreshIcon as D, PlusIcon as E, WarningIcon as M, WrenchIcon as N, SearchIcon as O, XIcon as P, MonitorIcon as S, PlayIcon as T, ImageIcon as _, CheckIcon as a, MaximizeIcon as b, ChevronRightIcon as c, DownloadIcon as d, EyeIcon as f, FolderOpenIcon as g, FolderIcon as h, ArrowUpIcon as i, TerminalIcon as j, SpinnerIcon as k, CopyIcon as l, FileIcon as m, ArrowLeftIcon as n, ChevronDownIcon as o, EyeOffIcon as p, ArrowRightIcon as r, ChevronLeftIcon as s, ArrowDownIcon as t, DotIcon as u, InfoIcon as v, PencilIcon as w, MinusIcon as x, LinkIcon as y };
255
+ export { SpinnerIcon as A, PaperclipIcon as C, PlusIcon as D, PlayIcon as E, XIcon as F, TerminalIcon as M, WarningIcon as N, RefreshIcon as O, WrenchIcon as P, MonitorIcon as S, PencilIcon as T, ImageIcon as _, CheckIcon as a, MaximizeIcon as b, ChevronRightIcon as c, DownloadIcon as d, EyeIcon as f, FolderOpenIcon as g, FolderIcon as h, ArrowUpIcon as i, SquareIcon as j, SearchIcon as k, CopyIcon as l, FileIcon as m, ArrowLeftIcon as n, ChevronDownIcon as o, EyeOffIcon as p, ArrowRightIcon as r, ChevronLeftIcon as s, ArrowDownIcon as t, DotIcon as u, InfoIcon as v, PauseIcon as w, MinusIcon as x, LinkIcon as y };
@@ -22,6 +22,7 @@ declare const EyeOffIcon: (props: IconProps) => React.JSX.Element;
22
22
  declare const FolderIcon: (props: IconProps) => React.JSX.Element;
23
23
  declare const FolderOpenIcon: (props: IconProps) => React.JSX.Element;
24
24
  declare const FileIcon: (props: IconProps) => React.JSX.Element;
25
+ declare const PaperclipIcon: (props: IconProps) => React.JSX.Element;
25
26
  declare const PlusIcon: (props: IconProps) => React.JSX.Element;
26
27
  declare const MinusIcon: (props: IconProps) => React.JSX.Element;
27
28
  declare const PlayIcon: (props: IconProps) => React.JSX.Element;
@@ -45,4 +46,4 @@ declare const ImageIcon: (props: IconProps) => React.JSX.Element;
45
46
  declare const MonitorIcon: (props: IconProps) => React.JSX.Element;
46
47
  declare const MaximizeIcon: (props: IconProps) => React.JSX.Element;
47
48
  //#endregion
48
- export { SpinnerIcon as A, MonitorIcon as C, PlusIcon as D, PlayIcon as E, XIcon as F, TerminalIcon as M, WarningIcon as N, RefreshIcon as O, WrenchIcon as P, MinusIcon as S, PencilIcon as T, IconProps as _, CheckIcon as a, LinkIcon as b, ChevronRightIcon as c, DownloadIcon as d, EyeIcon as f, FolderOpenIcon as g, FolderIcon as h, ArrowUpIcon as i, SquareIcon as j, SearchIcon as k, CopyIcon as l, FileIcon as m, ArrowLeftIcon as n, ChevronDownIcon as o, EyeOffIcon as p, ArrowRightIcon as r, ChevronLeftIcon as s, ArrowDownIcon as t, DotIcon as u, ImageIcon as v, PauseIcon as w, MaximizeIcon as x, InfoIcon as y };
49
+ export { SearchIcon as A, MonitorIcon as C, PlayIcon as D, PencilIcon as E, WrenchIcon as F, XIcon as I, SquareIcon as M, TerminalIcon as N, PlusIcon as O, WarningIcon as P, MinusIcon as S, PauseIcon as T, IconProps as _, CheckIcon as a, LinkIcon as b, ChevronRightIcon as c, DownloadIcon as d, EyeIcon as f, FolderOpenIcon as g, FolderIcon as h, ArrowUpIcon as i, SpinnerIcon as j, RefreshIcon as k, CopyIcon as l, FileIcon as m, ArrowLeftIcon as n, ChevronDownIcon as o, EyeOffIcon as p, ArrowRightIcon as r, ChevronLeftIcon as s, ArrowDownIcon as t, DotIcon as u, ImageIcon as v, PaperclipIcon as w, MaximizeIcon as x, InfoIcon as y };
@@ -38,6 +38,19 @@
38
38
  );
39
39
  }
40
40
 
41
+ .agent-chat__composer > .prompt-input {
42
+ max-inline-size: 64rem;
43
+ margin-inline: auto;
44
+ }
45
+
46
+ .agent-chat__add-menu {
47
+ inline-size: min(32rem, calc(100dvw - 1rem));
48
+ max-block-size: min(28rem, calc(100dvh - 2rem));
49
+ overflow-y: auto;
50
+ overscroll-behavior: contain;
51
+ scrollbar-gutter: stable;
52
+ }
53
+
41
54
  /* Transient status pill between transcript and composer (recovery, errors). */
42
55
  .agent-chat__notice {
43
56
  display: flex;
@@ -37,6 +37,7 @@
37
37
  @import "./nanite-scene.css" layer(components);
38
38
  @import "./number-field.css" layer(components);
39
39
  @import "./popover.css" layer(components);
40
+ @import "./mcp-server-picker.css" layer(components);
40
41
  @import "./preview-card.css" layer(components);
41
42
  @import "./progress.css" layer(components);
42
43
  @import "./radio.css" layer(components);
@@ -0,0 +1,138 @@
1
+ .mcp-server-picker {
2
+ display: inline-flex;
3
+ }
4
+
5
+ .mcp-server-picker__trigger {
6
+ flex-shrink: 0;
7
+ color: var(--sigvelo-color-text);
8
+ background: none;
9
+ }
10
+
11
+ .mcp-server-picker__trigger:hover:not([data-disabled]),
12
+ .mcp-server-picker__trigger[data-popup-open] {
13
+ color: var(--sigvelo-color-text);
14
+ background: none;
15
+ }
16
+
17
+ .mcp-server-picker__popup {
18
+ inline-size: min(32rem, calc(100dvw - 1rem));
19
+ max-block-size: min(28rem, calc(100dvh - 2rem));
20
+ overflow-y: auto;
21
+ scrollbar-gutter: stable;
22
+ overscroll-behavior: contain;
23
+ }
24
+
25
+ .mcp-server-picker__group + .mcp-server-picker__group {
26
+ margin-block-start: 0.25rem;
27
+ }
28
+
29
+ .mcp-server-picker__row {
30
+ min-block-size: 2.5rem;
31
+ gap: 0.75rem;
32
+ overflow: hidden;
33
+ }
34
+
35
+ .mcp-server-picker__icon {
36
+ display: inline-flex;
37
+ flex: 0 0 auto;
38
+ align-items: center;
39
+ justify-content: center;
40
+ inline-size: 1.5rem;
41
+ block-size: 1.5rem;
42
+ color: var(--sigvelo-color-text-muted);
43
+ }
44
+
45
+ .mcp-server-picker__icon > img,
46
+ .mcp-server-picker__icon > svg {
47
+ display: block;
48
+ inline-size: 1.25rem;
49
+ block-size: 1.25rem;
50
+ object-fit: contain;
51
+ }
52
+
53
+ .mcp-server-picker__fallback-icon {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ inline-size: 1.375rem;
58
+ block-size: 1.375rem;
59
+ border-radius: var(--sigvelo-radius-sm);
60
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
61
+ color: var(--sigvelo-color-neutral-text-on-subtle);
62
+ font-size: 0.75rem;
63
+ font-weight: var(--sigvelo-font-weight-bold);
64
+ line-height: 1;
65
+ text-transform: uppercase;
66
+ }
67
+
68
+ .mcp-server-picker__copy {
69
+ display: flex;
70
+ align-items: baseline;
71
+ gap: 0.625rem;
72
+ min-inline-size: 0;
73
+ }
74
+
75
+ .mcp-server-picker__name {
76
+ flex: 0 0 auto;
77
+ color: var(--sigvelo-color-text);
78
+ }
79
+
80
+ .mcp-server-picker__description {
81
+ min-inline-size: 0;
82
+ overflow: hidden;
83
+ color: var(--sigvelo-color-text-muted);
84
+ text-overflow: ellipsis;
85
+ white-space: nowrap;
86
+ }
87
+
88
+ .mcp-server-picker__meta {
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: 0.375rem;
92
+ min-inline-size: max-content;
93
+ }
94
+
95
+ .mcp-server-picker__row[data-status="ready"] .mcp-server-picker__meta {
96
+ color: var(--sigvelo-color-success-text-on-subtle);
97
+ }
98
+
99
+ .mcp-server-picker__row[data-status="needs-auth"] .mcp-server-picker__meta {
100
+ color: var(--sigvelo-color-warning-text-on-subtle);
101
+ }
102
+
103
+ .mcp-server-picker__row[data-status="failed"] .mcp-server-picker__meta {
104
+ color: var(--sigvelo-color-danger-text-on-subtle);
105
+ }
106
+
107
+ .mcp-server-picker__spinner {
108
+ animation: mcp-server-picker-spin 900ms linear infinite;
109
+ }
110
+
111
+ .mcp-server-picker__empty {
112
+ padding-block: 0.5rem;
113
+ padding-inline: 0.75rem;
114
+ color: var(--sigvelo-color-text-muted);
115
+ font-size: 0.875rem;
116
+ }
117
+
118
+ @media (width < 30rem) {
119
+ .mcp-server-picker__copy {
120
+ flex-direction: column;
121
+ gap: 0;
122
+ }
123
+ }
124
+
125
+ @media (forced-colors: active) {
126
+ .mcp-server-picker__fallback-icon {
127
+ border: 1px solid ButtonText;
128
+ }
129
+ }
130
+
131
+ @keyframes mcp-server-picker-spin {
132
+ from {
133
+ transform: rotate(0deg);
134
+ }
135
+ to {
136
+ transform: rotate(360deg);
137
+ }
138
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/react-components",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "MCP-B React components built on Base UI and shared design tokens, including Cloudflare Think chat primitives.",
5
5
  "homepage": "https://design-system.sigvelo.com",
6
6
  "bugs": {
@@ -49,13 +49,14 @@
49
49
  "anser": "^2.3.5",
50
50
  "shiki": "^3.23.0",
51
51
  "streamdown": "^2.5.0",
52
- "@mcp-b/design-tokens": "0.5.3"
52
+ "@mcp-b/design-tokens": "0.5.5"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@ai-sdk/react": "^3.0.194",
56
56
  "@cloudflare/shell": "^0.4.1",
57
57
  "@cloudflare/think": "^0.12.1",
58
58
  "@cloudflare/workers-types": "^4.20260630.1",
59
+ "@modelcontextprotocol/sdk": "^1.29.0",
59
60
  "@storybook/addon-a11y": "^10.4.6",
60
61
  "@storybook/addon-docs": "^10.4.6",
61
62
  "@storybook/addon-mcp": "^0.6.0",
@@ -83,6 +84,7 @@
83
84
  "@ai-sdk/react": "^3.0.194",
84
85
  "@cloudflare/shell": "^0.4.1",
85
86
  "@cloudflare/think": "^0.12.1",
87
+ "@modelcontextprotocol/sdk": "^1.29.0",
86
88
  "agents": "^0.17.3",
87
89
  "ai": "^6.0.182",
88
90
  "react": "^19.0.0",
@@ -98,6 +100,9 @@
98
100
  "@cloudflare/think": {
99
101
  "optional": true
100
102
  },
103
+ "@modelcontextprotocol/sdk": {
104
+ "optional": true
105
+ },
101
106
  "agents": {
102
107
  "optional": true
103
108
  },