@tanstack/ai 0.47.2 → 0.48.0

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/README.md +2 -1
  2. package/dist/esm/activities/chat/adapter.d.ts +5 -4
  3. package/dist/esm/activities/chat/adapter.js.map +1 -1
  4. package/dist/esm/activities/chat/index.d.ts +4 -7
  5. package/dist/esm/activities/chat/index.js +201 -243
  6. package/dist/esm/activities/chat/index.js.map +1 -1
  7. package/dist/esm/activities/chat/messages.js +126 -31
  8. package/dist/esm/activities/chat/messages.js.map +1 -1
  9. package/dist/esm/activities/chat/stream/processor.d.ts +38 -17
  10. package/dist/esm/activities/chat/stream/processor.js +197 -110
  11. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  12. package/dist/esm/activities/chat/tools/tool-calls.d.ts +3 -2
  13. package/dist/esm/activities/chat/tools/tool-calls.js +15 -10
  14. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
  15. package/dist/esm/activities/generateVideo/index.js +6 -6
  16. package/dist/esm/activities/generateVideo/index.js.map +1 -1
  17. package/dist/esm/activities/stream-generation-result.js +7 -8
  18. package/dist/esm/activities/stream-generation-result.js.map +1 -1
  19. package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +2 -1
  20. package/dist/esm/activities/summarize/chat-stream-summarize.js +59 -54
  21. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -1
  22. package/dist/esm/adapter-internals.d.ts +2 -0
  23. package/dist/esm/adapter-internals.js +3 -1
  24. package/dist/esm/client.d.ts +8 -1
  25. package/dist/esm/client.js +7 -2
  26. package/dist/esm/client.js.map +1 -1
  27. package/dist/esm/index.d.ts +6 -0
  28. package/dist/esm/index.js +6 -2
  29. package/dist/esm/middlewares/otel.js +12 -5
  30. package/dist/esm/middlewares/otel.js.map +1 -1
  31. package/dist/esm/stream-to-response.js +13 -6
  32. package/dist/esm/stream-to-response.js.map +1 -1
  33. package/dist/esm/stream-to-websocket.js +4 -2
  34. package/dist/esm/stream-to-websocket.js.map +1 -1
  35. package/dist/esm/strip-to-spec-middleware.d.ts +10 -13
  36. package/dist/esm/strip-to-spec-middleware.js +24 -22
  37. package/dist/esm/strip-to-spec-middleware.js.map +1 -1
  38. package/dist/esm/types.d.ts +82 -305
  39. package/dist/esm/utilities/adapter-yield-chunk.d.ts +31 -0
  40. package/dist/esm/utilities/ag-ui-usage.d.ts +24 -0
  41. package/dist/esm/utilities/ag-ui-usage.js +66 -0
  42. package/dist/esm/utilities/ag-ui-usage.js.map +1 -0
  43. package/dist/esm/utilities/ag-ui-wire.d.ts +14 -7
  44. package/dist/esm/utilities/ag-ui-wire.js +71 -30
  45. package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
  46. package/dist/esm/utilities/chat-params.d.ts +3 -3
  47. package/dist/esm/utilities/chat-params.js +10 -30
  48. package/dist/esm/utilities/chat-params.js.map +1 -1
  49. package/dist/esm/utilities/chunk-ids.d.ts +5 -0
  50. package/dist/esm/utilities/chunk-ids.js +25 -0
  51. package/dist/esm/utilities/chunk-ids.js.map +1 -0
  52. package/dist/esm/utilities/errors.d.ts +9 -0
  53. package/dist/esm/utilities/errors.js +13 -1
  54. package/dist/esm/utilities/errors.js.map +1 -1
  55. package/dist/esm/utilities/merge-metadata.d.ts +14 -0
  56. package/dist/esm/utilities/merge-metadata.js +43 -0
  57. package/dist/esm/utilities/merge-metadata.js.map +1 -0
  58. package/dist/esm/utilities/normalize-stream-chunk.d.ts +3 -0
  59. package/dist/esm/utilities/normalize-stream-chunk.js +100 -0
  60. package/dist/esm/utilities/normalize-stream-chunk.js.map +1 -0
  61. package/dist/esm/utilities/reasoning-encrypted-value.d.ts +8 -0
  62. package/dist/esm/utilities/reasoning-encrypted-value.js +16 -0
  63. package/dist/esm/utilities/reasoning-encrypted-value.js.map +1 -0
  64. package/dist/esm/utilities/restore-inbound-chunk.d.ts +15 -0
  65. package/dist/esm/utilities/restore-inbound-chunk.js +43 -0
  66. package/dist/esm/utilities/restore-inbound-chunk.js.map +1 -0
  67. package/dist/esm/utilities/spec-event-keys.d.ts +2 -0
  68. package/dist/esm/utilities/spec-event-keys.js +56 -0
  69. package/dist/esm/utilities/spec-event-keys.js.map +1 -0
  70. package/dist/esm/utilities/structured-output-events.d.ts +3 -3
  71. package/dist/esm/utilities/structured-output-events.js.map +1 -1
  72. package/package.json +3 -3
  73. package/src/activities/chat/adapter.ts +4 -4
  74. package/src/activities/chat/index.ts +398 -400
  75. package/src/activities/chat/messages.ts +183 -36
  76. package/src/activities/chat/stream/processor.ts +313 -239
  77. package/src/activities/chat/tools/tool-calls.ts +23 -22
  78. package/src/activities/generateVideo/index.ts +7 -6
  79. package/src/activities/stream-generation-result.ts +8 -12
  80. package/src/activities/summarize/chat-stream-summarize.ts +98 -70
  81. package/src/adapter-internals.ts +2 -0
  82. package/src/client.ts +13 -0
  83. package/src/index.ts +6 -0
  84. package/src/middlewares/otel.ts +16 -8
  85. package/src/stream-to-response.ts +16 -4
  86. package/src/stream-to-websocket.ts +3 -1
  87. package/src/strip-to-spec-middleware.ts +48 -24
  88. package/src/types.ts +109 -393
  89. package/src/utilities/adapter-yield-chunk.ts +30 -0
  90. package/src/utilities/ag-ui-usage.test.ts +194 -0
  91. package/src/utilities/ag-ui-usage.ts +148 -0
  92. package/src/utilities/ag-ui-wire.ts +149 -31
  93. package/src/utilities/chat-params.ts +22 -39
  94. package/src/utilities/chunk-ids.ts +24 -0
  95. package/src/utilities/errors.ts +23 -0
  96. package/src/utilities/merge-metadata.test.ts +117 -0
  97. package/src/utilities/merge-metadata.ts +59 -0
  98. package/src/utilities/normalize-stream-chunk.test.ts +423 -0
  99. package/src/utilities/normalize-stream-chunk.ts +186 -0
  100. package/src/utilities/reasoning-encrypted-value.ts +18 -0
  101. package/src/utilities/restore-inbound-chunk.test.ts +133 -0
  102. package/src/utilities/restore-inbound-chunk.ts +72 -0
  103. package/src/utilities/spec-event-keys.test.ts +34 -0
  104. package/src/utilities/spec-event-keys.ts +74 -0
  105. package/src/utilities/structured-output-events.ts +3 -3
