@mcp-b/react-components 0.44.0 → 0.45.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 (139) hide show
  1. package/dist/{AgentToolRunsContext-daY67hFM.d.ts → AgentToolRunsContext-jtmveaRE.d.ts} +8 -7
  2. package/dist/{CodeBlock-Dl7a3Wqo.js → CodeBlock-8K1p1BDU.js} +1 -1
  3. package/dist/{FileTree-Uu3ZnW1u.js → FileTree-QTP57Qz4.js} +1 -1
  4. package/dist/{ResponsiveSidebarShell-DOXd5T-d.d.ts → ResponsiveSidebarShell-BTVPxLJK.d.ts} +12 -0
  5. package/dist/{SetupChecklist-DOp-zqjh.js → SetupChecklist-CZeToAbu.js} +1 -1
  6. package/dist/{ThinkChat-BES_3Mb-.js → ThinkChat-CWMcl79Q.js} +3 -21
  7. package/dist/{Workspace-F3raHdYV.d.ts → Workspace-jdVZ9S0a.d.ts} +1 -1
  8. package/dist/{WorkspaceFile-BLaFmMrt.d.ts → WorkspaceFile-Dq-GC0_T.d.ts} +3 -1
  9. package/dist/{WorkspaceFileView-BublZXky.js → WorkspaceFileView-DJ8Oxz57.js} +3 -3
  10. package/dist/components/agents-sdk/AgentActivity.js +1 -1
  11. package/dist/components/agents-sdk/AgentChat.js +18 -13
  12. package/dist/components/agents-sdk/AgentEvent.d.ts +42 -0
  13. package/dist/components/agents-sdk/AgentEvent.js +96 -0
  14. package/dist/components/agents-sdk/AgentToolRunsContext.d.ts +1 -1
  15. package/dist/components/agents-sdk/AgentToolRunsContext.js +11 -7
  16. package/dist/components/agents-sdk/BrowserLiveScreen.js +1 -1
  17. package/dist/components/agents-sdk/BrowserLiveView.js +1 -1
  18. package/dist/components/agents-sdk/BrowserReplay.js +2 -2
  19. package/dist/components/agents-sdk/BrowserRunPanel.js +1 -1
  20. package/dist/components/agents-sdk/ManagerOffice.d.ts +104 -10
  21. package/dist/components/agents-sdk/ManagerOffice.js +1171 -147
  22. package/dist/components/agents-sdk/McpConnectionRequest.js +2 -2
  23. package/dist/components/agents-sdk/McpConnectorForm.js +1 -1
  24. package/dist/components/agents-sdk/McpPluginCatalog.js +4 -4
  25. package/dist/components/agents-sdk/McpServerPicker.js +3 -3
  26. package/dist/components/agents-sdk/ModelSelector.js +4 -4
  27. package/dist/components/agents-sdk/PromptInputApproval.js +1 -1
  28. package/dist/components/agents-sdk/PromptInputCommands.js +1 -1
  29. package/dist/components/agents-sdk/SubagentRunDetails.js +1 -1
  30. package/dist/components/agents-sdk/SubagentRunIndicator.d.ts +21 -3
  31. package/dist/components/agents-sdk/SubagentRunIndicator.js +56 -6
  32. package/dist/components/agents-sdk/SubagentRunSelector.js +5 -12
  33. package/dist/components/agents-sdk/ThinkChat.d.ts +1 -2
  34. package/dist/components/agents-sdk/ThinkChat.js +1 -1
  35. package/dist/components/agents-sdk/ThinkChatActivity.js +3 -3
  36. package/dist/components/agents-sdk/ThinkChatActivitySummary.js +1 -1
  37. package/dist/components/agents-sdk/ThinkChatToolPanels.js +2 -2
  38. package/dist/components/agents-sdk/ThinkExecutionDetail.js +3 -3
  39. package/dist/components/agents-sdk/ThinkExecutionRun.js +1 -1
  40. package/dist/components/agents-sdk/ThinkExecutionStatus.js +1 -1
  41. package/dist/components/agents-sdk/ThinkExecutionWorkbench.js +3 -3
  42. package/dist/components/agents-sdk/ThinkFullApp.d.ts +15 -5
  43. package/dist/components/agents-sdk/ThinkFullApp.js +51 -5
  44. package/dist/components/agents-sdk/ThinkFullAppViewSwitch.js +1 -1
  45. package/dist/components/agents-sdk/ThinkPendingApproval.js +1 -1
  46. package/dist/components/agents-sdk/ThinkRecoveryNotice.js +1 -1
  47. package/dist/components/agents-sdk/ThinkRoutineBrowser.js +3 -3
  48. package/dist/components/agents-sdk/ThinkRoutineDetail.js +1 -1
  49. package/dist/components/agents-sdk/ThinkRoutineForm.js +4 -4
  50. package/dist/components/agents-sdk/ThinkRoutineLibrary.d.ts +1 -1
  51. package/dist/components/agents-sdk/ThinkRoutineLibrary.js +4 -4
  52. package/dist/components/agents-sdk/ThinkRoutineRuns.js +1 -1
  53. package/dist/components/agents-sdk/ThinkSidepanel.d.ts +22 -4
  54. package/dist/components/agents-sdk/ThinkSidepanel.js +69 -30
  55. package/dist/components/agents-sdk/ThinkThreadPicker.js +5 -5
  56. package/dist/components/agents-sdk/Workspace.d.ts +1 -1
  57. package/dist/components/agents-sdk/Workspace.js +14 -4
  58. package/dist/components/agents-sdk/WorkspaceBrowser.d.ts +1 -1
  59. package/dist/components/agents-sdk/WorkspaceBrowser.js +1 -1
  60. package/dist/components/agents-sdk/WorkspaceExplorer.d.ts +1 -1
  61. package/dist/components/agents-sdk/WorkspaceExplorer.js +1 -1
  62. package/dist/components/agents-sdk/WorkspaceFile.d.ts +2 -2
  63. package/dist/components/agents-sdk/WorkspaceFile.js +18 -1
  64. package/dist/components/agents-sdk/WorkspaceFileView.d.ts +1 -1
  65. package/dist/components/agents-sdk/WorkspaceFileView.js +1 -1
  66. package/dist/components/agents-sdk/WorkspaceHeader.js +1 -1
  67. package/dist/components/agents-sdk/WorkspaceMountManager.js +4 -21
  68. package/dist/components/ai-sdk/Activity.js +1 -1
  69. package/dist/components/ai-sdk/AgentChatStartScreen.js +1 -1
  70. package/dist/components/ai-sdk/Approval.js +2 -2
  71. package/dist/components/ai-sdk/Artifact.js +1 -1
  72. package/dist/components/ai-sdk/ChainOfThought.js +1 -1
  73. package/dist/components/ai-sdk/Checkpoint.js +1 -1
  74. package/dist/components/ai-sdk/CodeBlock.js +1 -1
  75. package/dist/components/ai-sdk/ConnectedAppCards.js +3 -3
  76. package/dist/components/ai-sdk/Context.js +1 -1
  77. package/dist/components/ai-sdk/Conversation.js +1 -1
  78. package/dist/components/ai-sdk/Goal.js +2 -2
  79. package/dist/components/ai-sdk/InlineCitation.js +1 -1
  80. package/dist/components/ai-sdk/MediaPreviewCard.js +1 -1
  81. package/dist/components/ai-sdk/Message.js +2 -2
  82. package/dist/components/ai-sdk/MessageScroller.js +1 -1
  83. package/dist/components/ai-sdk/MessageScrollerVirtual.js +1 -1
  84. package/dist/components/ai-sdk/Plan.js +2 -2
  85. package/dist/components/ai-sdk/PromptInput.js +3 -3
  86. package/dist/components/ai-sdk/Queue.js +2 -2
  87. package/dist/components/ai-sdk/Reasoning.js +2 -2
  88. package/dist/components/ai-sdk/Sources.js +1 -1
  89. package/dist/components/ai-sdk/Task.js +1 -1
  90. package/dist/components/ai-sdk/ToolInvocation.js +1 -1
  91. package/dist/components/extension/ChatGptSignInScreen.js +1 -1
  92. package/dist/components/extension/CodexModelSelector.js +2 -2
  93. package/dist/components/extension/ConversationTabPicker.js +2 -2
  94. package/dist/components/foundations/Checkbox.js +1 -1
  95. package/dist/components/foundations/Collapsible.js +1 -1
  96. package/dist/components/foundations/ContextMenu.js +1 -1
  97. package/dist/components/foundations/Menubar.js +1 -1
  98. package/dist/components/foundations/SearchField.js +1 -1
  99. package/dist/components/foundations/Select.js +1 -1
  100. package/dist/components/foundations/Stepper.js +1 -1
  101. package/dist/components/foundations/Toast.js +1 -1
  102. package/dist/components/foundations/ToggleGroup.d.ts +1 -1
  103. package/dist/components/foundations/ToggleGroup.js +1 -1
  104. package/dist/components/foundations/icons.js +1 -1
  105. package/dist/components/general-purpose/Commit.js +2 -2
  106. package/dist/components/general-purpose/EnvironmentVariables.js +2 -2
  107. package/dist/components/general-purpose/FileTree.js +1 -1
  108. package/dist/components/general-purpose/PricingBillingToggle.js +1 -1
  109. package/dist/components/general-purpose/PricingPlanCard.js +2 -2
  110. package/dist/components/general-purpose/PricingUsageCalculator.js +2 -2
  111. package/dist/components/general-purpose/ResizableSidePanel.js +1 -1
  112. package/dist/components/general-purpose/ResponsiveSidebarShell.d.ts +1 -1
  113. package/dist/components/general-purpose/ResponsiveSidebarShell.js +72 -22
  114. package/dist/components/general-purpose/SettingsFormDialog.js +2 -2
  115. package/dist/components/general-purpose/SetupChecklist.js +1 -1
  116. package/dist/components/general-purpose/Terminal.js +2 -2
  117. package/dist/components/general-purpose/TestResults.js +1 -1
  118. package/dist/components/general-purpose/ThemeModeControl.js +2 -2
  119. package/dist/components/general-purpose/WebPreview.js +3 -3
  120. package/dist/components/nanites/AgentConnection.js +2 -2
  121. package/dist/components/nanites/AgentToolDetail.js +4 -4
  122. package/dist/{copy-button-DHhf-J1d.js → copy-button-BpA7wQva.js} +1 -1
  123. package/dist/{format-DB2mX9DA.js → format-COCyV98Z.js} +23 -1
  124. package/dist/{progress-ring-BEocM1e3.js → progress-ring-Cgii90dC.js} +1 -1
  125. package/dist/styles/agent-event.css +14 -0
  126. package/dist/styles/avatar.css +2 -1
  127. package/dist/styles/base.css +4 -0
  128. package/dist/styles/button.css +10 -0
  129. package/dist/styles/index.css +1 -0
  130. package/dist/styles/manager-office.css +1303 -70
  131. package/dist/styles/message-scroller.css +5 -0
  132. package/dist/styles/responsive-sidebar-shell.css +47 -0
  133. package/dist/styles/subagent-run.css +29 -19
  134. package/dist/styles/think-full-app.css +139 -4
  135. package/dist/styles/think-sidepanel.css +0 -5
  136. package/dist/styles/think-thread-picker.css +13 -12
  137. package/dist/styles/workspace-mount-manager.css +0 -22
  138. package/package.json +8 -8
  139. package/dist/{icons-Dw-im7lg.js → icons-DbrksZyY.js} +1 -1
