@assistant-ui/ai-sdk 0.0.10 → 0.0.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../src/converters/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,IAAI,CAAC;AACZ,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAYL,KAAK,cAAc,EAEnB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AA6BhC,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;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACrD,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACpE,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,qBAAqB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IAC1E,wBAAwB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,yBAAyB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C,CAAC;AAgiBJ,eAAO,MAAM,qBAAqB;;;;;;;;+HAplBX,qDACD;8HAE+B,qDAE7C;;;CA0pBP,CAAC"}
1
+ {"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../src/converters/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,IAAI,CAAC;AACZ,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAcL,KAAK,cAAc,EAEnB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AA6BhC,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;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACrD,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACpE,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,qBAAqB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IAC1E,wBAAwB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,yBAAyB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C,CAAC;AAunBJ,eAAO,MAAM,qBAAqB;;;;;;;;+HA9qBM,qDAAwB;8HAG3D,qDACD;;;CAqvBH,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { normalizeToolApprovalAnswers } from "./toolApprovalAnswers.js";
1
2
  import { unwrapModelContentEnvelope } from "./modelContentEnvelope.js";
2
3
  import { stableStringifyToolArgs } from "@assistant-ui/core/internal";
3
4
  import { getToolName, isCustomContentUIPart, isReasoningFileUIPart, isToolUIPart } from "ai";
@@ -35,11 +36,29 @@ function stripClosingDelimiters(json) {
35
36
  const MCP_APP_METADATA_CACHE_MAX = 100;
36
37
  function extractMcpAppMetadata(part, cache) {
37
38
  if (!part || typeof part !== "object") return void 0;
39
+ const toolMetadata = part.toolMetadata;
40
+ const toolApp = toolMetadata && typeof toolMetadata === "object" ? toolMetadata.app : void 0;
38
41
  const meta = part.callProviderMetadata;
39
42
  const mcp = meta && typeof meta === "object" ? meta.mcp : void 0;
40
- const app = mcp && typeof mcp === "object" ? mcp.app : void 0;
43
+ const providerApp = mcp && typeof mcp === "object" ? mcp.app : void 0;
44
+ const apps = [];
45
+ for (const candidate of [toolApp, providerApp]) {
46
+ if (!candidate || typeof candidate !== "object") continue;
47
+ const candidateApp = candidate;
48
+ const resourceUri = candidateApp["resourceUri"];
49
+ if (typeof resourceUri !== "string" || !isMcpAppUri(resourceUri)) continue;
50
+ apps.push({
51
+ resourceUri,
52
+ ...typeof candidateApp["mimeType"] === "string" && { mimeType: candidateApp["mimeType"] },
53
+ ...Array.isArray(candidateApp["visibility"]) && { visibility: candidateApp["visibility"] },
54
+ ...candidate === providerApp && typeof candidateApp["serverId"] === "string" && candidateApp["serverId"].length > 0 && { serverId: candidateApp["serverId"] }
55
+ });
56
+ }
41
57
  let a;
42
- if (app && typeof app === "object") a = app;
58
+ if (apps.length > 0) a = {
59
+ ...apps[1] ?? {},
60
+ ...apps[0]
61
+ };
43
62
  else {
44
63
  const output = part.output;
45
64
  const outMeta = output && typeof output === "object" ? output._meta : void 0;
@@ -99,6 +118,32 @@ const normalizeToolApprovalOptions = (options) => {
99
118
  }];
100
119
  });
101
120
  };
