@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.
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +2 -2
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +40 -55
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.js +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
- package/dist/react/interactables-legacy/useInteractableState.js +3 -3
- package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
- package/dist/react/model-context/useAssistantContext.js +1 -1
- package/dist/react/model-context/useAssistantContext.js.map +1 -1
- package/dist/react/model-context/useAssistantDataUI.js +1 -1
- package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
- package/dist/react/model-context/useAssistantInstructions.js +1 -1
- package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
- package/dist/react/model-context/useAssistantTool.js +29 -25
- package/dist/react/model-context/useAssistantTool.js.map +1 -1
- package/dist/react/model-context/useAssistantToolUI.js +1 -1
- package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
- package/dist/react/model-context/useAuiToolOverrides.js +1 -1
- package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
- package/dist/react/model-context/useInteractable.d.ts.map +1 -1
- package/dist/react/model-context/useInteractable.js +3 -5
- package/dist/react/model-context/useInteractable.js.map +1 -1
- package/dist/react/model-context/useInteractableState.js +2 -2
- package/dist/react/model-context/useInteractableState.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js +3 -3
- package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarFeedback.js +2 -2
- package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.js +1 -1
- package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageBranching.js +2 -2
- package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageReload.js +1 -1
- package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.js +7 -7
- package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
- package/dist/react/primitive-hooks/useVoice.js +5 -13
- package/dist/react/primitive-hooks/useVoice.js.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.js +1 -1
- package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.js +1 -1
- package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.js +84 -122
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
- package/dist/react/providers/AttachmentByIndexProvider.js +2 -2
- package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +30 -18
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
- package/dist/react/providers/MessageByIdProvider.js +2 -2
- package/dist/react/providers/MessageByIdProvider.js.map +1 -1
- package/dist/react/providers/MessageByIndexProvider.js +2 -2
- package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
- package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/PartByIndexProvider.js +30 -18
- package/dist/react/providers/PartByIndexProvider.js.map +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.js +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.js +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.js +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +3 -3
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +32 -20
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/createRuntimeExtras.js +1 -1
- package/dist/react/runtimes/createRuntimeExtras.js.map +1 -1
- package/dist/react/types/scopes/tools.d.ts +0 -6
- package/dist/react/types/scopes/tools.d.ts.map +1 -1
- package/dist/react/utils/groupParts.d.ts +1 -3
- package/dist/react/utils/groupParts.d.ts.map +1 -1
- package/dist/react/utils/groupParts.js +1 -3
- package/dist/react/utils/groupParts.js.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +4 -3
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/store/clients/runtime-adapter.js +3 -3
- package/dist/store/clients/runtime-adapter.js.map +1 -1
- package/package.json +5 -5
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +2 -2
- package/src/react/client/Tools.ts +0 -7
- package/src/react/interactables-legacy/useAssistantInteractable.ts +1 -1
- package/src/react/interactables-legacy/useInteractableState.ts +3 -3
- package/src/react/model-context/useAssistantContext.ts +1 -1
- package/src/react/model-context/useAssistantDataUI.ts +1 -1
- package/src/react/model-context/useAssistantInstructions.ts +1 -1
- package/src/react/model-context/useAssistantTool.ts +2 -2
- package/src/react/model-context/useAssistantToolUI.ts +1 -1
- package/src/react/model-context/useAuiToolOverrides.ts +1 -1
- package/src/react/model-context/useInteractable.ts +3 -7
- package/src/react/model-context/useInteractableState.ts +2 -2
- package/src/react/primitive-hooks/useActionBarCopy.test.ts +2 -2
- package/src/react/primitive-hooks/useActionBarCopy.ts +3 -3
- package/src/react/primitive-hooks/useActionBarEdit.ts +1 -1
- package/src/react/primitive-hooks/useActionBarFeedback.ts +2 -2
- package/src/react/primitive-hooks/useActionBarReload.ts +1 -1
- package/src/react/primitive-hooks/useActionBarSpeak.ts +1 -1
- package/src/react/primitive-hooks/useActionBarStopSpeaking.ts +1 -1
- package/src/react/primitive-hooks/useBranchPickerNext.ts +1 -1
- package/src/react/primitive-hooks/useBranchPickerPrevious.ts +1 -1
- package/src/react/primitive-hooks/useComposerAddAttachment.ts +1 -1
- package/src/react/primitive-hooks/useComposerCancel.ts +1 -1
- package/src/react/primitive-hooks/useComposerDictate.ts +1 -1
- package/src/react/primitive-hooks/useComposerSend.ts +1 -1
- package/src/react/primitive-hooks/useEditComposerCancel.ts +1 -1
- package/src/react/primitive-hooks/useEditComposerSend.ts +1 -1
- package/src/react/primitive-hooks/useMessageBranching.ts +2 -2
- package/src/react/primitive-hooks/useMessageReload.ts +1 -1
- package/src/react/primitive-hooks/useSuggestionTrigger.ts +9 -9
- package/src/react/primitive-hooks/useThreadListItemArchive.ts +1 -1
- package/src/react/primitive-hooks/useThreadListItemDelete.ts +1 -1
- package/src/react/primitive-hooks/useThreadListItemTrigger.ts +1 -1
- package/src/react/primitive-hooks/useThreadListItemUnarchive.ts +1 -1
- package/src/react/primitive-hooks/useThreadListLoadMore.ts +1 -1
- package/src/react/primitive-hooks/useThreadListNew.ts +1 -1
- package/src/react/primitive-hooks/useVoice.ts +5 -5
- package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -1
- package/src/react/primitives/composer/ComposerAttachments.tsx +1 -1
- package/src/react/primitives/composer/ComposerQueue.tsx +1 -3
- package/src/react/primitives/message/MessageAttachments.tsx +1 -3
- package/src/react/primitives/message/MessageParts.tsx +9 -9
- package/src/react/primitives/thread/ThreadMessages.tsx +1 -1
- package/src/react/primitives/thread/ThreadSuggestions.tsx +1 -1
- package/src/react/primitives/threadList/ThreadListItems.tsx +1 -1
- package/src/react/providers/AttachmentByIndexProvider.tsx +2 -2
- package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
- package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +2 -19
- package/src/react/providers/MessageByIdProvider.tsx +2 -2
- package/src/react/providers/MessageByIndexProvider.tsx +2 -2
- package/src/react/providers/PartByIndexProvider.tsx +2 -16
- package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
- package/src/react/providers/ReadonlyThreadProvider.tsx +1 -1
- package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
- package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +3 -3
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +32 -7
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -16
- package/src/react/runtimes/createRuntimeExtras.test.ts +1 -1
- package/src/react/runtimes/createRuntimeExtras.ts +1 -1
- package/src/react/types/scopes/tools.ts +0 -6
- package/src/react/utils/groupParts.ts +1 -7
- package/src/runtimes/local/local-thread-runtime-core.test.ts +38 -0
- package/src/runtimes/local/local-thread-runtime-core.ts +6 -3
- package/src/store/clients/runtime-adapter.ts +3 -3
- 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:
|
|
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
|
|
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"
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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("
|
|
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
|
|
132
|
+
it("does not treat non-`ui://` tool calls as standalone", () => {
|
|
151
133
|
const fn = groupPartByType({
|
|
152
134
|
"tool-call": ["group-tool"],
|
|
153
|
-
"
|
|
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 })[
|