@mcp-b/react-components 0.51.2 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/{CodeBlock-g8sADidM.js → CodeBlock-Bl-q7wMc.js} +1 -0
  2. package/dist/{CodeBlock--r6GS8YV.d.ts → CodeBlock-DJ99TQWy.d.ts} +1 -1
  3. package/dist/EmployeeChrome-C8eTGJWn.d.ts +231 -0
  4. package/dist/{IconButton-ByiyjkYE.d.ts → IconButton-CAlFVb2L.d.ts} +3 -0
  5. package/dist/{ManagerOffice-D-7SOJ4x.js → ManagerOffice-CMJ7laGe.js} +14 -9
  6. package/dist/McpPluginCatalog-DNeHDrts.d.ts +94 -0
  7. package/dist/{Message-DyaTBiV7.d.ts → Message-COsMPZSC.d.ts} +2 -2
  8. package/dist/{ResponsiveSidebarShell-CAmmtQTR.d.ts → ResponsiveSidebarShell-BUBQa_IV.d.ts} +3 -1
  9. package/dist/{SetupChecklist-Btmy3-_C.js → SetupChecklist-BiWQkKEq.js} +5 -4
  10. package/dist/{ThinkThreadPicker-yetGX_s5.d.ts → ThinkThreadPicker-DX0lL-P7.d.ts} +3 -0
  11. package/dist/{Workspace-HzGrWDX3.d.ts → Workspace-mzMZSdts.d.ts} +1 -1
  12. package/dist/WorkspaceConceptPanel-97ZyVpZI.js +20 -0
  13. package/dist/{WorkspaceFile-Bouauobc.d.ts → WorkspaceFile-19WP0EU1.d.ts} +1 -1
  14. package/dist/{WorkspaceFileView-DYPtRVpM.js → WorkspaceFileView-DXgTljKV.js} +2 -1
  15. package/dist/{WorkspaceMessageResponse-8lOSAbw_.d.ts → WorkspaceMessageResponse-BApg8KZv.d.ts} +1 -1
  16. package/dist/WorkspaceMountManager-CkLI1B-G.d.ts +33 -0
  17. package/dist/assets/sigvelo-logo.svg +54 -0
  18. package/dist/components/agents-sdk/AgentChat.d.ts +6 -2
  19. package/dist/components/agents-sdk/AgentChat.js +4 -8
  20. package/dist/components/agents-sdk/EmployeeApp.d.ts +43 -30
  21. package/dist/components/agents-sdk/EmployeeApp.js +47 -34
  22. package/dist/components/agents-sdk/EmployeeChat.d.ts +28 -8
  23. package/dist/components/agents-sdk/EmployeeChat.js +32 -4
  24. package/dist/components/agents-sdk/EmployeeChrome.d.ts +1 -219
  25. package/dist/components/agents-sdk/EmployeeChrome.js +101 -102
  26. package/dist/components/agents-sdk/EmployeeSchedules.d.ts +1 -1
  27. package/dist/components/agents-sdk/EmployeeSchedules.js +1 -2
  28. package/dist/components/agents-sdk/EmployeeStartScreen.d.ts +12 -11
  29. package/dist/components/agents-sdk/EmployeeStartScreen.js +21 -14
  30. package/dist/components/agents-sdk/ManagerAccountActions.js +0 -1
  31. package/dist/components/agents-sdk/ManagerOffice.js +1 -2
  32. package/dist/components/agents-sdk/ManagerOfficeScreens.d.ts +2 -2
  33. package/dist/components/agents-sdk/ManagerOfficeScreens.js +30 -13
  34. package/dist/components/agents-sdk/McpPluginCatalog.d.ts +1 -93
  35. package/dist/components/agents-sdk/McpPluginCatalog.js +3 -3
  36. package/dist/components/agents-sdk/McpServerPicker.js +3 -3
  37. package/dist/components/agents-sdk/SubagentRunPanel.d.ts +3 -0
  38. package/dist/components/agents-sdk/SubagentRunPanel.js +66 -46
  39. package/dist/components/agents-sdk/ThinkChat.d.ts +1 -1
  40. package/dist/components/agents-sdk/ThinkChatToolPanels.js +1 -1
  41. package/dist/components/agents-sdk/ThinkExecutionWorkbench.js +4 -11
  42. package/dist/components/agents-sdk/ThinkFullApp.d.ts +2 -0
  43. package/dist/components/agents-sdk/ThinkFullApp.js +2 -0
  44. package/dist/components/agents-sdk/ThinkRoutineForm.js +1 -1
  45. package/dist/components/agents-sdk/ThinkThreadPicker.d.ts +1 -1
  46. package/dist/components/agents-sdk/ThinkThreadPicker.js +32 -19
  47. package/dist/components/agents-sdk/WorkbenchBack.d.ts +18 -0
  48. package/dist/components/agents-sdk/WorkbenchBack.js +27 -0
  49. package/dist/components/agents-sdk/Workspace.d.ts +1 -1
  50. package/dist/components/agents-sdk/WorkspaceBrowser.d.ts +1 -1
  51. package/dist/components/agents-sdk/WorkspaceBrowser.js +2 -0
  52. package/dist/components/agents-sdk/WorkspaceConcept.d.ts +1 -1
  53. package/dist/components/agents-sdk/WorkspaceExecution.js +7 -4
  54. package/dist/components/agents-sdk/WorkspaceExplorer.d.ts +4 -1
  55. package/dist/components/agents-sdk/WorkspaceExplorer.js +13 -4
  56. package/dist/components/agents-sdk/WorkspaceFile.d.ts +1 -1
  57. package/dist/components/agents-sdk/WorkspaceFileView.d.ts +1 -1
  58. package/dist/components/agents-sdk/WorkspaceFileView.js +1 -1
  59. package/dist/components/agents-sdk/WorkspaceLive.d.ts +2 -2
  60. package/dist/components/agents-sdk/WorkspaceMessageResponse.d.ts +1 -1
  61. package/dist/components/agents-sdk/WorkspaceMountManager.d.ts +1 -32
  62. package/dist/components/agents-sdk/WorkspaceMountManager.js +1 -1
  63. package/dist/components/agents-sdk/WorkspaceProject.js +3 -1
  64. package/dist/components/agents-sdk/WorkspaceUserScript.js +3 -1
  65. package/dist/components/ai-sdk/Artifact.d.ts +1 -1
  66. package/dist/components/ai-sdk/CodeBlock.d.ts +1 -1
  67. package/dist/components/ai-sdk/CodeBlock.js +1 -1
  68. package/dist/components/ai-sdk/Conversation.d.ts +1 -1
  69. package/dist/components/ai-sdk/Message.d.ts +1 -1
  70. package/dist/components/ai-sdk/PromptInput.js +1 -1
  71. package/dist/components/extension/ChatGptSignInScreen.d.ts +1 -1
  72. package/dist/components/extension/ChatGptSignInScreen.js +60 -185
  73. package/dist/components/extension/CodexModelSelector.js +2 -6
  74. package/dist/components/foundations/IconButton.d.ts +1 -1
  75. package/dist/components/foundations/IconButton.js +7 -4
  76. package/dist/components/general-purpose/AccountSignInDialog.d.ts +5 -9
  77. package/dist/components/general-purpose/AccountSignInDialog.js +12 -4
  78. package/dist/components/general-purpose/BrandLoading.d.ts +14 -0
  79. package/dist/components/general-purpose/BrandLoading.js +25 -0
  80. package/dist/components/general-purpose/Commit.d.ts +1 -1
  81. package/dist/components/general-purpose/EnvironmentVariables.d.ts +1 -1
  82. package/dist/components/general-purpose/ResponsiveSidebarShell.d.ts +1 -1
  83. package/dist/components/general-purpose/ResponsiveSidebarShell.js +58 -26
  84. package/dist/components/general-purpose/SetupChecklist.js +1 -1
  85. package/dist/components/general-purpose/StatusScreen.d.ts +13 -2
  86. package/dist/components/general-purpose/StatusScreen.js +27 -3
  87. package/dist/components/general-purpose/Terminal.d.ts +2 -2
  88. package/dist/components/general-purpose/WebPreview.d.ts +1 -1
  89. package/dist/components/nanites/AgentConnection.js +1 -1
  90. package/dist/{copy-button-OUwOdgEm.d.ts → copy-button-CJYYgCIU.d.ts} +1 -1
  91. package/dist/styles/activity.css +2 -2
  92. package/dist/styles/agent-chat.css +6 -105
  93. package/dist/styles/app-root.css +9 -0
  94. package/dist/styles/app-top-bar.css +10 -4
  95. package/dist/styles/avatar.css +2 -2
  96. package/dist/styles/base.css +6 -2
  97. package/dist/styles/brand-loading.css +58 -0
  98. package/dist/styles/brand.test.ts +158 -0
  99. package/dist/styles/browser-control-overlay.css +22 -0
  100. package/dist/styles/button.css +22 -1
  101. package/dist/styles/chatgpt-sign-in-screen.css +111 -225
  102. package/dist/styles/code-block.css +5 -0
  103. package/dist/styles/codex-model-selector.css +2 -12
  104. package/dist/styles/description-list.css +9 -2
  105. package/dist/styles/employee-app.css +19 -1
  106. package/dist/styles/employee-chrome.css +35 -5
  107. package/dist/styles/file-tree.css +15 -2
  108. package/dist/styles/index.css +1 -0
  109. package/dist/styles/manager-office.css +80 -55
  110. package/dist/styles/manager-work.css +5 -11
  111. package/dist/styles/mcp-plugin-catalog.css +29 -34
  112. package/dist/styles/mcp-server-picker.css +13 -5
  113. package/dist/styles/prompt-input.css +3 -13
  114. package/dist/styles/queue.css +1 -1
  115. package/dist/styles/recipes.css +9 -2
  116. package/dist/styles/responsive-sidebar-shell-motion.test.ts +67 -0
  117. package/dist/styles/responsive-sidebar-shell.css +70 -25
  118. package/dist/styles/search-field.css +8 -6
  119. package/dist/styles/subagent-run.css +81 -0
  120. package/dist/styles/think-execution-workbench.css +0 -17
  121. package/dist/styles/think-full-app.css +11 -4
  122. package/dist/styles/think-thread-picker.css +16 -38
  123. package/dist/styles/workspace-concepts.css +29 -2
  124. package/dist/styles/workspace-explorer.css +6 -48
  125. package/dist/utils/structured-code.d.ts +1 -1
  126. package/package.json +2 -2
  127. package/dist/styles/extension-status.css +0 -46
