@mcp-b/react-components 0.55.0 → 0.56.1

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 (44) hide show
  1. package/dist/{AgentToolRunsContext-GMe_hSnD.d.ts → AgentToolRunsContext-DT50htHj.d.ts} +4 -17
  2. package/dist/{EmployeeChrome-B605rpVz.d.ts → EmployeeChrome-B7Gt2Hpk.d.ts} +1 -1
  3. package/dist/{ThinkChatActivity-DENkintt.d.ts → ThinkChatActivity-B6dh3n0-.d.ts} +1 -1
  4. package/dist/components/agents-sdk/AgentChat.js +10 -14
  5. package/dist/components/agents-sdk/AgentToolRunsContext.d.ts +1 -1
  6. package/dist/components/agents-sdk/EmployeeApp.d.ts +1 -1
  7. package/dist/components/agents-sdk/EmployeeChrome.d.ts +1 -1
  8. package/dist/components/agents-sdk/EmployeeChrome.js +2 -2
  9. package/dist/components/agents-sdk/EmployeeSchedules.d.ts +1 -1
  10. package/dist/components/agents-sdk/EmployeeStartScreen.d.ts +1 -1
  11. package/dist/components/agents-sdk/ManagerOfficeScreens.d.ts +1 -1
  12. package/dist/components/agents-sdk/SubagentRunDetails.d.ts +1 -1
  13. package/dist/components/agents-sdk/SubagentRunIndicator.d.ts +1 -1
  14. package/dist/components/agents-sdk/SubagentRunList.d.ts +1 -1
  15. package/dist/components/agents-sdk/SubagentRunPanel.d.ts +3 -14
  16. package/dist/components/agents-sdk/SubagentRunPanel.js +11 -14
  17. package/dist/components/agents-sdk/SubagentRunSelector.d.ts +1 -1
  18. package/dist/components/agents-sdk/ThinkChat.d.ts +2 -9
  19. package/dist/components/agents-sdk/ThinkChat.js +3 -36
  20. package/dist/components/agents-sdk/ThinkChatActivity.d.ts +1 -1
  21. package/dist/components/agents-sdk/ThinkFullApp.d.ts +1 -1
  22. package/dist/components/agents-sdk/ThinkFullApp.js +1 -4
  23. package/dist/components/agents-sdk/ThinkThreadPicker.js +10 -7
  24. package/dist/components/nanites/AgentToolDetail.d.ts +1 -1
  25. package/dist/styles/agent-chat.css +30 -35
  26. package/dist/styles/app-icon.css +1 -2
  27. package/dist/styles/base.css +19 -10
  28. package/dist/styles/brand-loading.css +14 -0
  29. package/dist/styles/brand.test.ts +21 -0
  30. package/dist/styles/browser-replay.css +2 -2
  31. package/dist/styles/button.css +0 -2
  32. package/dist/styles/checkbox.css +1 -1
  33. package/dist/styles/composition-motion.css +13 -3
  34. package/dist/styles/github-motion-mark.css +2 -2
  35. package/dist/styles/responsive-sidebar-shell.css +11 -1
  36. package/dist/styles/search-field.css +1 -1
  37. package/dist/styles/tabs.css +1 -1
  38. package/dist/styles/think-routine.css +0 -2
  39. package/dist/styles/think-thread-picker.css +18 -5
  40. package/dist/styles/toggle-group.css +2 -2
  41. package/package.json +6 -6
  42. package/dist/SessionCompaction-CmTJFpzj.d.ts +0 -89
  43. package/dist/components/agents-sdk/SessionCompaction.d.ts +0 -2
  44. package/dist/components/agents-sdk/SessionCompaction.js +0 -140
@@ -1,25 +1,12 @@
1
1
  import * as React from "react";
2
2
  import { UIMessage } from "ai";
3
3
  import { useAgentToolEvents } from "agents/react";
4
- import { AgentToolRunPart, AgentToolRunState, AgentToolRunStatus } from "agents/agent-tools";
4
+ import { AgentToolRunPart, AgentToolRunState } from "agents/agent-tools";
5
5
 
6
6
  //#region src/components/agents-sdk/AgentToolRunsContext.d.ts
