@assistant-ui/core 0.2.23 → 0.3.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 (199) hide show
  1. package/dist/react/adapters/LocalStorageThreadListAdapter.js +2 -2
  2. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  3. package/dist/react/client/Tools.d.ts.map +1 -1
  4. package/dist/react/client/Tools.js +40 -55
  5. package/dist/react/client/Tools.js.map +1 -1
  6. package/dist/react/interactables-legacy/useAssistantInteractable.js +1 -1
  7. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  8. package/dist/react/interactables-legacy/useInteractableState.js +3 -3
  9. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  10. package/dist/react/model-context/useAssistantContext.js +1 -1
  11. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  12. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  13. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  14. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  15. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  16. package/dist/react/model-context/useAssistantTool.js +29 -25
  17. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  18. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  19. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  20. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  21. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  22. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  23. package/dist/react/model-context/useInteractable.js +3 -5
  24. package/dist/react/model-context/useInteractable.js.map +1 -1
  25. package/dist/react/model-context/useInteractableState.js +2 -2
  26. package/dist/react/model-context/useInteractableState.js.map +1 -1
  27. package/dist/react/primitive-hooks/useActionBarCopy.js +3 -3
  28. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  29. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  30. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  31. package/dist/react/primitive-hooks/useActionBarFeedback.js +2 -2
  32. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  33. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  34. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  35. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  36. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  37. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  38. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  39. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  40. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  41. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  42. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  43. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  44. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  45. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  46. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  47. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  48. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  49. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  50. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  51. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  52. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  53. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  54. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  55. package/dist/react/primitive-hooks/useMessageBranching.js +2 -2
  56. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  57. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  58. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  59. package/dist/react/primitive-hooks/useSuggestionTrigger.js +7 -7
  60. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  61. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  62. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  63. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  64. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  65. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  66. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  67. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  68. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  69. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  70. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  71. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  72. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  73. package/dist/react/primitive-hooks/useVoice.js +5 -13
  74. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  75. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  76. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  77. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  78. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  79. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  80. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  81. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  82. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  83. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  84. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  85. package/dist/react/primitives/message/MessageParts.js +84 -122
  86. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  87. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  88. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  89. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  90. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  91. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  92. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  93. package/dist/react/providers/AttachmentByIndexProvider.js +2 -2
  94. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  95. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +1 -1
  96. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  97. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  98. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +30 -18
  99. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  100. package/dist/react/providers/MessageByIdProvider.js +2 -2
  101. package/dist/react/providers/MessageByIdProvider.js.map +1 -1
  102. package/dist/react/providers/MessageByIndexProvider.js +2 -2
  103. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  104. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  105. package/dist/react/providers/PartByIndexProvider.js +30 -18
  106. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  107. package/dist/react/providers/QueueItemByIndexProvider.js +1 -1
  108. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  109. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  110. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  111. package/dist/react/providers/SuggestionByIndexProvider.js +1 -1
  112. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  113. package/dist/react/providers/ThreadListItemByIndexProvider.js +1 -1
  114. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  115. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +3 -3
  116. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  117. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  118. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +32 -20
  119. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  120. package/dist/react/runtimes/createRuntimeExtras.js +1 -1
  121. package/dist/react/runtimes/createRuntimeExtras.js.map +1 -1
  122. package/dist/react/types/scopes/tools.d.ts +0 -6
  123. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  124. package/dist/react/utils/groupParts.d.ts +1 -3
  125. package/dist/react/utils/groupParts.d.ts.map +1 -1
  126. package/dist/react/utils/groupParts.js +1 -3
  127. package/dist/react/utils/groupParts.js.map +1 -1
  128. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  129. package/dist/runtimes/local/local-thread-runtime-core.js +4 -3
  130. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  131. package/dist/store/clients/runtime-adapter.js +3 -3
  132. package/dist/store/clients/runtime-adapter.js.map +1 -1
  133. package/package.json +5 -5
  134. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +2 -2
  135. package/src/react/client/Tools.ts +0 -7
  136. package/src/react/interactables-legacy/useAssistantInteractable.ts +1 -1
  137. package/src/react/interactables-legacy/useInteractableState.ts +3 -3
  138. package/src/react/model-context/useAssistantContext.ts +1 -1
  139. package/src/react/model-context/useAssistantDataUI.ts +1 -1
  140. package/src/react/model-context/useAssistantInstructions.ts +1 -1
  141. package/src/react/model-context/useAssistantTool.ts +2 -2
  142. package/src/react/model-context/useAssistantToolUI.ts +1 -1
  143. package/src/react/model-context/useAuiToolOverrides.ts +1 -1
  144. package/src/react/model-context/useInteractable.ts +3 -7
  145. package/src/react/model-context/useInteractableState.ts +2 -2
  146. package/src/react/primitive-hooks/useActionBarCopy.test.ts +2 -2
  147. package/src/react/primitive-hooks/useActionBarCopy.ts +3 -3
  148. package/src/react/primitive-hooks/useActionBarEdit.ts +1 -1
  149. package/src/react/primitive-hooks/useActionBarFeedback.ts +2 -2
  150. package/src/react/primitive-hooks/useActionBarReload.ts +1 -1
  151. package/src/react/primitive-hooks/useActionBarSpeak.ts +1 -1
  152. package/src/react/primitive-hooks/useActionBarStopSpeaking.ts +1 -1
  153. package/src/react/primitive-hooks/useBranchPickerNext.ts +1 -1
  154. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +1 -1
  155. package/src/react/primitive-hooks/useComposerAddAttachment.ts +1 -1
  156. package/src/react/primitive-hooks/useComposerCancel.ts +1 -1
  157. package/src/react/primitive-hooks/useComposerDictate.ts +1 -1
  158. package/src/react/primitive-hooks/useComposerSend.ts +1 -1
  159. package/src/react/primitive-hooks/useEditComposerCancel.ts +1 -1
  160. package/src/react/primitive-hooks/useEditComposerSend.ts +1 -1
  161. package/src/react/primitive-hooks/useMessageBranching.ts +2 -2
  162. package/src/react/primitive-hooks/useMessageReload.ts +1 -1
  163. package/src/react/primitive-hooks/useSuggestionTrigger.ts +9 -9
  164. package/src/react/primitive-hooks/useThreadListItemArchive.ts +1 -1
  165. package/src/react/primitive-hooks/useThreadListItemDelete.ts +1 -1
  166. package/src/react/primitive-hooks/useThreadListItemTrigger.ts +1 -1
  167. package/src/react/primitive-hooks/useThreadListItemUnarchive.ts +1 -1
  168. package/src/react/primitive-hooks/useThreadListLoadMore.ts +1 -1
  169. package/src/react/primitive-hooks/useThreadListNew.ts +1 -1
  170. package/src/react/primitive-hooks/useVoice.ts +5 -5
  171. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -1
  172. package/src/react/primitives/composer/ComposerAttachments.tsx +1 -1
  173. package/src/react/primitives/composer/ComposerQueue.tsx +1 -3
  174. package/src/react/primitives/message/MessageAttachments.tsx +1 -3
  175. package/src/react/primitives/message/MessageParts.tsx +9 -9
  176. package/src/react/primitives/thread/ThreadMessages.tsx +1 -1
  177. package/src/react/primitives/thread/ThreadSuggestions.tsx +1 -1
  178. package/src/react/primitives/threadList/ThreadListItems.tsx +1 -1
  179. package/src/react/providers/AttachmentByIndexProvider.tsx +2 -2
  180. package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
  181. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +2 -19
  182. package/src/react/providers/MessageByIdProvider.tsx +2 -2
  183. package/src/react/providers/MessageByIndexProvider.tsx +2 -2
  184. package/src/react/providers/PartByIndexProvider.tsx +2 -16
  185. package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
  186. package/src/react/providers/ReadonlyThreadProvider.tsx +1 -1
  187. package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
  188. package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
  189. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +3 -3
  190. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +32 -7
  191. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -16
  192. package/src/react/runtimes/createRuntimeExtras.test.ts +1 -1
  193. package/src/react/runtimes/createRuntimeExtras.ts +1 -1
  194. package/src/react/types/scopes/tools.ts +0 -6
  195. package/src/react/utils/groupParts.ts +1 -7
  196. package/src/runtimes/local/local-thread-runtime-core.test.ts +38 -0
  197. package/src/runtimes/local/local-thread-runtime-core.ts +6 -3
  198. package/src/store/clients/runtime-adapter.ts +3 -3
  199. package/src/tests/groupParts.test.ts +3 -48
