@mcp-b/react-components 0.46.3 → 0.46.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 (29) hide show
  1. package/dist/{McpConnectorForm-BETdVBRk.d.ts → McpConnectorForm-CeYNY0MI.d.ts} +1 -1
  2. package/dist/{McpPluginCatalog-C6ip9IvL.d.ts → McpPluginCatalog-3qWu8oK1.d.ts} +2 -2
  3. package/dist/{Workspace-jdVZ9S0a.d.ts → Workspace-BGhTdDTI.d.ts} +2 -3
  4. package/dist/assets/browser-control-cursor.png +0 -0
  5. package/dist/components/agents-sdk/ManagerOffice.d.ts +5 -17
  6. package/dist/components/agents-sdk/ManagerOffice.js +11 -1
  7. package/dist/components/agents-sdk/McpConnectionRequest.d.ts +1 -1
  8. package/dist/components/agents-sdk/McpConnectorForm.d.ts +1 -1
  9. package/dist/components/agents-sdk/McpPluginCatalog.d.ts +1 -1
  10. package/dist/components/agents-sdk/McpServerPicker.d.ts +2 -2
  11. package/dist/components/agents-sdk/ThinkFullApp.d.ts +2 -2
  12. package/dist/components/agents-sdk/ThinkSidepanel.d.ts +9 -15
  13. package/dist/components/agents-sdk/ThinkSidepanel.js +1 -1
  14. package/dist/components/agents-sdk/Workspace.d.ts +1 -1
  15. package/dist/components/agents-sdk/WorkspaceBrowser.d.ts +1 -1
  16. package/dist/components/agents-sdk/WorkspaceExplorer.d.ts +1 -1
  17. package/dist/components/extension/CodexModelSelector.d.ts +2 -2
  18. package/dist/components/extension/CodexModelSelector.js +1 -1
  19. package/dist/components/extension/ConversationTabPicker.d.ts +5 -5
  20. package/dist/components/extension/ConversationTabPicker.js +4 -4
  21. package/dist/components/general-purpose/SettingsFormDialog.d.ts +7 -7
  22. package/dist/components/general-purpose/SettingsFormDialog.js +3 -2
  23. package/dist/{mcp-server-catalog-Cbu483Zb.d.ts → mcp-server-catalog-C_g7C-9o.d.ts} +24 -0
  24. package/dist/styles/browser-control-overlay.css +46 -80
  25. package/dist/styles/extension-status.css +46 -0
  26. package/dist/styles/index.css +0 -1
  27. package/dist/utils/mcp-server-catalog.d.ts +1 -1
  28. package/dist/utils/mcp-server-catalog.js +69 -1
  29. package/package.json +3 -2
@@ -1,4 +1,4 @@
1
- import { d as McpServerSetupAuthFieldName, l as McpServerSetupAuth } from "./mcp-server-catalog-Cbu483Zb.js";
1
+ import { d as McpServerSetupAuthFieldName, l as McpServerSetupAuth } from "./mcp-server-catalog-C_g7C-9o.js";
2
2
  import * as React from "react";
3
3
 
4
4
  //#region src/components/agents-sdk/McpConnectorForm.d.ts
@@ -1,5 +1,5 @@
1
- import { o as McpServerCard } from "./mcp-server-catalog-Cbu483Zb.js";
2
- import { r as McpConnectorFormValues } from "./McpConnectorForm-BETdVBRk.js";
1
+ import { o as McpServerCard } from "./mcp-server-catalog-C_g7C-9o.js";
2
+ import { r as McpConnectorFormValues } from "./McpConnectorForm-CeYNY0MI.js";
3
3
  import { l as DialogProps } from "./Dialog-B_FhRWaz.js";
4
4
  import * as React from "react";
5
5
  import { MCPServersState } from "agents";
@@ -1,13 +1,12 @@
1
1
  import { a as WorkspaceMediaInfo, i as WorkspaceFileState, r as WorkspaceFileAssetResolver, t as WorkspaceFileAsset } from "./WorkspaceFile-Dq-GC0_T.js";
2
2
  import { DataTag, QueryKey, UnusedSkipTokenOptions } from "@tanstack/react-query";
3
- import { WorkspaceLike } from "@cloudflare/think";
4
3
  import { FileInfo, Workspace } from "@cloudflare/shell";
5
4
 
6
5
  //#region src/components/agents-sdk/Workspace.d.ts
7
6
  /** Workspace summary, as returned by `Workspace.getWorkspaceInfo()` upstream. */
8
7
  type WorkspaceInfo = Awaited<ReturnType<Workspace["getWorkspaceInfo"]>>;