7
- /**
8
- * Whole native run fields with the SDK's complete lifecycle status. Published
9
- * Agents 0.21.0 excludes `starting` from AgentToolRunState while its native
10
- * AgentToolRunStatus includes it and current retained replay emits it. This
11
- * type-only correction does not translate records or accept another shape.
12
- */
13
- type AgentToolRunValue<Part extends AgentToolRunPart = AgentToolRunPart> = Omit<AgentToolRunState<Part>, "status"> & {
14
- status: AgentToolRunStatus;
15
- };
16
- /** Whole event-hook value; run records keep the complete native lifecycle. */
17
- type AgentToolEventsValue<Part extends AgentToolRunPart = UIMessage["parts"][number]> = Omit<ReturnType<typeof useAgentToolEvents<Part>>, "runsById" | "runsByToolCallId" | "unboundRuns" | "getRunsForToolCall"> & {
18
- runsById: Record<string, AgentToolRunValue<Part>>;
19
- runsByToolCallId: Record<string, AgentToolRunValue<Part>[]>;
20
- unboundRuns: AgentToolRunValue<Part>[];
21
- getRunsForToolCall(toolCallId: string): AgentToolRunValue<Part>[];
22
- };
7
+ /** Native SDK run and event-hook values, passed without translation. */
8
+ type AgentToolRunValue<Part extends AgentToolRunPart = AgentToolRunPart> = AgentToolRunState<Part>;
9
+ type AgentToolEventsValue<Part extends AgentToolRunPart = UIMessage["parts"][number]> = ReturnType<typeof useAgentToolEvents<Part>>;
23
10
  interface AgentToolRunsProviderProps<Part extends AgentToolRunPart = UIMessage["parts"][number]> {
24
11
  /** Pass the whole `useAgentToolEvents({ agent })` result directly. */
25
12
  agentTools: AgentToolEventsValue<Part>;
@@ -1,5 +1,5 @@
1
1
  import { J as PromptInputMessage } from "./PromptInput-DGPrCTPl.js";
2
- import { n as AgentToolRunValue } from "./AgentToolRunsContext-GMe_hSnD.js";
2
+ import { n as AgentToolRunValue } from "./AgentToolRunsContext-DT50htHj.js";
3
3
  import { n as ResponsiveSidebarShell } from "./ResponsiveSidebarShell-BUBQa_IV.js";
4
4
  import { t as ThinkThreadItem } from "./ThinkThreadPicker-DX0lL-P7.js";
5
5
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import { i as AgentMessageRenderPartContext } from "./AgentMessageParts-C7L-Mv9U.js";
2
2
  import { AgentChatMessageContentProps } from "./components/agents-sdk/AgentChat.js";
3
- import { n as AgentToolRunValue } from "./AgentToolRunsContext-GMe_hSnD.js";
3
+ import { n as AgentToolRunValue } from "./AgentToolRunsContext-DT50htHj.js";
4
4
  import { l as ThinkChatPart } from "./ThinkChatToolParts-D4qcnnxt.js";
5
5
  import { t as ThinkChatActivityDescription } from "./ThinkChatActivitySummary-BtBQgMg6.js";
6
6
  import * as React from "react";
@@ -23,20 +23,16 @@ function observeAgentChatDock(element) {
23
23
  if (!element || typeof ResizeObserver === "undefined") return;
24
24
  const root = element.closest(".agent-chat");
25
25
  let written;
26
- let frame = 0;
27
- const observer = new ResizeObserver(() => {
28
- if (frame) return;
29
- frame = requestAnimationFrame(() => {
30
- frame = 0;
31
- const size = `${element.offsetHeight}px`;
32
- if (size === written) return;
33
- written = size;
34
- root?.style.setProperty("--agent-chat-dock-size", size);
35
- });
36
- });
26
+ const measure = () => {
27
+ const size = `${element.offsetHeight}px`;
28
+ if (size === written) return;
29
+ written = size;
30
+ root?.style.setProperty("--agent-chat-dock-size", size);
31
+ };
32
+ measure();
33
+ const observer = new ResizeObserver(measure);
37
34
  observer.observe(element);
38
35
  return () => {
39
- cancelAnimationFrame(frame);
40
36
  observer.disconnect();
41
37
  };
42
38
  }
@@ -472,7 +468,7 @@ function AgentChatApprovals({ thinkStub, pendingApprovals = [], onExecutionSettl
472
468
  ids: []
473
469
  });
474
470
  const ids = skipped.source === thinkStub ? skipped.ids : EMPTY_SKIPPED_IDS;
475
- const items = [...getPendingToolApprovals(messages, { pausedExecutions: Boolean(thinkStub) }).filter((part) => (part.state !== "approval-requested" || onApprovalResponse) && !ids.includes(getApprovalStateKey(part) ?? "")).map((part) => ({ part })), ...pendingApprovals.filter((a) => a.source === "action" && !ids.includes(a.executionId)).map((approval) => ({ approval }))];
471
+ const items = [...getPendingToolApprovals(messages, { pausedExecutions: Boolean(thinkStub) }).filter((part) => (part.state !== "approval-requested" || onApprovalResponse) && !ids.includes(getApprovalStateKey(part) ?? "")).map((part) => ({ part })), ...pendingApprovals.filter((a) => !ids.includes(a.executionId)).map((approval) => ({ approval }))];
476
472
  const pending = items.length ? items : EMPTY_APPROVAL_ITEMS;
477
473
  const restore = React.useRef(false);
478
474
  const active = React.useRef(false);
@@ -553,7 +549,7 @@ const compactingNotice = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE_
553
549
  const COMPACTION_NOTICES = {
554
550
  pending: compactingNotice,
555
551
  compacted: "Context compacted. Context usage updates after your next message.",
556
- unchanged: "No context was compacted. Recent context is already protected.",
552
+ unchanged: "No summary was created. Run /compact to try again.",
557
553
  failed: "Compaction failed — run /compact to try again."
558
554
  };
559
555
  const COMPACTION_COMMAND = {
@@ -1,2 +1,2 @@
1
- import { a as useOptionalAgentToolRuns, i as AgentToolRunsProviderProps, n as AgentToolRunValue, r as AgentToolRunsProvider, t as AgentToolEventsValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { a as useOptionalAgentToolRuns, i as AgentToolRunsProviderProps, n as AgentToolRunValue, r as AgentToolRunsProvider, t as AgentToolEventsValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  export { AgentToolEventsValue, AgentToolRunValue, AgentToolRunsProvider, AgentToolRunsProviderProps, useOptionalAgentToolRuns };
@@ -1,5 +1,5 @@
1
1
  import { l as WorkspaceNavigationAdapter } from "../../WorkspaceLink-Bh9-Jo1r.js";
2
- import { f as EmployeeShellProps, l as EmployeeModelSetup, n as EmployeeBrand, p as EmployeeStatus, t as EmployeeAgentRun } from "../../EmployeeChrome-B605rpVz.js";
2
+ import { f as EmployeeShellProps, l as EmployeeModelSetup, n as EmployeeBrand, p as EmployeeStatus, t as EmployeeAgentRun } from "../../EmployeeChrome-B7Gt2Hpk.js";
3
3
  import * as React from "react";
4
4
 
5
5
  //#region src/components/agents-sdk/EmployeeApp.d.ts
@@ -1,2 +1,2 @@
1
- import { a as EmployeeDestination, c as EmployeeMenuProps, d as EmployeeRenderLink, f as EmployeeShellProps, h as EmployeeWorkbenchItem, i as EmployeeCompanion, l as EmployeeModelSetup, m as EmployeeView, n as EmployeeBrand, o as EmployeeFollow, p as EmployeeStatus, r as EmployeeChrome, s as EmployeeIdentity, t as EmployeeAgentRun, u as EmployeePasskeyVault } from "../../EmployeeChrome-B605rpVz.js";
1
+ import { a as EmployeeDestination, c as EmployeeMenuProps, d as EmployeeRenderLink, f as EmployeeShellProps, h as EmployeeWorkbenchItem, i as EmployeeCompanion, l as EmployeeModelSetup, m as EmployeeView, n as EmployeeBrand, o as EmployeeFollow, p as EmployeeStatus, r as EmployeeChrome, s as EmployeeIdentity, t as EmployeeAgentRun, u as EmployeePasskeyVault } from "../../EmployeeChrome-B7Gt2Hpk.js";
2
2
  export { EmployeeAgentRun, EmployeeBrand, EmployeeChrome, EmployeeCompanion, EmployeeDestination, EmployeeFollow, EmployeeIdentity, EmployeeMenuProps, EmployeeModelSetup, EmployeePasskeyVault, EmployeeRenderLink, EmployeeShellProps, EmployeeStatus, EmployeeView, EmployeeWorkbenchItem };
@@ -20,7 +20,7 @@ import { useTheme } from "../foundations/ThemeProvider.js";
20
20
  import { ActionGuide, ActionGuideAction, ActionGuideList, ActionGuideSection } from "../general-purpose/ActionGuide.js";
21
21
  import { ResponsiveSidebarShell, useResponsiveSidebarShell } from "../general-purpose/ResponsiveSidebarShell.js";
22
22
  import { McpServerIcon } from "./McpServerIcon.js";
23
- import { ThinkThreadPicker } from "./ThinkThreadPicker.js";
23
+ import { ThinkThreadPicker, ThinkThreadStatusIndicators, summarizeThinkThreads } from "./ThinkThreadPicker.js";
24
24
  import * as React from "react";
25
25
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
26
26
  //#region src/components/agents-sdk/EmployeeChrome.tsx
@@ -398,7 +398,7 @@ function EmployeeShell({ view, threads, threadId, agentRun, renderLink, appBarLe
398
398
  agentRun,
399
399
  threadTitle: thread?.title
400
400
  }),
401
- compactTitleTrigger: agentRun ? void 0 : /* @__PURE__ */ jsx("span", { children: thread?.title ?? "New chat" }),
401
+ compactTitleTrigger: agentRun ? void 0 : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: thread?.title ?? "New chat" }), /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, { summary: summarizeThinkThreads(history) })] }),
402
402
  leading: agentRun ? back : /* @__PURE__ */ jsxs(Fragment, { children: [appBarLeading, /* @__PURE__ */ jsx(EmployeeNewThread, { renderLink })] }),