@@ -0,0 +1,43 @@
1
+ //#region src/utilities/merge-metadata.ts
2
+ function isPlainRecord(value) {
3
+ return value != null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ function mergeMetadata(current, incoming) {
6
+ if (incoming == null) return current;
7
+ if (current == null) return { ...incoming };
8
+ const merged = {
9
+ ...current,
10
+ ...incoming
11
+ };
12
+ if (isPlainRecord(current.tanstack) && isPlainRecord(incoming.tanstack)) merged.tanstack = {
13
+ ...current.tanstack,
14
+ ...incoming.tanstack
15
+ };
16
+ return merged;
17
+ }
18
+ /** Read `metadata.tanstack`. Not part of the public SDK surface. */
19
+ function tanstackMetadata(value) {
20
+ if (value == null) return void 0;
21
+ const nested = "metadata" in value ? value.metadata : void 0;
22
+ const tanstack = (nested != null && typeof nested === "object" && !Array.isArray(nested) ? nested : value).tanstack;
23
+ if (tanstack == null || typeof tanstack !== "object" || Array.isArray(tanstack)) return;
24
+ return tanstack;
25
+ }
26
+ function withTanstackMetadata(value, tanstack) {
27
+ const current = value.metadata;
28
+ const currentTanstack = tanstackMetadata(value) ?? {};
29
+ return {
30
+ ...value,
31
+ metadata: {
32
+ ...current ?? {},
33
+ tanstack: {
34
+ ...currentTanstack,
35
+ ...tanstack
36
+ }
37
+ }
38
+ };
39
+ }
40
+ //#endregion
41
+ export { mergeMetadata, tanstackMetadata, withTanstackMetadata };
42
+
43
+ //# sourceMappingURL=merge-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-metadata.js","names":[],"sources":["../../../src/utilities/merge-metadata.ts"],"sourcesContent":["import type { TanStackMessageMetadata, TanStackRunMetadata } from '../types'\n\nexport type MetadataRecord = Record<string, any>\n\n/** `metadata.tanstack` on a message or run event. Internal getter return type. */\nexport type TanStackMetadata = TanStackMessageMetadata & TanStackRunMetadata\n\nfunction isPlainRecord(value: unknown): value is MetadataRecord {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function mergeMetadata(\n current: MetadataRecord | undefined,\n incoming: MetadataRecord | null | undefined,\n): MetadataRecord | undefined {\n if (incoming == null) return current\n if (current == null) return { ...incoming }\n const merged: MetadataRecord = { ...current, ...incoming }\n if (isPlainRecord(current.tanstack) && isPlainRecord(incoming.tanstack)) {\n merged.tanstack = { ...current.tanstack, ...incoming.tanstack }\n }\n return merged\n}\n\n/** Read `metadata.tanstack`. Not part of the public SDK surface. */\nexport function tanstackMetadata(\n value: { metadata?: MetadataRecord | null } | MetadataRecord | undefined,\n): TanStackMetadata | undefined {\n if (value == null) return undefined\n const nested = 'metadata' in value ? value.metadata : undefined\n const metadata =\n nested != null && typeof nested === 'object' && !Array.isArray(nested)\n ? nested\n : (value as MetadataRecord)\n const tanstack = metadata.tanstack\n if (\n tanstack == null ||\n typeof tanstack !== 'object' ||\n Array.isArray(tanstack)\n ) {\n return undefined\n }\n return tanstack as TanStackMetadata\n}\n\nexport function withTanstackMetadata<T>(\n value: T & { metadata?: MetadataRecord | null },\n tanstack: MetadataRecord,\n): Omit<T, 'metadata'> & { metadata: MetadataRecord } {\n const current = value.metadata\n const currentTanstack = tanstackMetadata(value) ?? {}\n return {\n ...value,\n metadata: {\n ...(current ?? {}),\n tanstack: { ...currentTanstack, ...tanstack },\n },\n }\n}\n"],"mappings":";AAOA,SAAS,cAAc,OAAyC;CAC9D,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAEA,SAAgB,cACd,SACA,UAC4B;CAC5B,IAAI,YAAY,MAAM,OAAO;CAC7B,IAAI,WAAW,MAAM,OAAO,EAAE,GAAG,SAAS;CAC1C,MAAM,SAAyB;EAAE,GAAG;EAAS,GAAG;CAAS;CACzD,IAAI,cAAc,QAAQ,QAAQ,KAAK,cAAc,SAAS,QAAQ,GACpE,OAAO,WAAW;EAAE,GAAG,QAAQ;EAAU,GAAG,SAAS;CAAS;CAEhE,OAAO;AACT;;AAGA,SAAgB,iBACd,OAC8B;CAC9B,IAAI,SAAS,MAAM,OAAO,KAAA;CAC1B,MAAM,SAAS,cAAc,QAAQ,MAAM,WAAW,KAAA;CAKtD,MAAM,YAHJ,UAAU,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IACjE,SACC,MAAA,CACmB;CAC1B,IACE,YAAY,QACZ,OAAO,aAAa,YACpB,MAAM,QAAQ,QAAQ,GAEtB;CAEF,OAAO;AACT;AAEA,SAAgB,qBACd,OACA,UACoD;CACpD,MAAM,UAAU,MAAM;CACtB,MAAM,kBAAkB,iBAAiB,KAAK,KAAK,CAAC;CACpD,OAAO;EACL,GAAG;EACH,UAAU;GACR,GAAI,WAAW,CAAC;GAChB,UAAU;IAAE,GAAG;IAAiB,GAAG;GAAS;EAC9C;CACF;AACF"}
@@ -0,0 +1,3 @@
1
+ import { StreamChunk } from '../types.js';
2
+ import { AdapterYieldChunk } from './adapter-yield-chunk.js';
3
+ export declare function normalizeStreamChunk(chunk: AdapterYieldChunk): Array<StreamChunk>;
@@ -0,0 +1,100 @@
1
+ import { EventType } from "../types.js";
2
+ import { isTanstackUsage, toSpecTokenUsage } from "./ag-ui-usage.js";
3
+ import { withTanstackMetadata } from "./merge-metadata.js";
4
+ import { reasoningEncryptedValue } from "./reasoning-encrypted-value.js";
5
+ import { specKeysFor } from "./spec-event-keys.js";
6
+ //#region src/utilities/normalize-stream-chunk.ts
7
+ function stringField(value) {
8
+ return typeof value === "string" && value !== "" ? value : void 0;
9
+ }
10
+ function encryptedValueExtras(chunk) {
11
+ const extras = [];
12
+ const timestamp = "timestamp" in chunk && typeof chunk.timestamp === "number" ? chunk.timestamp : void 0;
13
+ if (typeof chunk.signature === "string" && chunk.signature !== "") {
14
+ const source = chunk;
15
+ const toolCallId = stringField(source.toolCallId);
16
+ const entityId = stringField(chunk.stepId) ?? stringField(source.stepName) ?? stringField(source.messageId) ?? toolCallId;
17
+ if (entityId !== void 0) extras.push(reasoningEncryptedValue({
18
+ subtype: toolCallId && !chunk.stepId ? "tool-call" : "message",
19
+ entityId,
20
+ encryptedValue: chunk.signature,
21
+ timestamp
22
+ }));
23
+ }
24
+ if (chunk.type === EventType.TOOL_CALL_START) {
25
+ const thoughtSignature = stringField(chunk.metadata?.thoughtSignature);
26
+ if (thoughtSignature !== void 0 && chunk.toolCallId) extras.push(reasoningEncryptedValue({
27
+ subtype: "tool-call",
28
+ entityId: chunk.toolCallId,
29
+ encryptedValue: thoughtSignature,
30
+ timestamp
31
+ }));
32
+ }
33
+ return extras;
34
+ }
35
+ function normalizeStreamChunk(chunk) {
36
+ const specKeys = specKeysFor(chunk.type);
37
+ const source = chunk;
38
+ const specChunk = {};
39
+ for (const key of Object.keys(chunk)) if (specKeys.has(key)) specChunk[key] = source[key];
40
+ if (chunk.type === EventType.TOOL_CALL_START) {
41
+ if (specChunk.toolCallName === void 0 && chunk.toolName) specChunk.toolCallName = chunk.toolName;
42
+ }
43
+ if (chunk.type === EventType.RUN_ERROR && chunk.error != null) {
44
+ if (specChunk.message === void 0 && chunk.error.message) specChunk.message = chunk.error.message;
45
+ if (specChunk.code === void 0 && chunk.error.code !== void 0) specChunk.code = chunk.error.code;
46
+ }
47
+ const tanstack = {};
48
+ if (chunk.model !== void 0 && chunk.type !== EventType.TEXT_MESSAGE_CONTENT && chunk.type !== EventType.TOOL_CALL_ARGS) tanstack.model = chunk.model;
49
+ if (chunk.finishReason !== void 0) tanstack.finishReason = chunk.finishReason;
50
+ const interruptErrors = chunk["tanstack:interruptErrors"];
51
+ if (interruptErrors !== void 0) tanstack.interruptErrors = interruptErrors;
52
+ if (chunk.type === EventType.CUSTOM || chunk.type === EventType.RUN_ERROR) {
53
+ if (chunk.threadId !== void 0) tanstack.threadId = chunk.threadId;
54
+ if (chunk.runId !== void 0) tanstack.runId = chunk.runId;
55
+ }
56
+ const skipLeftover = /* @__PURE__ */ new Set([
57
+ "result",
58
+ "error",
59
+ "tanstack:interruptErrors"
60
+ ]);
61
+ if (chunk.type === EventType.TEXT_MESSAGE_CONTENT || chunk.type === EventType.TOOL_CALL_ARGS) {
62
+ skipLeftover.add("model");
63
+ skipLeftover.add("content");
64
+ skipLeftover.add("args");
65
+ }
66
+ if (chunk.type === EventType.TOOL_CALL_START) skipLeftover.add("toolName");
67
+ for (const key of Object.keys(chunk)) {
68
+ if (specKeys.has(key) || skipLeftover.has(key)) continue;
69
+ if (tanstack[key] !== void 0) continue;
70
+ const value = source[key];
71
+ if (value !== void 0) tanstack[key] = value;
72
+ }
73
+ if ((chunk.type === EventType.RUN_FINISHED || chunk.type === EventType.RUN_ERROR) && isTanstackUsage(specChunk.usage)) {
74
+ const { usage, leftover } = toSpecTokenUsage(specChunk.usage, { model: typeof chunk.model === "string" ? chunk.model : void 0 });
75
+ specChunk.usage = usage;
76
+ if (leftover !== void 0) tanstack.usage = leftover;
77
+ }
78
+ const normalized = Object.keys(tanstack).length === 0 ? specChunk : withTanstackMetadata(specChunk, tanstack);
79
+ const extras = encryptedValueExtras(chunk);
80
+ const main = [normalized];
81
+ if (chunk.type === EventType.TOOL_CALL_END && chunk.result !== void 0) {
82
+ const parentMessageId = source.parentMessageId;
83
+ const resultChunk = {
84
+ type: EventType.TOOL_CALL_RESULT,
85
+ toolCallId: chunk.toolCallId,
86
+ content: Array.isArray(chunk.result) ? JSON.stringify(chunk.result) : chunk.result,
87
+ messageId: typeof parentMessageId === "string" && parentMessageId !== "" ? parentMessageId : chunk.toolCallId
88
+ };
89
+ if (chunk.state === "output-error") main.push({
90
+ ...resultChunk,
91
+ metadata: { tanstack: { state: chunk.state } }
92
+ });
93
+ else main.push(resultChunk);
94
+ }
95
+ return [...main, ...extras];
96
+ }
97
+ //#endregion
98
+ export { normalizeStreamChunk };
99
+
100
+ //# sourceMappingURL=normalize-stream-chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-stream-chunk.js","names":[],"sources":["../../../src/utilities/normalize-stream-chunk.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { StreamChunk, ToolCallResultEvent } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\nimport { isTanstackUsage, toSpecTokenUsage } from './ag-ui-usage'\nimport type { MetadataRecord } from './merge-metadata'\nimport { withTanstackMetadata } from './merge-metadata'\nimport { reasoningEncryptedValue } from './reasoning-encrypted-value'\nimport { specKeysFor } from './spec-event-keys'\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined\n}\n\nfunction encryptedValueExtras(chunk: AdapterYieldChunk): Array<StreamChunk> {\n const extras: Array<StreamChunk> = []\n const timestamp =\n 'timestamp' in chunk && typeof chunk.timestamp === 'number'\n ? chunk.timestamp\n : undefined\n\n if (typeof chunk.signature === 'string' && chunk.signature !== '') {\n const source = chunk as Record<string, unknown>\n const toolCallId = stringField(source.toolCallId)\n const entityId =\n stringField(chunk.stepId) ??\n stringField(source.stepName) ??\n stringField(source.messageId) ??\n toolCallId\n if (entityId !== undefined) {\n extras.push(\n reasoningEncryptedValue({\n subtype: toolCallId && !chunk.stepId ? 'tool-call' : 'message',\n entityId,\n encryptedValue: chunk.signature,\n timestamp,\n }),\n )\n }\n }\n\n if (chunk.type === EventType.TOOL_CALL_START) {\n const thoughtSignature = stringField(\n (chunk.metadata as { thoughtSignature?: unknown } | undefined)\n ?.thoughtSignature,\n )\n if (thoughtSignature !== undefined && chunk.toolCallId) {\n extras.push(\n reasoningEncryptedValue({\n subtype: 'tool-call',\n entityId: chunk.toolCallId,\n encryptedValue: thoughtSignature,\n timestamp,\n }),\n )\n }\n }\n\n return extras\n}\n\nexport function normalizeStreamChunk(\n chunk: AdapterYieldChunk,\n): Array<StreamChunk> {\n const specKeys = specKeysFor(chunk.type)\n const source = chunk as Record<string, unknown>\n const specChunk: Record<string, unknown> & {\n metadata?: MetadataRecord | null\n } = {}\n\n for (const key of Object.keys(chunk)) {\n if (specKeys.has(key)) {\n specChunk[key] = source[key]\n }\n }\n\n if (chunk.type === EventType.TOOL_CALL_START) {\n if (specChunk.toolCallName === undefined && chunk.toolName) {\n specChunk.toolCallName = chunk.toolName\n }\n }\n\n if (chunk.type === EventType.RUN_ERROR && chunk.error != null) {\n if (specChunk.message === undefined && chunk.error.message) {\n specChunk.message = chunk.error.message\n }\n if (specChunk.code === undefined && chunk.error.code !== undefined) {\n specChunk.code = chunk.error.code\n }\n }\n\n const tanstack: MetadataRecord = {}\n\n if (\n chunk.model !== undefined &&\n chunk.type !== EventType.TEXT_MESSAGE_CONTENT &&\n chunk.type !== EventType.TOOL_CALL_ARGS\n ) {\n tanstack.model = chunk.model\n }\n\n if (chunk.finishReason !== undefined) {\n tanstack.finishReason = chunk.finishReason\n }\n\n const interruptErrors = chunk['tanstack:interruptErrors']\n if (interruptErrors !== undefined) {\n tanstack.interruptErrors = interruptErrors\n }\n\n if (chunk.type === EventType.CUSTOM || chunk.type === EventType.RUN_ERROR) {\n if (chunk.threadId !== undefined) {\n tanstack.threadId = chunk.threadId\n }\n if (chunk.runId !== undefined) {\n tanstack.runId = chunk.runId\n }\n }\n\n const skipLeftover = new Set(['result', 'error', 'tanstack:interruptErrors'])\n if (\n chunk.type === EventType.TEXT_MESSAGE_CONTENT ||\n chunk.type === EventType.TOOL_CALL_ARGS\n ) {\n skipLeftover.add('model')\n skipLeftover.add('content')\n skipLeftover.add('args')\n }\n if (chunk.type === EventType.TOOL_CALL_START) {\n skipLeftover.add('toolName')\n }\n for (const key of Object.keys(chunk)) {\n if (specKeys.has(key) || skipLeftover.has(key)) continue\n if (tanstack[key] !== undefined) continue\n const value = source[key]\n if (value !== undefined) {\n tanstack[key] = value\n }\n }\n\n if (\n (chunk.type === EventType.RUN_FINISHED ||\n chunk.type === EventType.RUN_ERROR) &&\n isTanstackUsage(specChunk.usage)\n ) {\n const { usage, leftover } = toSpecTokenUsage(specChunk.usage, {\n model: typeof chunk.model === 'string' ? chunk.model : undefined,\n })\n specChunk.usage = usage\n if (leftover !== undefined) {\n tanstack.usage = leftover\n }\n }\n\n const normalized =\n Object.keys(tanstack).length === 0\n ? specChunk\n : withTanstackMetadata(specChunk, tanstack)\n\n const extras = encryptedValueExtras(chunk)\n const main: Array<StreamChunk> = [normalized as StreamChunk]\n\n if (chunk.type === EventType.TOOL_CALL_END && chunk.result !== undefined) {\n const parentMessageId = source.parentMessageId\n const resultChunk: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: chunk.toolCallId,\n content: Array.isArray(chunk.result)\n ? JSON.stringify(chunk.result)\n : chunk.result,\n messageId:\n typeof parentMessageId === 'string' && parentMessageId !== ''\n ? parentMessageId\n : chunk.toolCallId,\n }\n if (chunk.state === 'output-error') {\n main.push({\n ...resultChunk,\n metadata: { tanstack: { state: chunk.state } },\n })\n } else {\n main.push(resultChunk)\n }\n }\n\n return [...main, ...extras]\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ReasoningEncryptedValueEvent } from '../types.js';
2
+ /** Spec event that carries a provider thinking / tool-call signature blob. */
3
+ export declare function reasoningEncryptedValue(opts: {
4
+ subtype: 'message' | 'tool-call';
5
+ entityId: string;
6
+ encryptedValue: string;
7
+ timestamp?: number;
8
+ }): ReasoningEncryptedValueEvent;
@@ -0,0 +1,16 @@
1
+ import { EventType } from "../types.js";
2
+ //#region src/utilities/reasoning-encrypted-value.ts
3
+ /** Spec event that carries a provider thinking / tool-call signature blob. */
4
+ function reasoningEncryptedValue(opts) {
5
+ return {
6
+ type: EventType.REASONING_ENCRYPTED_VALUE,
7
+ subtype: opts.subtype,
8
+ entityId: opts.entityId,
9
+ encryptedValue: opts.encryptedValue,
10
+ ...opts.timestamp !== void 0 ? { timestamp: opts.timestamp } : {}
11
+ };
12
+ }
13
+ //#endregion
14
+ export { reasoningEncryptedValue };
15
+
16
+ //# sourceMappingURL=reasoning-encrypted-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-encrypted-value.js","names":[],"sources":["../../../src/utilities/reasoning-encrypted-value.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { ReasoningEncryptedValueEvent } from '../types'\n\n/** Spec event that carries a provider thinking / tool-call signature blob. */\nexport function reasoningEncryptedValue(opts: {\n subtype: 'message' | 'tool-call'\n entityId: string\n encryptedValue: string\n timestamp?: number\n}): ReasoningEncryptedValueEvent {\n return {\n type: EventType.REASONING_ENCRYPTED_VALUE,\n subtype: opts.subtype,\n entityId: opts.entityId,\n encryptedValue: opts.encryptedValue,\n ...(opts.timestamp !== undefined ? { timestamp: opts.timestamp } : {}),\n }\n}\n"],"mappings":";;;AAIA,SAAgB,wBAAwB,MAKP;CAC/B,OAAO;EACL,MAAM,UAAU;EAChB,SAAS,KAAK;EACd,UAAU,KAAK;EACf,gBAAgB,KAAK;EACrB,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACtE;AACF"}
@@ -0,0 +1,15 @@
1
+ import { StreamChunk } from '../types.js';
2
+ import { AdapterYieldChunk } from './adapter-yield-chunk.js';
3
+ /**
4
+ * Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus
5
+ * leftover fields in `metadata.tanstack.usage`. Restore in-process aliases
6
+ * that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates
7
+ * in place so WeakMap run-id stamps stay attached.
8
+ */
9
+ export declare function restorePublicUsage(chunk: StreamChunk): StreamChunk;
10
+ /**
11
+ * Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.
12
+ * Copies `metadata.tanstack` extras back to top-level fields and rebuilds
13
+ * TanStack `TokenUsage` from spec `usage[]` when present.
14
+ */
15
+ export declare function restoreInboundChunk(chunk: StreamChunk): AdapterYieldChunk;
@@ -0,0 +1,43 @@
1
+ import { EventType } from "../types.js";
2
+ import { isTanstackUsage, rebuildTokenUsage } from "./ag-ui-usage.js";
3
+ import { tanstackMetadata } from "./merge-metadata.js";
4
+ //#region src/utilities/restore-inbound-chunk.ts
5
+ /**
6
+ * Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus
7
+ * leftover fields in `metadata.tanstack.usage`. Restore in-process aliases
8
+ * that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates
9
+ * in place so WeakMap run-id stamps stay attached.
10
+ */
11
+ function restorePublicUsage(chunk) {
12
+ if ((chunk.type === EventType.RUN_FINISHED || chunk.type === EventType.RUN_ERROR) && (Array.isArray(chunk.usage) || isTanstackUsage(chunk.usage))) {
13
+ const rebuilt = rebuildTokenUsage(chunk.usage, tanstackMetadata(chunk)?.usage);
14
+ if (rebuilt !== void 0) chunk.usage = rebuilt;
15
+ }
16
+ if (chunk.type === EventType.TOOL_CALL_START && chunk.toolName === void 0 && chunk.toolCallName) chunk.toolName = chunk.toolCallName;
17
+ if (chunk.type === EventType.TOOL_CALL_END && chunk.input === void 0) {
18
+ const input = tanstackMetadata(chunk)?.input;
19
+ if (input !== void 0) chunk.input = input;
20
+ }
21
+ return chunk;
22
+ }
23
+ /**
24
+ * Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.
25
+ * Copies `metadata.tanstack` extras back to top-level fields and rebuilds
26
+ * TanStack `TokenUsage` from spec `usage[]` when present.
27
+ */
28
+ function restoreInboundChunk(chunk) {
29
+ restorePublicUsage(chunk);
30
+ const tanstack = tanstackMetadata(chunk);
31
+ const next = chunk;
32
+ if (tanstack == null) return next;
33
+ for (const [key, value] of Object.entries(tanstack)) {
34
+ if (key === "usage" || key === "interruptErrors") continue;
35
+ if (next[key] === void 0 && value !== void 0) next[key] = value;
36
+ }
37
+ if (tanstack.interruptErrors !== void 0) next["tanstack:interruptErrors"] = tanstack.interruptErrors;
38
+ return next;
39
+ }
40
+ //#endregion
41
+ export { restoreInboundChunk, restorePublicUsage };
42
+
43
+ //# sourceMappingURL=restore-inbound-chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-inbound-chunk.js","names":[],"sources":["../../../src/utilities/restore-inbound-chunk.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { StreamChunk } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\nimport { isTanstackUsage, rebuildTokenUsage } from './ag-ui-usage'\nimport { tanstackMetadata } from './merge-metadata'\n\n/**\n * Rebuild TanStack `TokenUsage` (`promptTokens`) from spec `usage[]` plus\n * leftover fields in `metadata.tanstack.usage`. Restore in-process aliases\n * that the wire does not keep (`toolName`, `TOOL_CALL_END.input`). Mutates\n * in place so WeakMap run-id stamps stay attached.\n */\nexport function restorePublicUsage(chunk: StreamChunk): StreamChunk {\n if (\n (chunk.type === EventType.RUN_FINISHED ||\n chunk.type === EventType.RUN_ERROR) &&\n (Array.isArray(chunk.usage) || isTanstackUsage(chunk.usage))\n ) {\n const rebuilt = rebuildTokenUsage(\n chunk.usage,\n tanstackMetadata(chunk)?.usage,\n )\n if (rebuilt !== undefined) {\n chunk.usage = rebuilt\n }\n }\n\n if (\n chunk.type === EventType.TOOL_CALL_START &&\n chunk.toolName === undefined &&\n chunk.toolCallName\n ) {\n chunk.toolName = chunk.toolCallName\n }\n\n if (chunk.type === EventType.TOOL_CALL_END && chunk.input === undefined) {\n const input = tanstackMetadata(chunk)?.input\n if (input !== undefined) {\n chunk.input = input\n }\n }\n\n return chunk\n}\n\n/**\n * Rebuild the pre-wire chunk shape after SSE/HTTP/WS ingest.\n * Copies `metadata.tanstack` extras back to top-level fields and rebuilds\n * TanStack `TokenUsage` from spec `usage[]` when present.\n */\nexport function restoreInboundChunk(chunk: StreamChunk): AdapterYieldChunk {\n restorePublicUsage(chunk)\n const tanstack = tanstackMetadata(chunk)\n const next = chunk as AdapterYieldChunk & Record<string, unknown>\n\n if (tanstack == null) {\n return next\n }\n\n for (const [key, value] of Object.entries(tanstack)) {\n if (key === 'usage' || key === 'interruptErrors') continue\n if (next[key] === undefined && value !== undefined) {\n next[key] = value\n }\n }\n\n if (tanstack.interruptErrors !== undefined) {\n next['tanstack:interruptErrors'] = tanstack.interruptErrors\n }\n\n return next\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,mBAAmB,OAAiC;CAClE,KACG,MAAM,SAAS,UAAU,gBACxB,MAAM,SAAS,UAAU,eAC1B,MAAM,QAAQ,MAAM,KAAK,KAAK,gBAAgB,MAAM,KAAK,IAC1D;EACA,MAAM,UAAU,kBACd,MAAM,OACN,iBAAiB,KAAK,CAAC,EAAE,KAC3B;EACA,IAAI,YAAY,KAAA,GACd,MAAM,QAAQ;CAElB;CAEA,IACE,MAAM,SAAS,UAAU,mBACzB,MAAM,aAAa,KAAA,KACnB,MAAM,cAEN,MAAM,WAAW,MAAM;CAGzB,IAAI,MAAM,SAAS,UAAU,iBAAiB,MAAM,UAAU,KAAA,GAAW;EACvE,MAAM,QAAQ,iBAAiB,KAAK,CAAC,EAAE;EACvC,IAAI,UAAU,KAAA,GACZ,MAAM,QAAQ;CAElB;CAEA,OAAO;AACT;;;;;;AAOA,SAAgB,oBAAoB,OAAuC;CACzE,mBAAmB,KAAK;CACxB,MAAM,WAAW,iBAAiB,KAAK;CACvC,MAAM,OAAO;CAEb,IAAI,YAAY,MACd,OAAO;CAGT,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAAG;EACnD,IAAI,QAAQ,WAAW,QAAQ,mBAAmB;EAClD,IAAI,KAAK,SAAS,KAAA,KAAa,UAAU,KAAA,GACvC,KAAK,OAAO;CAEhB;CAEA,IAAI,SAAS,oBAAoB,KAAA,GAC/B,KAAK,8BAA8B,SAAS;CAG9C,OAAO;AACT"}
@@ -0,0 +1,2 @@
1
+ export declare function specKeysFor(type: string): ReadonlySet<string>;
2
+ export declare function isSpecTopLevelKey(type: string, key: string): boolean;
@@ -0,0 +1,56 @@
1
+ import { EventType } from "../types.js";
2
+ //#region src/utilities/spec-event-keys.ts
3
+ var SHARED = /* @__PURE__ */ new Set([
4
+ "type",
5
+ "timestamp",
6
+ "rawEvent",
7
+ "metadata"
8
+ ]);
9
+ function keys(...fields) {
10
+ return /* @__PURE__ */ new Set([...SHARED, ...fields]);
11
+ }
12
+ var SPEC_KEYS = /* @__PURE__ */ new Map([
13
+ [EventType.TEXT_MESSAGE_START, keys("messageId", "role", "name")],
14
+ [EventType.TEXT_MESSAGE_CONTENT, keys("messageId", "delta")],
15
+ [EventType.TEXT_MESSAGE_END, keys("messageId")],
16
+ [EventType.TEXT_MESSAGE_CHUNK, keys("messageId", "role", "delta", "name")],
17
+ [EventType.TOOL_CALL_START, keys("toolCallId", "toolCallName", "parentMessageId")],
18
+ [EventType.TOOL_CALL_ARGS, keys("toolCallId", "delta")],
19
+ [EventType.TOOL_CALL_END, keys("toolCallId")],
20
+ [EventType.TOOL_CALL_CHUNK, keys("toolCallId", "toolCallName", "parentMessageId", "delta")],
21
+ [EventType.TOOL_CALL_RESULT, keys("messageId", "toolCallId", "content", "role")],
22
+ [EventType.THINKING_START, keys("title")],
23
+ [EventType.THINKING_END, SHARED],
24
+ [EventType.THINKING_TEXT_MESSAGE_START, SHARED],
25
+ [EventType.THINKING_TEXT_MESSAGE_CONTENT, keys("delta")],
26
+ [EventType.THINKING_TEXT_MESSAGE_END, SHARED],
27
+ [EventType.STATE_SNAPSHOT, keys("snapshot")],
28
+ [EventType.STATE_DELTA, keys("delta")],
29
+ [EventType.MESSAGES_SNAPSHOT, keys("messages")],
30
+ [EventType.ACTIVITY_SNAPSHOT, keys("messageId", "activityType", "content", "replace")],
31
+ [EventType.ACTIVITY_DELTA, keys("messageId", "activityType", "patch")],
32
+ [EventType.RAW, keys("event", "source")],
33
+ [EventType.CUSTOM, keys("name", "value")],
34
+ [EventType.RUN_STARTED, keys("threadId", "runId", "parentRunId", "input")],
35
+ [EventType.RUN_FINISHED, keys("threadId", "runId", "result", "outcome", "usage")],
36
+ [EventType.RUN_ERROR, keys("message", "code", "usage")],
37
+ [EventType.STEP_STARTED, keys("stepName")],
38
+ [EventType.STEP_FINISHED, keys("stepName")],
39
+ [EventType.REASONING_START, keys("messageId")],
40
+ [EventType.REASONING_MESSAGE_START, keys("messageId", "role")],
41
+ [EventType.REASONING_MESSAGE_CONTENT, keys("messageId", "delta")],
42
+ [EventType.REASONING_MESSAGE_END, keys("messageId")],
43
+ [EventType.REASONING_MESSAGE_CHUNK, keys("messageId", "delta")],
44
+ [EventType.REASONING_END, keys("messageId")],
45
+ [EventType.REASONING_ENCRYPTED_VALUE, keys("subtype", "entityId", "encryptedValue")]
46
+ ]);
47
+ function specKeysFor(type) {
48
+ return SPEC_KEYS.get(type) ?? SHARED;
49
+ }
50
+ function isSpecTopLevelKey(type, key) {
51
+ return specKeysFor(type).has(key);
52
+ }
53
+ //#endregion
54
+ export { isSpecTopLevelKey, specKeysFor };
55
+
56
+ //# sourceMappingURL=spec-event-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-event-keys.js","names":[],"sources":["../../../src/utilities/spec-event-keys.ts"],"sourcesContent":["import { EventType } from '../types'\n\nconst SHARED: ReadonlySet<string> = new Set([\n 'type',\n 'timestamp',\n 'rawEvent',\n 'metadata',\n])\n\nfunction keys(...fields: Array<string>): ReadonlySet<string> {\n return new Set([...SHARED, ...fields])\n}\n\nconst SPEC_KEYS: ReadonlyMap<string, ReadonlySet<string>> = new Map([\n [EventType.TEXT_MESSAGE_START, keys('messageId', 'role', 'name')],\n [EventType.TEXT_MESSAGE_CONTENT, keys('messageId', 'delta')],\n [EventType.TEXT_MESSAGE_END, keys('messageId')],\n [EventType.TEXT_MESSAGE_CHUNK, keys('messageId', 'role', 'delta', 'name')],\n [\n EventType.TOOL_CALL_START,\n keys('toolCallId', 'toolCallName', 'parentMessageId'),\n ],\n [EventType.TOOL_CALL_ARGS, keys('toolCallId', 'delta')],\n [EventType.TOOL_CALL_END, keys('toolCallId')],\n [\n EventType.TOOL_CALL_CHUNK,\n keys('toolCallId', 'toolCallName', 'parentMessageId', 'delta'),\n ],\n [\n EventType.TOOL_CALL_RESULT,\n keys('messageId', 'toolCallId', 'content', 'role'),\n ],\n [EventType.THINKING_START, keys('title')],\n [EventType.THINKING_END, SHARED],\n [EventType.THINKING_TEXT_MESSAGE_START, SHARED],\n [EventType.THINKING_TEXT_MESSAGE_CONTENT, keys('delta')],\n [EventType.THINKING_TEXT_MESSAGE_END, SHARED],\n [EventType.STATE_SNAPSHOT, keys('snapshot')],\n [EventType.STATE_DELTA, keys('delta')],\n [EventType.MESSAGES_SNAPSHOT, keys('messages')],\n [\n EventType.ACTIVITY_SNAPSHOT,\n keys('messageId', 'activityType', 'content', 'replace'),\n ],\n [EventType.ACTIVITY_DELTA, keys('messageId', 'activityType', 'patch')],\n [EventType.RAW, keys('event', 'source')],\n [EventType.CUSTOM, keys('name', 'value')],\n [EventType.RUN_STARTED, keys('threadId', 'runId', 'parentRunId', 'input')],\n [\n EventType.RUN_FINISHED,\n keys('threadId', 'runId', 'result', 'outcome', 'usage'),\n ],\n [EventType.RUN_ERROR, keys('message', 'code', 'usage')],\n [EventType.STEP_STARTED, keys('stepName')],\n [EventType.STEP_FINISHED, keys('stepName')],\n [EventType.REASONING_START, keys('messageId')],\n [EventType.REASONING_MESSAGE_START, keys('messageId', 'role')],\n [EventType.REASONING_MESSAGE_CONTENT, keys('messageId', 'delta')],\n [EventType.REASONING_MESSAGE_END, keys('messageId')],\n [EventType.REASONING_MESSAGE_CHUNK, keys('messageId', 'delta')],\n [EventType.REASONING_END, keys('messageId')],\n [\n EventType.REASONING_ENCRYPTED_VALUE,\n keys('subtype', 'entityId', 'encryptedValue'),\n ],\n])\n\nexport function specKeysFor(type: string): ReadonlySet<string> {\n return SPEC_KEYS.get(type) ?? SHARED\n}\n\nexport function isSpecTopLevelKey(type: string, key: string): boolean {\n return specKeysFor(type).has(key)\n}\n"],"mappings":";;AAEA,IAAM,yBAA8B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,KAAK,GAAG,QAA4C;CAC3D,uBAAO,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;AACvC;AAEA,IAAM,4BAAsD,IAAI,IAAI;CAClE,CAAC,UAAU,oBAAoB,KAAK,aAAa,QAAQ,MAAM,CAAC;CAChE,CAAC,UAAU,sBAAsB,KAAK,aAAa,OAAO,CAAC;CAC3D,CAAC,UAAU,kBAAkB,KAAK,WAAW,CAAC;CAC9C,CAAC,UAAU,oBAAoB,KAAK,aAAa,QAAQ,SAAS,MAAM,CAAC;CACzE,CACE,UAAU,iBACV,KAAK,cAAc,gBAAgB,iBAAiB,CACtD;CACA,CAAC,UAAU,gBAAgB,KAAK,cAAc,OAAO,CAAC;CACtD,CAAC,UAAU,eAAe,KAAK,YAAY,CAAC;CAC5C,CACE,UAAU,iBACV,KAAK,cAAc,gBAAgB,mBAAmB,OAAO,CAC/D;CACA,CACE,UAAU,kBACV,KAAK,aAAa,cAAc,WAAW,MAAM,CACnD;CACA,CAAC,UAAU,gBAAgB,KAAK,OAAO,CAAC;CACxC,CAAC,UAAU,cAAc,MAAM;CAC/B,CAAC,UAAU,6BAA6B,MAAM;CAC9C,CAAC,UAAU,+BAA+B,KAAK,OAAO,CAAC;CACvD,CAAC,UAAU,2BAA2B,MAAM;CAC5C,CAAC,UAAU,gBAAgB,KAAK,UAAU,CAAC;CAC3C,CAAC,UAAU,aAAa,KAAK,OAAO,CAAC;CACrC,CAAC,UAAU,mBAAmB,KAAK,UAAU,CAAC;CAC9C,CACE,UAAU,mBACV,KAAK,aAAa,gBAAgB,WAAW,SAAS,CACxD;CACA,CAAC,UAAU,gBAAgB,KAAK,aAAa,gBAAgB,OAAO,CAAC;CACrE,CAAC,UAAU,KAAK,KAAK,SAAS,QAAQ,CAAC;CACvC,CAAC,UAAU,QAAQ,KAAK,QAAQ,OAAO,CAAC;CACxC,CAAC,UAAU,aAAa,KAAK,YAAY,SAAS,eAAe,OAAO,CAAC;CACzE,CACE,UAAU,cACV,KAAK,YAAY,SAAS,UAAU,WAAW,OAAO,CACxD;CACA,CAAC,UAAU,WAAW,KAAK,WAAW,QAAQ,OAAO,CAAC;CACtD,CAAC,UAAU,cAAc,KAAK,UAAU,CAAC;CACzC,CAAC,UAAU,eAAe,KAAK,UAAU,CAAC;CAC1C,CAAC,UAAU,iBAAiB,KAAK,WAAW,CAAC;CAC7C,CAAC,UAAU,yBAAyB,KAAK,aAAa,MAAM,CAAC;CAC7D,CAAC,UAAU,2BAA2B,KAAK,aAAa,OAAO,CAAC;CAChE,CAAC,UAAU,uBAAuB,KAAK,WAAW,CAAC;CACnD,CAAC,UAAU,yBAAyB,KAAK,aAAa,OAAO,CAAC;CAC9D,CAAC,UAAU,eAAe,KAAK,WAAW,CAAC;CAC3C,CACE,UAAU,2BACV,KAAK,WAAW,YAAY,gBAAgB,CAC9C;AACF,CAAC;AAED,SAAgB,YAAY,MAAmC;CAC7D,OAAO,UAAU,IAAI,IAAI,KAAK;AAChC;AAEA,SAAgB,kBAAkB,MAAc,KAAsB;CACpE,OAAO,YAAY,IAAI,CAAC,CAAC,IAAI,GAAG;AAClC"}
@@ -1,11 +1,11 @@
1
- import { StreamChunk } from '../types.js';
1
+ import { AdapterYieldChunk } from './adapter-yield-chunk.js';
2
2
  export declare function structuredOutputStartChunk(args: {
3
3
  messageId: string;
4
4
  model: string;
5
5
  threadId: string;
6
6
  runId: string;
7
7
  timestamp?: number;
8
- }): StreamChunk;
8
+ }): AdapterYieldChunk;
9
9
  export declare function structuredOutputCompleteChunk(args: {
10
10
  messageId: string;
11
11
  model: string;
@@ -14,4 +14,4 @@ export declare function structuredOutputCompleteChunk(args: {
14
14
  object: unknown;
15
15
  raw: string;
16
16
  timestamp?: number;
17
- }): StreamChunk;
17
+ }): AdapterYieldChunk;
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output-events.js","names":[],"sources":["../../../src/utilities/structured-output-events.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { StreamChunk } from '../types'\n\nexport function structuredOutputStartChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n timestamp?: number\n}): StreamChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.start',\n value: { messageId: args.messageId },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n\nexport function structuredOutputCompleteChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n object: unknown\n raw: string\n timestamp?: number\n}): StreamChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.complete',\n value: {\n object: args.object,\n raw: args.raw,\n messageId: args.messageId,\n },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n"],"mappings":";;AAGA,SAAgB,2BAA2B,MAM3B;CACd,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO,EAAE,WAAW,KAAK,UAAU;EACnC,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF;AAEA,SAAgB,8BAA8B,MAQ9B;CACd,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO;GACL,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,WAAW,KAAK;EAClB;EACA,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"structured-output-events.js","names":[],"sources":["../../../src/utilities/structured-output-events.ts"],"sourcesContent":["import { EventType } from '../types'\nimport type { AdapterYieldChunk } from './adapter-yield-chunk'\n\nexport function structuredOutputStartChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n timestamp?: number\n}): AdapterYieldChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.start',\n value: { messageId: args.messageId },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n\nexport function structuredOutputCompleteChunk(args: {\n messageId: string\n model: string\n threadId: string\n runId: string\n object: unknown\n raw: string\n timestamp?: number\n}): AdapterYieldChunk {\n return {\n type: EventType.CUSTOM,\n name: 'structured-output.complete',\n value: {\n object: args.object,\n raw: args.raw,\n messageId: args.messageId,\n },\n model: args.model,\n timestamp: args.timestamp ?? Date.now(),\n threadId: args.threadId,\n runId: args.runId,\n }\n}\n"],"mappings":";;AAGA,SAAgB,2BAA2B,MAMrB;CACpB,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO,EAAE,WAAW,KAAK,UAAU;EACnC,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF;AAEA,SAAgB,8BAA8B,MAQxB;CACpB,OAAO;EACL,MAAM,UAAU;EAChB,MAAM;EACN,OAAO;GACL,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,WAAW,KAAK;EAClB;EACA,OAAO,KAAK;EACZ,WAAW,KAAK,aAAa,KAAK,IAAI;EACtC,UAAU,KAAK;EACf,OAAO,KAAK;CACd;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/ai",
3
- "version": "0.47.2",
3
+ "version": "0.48.0",
4
4
  "description": "Type-safe TypeScript AI SDK for streaming chat, tool calling, agents, structured outputs, and multimodal generation.",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -80,8 +80,8 @@