@@ -25,13 +25,14 @@ type AgentToolEventSource = Parameters<typeof useAgentToolEvents>[0]["agent"] &
25
25
  * The subscription's listener attaches in a passive effect, after paint. A
26
26
  * host whose transport is in-process (the browser extension's port bridge)
27
27
  * can complete the connect and deliver the replay before that effect runs —
28
- * reliably so on a hot return from a drill-in. Upstream owns the fix:
29
- * `useAgent` buffers `agent-tool-event` frames from socket construction and
30
- * `useAgentToolEvents` drains them when its listener attaches (agents >
31
- * 0.20.1; `_bufferAgentToolReplayFrame` is the seam for a non-`useAgent`
32
- * socket). On older versions such hosts must buffer and re-dispatch
33
- * themselves think-browser-host's `useThinkAgentToolEvents` is that
34
- * interim shim. Network transports are not affected in practice: the round
28
+ * reliably so on a hot return from a drill-in. The fix lives in the Agents
29
+ * SDK, not here: `useAgent` buffers `agent-tool-event` frames from socket
30
+ * construction and `useAgentToolEvents` drains them when its listener
31
+ * attaches (`_bufferAgentToolReplayFrame` is the seam for a non-`useAgent`
32
+ * socket). As of agents 0.21.0 that is still the browser host's vendored
33
+ * edit, not a published release; a host on the published package has to
34
+ * buffer and re-dispatch the frames around its own socket before this hook
35
+ * can see them. Network transports are not affected in practice: the round
35
36
  * trip loses to the effect flush.
36
37
  */
37
38
  declare function useSourceScopedAgentToolEvents<Part extends AgentToolRunPart = UIMessage["parts"][number]>(agent: AgentToolEventSource): {
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "./class-names-BiMDVpUo.js";
2
- import { t as CopyButton } from "./copy-button-DHhf-J1d.js";
3
2
  import { Select } from "./components/foundations/Select.js";
3
+ import { t as CopyButton } from "./copy-button-BpA7wQva.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-BiMDVpUo.js";
2
- import { C as FolderIcon, S as FileIcon, p as ChevronRightIcon, w as FolderOpenIcon } from "./icons-Dw-im7lg.js";
2
+ import { C as FolderIcon, S as FileIcon, p as ChevronRightIcon, w as FolderOpenIcon } from "./icons-DbrksZyY.js";
3
3
  import { t as NavigationLink } from "./navigation-link-kqMa81v5.js";
4
4
  import * as React from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -72,6 +72,14 @@ interface ResponsiveSidebarShellProps extends Omit<React.HTMLAttributes<HTMLDivE
72
72
  children?: React.ReactNode;
73
73
  /** Short noun used by the toggle and resize control, such as “threads” or “schedules”. */
74
74
  sidebarLabel?: string;
75
+ /** Whether the sidebar is open. Omit for internal state. */
76
+ sidebarOpen?: boolean;
77
+ /** Move the wide-layout toggle into the sidebar while it is open. */
78
+ sidebarTogglePlacement?: "main" | "sidebar";
79
+ /** Initial sidebar state when `sidebarOpen` is uncontrolled. */
80
+ defaultSidebarOpen?: boolean;
81
+ /** Called when the sidebar is opened or closed. */
82
+ onSidebarOpenChange?: (open: boolean) => void;
75
83
  /** Initial desktop sidebar width in CSS pixels. */
76
84
  defaultSidebarWidth?: number;
77
85
  /** Shell-owned application bar composed from slots. */
@@ -95,7 +103,11 @@ interface ResponsiveSidebarShellProps extends Omit<React.HTMLAttributes<HTMLDivE
95
103
  declare function ResponsiveSidebarShell({
96
104
  sidebar,
97
105
  sidebarLabel,
106
+ sidebarOpen,
107
+ sidebarTogglePlacement,
108
+ defaultSidebarOpen,
98
109
  defaultSidebarWidth,
110
+ onSidebarOpenChange,
99
111
  bar,
100
112
  error,
101
113
  showMainLabel,
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "./class-names-BiMDVpUo.js";
2
- import { V as PlusIcon, d as CheckIcon, et as WarningIcon, f as ChevronDownIcon } from "./icons-Dw-im7lg.js";
2
+ import { V as PlusIcon, d as CheckIcon, et as WarningIcon, f as ChevronDownIcon } from "./icons-DbrksZyY.js";
3
3
  import { Button } from "./components/foundations/Button.js";
4
4
  import { Menu } from "./components/foundations/Menu.js";
5
5
  import * as React from "react";
@@ -1,13 +1,12 @@
1
1
  import { TransitionSurface } from "./components/foundations/TransitionSurface.js";
2
+ import { AgentToolRunsProvider, useSourceScopedAgentToolEvents } from "./components/agents-sdk/AgentToolRunsContext.js";
2
3
  import { AgentChat, compactingNotice } from "./components/agents-sdk/AgentChat.js";
3
- import { AgentToolRunsProvider, useOptionalAgentToolRuns, useSourceScopedAgentToolEvents } from "./components/agents-sdk/AgentToolRunsContext.js";
4
- import { SubagentRunList } from "./components/agents-sdk/SubagentRunList.js";
5
4
  import { ThinkChatContext, ThinkChatLiveContext, useOptionalThinkChatContext, useThinkChatContext } from "./components/agents-sdk/ThinkChatContext.js";
6
5
  import { ThinkChatActivity, createThinkChatActivityRenderer, renderThinkChatActivityPart } from "./components/agents-sdk/ThinkChatActivity.js";
7
6
  import { ThinkRecoveryNotice } from "./components/agents-sdk/ThinkRecoveryNotice.js";
8
7
  import { t as WorkspaceMessageResponse } from "./WorkspaceMessageResponse-CJCmGvTx.js";
9
8
  import * as React from "react";
10
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
11
10
  import { isTextUIPart } from "ai";
12
11
  import { useAgentChat } from "@cloudflare/think/react";
13
12
  import { useAgent } from "agents/react";
@@ -195,9 +194,8 @@ const ThinkChatApprovalsContext = React.createContext(null);
195
194
  * inside the log) or `excludeTools` + your own `renderPart` (standalone
196
195
  * card) — see README "App-specific tools" and the Custom Tool Panel story.
197
196
  */
198
- function ThinkChatMessages({ composerHeader, draft, loading, renderPart, excludeTools, renderAgentToolRunLink, renderWorkspaceHtmlArtifact, toolRenderers, thinkStub, onExecutionSettled, pendingApprovals, notice, sessionCompaction, ...props }) {
197
+ function ThinkChatMessages({ draft, loading, renderPart, excludeTools, renderAgentToolRunLink, renderWorkspaceHtmlArtifact, toolRenderers, thinkStub, onExecutionSettled, pendingApprovals, notice, sessionCompaction, ...props }) {
199
198
  const chat = useOptionalThinkChatContext();
200
- const agentTools = useOptionalAgentToolRuns();
201
199
  const approvals = React.useContext(ThinkChatApprovalsContext);
202
200
  const resolvedApprovals = resolveThinkApprovalProps({
203
201
  thinkStub,
@@ -259,19 +257,6 @@ function ThinkChatMessages({ composerHeader, draft, loading, renderPart, exclude
259
257
  children: [compactionSizeText(landedCompaction), " Context usage updates after your next message."]
260
258
  }) : null;
261
259
  const recoveryActive = chat && (chat.isRecovering || chat.connectionError || chat.error);
262
- const backgroundRuns = renderAgentToolRunLink ? agentTools?.unboundRuns : void 0;
263
- const resolvedComposerHeader = composerHeader || backgroundRuns?.length ? /* @__PURE__ */ jsxs(Fragment, { children: [composerHeader, backgroundRuns?.length && renderAgentToolRunLink ? /* @__PURE__ */ jsxs("div", {
264
- className: "subagent-run__tray",
265
- "data-slot": "background-agent-runs",
266
- children: [/* @__PURE__ */ jsx("span", {
267
- className: "subagent-run__tray-label",
268
- children: "Background agents"
269
- }), /* @__PURE__ */ jsx(SubagentRunList, {
270
- "aria-label": "Background agent runs",
271
- runs: backgroundRuns,
272
- renderRunLink: renderAgentToolRunLink
273
- })]
274
- }) : null] }) : void 0;
275
260
  const submit = ({ text, files, references }, send) => {
276
261
  setDismissedCompaction(sessionCompaction?.lastCompaction ?? null);
277
262
  const prompt = [...references?.map(({ trigger, value }) => trigger ? `${trigger}${value}` : value) ?? [], text.trim()].filter(Boolean).join(" ");
@@ -288,7 +273,6 @@ function ThinkChatMessages({ composerHeader, draft, loading, renderPart, exclude
288
273
  messages: EMPTY_DRAFT_MESSAGES,
289
274
  status: "ready",
290
275
  notice,
291
- composerHeader: resolvedComposerHeader,
292
276
  loading: true
293
277
  });
294
278
  if (!chat) {
@@ -299,7 +283,6 @@ function ThinkChatMessages({ composerHeader, draft, loading, renderPart, exclude
299
283
  messages: draft.messages ?? EMPTY_DRAFT_MESSAGES,
300
284
  status: draft.status ?? "ready",
301
285
  notice: notice ?? sessionCompactionNotice,
302
- composerHeader: resolvedComposerHeader,
303
286
  onSubmit: (message) => submit(message, draft.onSubmit)
304
287
  });
305
288
  }
@@ -314,7 +297,6 @@ function ThinkChatMessages({ composerHeader, draft, loading, renderPart, exclude
314
297
  onExecutionSettled: resolvedApprovals.onExecutionSettled,
315
298
  pendingApprovals: resolvedApprovals.pendingApprovals,
316
299
  notice: notice ?? (recoveryActive ? defaultNotice : sessionCompactionNotice),
317
- composerHeader: resolvedComposerHeader,
318
300
  onRegenerate: (messageId) => void chat.regenerate({ messageId }),
319
301
  onSubmit: (message) => submit(message, chat.sendMessage)
320
302
  });
@@ -1,4 +1,4 @@
1
- import { a as WorkspaceMediaInfo, i as WorkspaceFileState, r as WorkspaceFileAssetResolver, t as WorkspaceFileAsset } from "./WorkspaceFile-BLaFmMrt.js";
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
3
  import { WorkspaceLike } from "@cloudflare/think";
4
4
  import { FileInfo, Workspace } from "@cloudflare/shell";
@@ -114,9 +114,11 @@ declare function inferWorkspaceMedia(path: string, mimeType?: string | null): Wo
114
114
  */
115
115
  declare function inferWorkspaceMimeType(path: string): string | null;
116
116
  declare function isWorkspaceMediaPath(path: string, mimeType?: string | null): boolean;
117
+ /** Identify files that are safe to decode and render as text. */
118
+ declare function isWorkspaceTextPath(path: string, mimeType?: string | null): boolean;
117
119
  /** Parse and validate a workspace skill with the canonical Agent Skills SDK. */
118
120
  declare function parseWorkspaceSkill(content: string): WorkspaceSkillDocument;
119
121
  /** Best-effort syntax-highlighting language from a file path; unknown extensions render as plain text. */
120
122
  declare function inferWorkspaceLanguage(path: string): CodeBlockLanguage;
121
123
  //#endregion
122
- export { parseWorkspaceSkill as _, WorkspaceMediaInfo as a, WorkspaceMediaTrackKind as c, inferWorkspaceLanguage as d, inferWorkspaceMedia as f, isWorkspaceSkillPath as g, isWorkspaceMediaPath as h, WorkspaceFileState as i, WorkspaceSkillDocument as l, isWorkspaceMarkdownPath as m, WorkspaceFileAssetRequest as n, WorkspaceMediaKind as o, inferWorkspaceMimeType as p, WorkspaceFileAssetResolver as r, WorkspaceMediaTrack as s, WorkspaceFileAsset as t, getWorkspaceBasename as u };
124
+ export { isWorkspaceTextPath as _, WorkspaceMediaInfo as a, WorkspaceMediaTrackKind as c, inferWorkspaceLanguage as d, inferWorkspaceMedia as f, isWorkspaceSkillPath as g, isWorkspaceMediaPath as h, WorkspaceFileState as i, WorkspaceSkillDocument as l, isWorkspaceMarkdownPath as m, WorkspaceFileAssetRequest as n, WorkspaceMediaKind as o, inferWorkspaceMimeType as p, WorkspaceFileAssetResolver as r, WorkspaceMediaTrack as s, WorkspaceFileAsset as t, getWorkspaceBasename as u, parseWorkspaceSkill as v };
@@ -1,7 +1,7 @@
1
- import { b as EyeIcon, d as CheckIcon, et as WarningIcon, k as MaximizeIcon, m as CodeIcon, r as ArrowLeftIcon, v as DownloadIcon } from "./icons-Dw-im7lg.js";
2
- import { r as formatClock } from "./format-DB2mX9DA.js";
1
+ import { b as EyeIcon, d as CheckIcon, et as WarningIcon, k as MaximizeIcon, m as CodeIcon, r as ArrowLeftIcon, v as DownloadIcon } from "./icons-DbrksZyY.js";
2
+ import { i as formatClock } from "./format-COCyV98Z.js";
3
+ import { a as CodeBlockCopyButton, i as CodeBlockContent, r as CodeBlockContainer, t as CodeBlock } from "./CodeBlock-8K1p1BDU.js";
3
4
  import { AppTopBar } from "./components/general-purpose/AppTopBar.js";
4
- import { a as CodeBlockCopyButton, i as CodeBlockContent, r as CodeBlockContainer, t as CodeBlock } from "./CodeBlock-Dl7a3Wqo.js";
5
5
  import { inferWorkspaceLanguage, inferWorkspaceMedia, isWorkspaceMarkdownPath, isWorkspaceSkillPath, parseWorkspaceSkill } from "./components/agents-sdk/WorkspaceFile.js";
6
6
  import { c as useWorkspaceNavigationContext, s as useWorkspaceNavigationRestoration } from "./WorkspaceLink-DtH66bAY.js";
7
7
  import { n as createWorkspaceRehypePlugins, t as WorkspaceMessageResponse } from "./WorkspaceMessageResponse-CJCmGvTx.js";
@@ -1,5 +1,5 @@
1
1
  import { canRequestFavicon, inferFaviconUrl } from "../../utils/favicon.js";
2
- import { D as LinkIcon, P as MonitorIcon, Q as TerminalIcon, S as FileIcon, T as InfoIcon, W as SearchIcon, et as WarningIcon, tt as WrenchIcon, z as PencilIcon } from "../../icons-Dw-im7lg.js";
2
+ import { D as LinkIcon, P as MonitorIcon, Q as TerminalIcon, S as FileIcon, T as InfoIcon, W as SearchIcon, et as WarningIcon, tt as WrenchIcon, z as PencilIcon } from "../../icons-DbrksZyY.js";
3
3
  import * as React from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/agents-sdk/AgentActivity.tsx
@@ -1,26 +1,27 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { $ as TrashIcon, H as QueueIcon, I as MoveToFrontIcon, U as RefreshIcon, V as PlusIcon, q as SpinnerIcon, t as ArchiveIcon, z as PencilIcon } from "../../icons-Dw-im7lg.js";
2
+ import { ExpansionStateProvider } from "../ai-sdk/ExpansionState.js";
3
+ import { $ as TrashIcon, H as QueueIcon, I as MoveToFrontIcon, U as RefreshIcon, V as PlusIcon, q as SpinnerIcon, t as ArchiveIcon, z as PencilIcon } from "../../icons-DbrksZyY.js";
3
4
  import { Button } from "../foundations/Button.js";
5
+ import { AgentChatMessageEditor } from "../ai-sdk/AgentChatMessageEditor.js";
4
6
  import { IconButton } from "../foundations/IconButton.js";
7
+ import { Menu } from "../foundations/Menu.js";
8
+ import { PromptInput, PromptInputActionAddAttachments, PromptInputActionMenu, PromptInputActionMenuContent, PromptInputActionMenuTrigger, PromptInputAttachments, PromptInputBody, PromptInputButton, PromptInputCommandComposer, PromptInputContextSelector, PromptInputDictation, PromptInputFooter, PromptInputHeader, PromptInputPermissionSelector, PromptInputReferences, PromptInputSubmit, PromptInputTextarea, PromptInputTools, PromptInputTray, usePromptInputAttachments } from "../ai-sdk/PromptInput.js";
9
+ import { AgentChatStartScreen } from "../ai-sdk/AgentChatStartScreen.js";
5
10
  import { Message, MessageAction, MessageActions, MessageMeta, MessageTimestamp } from "../ai-sdk/Message.js";
6
- import { ExpansionStateProvider } from "../ai-sdk/ExpansionState.js";
7
11
  import { AgentMessageParts } from "../ai-sdk/AgentMessageParts.js";
12
+ import { Marker, MarkerContent } from "../foundations/Marker.js";
13
+ import { t as CopyButton } from "../../copy-button-BpA7wQva.js";
8
14
  import { Context, ContextContent, ContextContentBody, ContextContentHeader, ContextTrigger, getContextUsage, getContextUsedTokens } from "../ai-sdk/Context.js";
9
- import { EmptyState } from "../foundations/EmptyState.js";
10
15
  import { VirtualMessageScroller } from "../ai-sdk/MessageScrollerVirtual.js";
11
16
  import { QueueItem, QueueItemActions, QueueItemContent } from "../ai-sdk/Queue.js";
12
- import { Menu } from "../foundations/Menu.js";
13
- import { PromptInput, PromptInputActionAddAttachments, PromptInputActionMenu, PromptInputActionMenuContent, PromptInputActionMenuTrigger, PromptInputAttachments, PromptInputBody, PromptInputButton, PromptInputCommandComposer, PromptInputContextSelector, PromptInputDictation, PromptInputFooter, PromptInputHeader, PromptInputPermissionSelector, PromptInputReferences, PromptInputSubmit, PromptInputTextarea, PromptInputTools, PromptInputTray, usePromptInputAttachments } from "../ai-sdk/PromptInput.js";
14
- import { AgentChatStartScreen } from "../ai-sdk/AgentChatStartScreen.js";
15
- import { AgentChatMessageEditor } from "../ai-sdk/AgentChatMessageEditor.js";
16
- import { Marker, MarkerContent } from "../foundations/Marker.js";
17
+ import { EmptyState } from "../foundations/EmptyState.js";
17
18
  import { TransitionSurface } from "../foundations/TransitionSurface.js";
19
+ import { AgentEventRow, getAgentEvent } from "./AgentEvent.js";
18
20
  import { PromptInputApproval, getApprovalRequestId, getApprovalStateKey, getPendingToolApprovals } from "./PromptInputApproval.js";
19
- import { t as CopyButton } from "../../copy-button-DHhf-J1d.js";
20
21
  import * as React from "react";
21
22
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
- import { isCompactionMessage } from "agents/experimental/memory/utils";
23
23
  import { isTextUIPart } from "ai";
24
+ import { isCompactionMessage } from "agents/experimental/memory/utils";
24
25
  //#region src/components/agents-sdk/AgentChat.tsx
25
26
  /**
26
27
  * Agents exports this helper from `agents/sessions` after cloudflare/agents#1896;
@@ -175,9 +176,13 @@ function isCompactedPart(message, partIndex) {
175
176
  function AgentChatTranscriptRowBodyImpl({ message, messageIndex, status, renderPart, renderMessageAfter, editing, canEdit, editDisabled, onEditAndResend, onStartEdit, onCancelEdit, onFinishEdit, editButtonRef, responseNumber, showAssistantActions, showCopy, showRetry, onRegenerate, onCopyStatus }) {
176
177
  const messageTime = getAgentChatMessageTime(message);
177
178
  const userText = getEditableUserText(message);
179
+ const agentEvent = getAgentEvent(message);
178
180
  return /* @__PURE__ */ jsx(Fragment, { children: isCompactionMessage(message) ? /* @__PURE__ */ jsx(Marker, {
179
181
  variant: "separator",
180
182
  children: /* @__PURE__ */ jsx(MarkerContent, { children: "Context compacted" })
183
+ }) : agentEvent ? /* @__PURE__ */ jsx(AgentEventRow, {
184
+ message,
185
+ event: agentEvent
181
186
  }) : /* @__PURE__ */ jsx(Message, {
182
187
  from: message.role,
183
188
  children: editing && onEditAndResend ? /* @__PURE__ */ jsx(AgentChatMessageEditor, {
@@ -482,9 +487,9 @@ function AgentChat({ className, messages, status = "ready", onSubmit, showCompos
482
487
  composerInputRef.current?.focus();
483
488
  }, [pendingApprovalKey]);
484
489
  const contextUsage = contextWindow ? getContextUsage(messages) : void 0;
485
- const newestAssistantIndex = messages.findLastIndex((message) => message.role === "assistant" && !isCompactionMessage(message));
490
+ const newestAssistantIndex = messages.findLastIndex((message) => message.role === "assistant" && !isCompactionMessage(message) && !getAgentEvent(message));
486
491
  const lastAssistantIndex = onRegenerate && status !== "streaming" && status !== "submitted" ? newestAssistantIndex : -1;
487
- const lastUserIndex = onEditAndResend ? messages.findLastIndex((message) => message.role === "user") : -1;
492
+ const lastUserIndex = onEditAndResend ? messages.findLastIndex((message) => message.role === "user" && !getAgentEvent(message)) : -1;
488
493
  const [editingMessageId, setEditingMessageId] = React.useState();
489
494
  const restoreEditFocus = React.useRef(false);
490
495
  const editButtonRef = React.useRef(null);
@@ -502,7 +507,7 @@ function AgentChat({ className, messages, status = "ready", onSubmit, showCompos
502
507
  }, []);
503
508
  let assistantResponseCount = 0;
504
509
  const assistantResponseNumbers = messages.map((message) => {
505
- if (message.role !== "assistant" || isCompactionMessage(message)) return 0;
510
+ if (message.role !== "assistant" || isCompactionMessage(message) || getAgentEvent(message)) return 0;
506
511
  assistantResponseCount += 1;
507
512
  return assistantResponseCount;
508
513
  });
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ import { UIMessage } from "ai";
3
+
4
+ //#region src/components/agents-sdk/AgentEvent.d.ts
5
+ interface AgentEvent {
6
+ source: string;
7
+ runId?: string;
8
+ /** Terminal status of the run this completion notice reports. */
9
+ status?: string;
10
+ /** Milestone name when the turn is a mid-run report, absent for a completion. */
11
+ milestone?: string;
12
+ }
13
+ /**
14
+ * Classify a framework-injected background-run message. Think persists a
15
+ * `submitMessages` turn's metadata under `metadata.turnMetadata` on the
16
+ * user-role message it appends (a completion notice, a `react` milestone), and
17
+ * puts a `narrate` milestone's metadata directly on the assistant message it
18
+ * adds — so both shapes are read. Anything else is an ordinary message.
19
+ */
20
+ declare function getAgentEvent(message: UIMessage): AgentEvent | null;
21
+ interface AgentEventRowProps extends React.HTMLAttributes<HTMLDivElement> {
22
+ message: UIMessage;
23
+ event: AgentEvent;
24
+ }
25
+ /**
26
+ * One collapsed transcript row for a background run's report or completion
27
+ * notice: who reported, what happened, and the first line of what it said;
28
+ * expanding shows the whole text the model received. The run's name comes
29
+ * from the parent's retained-run projection when the row is inside an
30
+ * `AgentToolRunsProvider`.
31
+ */
32
+ declare function AgentEventRow({
33
+ className,
34
+ event,
35
+ message,
36
+ ref,
37
+ ...props
38
+ }: AgentEventRowProps & {
39
+ ref?: React.Ref<HTMLDivElement>;
40
+ }): React.JSX.Element;
41
+ //#endregion
42
+ export { AgentEvent, AgentEventRow, AgentEventRowProps, getAgentEvent };
@@ -0,0 +1,96 @@
1
+ import { t as cx } from "../../class-names-BiMDVpUo.js";
2
+ import { Activity, ActivityContent, ActivityText, ActivityTrigger } from "../ai-sdk/Activity.js";
3
+ import { r as firstLine } from "../../format-COCyV98Z.js";
4
+ import { MessageResponse } from "../ai-sdk/Message.js";
5
+ import { NaniteMark } from "../nanites/NaniteScene.js";
6
+ import { getSubagentRunName } from "./SubagentRunIndicator.js";
7
+ import { useOptionalAgentToolRuns } from "./AgentToolRunsContext.js";
8
+ import "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { isTextUIPart } from "ai";
11
+ //#region src/components/agents-sdk/AgentEvent.tsx
12
+ /**
13
+ * `metadata.source` values Think stamps on the turns it injects for a
14
+ * detached (background) agent-tool run: upstream's default and the source the
15
+ * browser host passes for a delegated run's completion and milestone reports.
16
+ * A turn tagged with one of these was written by the runtime, not typed by the
17
+ * person, so the transcript renders it as an agent event rather than a user
18
+ * bubble.
19
+ */
20
+ const AGENT_EVENT_SOURCES = /* @__PURE__ */ new Set(["delegate-completion", "detached-agent-tool"]);
21
+ function stringField(record, key) {
22
+ const value = record[key];
23
+ return typeof value === "string" ? value : void 0;
24
+ }
25
+ /**
26
+ * Classify a framework-injected background-run message. Think persists a
27
+ * `submitMessages` turn's metadata under `metadata.turnMetadata` on the
28
+ * user-role message it appends (a completion notice, a `react` milestone), and
29
+ * puts a `narrate` milestone's metadata directly on the assistant message it
30
+ * adds — so both shapes are read. Anything else is an ordinary message.
31
+ */
32
+ function getAgentEvent(message) {
33
+ const metadata = message.metadata;
34
+ if (!metadata || typeof metadata !== "object") return null;
35
+ const record = metadata;
36
+ const turnMetadata = record.turnMetadata;
37
+ const candidate = turnMetadata && typeof turnMetadata === "object" ? turnMetadata : record;
38
+ const source = stringField(candidate, "source");
39
+ if (source === void 0 || !AGENT_EVENT_SOURCES.has(source)) return null;
40
+ return {
41
+ source,
42
+ runId: stringField(candidate, "runId"),
43
+ status: stringField(candidate, "status"),
44
+ milestone: stringField(candidate, "milestone")
45
+ };
46
+ }
47
+ function eventVerb(event) {
48
+ if (event.milestone) return "reported";
49
+ switch (event.status) {
50
+ case "completed": return "finished";
51
+ case "error": return "failed";
52
+ case "aborted": return "was cancelled";
53
+ case "interrupted": return "was interrupted";
54
+ default: return "ended";
55
+ }
56
+ }
57
+ /**
58
+ * Both formatters — Think's `formatDetachedCompletion` and the host's
59
+ * milestone override — open with a one-line `Background task "…" (run …)`
60
+ * heading and put the child's own words in the next paragraph. The row's own
61
+ * action line already says that much, so the preview starts after it.
62
+ */
63
+ const RUNTIME_HEADING = /^Background task .*?\n\n/u;
64
+ /** The first line of the event's own words, without the runtime heading. */
65
+ function agentEventPreview(text) {
66
+ return firstLine(text.replace(RUNTIME_HEADING, "")) || void 0;
67
+ }
68
+ /**
69
+ * One collapsed transcript row for a background run's report or completion
70
+ * notice: who reported, what happened, and the first line of what it said;
71
+ * expanding shows the whole text the model received. The run's name comes
72
+ * from the parent's retained-run projection when the row is inside an
73
+ * `AgentToolRunsProvider`.
74
+ */
75
+ function AgentEventRow({ className, event, message, ref, ...props }) {
76
+ const agentTools = useOptionalAgentToolRuns();
77
+ const run = event.runId ? agentTools?.runsById[event.runId] : void 0;
78
+ const name = run ? getSubagentRunName(run) : "Background task";
79
+ const text = message.parts.filter(isTextUIPart).map((part) => part.text).join("\n").trim();
80
+ return /* @__PURE__ */ jsxs(Activity, {
81
+ ref,
82
+ "data-slot": "agent-event",
83
+ "data-source": event.source,
84
+ "data-status": event.status,
85
+ className: cx("agent-event", className),
86
+ stateKey: `agent-event:${message.id}`,
87
+ ...props,
88
+ children: [/* @__PURE__ */ jsx(ActivityTrigger, {
89
+ icon: /* @__PURE__ */ jsx(NaniteMark, { index: run?.order }),
90
+ action: `${name} ${eventVerb(event)}`,
91
+ detail: agentEventPreview(text)
92
+ }), /* @__PURE__ */ jsx(ActivityContent, { children: /* @__PURE__ */ jsx(ActivityText, { children: /* @__PURE__ */ jsx(MessageResponse, { children: text }) }) })]
93
+ });
94
+ }
95
+ //#endregion
96
+ export { AgentEventRow, getAgentEvent };
@@ -1,2 +1,2 @@
1
- import { a as useOptionalAgentToolRuns, i as AgentToolRunsProviderProps, n as AgentToolEventsValue, o as useSourceScopedAgentToolEvents, r as AgentToolRunsProvider, t as AgentToolEventSource } from "../../AgentToolRunsContext-daY67hFM.js";
1
+ import { a as useOptionalAgentToolRuns, i as AgentToolRunsProviderProps, n as AgentToolEventsValue, o as useSourceScopedAgentToolEvents, r as AgentToolRunsProvider, t as AgentToolEventSource } from "../../AgentToolRunsContext-jtmveaRE.js";
2
2
  export { AgentToolEventSource, AgentToolEventsValue, AgentToolRunsProvider, AgentToolRunsProviderProps, useOptionalAgentToolRuns, useSourceScopedAgentToolEvents };
@@ -14,20 +14,24 @@ import { useAgentToolEvents } from "agents/react";
14
14
  * The subscription's listener attaches in a passive effect, after paint. A
15
15
  * host whose transport is in-process (the browser extension's port bridge)
16
16
  * can complete the connect and deliver the replay before that effect runs —
17
- * reliably so on a hot return from a drill-in. Upstream owns the fix:
18
- * `useAgent` buffers `agent-tool-event` frames from socket construction and
19
- * `useAgentToolEvents` drains them when its listener attaches (agents >
20
- * 0.20.1; `_bufferAgentToolReplayFrame` is the seam for a non-`useAgent`
21
- * socket). On older versions such hosts must buffer and re-dispatch
22
- * themselves think-browser-host's `useThinkAgentToolEvents` is that
23
- * interim shim. Network transports are not affected in practice: the round
17
+ * reliably so on a hot return from a drill-in. The fix lives in the Agents
18
+ * SDK, not here: `useAgent` buffers `agent-tool-event` frames from socket
19
+ * construction and `useAgentToolEvents` drains them when its listener
20
+ * attaches (`_bufferAgentToolReplayFrame` is the seam for a non-`useAgent`
21
+ * socket). As of agents 0.21.0 that is still the browser host's vendored
22
+ * edit, not a published release; a host on the published package has to
23
+ * buffer and re-dispatch the frames around its own socket before this hook
24
+ * can see them. Network transports are not affected in practice: the round
24
25
  * trip loses to the effect flush.
25
26
  */
26
27
  function useSourceScopedAgentToolEvents(agent) {
27
28
  const agentTools = useAgentToolEvents({ agent });
28
29
  const sourceIdentity = JSON.stringify(agent.path);
29
30
  const resetAgentTools = React.useEffectEvent(() => agentTools.resetLocalState());
31
+ const seenIdentity = React.useRef(sourceIdentity);
30
32
  React.useEffect(() => {
33
+ if (seenIdentity.current === sourceIdentity) return;
34
+ seenIdentity.current = sourceIdentity;
31
35
  resetAgentTools();
32
36
  }, [sourceIdentity]);
33
37
  return agentTools;
@@ -1,4 +1,4 @@
1
- import { E as KeyboardIcon, U as RefreshIcon, r as ArrowLeftIcon } from "../../icons-Dw-im7lg.js";
1
+ import { E as KeyboardIcon, U as RefreshIcon, r as ArrowLeftIcon } from "../../icons-DbrksZyY.js";
2
2
  import { Button } from "../foundations/Button.js";
3
3
  import { WebPreviewNavigationButton } from "../general-purpose/WebPreview.js";
4
4
  import { BrowserLiveView } from "./BrowserLiveView.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { _ as DotIcon, k as MaximizeIcon, q as SpinnerIcon } from "../../icons-Dw-im7lg.js";
2
+ import { _ as DotIcon, k as MaximizeIcon, q as SpinnerIcon } from "../../icons-DbrksZyY.js";
3
3
  import { Button } from "../foundations/Button.js";
4
4
  import { Dialog } from "../foundations/Dialog.js";
5
5
  import { TransitionSurface } from "../foundations/TransitionSurface.js";
@@ -1,7 +1,7 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { B as PlayIcon, R as PauseIcon } from "../../icons-Dw-im7lg.js";
2
+ import { B as PlayIcon, R as PauseIcon } from "../../icons-DbrksZyY.js";
3
3
  import { IconButton } from "../foundations/IconButton.js";
4
- import { r as formatClock } from "../../format-DB2mX9DA.js";
4
+ import { i as formatClock } from "../../format-COCyV98Z.js";
5
5
  import { EmptyState } from "../foundations/EmptyState.js";
6
6
  import { Slider } from "../foundations/Slider.js";
7
7
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { nt as XIcon, q as SpinnerIcon } from "../../icons-Dw-im7lg.js";
2
+ import { nt as XIcon, q as SpinnerIcon } from "../../icons-DbrksZyY.js";
3
3
  import { Tabs } from "../foundations/Tabs.js";
4
4
  import { WebPreview, WebPreviewNavigation, WebPreviewNavigationButton, WebPreviewUrl } from "../general-purpose/WebPreview.js";
5
5
  import { BrowserLiveView } from "./BrowserLiveView.js";