@assistant-ui/react-ai-sdk 1.3.23 → 1.3.26

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 (45) hide show
  1. package/README.md +14 -40
  2. package/dist/frontendTools.d.ts +2 -6
  3. package/dist/frontendTools.d.ts.map +1 -1
  4. package/dist/frontendTools.js +35 -3
  5. package/dist/frontendTools.js.map +1 -1
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/modelContentEnvelope.d.ts +14 -0
  11. package/dist/modelContentEnvelope.d.ts.map +1 -0
  12. package/dist/modelContentEnvelope.js +20 -0
  13. package/dist/modelContentEnvelope.js.map +1 -0
  14. package/dist/ui/resumable.d.ts +20 -0
  15. package/dist/ui/resumable.d.ts.map +1 -0
  16. package/dist/ui/resumable.js +25 -0
  17. package/dist/ui/resumable.js.map +1 -0
  18. package/dist/ui/use-chat/AssistantChatTransport.d.ts +7 -1
  19. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  20. package/dist/ui/use-chat/AssistantChatTransport.js +73 -2
  21. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  22. package/dist/ui/use-chat/useAISDKRuntime.d.ts +17 -2
  23. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  24. package/dist/ui/use-chat/useAISDKRuntime.js +12 -2
  25. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  26. package/dist/ui/use-chat/useChatRuntime.d.ts +2 -0
  27. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  28. package/dist/ui/use-chat/useChatRuntime.js +31 -1
  29. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  30. package/dist/ui/utils/convertMessage.d.ts +4 -0
  31. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  32. package/dist/ui/utils/convertMessage.js +100 -5
  33. package/dist/ui/utils/convertMessage.js.map +1 -1
  34. package/package.json +4 -4
  35. package/src/frontendTools.test.ts +128 -0
  36. package/src/frontendTools.ts +41 -6
  37. package/src/index.ts +8 -0
  38. package/src/modelContentEnvelope.ts +39 -0
  39. package/src/ui/resumable.ts +42 -0
  40. package/src/ui/use-chat/AssistantChatTransport.ts +104 -3
  41. package/src/ui/use-chat/useAISDKRuntime.test.ts +50 -0
  42. package/src/ui/use-chat/useAISDKRuntime.ts +34 -1
  43. package/src/ui/use-chat/useChatRuntime.ts +38 -0
  44. package/src/ui/utils/convertMessage.test.ts +359 -0
  45. package/src/ui/utils/convertMessage.ts +125 -16
@@ -23,8 +23,18 @@ const useDynamicChatTransport = (transport) => {
23
23
  }), []);
24
24
  return dynamicTransport;
25
25
  };