9
- /** Whole upstream workspace shapes, accepted without narrowing or mirroring. */
10
- type WorkspaceSource = Workspace | WorkspaceLike;
8
+ /** The exact read surface used by the workspace browser. */
9
+ type WorkspaceSource = Pick<Workspace, "readDir" | "readFile" | "readFileBytes" | "stat"> & Partial<Pick<Workspace, "getWorkspaceInfo">>;
11
10
  interface UseWorkspaceOptions {
12
11
  /** Must be referentially stable (memoize in the app). */
13
12
  source: WorkspaceSource;
@@ -1,4 +1,5 @@
1
1
  import { n as ResponsiveSidebarShell } from "../../ResponsiveSidebarShell-BTVPxLJK.js";
2
+ import { ThinkRoutine } from "./ThinkRoutine.js";
2
3
  import * as React from "react";
3
4
 
4
5
  //#region src/components/agents-sdk/ManagerOffice.d.ts
@@ -44,20 +45,6 @@ interface ManagerOfficeWork {
44
45
  /** Unix timestamp in milliseconds of the latest lifecycle transition. */
45
46
  updatedAt: number;
46
47
  }
47
- interface ManagerOfficeRoutine {
48
- /** Stable routine identity. */
49
- id: string;
50
- /** Human-readable recurring responsibility. */
51
- name: string;
52
- /** Human-readable schedule supplied by the host. */
53
- schedule: string;
54
- /** Whether future occurrences are enabled. */
55
- enabled: boolean;
56
- /** Completed runs among the bounded recent run history. */
57
- completedRuns: number;
58
- /** Terminal runs among the bounded recent run history. */
59
- finishedRuns: number;
60
- }
61
48
  /** Which way work moves through a channel, from the employee's side. */
62
49
  type ManagerOfficeChannelDirection = "input" | "output" | "both";
63
50
  type ManagerOfficeChannelStatus = "connected" | "needs-auth" | "error";
@@ -117,7 +104,8 @@ interface ManagerOfficeConnectedEmployee extends ManagerOfficeEmployeeBase {
117
104
  role: string;
118
105
  handoffs: readonly ManagerOfficeHandoff[];
119
106
  work: readonly ManagerOfficeWork[];
120
- routines: readonly ManagerOfficeRoutine[];
107
+ /** Whole upstream-backed routines, including their native task, schedule, and runs. */
108
+ routines: readonly ThinkRoutine[];
121
109
  /** Every service the employee reads from or acts on. Empty is meaningful. */
122
110
  channels: readonly ManagerOfficeChannel[];
123
111
  /** The live tab the manager can glance at from the office. */
@@ -151,7 +139,7 @@ type ManagerOfficeDestination = {
151
139
  } | {
152
140
  kind: "routine";
153
141
  employee: ManagerOfficeConnectedEmployee;
154
- routine: ManagerOfficeRoutine;
142
+ routine: ThinkRoutine;
155
143
  } | {
156
144
  kind: "new-work";
157
145
  employee: ManagerOfficeConnectedEmployee;
@@ -260,4 +248,4 @@ declare function ManagerOffice({
260
248
  ...props
261
249
  }: ManagerOfficeProps): React.JSX.Element;
262
250
  //#endregion
263
- export { ManagerOffice, ManagerOfficeAnalyticsPoint, ManagerOfficeBrowserPreview, ManagerOfficeChannel, ManagerOfficeChannelDirection, ManagerOfficeChannelStatus, ManagerOfficeConnectedEmployee, ManagerOfficeDestination, ManagerOfficeDisconnectedEmployee, ManagerOfficeEmployee, ManagerOfficeEmployeeAnalytics, ManagerOfficeEmployeeStatus, ManagerOfficeHandoff, ManagerOfficeProps, ManagerOfficeReportSelection, ManagerOfficeRoutine, ManagerOfficeSidebar, ManagerOfficeSidebarAlert, ManagerOfficeSidebarAlertProps, ManagerOfficeSidebarProps, ManagerOfficeView, ManagerOfficeWork, ManagerOfficeWorkStatus };
251
+ export { ManagerOffice, ManagerOfficeAnalyticsPoint, ManagerOfficeBrowserPreview, ManagerOfficeChannel, ManagerOfficeChannelDirection, ManagerOfficeChannelStatus, ManagerOfficeConnectedEmployee, ManagerOfficeDestination, ManagerOfficeDisconnectedEmployee, ManagerOfficeEmployee, ManagerOfficeEmployeeAnalytics, ManagerOfficeEmployeeStatus, ManagerOfficeHandoff, ManagerOfficeProps, ManagerOfficeReportSelection, ManagerOfficeSidebar, ManagerOfficeSidebarAlert, ManagerOfficeSidebarAlertProps, ManagerOfficeSidebarProps, ManagerOfficeView, ManagerOfficeWork, ManagerOfficeWorkStatus };
@@ -15,6 +15,7 @@ import { LinkButton } from "../foundations/LinkButton.js";
15
15
  import "../foundations/icons.js";
16
16
  import { AppTopBar } from "../general-purpose/AppTopBar.js";
17
17
  import { ResponsiveSidebarShell } from "../general-purpose/ResponsiveSidebarShell.js";
18
+ import { getThinkExecutionRunStatus } from "./ThinkExecutionRun.js";
18
19
  import * as React from "react";
19
20
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
21
  //#region src/components/_internal/chrome-profile-colors.ts
@@ -354,6 +355,15 @@ function relativeTime(timestamp, now) {
354
355
  if (elapsed < day) return `${Math.floor(elapsed / hour)}h`;
355
356
  return `${Math.floor(elapsed / day)}d`;
356
357
  }
358
+ function routineDetail(routine) {
359
+ const schedule = routine.enabled ? routine.task.schedule : `Paused · ${routine.task.schedule}`;
360
+ const finishedRuns = routine.runs.filter((run) => run.completedAt != null);
361
+ if (!finishedRuns.length) return schedule;
362
+ return `${schedule} · ${finishedRuns.filter((run) => {
363
+ const status = getThinkExecutionRunStatus(run);
364
+ return status === "completed" || status === "complete";
365
+ }).length} of ${finishedRuns.length} recent runs completed`;
366
+ }
357
367
  function Timestamp({ now, timestamp }) {
358
368
  const date = new Date(timestamp);
359
369
  return /* @__PURE__ */ jsx("time", {
@@ -1598,7 +1608,7 @@ function EmployeeDetail({ employee, renderLink, now, profileColor }) {
1598
1608
  children: routine.name
1599
1609
  }), /* @__PURE__ */ jsx("small", {
1600
1610
  className: "sigvelo-truncate",
1601
- children: routine.enabled ? routine.schedule : `Paused · ${routine.schedule}`
1611
+ children: routineDetail(routine)
1602
1612
  })]
1603
1613
  }),
1604
1614
  /* @__PURE__ */ jsx(ChevronRightIcon, { className: "manager-office__row-chevron" })
@@ -1,4 +1,4 @@
1
- import { o as McpServerCard } from "../../mcp-server-catalog-Cbu483Zb.js";
1
+ import { o as McpServerCard } from "../../mcp-server-catalog-C_g7C-9o.js";
2
2
  import * as React from "react";
3
3
  import { DynamicToolUIPart, ToolUIPart } from "ai";
4
4
  import { MCPServersState } from "agents";
@@ -1,2 +1,2 @@
1
- import { n as McpConnectorFormProps, r as McpConnectorFormValues, t as McpConnectorForm } from "../../McpConnectorForm-BETdVBRk.js";
1
+ import { n as McpConnectorFormProps, r as McpConnectorFormValues, t as McpConnectorForm } from "../../McpConnectorForm-CeYNY0MI.js";
2
2
  export { McpConnectorForm, McpConnectorFormProps, McpConnectorFormValues };
@@ -1,2 +1,2 @@
1
- import { a as McpPluginDetailsDialogProps, i as McpPluginDetailsDialog, n as McpPluginCatalogProps, r as McpPluginDetails, t as McpPluginCatalog } from "../../McpPluginCatalog-C6ip9IvL.js";
1
+ import { a as McpPluginDetailsDialogProps, i as McpPluginDetailsDialog, n as McpPluginCatalogProps, r as McpPluginDetails, t as McpPluginCatalog } from "../../McpPluginCatalog-3qWu8oK1.js";
2
2
  export { McpPluginCatalog, McpPluginCatalogProps, McpPluginDetails, McpPluginDetailsDialog, McpPluginDetailsDialogProps };
@@ -1,6 +1,6 @@
1
1
  import { s as MenuItemProps, t as Menu } from "../../Menu-yb6QXWA3.js";
2
- import { o as McpServerCard } from "../../mcp-server-catalog-Cbu483Zb.js";
3
- import { n as McpConnectorFormProps } from "../../McpConnectorForm-BETdVBRk.js";
2
+ import { o as McpServerCard } from "../../mcp-server-catalog-C_g7C-9o.js";
3
+ import { n as McpConnectorFormProps } from "../../McpConnectorForm-CeYNY0MI.js";
4
4
  import { l as DialogProps } from "../../Dialog-B_FhRWaz.js";
5
5
  import * as React from "react";
6
6
  import { MCPServersState } from "agents";
@@ -1,11 +1,11 @@
1
1
  import { l as WorkspaceNavigationAdapter } from "../../WorkspaceLink-Bh9-Jo1r.js";
2
2
  import { n as AgentToolEventsValue } from "../../AgentToolRunsContext-jtmveaRE.js";
3
3
  import { n as ResponsiveSidebarShell, t as AppBarSlots } from "../../ResponsiveSidebarShell-BTVPxLJK.js";
4
- import { n as McpPluginCatalogProps } from "../../McpPluginCatalog-C6ip9IvL.js";
4
+ import { n as McpPluginCatalogProps } from "../../McpPluginCatalog-3qWu8oK1.js";
5
5
  import { ThinkChatMessagesProps } from "./ThinkChat.js";
6
6
  import { ThinkThreadStatusSummary } from "./ThinkThreadPicker.js";
7
7
  import { r as WorkspaceFileAssetResolver } from "../../WorkspaceFile-Dq-GC0_T.js";
8
- import { v as WorkspaceSource } from "../../Workspace-jdVZ9S0a.js";
8
+ import { v as WorkspaceSource } from "../../Workspace-BGhTdDTI.js";
9
9
  import { t as ThinkAgent } from "../../think-agent-Cip5KAPj.js";
10
10
  import * as React from "react";
11
11
  import { UIMessage } from "ai";
@@ -1,8 +1,8 @@
1
+ import { ThinkRoutine } from "./ThinkRoutine.js";
1
2
  import { ThinkChatDraft } from "./ThinkChat.js";
2
3
  import { ThinkThreadItem } from "./ThinkThreadPicker.js";
3
4
  import { ThinkFullAppAgent, ThinkFullAppConversation, ThinkFullAppProps } from "./ThinkFullApp.js";
4
- import { ThinkRoutine } from "./ThinkRoutine.js";
5
- import { SetupChecklistEntry } from "../general-purpose/SetupChecklist.js";
5
+ import { SetupChecklistGroupProps } from "../general-purpose/SetupChecklist.js";
6
6
  import * as React from "react";
7
7
  import { UIMessage } from "ai";
8
8
  import { AgentToolRunState } from "agents/agent-tools";
@@ -59,7 +59,7 @@ interface ThinkSidepanelConnection {
59
59
  description?: string;
60
60
  onSelect: () => void;
61
61
  }
62
- interface ThinkSidepanelStart {
62
+ interface ThinkSidepanelStart<Id extends string = string> {
63
63
  onSubmit: ThinkChatDraft["onSubmit"];
64
64
  suggestions?: readonly {
65
65
  label: string;
@@ -72,10 +72,7 @@ interface ThinkSidepanelStart {
72
72
  discord?: ThinkSidepanelConnection;
73
73
  onAttachFolder?: () => void;
74
74
  attachFolderBusy?: boolean;
75
- personalization?: {
76
- entries: readonly SetupChecklistEntry[];
77
- onSelect: (id: string) => void;
78
- };
75
+ personalization?: Pick<SetupChecklistGroupProps<Id>, "entries" | "onSelect">;
79
76
  }
80
77
  interface ThinkSidepanelSchedules<TRoutine extends ThinkRoutine = ThinkRoutine> {
81
78
  routines: readonly TRoutine[];
@@ -118,13 +115,10 @@ interface ThinkSidepanelIdentity {
118
115
  onBind?: () => void | Promise<void>;
119
116
  onUnbind?: () => void | Promise<void>;
120
117
  }
121
- interface ThinkSidepanelProps<AgentT extends ThinkFullAppAgent<State>, State = unknown, MessageT extends UIMessage = UIMessage, TRoutine extends ThinkRoutine = ThinkRoutine> extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
118
+ interface ThinkSidepanelProps<AgentT extends ThinkFullAppAgent<State>, State = unknown, MessageT extends UIMessage = UIMessage, TRoutine extends ThinkRoutine = ThinkRoutine, SetupId extends string = string> extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
122
119
  sourceKey: string;
123
120
  view: ThinkSidepanelView;
124
- thread?: {
125
- id: string;
126
- title: string;
127
- };
121
+ thread?: ThinkThreadItem;
128
122
  threads?: readonly ThinkThreadItem[];
129
123
  conversation?: ThinkFullAppConversation<AgentT, State, MessageT>;
130
124
  workspace?: ThinkFullAppProps<AgentT, State, MessageT>["workspace"];
@@ -147,7 +141,7 @@ interface ThinkSidepanelProps<AgentT extends ThinkFullAppAgent<State>, State = u
147
141
  status?: ThinkSidepanelStatus;
148
142
  connectingLabel?: string;
149
143
  modelSetup?: ThinkSidepanelModelSetup;
150
- start?: ThinkSidepanelStart;
144
+ start?: ThinkSidepanelStart<SetupId>;
151
145
  schedules?: ThinkSidepanelSchedules<TRoutine>;
152
146
  agentRun?: ThinkSidepanelAgentRun;
153
147
  /** Host-owned live view. The side panel only frames it. */
@@ -158,7 +152,7 @@ interface ThinkSidepanelProps<AgentT extends ThinkFullAppAgent<State>, State = u
158
152
  * conversation plus workbench. Hosts hydrate conversation, workspace,
159
153
  * plugins, and callables. Storybook is the place to iterate the chrome.
160
154
  */
161
- declare function ThinkSidepanel<AgentT extends ThinkFullAppAgent<State>, State = unknown, MessageT extends UIMessage = UIMessage, TRoutine extends ThinkRoutine = ThinkRoutine>({
155
+ declare function ThinkSidepanel<AgentT extends ThinkFullAppAgent<State>, State = unknown, MessageT extends UIMessage = UIMessage, TRoutine extends ThinkRoutine = ThinkRoutine, SetupId extends string = string>({
162
156
  agentRun,
163
157
  appBarLeading,
164
158
  brand,
@@ -186,6 +180,6 @@ declare function ThinkSidepanel<AgentT extends ThinkFullAppAgent<State>, State =
186
180
  view,
187
181
  workspace,
188
182
  ...props
189
- }: ThinkSidepanelProps<AgentT, State, MessageT, TRoutine>): React.JSX.Element;
183
+ }: ThinkSidepanelProps<AgentT, State, MessageT, TRoutine, SetupId>): React.JSX.Element;
190
184
  //#endregion
191
185
  export { ThinkSidepanel, ThinkSidepanelAgentRun, ThinkSidepanelCompanion, ThinkSidepanelConnection, ThinkSidepanelDestination, ThinkSidepanelFollow, ThinkSidepanelIdentity, ThinkSidepanelModelSetup, ThinkSidepanelPasskeyVault, ThinkSidepanelProps, ThinkSidepanelSchedules, ThinkSidepanelStart, ThinkSidepanelStatus, ThinkSidepanelView };
@@ -18,8 +18,8 @@ import { AppTopBar } from "../general-purpose/AppTopBar.js";
18
18
  import { t as SetupChecklistAction } from "../../SetupChecklist-DyPZWzK2.js";
19
19
  import { NaniteMark } from "../nanites/NaniteScene.js";
20
20
  import { SubagentRunLabel } from "./SubagentRunIndicator.js";
21
- import { McpServerPickerAction, McpServerPickerItems } from "./McpServerPicker.js";
22
21
  import { getThinkExecutionRunId } from "./ThinkExecutionRun.js";
22
+ import { McpServerPickerAction, McpServerPickerItems } from "./McpServerPicker.js";
23
23
  import { ThinkThreadPicker, summarizeThinkThreads } from "./ThinkThreadPicker.js";
24
24
  import { ThinkFullApp } from "./ThinkFullApp.js";
25
25
  import { ThinkRoutineLibrary } from "./ThinkRoutineLibrary.js";
@@ -1,2 +1,2 @@
1
- import { A as workspaceQueryKey, C as workspaceBinaryFileQueryOptions, D as workspaceFileAssetQueryOptions, E as workspaceDirectoryQueryPrefix, O as workspaceFileStatQueryOptions, S as useWorkspace, T as workspaceDirectoryQueryOptions, _ as WorkspaceResolvedAsset, a as WorkspaceDirectoryQueryOptions, b as WorkspaceTextFileQueryKey, c as WorkspaceFileQueryKey, d as WorkspaceFileStatQueryOptions, f as WorkspaceFileVersion, g as WorkspaceQueryKey, h as WorkspaceInfoQueryOptions, i as WorkspaceDirectoryQueryKey, j as workspaceTextFileQueryOptions, k as workspaceInfoQueryOptions, l as WorkspaceFileReadTarget, m as WorkspaceInfoQueryKey, n as WorkspaceBinaryFileQueryKey, o as WorkspaceFileAssetQueryKey, p as WorkspaceInfo, r as WorkspaceBinaryFileQueryOptions, s as WorkspaceFileAssetQueryOptions, t as UseWorkspaceOptions, u as WorkspaceFileStatQueryKey, v as WorkspaceSource, w as workspaceDirectoryQueryKey, x as WorkspaceTextFileQueryOptions, y as WorkspaceState } from "../../Workspace-jdVZ9S0a.js";
1
+ import { A as workspaceQueryKey, C as workspaceBinaryFileQueryOptions, D as workspaceFileAssetQueryOptions, E as workspaceDirectoryQueryPrefix, O as workspaceFileStatQueryOptions, S as useWorkspace, T as workspaceDirectoryQueryOptions, _ as WorkspaceResolvedAsset, a as WorkspaceDirectoryQueryOptions, b as WorkspaceTextFileQueryKey, c as WorkspaceFileQueryKey, d as WorkspaceFileStatQueryOptions, f as WorkspaceFileVersion, g as WorkspaceQueryKey, h as WorkspaceInfoQueryOptions, i as WorkspaceDirectoryQueryKey, j as workspaceTextFileQueryOptions, k as workspaceInfoQueryOptions, l as WorkspaceFileReadTarget, m as WorkspaceInfoQueryKey, n as WorkspaceBinaryFileQueryKey, o as WorkspaceFileAssetQueryKey, p as WorkspaceInfo, r as WorkspaceBinaryFileQueryOptions, s as WorkspaceFileAssetQueryOptions, t as UseWorkspaceOptions, u as WorkspaceFileStatQueryKey, v as WorkspaceSource, w as workspaceDirectoryQueryKey, x as WorkspaceTextFileQueryOptions, y as WorkspaceState } from "../../Workspace-BGhTdDTI.js";
2
2
  export { UseWorkspaceOptions, WorkspaceBinaryFileQueryKey, WorkspaceBinaryFileQueryOptions, WorkspaceDirectoryQueryKey, WorkspaceDirectoryQueryOptions, WorkspaceFileAssetQueryKey, WorkspaceFileAssetQueryOptions, WorkspaceFileQueryKey, WorkspaceFileReadTarget, WorkspaceFileStatQueryKey, WorkspaceFileStatQueryOptions, WorkspaceFileVersion, WorkspaceInfo, WorkspaceInfoQueryKey, WorkspaceInfoQueryOptions, WorkspaceQueryKey, WorkspaceResolvedAsset, WorkspaceSource, WorkspaceState, WorkspaceTextFileQueryKey, WorkspaceTextFileQueryOptions, useWorkspace, workspaceBinaryFileQueryOptions, workspaceDirectoryQueryKey, workspaceDirectoryQueryOptions, workspaceDirectoryQueryPrefix, workspaceFileAssetQueryOptions, workspaceFileStatQueryOptions, workspaceInfoQueryOptions, workspaceQueryKey, workspaceTextFileQueryOptions };
@@ -1,4 +1,4 @@
1
- import { y as WorkspaceState } from "../../Workspace-jdVZ9S0a.js";
1
+ import { y as WorkspaceState } from "../../Workspace-BGhTdDTI.js";
2
2
  import * as React from "react";
3
3
 
4
4
  //#region src/components/agents-sdk/WorkspaceBrowser.d.ts
@@ -1,5 +1,5 @@
1
1
  import { l as WorkspaceNavigationAdapter } from "../../WorkspaceLink-Bh9-Jo1r.js";
2
- import { y as WorkspaceState } from "../../Workspace-jdVZ9S0a.js";
2
+ import { y as WorkspaceState } from "../../Workspace-BGhTdDTI.js";
3
3
  import * as React from "react";
4
4
 
5
5
  //#region src/components/agents-sdk/WorkspaceExplorer.d.ts
@@ -11,8 +11,8 @@ interface CodexModelSelectorProps<ModelT extends CodexModel = CodexModel> {
11
11
  readonly models: readonly ModelT[];
12
12
  /** Current Codex catalog id. Use the selected entry's `model` field for inference. */
13
13
  readonly selectedModelId?: ModelId<ModelT> | null;
14
- /** Called only with an id from the supplied Codex catalog. */
15
- readonly onSelectModel: (modelId: ModelId<ModelT>) => void;
14
+ /** Called only with an entry from the supplied Codex catalog. */
15
+ readonly onSelectModel: (model: ModelT) => void;
16
16
  /** Current reasoning effort advertised by the selected model. */
17
17
  readonly selectedEffortId?: ReasoningEffort<ModelT> | null;
18
18
  readonly onSelectEffort?: (effortId: ReasoningEffort<ModelT>) => void;
@@ -28,7 +28,7 @@ function CodexModelSelector({ models, selectedModelId = null, onSelectModel, sel
28
28
  function handleSelectModel(modelId) {
29
29
  const model = visibleModels.find((option) => option.id === modelId);
30
30
  if (!model) return;
31
- onSelectModel(model.id);
31
+ onSelectModel(model);
32
32
  }
33
33
  function handleSelectEffort(effortId) {
34
34
  const effort = effortOptions.find((option) => option.reasoningEffort === effortId);
@@ -8,11 +8,11 @@ interface ConversationTabPickerItem {
8
8
  url?: string;
9
9
  iconSrc?: string;
10
10
  }
11
- interface ConversationTabPickerProps {
11
+ interface ConversationTabPickerProps<Tab extends ConversationTabPickerItem = ConversationTabPickerItem> {
12
12
  /** Browser-enriched tabs already scoped to the current conversation. */
13
- tabs: readonly ConversationTabPickerItem[];
13
+ tabs: readonly Tab[];
14
14
  /** Host-owned activation, such as Chrome tab/window focus. */
15
- onSelect: (id: ConversationTabId) => void | Promise<void>;
15
+ onSelect: (tab: Tab) => void | Promise<void>;
16
16
  /** Maximum avatars shown in the collapsed trigger. */
17
17
  maxVisible?: number;
18
18
  groupLabel?: React.ReactNode;
@@ -23,9 +23,9 @@ interface ConversationTabPickerProps {
23
23
  * The browser adapter owns tab lookup and activation. This component owns URL
24
24
  * labels, favicon fallbacks, menu state, and async activation feedback.
25
25
  */
26
- declare function ConversationTabPicker({
26
+ declare function ConversationTabPicker<Tab extends ConversationTabPickerItem>({
27
27
  tabs,
28
28
  ...props
29
- }: ConversationTabPickerProps): React.JSX.Element | null;
29
+ }: ConversationTabPickerProps<Tab>): React.JSX.Element | null;
30
30
  //#endregion
31
31
  export { ConversationTabId, ConversationTabPicker, ConversationTabPickerItem, ConversationTabPickerProps };
@@ -54,11 +54,11 @@ function ConversationTabPickerMenu({ tabs, onSelect, maxVisible = 3, groupLabel
54
54
  const pending = action && "pending" in action ? action.pending : null;
55
55
  const error = action && "error" in action ? action.error : null;
56
56
  const label = `${tabs.length} controlled ${tabs.length === 1 ? "tab" : "tabs"}`;
57
- async function selectTab(id) {
57
+ async function selectTab(tab) {
58
58
  if (pending !== null) return;
59
- setAction({ pending: id });
59
+ setAction({ pending: tab.id });
60
60
  try {
61
- await onSelect(id);
61
+ await onSelect(tab);
62
62
  setAction(null);
63
63
  setOpen(false);
64
64
  } catch (cause) {
@@ -98,7 +98,7 @@ function ConversationTabPickerMenu({ tabs, onSelect, maxVisible = 3, groupLabel
98
98
  closeOnClick: false,
99
99
  "data-tab-id": tab.id,
100
100
  disabled: pending !== null,
101
- onClick: () => void selectTab(tab.id),
101
+ onClick: () => void selectTab(tab),
102
102
  children: [/* @__PURE__ */ jsx(TabAvatar, { tab }), /* @__PURE__ */ jsxs("span", {
103
103
  className: "conversation-tab-picker__identity sigvelo-truncate-grow",
104
104
  children: [/* @__PURE__ */ jsx("span", {
@@ -17,32 +17,32 @@ interface SettingsFormField {
17
17
  required?: boolean;
18
18
  readOnly?: boolean;
19
19
  }
20
- type SettingsFormValues = Readonly<Record<string, string>>;
21
- interface SettingsFormDialogProps {
20
+ type SettingsFormValues<Fields extends readonly SettingsFormField[]> = Readonly<Record<Fields[number]["name"], string>>;
21
+ interface SettingsFormDialogProps<Fields extends readonly SettingsFormField[]> {
22
22
  open: boolean;
23
23
  onOpenChange: (open: boolean) => void;
24
24
  title: React.ReactNode;
25
25
  description: React.ReactNode;
26
- fields: readonly SettingsFormField[];
27
- initialValues?: Readonly<Record<string, string | undefined>>;
26
+ fields: Fields;
27
+ initialValues?: Readonly<Partial<Record<Fields[number]["name"], string | undefined>>>;
28
28
  submitLabel: string;
29
29
  submittingLabel?: string;
30
30
  removeLabel?: string;
31
31
  removingLabel?: string;
32
32
  externalError?: string;
33
- onSubmit: (values: SettingsFormValues) => void | Promise<void>;
33
+ onSubmit: (values: SettingsFormValues<Fields>) => void | Promise<void>;
34
34
  onRemove?: () => void | Promise<void>;
35
35
  }
36
36
  /**
37
37
  * Uncontrolled, metadata-driven settings dialog with native validation and
38
38
  * shared async submit/remove feedback. Product schemas remain in the host.
39
39
  */
40
- declare function SettingsFormDialog({
40
+ declare function SettingsFormDialog<const Fields extends readonly SettingsFormField[]>({
41
41
  open,
42
42
  onOpenChange,
43
43
  title,
44
44
  description,
45
45
  ...contentProps
46
- }: SettingsFormDialogProps): React.JSX.Element;
46
+ }: SettingsFormDialogProps<Fields>): React.JSX.Element;
47
47
  //#endregion
48
48
  export { SETTINGS_FORM_CHECKED, SettingsFormDialog, SettingsFormDialogProps, SettingsFormField, SettingsFormFieldType, SettingsFormValues };
@@ -24,6 +24,7 @@ function SettingsFormDialogContent({ fields, initialValues, submitLabel, submitt
24
24
  const active = React.useRef(true);
25
25
  const pending = submission === "submit" || submission === "remove";
26
26
  const error = submission && typeof submission === "object" ? submission.error : null;
27
+ const initialValueByName = initialValues ?? {};
27
28
  React.useEffect(() => {
28
29
  active.current = true;
29
30
  return () => {
@@ -62,7 +63,7 @@ function SettingsFormDialogContent({ fields, initialValues, submitLabel, submitt
62
63
  name: field.name,
63
64
  orientation: "horizontal",
64
65
  children: [/* @__PURE__ */ jsx(Checkbox.Root, {
65
- defaultChecked: initialValues?.[field.name] === SETTINGS_FORM_CHECKED,
66
+ defaultChecked: initialValueByName[field.name] === SETTINGS_FORM_CHECKED,
66
67
  disabled: field.readOnly,
67
68
  children: /* @__PURE__ */ jsx(Checkbox.Indicator, {})
68
69
  }), /* @__PURE__ */ jsxs(Field.Content, { children: [/* @__PURE__ */ jsx(Field.Label, { children: field.label }), field.description ? /* @__PURE__ */ jsx(Field.Description, { children: field.description }) : null] })]
@@ -72,7 +73,7 @@ function SettingsFormDialogContent({ fields, initialValues, submitLabel, submitt
72
73
  /* @__PURE__ */ jsx(Field.Label, { children: field.label }),
73
74
  /* @__PURE__ */ jsx(Field.Control, {
74
75
  autoComplete: field.autoComplete,
75
- defaultValue: initialValues?.[field.name],
76
+ defaultValue: initialValueByName[field.name],
76
77
  placeholder: field.placeholder,
77
78
  readOnly: field.readOnly,
78
79
  required: field.required,
@@ -420,6 +420,30 @@ declare const MANUAL_MCP_SERVER_CARDS: readonly [{
420
420
  readonly url: "https://developers.asana.com/docs/connecting-mcp-clients-to-asanas-v2-server";
421
421
  }];
422
422
  };
423
+ }, {
424
+ readonly id: "github";
425
+ readonly name: "GitHub";
426
+ readonly url: "https://api.githubcopilot.com/mcp/";
427
+ readonly description: "Clone, push, and open pull requests as a connected GitHub account";
428
+ readonly category: "Manual";
429
+ readonly manualSetup: {
430
+ readonly auth: {
431
+ readonly type: "bearer";
432
+ readonly label: "Personal access token (classic)";
433
+ readonly fields: readonly [{
434
+ readonly name: "bearerToken";
435
+ readonly label: "Personal access token";
436
+ readonly inputType: "password";
437
+ readonly placeholder: "ghp_…";
438
+ readonly required: true;
439
+ }];
440
+ };
441
+ readonly description: "Paste a classic personal access token with all scopes from the agent's own GitHub account — the account is the access boundary. Git and the GitHub API both authenticate as this account.";
442
+ readonly links: readonly [{
443
+ readonly label: "Create a classic token";
444
+ readonly url: "https://github.com/settings/tokens";
445
+ }];
446
+ };
423
447
  }, {
424
448
  readonly id: "gmail";
425
449
  readonly name: "Gmail";
@@ -1,18 +1,20 @@
1
1
  /*
2
- * Standalone stylesheet for browser-control chrome mounted in a closed shadow
3
- * root. It intentionally uses system colors so it remains legible on arbitrary
4
- * pages without leaking the full document-level token sheet into the host.
2
+ * Browser-control chrome, mounted in a closed shadow root on someone else's
3
+ * page. This standalone design-system leaf is isolated by `:host { all:
4
+ * initial }`, so it shares no variable, scale, or primitive with the document
5
+ * stylesheet.
5
6
  *
6
- * Every length here is a literal on purpose. The token layer does not exist
7
- * inside this shadow root, so a --sigvelo-* reference resolves to nothing and
8
- * takes its whole declaration with it silently, and only on a real host page,
9
- * which is the one place this is hard to notice. Keep the values on the 4px
10
- * grid by hand; audit:css-recipes checks both halves of that.
7
+ * Every length is a literal on purpose. A --sigvelo-* reference here resolves
8
+ * to nothing and silently takes its whole declaration with it, and only on a
9
+ * real host page the one place that is hardest to notice. Keep the values on
10
+ * the 4px grid by hand.
11
+ *
12
+ * System colors keep the chrome legible on an arbitrary page's palette and in
13
+ * forced-colors mode.
11
14
  */
12
15
 
13
16
  :host {
14
17
  --browser-control-accent: Highlight;
15
- --browser-control-accent-text: HighlightText;
16
18
  --browser-control-warning: Mark;
17
19
  --browser-control-warning-text: MarkText;
18
20
  --browser-control-shadow: color-mix(in srgb, CanvasText 28%, transparent);
@@ -31,50 +33,56 @@
31
33
  z-index: 2147483647;
32
34
  }
33
35
 
36
+ /*
37
+ * Only the waiting mode draws an edge. A tab under agent control is identified
38
+ * by its pointer; a border around the whole viewport reads as an error state
39
+ * and hides the page's own chrome. Waiting is the exception because the page
40
+ * is being handed back and the user has to notice.
41
+ */
34
42
  :host .frame {
35
- background: color-mix(in srgb, var(--browser-control-accent) 5%, transparent);
36
- border: 3px solid color-mix(in srgb, var(--browser-control-accent) 88%, transparent);
37
- box-shadow: inset 0 0 18px color-mix(in srgb, var(--browser-control-accent) 28%, transparent);
43
+ box-shadow:
44
+ inset 0 0 0 3px var(--browser-control-warning),
45
+ inset 0 0 24px color-mix(in srgb, var(--browser-control-warning) 32%, transparent);
38
46
  box-sizing: border-box;
39
47
  inset: 0;
40
48
  pointer-events: none;
41
49
  position: fixed;
42
50
  }
43
51
 
44
- :host .frame.waiting {
45
- background: color-mix(in srgb, var(--browser-control-warning) 12%, transparent);
46
- border-color: var(--browser-control-warning);
47
- box-shadow: inset 0 0 18px color-mix(in srgb, var(--browser-control-warning) 32%, transparent);
48
- }
49
-
52
+ /*
53
+ * The pointer artwork. The file is cropped to its alpha, and the alpha includes
54
+ * the soft white halo -- so the arrow's ink apex, which is what the eye reads as
55
+ * the point, sits 5px into a 40x41 image, or 3.41px once `contain` renders it
56
+ * 28px tall. The box is offset by that much and the pivot moved onto it, so the
57
+ * apex lands on the page's pointer and every rotation the planner emits turns
58
+ * about it. Shifting the background instead would do the same thing and clip the
59
+ * halo off the leading edge.
60
+ *
61
+ * Position comes from the Web Animations API during a move and from
62
+ * --think-cursor-x/y at rest; no transform transition, since a CSS transition
63
+ * and a script-driven animation would fight over the same property.
64
+ */
50
65
  :host .cursor {
51
- filter: drop-shadow(0 2px 4px var(--browser-control-shadow));
66
+ background: url(../assets/browser-control-cursor.png) no-repeat 0 0 / contain;
67
+ /* Two shadows rather than one: a tight halo that separates the artwork from
68
+ whatever it is over, and a wide one that reads as the accent glow. */
69
+ filter: drop-shadow(0 0 6px color-mix(in srgb, var(--browser-control-accent) 90%, transparent))
70
+ drop-shadow(0 0 15px color-mix(in srgb, var(--browser-control-accent) 48%, transparent));
52
71
  height: 28px;
53
- left: 0;
54
- opacity: 0;
72
+ left: -3.41px;
55
73
  pointer-events: none;
56
74
  position: fixed;
57
- top: 0;
75
+ top: -3.41px;
58
76
  transform: translate3d(var(--think-cursor-x, 16px), var(--think-cursor-y, 16px), 0);
59
- transition:
60
- transform 140ms cubic-bezier(0.2, 0.8, 0.2, 1),
61
- opacity 80ms linear;
77
+ /* The ink apex, not the box corner and not the centre. The offset above puts
78
+ this point on the pointer, and the body swings around it. */
79
+ transform-origin: 3.41px 3.41px;
62
80
  width: 28px;
63
81
  }
64
82
 
65
- :host .cursor.visible {
66
- opacity: 1;
67
- }
68
-
69
- :host .cursor path {
70
- fill: var(--browser-control-accent);
71
- stroke: var(--browser-control-accent-text);
72
- }
73
-
74
83
  :host button {
75
84
  appearance: none;
76
85
  border-radius: 999px;
77
- box-shadow: 0 2px 10px var(--browser-control-shadow);
78
86
  cursor: pointer;
79
87
  font:
80
88
  600 12px/1.2 system-ui,
@@ -92,41 +100,6 @@
92
100
  opacity: 0.72;
93
101
  }
94
102
 
95
- :host .takeover,
96
- :host .owner {
97
- background: var(--browser-control-accent);
98
- border: solid 1px var(--browser-control-accent-text);
99
- box-shadow: 0 2px 10px var(--browser-control-shadow);
100
- color: var(--browser-control-accent-text);
101
- }
102
-
103
- :host .takeover {
104
- pointer-events: none;
105
- position: fixed;
106
- right: 10px;
107
- top: 10px;
108
- }
109
-
110
- :host .takeover.takeover-armed {
111
- pointer-events: auto;
112
- }
113
-
114
- :host .owner {
115
- border-radius: 999px;
116
- font:
117
- 600 12px/1.2 system-ui,
118
- sans-serif;
119
- left: 10px;
120
- max-width: min(360px, 60vw);
121
- overflow: hidden;
122
- padding: 8px 12px;
123
- pointer-events: none;
124
- position: fixed;
125
- text-overflow: ellipsis;
126
- top: 10px;
127
- white-space: nowrap;
128
- }
129
-
130
103
  :host .banner {
131
104
  align-items: center;
132
105
  background: var(--browser-control-warning);
@@ -158,6 +131,7 @@
158
131
  :host .banner .done,
159
132
  :host .banner .cannot {
160
133
  border: solid 1px currentcolor;
134
+ box-shadow: 0 2px 10px var(--browser-control-shadow);
161
135
  color: inherit;
162
136
  flex-shrink: 0;
163
137
  }
@@ -171,12 +145,6 @@
171
145
  box-shadow: none;
172
146
  }
173
147
 
174
- @media (prefers-reduced-motion: reduce) {
175
- :host .cursor {
176
- transition: none;
177
- }
178
- }
179
-
180
148
  @media print {
181
149
  :host {
182
150
  display: none !important;
@@ -184,10 +152,8 @@
184
152
  }
185
153
 
186
154
  @media (forced-colors: active) {
187
- :host .frame,
188
- :host .takeover,
189
- :host .owner,
190
155
  :host .banner {
191
- forced-color-adjust: none;
156
+ background: Canvas;
157
+ color: CanvasText;
192
158
  }
193
159
  }
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Standalone extension interstitial. It intentionally does not load the token
3
+ * cascade; system colors follow the user's light, dark, and forced-color theme.
4
+ */
5
+
6
+ .extension-status-page {
7
+ background: Canvas;
8
+ color: CanvasText;
9
+ color-scheme: light dark;
10
+ display: grid;
11
+ font:
12
+ 0.875rem/1.5 system-ui,
13
+ -apple-system,
14
+ BlinkMacSystemFont,
15
+ "Segoe UI",
16
+ Roboto,
17
+ sans-serif;
18
+ margin: 0;
19
+ min-block-size: 100dvb;
20
+ place-items: center;
21
+ }
22
+
23
+ .extension-status {
24
+ /* Mirrors --sigvelo-layout-gutter without loading the document token sheet. */
25
+ display: grid;
26
+ gap: 0.75rem;
27
+ justify-items: center;
28
+ max-inline-size: 30rem;
29
+ padding: 0.75rem;
30
+ text-align: center;
31
+ }
32
+
33
+ .extension-status h1 {
34
+ font-size: inherit;
35
+ font-weight: 600;
36
+ margin: 0;
37
+ }
38
+
39
+ .extension-status p {
40
+ color: GrayText;
41
+ margin: 0;
42
+ }
43
+
44
+ .extension-status button {
45
+ font: inherit;
46
+ }
@@ -86,7 +86,6 @@
86
86
  @import "./artifact.css" layer(components);
87
87
  @import "./browser-live-view.css" layer(components);
88
88
  @import "./browser-live-screen.css" layer(components);
89
- @import "./browser-control-overlay.css" layer(components);
90
89
  @import "./browser-run-panel.css" layer(components);
91
90
  @import "./chain-of-thought.css" layer(components);
92
91
  @import "./checkpoint.css" layer(components);
@@ -1,2 +1,2 @@
1
- import { a as MCP_SERVER_SETUP_AUTH, c as McpServerManualSetup, d as McpServerSetupAuthFieldName, f as McpServerSetupLink, h as getMcpServerRuntimeState, i as MANUAL_MCP_SERVER_CARDS, l as McpServerSetupAuth, m as getMcpServerIconSrc, n as DCR_MCP_SERVER_CARDS, o as McpServerCard, p as getMcpServerEntry, r as DEFAULT_MCP_SERVER_CARDS, s as McpServerCardIcon, t as CUSTOM_MCP_SERVER_CARD, u as McpServerSetupAuthField } from "../mcp-server-catalog-Cbu483Zb.js";
1
+ import { a as MCP_SERVER_SETUP_AUTH, c as McpServerManualSetup, d as McpServerSetupAuthFieldName, f as McpServerSetupLink, h as getMcpServerRuntimeState, i as MANUAL_MCP_SERVER_CARDS, l as McpServerSetupAuth, m as getMcpServerIconSrc, n as DCR_MCP_SERVER_CARDS, o as McpServerCard, p as getMcpServerEntry, r as DEFAULT_MCP_SERVER_CARDS, s as McpServerCardIcon, t as CUSTOM_MCP_SERVER_CARD, u as McpServerSetupAuthField } from "../mcp-server-catalog-C_g7C-9o.js";
2
2
  export { CUSTOM_MCP_SERVER_CARD, DCR_MCP_SERVER_CARDS, DEFAULT_MCP_SERVER_CARDS, MANUAL_MCP_SERVER_CARDS, MCP_SERVER_SETUP_AUTH, McpServerCard, McpServerCardIcon, McpServerManualSetup, McpServerSetupAuth, McpServerSetupAuthField, McpServerSetupAuthFieldName, McpServerSetupLink, getMcpServerEntry, getMcpServerIconSrc, getMcpServerRuntimeState };
@@ -1,4 +1,5 @@
1
1
  import { inferFaviconUrl } from "./favicon.js";
2
+ import { siAirtable, siAsana, siAtlassian, siCalendly, siCloudflare, siDatadog, siEgnyte, siGithub, siGitlab, siGrafana, siHubspot, siHuggingface, siLinear, siMiro, siNeon, siNotion, siPaypal, siPosthog, siPostman, siRailway, siSentry, siStripe, siSupabase, siWebflow, siWix, siZapier, siZoom } from "simple-icons";
2
3
  //#region src/utils/mcp-server-catalog.ts
3
4
  /**
4
5
  * Read the complete state emitted by the pinned Agents runtime.
@@ -38,6 +39,40 @@ function normalizeMcpServerUrl(url) {
38
39
  }
39
40
  const DCR_CATEGORY = "Auto";
40
41
  const MANUAL_CATEGORY = "Manual";
42
+ const SIMPLE_ICONS = Object.fromEntries([
43
+ siAirtable,
44
+ siAsana,
45
+ siAtlassian,
46
+ siCalendly,
47
+ siCloudflare,
48
+ siDatadog,
49
+ siEgnyte,
50
+ siGithub,
51
+ siGitlab,
52
+ siGrafana,
53
+ siHubspot,
54
+ siHuggingface,
55
+ siLinear,
56
+ siMiro,
57
+ siNeon,
58
+ siNotion,
59
+ siPaypal,
60
+ siPosthog,
61
+ siPostman,
62
+ siRailway,
63
+ siSentry,
64
+ siStripe,
65
+ siSupabase,
66
+ siWebflow,
67
+ siWix,
68
+ siZapier,
69
+ siZoom
70
+ ].map((icon) => [icon.slug, icon.svg]));
71
+ function bundledSimpleIcon(server) {
72
+ const slug = server.id === "zoom-workspace" ? "zoom" : server.id.replaceAll("-", "");
73
+ const svg = SIMPLE_ICONS[slug];
74
+ return svg ? `data:image/svg+xml,${encodeURIComponent(svg)}` : void 0;
75
+ }
41
76
  const MCP_SERVER_SETUP_AUTH = {
42
77
  bearer: {
43
78
  type: "bearer",
@@ -120,6 +155,8 @@ const CUSTOM_MCP_SERVER_CARD = {
120
155
  function getMcpServerIconSrc(server) {
121
156
  if (typeof server.icon === "string") return server.icon;
122
157
  if (server.icon?.src) return server.icon.src;
158
+ const bundled = bundledSimpleIcon(server);
159
+ if (bundled) return bundled;
123
160
  return inferFaviconUrl(server.url);
124
161
  }
125
162
  /** Remote MCP servers whose OAuth metadata exposes a registration_endpoint. */
@@ -425,6 +462,31 @@ const MANUAL_MCP_SERVER_CARDS = [
425
462
  ]
426
463
  }
427
464
  },
465
+ {
466
+ id: "github",
467
+ name: "GitHub",
468
+ url: "https://api.githubcopilot.com/mcp/",
469
+ description: "Clone, push, and open pull requests as a connected GitHub account",
470
+ category: MANUAL_CATEGORY,
471
+ manualSetup: {
472
+ auth: {
473
+ type: "bearer",
474
+ label: "Personal access token (classic)",
475
+ fields: [{
476
+ name: "bearerToken",
477
+ label: "Personal access token",
478
+ inputType: "password",
479
+ placeholder: "ghp_…",
480
+ required: true
481
+ }]
482
+ },
483
+ description: "Paste a classic personal access token with all scopes from the agent's own GitHub account — the account is the access boundary. Git and the GitHub API both authenticate as this account.",
484
+ links: [{
485
+ label: "Create a classic token",
486
+ url: "https://github.com/settings/tokens"
487
+ }]
488
+ }
489
+ },
428
490
  {
429
491
  id: "gmail",
430
492
  name: "Gmail",
@@ -870,6 +932,12 @@ const DEFAULT_MCP_SERVER_CARDS = [
870
932
  ...DCR_MCP_SERVER_CARDS,
871
933
  CUSTOM_MCP_SERVER_CARD,
872
934
  ...MANUAL_MCP_SERVER_CARDS
873
- ];
935
+ ].map((server) => {
936
+ const icon = bundledSimpleIcon(server);
937
+ return icon ? {
938
+ ...server,
939
+ icon
940
+ } : server;
941
+ });
874
942
  //#endregion
875
943
  export { CUSTOM_MCP_SERVER_CARD, DCR_MCP_SERVER_CARDS, DEFAULT_MCP_SERVER_CARDS, MANUAL_MCP_SERVER_CARDS, MCP_SERVER_SETUP_AUTH, getMcpServerEntry, getMcpServerIconSrc, getMcpServerRuntimeState };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/react-components",
3
- "version": "0.46.3",
3
+ "version": "0.46.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": {
@@ -50,10 +50,11 @@
50
50
  "react-icons": "^5.7.0",
51
51
  "rehype-slug": "^6.0.0",
52
52
  "shiki": "^3.23.0",
53
+ "simple-icons": "16.28.0",
53
54
  "streamdown": "^2.5.0",
54
55
  "unist-util-visit": "^5.1.0",
55
56
  "yet-another-react-lightbox": "^3.32.2",
56
- "@mcp-b/design-tokens": "0.46.3"
57
+ "@mcp-b/design-tokens": "0.46.5"
57
58
  },
58
59
  "devDependencies": {
59
60
  "@ai-sdk/react": "^3.0.249",