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

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 (105) hide show
  1. package/dist/frontendTools.d.ts +9 -5
  2. package/dist/frontendTools.d.ts.map +1 -1
  3. package/dist/frontendTools.js +36 -35
  4. package/dist/frontendTools.js.map +1 -1
  5. package/dist/index.d.ts +9 -11
  6. package/dist/index.js +9 -10
  7. package/dist/injectQuoteContext.d.ts +6 -2
  8. package/dist/injectQuoteContext.d.ts.map +1 -1
  9. package/dist/injectQuoteContext.js +46 -53
  10. package/dist/injectQuoteContext.js.map +1 -1
  11. package/dist/modelContentEnvelope.d.ts +12 -10
  12. package/dist/modelContentEnvelope.d.ts.map +1 -1
  13. package/dist/modelContentEnvelope.js +17 -15
  14. package/dist/modelContentEnvelope.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  16. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  17. package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
  18. package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
  19. package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
  20. package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
  21. package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
  22. package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
  23. package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
  24. package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
  25. package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
  26. package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
  27. package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
  28. package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
  29. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
  30. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
  31. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
  32. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
  33. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
  34. package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
  35. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
  36. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
  37. package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
  38. package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
  39. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
  40. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
  41. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
  42. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
  43. package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
  44. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
  45. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
  46. package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
  47. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
  48. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
  49. package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
  50. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  51. package/dist/ui/getVercelAIMessages.d.ts +7 -3
  52. package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
  53. package/dist/ui/getVercelAIMessages.js +7 -3
  54. package/dist/ui/getVercelAIMessages.js.map +1 -1
  55. package/dist/ui/resumable.d.ts +18 -15
  56. package/dist/ui/resumable.d.ts.map +1 -1
  57. package/dist/ui/resumable.js +21 -20
  58. package/dist/ui/resumable.js.map +1 -1
  59. package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
  60. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  61. package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
  62. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  63. package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
  64. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  65. package/dist/ui/use-chat/useAISDKRuntime.js +184 -204
  66. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  67. package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
  68. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  69. package/dist/ui/use-chat/useChatRuntime.js +60 -81
  70. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  71. package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
  72. package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
  73. package/dist/ui/use-chat/useExternalHistory.js +178 -200
  74. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  75. package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
  76. package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
  77. package/dist/ui/use-chat/useStreamingTiming.js +60 -75
  78. package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
  79. package/dist/ui/utils/convertMessage.d.ts +29 -20
  80. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  81. package/dist/ui/utils/convertMessage.js +207 -301
  82. package/dist/ui/utils/convertMessage.js.map +1 -1
  83. package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
  84. package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
  85. package/dist/ui/utils/sliceMessagesUntil.js +10 -10
  86. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  87. package/dist/ui/utils/toCreateMessage.d.ts +7 -3
  88. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  89. package/dist/ui/utils/toCreateMessage.js +34 -38
  90. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  91. package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
  92. package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
  93. package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
  94. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  95. package/dist/usage.d.ts +15 -12
  96. package/dist/usage.d.ts.map +1 -1
  97. package/dist/usage.js +80 -99
  98. package/dist/usage.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
  101. package/src/ui/use-chat/useAISDKRuntime.ts +8 -0
  102. package/src/ui/utils/convertMessage.test.ts +71 -6
  103. package/src/ui/utils/convertMessage.ts +27 -25
  104. package/dist/index.d.ts.map +0 -1
  105. package/dist/index.js.map +0 -1
@@ -186,7 +186,7 @@ describe("AISDKMessageConverter", () => {
186
186
  });
187
187
  });
188
188
 