@@ -6,7 +6,7 @@ type Extras = { value: number; greet: () => string };
6
6
 
7
7
  const clientWith = (extras: unknown) =>
8
8
  ({
9
- thread: () => ({ getState: () => ({ extras }) }),
9
+ thread: { getState: () => ({ extras }) },
10
10
  }) as unknown as AssistantClient;
11
11
 
12
12
  describe("createRuntimeExtras", () => {
@@ -46,7 +46,7 @@ export const createRuntimeExtras = <T extends object>(
46
46
  is(extras) ? extras : undefined;
47
47
 
48
48
  const get = (client: AssistantClient): T =>
49
- assert(client.thread().getState().extras);
49
+ assert(client.thread.getState().extras);
50
50
 
51
51
  function use<S>(
52
52
  select?: (extras: T) => S,
@@ -20,12 +20,6 @@ export type ToolsState = {
20
20
  /** Registered tool UIs (renderer + presentation options) keyed by tool name. */
21
21
  toolUIs: Record<string, readonly ToolRegistration[]>;
22
22
  mcpApp?: McpAppResourceOutput | undefined;
23
- /**
24
- * @deprecated Use {@link toolUIs} instead, whose entries carry the renderer
25
- * alongside its presentation options. This component-only map is kept for
26
- * back-compat and will be removed in v0.15.
27
- */
28
- tools: Record<string, ToolCallMessagePartComponent[]>;
29
23
  };
30
24
 
31
25
  export type ToolsMethods = {
@@ -47,10 +47,8 @@ export const GROUPBY_MEMO_KEY: unique symbol = Symbol.for(
47
47
  * `display: "standalone"`). Resolving the registry-driven cases reads the
48
48
  * {@link GroupByContext} passed to the `groupBy` function. Takes precedence
49
49
  * over the `"tool-call"` entry.
50
- * - `"mcp-app"` — **deprecated**, kept for back-compat. Matches only MCP-app
51
- * tool calls. Prefer `"standalone-tool-call"`, which is a superset.
52
50
  */
53
- type GroupPartType = PartState["type"] | "standalone-tool-call" | "mcp-app";
51
+ type GroupPartType = PartState["type"] | "standalone-tool-call";
54
52
 
55
53
  /**
56
54
  * Build a `groupBy` from a `part.type → group-key path` lookup.
@@ -93,10 +91,6 @@ export const groupPartByType = <TKey extends `group-${string}`>(
93
91
  if (isStandalone && lookup["standalone-tool-call"] !== undefined) {
94
92
  return lookup["standalone-tool-call"]!;
95
93
  }
96
- // TODO(v0.15): drop the deprecated "mcp-app" key (superseded by "standalone-tool-call").
97
- if (isMcpApp && lookup["mcp-app"] !== undefined) {
98
- return lookup["mcp-app"]!;
99
- }
100
94
  }
101
95
  return lookup[part.type] ?? [];
102
96
  }) as ((part: PartState, context?: GroupByContext) => readonly TKey[]) & {
@@ -497,6 +497,44 @@ describe("LocalThreadRuntimeCore tool approvals", () => {
497
497
  });
498
498
 
499
499
  describe("LocalThreadRuntimeCore cancellation", () => {
500
+ it("keeps a replacement run cancellable after the previous run settles", async () => {
501
+ let releaseFirst!: () => void;
502
+ let releaseSecond!: () => void;
503
+ const firstGate = new Promise<void>((resolve) => {
504
+ releaseFirst = resolve;
505
+ });
506
+ const secondGate = new Promise<void>((resolve) => {
507
+ releaseSecond = resolve;
508
+ });
509
+ const signals: AbortSignal[] = [];
510
+ const thread = createThread({
511
+ async *run({ abortSignal }) {
512
+ signals.push(abortSignal);
513
+ await (signals.length === 1 ? firstGate : secondGate);
514
+ },
515
+ });
516
+
517
+ const firstAppend = thread.append(userMessage("first"));
518
+ await flush();
519
+ const secondAppend = thread.append(userMessage("second"));
520
+ await flush();
521
+
522
+ expect(signals).toHaveLength(2);
523
+ expect(signals[0]?.aborted).toBe(true);
524
+ expect(signals[1]?.aborted).toBe(false);
525
+
526
+ releaseFirst();
527
+ await firstAppend;
528
+
529
+ thread.cancelRun();
530
+ const replacementWasAborted = signals[1]?.aborted;
531
+
532
+ releaseSecond();
533
+ await secondAppend;
534
+
535
+ expect(replacementWasAborted).toBe(true);
536
+ });
537
+
500
538
  it("marks the message cancelled when a streaming adapter returns after abort", async () => {
501
539
  let released!: () => void;
502
540
  const streaming = new Promise<void>((resolve) => {
@@ -459,7 +459,8 @@ export class LocalThreadRuntimeCore
459
459
 
460
460
  // abort existing run
461
461
  this.abortController?.abort();
462
- this.abortController = new AbortController();
462
+ const abortController = new AbortController();
463
+ this.abortController = abortController;
463
464
 
464
465
  const initialContent = message.content;
465
466
  const initialAnnotations = message.metadata?.unstable_annotations;
@@ -550,7 +551,7 @@ export class LocalThreadRuntimeCore
550
551
  runCallback ??
551
552
  this.adapters.chatModel.run.bind(this.adapters.chatModel);
552
553
 
553
- const abortSignal = this.abortController.signal;
554
+ const abortSignal = abortController.signal;
554
555
  const threadId = this._getThreadId?.();
555
556
  const promiseOrGenerator = runCallback({
556
557
  messages,
@@ -609,7 +610,9 @@ export class LocalThreadRuntimeCore
609
610
  throw e;
610
611
  }
611
612
  } finally {
612
- this.abortController = null;
613
+ if (this.abortController === abortController) {
614
+ this.abortController = null;
615
+ }
613
616
 
614
617
  const history = this._options.adapters.history;
615
618
  const item = {
@@ -13,17 +13,17 @@ export const baseRuntimeAdapterTransformScopes = (
13
13
  scopes.thread ??= Derived({
14
14
  source: "threads",
15
15
  query: { type: "main" },
16
- get: (aui) => aui.threads().thread("main"),
16
+ get: (aui) => aui.threads.thread("main"),
17
17
  });
18
18
  scopes.threadListItem ??= Derived({
19
19
  source: "threads",
20
20
  query: { type: "main" },
21
- get: (aui) => aui.threads().item("main"),
21
+ get: (aui) => aui.threads.item("main"),
22
22
  });
23
23
  scopes.composer ??= Derived({
24
24
  source: "thread",
25
25
  query: {},
26
- get: (aui) => aui.threads().thread("main").composer(),
26
+ get: (aui) => aui.threads.thread("main").composer(),
27
27
  });
28
28
 
29
29
  if (!scopes.modelContext && parent.modelContext.source === null) {
@@ -119,25 +119,7 @@ describe("groupPartByType", () => {
119
119
  expect(fn(part({ type: "text" }))).toEqual([]);
120
120
  });
121
121
 
122
- it("routes MCP-app tool calls through the 'mcp-app' entry when present", () => {
123
- const fn = groupPartByType({
124
- "tool-call": ["group-tool"],
125
- "mcp-app": [],
126
- });
127
- const mcpApp = part({
128
- type: "tool-call",
129
- toolName: "render",
130
- mcp: { app: { resourceUri: "ui://my-app" } },
131
- } as Partial<PartState>);
132
- const regular = part({
133
- type: "tool-call",
134
- toolName: "search",
135
- } as Partial<PartState>);
136
- expect(fn(mcpApp)).toEqual([]);
137
- expect(fn(regular)).toEqual(["group-tool"]);
138
- });
139
-
140
- it("falls back to 'tool-call' for MCP-app parts when 'mcp-app' is absent", () => {
122
+ it("falls back to 'tool-call' for MCP-app parts when 'standalone-tool-call' is absent", () => {
141
123
  const fn = groupPartByType({ "tool-call": ["group-tool"] });
142
124
  const mcpApp = part({
143
125
  type: "tool-call",
@@ -147,10 +129,10 @@ describe("groupPartByType", () => {
147
129
  expect(fn(mcpApp)).toEqual(["group-tool"]);
148
130
  });
149
131
 
150
- it("does not route non-`ui://` tool calls through 'mcp-app'", () => {
132
+ it("does not treat non-`ui://` tool calls as standalone", () => {
151
133
  const fn = groupPartByType({
152
134
  "tool-call": ["group-tool"],
153
- "mcp-app": ["group-mcp"],
135
+ "standalone-tool-call": ["group-standalone"],
154
136
  });
155
137
  const notMcp = part({
156
138
  type: "tool-call",
@@ -235,33 +217,6 @@ describe("groupPartByType", () => {
235
217
  expect(fn(mcpApp)).toEqual([]);
236
218
  });
237
219
 
238
- it("routes MCP-app parts through the deprecated 'mcp-app' entry", () => {
239
- const fn = groupPartByType({
240
- "tool-call": ["group-tool"],
241
- "mcp-app": ["group-mcp"],
242
- });
243
- const mcpApp = part({
244
- type: "tool-call",
245
- toolName: "render",
246
- mcp: { app: { resourceUri: "ui://my-app" } },
247
- } as Partial<PartState>);
248
- expect(fn(mcpApp)).toEqual(["group-mcp"]);
249
- });
250
-
251
- it("prefers 'standalone-tool-call' over the deprecated 'mcp-app' entry", () => {
252
- const fn = groupPartByType({
253
- "tool-call": ["group-tool"],
254
- "standalone-tool-call": ["group-standalone"],
255
- "mcp-app": ["group-mcp"],
256
- });
257
- const mcpApp = part({
258
- type: "tool-call",
259
- toolName: "render",
260
- mcp: { app: { resourceUri: "ui://x" } },
261
- } as Partial<PartState>);
262
- expect(fn(mcpApp)).toEqual(["group-standalone"]);
263
- });
264
-
265
220
  it("tags the function with a GROUPBY_MEMO_KEY fingerprint", () => {
266
221
  const fn = groupPartByType({ reasoning: ["group-r"] });
267
222
  const memoKey = (fn as unknown as { [GROUPBY_MEMO_KEY]: string })[