403
403
  compactLeading: !agentRun && view !== "chat" ? compactBack ?? back : void 0,
404
404
  actions: employeeShellActions({
@@ -1,4 +1,4 @@
1
- import { c as EmployeeMenuProps } from "../../EmployeeChrome-B605rpVz.js";
1
+ import { c as EmployeeMenuProps } from "../../EmployeeChrome-B7Gt2Hpk.js";
2
2
  import { t as ThinkRoutine } from "../../ThinkRoutine-Cb1DdaHa.js";
3
3
  import { ThinkRoutineActionsRootProps } from "./ThinkRoutineActions.js";
4
4
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import { J as PromptInputMessage } from "../../PromptInput-DGPrCTPl.js";
2
- import { a as EmployeeDestination, n as EmployeeBrand } from "../../EmployeeChrome-B605rpVz.js";
2
+ import { a as EmployeeDestination, n as EmployeeBrand } from "../../EmployeeChrome-B7Gt2Hpk.js";
3
3
  import { SetupChecklistGroupProps } from "../general-purpose/SetupChecklist.js";
4
4
  import { n as McpPluginCatalogProps } from "../../McpPluginCatalog-DNeHDrts.js";
5
5
  import { r as WorkspaceMountManagerProps } from "../../WorkspaceMountManager-CkLI1B-G.js";
@@ -1,4 +1,4 @@
1
- import { f as EmployeeShellProps } from "../../EmployeeChrome-B605rpVz.js";
1
+ import { f as EmployeeShellProps } from "../../EmployeeChrome-B7Gt2Hpk.js";
2
2
  import { ManagerOfficeConnectedEmployee, ManagerOfficeDestination, ManagerOfficeEmployee } from "./ManagerOffice.js";
3
3
  import * as React from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import * as React from "react";
3
3
 
4
4
  //#region src/components/agents-sdk/SubagentRunDetails.d.ts
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import * as React from "react";
3
3
  import { AgentToolRunPart } from "agents/agent-tools";
4
4
 
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import * as React from "react";
3
3
  import { UIMessage } from "ai";
4
4
  import { AgentToolRunPart } from "agents/agent-tools";
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue, t as AgentToolEventsValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue, t as AgentToolEventsValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import { ExpansionStore } from "../ai-sdk/ExpansionState.js";
3
3
  import * as React from "react";
4
4
  import { AgentToolRunPart } from "agents/agent-tools";
@@ -8,27 +8,18 @@ interface CommandState {
8
8
  pending: boolean;
9
9
  error?: string;
10
10
  }
11
- /** Controlled collection facts supplied by the connection owner. */
12
- interface SubagentRunCollectionState {
13
- status: "loading" | "ready" | "error";
14
- stale: boolean;
15
- error?: string;
16
- }
17
11
  interface SubagentRunPanelProviderProps {
18
12
  /** Conversation identity; changing it resets transient controls without remounting children. */
19
13
  scopeKey: string;
20
14
  /** The one upstream event-hook value from the parent connection. */
21
15
  agentTools: AgentToolEventsValue<AgentToolRunPart>;
22
- collection: SubagentRunCollectionState;
23
- /** The host's native execution predicate; presentation does not own cancellation policy. */
24
- mayExecute: (run: AgentToolRunValue) => boolean;
25
16
  selectedRunId?: string;
26
17
  parentRunning: boolean;
27
18
  onStopCurrentWork: () => Promise<void>;
28
19
  onStopRun: (runId: string) => Promise<void>;
29
20
  children: React.ReactNode;
30
21
  }
31
- interface SubagentRunPanelValue extends Pick<SubagentRunPanelProviderProps, "agentTools" | "collection" | "mayExecute" | "selectedRunId" | "parentRunning"> {
22
+ interface SubagentRunPanelValue extends Pick<SubagentRunPanelProviderProps, "agentTools" | "selectedRunId" | "parentRunning"> {
32
23
  open: boolean;
33
24
  setOpen: (open: boolean) => void;
34
25
  hiddenCompleted: ReadonlySet<string>;
@@ -43,8 +34,6 @@ interface SubagentRunPanelValue extends Pick<SubagentRunPanelProviderProps, "age
43
34
  declare function SubagentRunPanelProvider({
44
35
  scopeKey,
45
36
  agentTools,
46
- collection,
47
- mayExecute,
48
37
  selectedRunId,
49
38
  parentRunning,
50
39
  onStopCurrentWork,
@@ -60,4 +49,4 @@ declare function SubagentRunPanel({
60
49
  renderRunLink
61
50
  }: SubagentRunPanelProps): React.JSX.Element | null;
62
51
  //#endregion
63
- export { SubagentRunCollectionState, SubagentRunPanel, SubagentRunPanelProps, SubagentRunPanelProvider, SubagentRunPanelProviderProps, useOptionalSubagentRunPanel };
52
+ export { SubagentRunPanel, SubagentRunPanelProps, SubagentRunPanelProvider, SubagentRunPanelProviderProps, useOptionalSubagentRunPanel };
@@ -7,6 +7,7 @@ import { AgentChatNotice, AgentChatPromptTray } from "./AgentChat.js";
7
7
  import { SubagentRunSelector } from "./SubagentRunSelector.js";
8
8
  import * as React from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { agentToolRunMayExecute } from "agents/react";
10
11
  //#region src/components/agents-sdk/SubagentRunPanel.tsx
11
12
  const IDLE = { pending: false };
12
13
  const SubagentRunPanelContext = React.createContext(null);
@@ -22,7 +23,7 @@ function createPanelState(scopeKey, selectedRunId) {
22
23
  };
23
24
  }
24
25
  /** A thread's transient controls/disclosure state; run facts remain in the SDK value. */
25
- function SubagentRunPanelProvider({ scopeKey, agentTools, collection, mayExecute, selectedRunId, parentRunning, onStopCurrentWork, onStopRun, children }) {
26
+ function SubagentRunPanelProvider({ scopeKey, agentTools, selectedRunId, parentRunning, onStopCurrentWork, onStopRun, children }) {
26
27
  const [state, setState] = React.useState(() => createPanelState(scopeKey, selectedRunId));
27
28
  if (state.scopeKey !== scopeKey) setState(createPanelState(scopeKey, selectedRunId));
28
29
  const { open, hiddenCompleted, commands, reportDisclosures, inFlight, restoreFocusRunId } = state;
@@ -63,8 +64,6 @@ function SubagentRunPanelProvider({ scopeKey, agentTools, collection, mayExecute
63
64
  const stopRun = React.useCallback((id) => execute(id, () => onStopRun(id)), [execute, onStopRun]);
64
65
  const value = React.useMemo(() => ({
65
66
  agentTools,
66
- collection,
67
- mayExecute,
68
67
  selectedRunId,
69
68
  parentRunning,
70
69
  open,
@@ -78,8 +77,6 @@ function SubagentRunPanelProvider({ scopeKey, agentTools, collection, mayExecute
78
77
  stopRun
79
78
  }), [
80
79
  agentTools,
81
- collection,
82
- mayExecute,
83
80
  selectedRunId,
84
81
  parentRunning,
85
82
  open,
@@ -101,12 +98,12 @@ function useOptionalSubagentRunPanel() {
101
98
  return React.useContext(SubagentRunPanelContext);
102
99
  }
103
100
  function getSubagentRunRows(panel) {
104
- const runs = Object.values(panel.agentTools.runsById).sort((a, b) => Number(!panel.mayExecute(a)) - Number(!panel.mayExecute(b)) || a.order - b.order);
101
+ const runs = Object.values(panel.agentTools.runsById).sort((a, b) => Number(!agentToolRunMayExecute(a)) - Number(!agentToolRunMayExecute(b)) || a.order - b.order);
105
102
  return {
106
103
  runs,
107
- active: runs.filter(panel.mayExecute),
108
- completed: runs.filter((run) => !panel.mayExecute(run)),
109
- visible: runs.filter((run) => !panel.hiddenCompleted.has(run.runId) || panel.mayExecute(run))
104
+ active: runs.filter(agentToolRunMayExecute),
105
+ completed: runs.filter((run) => !agentToolRunMayExecute(run)),
106
+ visible: runs.filter((run) => !panel.hiddenCompleted.has(run.runId) || agentToolRunMayExecute(run))
110
107
  };
111
108
  }
112
109
  function useSubagentRunFocus(panel, visible) {
@@ -155,7 +152,7 @@ function delegatedWorkLabel(active, completed) {
155
152
  function SubagentRunPanelControls({ panel, active }) {
156
153
  const queue = useOptionalAgentChatQueue();
157
154
  const stop = panel.commands["current-work"] ?? IDLE;
158
- const canStop = panel.parentRunning || active > 1 || panel.collection.status !== "ready";
155
+ const canStop = panel.parentRunning || active > 1 || panel.agentTools.collection.status !== "ready";
159
156
  if (!canStop && !stop.error && !stop.pending) return null;
160
157
  return /* @__PURE__ */ jsx(QueueSectionActions, {
161
158
  "aria-label": "Delegated work controls",
@@ -176,7 +173,7 @@ function SubagentRunPanelControls({ panel, active }) {
176
173
  }
177
174
  function SubagentRunRow({ panel, run, renderRunLink }) {
178
175
  const command = panel.commands[run.runId] ?? IDLE;
179
- const actionable = panel.mayExecute(run) || command.error || command.pending;
176
+ const actionable = agentToolRunMayExecute(run) || command.error || command.pending;
180
177
  return /* @__PURE__ */ jsxs(QueueItem, {
181
178
  "data-run-id": run.runId,
182
179
  children: [/* @__PURE__ */ jsxs(QueueItemContent, { children: [/* @__PURE__ */ jsx(SubagentRunSelector, {
@@ -240,11 +237,11 @@ function SubagentRunPanelContent({ panel, renderRunLink }) {
240
237
  role: "alert",
241
238
  children: stop.error
242
239
  }) : null,
243
- panel.collection.status === "loading" ? /* @__PURE__ */ jsx(AgentChatNotice, { children: panel.collection.stale ? "Reconnecting. Last known runs are shown." : "Loading delegated work…" }) : null,
244
- panel.collection.status === "error" ? /* @__PURE__ */ jsx(AgentChatNotice, {
240
+ panel.agentTools.collection.status === "loading" ? /* @__PURE__ */ jsx(AgentChatNotice, { children: panel.agentTools.collection.stale ? "Reconnecting. Last known runs are shown." : "Loading delegated work…" }) : null,
241
+ panel.agentTools.collection.status === "error" ? /* @__PURE__ */ jsx(AgentChatNotice, {
245
242
  "data-tone": "danger",
246
243
  role: "alert",
247
- children: panel.collection.error ?? "Could not refresh delegated work. Last known runs are retained."
244
+ children: panel.agentTools.collection.error ?? "Could not refresh delegated work. Last known runs are retained."
248
245
  }) : null,
249
246
  /* @__PURE__ */ jsx(QueueList, {
250
247
  "aria-label": "Delegated work runs",
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import * as React from "react";
3
3
  import { UIMessage } from "ai";
4
4
  import { AgentToolRunPart } from "agents/agent-tools";
@@ -1,10 +1,9 @@
1
1
  import { J as PromptInputMessage } from "../../PromptInput-DGPrCTPl.js";
2
2
  import { i as AgentMessageRenderPartContext } from "../../AgentMessageParts-C7L-Mv9U.js";
3
3
  import { AgentChatMessageContentProps, AgentChatRootProps } from "./AgentChat.js";
4
- import { o as createThinkChatActivityRenderer, r as ThinkChatActivityRendererOptions, t as ThinkChatActivity } from "../../ThinkChatActivity-DENkintt.js";
4
+ import { o as createThinkChatActivityRenderer, r as ThinkChatActivityRendererOptions, t as ThinkChatActivity } from "../../ThinkChatActivity-B6dh3n0-.js";
5
5
  import { i as ThinkChatValue } from "../../ThinkChatContext-COIgzkYp.js";
6
6
  import { n as WorkspaceFileRenderer } from "../../WorkspaceMessageResponse-BApg8KZv.js";
7
- import { o as UseSessionCompactionResult } from "../../SessionCompaction-CmTJFpzj.js";
8
7
  import * as React from "react";
9
8
  import { ChatStatus, UIMessage } from "ai";
10
9
  import { DataTag, UndefinedInitialDataOptions } from "@tanstack/react-query";
@@ -64,11 +63,6 @@ declare function ThinkChatApprovals({
64
63
  children
65
64
  }: ThinkChatApprovalsProps): React.JSX.Element;
66
65
  declare function ThinkChatRecoveryNotice(): React.JSX.Element;
67
- declare function ThinkChatCompactionNotice({
68
- compaction
69
- }: {
70
- compaction: UseSessionCompactionResult;
71
- }): React.JSX.Element;
72
66
  declare function useThinkChat<State = unknown, MessageT extends UIMessage = UIMessage>(): Omit<import("@ai-sdk/react").UseChatHelpers<MessageT>, "addToolOutput"> & {
73
67
  clearHistory: () => void;
74
68
  addToolOutput: (opts: {
@@ -93,10 +87,9 @@ declare const ThinkChat: {
93
87
  MessageContent: typeof ThinkChatMessageContent;
94
88
  Approvals: typeof ThinkChatApprovals;
95
89
  RecoveryNotice: typeof ThinkChatRecoveryNotice;
96
- CompactionNotice: typeof ThinkChatCompactionNotice;
97
90
  Activity: typeof ThinkChatActivity;
98
91
  renderActivityPart: (context: AgentMessageRenderPartContext<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>) => React.ReactNode | undefined;
99
92
  createActivityRenderer: typeof createThinkChatActivityRenderer;
100
93
  };
101
94
  //#endregion
102
- export { ThinkChat, ThinkChatApprovals, ThinkChatApprovalsProps, ThinkChatCompactionNotice, ThinkChatMessageContent, ThinkChatMessageContentProps, ThinkChatRecoveryNotice, ThinkChatRoot, ThinkChatRootProps, ThinkPendingExecutionApprovalsQueryKey, ThinkPendingExecutionApprovalsQueryOptions, getThinkChatStatus, normalizeThinkPrompt, thinkPendingExecutionApprovalsQueryOptions, useThinkChat, useThinkPendingExecutionApprovals };
95
+ export { ThinkChat, ThinkChatApprovals, ThinkChatApprovalsProps, ThinkChatMessageContent, ThinkChatMessageContentProps, ThinkChatRecoveryNotice, ThinkChatRoot, ThinkChatRootProps, ThinkPendingExecutionApprovalsQueryKey, ThinkPendingExecutionApprovalsQueryOptions, getThinkChatStatus, normalizeThinkPrompt, thinkPendingExecutionApprovalsQueryOptions, useThinkChat, useThinkPendingExecutionApprovals };
@@ -1,6 +1,6 @@
1
1
  import { composerDraftToPrompt, parseComposerLinks } from "../../utils/composer-link.js";
2
- import { AgentChat, compactingNotice, useAgentChatControls } from "./AgentChat.js";
3
- import { ThinkChatContext, ThinkChatLiveContext, useOptionalThinkChatContext, useThinkChatContext } from "./ThinkChatContext.js";
2
+ import { AgentChat, useAgentChatControls } from "./AgentChat.js";
3
+ import { ThinkChatContext, ThinkChatLiveContext, useThinkChatContext } from "./ThinkChatContext.js";
4
4
  import { ThinkChatActivity, createThinkChatActivityRenderer, renderThinkChatActivityPart } from "./ThinkChatActivity.js";
5
5
  import { ThinkRecoveryNotice } from "./ThinkRecoveryNotice.js";
6
6
  import { n as WorkspaceMessageResponse, t as WorkspaceFileRendererProvider } from "../../WorkspaceMessageResponse-CUJk9_P5.js";
@@ -185,38 +185,6 @@ function ThinkChatRecoveryNotice() {
185
185
  const chat = useThinkChatContext("ThinkChat.RecoveryNotice");
186
186
  return /* @__PURE__ */ jsx(AgentChat.Notice, { children: /* @__PURE__ */ jsx(ThinkRecoveryNotice, { chat }) });
187
187
  }
188
- /** A submitted turn dismisses the result visible in that same committed update. */
189
- function useCompactionDismissal(result, revision) {
190
- const previousRevision = React.useRef(revision);
191
- const dismissed = React.useRef(null);
192
- const revisionChanged = previousRevision.current !== revision;
193
- React.useLayoutEffect(() => {
194
- if (!revisionChanged) return;
195
- previousRevision.current = revision;
196
- dismissed.current = result;
197
- }, [
198
- result,
199
- revision,
200
- revisionChanged
201
- ]);
202
- return revisionChanged || result === dismissed.current;
203
- }
204
- function getCompactionNotice(compaction, resultDismissed) {
205
- if (compaction.compacting) return compactingNotice;
206
- if (compaction.sessionError) return `Compaction failed: ${compaction.sessionError}`;
207
- if (compaction.reloadError) return "Transcript may be out of date. The next completed turn will retry the refresh.";
208
- const result = compaction.lastCompaction;
209
- if (!result || resultDismissed) return null;
210
- const freed = Math.round((result.tokensBefore - result.tokensAfter) / 1e3) * 1e3;
211
- return `Context compacted${freed > 0 ? ` — about ${freed.toLocaleString()} tokens freed` : ""}. Context usage updates after your next message.`;
212
- }
213
- function ThinkChatCompactionNotice({ compaction }) {
214
- const chat = useOptionalThinkChatContext();
215
- const { submissionVersion } = useAgentChatControls();
216
- const revision = `${chat?.messages.length}:${submissionVersion}`;
217
- const dismissed = useCompactionDismissal(compaction.lastCompaction, revision);
218
- return /* @__PURE__ */ jsx(AgentChat.Notice, { children: getCompactionNotice(compaction, dismissed) });
219
- }
220
188
  function useThinkChat() {
221
189
  return useThinkChatContext("useThinkChat");
222
190
  }
@@ -225,10 +193,9 @@ const ThinkChat = {
225
193
  MessageContent: ThinkChatMessageContent,
226
194
  Approvals: ThinkChatApprovals,
227
195
  RecoveryNotice: ThinkChatRecoveryNotice,
228
- CompactionNotice: ThinkChatCompactionNotice,
229
196
  Activity: ThinkChatActivity,
230
197
  renderActivityPart: renderThinkChatActivityPart,
231
198
  createActivityRenderer: createThinkChatActivityRenderer
232
199
  };
233
200
  //#endregion
234
- export { ThinkChat, ThinkChatApprovals, ThinkChatCompactionNotice, ThinkChatMessageContent, ThinkChatRecoveryNotice, ThinkChatRoot, getThinkChatStatus, normalizeThinkPrompt, thinkPendingExecutionApprovalsQueryOptions, useThinkChat, useThinkPendingExecutionApprovals };
201
+ export { ThinkChat, ThinkChatApprovals, ThinkChatMessageContent, ThinkChatRecoveryNotice, ThinkChatRoot, getThinkChatStatus, normalizeThinkPrompt, thinkPendingExecutionApprovalsQueryOptions, useThinkChat, useThinkPendingExecutionApprovals };
@@ -1,2 +1,2 @@
1
- import { a as ThinkChatToolRenderers, i as ThinkChatToolRenderer, n as ThinkChatActivityProps, o as createThinkChatActivityRenderer, r as ThinkChatActivityRendererOptions, s as renderThinkChatActivityPart, t as ThinkChatActivity } from "../../ThinkChatActivity-DENkintt.js";
1
+ import { a as ThinkChatToolRenderers, i as ThinkChatToolRenderer, n as ThinkChatActivityProps, o as createThinkChatActivityRenderer, r as ThinkChatActivityRendererOptions, s as renderThinkChatActivityPart, t as ThinkChatActivity } from "../../ThinkChatActivity-B6dh3n0-.js";
2
2
  export { ThinkChatActivity, ThinkChatActivityProps, ThinkChatActivityRendererOptions, ThinkChatToolRenderer, ThinkChatToolRenderers, createThinkChatActivityRenderer, renderThinkChatActivityPart };
@@ -35,7 +35,7 @@ declare function ThinkFullAppWorkbench({
35
35
  className,
36
36
  ref,
37
37
  ...props
38
- }: ThinkFullAppWorkbenchProps): React.JSX.Element | null;
38
+ }: ThinkFullAppWorkbenchProps): React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | null;
39
39
  interface ThinkFullAppResizeHandleProps extends ResizableSidePanelHandleProps {}
40
40
  /** Keyboard and pointer resize control; absent while the workbench is closed. */
41
41
  declare function ThinkFullAppResizeHandle({
@@ -67,10 +67,7 @@ function ThinkFullAppWorkbench({ render, className, ref, ...props }) {
67
67
  className: mergeBaseClassName("think-full-app__aside", className)
68
68
  }, props)
69
69
  });
70
- return open ? /* @__PURE__ */ jsx(React.ViewTransition, {
71
- default: "sigvelo-layout-transition",
72
- children: element
73
- }) : null;
70
+ return open ? element : null;
74
71
  }
75
72
  /** Keyboard and pointer resize control; absent while the workbench is closed. */
76
73
  function ThinkFullAppResizeHandle({ className, ...props }) {
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { K as SpinnerIcon, R as PencilIcon, _ as DotIcon, et as WarningIcon, t as ArchiveIcon } from "../../icons-cuEtsgj9.js";
2
+ import { K as SpinnerIcon, R as PencilIcon, et as WarningIcon, t as ArchiveIcon } from "../../icons-cuEtsgj9.js";
3
3
  import { Button, buttonVariants } from "../foundations/Button.js";
4
4
  import { Tooltip } from "../foundations/Tooltip.js";
5
5
  import { a as formatErrorMessage } from "../../format-COCyV98Z.js";
@@ -91,7 +91,10 @@ function ThinkThreadStatusIndicators({ summary, className }) {
91
91
  summary.attention ? /* @__PURE__ */ jsxs("span", {
92
92
  className: "think-thread-status-indicators__item",
93
93
  "data-status": "attention",
94
- children: [/* @__PURE__ */ jsx(DotIcon, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", { children: summary.attention })]
94
+ children: [/* @__PURE__ */ jsx("span", {
95
+ className: "think-thread-status-dot",
96
+ "aria-hidden": "true"
97
+ }), /* @__PURE__ */ jsx("span", { children: summary.attention })]
95
98
  }) : null,
96
99
  summary.failed ? /* @__PURE__ */ jsxs("span", {
97
100
  className: "think-thread-status-indicators__item",
@@ -167,10 +170,7 @@ function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSele
167
170
  className: "think-thread-picker__title sigvelo-truncate",
168
171
  children: title
169
172
  }),
170
- /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, {
171
- summary: statusSummary,
172
- className: "sigvelo-visually-hidden"
173
- }),
173
+ /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, { summary: statusSummary }),
174
174
  createThreadLink ? /* @__PURE__ */ jsxs(Tooltip.Root, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
175
175
  render: /* @__PURE__ */ jsx(LinkButton, {
176
176
  ref: createButtonRef,
@@ -245,7 +245,10 @@ function ThinkThreadPicker({ threads, renderThreadLink, createThreadLink, onSele
245
245
  role: "img",
246
246
  "aria-label": statusLabel,
247
247
  title: statusLabel,
248
- children: busy ? /* @__PURE__ */ jsx(SpinnerIcon, {}) : /* @__PURE__ */ jsx(DotIcon, {})
248
+ children: busy ? /* @__PURE__ */ jsx(SpinnerIcon, {}) : /* @__PURE__ */ jsx("span", {
249
+ className: "think-thread-status-dot",
250
+ "aria-hidden": "true"
251
+ })
249
252
  }) : timestamp?.date ? /* @__PURE__ */ jsx("time", {
250
253
  className: "think-thread-picker__thread-time",
251
254
  dateTime: timestamp.date.toISOString(),
@@ -1,4 +1,4 @@
1
- import { n as AgentToolRunValue } from "../../AgentToolRunsContext-GMe_hSnD.js";
1
+ import { n as AgentToolRunValue } from "../../AgentToolRunsContext-DT50htHj.js";
2
2
  import { i as ThinkChatValue } from "../../ThinkChatContext-COIgzkYp.js";
3
3
  import { SubagentRunMetadataProps } from "../agents-sdk/SubagentRunDetails.js";
4
4
  import * as React from "react";
@@ -21,6 +21,16 @@
21
21
  min-block-size: 0;
22
22
  }
23
23
 
24
+ /* One gutter contract for the transcript and floating composer, including
25
+ safe areas. The prompt's internal text padding is independent. */
26
+ .agent-chat__transcript-content,
27
+ .agent-chat__dock {
28
+ --agent-chat-used-column-inset: var(--agent-chat-column-inset, var(--sigvelo-spacing-4));
29
+
30
+ padding-inline: max(var(--agent-chat-used-column-inset), env(safe-area-inset-left, 0px))
31
+ max(var(--agent-chat-used-column-inset), env(safe-area-inset-right, 0px));
32
+ }
33
+
24
34
  /* Room for the last message to scroll clear of the floating composer.
25
35
  --agent-chat-dock-size is set from a ResizeObserver in AgentChat. */
26
36
  .agent-chat__transcript-content {
@@ -31,21 +41,14 @@
31
41
  --message-scroller-virtual-block-start: var(--sigvelo-spacing-8);
32
42
 
33
43
  min-inline-size: 0;
34
- max-inline-size: 100%;
35
- /* Codex thread column: `mx-auto w-full max-w-(--thread-content-max-width)
36
- px-toolbar`. Subtract the inset from the measure so content-box padding
37
- cannot overflow the scroller or eat the composer clearance. */
38
- --agent-chat-used-column-inset: var(--agent-chat-column-inset, var(--sigvelo-spacing-4));
39
- inline-size: min(
40
- calc(100% - 2 * var(--agent-chat-used-column-inset)),
41
- var(--agent-chat-content-max-inline-size, var(--sigvelo-measure-wide-block))
42
- );
44
+ /* Auto width subtracts the gutters from the content box; cap the reading
45
+ width at the same measure as the composer. */
46
+ max-inline-size: var(--agent-chat-content-max-inline-size, var(--sigvelo-measure-wide-block));
43
47
  margin-inline: auto;
44
48
  /* Clearance = composer + its scrim band, so a transcript resting at the
45
49
  bottom never sits inside the fade. */
46
50
  padding-block: var(--message-scroller-virtual-block-start)
47
51
  calc(var(--agent-chat-dock-size, 5rem) + var(--agent-chat-dock-scrim-fade, 2.5rem));
48
- padding-inline: var(--agent-chat-used-column-inset);
49
52
  }
50
53
 
51
54
  .agent-chat:not(:has(.agent-chat__dock-content > :not(.agent-chat__notice:empty)))
@@ -69,11 +72,15 @@
69
72
  lower edge, so the state sits slightly high rather than under it. The
70
73
  shared brand loading state brings its own type and colour. */
71
74
  .agent-chat__transcript-loading {
75
+ overflow: hidden;
76
+ scrollbar-gutter: stable;
72
77
  padding-block-end: var(--agent-chat-dock-size, 5rem);
73
78
  }
74
79
 
75
80
  .agent-chat:not(:has(.agent-chat__dock-content > :not(.agent-chat__notice:empty)))
76
81
  .agent-chat__transcript-loading {
82
+ overflow: hidden;
83
+ scrollbar-gutter: stable;
77
84
  padding-block-end: 0;
78
85
  }
79
86
 
@@ -145,6 +152,8 @@
145
152
  }
146
153
 
147
154
  .agent-chat-start-screen__composer > .agent-chat__dock > .agent-chat__dock-content {
155
+ /* The start screen already reserves its own scrollbar gutter. */
156
+ scrollbar-gutter: auto;
148
157
  --agent-chat-dock-ink-room: 0px;
149
158
 
150
159
  overflow: visible;
@@ -301,14 +310,7 @@
301
310
  position: absolute;
302
311
  inset-inline: 0;
303
312
  inset-block-end: 0;
304
- padding-block: 0 max(var(--sigvelo-spacing-6), env(safe-area-inset-bottom, 0px));
305
- /* Same column as the transcript (Codex px-toolbar). The pill's own
306
- padding lives on .prompt-input. */
307
- padding-inline: max(
308
- var(--agent-chat-column-inset, var(--sigvelo-spacing-4)),
309
- env(safe-area-inset-left, 0px)
310
- )
311
- max(var(--agent-chat-column-inset, var(--sigvelo-spacing-4)), env(safe-area-inset-right, 0px));
313
+ padding-block: 0 max(var(--sigvelo-spacing-2), env(safe-area-inset-bottom, 0px));
312
314
  }
313
315
 
314
316
  /* Solid behind the composer itself, dissolving upward so passing transcript
@@ -446,6 +448,12 @@
446
448
  only where there is genuinely no room for it. */
447
449
  /* Local wrap. Not --sigvelo-layout-break-compact. */
448
450
  @container agent-chat (inline-size <= 36rem) {
451
+ .agent-chat__transcript-content,
452
+ .agent-chat__dock {
453
+ /* Codex Chrome extension: [--padding-toolbar:calc(var(--spacing)*2)] = 8px. */
454
+ --agent-chat-used-column-inset: var(--agent-chat-column-inset, var(--sigvelo-spacing-2));
455
+ }
456
+
449
457
  .agent-chat__transcript-content {
450
458
  /* A notch pushes the first row down only as far as it must: the desktop
451
459
  inset already clears shallow insets, so only deeper ones add height. */
@@ -453,23 +461,6 @@
453
461
  var(--sigvelo-spacing-8),
454
462
  calc(var(--sigvelo-spacing-5) + env(safe-area-inset-top, 0px))
455
463
  );
456
-
457
- --agent-chat-used-column-inset: var(--agent-chat-column-inset, var(--sigvelo-spacing-2));
458
- inline-size: min(
459
- calc(100% - 2 * var(--agent-chat-used-column-inset)),
460
- var(--agent-chat-content-max-inline-size, var(--sigvelo-measure-wide-block))
461
- );
462
- /* Codex Chrome extension: [--padding-toolbar:calc(var(--spacing)*2)] = 8px. */
463
- padding-inline: var(--agent-chat-used-column-inset);
464
- }
465
-
466
- .agent-chat__dock {
467
- padding-block-end: max(var(--sigvelo-layout-stack), env(safe-area-inset-bottom, 0px));
468
- padding-inline: max(
469
- var(--agent-chat-column-inset, var(--sigvelo-spacing-2)),
470
- env(safe-area-inset-left, 0px)
471
- )
472
- max(var(--agent-chat-column-inset, var(--sigvelo-spacing-2)), env(safe-area-inset-right, 0px));
473
464
  }
474
465
 
475
466
  .agent-chat-start-screen__content {
@@ -516,6 +507,10 @@
516
507
  .agent-chat__dock-content {
517
508
  --agent-chat-dock-ink-room: var(--sigvelo-spacing-5);
518
509
 
510
+ /* Match the transcript viewport on platforms with classic scrollbars,
511
+ even while this dock is short enough not to scroll. */
512
+ scrollbar-gutter: stable;
513
+
519
514
  min-block-size: 0;
520
515
  overflow: auto;
521
516
  margin: calc(-1 * var(--agent-chat-dock-ink-room));