80
80
  "@ag-ui/core": "0.1.1-canary.beta.0",
81
81
  "@standard-schema/spec": "^1.1.0",
82
82
  "partial-json": "^0.1.7",
83
- "@tanstack/ai-utils": "^0.4.0",
84
- "@tanstack/ai-event-client": "^0.9.0"
83
+ "@tanstack/ai-event-client": "^0.10.0",
84
+ "@tanstack/ai-utils": "^0.4.0"
85
85
  },
86
86
  "peerDependencies": {
87
87
  "@opentelemetry/api": ">=1.9.0"
@@ -2,10 +2,10 @@ import type {
2
2
  DefaultMessageMetadataByModality,
3
3
  JSONSchema,
4
4
  Modality,
5
- StreamChunk,
6
5
  TextOptions,
7
6
  TokenUsage,
8
7
  } from '../../types'
8
+ import type { AdapterYieldChunk } from '../../utilities/adapter-yield-chunk'
9
9
  import type { CapabilityHandle } from './middleware/capabilities'
10
10
 
11
11
  /**
@@ -106,7 +106,7 @@ export interface TextAdapter<
106
106
  */
107
107
  chatStream: (
108
108
  options: TextOptions<TProviderOptions>,
109
- ) => AsyncIterable<StreamChunk>
109
+ ) => AsyncIterable<AdapterYieldChunk>
110
110
 
111
111
  /**
112
112
  * Generate structured output using the provider's native structured output API.
@@ -136,7 +136,7 @@ export interface TextAdapter<
136
136
  */
137
137
  structuredOutputStream?: (
138
138
  options: StructuredOutputOptions<TProviderOptions>,
139
- ) => AsyncIterable<StreamChunk>
139
+ ) => AsyncIterable<AdapterYieldChunk>
140
140
 
141
141
  /**
142
142
  * Declares whether the adapter supports combining `tools` and a
@@ -229,7 +229,7 @@ export abstract class BaseTextAdapter<
229
229
 
230
230
  abstract chatStream(
231
231
  options: TextOptions<TProviderOptions>,
232
- ): AsyncIterable<StreamChunk>
232
+ ): AsyncIterable<AdapterYieldChunk>
233
233
 
234
234
  /**
235
235
  * Generate structured output using the provider's native structured output API.