189
- it("deduplicates tool calls by toolCallId and maps interrupt states", () => {
189
+ it("deduplicates tool calls by toolCallId and surfaces approval / interrupt state", () => {
190
190
  const converted = AISDKMessageConverter.toThreadMessages(
191
191
  [
192
192
  {
@@ -212,7 +212,7 @@ describe("AISDKMessageConverter", () => {
212
212
  toolCallId: "tc-2",
213
213
  state: "approval-requested",
214
214
  input: { action: "deploy" },
215
- approval: { reason: "need human review" },
215
+ approval: { id: "appr-1" },
216
216
  },
217
217
  {
218
218
  type: "tool-human",
@@ -220,6 +220,39 @@ describe("AISDKMessageConverter", () => {
220
220
  state: "input-available",
221
221
  input: { task: "confirm" },
222
222
  },
223
+ {
224
+ type: "tool-approve",
225
+ toolCallId: "tc-4",
226
+ state: "approval-responded",
227
+ input: { action: "rollback" },
228
+ approval: { id: "appr-2", approved: true, reason: "looks ok" },
229
+ },
230
+ {
231
+ type: "tool-approve",
232
+ toolCallId: "tc-5",
233
+ state: "approval-requested",
234
+ input: { action: "auto" },
235
+ approval: { id: "appr-3", isAutomatic: true },
236
+ },
237
+ {
238
+ type: "tool-approve",
239
+ toolCallId: "tc-6",
240
+ state: "output-denied",
241
+ input: { action: "wipe" },
242
+ approval: {
243
+ id: "appr-4",
244
+ approved: false,
245
+ reason: "user denied",
246
+ },
247
+ },
248
+ {
249
+ type: "tool-approve",
250
+ toolCallId: "tc-7",
251
+ state: "output-available",
252
+ input: { action: "ship" },
253
+ output: { ok: true },
254
+ approval: { id: "appr-5", approved: true, isAutomatic: true },
255
+ },
223
256
  ],
224
257
  } as any,
225
258
  ],
@@ -237,17 +270,49 @@ describe("AISDKMessageConverter", () => {
237
270
  const toolCalls = converted[0]?.content.filter(
238
271
  (part): part is any => part.type === "tool-call",
239
272
  );
240
- expect(toolCalls).toHaveLength(3);
273
+ expect(toolCalls).toHaveLength(7);
241
274
 
242
275
  expect(toolCalls?.filter((p) => p.toolCallId === "tc-1")).toHaveLength(1);
243
- expect(toolCalls?.find((p) => p.toolCallId === "tc-2")?.status).toEqual({
244
- type: "requires-action",
245
- reason: "interrupt",
276
+
277
+ expect(toolCalls?.find((p) => p.toolCallId === "tc-2")?.approval).toEqual({
278
+ id: "appr-1",
246
279
  });
280
+ expect(
281
+ toolCalls?.find((p) => p.toolCallId === "tc-2")?.interrupt,
282
+ ).toBeUndefined();
283
+
247
284
  expect(toolCalls?.find((p) => p.toolCallId === "tc-3")?.interrupt).toEqual({
248
285
  type: "human",
249
286
  payload: { kind: "human" },
250
287
  });
288
+ expect(
289
+ toolCalls?.find((p) => p.toolCallId === "tc-3")?.approval,
290
+ ).toBeUndefined();
291
+
292
+ expect(toolCalls?.find((p) => p.toolCallId === "tc-4")?.approval).toEqual({
293
+ id: "appr-2",
294
+ approved: true,
295
+ reason: "looks ok",
296
+ });
297
+
298
+ expect(toolCalls?.find((p) => p.toolCallId === "tc-5")?.approval).toEqual({
299
+ id: "appr-3",
300
+ isAutomatic: true,
301
+ });
302
+
303
+ const denied = toolCalls?.find((p) => p.toolCallId === "tc-6");
304
+ expect(denied?.approval).toEqual({
305
+ id: "appr-4",
306
+ approved: false,
307
+ reason: "user denied",
308
+ });
309
+ expect(denied?.isError).toBe(true);
310
+
311
+ expect(toolCalls?.find((p) => p.toolCallId === "tc-7")?.approval).toEqual({
312
+ id: "appr-5",
313
+ approved: true,
314
+ isAutomatic: true,
315
+ });
251
316
  });
252
317
 
253
318
  it("strips closing delimiters from streaming tool argsText", () => {
@@ -141,37 +141,39 @@ function stableStringifyToolArgs(
141
141
  return JSON.stringify(stableArgs);
142
142
  }
143
143
 
144
- /**
145
- * Resolves the interrupt fields for a tool call part.
146
- *
147
- * Two interrupt paths for tool approvals:
148
- * 1. AI SDK server-side approval: approval-requested state with part.approval payload
149
- * 2. Frontend tools: toolStatuses interrupt from context.human()
150
- */
151
- function getToolInterrupt(
152
- part: { state: string; approval?: unknown },
144
+ function getToolApprovalAndInterrupt(
145
+ part: {
146
+ approval?:
147
+ | {
148
+ id: string;
149
+ approved?: boolean;
150
+ reason?: string;
151
+ isAutomatic?: boolean;
152
+ }
153
+ | undefined;
154
+ },
153
155
  toolStatus: { type: string; payload?: unknown } | undefined,
154
- ): Record<string, unknown> {
155
- if (part.state === "approval-requested" && "approval" in part) {
156
+ ): {
157
+ approval?: NonNullable<ToolCallMessagePart["approval"]>;
158
+ interrupt?: NonNullable<ToolCallMessagePart["interrupt"]>;
159
+ } {
160
+ if (part.approval && typeof part.approval.id === "string") {
161
+ const { id, approved, reason, isAutomatic } = part.approval;
156
162
  return {
157
- interrupt: {
158
- type: "human" as const,
159
- payload: (part as { approval: unknown }).approval,
160
- },
161
- status: {
162
- type: "requires-action" as const,
163
- reason: "interrupt" as const,
163
+ approval: {
164
+ id,
165
+ ...(typeof approved === "boolean" && { approved }),
166
+ ...(typeof reason === "string" && { reason }),
167
+ ...(isAutomatic === true && { isAutomatic: true }),
164
168
  },
165
169
  };
166
170
  }
167
171
 
168
172
  if (toolStatus?.type === "interrupt") {
169
173
  return {
170
- interrupt: toolStatus.payload,
171
- status: {
172
- type: "requires-action" as const,
173
- reason: "interrupt" as const,
174
- },
174
+ interrupt: toolStatus.payload as NonNullable<
175
+ ToolCallMessagePart["interrupt"]
176
+ >,
175
177
  };
176
178
  }
177
179
 
@@ -242,7 +244,7 @@ function convertParts(
242
244
  isError = true;
243
245
  result = {
244
246
  error:
245
- (part as { approval: { reason?: string } }).approval.reason ||
247
+ (part as { approval?: { reason?: string } }).approval?.reason ||
246
248
  "Tool approval denied",
247
249
  };
248
250
  }
@@ -281,7 +283,7 @@ function convertParts(
281
283
  isError,
282
284
  ...(modelContent !== undefined && { modelContent }),
283
285
  ...(mcpApp && { mcp: { app: mcpApp } }),
284
- ...getToolInterrupt(part, toolStatus),
286
+ ...getToolApprovalAndInterrupt(part, toolStatus),
285
287
  } satisfies ToolCallMessagePart;
286
288
  }
287
289
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,yCAAsC;AAChE,OAAO,EAAE,cAAc,EAAE,wCAAqC;AAC9D,YAAY,EAAE,qBAAqB,EAAE,wCAAqC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,gDAA6C;AAC9E,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,0BAAuB;AACxB,YAAY,EACV,6BAA6B,EAC7B,sBAAsB,GACvB,0BAAuB;AACxB,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAChD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,YAAY,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,mBAAgB;AAC9E,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,kDAAkD;AAElD,OAAO,EAAE,eAAe,EAAE,yCAAsC;AAChE,OAAO,EAAE,cAAc,EAAE,wCAAqC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,gDAA6C;AAC9E,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,0BAAuB;AAKxB,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAChD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAE1D,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,mBAAgB"}