@@ -1,94 +1,2 @@
1
- import { l as DialogProps } from "../../Dialog-88GF7_Th.js";
2
- import { o as McpServerCard } from "../../mcp-server-catalog-D9p4gGeJ.js";
3
- import { r as McpConnectorFormValues } from "../../McpConnectorForm--HB0MEGC.js";
4
- import * as React from "react";
5
- import { MCPServersState } from "agents";
6
-
7
- //#region src/components/agents-sdk/McpPluginCatalog.d.ts
8
- /** Optional plugin-specific copy layered over the canonical MCP server card. */
9
- interface McpPluginDetails {
10
- developerName?: string;
11
- marketplaceName?: string;
12
- longDescription?: string;
13
- capabilities?: readonly string[];
14
- skills?: readonly string[];
15
- }
16
- interface McpPluginCatalogProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSelect"> {
17
- /** Canonical connector cards. The directory does not create a second plugin registry. */
18
- servers: readonly McpServerCard[];
19
- /** Upstream Agents MCP state used to project connected and recovery states. */
20
- mcp?: MCPServersState;
21
- /** Optional plugin metadata keyed by the canonical server ID. */
22
- detailsByServerId?: Readonly<Record<string, McpPluginDetails | undefined>>;
23
- /** Server IDs promoted into the Featured section, in display order. */
24
- featuredServerIds?: readonly string[];
25
- /** Host product name paired with the plugin in the connection dialog. */
26
- brandName?: string;
27
- /** Host product mark paired with the plugin in the connection dialog. */
28
- brandLogo?: React.ReactNode;
29
- /** Product-authored trust and data-sharing copy. Pass null to omit it. */
30
- disclosure?: React.ReactNode;
31
- /** Starts or recovers the existing MCP connection path. */
32
- onConnect?: (server: McpServerCard) => void | Promise<void>;
33
- /** Removes the exact upstream MCP entry. */
34
- onDisconnect?: (serverId: string) => void | Promise<void>;
35
- /**
36
- * Connects a user-supplied MCP server. Providing it puts the "Custom
37
- * plugin" action in the bar, opening the shared connector setup dialog.
38
- */
39
- onAddCustom?: (values: McpConnectorFormValues) => void | Promise<void>;
40
- /** Accessible name only — the hosting tab or icon is the visible title. */
41
- heading?: React.ReactNode;
42
- /** Accessible label and placeholder for the plugin filter. */
43
- searchLabel?: string;
44
- /** Content shown when no plugins match the current filter. */
45
- emptyMessage?: React.ReactNode;
46
- }
47
- interface McpPluginDetailsDialogProps {
48
- /** Selected canonical server card. Passing null closes the dialog. */
49
- server: McpServerCard | null;
50
- details?: McpPluginDetails;
51
- mcp?: MCPServersState;
52
- brandName?: string;
53
- brandLogo?: React.ReactNode;
54
- disclosure?: React.ReactNode;
55
- onConnect?: (server: McpServerCard) => void | Promise<void>;
56
- onDisconnect?: (serverId: string) => void | Promise<void>;
57
- onOpenChange: NonNullable<DialogProps["onOpenChange"]>;
58
- }
59
- /**
60
- * Searchable plugin directory backed by the same MCP cards and live Agents
61
- * state as {@link McpServerPicker}. Selecting a row opens the shared details
62
- * dialog; connecting still delegates to the host's existing MCP/OAuth path.
63
- */
64
- declare function McpPluginCatalog({
65
- servers,
66
- mcp,
67
- detailsByServerId,
68
- featuredServerIds,
69
- brandName,
70
- brandLogo,
71
- disclosure,
72
- onConnect,
73
- onDisconnect,
74
- onAddCustom,
75
- heading,
76
- searchLabel,
77
- emptyMessage,
78
- className,
79
- ...props
80
- }: McpPluginCatalogProps): React.JSX.Element;
81
- /** Reference-derived plugin detail surface without a parallel install state. */
82
- declare function McpPluginDetailsDialog({
83
- server,
84
- details,
85
- mcp,
86
- brandName,
87
- brandLogo,
88
- disclosure,
89
- onConnect,
90
- onDisconnect,
91
- onOpenChange
92
- }: McpPluginDetailsDialogProps): React.JSX.Element;
93
- //#endregion
1
+ import { a as McpPluginDetailsDialogProps, i as McpPluginDetailsDialog, n as McpPluginCatalogProps, r as McpPluginDetails, t as McpPluginCatalog } from "../../McpPluginCatalog-DNeHDrts.js";
94
2
  export { McpPluginCatalog, McpPluginCatalogProps, McpPluginDetails, McpPluginDetailsDialog, McpPluginDetailsDialogProps };