26
+ const getResumableAdapter = (transport) => {
27
+ if (transport instanceof AssistantChatTransport) {
28
+ return transport.getResumableAdapter();
29
+ }
30
+ const candidate = transport
31
+ .getResumableAdapter;
32
+ if (typeof candidate !== "function")
33
+ return undefined;
34
+ return candidate.call(transport);
35
+ };
26
36
  const useChatThreadRuntime = (options) => {
27
- const { adapters, transport: transportOptions, toCreateMessage, ...chatOptions } = options ?? {};
37
+ const { adapters, transport: transportOptions, toCreateMessage, onResume, suggestions, ...chatOptions } = options ?? {};
28
38
  // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
29
39
  const transport = useDynamicChatTransport(transportOptions ?? new AssistantChatTransport());
30
40
  // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
@@ -41,11 +51,31 @@ const useChatThreadRuntime = (options) => {
41
51
  const runtime = useAISDKRuntime(chat, {
42
52
  adapters,
43
53
  ...(toCreateMessage && { toCreateMessage }),
54
+ ...(onResume && { onResume }),
55
+ ...(suggestions && { suggestions }),
44
56
  });
45
57
  if (transport instanceof AssistantChatTransport) {
46
58
  transport.setRuntime(runtime);
47
59
  transport.__internal_setGetThreadListItem(() => aui.threadListItem.source ? aui.threadListItem() : undefined);
48
60
  }
61
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
62
+ const resumeFiredRef = useRef(false);
63
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
64
+ useEffect(() => {
65
+ if (resumeFiredRef.current)
66
+ return;
67
+ const adapter = getResumableAdapter(transport);
68
+ if (!adapter)
69
+ return;
70
+ const pending = adapter.storage.getStreamId();
71
+ if (!pending)
72
+ return;
73
+ resumeFiredRef.current = true;
74
+ chat.resumeStream().catch((err) => {
75
+ console.warn("[assistant-ui] resumable: resume failed; clearing stored stream id", err);
76
+ adapter.storage.clear();
77
+ });
78
+ }, [transport, chat]);
49
79
  return runtime;
50
80
  };
51
81
  export const useChatRuntime = ({ cloud, ...options } = {}) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useChatRuntime.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChatRuntime.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  import { type UIMessage } from "ai";
2
2
  import { type useExternalMessageConverter } from "@assistant-ui/core/react";
3
+ import { type McpAppMetadata } from "@assistant-ui/core";
4
+ import type { ReadonlyJSONObject } from "assistant-stream/utils";
3
5
  export type AISDKMessageConverterMetadata = useExternalMessageConverter.Metadata & {
4
6
  toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;
7
+ toolLastInputCache?: Map<string, ReadonlyJSONObject>;
8
+ mcpAppMetadataCache?: Map<string, McpAppMetadata>;
5
9
  };
6
10
  export declare const AISDKMessageConverter: {
7
11
  useThreadMessages: ({ messages, isRunning, joinStrategy, metadata, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/D,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAalC,MAAM,MAAM,6BAA6B,GACvC,2BAA2B,CAAC,QAAQ,GAAG;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AA+NJ,eAAO,MAAM,qBAAqB;;;;;;;;wHAzNV,qDAAyB;uHAIzC,qDACQ;;;CA8Qf,CAAC"}
1
+ {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/D,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAUL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE,MAAM,MAAM,6BAA6B,GACvC,2BAA2B,CAAC,QAAQ,GAAG;IACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACrD,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACnD,CAAC;AAsUJ,eAAO,MAAM,qBAAqB;;;;;;;;wHAzUd,qDAAyB;uHAEtC,qDAAyB;;;CAiY/B,CAAC"}
@@ -1,8 +1,66 @@
1
1
  import { isToolUIPart, getToolName } from "ai";
2
2
  import { createMessageConverter as unstable_createMessageConverter, } from "@assistant-ui/core/react";
3
+ import { isMcpAppUri, } from "@assistant-ui/core";
4
+ import { unwrapModelContentEnvelope } from "../../modelContentEnvelope.js";
3
5
  function stripClosingDelimiters(json) {
4
6
  return json.replace(/[}\]"]+$/, "");
5
7
  }
8
+ const MCP_APP_METADATA_CACHE_MAX = 100;
9
+ function extractMcpAppMetadata(part, cache) {
10
+ if (!part || typeof part !== "object")
11
+ return undefined;
12
+ const meta = part
13
+ .callProviderMetadata;
14
+ const mcp = meta && typeof meta === "object"
15
+ ? meta.mcp
16
+ : undefined;
17
+ const app = mcp && typeof mcp === "object" ? mcp.app : undefined;
18
+ let a;
19
+ if (app && typeof app === "object") {
20
+ a = app;
21
+ }
22
+ else {
23
+ // MCP-UI tools (e.g. xmcp) surface the UI pointer as
24
+ // result._meta["ui/resourceUri"] rather than in callProviderMetadata.
25
+ const output = part.output;
26
+ const outMeta = output && typeof output === "object"
27
+ ? output._meta
28
+ : undefined;
29
+ const uiResourceUri = outMeta && typeof outMeta === "object"
30
+ ? outMeta["ui/resourceUri"]
31
+ : undefined;
32
+ if (typeof uiResourceUri !== "string")
33
+ return undefined;
34
+ a = { resourceUri: uiResourceUri };
35
+ }
36
+ if (typeof a["resourceUri"] !== "string")
37
+ return undefined;
38
+ if (!isMcpAppUri(a["resourceUri"]))
39
+ return undefined;
40
+ const cached = cache?.get(a["resourceUri"]);
41
+ if (cached) {
42
+ cache.delete(a["resourceUri"]);
43
+ cache.set(a["resourceUri"], cached);
44
+ return cached;
45
+ }
46
+ const out = {
47
+ resourceUri: a["resourceUri"],
48
+ };
49
+ if (typeof a["mimeType"] === "string")
50
+ out.mimeType = a["mimeType"];
51
+ if (Array.isArray(a["visibility"])) {
52
+ out.visibility = a["visibility"].filter((v) => v === "model" || v === "app");
53
+ }
54
+ if (cache) {
55
+ if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {
56
+ const oldest = cache.keys().next().value;
57
+ if (oldest !== undefined)
58
+ cache.delete(oldest);
59
+ }
60
+ cache.set(a["resourceUri"], out);
61
+ }
62
+ return out;
63
+ }
6
64
  const hasOwn = (value, key) => Object.hasOwn(value, key);
7
65
  const stabilizeToolArgsValue = (value, path, keyOrderByPath) => {
8
66
  if (Array.isArray(value)) {
@@ -86,11 +144,24 @@ function convertParts(message, metadata) {
86
144
  const toolName = getToolName(part);
87
145
  const toolCallId = part.toolCallId;
88
146
  const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;
89
- const args = part.input || {};
147
+ const rawInput = part.input;
148
+ let args;
149
+ if (rawInput != null &&
150
+ typeof rawInput === "object" &&
151
+ !Array.isArray(rawInput)) {
152
+ args = rawInput;
153
+ metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);
154
+ }
155
+ else {
156
+ args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};
157
+ }
90
158
  let result;
159
+ let modelContent;
91
160
  let isError = false;
92
161
  if (part.state === "output-available") {
93
- result = part.output;
162
+ const unwrapped = unwrapModelContentEnvelope(part.output);
163
+ result = unwrapped.result;
164
+ modelContent = unwrapped.modelContent;
94
165
  }
95
166
  else if (part.state === "output-error") {
96
167
  isError = true;
@@ -110,8 +181,14 @@ function convertParts(message, metadata) {
110
181
  }
111
182
  else {
112
183
  metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);
184
+ if (part.state === "output-available" ||
185
+ part.state === "output-error" ||
186
+ part.state === "output-denied") {
187
+ metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);
188
+ }
113
189
  }
114
190
  const toolStatus = metadata.toolStatuses?.[toolCallId];
191
+ const mcpApp = extractMcpAppMetadata(part, metadata.mcpAppMetadataCache);
115
192
  return {
116
193
  type: "tool-call",
117
194
  toolName,
@@ -120,6 +197,8 @@ function convertParts(message, metadata) {
120
197
  args,
121
198
  result,
122
199
  isError,
200
+ ...(modelContent !== undefined && { modelContent }),
201
+ ...(mcpApp && { mcp: { app: mcpApp } }),
123
202
  ...getToolInterrupt(part, toolStatus),
124
203
  };
125
204
  }
@@ -129,7 +208,12 @@ function convertParts(message, metadata) {
129
208
  sourceType: "url",
130
209
  id: part.sourceId,
131
210
  url: part.url,
132
- title: part.title || "",
211
+ ...(part.title != null ? { title: part.title } : undefined),
212
+ ...(part.providerMetadata != null
213
+ ? {
214
+ providerMetadata: part.providerMetadata,
215
+ }
216
+ : undefined),
133
217
  };
134
218
  }
135
219
  if (part.type === "file") {
@@ -141,8 +225,19 @@ function convertParts(message, metadata) {
141
225
  };
142
226
  }
143
227
  if (part.type === "source-document") {
144
- console.warn("Source document parts are not yet supported in conversion");
145
- return null;
228
+ return {
229
+ type: "source",
230
+ sourceType: "document",
231
+ id: part.sourceId,
232
+ title: part.title,
233
+ mediaType: part.mediaType,
234
+ ...(part.filename != null ? { filename: part.filename } : undefined),
235
+ ...(part.providerMetadata != null
236
+ ? {
237
+ providerMetadata: part.providerMetadata,
238
+ }
239
+ : undefined),
240
+ };
146
241
  }
147
242
  if (part.type.startsWith("data-")) {
148
243
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.js","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convertMessage.js","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-ai-sdk",
3
- "version": "1.3.23",
3
+ "version": "1.3.26",
4
4
  "description": "Vercel AI SDK adapter for assistant-ui",
5
5
  "keywords": [
6
6
  "ai-sdk",
@@ -31,7 +31,7 @@
31
31
  "sideEffects": false,
32
32
  "dependencies": {
33
33
  "@ai-sdk/react": "^3.0.177",
34
- "@assistant-ui/core": "^0.2.0",
34
+ "@assistant-ui/core": "^0.2.2",
35
35
  "@assistant-ui/store": "^0.2.10",
36
36
  "ai": "^6.0.175",
37
37
  "assistant-cloud": "*"
@@ -54,11 +54,11 @@
54
54
  "react": "^19.2.5",
55
55
  "vitest": "^4.1.5",
56
56
  "@assistant-ui/x-buildutils": "0.0.7",
57
- "assistant-stream": "0.3.13"
57
+ "assistant-stream": "0.3.14"
58
58
  },
59
59
  "publishConfig": {
60
60
  "access": "public",
61
- "provenance": true
61
+ "provenance": false
62
62
  },
63
63
  "homepage": "https://www.assistant-ui.com/",
64
64
  "repository": {
@@ -0,0 +1,128 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { frontendTools } from "./frontendTools";
3
+ import { wrapModelContentEnvelope } from "./modelContentEnvelope";
4
+
5
+ describe("frontendTools", () => {
6
+ it("forwards description and inputSchema for each tool", () => {
7
+ const tools = frontendTools({
8
+ getWeather: {
9
+ description: "Get the weather",
10
+ parameters: {
11
+ type: "object",
12
+ properties: { city: { type: "string" } },
13
+ },
14
+ },
15
+ });
16
+
17
+ expect(tools.getWeather?.description).toBe("Get the weather");
18
+ expect(tools.getWeather?.inputSchema).toBeDefined();
19
+ });
20
+
21
+ it("registers a toModelOutput that unwraps the modelContent envelope", async () => {
22
+ const tools = frontendTools({
23
+ readPdf: {
24
+ parameters: { type: "object" },
25
+ },
26
+ });
27
+
28
+ const envelope = wrapModelContentEnvelope(
29
+ { mediaType: "application/pdf", base64: "JVBERi0xLjQK" },
30
+ [
31
+ { type: "text", text: "PDF contents:" },
32
+ {
33
+ type: "file",
34
+ data: "JVBERi0xLjQK",
35
+ mediaType: "application/pdf",
36
+ filename: "doc.pdf",
37
+ },
38
+ ],
39
+ );
40
+
41
+ const output = await tools.readPdf!.toModelOutput!({
42
+ toolCallId: "tc-1",
43
+ input: {},
44
+ output: envelope,
45
+ });
46
+
47
+ expect(output).toEqual({
48
+ type: "content",
49
+ value: [
50
+ { type: "text", text: "PDF contents:" },
51
+ {
52
+ type: "file-data",
53
+ mediaType: "application/pdf",
54
+ data: "JVBERi0xLjQK",
55
+ filename: "doc.pdf",
56
+ },
57
+ ],
58
+ });
59
+ });
60
+
61
+ it("emits image-data for image media types", async () => {
62
+ const tools = frontendTools({
63
+ screenshot: {
64
+ parameters: { type: "object" },
65
+ },
66
+ });
67
+
68
+ const envelope = wrapModelContentEnvelope(
69
+ { mediaType: "image/png", base64: "iVBORw0KGgo=" },
70
+ [
71
+ {
72
+ type: "file",
73
+ data: "iVBORw0KGgo=",
74
+ mediaType: "image/png",
75
+ },
76
+ ],
77
+ );
78
+
79
+ const output = await tools.screenshot!.toModelOutput!({
80
+ toolCallId: "tc-1",
81
+ input: {},
82
+ output: envelope,
83
+ });
84
+
85
+ expect(output).toEqual({
86
+ type: "content",
87
+ value: [
88
+ {
89
+ type: "image-data",
90
+ data: "iVBORw0KGgo=",
91
+ mediaType: "image/png",
92
+ },
93
+ ],
94
+ });
95
+ });
96
+
97
+ it("falls back to a JSON output for plain (non-envelope) results", async () => {
98
+ const tools = frontendTools({
99
+ getWeather: {
100
+ parameters: { type: "object" },
101
+ },
102
+ });
103
+
104
+ const output = await tools.getWeather!.toModelOutput!({
105
+ toolCallId: "tc-1",
106
+ input: {},
107
+ output: { temp: 72 },
108
+ });
109
+
110
+ expect(output).toEqual({ type: "json", value: { temp: 72 } });
111
+ });
112
+
113
+ it("falls back to a text output for plain string results", async () => {
114
+ const tools = frontendTools({
115
+ echo: {
116
+ parameters: { type: "object" },
117
+ },
118
+ });
119
+
120
+ const output = await tools.echo!.toModelOutput!({
121
+ toolCallId: "tc-1",
122
+ input: {},
123
+ output: "hello",
124
+ });
125
+
126
+ expect(output).toEqual({ type: "text", value: "hello" });
127
+ });
128
+ });
@@ -1,15 +1,50 @@
1
- import { jsonSchema } from "ai";
1
+ import { jsonSchema, type ToolSet } from "ai";
2
2
  import type { JSONSchema7 } from "json-schema";
3
+ import type { ToolModelContentPart } from "assistant-stream";
4
+ import { unwrapModelContentEnvelope } from "./modelContentEnvelope";
5
+
6
+ const toAISDKContent = (parts: readonly ToolModelContentPart[]) => ({
7
+ type: "content" as const,
8
+ value: parts.map((part) => {
9
+ if (part.type === "text") {
10
+ return { type: "text" as const, text: part.text };
11
+ }
12
+ const isImage = part.mediaType.startsWith("image/");
13
+ return isImage
14
+ ? {
15
+ type: "image-data" as const,
16
+ data: part.data,
17
+ mediaType: part.mediaType,
18
+ }
19
+ : {
20
+ type: "file-data" as const,
21
+ data: part.data,
22
+ mediaType: part.mediaType,
23
+ ...(part.filename !== undefined && { filename: part.filename }),
24
+ };
25
+ }),
26
+ });
27
+
28
+ const defaultToModelOutput = ({ output }: { output: unknown }) => {
29
+ const { modelContent } = unwrapModelContentEnvelope(output);
30
+ if (modelContent !== undefined) {
31
+ return toAISDKContent(modelContent);
32
+ }
33
+ return typeof output === "string"
34
+ ? { type: "text" as const, value: output }
35
+ : { type: "json" as const, value: (output ?? null) as any };
36
+ };
3
37
 
4
38
  export const frontendTools = (
5
39
  tools: Record<string, { description?: string; parameters: JSONSchema7 }>,
6
- ) =>
40
+ ): ToolSet =>
7
41
  Object.fromEntries(
8
- Object.entries(tools).map(([name, tool]) => [
42
+ Object.entries(tools).map(([name, t]) => [
9
43
  name,
10
44
  {
11
- ...(tool.description ? { description: tool.description } : undefined),
12
- inputSchema: jsonSchema(tool.parameters),
45
+ ...(t.description !== undefined && { description: t.description }),
46
+ inputSchema: jsonSchema(t.parameters),
47
+ toModelOutput: defaultToModelOutput,
13
48
  },
14
49
  ]),
15
- );
50
+ ) as ToolSet;
package/src/index.ts CHANGED
@@ -5,6 +5,14 @@ export { useAISDKRuntime } from "./ui/use-chat/useAISDKRuntime";
5
5
  export { useChatRuntime } from "./ui/use-chat/useChatRuntime";
6
6
  export type { UseChatRuntimeOptions } from "./ui/use-chat/useChatRuntime";
7
7
  export { AssistantChatTransport } from "./ui/use-chat/AssistantChatTransport";
8
+ export {
9
+ RESUMABLE_STREAM_ID_HEADER,
10
+ createResumableSessionStorage,
11
+ } from "./ui/resumable";
12
+ export type {
13
+ AssistantChatResumableOptions,
14
+ ResumableClientStorage,
15
+ } from "./ui/resumable";
8
16
  export { frontendTools } from "./frontendTools";
9
17
  export { injectQuoteContext } from "./injectQuoteContext";
10
18
  export type { ThreadTokenUsage, TokenUsageExtractableMessage } from "./usage";
@@ -0,0 +1,39 @@
1
+ import type { ToolModelContentPart } from "assistant-stream";
2
+
3
+ const ENVELOPE_KEY = "__aui_modelContent";
4
+
5
+ export type ModelContentEnvelope<TResult = unknown> = {
6
+ readonly [ENVELOPE_KEY]: readonly ToolModelContentPart[];
7
+ readonly value: TResult;
8
+ };
9
+
10
+ export function isModelContentEnvelope(
11
+ value: unknown,
12
+ ): value is ModelContentEnvelope {
13
+ return (
14
+ value != null &&
15
+ typeof value === "object" &&
16
+ ENVELOPE_KEY in value &&
17
+ Array.isArray((value as Record<string, unknown>)[ENVELOPE_KEY])
18
+ );
19
+ }
20
+
21
+ export function wrapModelContentEnvelope<TResult>(
22
+ result: TResult,
23
+ modelContent: readonly ToolModelContentPart[],
24
+ ): ModelContentEnvelope<TResult> {
25
+ return { [ENVELOPE_KEY]: modelContent, value: result };
26
+ }
27
+
28
+ export function unwrapModelContentEnvelope(output: unknown): {
29
+ result: unknown;
30
+ modelContent?: readonly ToolModelContentPart[];
31
+ } {
32
+ if (isModelContentEnvelope(output)) {
33
+ return {
34
+ result: output.value,
35
+ modelContent: output[ENVELOPE_KEY],
36
+ };
37
+ }
38
+ return { result: output };
39
+ }
@@ -0,0 +1,42 @@
1
+ "use client";
2
+
3
+ export { RESUMABLE_STREAM_ID_HEADER } from "assistant-stream/resumable";
4
+
5
+ const DEFAULT_STORAGE_KEY = "aui-resumable-stream-id";
6
+
7
+ export type ResumableClientStorage = {
8
+ getStreamId(): string | null;
9
+ setStreamId(id: string): void;
10
+ clear(): void;
11
+ };
12
+
13
+ /** `sessionStorage`-backed storage for the pending resumable stream id. */
14
+ export function createResumableSessionStorage(options?: {
15
+ key?: string;
16
+ }): ResumableClientStorage {
17
+ const key = options?.key ?? DEFAULT_STORAGE_KEY;
18
+ return {
19
+ getStreamId() {
20
+ if (typeof window === "undefined") return null;
21
+ return window.sessionStorage.getItem(key);
22
+ },
23
+ setStreamId(id) {
24
+ if (typeof window === "undefined") return;
25
+ window.sessionStorage.setItem(key, id);
26
+ },
27
+ clear() {
28
+ if (typeof window === "undefined") return;
29
+ window.sessionStorage.removeItem(key);
30
+ },
31
+ };
32
+ }
33
+
34
+ export type AssistantChatResumableOptions = {
35
+ storage: ResumableClientStorage;
36
+ resumeApi: string | ((streamId: string) => string);
37
+ /**
38
+ * Defaults to scanning for the AI SDK UIMessageStream `finish` marker.
39
+ * Cancellation never invokes this callback, only natural completion does.
40
+ */
41
+ isFinishEvent?: (chunk: Uint8Array, accumulator: string) => boolean;
42
+ };