121
+ const normalizeToolApprovalQuestions = (questions) => {
122
+ if (!Array.isArray(questions)) return void 0;
123
+ return questions.flatMap((value) => {
124
+ if (!value || typeof value !== "object" || Array.isArray(value)) return [];
125
+ const question = value;
126
+ if (typeof question.id !== "string" || typeof question.prompt !== "string") return [];
127
+ const options = Array.isArray(question.options) ? question.options.flatMap((option) => {
128
+ if (!option || typeof option !== "object" || Array.isArray(option)) return [];
129
+ const { id, label, description } = option;
130
+ if (typeof id !== "string" || typeof label !== "string") return [];
131
+ return [{
132
+ id,
133
+ label,
134
+ ...typeof description === "string" && { description }
135
+ }];
136
+ }) : void 0;
137
+ return [{
138
+ id: question.id,
139
+ prompt: question.prompt,
140
+ ...typeof question.header === "string" && { header: question.header },
141
+ ...options && { options },
142
+ ...typeof question.multiple === "boolean" && { multiple: question.multiple },
143
+ ...typeof question.allowFreeform === "boolean" && { allowFreeform: question.allowFreeform }
144
+ }];
145
+ });
146
+ };
102
147
  const APPROVAL_DESCRIPTOR_FIELDS = [
103
148
  "prompt",
104
149
  "display",
@@ -107,6 +152,8 @@ const APPROVAL_DESCRIPTOR_FIELDS = [
107
152
  "options",
108
153
  "optionId",
109
154
  "text",
155
+ "questions",
156
+ "answers",
110
157
  "resolution"
111
158
  ];
112
159
  const readApprovalDescriptor = (descriptor) => {
@@ -126,14 +173,17 @@ function getToolApprovalAndInterrupt(part, toolStatus, supportsRichToolApprovalR
126
173
  resolution: "cancelled"
127
174
  } : rawApproval;
128
175
  const response = typeof approval.id === "string" && approval.approved === void 0 && approval.resolution !== "cancelled" && approval.resolution !== "expired" ? toolApprovalResponses?.get(approval.id) : void 0;
129
- const { id, prompt, approved, reason, isAutomatic, resolution, display, allowFreeform, dismissible, options, optionId, text, ...additionalApprovalFields } = response ? {
176
+ const { id, prompt, approved, reason, isAutomatic, resolution, display, allowFreeform, dismissible, options, optionId, text, questions, answers, ...additionalApprovalFields } = response ? {
130
177
  ...approval,
131
178
  approved: response.approved,
132
179
  ...response.reason != null && { reason: response.reason },
133
180
  ...response.optionId != null && { optionId: response.optionId },
134
- ...response.text != null && { text: response.text }
181
+ ...response.text != null && { text: response.text },
182
+ ...response.answers != null && { answers: response.answers }
135
183
  } : approval;
136
184
  const normalizedOptions = supportsRichToolApprovalResponses ? normalizeToolApprovalOptions(options) : void 0;
185
+ const normalizedQuestions = supportsRichToolApprovalResponses ? normalizeToolApprovalQuestions(questions) : void 0;
186
+ const normalizedAnswers = supportsRichToolApprovalResponses ? normalizeToolApprovalAnswers(answers) : void 0;
137
187
  const requestReason = additionalApprovalFields.requestReason;
138
188
  if (typeof id === "string") return { approval: {
139
189
  ...additionalApprovalFields,
@@ -143,12 +193,14 @@ function getToolApprovalAndInterrupt(part, toolStatus, supportsRichToolApprovalR
143
193
  ...typeof reason === "string" && { reason },
144
194
  ...isAutomatic === true && { isAutomatic: true },
145
195
  ...supportsRichToolApprovalResponses && {
146
- ...(display === "decision" || display === "select" || display === "text") && { display },
196
+ ...(display === "decision" || display === "select" || display === "text" || display === "questions") && { display },
147
197
  ...typeof allowFreeform === "boolean" && { allowFreeform },
148
198
  ...typeof dismissible === "boolean" && { dismissible },
149
199
  ...normalizedOptions && { options: normalizedOptions },
150
200
  ...typeof optionId === "string" && { optionId },
151
- ...typeof text === "string" && { text }
201
+ ...typeof text === "string" && { text },
202
+ ...normalizedQuestions && { questions: normalizedQuestions },
203
+ ...normalizedAnswers && { answers: normalizedAnswers }
152
204
  },
153
205
  ...(resolution === "cancelled" || resolution === "expired") && { resolution }
154
206
  } };
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.js","names":["isToolUIPart","isReasoningFileUIPart","isCustomContentUIPart","getToolName","UIMessage","createMessageConverter","unstable_createMessageConverter","useExternalMessageConverter","isMcpAppUri","ReasoningMessagePart","ToolApprovalOption","ToolCallMessagePart","TextMessagePart","DataMessagePart","PartProviderMetadata","SourceMessagePart","SourceProviderMetadata","FileMessagePart","ThreadMessageLike","McpAppMetadata","MessagePartStreamStatus","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","stableStringifyToolArgs","parsePartialJsonObject","ReadonlyJSONObject","unwrapModelContentEnvelope","MessageMetadata","THREAD_METADATA_KEYS","Set","toThreadMetadata","metadata","undefined","result","Record","extra","Object","create","key","value","entries","has","keys","length","custom","AISDKMessageConverterMetadata","Metadata","toolArgsKeyOrderCache","Map","toolArgsTextCache","WeakMap","toolLastInputCache","mcpAppMetadataCache","toolArtifacts","ReadonlyMap","toolInteractions","supportsRichToolApprovalResponses","toolApprovalResponses","cancelledToolApprovalIds","ReadonlySet","cancelledStatusMessageIds","optimisticMessageId","stripClosingDelimiters","json","end","includes","slice","MCP_APP_METADATA_CACHE_MAX","extractMcpAppMetadata","part","cache","meta","callProviderMetadata","mcp","app","a","output","outMeta","_meta","ui","uiMeta","resourceUri","Array","isArray","visibility","flat","cacheKey","cached","get","delete","set","out","K","mimeType","filter","v","serverId","size","oldest","next","normalizeToolApprovalOptions","options","flatMap","option","id","kind","confirm","confirmDetails","label","description","grants","grant","title","APPROVAL_DESCRIPTOR_FIELDS","const","readApprovalDescriptor","descriptor","fields","hasOwn","getToolApprovalAndInterrupt","approval","toolStatus","type","payload","NonNullable","interrupt","rawApproval","approved","resolution","response","prompt","reason","isAutomatic","display","allowFreeform","dismissible","optionId","text","additionalApprovalFields","normalizedOptions","requestReason","MessageContent","Exclude","uiPartStateToStatus","state","convertParts","message","parts","converted","p","role","map","status","providerMetadata","toolName","toolCallId","argsKeyOrderCacheKey","rawInput","input","args","modelContent","isError","unwrapped","error","errorText","argsText","frozen","frozenText","toolStatuses","mcpApp","artifact","interactions","unstable_interactions","preliminary","isPreliminary","sourceType","sourceId","url","data","mediaType","filename","startsWith","name","substring","console","warn","Boolean","seenToolCallIds","add","AISDKMessageConverter","createdAt","Date","content","attachments","idx","isImage","toString","image","contentType","timing","messageTiming","isOptimistic","unstable_createMessageConverter"],"sources":["../../src/converters/convertMessage.ts"],"sourcesContent":["import {\n isToolUIPart,\n isReasoningFileUIPart,\n isCustomContentUIPart,\n getToolName,\n type UIMessage,\n} from \"ai\";\nimport {\n createMessageConverter as unstable_createMessageConverter,\n type useExternalMessageConverter,\n} from \"@assistant-ui/core/react\";\nimport {\n isMcpAppUri,\n type ReasoningMessagePart,\n type ToolApprovalOption,\n type ToolCallMessagePart,\n type TextMessagePart,\n type DataMessagePart,\n type PartProviderMetadata,\n type SourceMessagePart,\n type SourceProviderMetadata,\n type FileMessagePart,\n type ThreadMessageLike,\n type McpAppMetadata,\n type MessagePartStreamStatus,\n type RespondToToolApprovalOptions,\n type Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport { stableStringifyToolArgs } from \"@assistant-ui/core/internal\";\nimport {\n parsePartialJsonObject,\n type ReadonlyJSONObject,\n} from \"assistant-stream/utils\";\nimport { unwrapModelContentEnvelope } from \"./modelContentEnvelope\";\n\ntype MessageMetadata = ThreadMessageLike[\"metadata\"];\n\nconst THREAD_METADATA_KEYS = new Set([\n \"unstable_state\",\n \"unstable_annotations\",\n \"unstable_data\",\n \"steps\",\n \"timing\",\n \"submittedFeedback\",\n \"isOptimistic\",\n \"modality\",\n \"custom\",\n]);\n\nconst toThreadMetadata = (metadata: unknown): MessageMetadata => {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const result: Record<string, unknown> = {};\n const extra = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of Object.entries(metadata)) {\n (THREAD_METADATA_KEYS.has(key) ? result : extra)[key] = value;\n }\n if (Object.keys(extra).length > 0) {\n result.custom = { ...extra, ...(result.custom as object | undefined) };\n }\n return result as MessageMetadata;\n};\nexport type AISDKMessageConverterMetadata =\n useExternalMessageConverter.Metadata & {\n toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;\n /**\n * Frozen `argsText` keyed weakly by a settled tool call's input object, then\n * by call, since the text carries the call's streamed key order. A known\n * call/input pair skips serialization; the entries become collectible once\n * the input is unreachable. A fresh input object re-serializes in its own\n * deterministic key order.\n */\n toolArgsTextCache?: WeakMap<ReadonlyJSONObject, Map<string, string>>;\n toolLastInputCache?: Map<string, ReadonlyJSONObject>;\n mcpAppMetadataCache?: Map<string, McpAppMetadata>;\n toolArtifacts?: ReadonlyMap<string, unknown>;\n toolInteractions?: ReadonlyMap<string, Unstable_ToolInteractionLog>;\n supportsRichToolApprovalResponses?: boolean;\n toolApprovalResponses?: ReadonlyMap<string, RespondToToolApprovalOptions>;\n cancelledToolApprovalIds?: ReadonlySet<string>;\n cancelledStatusMessageIds?: ReadonlySet<string>;\n /** Id of the currently-streaming message, flagged optimistic (#4037). */\n optimisticMessageId?: string | undefined;\n };\n\nfunction stripClosingDelimiters(json: string): string {\n let end = json.length;\n while (end > 0 && '}]\"'.includes(json[end - 1]!)) end--;\n return json.slice(0, end);\n}\n\nconst MCP_APP_METADATA_CACHE_MAX = 100;\n\nfunction extractMcpAppMetadata(\n part: unknown,\n cache: Map<string, McpAppMetadata> | undefined,\n): McpAppMetadata | undefined {\n if (!part || typeof part !== \"object\") return undefined;\n const meta = (part as { callProviderMetadata?: unknown })\n .callProviderMetadata;\n const mcp =\n meta && typeof meta === \"object\"\n ? (meta as { mcp?: unknown }).mcp\n : undefined;\n const app =\n mcp && typeof mcp === \"object\" ? (mcp as { app?: unknown }).app : undefined;\n let a: Record<string, unknown>;\n if (app && typeof app === \"object\") {\n a = app as Record<string, unknown>;\n } else {\n // MCP-UI tools surface the pointer on result._meta: canonical nested\n // `ui.resourceUri`, or the deprecated flat `\"ui/resourceUri\"` key.\n const output = (part as { output?: unknown }).output;\n const outMeta =\n output && typeof output === \"object\"\n ? (output as { _meta?: unknown })._meta\n : undefined;\n const ui =\n outMeta && typeof outMeta === \"object\"\n ? (outMeta as Record<string, unknown>)[\"ui\"]\n : undefined;\n if (\n ui &&\n typeof ui === \"object\" &&\n typeof (ui as Record<string, unknown>)[\"resourceUri\"] === \"string\" &&\n isMcpAppUri((ui as Record<string, unknown>)[\"resourceUri\"] as string)\n ) {\n // Only the spec'd ui fields cross from the result body; serverId is a\n // routing key and stays transport-derived via callProviderMetadata.\n const uiMeta = ui as Record<string, unknown>;\n a = {\n resourceUri: uiMeta[\"resourceUri\"],\n ...(Array.isArray(uiMeta[\"visibility\"])\n ? { visibility: uiMeta[\"visibility\"] }\n : {}),\n };\n } else {\n const flat =\n outMeta && typeof outMeta === \"object\"\n ? (outMeta as Record<string, unknown>)[\"ui/resourceUri\"]\n : undefined;\n if (typeof flat !== \"string\" || !isMcpAppUri(flat)) return undefined;\n a = { resourceUri: flat };\n }\n }\n if (typeof a[\"resourceUri\"] !== \"string\") return undefined;\n if (!isMcpAppUri(a[\"resourceUri\"])) return undefined;\n const cacheKey = `${typeof a[\"serverId\"] === \"string\" ? a[\"serverId\"] : \"\"} ${a[\"resourceUri\"]}`;\n const cached = cache?.get(cacheKey);\n if (cached) {\n cache!.delete(cacheKey);\n cache!.set(cacheKey, cached);\n return cached;\n }\n const out: { -readonly [K in keyof McpAppMetadata]: McpAppMetadata[K] } = {\n resourceUri: a[\"resourceUri\"],\n };\n if (typeof a[\"mimeType\"] === \"string\") out.mimeType = a[\"mimeType\"];\n if (Array.isArray(a[\"visibility\"])) {\n out.visibility = a[\"visibility\"].filter(\n (v): v is \"model\" | \"app\" => v === \"model\" || v === \"app\",\n );\n }\n if (typeof a[\"serverId\"] === \"string\" && a[\"serverId\"].length > 0)\n out.serverId = a[\"serverId\"];\n if (cache) {\n if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n cache.set(cacheKey, out);\n }\n return out;\n}\n\nconst normalizeToolApprovalOptions = (\n options: unknown,\n): readonly ToolApprovalOption[] | undefined => {\n if (!Array.isArray(options)) return undefined;\n\n return options.flatMap<ToolApprovalOption>((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n const option = value as Record<string, unknown>;\n if (typeof option.id !== \"string\" || typeof option.kind !== \"string\")\n return [];\n\n const confirm = option.confirm;\n const confirmDetails =\n confirm && typeof confirm === \"object\" && !Array.isArray(confirm)\n ? (confirm as Record<string, unknown>)\n : undefined;\n\n return [\n {\n id: option.id,\n kind: option.kind,\n ...(typeof option.label === \"string\" && { label: option.label }),\n ...(typeof option.description === \"string\" && {\n description: option.description,\n }),\n ...(Array.isArray(option.grants) && {\n grants: option.grants.filter(\n (grant): grant is string => typeof grant === \"string\",\n ),\n }),\n ...(typeof confirm === \"boolean\"\n ? { confirm }\n : confirmDetails\n ? {\n confirm: {\n ...(typeof confirmDetails.title === \"string\" && {\n title: confirmDetails.title,\n }),\n ...(typeof confirmDetails.description === \"string\" && {\n description: confirmDetails.description,\n }),\n },\n }\n : {}),\n },\n ];\n });\n};\n\nconst APPROVAL_DESCRIPTOR_FIELDS = [\n \"prompt\",\n \"display\",\n \"allowFreeform\",\n \"dismissible\",\n \"options\",\n \"optionId\",\n \"text\",\n \"resolution\",\n] as const;\n\n// The AI SDK's approval object declares none of the core request and answer\n// fields and `validateUIMessages` strips unknown ones, so a host streams or\n// persists them inside the opaque `approvalDescriptor`. Only those fields are\n// read from it: a descriptor cannot approve its own request.\nconst readApprovalDescriptor = (\n descriptor: unknown,\n): Record<string, unknown> => {\n if (\n !descriptor ||\n typeof descriptor !== \"object\" ||\n Array.isArray(descriptor)\n )\n return {};\n const fields: Record<string, unknown> = {};\n for (const key of APPROVAL_DESCRIPTOR_FIELDS) {\n if (Object.hasOwn(descriptor, key))\n fields[key] = (descriptor as Record<string, unknown>)[key];\n }\n return fields;\n};\n\nfunction getToolApprovalAndInterrupt(\n part: {\n approval?: Record<string, unknown> | undefined;\n },\n toolStatus: { type: string; payload?: unknown } | undefined,\n supportsRichToolApprovalResponses: boolean,\n toolApprovalResponses:\n | ReadonlyMap<string, RespondToToolApprovalOptions>\n | undefined,\n cancelledToolApprovalIds: ReadonlySet<string> | undefined,\n): {\n approval?: NonNullable<ToolCallMessagePart[\"approval\"]>;\n interrupt?: NonNullable<ToolCallMessagePart[\"interrupt\"]>;\n} {\n if (part.approval) {\n const rawApproval = {\n ...readApprovalDescriptor(part.approval.descriptor),\n ...part.approval,\n };\n const approval =\n typeof rawApproval.id === \"string\" &&\n rawApproval.approved === undefined &&\n rawApproval.resolution === undefined &&\n cancelledToolApprovalIds?.has(rawApproval.id)\n ? { ...rawApproval, resolution: \"cancelled\" as const }\n : rawApproval;\n const response =\n typeof approval.id === \"string\" &&\n approval.approved === undefined &&\n approval.resolution !== \"cancelled\" &&\n approval.resolution !== \"expired\"\n ? toolApprovalResponses?.get(approval.id)\n : undefined;\n // The built-in AI SDK channel sends only id, approved and reason back to\n // the server, so a request shape promising any other answer would render\n // controls whose response cannot travel.\n const {\n id,\n prompt,\n approved,\n reason,\n isAutomatic,\n resolution,\n display,\n allowFreeform,\n dismissible,\n options,\n optionId,\n text,\n ...additionalApprovalFields\n } = response\n ? {\n ...approval,\n approved: response.approved,\n ...(response.reason != null && { reason: response.reason }),\n ...(response.optionId != null && { optionId: response.optionId }),\n ...(response.text != null && { text: response.text }),\n }\n : approval;\n const normalizedOptions = supportsRichToolApprovalResponses\n ? normalizeToolApprovalOptions(options)\n : undefined;\n const requestReason = additionalApprovalFields.requestReason;\n if (typeof id === \"string\")\n return {\n approval: {\n ...additionalApprovalFields,\n id,\n ...(typeof prompt === \"string\"\n ? { prompt }\n : typeof requestReason === \"string\"\n ? { prompt: requestReason }\n : {}),\n ...(typeof approved === \"boolean\" && { approved }),\n ...(typeof reason === \"string\" && { reason }),\n ...(isAutomatic === true && { isAutomatic: true }),\n ...(supportsRichToolApprovalResponses && {\n ...((display === \"decision\" ||\n display === \"select\" ||\n display === \"text\") && { display }),\n ...(typeof allowFreeform === \"boolean\" && { allowFreeform }),\n ...(typeof dismissible === \"boolean\" && { dismissible }),\n ...(normalizedOptions && { options: normalizedOptions }),\n ...(typeof optionId === \"string\" && { optionId }),\n ...(typeof text === \"string\" && { text }),\n }),\n ...((resolution === \"cancelled\" || resolution === \"expired\") && {\n resolution,\n }),\n } as NonNullable<ToolCallMessagePart[\"approval\"]>,\n };\n }\n\n if (toolStatus?.type === \"interrupt\") {\n return {\n interrupt: toolStatus.payload as NonNullable<\n ToolCallMessagePart[\"interrupt\"]\n >,\n };\n }\n\n return {};\n}\n\ntype MessageContent = Exclude<ThreadMessageLike[\"content\"], string>;\n\nconst uiPartStateToStatus = (\n state: \"streaming\" | \"done\" | undefined,\n): MessagePartStreamStatus | undefined => {\n if (state === \"streaming\") return { type: \"running\" };\n if (state === \"done\") return { type: \"complete\" };\n return undefined;\n};\n\nfunction convertParts(\n message: UIMessage,\n metadata: AISDKMessageConverterMetadata,\n): MessageContent {\n if (!message.parts || message.parts.length === 0) {\n return [];\n }\n\n const converted = message.parts\n .filter(\n (p) =>\n p.type !== \"step-start\" &&\n (message.role !== \"user\" || p.type !== \"file\"),\n )\n .map((part) => {\n if (part.type === \"text\") {\n const status = uiPartStateToStatus(part.state);\n return {\n type: \"text\",\n text: part.text,\n ...(status != null ? { status } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata: part.providerMetadata as PartProviderMetadata,\n }\n : undefined),\n } satisfies TextMessagePart;\n }\n\n if (part.type === \"reasoning\") {\n const status = uiPartStateToStatus(part.state);\n return {\n type: \"reasoning\",\n text: part.text,\n ...(status != null ? { status } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata: part.providerMetadata as PartProviderMetadata,\n }\n : undefined),\n } satisfies ReasoningMessagePart;\n }\n\n if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n const toolCallId = part.toolCallId;\n const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;\n\n // A tool call that streamed complete arguments then failed schema\n // validation keeps them in `rawInput`, not `input`; reading `input`\n // alone would convert the error snapshot to `{}` and hide the input.\n const rawInput = (part.input ??\n (\"rawInput\" in part ? part.rawInput : undefined)) as\n | ReadonlyJSONObject\n | null\n | undefined;\n let args: ReadonlyJSONObject;\n if (\n rawInput != null &&\n typeof rawInput === \"object\" &&\n !Array.isArray(rawInput)\n ) {\n args = rawInput;\n metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);\n } else {\n args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};\n }\n\n let result: unknown;\n let modelContent: ToolCallMessagePart[\"modelContent\"];\n let isError = false;\n\n if (part.state === \"output-available\") {\n const unwrapped = unwrapModelContentEnvelope(part.output);\n result = unwrapped.result;\n modelContent = unwrapped.modelContent;\n } else if (part.state === \"output-error\") {\n isError = true;\n result = { error: part.errorText };\n } else if (part.state === \"output-denied\") {\n isError = true;\n result = {\n error:\n (part as { approval?: { reason?: string } }).approval?.reason ||\n \"Tool approval denied\",\n };\n }\n\n let argsText: string;\n if (part.state === \"input-streaming\") {\n argsText = stableStringifyToolArgs(\n metadata.toolArgsKeyOrderCache,\n argsKeyOrderCacheKey,\n args,\n );\n // strip closing delimiters added by the AI SDK's fix-json\n argsText = stripClosingDelimiters(argsText);\n // Re-parse so args carries the partial-JSON meta that marks which\n // field is still mid-arrival, like every argsText-based runtime.\n // The key-order cache appends new keys last, so the trailing field\n // of the stripped text is the streaming frontier.\n args = parsePartialJsonObject(argsText) ?? args;\n } else {\n // A settled part is re-converted whenever its message or the converter\n // metadata changes; the text frozen on its input object skips\n // re-serializing large args while the call keeps that input. Arrival\n // order only matters while args stream, so the key-order entry is\n // released.\n const frozen =\n metadata.toolArgsTextCache?.get(args) ?? new Map<string, string>();\n const frozenText = frozen.get(argsKeyOrderCacheKey);\n if (frozenText !== undefined) {\n argsText = frozenText;\n } else {\n argsText = stableStringifyToolArgs(\n metadata.toolArgsKeyOrderCache,\n argsKeyOrderCacheKey,\n args,\n );\n metadata.toolArgsTextCache?.set(\n args,\n frozen.set(argsKeyOrderCacheKey, argsText),\n );\n }\n metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n ) {\n metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);\n }\n }\n\n const toolStatus = metadata.toolStatuses?.[toolCallId];\n const mcpApp = extractMcpAppMetadata(\n part,\n metadata.mcpAppMetadataCache,\n );\n const artifact = metadata.toolArtifacts?.get(toolCallId);\n const interactions = metadata.toolInteractions?.get(toolCallId);\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText,\n args,\n result,\n isError,\n ...(artifact !== undefined && { artifact }),\n ...(interactions !== undefined && {\n unstable_interactions: interactions,\n }),\n ...(part.state === \"output-available\" &&\n part.preliminary === true && { isPreliminary: true }),\n ...(modelContent !== undefined && { modelContent }),\n ...(mcpApp && { mcp: { app: mcpApp } }),\n ...(part.callProviderMetadata != null\n ? {\n providerMetadata:\n part.callProviderMetadata as PartProviderMetadata,\n }\n : undefined),\n ...getToolApprovalAndInterrupt(\n part,\n toolStatus,\n metadata.supportsRichToolApprovalResponses === true,\n metadata.toolApprovalResponses,\n metadata.cancelledToolApprovalIds,\n ),\n } satisfies ToolCallMessagePart;\n }\n\n if (part.type === \"source-url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.sourceId,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type === \"file\") {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n ...(part.filename != null && { filename: part.filename }),\n } satisfies FileMessagePart;\n }\n\n if (part.type === \"source-document\") {\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.sourceId,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type.startsWith(\"data-\")) {\n return {\n type: \"data\",\n ...(\"id\" in part && typeof part.id === \"string\"\n ? { id: part.id }\n : undefined),\n name: part.type.substring(5),\n data: (part as any).data,\n } satisfies DataMessagePart;\n }\n\n if (isReasoningFileUIPart(part)) {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n } satisfies FileMessagePart;\n }\n\n if (isCustomContentUIPart(part)) {\n return {\n type: \"data\",\n name: part.kind,\n data: part.providerMetadata ?? null,\n } satisfies DataMessagePart;\n }\n\n console.warn(`Unsupported message part type: ${part.type}`);\n return null;\n })\n .filter(Boolean) as MessageContent[number][];\n\n const seenToolCallIds = new Set<string>();\n return converted.filter((part) => {\n if (part.type === \"tool-call\" && part.toolCallId != null) {\n if (seenToolCallIds.has(part.toolCallId)) return false;\n seenToolCallIds.add(part.toolCallId);\n }\n return true;\n });\n}\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: UIMessage, metadata: AISDKMessageConverterMetadata) => {\n const createdAt = new Date();\n const content = convertParts(message, metadata);\n\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt,\n content,\n attachments: message.parts\n ?.filter((p) => p.type === \"file\")\n .map((part, idx) => {\n const mediaType = part.mediaType ?? \"unknown/unknown\";\n const isImage = mediaType.startsWith(\"image/\");\n return {\n id: idx.toString(),\n type: isImage ? \"image\" : \"file\",\n name: part.filename ?? \"file\",\n content: [\n isImage\n ? {\n type: \"image\",\n image: part.url,\n filename: part.filename!,\n }\n : {\n type: \"file\",\n filename: part.filename!,\n data: part.url,\n mimeType: mediaType,\n },\n ],\n contentType: mediaType,\n status: { type: \"complete\" as const },\n };\n }),\n metadata: toThreadMetadata(message.metadata),\n };\n\n case \"system\":\n case \"assistant\": {\n const timing = metadata.messageTiming?.[message.id];\n const isOptimistic =\n message.role === \"assistant\" &&\n message.id === metadata.optimisticMessageId;\n return {\n role: message.role,\n id: message.id,\n createdAt,\n content,\n ...(message.role === \"assistant\" &&\n metadata.cancelledStatusMessageIds?.has(message.id)\n ? {\n status: {\n type: \"incomplete\" as const,\n reason: \"cancelled\" as const,\n },\n }\n : undefined),\n metadata: {\n ...toThreadMetadata(message.metadata),\n ...(timing && { timing }),\n ...(isOptimistic && { isOptimistic: true }),\n },\n };\n }\n\n default:\n console.warn(`Unsupported message role: ${message.role}`);\n return [];\n }\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"convertMessage.js","names":["isToolUIPart","isReasoningFileUIPart","isCustomContentUIPart","getToolName","UIMessage","createMessageConverter","unstable_createMessageConverter","useExternalMessageConverter","isMcpAppUri","ReasoningMessagePart","ToolApprovalOption","ToolApprovalQuestion","ToolApprovalQuestionOption","ToolCallMessagePart","TextMessagePart","DataMessagePart","PartProviderMetadata","SourceMessagePart","SourceProviderMetadata","FileMessagePart","ThreadMessageLike","McpAppMetadata","MessagePartStreamStatus","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","normalizeToolApprovalAnswers","stableStringifyToolArgs","parsePartialJsonObject","ReadonlyJSONObject","unwrapModelContentEnvelope","MessageMetadata","THREAD_METADATA_KEYS","Set","toThreadMetadata","metadata","undefined","result","Record","extra","Object","create","key","value","entries","has","keys","length","custom","AISDKMessageConverterMetadata","Metadata","toolArgsKeyOrderCache","Map","toolArgsTextCache","WeakMap","toolLastInputCache","mcpAppMetadataCache","toolArtifacts","ReadonlyMap","toolInteractions","supportsRichToolApprovalResponses","toolApprovalResponses","cancelledToolApprovalIds","ReadonlySet","cancelledStatusMessageIds","optimisticMessageId","stripClosingDelimiters","json","end","includes","slice","MCP_APP_METADATA_CACHE_MAX","extractMcpAppMetadata","part","cache","toolMetadata","toolApp","app","meta","callProviderMetadata","mcp","providerApp","apps","candidate","candidateApp","resourceUri","push","mimeType","Array","isArray","visibility","serverId","a","output","outMeta","_meta","ui","uiMeta","flat","cacheKey","cached","get","delete","set","out","K","filter","v","size","oldest","next","normalizeToolApprovalOptions","options","flatMap","option","id","kind","confirm","confirmDetails","label","description","grants","grant","title","normalizeToolApprovalQuestions","questions","question","prompt","header","multiple","allowFreeform","APPROVAL_DESCRIPTOR_FIELDS","const","readApprovalDescriptor","descriptor","fields","hasOwn","getToolApprovalAndInterrupt","approval","toolStatus","type","payload","NonNullable","interrupt","rawApproval","approved","resolution","response","reason","isAutomatic","display","dismissible","optionId","text","answers","additionalApprovalFields","normalizedOptions","normalizedQuestions","normalizedAnswers","requestReason","MessageContent","Exclude","uiPartStateToStatus","state","convertParts","message","parts","converted","p","role","map","status","providerMetadata","toolName","toolCallId","argsKeyOrderCacheKey","rawInput","input","args","modelContent","isError","unwrapped","error","errorText","argsText","frozen","frozenText","toolStatuses","mcpApp","artifact","interactions","unstable_interactions","preliminary","isPreliminary","sourceType","sourceId","url","data","mediaType","filename","startsWith","name","substring","console","warn","Boolean","seenToolCallIds","add","AISDKMessageConverter","createdAt","Date","content","attachments","idx","isImage","toString","image","contentType","timing","messageTiming","isOptimistic","unstable_createMessageConverter"],"sources":["../../src/converters/convertMessage.ts"],"sourcesContent":["import {\n isToolUIPart,\n isReasoningFileUIPart,\n isCustomContentUIPart,\n getToolName,\n type UIMessage,\n} from \"ai\";\nimport {\n createMessageConverter as unstable_createMessageConverter,\n type useExternalMessageConverter,\n} from \"@assistant-ui/core/react\";\nimport {\n isMcpAppUri,\n type ReasoningMessagePart,\n type ToolApprovalOption,\n type ToolApprovalQuestion,\n type ToolApprovalQuestionOption,\n type ToolCallMessagePart,\n type TextMessagePart,\n type DataMessagePart,\n type PartProviderMetadata,\n type SourceMessagePart,\n type SourceProviderMetadata,\n type FileMessagePart,\n type ThreadMessageLike,\n type McpAppMetadata,\n type MessagePartStreamStatus,\n type RespondToToolApprovalOptions,\n type Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport { normalizeToolApprovalAnswers } from \"./toolApprovalAnswers\";\nimport { stableStringifyToolArgs } from \"@assistant-ui/core/internal\";\nimport {\n parsePartialJsonObject,\n type ReadonlyJSONObject,\n} from \"assistant-stream/utils\";\nimport { unwrapModelContentEnvelope } from \"./modelContentEnvelope\";\n\ntype MessageMetadata = ThreadMessageLike[\"metadata\"];\n\nconst THREAD_METADATA_KEYS = new Set([\n \"unstable_state\",\n \"unstable_annotations\",\n \"unstable_data\",\n \"steps\",\n \"timing\",\n \"submittedFeedback\",\n \"isOptimistic\",\n \"modality\",\n \"custom\",\n]);\n\nconst toThreadMetadata = (metadata: unknown): MessageMetadata => {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const result: Record<string, unknown> = {};\n const extra = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of Object.entries(metadata)) {\n (THREAD_METADATA_KEYS.has(key) ? result : extra)[key] = value;\n }\n if (Object.keys(extra).length > 0) {\n result.custom = { ...extra, ...(result.custom as object | undefined) };\n }\n return result as MessageMetadata;\n};\nexport type AISDKMessageConverterMetadata =\n useExternalMessageConverter.Metadata & {\n toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;\n /**\n * Frozen `argsText` keyed weakly by a settled tool call's input object, then\n * by call, since the text carries the call's streamed key order. A known\n * call/input pair skips serialization; the entries become collectible once\n * the input is unreachable. A fresh input object re-serializes in its own\n * deterministic key order.\n */\n toolArgsTextCache?: WeakMap<ReadonlyJSONObject, Map<string, string>>;\n toolLastInputCache?: Map<string, ReadonlyJSONObject>;\n mcpAppMetadataCache?: Map<string, McpAppMetadata>;\n toolArtifacts?: ReadonlyMap<string, unknown>;\n toolInteractions?: ReadonlyMap<string, Unstable_ToolInteractionLog>;\n supportsRichToolApprovalResponses?: boolean;\n toolApprovalResponses?: ReadonlyMap<string, RespondToToolApprovalOptions>;\n cancelledToolApprovalIds?: ReadonlySet<string>;\n cancelledStatusMessageIds?: ReadonlySet<string>;\n /** Id of the currently-streaming message, flagged optimistic (#4037). */\n optimisticMessageId?: string | undefined;\n };\n\nfunction stripClosingDelimiters(json: string): string {\n let end = json.length;\n while (end > 0 && '}]\"'.includes(json[end - 1]!)) end--;\n return json.slice(0, end);\n}\n\nconst MCP_APP_METADATA_CACHE_MAX = 100;\n\nfunction extractMcpAppMetadata(\n part: unknown,\n cache: Map<string, McpAppMetadata> | undefined,\n): McpAppMetadata | undefined {\n if (!part || typeof part !== \"object\") return undefined;\n const toolMetadata = (part as { toolMetadata?: unknown }).toolMetadata;\n const toolApp =\n toolMetadata && typeof toolMetadata === \"object\"\n ? (toolMetadata as { app?: unknown }).app\n : undefined;\n const meta = (part as { callProviderMetadata?: unknown })\n .callProviderMetadata;\n const mcp =\n meta && typeof meta === \"object\"\n ? (meta as { mcp?: unknown }).mcp\n : undefined;\n const providerApp =\n mcp && typeof mcp === \"object\" ? (mcp as { app?: unknown }).app : undefined;\n\n const apps: Record<string, unknown>[] = [];\n for (const candidate of [toolApp, providerApp]) {\n if (!candidate || typeof candidate !== \"object\") continue;\n const candidateApp = candidate as Record<string, unknown>;\n const resourceUri = candidateApp[\"resourceUri\"];\n if (typeof resourceUri !== \"string\" || !isMcpAppUri(resourceUri)) continue;\n apps.push({\n resourceUri,\n ...(typeof candidateApp[\"mimeType\"] === \"string\" && {\n mimeType: candidateApp[\"mimeType\"],\n }),\n ...(Array.isArray(candidateApp[\"visibility\"]) && {\n visibility: candidateApp[\"visibility\"],\n }),\n ...(candidate === providerApp &&\n typeof candidateApp[\"serverId\"] === \"string\" &&\n candidateApp[\"serverId\"].length > 0 && {\n serverId: candidateApp[\"serverId\"],\n }),\n });\n }\n\n let a: Record<string, unknown>;\n if (apps.length > 0) {\n a = { ...(apps[1] ?? {}), ...apps[0]! };\n } else {\n // MCP-UI tools surface the pointer on result._meta: canonical nested\n // `ui.resourceUri`, or the deprecated flat `\"ui/resourceUri\"` key.\n const output = (part as { output?: unknown }).output;\n const outMeta =\n output && typeof output === \"object\"\n ? (output as { _meta?: unknown })._meta\n : undefined;\n const ui =\n outMeta && typeof outMeta === \"object\"\n ? (outMeta as Record<string, unknown>)[\"ui\"]\n : undefined;\n if (\n ui &&\n typeof ui === \"object\" &&\n typeof (ui as Record<string, unknown>)[\"resourceUri\"] === \"string\" &&\n isMcpAppUri((ui as Record<string, unknown>)[\"resourceUri\"] as string)\n ) {\n // Only the spec'd ui fields cross from the result body; serverId is a\n // routing key and stays transport-derived via callProviderMetadata.\n const uiMeta = ui as Record<string, unknown>;\n a = {\n resourceUri: uiMeta[\"resourceUri\"],\n ...(Array.isArray(uiMeta[\"visibility\"])\n ? { visibility: uiMeta[\"visibility\"] }\n : {}),\n };\n } else {\n const flat =\n outMeta && typeof outMeta === \"object\"\n ? (outMeta as Record<string, unknown>)[\"ui/resourceUri\"]\n : undefined;\n if (typeof flat !== \"string\" || !isMcpAppUri(flat)) return undefined;\n a = { resourceUri: flat };\n }\n }\n if (typeof a[\"resourceUri\"] !== \"string\") return undefined;\n if (!isMcpAppUri(a[\"resourceUri\"])) return undefined;\n const cacheKey = `${typeof a[\"serverId\"] === \"string\" ? a[\"serverId\"] : \"\"} ${a[\"resourceUri\"]}`;\n const cached = cache?.get(cacheKey);\n if (cached) {\n cache!.delete(cacheKey);\n cache!.set(cacheKey, cached);\n return cached;\n }\n const out: { -readonly [K in keyof McpAppMetadata]: McpAppMetadata[K] } = {\n resourceUri: a[\"resourceUri\"],\n };\n if (typeof a[\"mimeType\"] === \"string\") out.mimeType = a[\"mimeType\"];\n if (Array.isArray(a[\"visibility\"])) {\n out.visibility = a[\"visibility\"].filter(\n (v): v is \"model\" | \"app\" => v === \"model\" || v === \"app\",\n );\n }\n if (typeof a[\"serverId\"] === \"string\" && a[\"serverId\"].length > 0)\n out.serverId = a[\"serverId\"];\n if (cache) {\n if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n cache.set(cacheKey, out);\n }\n return out;\n}\n\nconst normalizeToolApprovalOptions = (\n options: unknown,\n): readonly ToolApprovalOption[] | undefined => {\n if (!Array.isArray(options)) return undefined;\n\n return options.flatMap<ToolApprovalOption>((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n const option = value as Record<string, unknown>;\n if (typeof option.id !== \"string\" || typeof option.kind !== \"string\")\n return [];\n\n const confirm = option.confirm;\n const confirmDetails =\n confirm && typeof confirm === \"object\" && !Array.isArray(confirm)\n ? (confirm as Record<string, unknown>)\n : undefined;\n\n return [\n {\n id: option.id,\n kind: option.kind,\n ...(typeof option.label === \"string\" && { label: option.label }),\n ...(typeof option.description === \"string\" && {\n description: option.description,\n }),\n ...(Array.isArray(option.grants) && {\n grants: option.grants.filter(\n (grant): grant is string => typeof grant === \"string\",\n ),\n }),\n ...(typeof confirm === \"boolean\"\n ? { confirm }\n : confirmDetails\n ? {\n confirm: {\n ...(typeof confirmDetails.title === \"string\" && {\n title: confirmDetails.title,\n }),\n ...(typeof confirmDetails.description === \"string\" && {\n description: confirmDetails.description,\n }),\n },\n }\n : {}),\n },\n ];\n });\n};\n\nconst normalizeToolApprovalQuestions = (\n questions: unknown,\n): readonly ToolApprovalQuestion[] | undefined => {\n if (!Array.isArray(questions)) return undefined;\n\n return questions.flatMap<ToolApprovalQuestion>((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n const question = value as Record<string, unknown>;\n if (typeof question.id !== \"string\" || typeof question.prompt !== \"string\")\n return [];\n const options = Array.isArray(question.options)\n ? question.options.flatMap<ToolApprovalQuestionOption>((option) => {\n if (!option || typeof option !== \"object\" || Array.isArray(option))\n return [];\n const { id, label, description } = option as Record<string, unknown>;\n if (typeof id !== \"string\" || typeof label !== \"string\") return [];\n return [\n {\n id,\n label,\n ...(typeof description === \"string\" && { description }),\n },\n ];\n })\n : undefined;\n\n return [\n {\n id: question.id,\n prompt: question.prompt,\n ...(typeof question.header === \"string\" && {\n header: question.header,\n }),\n ...(options && { options }),\n ...(typeof question.multiple === \"boolean\" && {\n multiple: question.multiple,\n }),\n ...(typeof question.allowFreeform === \"boolean\" && {\n allowFreeform: question.allowFreeform,\n }),\n },\n ];\n });\n};\n\nconst APPROVAL_DESCRIPTOR_FIELDS = [\n \"prompt\",\n \"display\",\n \"allowFreeform\",\n \"dismissible\",\n \"options\",\n \"optionId\",\n \"text\",\n \"questions\",\n \"answers\",\n \"resolution\",\n] as const;\n\n// The AI SDK's approval object declares none of the core request and answer\n// fields and `validateUIMessages` strips unknown ones, so a host streams or\n// persists them inside the opaque `approvalDescriptor`. Only those fields are\n// read from it: a descriptor cannot approve its own request.\nconst readApprovalDescriptor = (\n descriptor: unknown,\n): Record<string, unknown> => {\n if (\n !descriptor ||\n typeof descriptor !== \"object\" ||\n Array.isArray(descriptor)\n )\n return {};\n const fields: Record<string, unknown> = {};\n for (const key of APPROVAL_DESCRIPTOR_FIELDS) {\n if (Object.hasOwn(descriptor, key))\n fields[key] = (descriptor as Record<string, unknown>)[key];\n }\n return fields;\n};\n\nfunction getToolApprovalAndInterrupt(\n part: {\n approval?: Record<string, unknown> | undefined;\n },\n toolStatus: { type: string; payload?: unknown } | undefined,\n supportsRichToolApprovalResponses: boolean,\n toolApprovalResponses:\n | ReadonlyMap<string, RespondToToolApprovalOptions>\n | undefined,\n cancelledToolApprovalIds: ReadonlySet<string> | undefined,\n): {\n approval?: NonNullable<ToolCallMessagePart[\"approval\"]>;\n interrupt?: NonNullable<ToolCallMessagePart[\"interrupt\"]>;\n} {\n if (part.approval) {\n const rawApproval = {\n ...readApprovalDescriptor(part.approval.descriptor),\n ...part.approval,\n };\n const approval =\n typeof rawApproval.id === \"string\" &&\n rawApproval.approved === undefined &&\n rawApproval.resolution === undefined &&\n cancelledToolApprovalIds?.has(rawApproval.id)\n ? { ...rawApproval, resolution: \"cancelled\" as const }\n : rawApproval;\n const response =\n typeof approval.id === \"string\" &&\n approval.approved === undefined &&\n approval.resolution !== \"cancelled\" &&\n approval.resolution !== \"expired\"\n ? toolApprovalResponses?.get(approval.id)\n : undefined;\n // The built-in AI SDK channel sends only id, approved and reason back to\n // the server, so a request shape promising any other answer would render\n // controls whose response cannot travel.\n const {\n id,\n prompt,\n approved,\n reason,\n isAutomatic,\n resolution,\n display,\n allowFreeform,\n dismissible,\n options,\n optionId,\n text,\n questions,\n answers,\n ...additionalApprovalFields\n } = response\n ? {\n ...approval,\n approved: response.approved,\n ...(response.reason != null && { reason: response.reason }),\n ...(response.optionId != null && { optionId: response.optionId }),\n ...(response.text != null && { text: response.text }),\n ...(response.answers != null && { answers: response.answers }),\n }\n : approval;\n const normalizedOptions = supportsRichToolApprovalResponses\n ? normalizeToolApprovalOptions(options)\n : undefined;\n const normalizedQuestions = supportsRichToolApprovalResponses\n ? normalizeToolApprovalQuestions(questions)\n : undefined;\n const normalizedAnswers = supportsRichToolApprovalResponses\n ? normalizeToolApprovalAnswers(answers)\n : undefined;\n const requestReason = additionalApprovalFields.requestReason;\n if (typeof id === \"string\")\n return {\n approval: {\n ...additionalApprovalFields,\n id,\n ...(typeof prompt === \"string\"\n ? { prompt }\n : typeof requestReason === \"string\"\n ? { prompt: requestReason }\n : {}),\n ...(typeof approved === \"boolean\" && { approved }),\n ...(typeof reason === \"string\" && { reason }),\n ...(isAutomatic === true && { isAutomatic: true }),\n ...(supportsRichToolApprovalResponses && {\n ...((display === \"decision\" ||\n display === \"select\" ||\n display === \"text\" ||\n display === \"questions\") && { display }),\n ...(typeof allowFreeform === \"boolean\" && { allowFreeform }),\n ...(typeof dismissible === \"boolean\" && { dismissible }),\n ...(normalizedOptions && { options: normalizedOptions }),\n ...(typeof optionId === \"string\" && { optionId }),\n ...(typeof text === \"string\" && { text }),\n ...(normalizedQuestions && { questions: normalizedQuestions }),\n ...(normalizedAnswers && { answers: normalizedAnswers }),\n }),\n ...((resolution === \"cancelled\" || resolution === \"expired\") && {\n resolution,\n }),\n } as NonNullable<ToolCallMessagePart[\"approval\"]>,\n };\n }\n\n if (toolStatus?.type === \"interrupt\") {\n return {\n interrupt: toolStatus.payload as NonNullable<\n ToolCallMessagePart[\"interrupt\"]\n >,\n };\n }\n\n return {};\n}\n\ntype MessageContent = Exclude<ThreadMessageLike[\"content\"], string>;\n\nconst uiPartStateToStatus = (\n state: \"streaming\" | \"done\" | undefined,\n): MessagePartStreamStatus | undefined => {\n if (state === \"streaming\") return { type: \"running\" };\n if (state === \"done\") return { type: \"complete\" };\n return undefined;\n};\n\nfunction convertParts(\n message: UIMessage,\n metadata: AISDKMessageConverterMetadata,\n): MessageContent {\n if (!message.parts || message.parts.length === 0) {\n return [];\n }\n\n const converted = message.parts\n .filter(\n (p) =>\n p.type !== \"step-start\" &&\n (message.role !== \"user\" || p.type !== \"file\"),\n )\n .map((part) => {\n if (part.type === \"text\") {\n const status = uiPartStateToStatus(part.state);\n return {\n type: \"text\",\n text: part.text,\n ...(status != null ? { status } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata: part.providerMetadata as PartProviderMetadata,\n }\n : undefined),\n } satisfies TextMessagePart;\n }\n\n if (part.type === \"reasoning\") {\n const status = uiPartStateToStatus(part.state);\n return {\n type: \"reasoning\",\n text: part.text,\n ...(status != null ? { status } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata: part.providerMetadata as PartProviderMetadata,\n }\n : undefined),\n } satisfies ReasoningMessagePart;\n }\n\n if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n const toolCallId = part.toolCallId;\n const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;\n\n // A tool call that streamed complete arguments then failed schema\n // validation keeps them in `rawInput`, not `input`; reading `input`\n // alone would convert the error snapshot to `{}` and hide the input.\n const rawInput = (part.input ??\n (\"rawInput\" in part ? part.rawInput : undefined)) as\n | ReadonlyJSONObject\n | null\n | undefined;\n let args: ReadonlyJSONObject;\n if (\n rawInput != null &&\n typeof rawInput === \"object\" &&\n !Array.isArray(rawInput)\n ) {\n args = rawInput;\n metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);\n } else {\n args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};\n }\n\n let result: unknown;\n let modelContent: ToolCallMessagePart[\"modelContent\"];\n let isError = false;\n\n if (part.state === \"output-available\") {\n const unwrapped = unwrapModelContentEnvelope(part.output);\n result = unwrapped.result;\n modelContent = unwrapped.modelContent;\n } else if (part.state === \"output-error\") {\n isError = true;\n result = { error: part.errorText };\n } else if (part.state === \"output-denied\") {\n isError = true;\n result = {\n error:\n (part as { approval?: { reason?: string } }).approval?.reason ||\n \"Tool approval denied\",\n };\n }\n\n let argsText: string;\n if (part.state === \"input-streaming\") {\n argsText = stableStringifyToolArgs(\n metadata.toolArgsKeyOrderCache,\n argsKeyOrderCacheKey,\n args,\n );\n // strip closing delimiters added by the AI SDK's fix-json\n argsText = stripClosingDelimiters(argsText);\n // Re-parse so args carries the partial-JSON meta that marks which\n // field is still mid-arrival, like every argsText-based runtime.\n // The key-order cache appends new keys last, so the trailing field\n // of the stripped text is the streaming frontier.\n args = parsePartialJsonObject(argsText) ?? args;\n } else {\n // A settled part is re-converted whenever its message or the converter\n // metadata changes; the text frozen on its input object skips\n // re-serializing large args while the call keeps that input. Arrival\n // order only matters while args stream, so the key-order entry is\n // released.\n const frozen =\n metadata.toolArgsTextCache?.get(args) ?? new Map<string, string>();\n const frozenText = frozen.get(argsKeyOrderCacheKey);\n if (frozenText !== undefined) {\n argsText = frozenText;\n } else {\n argsText = stableStringifyToolArgs(\n metadata.toolArgsKeyOrderCache,\n argsKeyOrderCacheKey,\n args,\n );\n metadata.toolArgsTextCache?.set(\n args,\n frozen.set(argsKeyOrderCacheKey, argsText),\n );\n }\n metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n ) {\n metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);\n }\n }\n\n const toolStatus = metadata.toolStatuses?.[toolCallId];\n const mcpApp = extractMcpAppMetadata(\n part,\n metadata.mcpAppMetadataCache,\n );\n const artifact = metadata.toolArtifacts?.get(toolCallId);\n const interactions = metadata.toolInteractions?.get(toolCallId);\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText,\n args,\n result,\n isError,\n ...(artifact !== undefined && { artifact }),\n ...(interactions !== undefined && {\n unstable_interactions: interactions,\n }),\n ...(part.state === \"output-available\" &&\n part.preliminary === true && { isPreliminary: true }),\n ...(modelContent !== undefined && { modelContent }),\n ...(mcpApp && { mcp: { app: mcpApp } }),\n ...(part.callProviderMetadata != null\n ? {\n providerMetadata:\n part.callProviderMetadata as PartProviderMetadata,\n }\n : undefined),\n ...getToolApprovalAndInterrupt(\n part,\n toolStatus,\n metadata.supportsRichToolApprovalResponses === true,\n metadata.toolApprovalResponses,\n metadata.cancelledToolApprovalIds,\n ),\n } satisfies ToolCallMessagePart;\n }\n\n if (part.type === \"source-url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.sourceId,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type === \"file\") {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n ...(part.filename != null && { filename: part.filename }),\n } satisfies FileMessagePart;\n }\n\n if (part.type === \"source-document\") {\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.sourceId,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type.startsWith(\"data-\")) {\n return {\n type: \"data\",\n ...(\"id\" in part && typeof part.id === \"string\"\n ? { id: part.id }\n : undefined),\n name: part.type.substring(5),\n data: (part as any).data,\n } satisfies DataMessagePart;\n }\n\n if (isReasoningFileUIPart(part)) {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n } satisfies FileMessagePart;\n }\n\n if (isCustomContentUIPart(part)) {\n return {\n type: \"data\",\n name: part.kind,\n data: part.providerMetadata ?? null,\n } satisfies DataMessagePart;\n }\n\n console.warn(`Unsupported message part type: ${part.type}`);\n return null;\n })\n .filter(Boolean) as MessageContent[number][];\n\n const seenToolCallIds = new Set<string>();\n return converted.filter((part) => {\n if (part.type === \"tool-call\" && part.toolCallId != null) {\n if (seenToolCallIds.has(part.toolCallId)) return false;\n seenToolCallIds.add(part.toolCallId);\n }\n return true;\n });\n}\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: UIMessage, metadata: AISDKMessageConverterMetadata) => {\n const createdAt = new Date();\n const content = convertParts(message, metadata);\n\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt,\n content,\n attachments: message.parts\n ?.filter((p) => p.type === \"file\")\n .map((part, idx) => {\n const mediaType = part.mediaType ?? \"unknown/unknown\";\n const isImage = mediaType.startsWith(\"image/\");\n return {\n id: idx.toString(),\n type: isImage ? \"image\" : \"file\",\n name: part.filename ?? \"file\",\n content: [\n isImage\n ? {\n type: \"image\",\n image: part.url,\n filename: part.filename!,\n }\n : {\n type: \"file\",\n filename: part.filename!,\n data: part.url,\n mimeType: mediaType,\n },\n ],\n contentType: mediaType,\n status: { type: \"complete\" as const },\n };\n }),\n metadata: toThreadMetadata(message.metadata),\n };\n\n case \"system\":\n case \"assistant\": {\n const timing = metadata.messageTiming?.[message.id];\n const isOptimistic =\n message.role === \"assistant\" &&\n message.id === metadata.optimisticMessageId;\n return {\n role: message.role,\n id: message.id,\n createdAt,\n content,\n ...(message.role === \"assistant\" &&\n metadata.cancelledStatusMessageIds?.has(message.id)\n ? {\n status: {\n type: \"incomplete\" as const,\n reason: \"cancelled\" as const,\n },\n }\n : undefined),\n metadata: {\n ...toThreadMetadata(message.metadata),\n ...(timing && { timing }),\n ...(isOptimistic && { isOptimistic: true }),\n },\n };\n }\n\n default:\n console.warn(`Unsupported message role: ${message.role}`);\n return [];\n }\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolApprovalAnswer } from "@assistant-ui/core";
2
+ export declare const normalizeToolApprovalAnswers: (answers: unknown) => Readonly<Record<string, ToolApprovalAnswer>> | undefined;
3
+ //# sourceMappingURL=toolApprovalAnswers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolApprovalAnswers.d.ts","sourceRoot":"","sources":["../../src/converters/toolApprovalAnswers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,eAAO,MAAM,4BAA4B,GACvC,SAAS,OAAO,KACf,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,GAAG,SAsBjD,CAAC"}
@@ -0,0 +1,17 @@
1
+ //#region src/converters/toolApprovalAnswers.ts
2
+ const normalizeToolApprovalAnswers = (answers) => {
3
+ if (!answers || typeof answers !== "object" || Array.isArray(answers)) return void 0;
4
+ return Object.fromEntries(Object.entries(answers).flatMap(([id, value]) => {
5
+ if (!value || typeof value !== "object" || Array.isArray(value)) return [];
6
+ const { optionIds, text } = value;
7
+ const answer = {
8
+ ...Array.isArray(optionIds) && { optionIds: optionIds.filter((optionId) => typeof optionId === "string") },
9
+ ...typeof text === "string" && { text }
10
+ };
11
+ return answer.optionIds?.length || answer.text !== void 0 ? [[id, answer]] : [];
12
+ }));
13
+ };
14
+ //#endregion
15
+ export { normalizeToolApprovalAnswers };
16
+
17
+ //# sourceMappingURL=toolApprovalAnswers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolApprovalAnswers.js","names":["ToolApprovalAnswer","normalizeToolApprovalAnswers","answers","Readonly","Record","Array","isArray","undefined","Object","fromEntries","entries","flatMap","id","value","optionIds","text","answer","filter","optionId","length"],"sources":["../../src/converters/toolApprovalAnswers.ts"],"sourcesContent":["import type { ToolApprovalAnswer } from \"@assistant-ui/core\";\n\nexport const normalizeToolApprovalAnswers = (\n answers: unknown,\n): Readonly<Record<string, ToolApprovalAnswer>> | undefined => {\n if (!answers || typeof answers !== \"object\" || Array.isArray(answers))\n return undefined;\n\n return Object.fromEntries(\n Object.entries(answers).flatMap(([id, value]) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return [];\n const { optionIds, text } = value as Record<string, unknown>;\n const answer: ToolApprovalAnswer = {\n ...(Array.isArray(optionIds) && {\n optionIds: optionIds.filter(\n (optionId): optionId is string => typeof optionId === \"string\",\n ),\n }),\n ...(typeof text === \"string\" && { text }),\n };\n return answer.optionIds?.length || answer.text !== undefined\n ? [[id, answer]]\n : [];\n }),\n );\n};\n"],"mappings":";AAEA,MAAaC,gCACXC,YAC6D;CAC7D,IAAI,CAACA,WAAW,OAAOA,YAAY,YAAYG,MAAMC,QAAQJ,OAAO,GAClE,OAAOK,KAAAA;CAET,OAAOC,OAAOC,YACZD,OAAOE,QAAQR,OAAO,CAAC,CAACS,SAAS,CAACC,IAAIC,WAAW;EAC/C,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAYR,MAAMC,QAAQO,KAAK,GAC5D,OAAO,CAAA;EACT,MAAM,EAAEC,WAAWC,SAASF;EAC5B,MAAMG,SAA6B;GACjC,GAAIX,MAAMC,QAAQQ,SAAS,KAAK,EAC9BA,WAAWA,UAAUG,QAClBC,aAAiC,OAAOA,aAAa,QACxD,EACF;GACA,GAAI,OAAOH,SAAS,YAAY,EAAEA,KAAK;EACzC;EACA,OAAOC,OAAOF,WAAWK,UAAUH,OAAOD,SAASR,KAAAA,IAC/C,CAAC,CAACK,IAAII,MAAM,CAAC,IACb,CAAA;CACN,CAAC,CACH;AACF"}
@@ -1,7 +1,7 @@
1
1
  //#region src/runtime/sdkIdentity.ts
2
2
  const AI_SDK_SDK = {
3
3
  name: "@assistant-ui/ai-sdk",
4
- version: "0.0.10"
4
+ version: "0.0.11"
5
5
  };
6
6
  //#endregion
7
7
  export { AI_SDK_SDK };
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalHistory.d.ts","sourceRoot":"","sources":["../../src/runtime/useExternalHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EAEpB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,2BAA2B,GAAI,QAAQ,EAClD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,UAAU,uBAAuB,CAAC,QAAQ,CAAC,KAC1C,yBAoBF,CAAC;AAmOF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,EACzC,YAAY,SAAS,CAAC,gBAAgB,CAAC,EACvC,gBAAgB,oBAAoB,GAAG,SAAS,EAChD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,sBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,EACzD,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAC7C,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,0BAA0B,MAAM,IAAI,EACpC,mBAAmB,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC3D,6BAA6B,MAAM,IAAI,EACvC,wBAAwB,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,EACjE,kCAAkC,MAAM,IAAI;;+BA+dxB,MAAM;yCA3UZ,MAAM;8CAAN,MAAM;CAyXrB,CAAC"}
1
+ {"version":3,"file":"useExternalHistory.d.ts","sourceRoot":"","sources":["../../src/runtime/useExternalHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EAEpB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAGf,eAAO,MAAM,2BAA2B,GAAI,QAAQ,EAClD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,UAAU,uBAAuB,CAAC,QAAQ,CAAC,KAC1C,yBAoBF,CAAC;AAsOF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,EACzC,YAAY,SAAS,CAAC,gBAAgB,CAAC,EACvC,gBAAgB,oBAAoB,GAAG,SAAS,EAChD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,sBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,EACzD,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAC7C,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,0BAA0B,MAAM,IAAI,EACpC,mBAAmB,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC3D,6BAA6B,MAAM,IAAI,EACvC,wBAAwB,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,EACjE,kCAAkC,MAAM,IAAI;;+BA+dxB,MAAM;yCA3UZ,MAAM;8CAAN,MAAM;CAyXrB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { normalizeToolApprovalAnswers } from "../converters/toolApprovalAnswers.js";
2
3
  import { MessageRepository, readToolInteractionLog } from "@assistant-ui/core/internal";
3
4
  import { getExternalStoreMessages } from "@assistant-ui/core";
4
5
  import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
@@ -59,6 +60,7 @@ const collectToolApprovalResponses = (message, toolApprovalResponses) => {
59
60
  approved: response.approved,
60
61
  ...response.optionId != null && { optionId: response.optionId },
61
62
  ...response.text != null && { text: response.text },
63
+ ...response.answers != null && { answers: response.answers },
62
64
  ...response.reason != null && { reason: response.reason }
63
65
  }]];
64
66
  });
@@ -110,11 +112,13 @@ const restoreToolData = (message, toolArtifacts, toolInteractions, toolApprovalR
110
112
  const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];
111
113
  if (toolApprovalResponses && isRecord(approvalResponses)) for (const [approvalId, value] of Object.entries(approvalResponses)) {
112
114
  if (!isRecord(value) || typeof value.approved !== "boolean") continue;
115
+ const answers = normalizeToolApprovalAnswers(value.answers);
113
116
  toolApprovalResponses.set(approvalId, {
114
117
  approvalId,
115
118
  approved: value.approved,
116
119
  ...typeof value.optionId === "string" && { optionId: value.optionId },
117
120
  ...typeof value.text === "string" && { text: value.text },
121
+ ...answers && Object.keys(answers).length > 0 && { answers },
118
122
  ...typeof value.reason === "string" && { reason: value.reason }
119
123
  });
120
124
  }