@@ -35,7 +35,7 @@ function McpPluginCatalog({ servers, mcp, detailsByServerId, featuredServerIds =
35
35
  className: "mcp-plugin-catalog__header",
36
36
  children: [
37
37
  /* @__PURE__ */ jsx("h1", {
38
- className: "sigvelo-visually-hidden",
38
+ className: "mcp-plugin-catalog__title",
39
39
  children: heading
40
40
  }),
41
41
  /* @__PURE__ */ jsxs(SearchField.Root, {
@@ -131,7 +131,7 @@ function McpPluginCatalog({ servers, mcp, detailsByServerId, featuredServerIds =
131
131
  function McpPluginDetailsDialog({ server, details, mcp, brandName = "your AI", brandLogo = /* @__PURE__ */ jsx("img", {
132
132
  alt: "",
133
133
  className: "sigvelo-brand-mark sigvelo-brand-mark--colorful",
134
- src: new URL("../../assets/think-browser-host.png", import.meta.url).href,
134
+ src: new URL("../../assets/sigvelo-logo.svg", import.meta.url).href,
135
135
  width: 128,
136
136
  height: 128
137
137
  }), disclosure = /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -227,7 +227,7 @@ function McpPluginCard({ server, details, mcp, onSelect }) {
227
227
  onClick: onSelect,
228
228
  children: [/* @__PURE__ */ jsx(McpServerIcon, {
229
229
  server,
230
- size: "md"
230
+ size: "sm"
231
231
  }), /* @__PURE__ */ jsxs("span", {
232
232
  className: "mcp-plugin-catalog__card-copy",
233
233
  children: [/* @__PURE__ */ jsx("span", {
@@ -30,7 +30,7 @@ function McpServerSetupDialog({ server, defaults, onOpenChange, onSubmit, redire
30
30
  open: server !== null,
31
31
  onOpenChange,
32
32
  children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Backdrop, {}), /* @__PURE__ */ jsx(Dialog.Viewport, { children: /* @__PURE__ */ jsxs(Dialog.Popup, { children: [
33
- /* @__PURE__ */ jsxs(Dialog.Header, { children: [/* @__PURE__ */ jsx(Dialog.Title, { children: server ? server.name.endsWith("MCP") ? server.name : `${server.name} MCP` : "MCP connectors" }), /* @__PURE__ */ jsx(Dialog.Description, { children: server?.manualSetup?.description ?? "Connect a remote MCP server the model can call." })] }),
33
+ /* @__PURE__ */ jsxs(Dialog.Header, { children: [/* @__PURE__ */ jsx(Dialog.Title, { children: server ? server.name.endsWith("MCP") ? server.name : `${server.name} MCP` : "Plugins" }), /* @__PURE__ */ jsx(Dialog.Description, { children: server?.manualSetup?.description ?? "Connect a remote MCP server the model can call." })] }),
34
34
  server?.manualSetup?.links.length ? /* @__PURE__ */ jsx("div", {
35
35
  className: "mcp-server-setup-dialog__links",
36
36
  children: server.manualSetup.links.map((link) => /* @__PURE__ */ jsx("a", {
@@ -262,14 +262,14 @@ function getPickerRows(servers, mcp) {
262
262
  function groupPickerRows(rows) {
263
263
  const groups = /* @__PURE__ */ new Map();
264
264
  for (const row of rows) {
265
- const key = row.projection.connectionKind === "connected" ? "Connected" : row.server.category === "Auto" ? "MCP connectors" : row.server.category === "Manual" ? "Manual setup" : row.server.category ?? "Other";
265
+ const key = row.projection.connectionKind === "connected" ? "Connected" : row.server.category === "Auto" ? "Plugins" : row.server.category === "Manual" ? "Manual setup" : row.server.category ?? "Other";
266
266
  const group = groups.get(key) ?? [];
267
267
  group.push(row);
268
268
  groups.set(key, group);
269
269
  }
270
270
  const order = [
271
271
  "Connected",
272
- "MCP connectors",
272
+ "Plugins",
273
273
  "Manual setup",
274
274
  "Other"
275
275
  ];
@@ -15,6 +15,8 @@ interface SubagentRunCollectionState {
15
15
  error?: string;
16
16
  }
17
17
  interface SubagentRunPanelProviderProps {
18
+ /** Conversation identity; changing it resets transient controls without remounting children. */
19
+ scopeKey: string;
18
20
  /** The one upstream event-hook value from the parent connection. */
19
21
  agentTools: AgentToolEventsValue<AgentToolRunPart>;
20
22
  collection: SubagentRunCollectionState;
@@ -39,6 +41,7 @@ interface SubagentRunPanelValue extends Pick<SubagentRunPanelProviderProps, "age
39
41
  }
40
42
  /** A thread's transient controls/disclosure state; run facts remain in the SDK value. */
41
43
  declare function SubagentRunPanelProvider({
44
+ scopeKey,
42
45
  agentTools,
43
46
  collection,
44
47
  mayExecute,
@@ -10,41 +10,55 @@ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/components/agents-sdk/SubagentRunPanel.tsx
11
11
  const IDLE = { pending: false };
12
12
  const SubagentRunPanelContext = React.createContext(null);
13
+ function createPanelState(scopeKey, selectedRunId) {
14
+ return {
15
+ scopeKey,
16
+ open: true,
17
+ hiddenCompleted: /* @__PURE__ */ new Set(),
18
+ commands: {},
19
+ reportDisclosures: createExpansionStore(),
20
+ inFlight: /* @__PURE__ */ new Map(),
21
+ restoreFocusRunId: { current: selectedRunId }
22
+ };
23
+ }
13
24
  /** A thread's transient controls/disclosure state; run facts remain in the SDK value. */
14
- function SubagentRunPanelProvider({ agentTools, collection, mayExecute, selectedRunId, parentRunning, onStopCurrentWork, onStopRun, children }) {
15
- const [open, setOpen] = React.useState(true);
16
- const [reportDisclosures] = React.useState(createExpansionStore);
17
- const [hiddenCompleted, setHiddenCompleted] = React.useState(/* @__PURE__ */ new Set());
18
- const [commands, setCommands] = React.useState({});
19
- const inFlight = React.useRef(/* @__PURE__ */ new Map());
20
- const restoreFocusRunId = React.useRef(selectedRunId);
25
+ function SubagentRunPanelProvider({ scopeKey, agentTools, collection, mayExecute, selectedRunId, parentRunning, onStopCurrentWork, onStopRun, children }) {
26
+ const [state, setState] = React.useState(() => createPanelState(scopeKey, selectedRunId));
27
+ if (state.scopeKey !== scopeKey) setState(createPanelState(scopeKey, selectedRunId));
28
+ const { open, hiddenCompleted, commands, reportDisclosures, inFlight, restoreFocusRunId } = state;
29
+ const setOpen = React.useCallback((open) => setState((current) => current.inFlight === inFlight ? {
30
+ ...current,
31
+ open
32
+ } : current), [inFlight]);
33
+ const setHiddenCompleted = React.useCallback((hiddenCompleted) => setState((current) => current.inFlight === inFlight ? {
34
+ ...current,
35
+ hiddenCompleted
36
+ } : current), [inFlight]);
21
37
  React.useLayoutEffect(() => {
22
38
  if (selectedRunId) restoreFocusRunId.current = selectedRunId;
23
- }, [selectedRunId]);
39
+ }, [restoreFocusRunId, selectedRunId]);
24
40
  const execute = React.useCallback((key, command) => {
25
- const pending = inFlight.current.get(key);
41
+ const pending = inFlight.get(key);
26
42
  if (pending) return pending;
27
- setCommands((current) => ({
43
+ const setCommand = (command) => setState((current) => current.inFlight === inFlight ? {
28
44
  ...current,
29
- [key]: { pending: true }
30
- }));
31
- const operation = Promise.resolve().then(command).then(() => setCommands((current) => ({
32
- ...current,
33
- [key]: IDLE
34
- })), (cause) => {
45
+ commands: {
46
+ ...current.commands,
47
+ [key]: command
48
+ }
49
+ } : current);
50
+ setCommand({ pending: true });
51
+ const operation = Promise.resolve().then(command).then(() => setCommand(IDLE), (cause) => {
35
52
  const error = cause instanceof Error ? cause.message : "Stop could not be confirmed. Try again.";
36
- setCommands((current) => ({
37
- ...current,
38
- [key]: {
39
- pending: false,
40
- error
41
- }
42
- }));
53
+ setCommand({
54
+ pending: false,
55
+ error
56
+ });
43
57
  throw cause;
44
- }).finally(() => inFlight.current.delete(key));
45
- inFlight.current.set(key, operation);
58
+ }).finally(() => inFlight.delete(key));
59
+ inFlight.set(key, operation);
46
60
  return operation;
47
- }, []);
61
+ }, [inFlight]);
48
62
  const stopCurrentWork = React.useCallback(() => execute("current-work", onStopCurrentWork), [execute, onStopCurrentWork]);
49
63
  const stopRun = React.useCallback((id) => execute(id, () => onStopRun(id)), [execute, onStopRun]);
50
64
  const value = React.useMemo(() => ({
@@ -71,6 +85,9 @@ function SubagentRunPanelProvider({ agentTools, collection, mayExecute, selected
71
85
  open,
72
86
  hiddenCompleted,
73
87
  reportDisclosures,
88
+ restoreFocusRunId,
89
+ setOpen,
90
+ setHiddenCompleted,
74
91
  commands,
75
92
  stopCurrentWork,
76
93
  stopRun
@@ -135,14 +152,14 @@ function delegatedWorkLabel(active, completed) {
135
152
  const counts = [active ? `${active} active` : null, completed ? `${completed} finished` : null].filter(Boolean).join(", ");
136
153
  return `Delegated work${counts ? `, ${counts}` : ""}`;
137
154
  }
138
- function SubagentRunPanelControls({ panel, active, completed }) {
155
+ function SubagentRunPanelControls({ panel, active }) {
139
156
  const queue = useOptionalAgentChatQueue();
140
157
  const stop = panel.commands["current-work"] ?? IDLE;
141
158
  const canStop = panel.parentRunning || active > 1 || panel.collection.status !== "ready";
142
- if (!canStop && !stop.error && !stop.pending && !completed.length) return null;
143
- return /* @__PURE__ */ jsxs(QueueSectionActions, {
159
+ if (!canStop && !stop.error && !stop.pending) return null;
160
+ return /* @__PURE__ */ jsx(QueueSectionActions, {
144
161
  "aria-label": "Delegated work controls",
145
- children: [canStop || stop.error || stop.pending ? /* @__PURE__ */ jsx(Button, {
162
+ children: canStop || stop.error || stop.pending ? /* @__PURE__ */ jsx(Button, {
146
163
  size: "xs",
147
164
  variant: "ghost",
148
165
  color: "neutral",
@@ -154,13 +171,7 @@ function SubagentRunPanelControls({ panel, active, completed }) {
154
171
  panel.stopCurrentWork().catch(() => void 0);
155
172
  },
156
173
  children: stop.pending ? "Stopping current work…" : "Stop current work"
157
- }) : null, completed.length ? /* @__PURE__ */ jsx(Button, {
158
- size: "xs",
159
- variant: "ghost",
160
- color: "neutral",
161
- onClick: () => panel.setHiddenCompleted(panel.hiddenCompleted.size ? /* @__PURE__ */ new Set() : new Set(completed.map((run) => run.runId))),
162
- children: panel.hiddenCompleted.size ? `Show completed (${completed.length})` : "Hide completed"
163
- }) : null]
174
+ }) : null
164
175
  });
165
176
  }
166
177
  function SubagentRunRow({ panel, run, renderRunLink }) {
@@ -206,13 +217,23 @@ function SubagentRunPanelContent({ panel, renderRunLink }) {
206
217
  onOpenChange: panel.setOpen,
207
218
  onFocusCapture: focus.onFocusCapture,
208
219
  onBlurCapture: focus.onBlurCapture,
209
- children: [/* @__PURE__ */ jsx(QueueSectionTrigger, {
210
- "data-slot": "subagent-run-panel-trigger",
211
- "aria-label": delegatedWorkLabel(active.length, completed.length),
212
- children: /* @__PURE__ */ jsx(QueueSectionLabel, {
213
- count: runs.length || void 0,
214
- children: "Delegated work"
215
- })
220
+ children: [/* @__PURE__ */ jsxs("div", {
221
+ className: "subagent-run__panel-header",
222
+ children: [/* @__PURE__ */ jsx(QueueSectionTrigger, {
223
+ "data-slot": "subagent-run-panel-trigger",
224
+ "aria-label": delegatedWorkLabel(active.length, completed.length),
225
+ children: /* @__PURE__ */ jsx(QueueSectionLabel, {
226
+ count: runs.length || void 0,
227
+ children: "Delegated work"
228
+ })
229
+ }), completed.length ? /* @__PURE__ */ jsx(Button, {
230
+ className: "subagent-run__completed-toggle",
231
+ size: "xs",
232
+ variant: "ghost",
233
+ color: "neutral",
234
+ onClick: () => panel.setHiddenCompleted(panel.hiddenCompleted.size ? /* @__PURE__ */ new Set() : new Set(completed.map((run) => run.runId))),
235
+ children: panel.hiddenCompleted.size ? `Show completed (${completed.length})` : "Hide completed"
236
+ }) : null]
216
237
  }), /* @__PURE__ */ jsxs(QueueSectionContent, { children: [
217
238
  stop.error ? /* @__PURE__ */ jsx(AgentChatNotice, {
218
239
  "data-tone": "danger",
@@ -235,8 +256,7 @@ function SubagentRunPanelContent({ panel, renderRunLink }) {
235
256
  }),
236
257
  /* @__PURE__ */ jsx(SubagentRunPanelControls, {
237
258
  panel,
238
- active: active.length,
239
- completed
259
+ active: active.length
240
260
  })
241
261
  ] })]
242
262
  })
@@ -3,7 +3,7 @@ import { i as AgentMessageRenderPartContext } from "../../AgentMessageParts-C7L-
3
3
  import { AgentChatMessageContentProps, AgentChatRootProps } from "./AgentChat.js";
4
4
  import { o as createThinkChatActivityRenderer, r as ThinkChatActivityRendererOptions, t as ThinkChatActivity } from "../../ThinkChatActivity-DENkintt.js";
5
5
  import { i as ThinkChatValue } from "../../ThinkChatContext-COIgzkYp.js";
6
- import { n as WorkspaceFileRenderer } from "../../WorkspaceMessageResponse-8lOSAbw_.js";
6
+ import { n as WorkspaceFileRenderer } from "../../WorkspaceMessageResponse-BApg8KZv.js";
7
7
  import { o as UseSessionCompactionResult } from "../../SessionCompaction-CmTJFpzj.js";
8
8
  import * as React from "react";
9
9
  import { ChatStatus, UIMessage } from "ai";
@@ -2,7 +2,7 @@ import { ActivityOutput, ActivityPanel } from "../ai-sdk/Activity.js";
2
2
  import { o as formatUnknownValue } from "../../format-COCyV98Z.js";
3
3
  import { Tabs } from "../foundations/Tabs.js";
4
4
  import { BrowserLiveView } from "./BrowserLiveView.js";
5
- import { i as CodeBlockContent, r as CodeBlockContainer, t as CodeBlock } from "../../CodeBlock-g8sADidM.js";
5
+ import { i as CodeBlockContent, r as CodeBlockContainer, t as CodeBlock } from "../../CodeBlock-Bl-q7wMc.js";
6
6
  import { inferWorkspaceLanguage } from "./WorkspaceFile.js";
7
7
  import { displayUrl, isSessionContextToolFailure } from "./ThinkChatToolParts.js";
8
8
  import * as React from "react";
@@ -240,25 +240,18 @@ function ThinkExecutionWorkbenchRunActions({ run }) {
240
240
  }
241
241
  function ThinkExecutionWorkbenchList({ children, className, ...props }) {
242
242
  const { runs } = useWorkbench();
243
- const runsId = React.useId();
244
- return /* @__PURE__ */ jsxs("section", {
245
- "aria-labelledby": runsId,
243
+ return /* @__PURE__ */ jsx("section", {
244
+ "aria-label": "Runs",
246
245
  ...props,
247
246
  className: cx("think-execution-workbench__run-list", className),
248
- children: [/* @__PURE__ */ jsx("div", {
249
- className: "think-execution-workbench__list-header",
250
- children: /* @__PURE__ */ jsx("h3", {
251
- id: runsId,
252
- children: "Runs"
253
- })
254
- }), runs.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
247
+ children: runs.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
255
248
  className: "think-execution-workbench__empty",
256
249
  description: "No runs yet."
257
250
  }) : /* @__PURE__ */ jsx("ul", {
258
251
  className: "think-execution-workbench__list",
259
252
  role: "list",
260
253
  children: runs.map((run) => /* @__PURE__ */ jsx("li", { children: children(run) }, `${isThinkSubmissionRun(run) ? "submission" : "workflow"}:${getThinkExecutionRunId(run)}`))
261
- })]
254
+ })
262
255
  });
263
256
  }
264
257
  function ThinkExecutionWorkbenchRunLink({ run, className, ...props }) {
@@ -11,6 +11,8 @@ interface ThinkFullAppRootProps extends React.ComponentPropsWithRef<"div"> {
11
11
  * Conversation/workbench layout, independent of routing and SDK connections.
12
12
  * Compose navigation outside the root. The conversation remains mounted while
13
13
  * compact layouts show the workbench; ResizableSidePanel owns desktop resizing.
14
+ * Compact layout follows the width available to this content, including any
15
+ * space occupied by a surrounding sidebar.
14
16
  */
15
17
  declare function ThinkFullAppRoot({
16
18
  workbenchOpen,
@@ -15,6 +15,8 @@ function useWorkbenchOpen() {
15
15
  * Conversation/workbench layout, independent of routing and SDK connections.
16
16
  * Compose navigation outside the root. The conversation remains mounted while
17
17
  * compact layouts show the workbench; ResizableSidePanel owns desktop resizing.
18
+ * Compact layout follows the width available to this content, including any
19
+ * space occupied by a surrounding sidebar.
18
20
  */
19
21
  function ThinkFullAppRoot({ workbenchOpen, children, className, ...props }) {
20
22
  return /* @__PURE__ */ jsx(WorkbenchOpenContext.Provider, {
@@ -6,8 +6,8 @@ import { Field } from "../foundations/Field.js";
6
6
  import { Form } from "../foundations/Form.js";
7
7
  import { Textarea } from "../foundations/Textarea.js";
8
8
  import { AppTopBar } from "../general-purpose/AppTopBar.js";
9
- import { Select } from "../foundations/Select.js";
10
9
  import { Fieldset } from "../foundations/Fieldset.js";
10
+ import { Select } from "../foundations/Select.js";
11
11
  import { Checkbox } from "../foundations/Checkbox.js";
12
12
  import { CheckboxGroup } from "../foundations/CheckboxGroup.js";
13
13
  import { Combobox } from "../foundations/Combobox.js";
@@ -1,2 +1,2 @@
1
- import { a as ThinkThreadStatusIndicatorsProps, i as ThinkThreadStatusIndicators, n as ThinkThreadPicker, o as ThinkThreadStatusSummary, r as ThinkThreadPickerProps, s as summarizeThinkThreads, t as ThinkThreadItem } from "../../ThinkThreadPicker-yetGX_s5.js";
1
+ import { a as ThinkThreadStatusIndicatorsProps, i as ThinkThreadStatusIndicators, n as ThinkThreadPicker, o as ThinkThreadStatusSummary, r as ThinkThreadPickerProps, s as summarizeThinkThreads, t as ThinkThreadItem } from "../../ThinkThreadPicker-DX0lL-P7.js";
2
2
  export { ThinkThreadItem, ThinkThreadPicker, ThinkThreadPickerProps, ThinkThreadStatusIndicators, ThinkThreadStatusIndicatorsProps, ThinkThreadStatusSummary, summarizeThinkThreads };
@@ -1,11 +1,12 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { B as PlusIcon, K as SpinnerIcon, _ as DotIcon, et as WarningIcon, t as ArchiveIcon } from "../../icons-cuEtsgj9.js";
2
+ import { K as SpinnerIcon, R as PencilIcon, _ as DotIcon, et as WarningIcon, t as ArchiveIcon } from "../../icons-cuEtsgj9.js";
3
3
  import { Button, buttonVariants } from "../foundations/Button.js";
4
+ import { Tooltip } from "../foundations/Tooltip.js";
4
5
  import { a as formatErrorMessage } from "../../format-COCyV98Z.js";
5
6
  import { ScrollArea } from "../foundations/ScrollArea.js";
6
7
  import { EmptyState } from "../foundations/EmptyState.js";
7
- import { AlertDialog } from "../foundations/AlertDialog.js";
8
8
  import { n as isPlainPrimaryLinkActivation, t as NavigationLink } from "../../navigation-link-kqMa81v5.js";
9
+ import { AlertDialog } from "../foundations/AlertDialog.js";
9
10
  import { LinkButton } from "../foundations/LinkButton.js";
10
11
  import { SearchField } from "../foundations/SearchField.js";
11
12
  import * as React from "react";
@@ -109,7 +110,7 @@ function ThinkThreadStatusIndicators({ summary, className }) {
109
110
  * notes beside the parent Think agent because
110
111
  * `listThreads()`/`createThread()`/`deleteThread()` are app-owned.
111
112
  */
112
- function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSelect, onDelete, className, title = "Recents", "aria-label": ariaLabel = "Threads", ref, ...props }) {
113
+ function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSelect, onDelete, className, title = "Recents", headerActions, "aria-label": ariaLabel = "Threads", ref, ...props }) {
113
114
  const statusSummary = summarizeThinkThreads(threads);
114
115
  const [query, setQuery] = React.useState("");
115
116
  const [deleteOpen, setDeleteOpen] = React.useState(false);
@@ -161,10 +162,34 @@ function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSele
161
162
  children: [
162
163
  /* @__PURE__ */ jsxs("header", {
163
164
  className: "think-thread-picker__header",
164
- children: [/* @__PURE__ */ jsx("h2", {
165
- className: "think-thread-picker__title sigvelo-truncate",
166
- children: title
167
- }), /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, { summary: statusSummary })]
165
+ children: [
166
+ /* @__PURE__ */ jsx("h2", {
167
+ className: "think-thread-picker__title sigvelo-truncate",
168
+ children: title
169
+ }),
170
+ /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, {
171
+ summary: statusSummary,
172
+ className: "sigvelo-visually-hidden"
173
+ }),
174
+ createThreadLink ? /* @__PURE__ */ jsxs(Tooltip.Root, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
175
+ render: /* @__PURE__ */ jsx(LinkButton, {
176
+ ref: createButtonRef,
177
+ variant: "ghost",
178
+ color: "neutral",
179
+ size: "sm",
180
+ className: "think-thread-picker__create",
181
+ "aria-label": "New thread",
182
+ "data-icon-only": "",
183
+ render: createThreadLink
184
+ }),
185
+ children: /* @__PURE__ */ jsx(PencilIcon, {})
186
+ }), /* @__PURE__ */ jsx(Tooltip.Portal, { children: /* @__PURE__ */ jsx(Tooltip.Positioner, {
187
+ side: "top",
188
+ sideOffset: 6,
189
+ children: /* @__PURE__ */ jsx(Tooltip.Popup, { children: "New thread" })
190
+ }) })] }) : null,
191
+ headerActions
192
+ ]
168
193
  }),
169
194
  /* @__PURE__ */ jsxs(SearchField.Root, {
170
195
  className: "think-thread-picker__search",
@@ -259,18 +284,6 @@ function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSele
259
284
  })]
260
285
  })
261
286
  }),
262
- createThreadLink ? /* @__PURE__ */ jsx("div", {
263
- className: "think-thread-picker__footer",
264
- children: /* @__PURE__ */ jsxs(LinkButton, {
265
- ref: createButtonRef,
266
- variant: "normal",
267
- color: "neutral",
268
- size: "sm",
269
- className: "think-thread-picker__create",
270
- render: createThreadLink,
271
- children: [/* @__PURE__ */ jsx(PlusIcon, {}), /* @__PURE__ */ jsx("span", { children: "New thread" })]
272
- })
273
- }) : null,
274
287
  onDelete && deleteCandidate ? /* @__PURE__ */ jsx(AlertDialog.Root, {
275
288
  open: deleteOpen,
276
289
  onOpenChange: (open, eventDetails) => {
@@ -0,0 +1,18 @@
1
+ import { l as WorkspaceNavigationAdapter } from "../../WorkspaceLink-Bh9-Jo1r.js";
2
+ import { ReactElement } from "react";
3
+
4
+ //#region src/components/agents-sdk/WorkbenchBack.d.ts
5
+ /** Back follows the visible hierarchy, never unrelated browser history. */
6
+ declare function WorkbenchBack({
7
+ navigation,
8
+ filesOpen,
9
+ onBackToChat,
10
+ backToChatLink
11
+ }: {
12
+ navigation?: WorkspaceNavigationAdapter;
13
+ filesOpen: boolean;
14
+ onBackToChat?: () => void;
15
+ backToChatLink?: ReactElement;
16
+ }): import("react").JSX.Element;
17
+ //#endregion
18
+ export { WorkbenchBack };
@@ -0,0 +1,27 @@
1
+ import { r as ArrowLeftIcon } from "../../icons-cuEtsgj9.js";
2
+ import { AppTopBar } from "../general-purpose/AppTopBar.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/agents-sdk/WorkbenchBack.tsx
5
+ /** Back follows the visible hierarchy, never unrelated browser history. */
6
+ function WorkbenchBack({ navigation, filesOpen, onBackToChat, backToChatLink }) {
7
+ if (filesOpen && navigation?.current.destination.kind === "file") return /* @__PURE__ */ jsx(AppTopBar.Link, {
8
+ "data-workbench-back": "",
9
+ label: "Back to workspace",
10
+ render: navigation.renderLink({ kind: "files" }),
11
+ children: /* @__PURE__ */ jsx(ArrowLeftIcon, {})
12
+ });
13
+ if (backToChatLink) return /* @__PURE__ */ jsx(AppTopBar.Link, {
14
+ "data-workbench-back": "",
15
+ label: "Back to chat",
16
+ render: backToChatLink,
17
+ children: /* @__PURE__ */ jsx(ArrowLeftIcon, {})
18
+ });
19
+ return /* @__PURE__ */ jsx(AppTopBar.Button, {
20
+ "data-workbench-back": "",
21
+ label: "Back to chat",
22
+ onClick: onBackToChat,
23
+ children: /* @__PURE__ */ jsx(ArrowLeftIcon, {})
24
+ });
25
+ }
26
+ //#endregion
27
+ export { WorkbenchBack };
@@ -1,2 +1,2 @@
1
- import { A as workspaceFileQueryKey, C as refreshWorkspaceFileQueries, D as workspaceDirectoryQueryOptions, E as workspaceDirectoryQueryKey, F as workspaceTextFileQueryOptions, M as workspaceInfoQueryKey, N as workspaceInfoQueryOptions, O as workspaceDirectoryQueryPrefix, P as workspaceQueryKey, S as WorkspaceTextFileQueryOptions, T as workspaceBinaryFileQueryOptions, _ as WorkspaceQueryOptions, a as WorkspaceDirectoryQueryOptions, b as WorkspaceState, c as WorkspaceFileQueryKey, d as WorkspaceFileStatQueryOptions, f as WorkspaceFileVersion, g as WorkspaceQueryKey, h as WorkspaceInfoQueryOptions, i as WorkspaceDirectoryQueryKey, j as workspaceFileStatQueryOptions, k as workspaceFileAssetQueryOptions, 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 WorkspaceResolvedAsset, w as useWorkspace, x as WorkspaceTextFileQueryKey, y as WorkspaceSource } from "../../Workspace-HzGrWDX3.js";
1
+ import { A as workspaceFileQueryKey, C as refreshWorkspaceFileQueries, D as workspaceDirectoryQueryOptions, E as workspaceDirectoryQueryKey, F as workspaceTextFileQueryOptions, M as workspaceInfoQueryKey, N as workspaceInfoQueryOptions, O as workspaceDirectoryQueryPrefix, P as workspaceQueryKey, S as WorkspaceTextFileQueryOptions, T as workspaceBinaryFileQueryOptions, _ as WorkspaceQueryOptions, a as WorkspaceDirectoryQueryOptions, b as WorkspaceState, c as WorkspaceFileQueryKey, d as WorkspaceFileStatQueryOptions, f as WorkspaceFileVersion, g as WorkspaceQueryKey, h as WorkspaceInfoQueryOptions, i as WorkspaceDirectoryQueryKey, j as workspaceFileStatQueryOptions, k as workspaceFileAssetQueryOptions, 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 WorkspaceResolvedAsset, w as useWorkspace, x as WorkspaceTextFileQueryKey, y as WorkspaceSource } from "../../Workspace-mzMZSdts.js";
2
2
  export { UseWorkspaceOptions, WorkspaceBinaryFileQueryKey, WorkspaceBinaryFileQueryOptions, WorkspaceDirectoryQueryKey, WorkspaceDirectoryQueryOptions, WorkspaceFileAssetQueryKey, WorkspaceFileAssetQueryOptions, WorkspaceFileQueryKey, WorkspaceFileReadTarget, WorkspaceFileStatQueryKey, WorkspaceFileStatQueryOptions, WorkspaceFileVersion, WorkspaceInfo, WorkspaceInfoQueryKey, WorkspaceInfoQueryOptions, WorkspaceQueryKey, WorkspaceQueryOptions, WorkspaceResolvedAsset, WorkspaceSource, WorkspaceState, WorkspaceTextFileQueryKey, WorkspaceTextFileQueryOptions, refreshWorkspaceFileQueries, useWorkspace, workspaceBinaryFileQueryOptions, workspaceDirectoryQueryKey, workspaceDirectoryQueryOptions, workspaceDirectoryQueryPrefix, workspaceFileAssetQueryOptions, workspaceFileQueryKey, workspaceFileStatQueryOptions, workspaceInfoQueryKey, workspaceInfoQueryOptions, workspaceQueryKey, workspaceTextFileQueryOptions };
@@ -1,4 +1,4 @@
1
- import { b as WorkspaceState } from "../../Workspace-HzGrWDX3.js";
1
+ import { b as WorkspaceState } from "../../Workspace-mzMZSdts.js";
2
2
  import * as React from "react";
3
3
 
4
4
  //#region src/components/agents-sdk/WorkspaceBrowser.d.ts
@@ -63,6 +63,7 @@ function WorkspaceBrowser({ workspace, title = "Workspace", leading, actions, sh
63
63
  role: "alert",
64
64
  children: error
65
65
  }) : filterQuery ? filteredFiles.length > 0 ? /* @__PURE__ */ jsx(FileTree, {
66
+ appearance: "plain",
66
67
  className: "workspace-explorer__tree",
67
68
  selectedPath,
68
69
  onSelect: handleSelect,
@@ -76,6 +77,7 @@ function WorkspaceBrowser({ workspace, title = "Workspace", leading, actions, sh
76
77
  className: "workspace-explorer__empty",
77
78
  children: "No matching files"
78
79
  }) : rootEntries.length > 0 ? /* @__PURE__ */ jsx(FileTree, {
80
+ appearance: "plain",
79
81
  className: "workspace-explorer__tree",
80
82
  expanded: new Set(expandedPaths),
81
83
  onExpandedChange: setExpandedPaths,
@@ -1,4 +1,4 @@
1
- import { _ as WorkspaceQueryOptions, g as WorkspaceQueryKey } from "../../Workspace-HzGrWDX3.js";
1
+ import { _ as WorkspaceQueryOptions, g as WorkspaceQueryKey } from "../../Workspace-mzMZSdts.js";
2
2
  import { QueryClient, QueryFunction } from "@tanstack/react-query";
3
3
 
4
4
  //#region src/components/agents-sdk/WorkspaceConcept.d.ts
@@ -5,12 +5,13 @@ import { IconButton } from "../foundations/IconButton.js";
5
5
  import { a as formatErrorMessage, o as formatUnknownValue, r as firstLine } from "../../format-COCyV98Z.js";
6
6
  import { Field } from "../foundations/Field.js";
7
7
  import { Form } from "../foundations/Form.js";
8
- import { EmptyState } from "../foundations/EmptyState.js";
9
8
  import { Input } from "../foundations/Input.js";
9
+ import { EmptyState } from "../foundations/EmptyState.js";
10
10
  import { DescriptionList } from "../foundations/DescriptionList.js";
11
11
  import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "../foundations/Card.js";
12
12
  import { Checkbox } from "../foundations/Checkbox.js";
13
13
  import { i as WorkspaceDeleteControl, n as WorkspaceComposerLink, r as httpUrl, t as FaviconMark } from "../../workspace-assets-Bg7XhPsk.js";
14
+ import { t as WorkspaceConceptPanel } from "../../WorkspaceConceptPanel-97ZyVpZI.js";
14
15
  import * as React from "react";
15
16
  import { createElement } from "react";
16
17
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -102,7 +103,7 @@ function ExecutionFields({ draft, outcome, parameters, runs, onDraftChange }) {
102
103
  const href = parameter.type === "string" ? httpUrl(String(editing ? draft?.[parameter.name] ?? parameter.value : parameter.value)) : void 0;
103
104
  return /* @__PURE__ */ jsxs(DescriptionList.Item, { children: [/* @__PURE__ */ jsxs(DescriptionList.Term, {
104
105
  id: parameter.type === "boolean" ? id : void 0,
105
- children: [href ? /* @__PURE__ */ jsx(FaviconMark, { href }) : null, editing && parameter.type !== "boolean" ? /* @__PURE__ */ jsx("label", {
106
+ children: [href && !editing ? /* @__PURE__ */ jsx(FaviconMark, { href }) : null, editing && parameter.type !== "boolean" ? /* @__PURE__ */ jsx("label", {
106
107
  htmlFor: id,
107
108
  children: parameterLabel
108
109
  }) : parameterLabel]
@@ -263,7 +264,8 @@ function WorkspaceExecutionFile({ fallback = null, path, source, ...props }) {
263
264
  function WorkspaceExecutionsPanel({ className, source, ref, ...props }) {
264
265
  const query = useQuery(source.queryOptions);
265
266
  const modules = query.data ?? [];
266
- return /* @__PURE__ */ jsx("section", {
267
+ return /* @__PURE__ */ jsx(WorkspaceConceptPanel, {
268
+ heading: "Executions",
267
269
  ref,
268
270
  "data-slot": "workspace-executions-panel",
269
271
  className: cx("workspace-concept-panel", className),
@@ -288,7 +290,8 @@ function WorkspaceExecutionsPanel({ className, source, ref, ...props }) {
288
290
  title: "Loading modules"
289
291
  }) : /* @__PURE__ */ jsx(EmptyState, {
290
292
  icon: /* @__PURE__ */ jsx(TerminalIcon, {}),
291
- title: "No modules"
293
+ title: "No modules",
294
+ description: "Ask your assistant to save a reusable workflow to find it here."
292
295
  })
293
296
  }, JSON.stringify(source.queryOptions.queryKey));
294
297
  }