@tanstack/ai 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/esm/base-adapter.d.ts +35 -0
  4. package/dist/esm/base-adapter.js +12 -0
  5. package/dist/esm/base-adapter.js.map +1 -0
  6. package/dist/esm/core/chat-common-options.d.ts +52 -0
  7. package/dist/esm/core/chat.d.ts +30 -0
  8. package/dist/esm/core/chat.js +533 -0
  9. package/dist/esm/core/chat.js.map +1 -0
  10. package/dist/esm/core/embedding.d.ts +8 -0
  11. package/dist/esm/core/embedding.js +33 -0
  12. package/dist/esm/core/embedding.js.map +1 -0
  13. package/dist/esm/core/summarize.d.ts +9 -0
  14. package/dist/esm/core/summarize.js +36 -0
  15. package/dist/esm/core/summarize.js.map +1 -0
  16. package/dist/esm/event-client.d.ts +311 -0
  17. package/dist/esm/event-client.js +62 -0
  18. package/dist/esm/event-client.js.map +1 -0
  19. package/dist/esm/index.d.ts +16 -0
  20. package/dist/esm/index.js +50 -0
  21. package/dist/esm/index.js.map +1 -0
  22. package/dist/esm/message-converters.d.ts +52 -0
  23. package/dist/esm/message-converters.js +162 -0
  24. package/dist/esm/message-converters.js.map +1 -0
  25. package/dist/esm/stream/index.d.ts +11 -0
  26. package/dist/esm/stream/json-parser.d.ts +38 -0
  27. package/dist/esm/stream/json-parser.js +28 -0
  28. package/dist/esm/stream/json-parser.js.map +1 -0
  29. package/dist/esm/stream/message-updaters.d.ts +44 -0
  30. package/dist/esm/stream/message-updaters.js +141 -0
  31. package/dist/esm/stream/message-updaters.js.map +1 -0
  32. package/dist/esm/stream/processor.d.ts +242 -0
  33. package/dist/esm/stream/processor.js +693 -0
  34. package/dist/esm/stream/processor.js.map +1 -0
  35. package/dist/esm/stream/strategies.d.ts +43 -0
  36. package/dist/esm/stream/strategies.js +54 -0
  37. package/dist/esm/stream/strategies.js.map +1 -0
  38. package/dist/esm/stream/types.d.ts +71 -0
  39. package/dist/esm/tools/tool-calls.d.ts +112 -0
  40. package/dist/esm/tools/tool-calls.js +302 -0
  41. package/dist/esm/tools/tool-calls.js.map +1 -0
  42. package/dist/esm/tools/tool-definition.d.ts +125 -0
  43. package/dist/esm/tools/tool-definition.js +25 -0
  44. package/dist/esm/tools/tool-definition.js.map +1 -0
  45. package/dist/esm/tools/zod-converter.d.ts +30 -0
  46. package/dist/esm/tools/zod-converter.js +36 -0
  47. package/dist/esm/tools/zod-converter.js.map +1 -0
  48. package/dist/esm/types.d.ts +619 -0
  49. package/dist/esm/utilities/agent-loop-strategies.d.ts +59 -0
  50. package/dist/esm/utilities/agent-loop-strategies.js +23 -0
  51. package/dist/esm/utilities/agent-loop-strategies.js.map +1 -0
  52. package/dist/esm/utilities/chat-options.d.ts +6 -0
  53. package/dist/esm/utilities/chat-options.js +7 -0
  54. package/dist/esm/utilities/chat-options.js.map +1 -0
  55. package/dist/esm/utilities/messages.d.ts +30 -0
  56. package/dist/esm/utilities/messages.js +7 -0
  57. package/dist/esm/utilities/messages.js.map +1 -0
  58. package/dist/esm/utilities/stream-to-response.d.ts +48 -0
  59. package/dist/esm/utilities/stream-to-response.js +62 -0
  60. package/dist/esm/utilities/stream-to-response.js.map +1 -0
  61. package/package.json +65 -0
  62. package/src/base-adapter.ts +85 -0
  63. package/src/core/chat-common-options.ts +55 -0
  64. package/src/core/chat.ts +771 -0
  65. package/src/core/embedding.ts +54 -0
  66. package/src/core/summarize.ts +56 -0
  67. package/src/event-client.ts +389 -0
  68. package/src/index.ts +68 -0
  69. package/src/message-converters.ts +285 -0
  70. package/src/stream/index.ts +41 -0
  71. package/src/stream/json-parser.ts +58 -0
  72. package/src/stream/message-updaters.ts +275 -0
  73. package/src/stream/processor.ts +1092 -0
  74. package/src/stream/strategies.ts +78 -0
  75. package/src/stream/types.ts +94 -0
  76. package/src/tools/tool-calls.ts +471 -0
  77. package/src/tools/tool-definition.ts +206 -0
  78. package/src/tools/zod-converter.ts +85 -0
  79. package/src/types.ts +872 -0
  80. package/src/utilities/agent-loop-strategies.ts +85 -0
  81. package/src/utilities/chat-options.ts +35 -0
  82. package/src/utilities/messages.ts +63 -0
  83. package/src/utilities/stream-to-response.ts +116 -0
@@ -0,0 +1,36 @@
1
+ import { aiEventClient } from "../event-client.js";
2
+ function createId(prefix) {
3
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
4
+ }
5
+ async function summarize(options) {
6
+ const { adapter, model, text, ...restOptions } = options;
7
+ const requestId = createId("summarize");
8
+ const inputLength = text.length;
9
+ const startTime = Date.now();
10
+ aiEventClient.emit("summarize:started", {
11
+ requestId,
12
+ model,
13
+ inputLength,
14
+ timestamp: startTime
15
+ });
16
+ const result = await adapter.summarize({
17
+ ...restOptions,
18
+ text,
19
+ model
20
+ });
21
+ const duration = Date.now() - startTime;
22
+ const outputLength = result.summary.length;
23
+ aiEventClient.emit("summarize:completed", {
24
+ requestId,
25
+ model,
26
+ inputLength,
27
+ outputLength,
28
+ duration,
29
+ timestamp: Date.now()
30
+ });
31
+ return result;
32
+ }
33
+ export {
34
+ summarize
35
+ };
36
+ //# sourceMappingURL=summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","sources":["../../../src/core/summarize.ts"],"sourcesContent":["import { aiEventClient } from '../event-client.js'\nimport type {\n AIAdapter,\n ExtractModelsFromAdapter,\n SummarizationOptions,\n SummarizationResult,\n} from '../types'\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Standalone summarize function with type inference from adapter\n */\nexport async function summarize<\n TAdapter extends AIAdapter<any, any, any, any, any>,\n>(\n options: Omit<SummarizationOptions, 'model'> & {\n adapter: TAdapter\n model: ExtractModelsFromAdapter<TAdapter>\n text: string\n },\n): Promise<SummarizationResult> {\n const { adapter, model, text, ...restOptions } = options\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n\n aiEventClient.emit('summarize:started', {\n requestId,\n model: model as string,\n inputLength,\n timestamp: startTime,\n })\n\n const result = await adapter.summarize({\n ...restOptions,\n text,\n model: model as string,\n })\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:completed', {\n requestId,\n model: model as string,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n return result\n}\n"],"names":[],"mappings":";AAQA,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAKA,eAAsB,UAGpB,SAK8B;AAC9B,QAAM,EAAE,SAAS,OAAO,MAAM,GAAG,gBAAgB;AACjD,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,KAAK,IAAA;AAEvB,gBAAc,KAAK,qBAAqB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EAAA,CACZ;AAED,QAAM,SAAS,MAAM,QAAQ,UAAU;AAAA,IACrC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,QAAM,eAAe,OAAO,QAAQ;AAEpC,gBAAc,KAAK,uBAAuB;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,EAAI,CACrB;AAED,SAAO;AACT;"}
@@ -0,0 +1,311 @@
1
+ import { EventClient } from '@tanstack/devtools-event-client';
2
+ /**
3
+ * Tool call states - track the lifecycle of a tool call
4
+ * Must match @tanstack/ai-client ToolCallState
5
+ */
6
+ type ToolCallState = 'awaiting-input' | 'input-streaming' | 'input-complete' | 'approval-requested' | 'approval-responded';
7
+ /**
8
+ * Tool result states - track the lifecycle of a tool result
9
+ * Must match @tanstack/ai-client ToolResultState
10
+ */
11
+ type ToolResultState = 'streaming' | 'complete' | 'error';
12
+ export interface AIDevtoolsEventMap {
13
+ 'tanstack-ai-devtools:stream:started': {
14
+ streamId: string;
15
+ model: string;
16
+ provider: string;
17
+ timestamp: number;
18
+ clientId?: string;
19
+ };
20
+ 'tanstack-ai-devtools:stream:chunk:content': {
21
+ streamId: string;
22
+ messageId?: string;
23
+ content: string;
24
+ delta?: string;
25
+ timestamp: number;
26
+ };
27
+ 'tanstack-ai-devtools:stream:chunk:tool-call': {
28
+ streamId: string;
29
+ messageId?: string;
30
+ toolCallId: string;
31
+ toolName: string;
32
+ index: number;
33
+ arguments: string;
34
+ timestamp: number;
35
+ };
36
+ 'tanstack-ai-devtools:stream:chunk:tool-result': {
37
+ streamId: string;
38
+ messageId?: string;
39
+ toolCallId: string;
40
+ result: string;
41
+ timestamp: number;
42
+ };
43
+ 'tanstack-ai-devtools:stream:chunk:done': {
44
+ streamId: string;
45
+ messageId?: string;
46
+ finishReason: string | null;
47
+ usage?: {
48
+ promptTokens: number;
49
+ completionTokens: number;
50
+ totalTokens: number;
51
+ };
52
+ timestamp: number;
53
+ };
54
+ 'tanstack-ai-devtools:stream:chunk:error': {
55
+ streamId: string;
56
+ messageId?: string;
57
+ error: string;
58
+ timestamp: number;
59
+ };
60
+ 'tanstack-ai-devtools:stream:chunk:thinking': {
61
+ streamId: string;
62
+ messageId?: string;
63
+ content: string;
64
+ delta?: string;
65
+ timestamp: number;
66
+ };
67
+ 'tanstack-ai-devtools:stream:approval-requested': {
68
+ streamId: string;
69
+ messageId?: string;
70
+ toolCallId: string;
71
+ toolName: string;
72
+ input: any;
73
+ approvalId: string;
74
+ timestamp: number;
75
+ };
76
+ 'tanstack-ai-devtools:stream:tool-input-available': {
77
+ streamId: string;
78
+ messageId?: string;
79
+ toolCallId: string;
80
+ toolName: string;
81
+ input: any;
82
+ timestamp: number;
83
+ };
84
+ 'tanstack-ai-devtools:tool:call-completed': {
85
+ requestId: string;
86
+ streamId: string;
87
+ messageId?: string;
88
+ toolCallId: string;
89
+ toolName: string;
90
+ result: any;
91
+ duration: number;
92
+ timestamp: number;
93
+ };
94
+ 'tanstack-ai-devtools:stream:ended': {
95
+ requestId: string;
96
+ streamId: string;
97
+ totalChunks: number;
98
+ duration: number;
99
+ timestamp: number;
100
+ };
101
+ 'tanstack-ai-devtools:chat:started': {
102
+ requestId: string;
103
+ streamId: string;
104
+ provider: string;
105
+ model: string;
106
+ messageCount: number;
107
+ hasTools: boolean;
108
+ streaming: boolean;
109
+ timestamp: number;
110
+ clientId?: string;
111
+ toolNames?: Array<string>;
112
+ options?: Record<string, unknown>;
113
+ providerOptions?: Record<string, unknown>;
114
+ };
115
+ 'tanstack-ai-devtools:chat:completed': {
116
+ requestId: string;
117
+ streamId: string;
118
+ model: string;
119
+ content: string;
120
+ messageId?: string;
121
+ finishReason?: string;
122
+ usage?: {
123
+ promptTokens: number;
124
+ completionTokens: number;
125
+ totalTokens: number;
126
+ };
127
+ timestamp: number;
128
+ };
129
+ 'tanstack-ai-devtools:chat:iteration': {
130
+ requestId: string;
131
+ streamId: string;
132
+ iterationNumber: number;
133
+ messageCount: number;
134
+ toolCallCount: number;
135
+ timestamp: number;
136
+ };
137
+ 'tanstack-ai-devtools:usage:tokens': {
138
+ requestId: string;
139
+ streamId: string;
140
+ model: string;
141
+ messageId?: string;
142
+ usage: {
143
+ promptTokens: number;
144
+ completionTokens: number;
145
+ totalTokens: number;
146
+ };
147
+ timestamp: number;
148
+ };
149
+ 'tanstack-ai-devtools:embedding:started': {
150
+ requestId: string;
151
+ model: string;
152
+ inputCount: number;
153
+ timestamp: number;
154
+ clientId?: string;
155
+ };
156
+ 'tanstack-ai-devtools:embedding:completed': {
157
+ requestId: string;
158
+ model: string;
159
+ inputCount: number;
160
+ duration: number;
161
+ timestamp: number;
162
+ };
163
+ 'tanstack-ai-devtools:summarize:started': {
164
+ requestId: string;
165
+ model: string;
166
+ inputLength: number;
167
+ timestamp: number;
168
+ clientId?: string;
169
+ };
170
+ 'tanstack-ai-devtools:summarize:completed': {
171
+ requestId: string;
172
+ model: string;
173
+ inputLength: number;
174
+ outputLength: number;
175
+ duration: number;
176
+ timestamp: number;
177
+ };
178
+ 'tanstack-ai-devtools:client:created': {
179
+ clientId: string;
180
+ initialMessageCount: number;
181
+ timestamp: number;
182
+ };
183
+ 'tanstack-ai-devtools:client:message-appended': {
184
+ clientId: string;
185
+ messageId: string;
186
+ role: 'user' | 'assistant' | 'system' | 'tool';
187
+ contentPreview: string;
188
+ timestamp: number;
189
+ };
190
+ 'tanstack-ai-devtools:client:message-sent': {
191
+ clientId: string;
192
+ messageId: string;
193
+ content: string;
194
+ timestamp: number;
195
+ };
196
+ 'tanstack-ai-devtools:client:loading-changed': {
197
+ clientId: string;
198
+ isLoading: boolean;
199
+ timestamp: number;
200
+ };
201
+ 'tanstack-ai-devtools:client:error-changed': {
202
+ clientId: string;
203
+ error: string | null;
204
+ timestamp: number;
205
+ };
206
+ 'tanstack-ai-devtools:client:messages-cleared': {
207
+ clientId: string;
208
+ timestamp: number;
209
+ };
210
+ 'tanstack-ai-devtools:client:reloaded': {
211
+ clientId: string;
212
+ fromMessageIndex: number;
213
+ timestamp: number;
214
+ };
215
+ 'tanstack-ai-devtools:client:stopped': {
216
+ clientId: string;
217
+ timestamp: number;
218
+ };
219
+ 'tanstack-ai-devtools:tool:result-added': {
220
+ clientId: string;
221
+ toolCallId: string;
222
+ toolName: string;
223
+ output: any;
224
+ state: 'output-available' | 'output-error';
225
+ timestamp: number;
226
+ };
227
+ 'tanstack-ai-devtools:tool:approval-responded': {
228
+ clientId: string;
229
+ approvalId: string;
230
+ toolCallId: string;
231
+ approved: boolean;
232
+ timestamp: number;
233
+ };
234
+ 'tanstack-ai-devtools:processor:text-updated': {
235
+ streamId: string;
236
+ content: string;
237
+ timestamp: number;
238
+ };
239
+ 'tanstack-ai-devtools:processor:tool-call-state-changed': {
240
+ streamId: string;
241
+ toolCallId: string;
242
+ toolName: string;
243
+ state: ToolCallState;
244
+ arguments: any;
245
+ timestamp: number;
246
+ };
247
+ 'tanstack-ai-devtools:processor:tool-result-state-changed': {
248
+ streamId: string;
249
+ toolCallId: string;
250
+ content: any;
251
+ state: ToolResultState;
252
+ error?: string;
253
+ timestamp: number;
254
+ };
255
+ 'tanstack-ai-devtools:client:assistant-message-updated': {
256
+ clientId: string;
257
+ messageId: string;
258
+ content: string;
259
+ timestamp: number;
260
+ };
261
+ 'tanstack-ai-devtools:client:tool-call-updated': {
262
+ clientId: string;
263
+ messageId: string;
264
+ toolCallId: string;
265
+ toolName: string;
266
+ state: ToolCallState;
267
+ arguments: any;
268
+ timestamp: number;
269
+ };
270
+ 'tanstack-ai-devtools:client:approval-requested': {
271
+ clientId: string;
272
+ messageId: string;
273
+ toolCallId: string;
274
+ toolName: string;
275
+ input: any;
276
+ approvalId: string;
277
+ timestamp: number;
278
+ };
279
+ }
280
+ type StripPrefix<T extends string> = T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never;
281
+ type EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>;
282
+ declare class AiEventClient extends EventClient<AIDevtoolsEventMap> {
283
+ private eventTarget;
284
+ constructor();
285
+ /**
286
+ * Subscribe to events using both the parent EventClient and EventTarget API
287
+ * @param eventSuffix - The event name without the prefix (e.g., "stream:started")
288
+ * @param handler - The event handler function
289
+ * @param options - Optional configuration for event subscription
290
+ * @returns A function to unsubscribe from the event
291
+ */
292
+ on<TSuffix extends EventSuffix>(eventSuffix: TSuffix, handler: (event: {
293
+ type: `tanstack-ai-devtools:${TSuffix}`;
294
+ payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`];
295
+ }) => void, options?: {
296
+ withEventTarget?: boolean;
297
+ }): () => void;
298
+ /**
299
+ * Emit an event to both the parent EventClient and the EventTarget
300
+ * @param eventSuffix - The event name without the prefix (e.g., "stream:started")
301
+ * @param data - The event data
302
+ */
303
+ emit<TSuffix extends EventSuffix>(eventSuffix: TSuffix, data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]): void;
304
+ /**
305
+ * Get the underlying EventTarget for advanced use cases
306
+ * @returns The EventTarget instance
307
+ */
308
+ getEventTarget(): EventTarget;
309
+ }
310
+ declare const aiEventClient: AiEventClient;
311
+ export { aiEventClient };
@@ -0,0 +1,62 @@
1
+ import { EventClient } from "@tanstack/devtools-event-client";
2
+ class AiEventClient extends EventClient {
3
+ constructor() {
4
+ super({
5
+ pluginId: "tanstack-ai-devtools"
6
+ });
7
+ this.eventTarget = new EventTarget();
8
+ }
9
+ /**
10
+ * Subscribe to events using both the parent EventClient and EventTarget API
11
+ * @param eventSuffix - The event name without the prefix (e.g., "stream:started")
12
+ * @param handler - The event handler function
13
+ * @param options - Optional configuration for event subscription
14
+ * @returns A function to unsubscribe from the event
15
+ */
16
+ on(eventSuffix, handler, options) {
17
+ const parentUnsubscribe = super.on(eventSuffix, handler);
18
+ const withEventTarget = options?.withEventTarget ?? true;
19
+ let eventListener;
20
+ if (withEventTarget) {
21
+ eventListener = (event) => {
22
+ if (event instanceof CustomEvent) {
23
+ handler({
24
+ type: `${eventSuffix}`,
25
+ payload: event.detail
26
+ });
27
+ }
28
+ };
29
+ this.eventTarget.addEventListener(eventSuffix, eventListener);
30
+ }
31
+ return () => {
32
+ parentUnsubscribe();
33
+ if (withEventTarget && eventListener) {
34
+ this.eventTarget.removeEventListener(eventSuffix, eventListener);
35
+ }
36
+ };
37
+ }
38
+ /**
39
+ * Emit an event to both the parent EventClient and the EventTarget
40
+ * @param eventSuffix - The event name without the prefix (e.g., "stream:started")
41
+ * @param data - The event data
42
+ */
43
+ emit(eventSuffix, data) {
44
+ super.emit(eventSuffix, data);
45
+ const customEvent = new CustomEvent(eventSuffix, {
46
+ detail: data
47
+ });
48
+ this.eventTarget.dispatchEvent(customEvent);
49
+ }
50
+ /**
51
+ * Get the underlying EventTarget for advanced use cases
52
+ * @returns The EventTarget instance
53
+ */
54
+ getEventTarget() {
55
+ return this.eventTarget;
56
+ }
57
+ }
58
+ const aiEventClient = new AiEventClient();
59
+ export {
60
+ aiEventClient
61
+ };
62
+ //# sourceMappingURL=event-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-client.js","sources":["../../src/event-client.ts"],"sourcesContent":["import { EventClient } from '@tanstack/devtools-event-client'\n\n/**\n * Tool call states - track the lifecycle of a tool call\n * Must match @tanstack/ai-client ToolCallState\n */\ntype ToolCallState =\n | 'awaiting-input' // Received start but no arguments yet\n | 'input-streaming' // Partial arguments received\n | 'input-complete' // All arguments received\n | 'approval-requested' // Waiting for user approval\n | 'approval-responded' // User has approved/denied\n\n/**\n * Tool result states - track the lifecycle of a tool result\n * Must match @tanstack/ai-client ToolResultState\n */\ntype ToolResultState =\n | 'streaming' // Placeholder for future streamed output\n | 'complete' // Result is complete\n | 'error' // Error occurred\n\nexport interface AIDevtoolsEventMap {\n // AI Stream events - from @tanstack/ai package\n 'tanstack-ai-devtools:stream:started': {\n streamId: string\n model: string\n provider: string\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:stream:chunk:content': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-call': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n index: number\n arguments: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-result': {\n streamId: string\n messageId?: string\n toolCallId: string\n result: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:done': {\n streamId: string\n messageId?: string\n finishReason: string | null\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:error': {\n streamId: string\n messageId?: string\n error: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:thinking': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:approval-requested': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:tool-input-available': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:call-completed': {\n requestId: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n result: any\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:ended': {\n requestId: string\n streamId: string\n totalChunks: number\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:chat:started': {\n requestId: string\n streamId: string\n provider: string\n model: string\n messageCount: number\n hasTools: boolean\n streaming: boolean\n timestamp: number\n clientId?: string\n toolNames?: Array<string>\n options?: Record<string, unknown>\n providerOptions?: Record<string, unknown>\n }\n 'tanstack-ai-devtools:chat:completed': {\n requestId: string\n streamId: string\n model: string\n content: string\n messageId?: string\n finishReason?: string\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:chat:iteration': {\n requestId: string\n streamId: string\n iterationNumber: number\n messageCount: number\n toolCallCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:usage:tokens': {\n requestId: string\n streamId: string\n model: string\n messageId?: string\n usage: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n\n // Embedding events\n 'tanstack-ai-devtools:embedding:started': {\n requestId: string\n model: string\n inputCount: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:embedding:completed': {\n requestId: string\n model: string\n inputCount: number\n duration: number\n timestamp: number\n }\n\n // Summarize events\n 'tanstack-ai-devtools:summarize:started': {\n requestId: string\n model: string\n inputLength: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:summarize:completed': {\n requestId: string\n model: string\n inputLength: number\n outputLength: number\n duration: number\n timestamp: number\n }\n\n // Chat Client events - from @tanstack/ai-client package\n 'tanstack-ai-devtools:client:created': {\n clientId: string\n initialMessageCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-appended': {\n clientId: string\n messageId: string\n role: 'user' | 'assistant' | 'system' | 'tool'\n contentPreview: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-sent': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:loading-changed': {\n clientId: string\n isLoading: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:client:error-changed': {\n clientId: string\n error: string | null\n timestamp: number\n }\n 'tanstack-ai-devtools:client:messages-cleared': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:reloaded': {\n clientId: string\n fromMessageIndex: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:stopped': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:result-added': {\n clientId: string\n toolCallId: string\n toolName: string\n output: any\n state: 'output-available' | 'output-error'\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:approval-responded': {\n clientId: string\n approvalId: string\n toolCallId: string\n approved: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:text-updated': {\n streamId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-call-state-changed': {\n streamId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-result-state-changed': {\n streamId: string\n toolCallId: string\n content: any\n state: ToolResultState\n error?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:assistant-message-updated': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:tool-call-updated': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:client:approval-requested': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n}\n\n// Helper type to strip the prefix at the type level\ntype StripPrefix<T extends string> =\n T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never\n\n// Get all event names without the prefix\ntype EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>\n\nclass AiEventClient extends EventClient<AIDevtoolsEventMap> {\n private eventTarget: EventTarget\n\n constructor() {\n super({\n pluginId: 'tanstack-ai-devtools',\n })\n this.eventTarget = new EventTarget()\n }\n\n /**\n * Subscribe to events using both the parent EventClient and EventTarget API\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param handler - The event handler function\n * @param options - Optional configuration for event subscription\n * @returns A function to unsubscribe from the event\n */\n override on<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n handler: (event: {\n type: `tanstack-ai-devtools:${TSuffix}`\n payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]\n }) => void,\n options?: { withEventTarget?: boolean },\n ): () => void {\n const parentUnsubscribe = super.on(eventSuffix, handler)\n\n const withEventTarget = options?.withEventTarget ?? true\n let eventListener: ((event: Event) => void) | undefined\n\n if (withEventTarget) {\n // Create a wrapper to handle CustomEvent for EventTarget\n eventListener = (event: Event) => {\n if (event instanceof CustomEvent) {\n handler({\n type: `${eventSuffix}` as `tanstack-ai-devtools:${TSuffix}`,\n payload: event.detail,\n })\n }\n }\n\n // Add listener to EventTarget\n this.eventTarget.addEventListener(eventSuffix, eventListener)\n }\n\n // Return unsubscribe function that cleans up both subscriptions\n return () => {\n parentUnsubscribe()\n if (withEventTarget && eventListener) {\n this.eventTarget.removeEventListener(eventSuffix, eventListener)\n }\n }\n }\n\n /**\n * Emit an event to both the parent EventClient and the EventTarget\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param data - The event data\n */\n override emit<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`],\n ): void {\n super.emit(eventSuffix, data)\n\n // Always dispatch to EventTarget (for local listeners)\n const customEvent = new CustomEvent(eventSuffix, {\n detail: data,\n })\n this.eventTarget.dispatchEvent(customEvent)\n }\n\n /**\n * Get the underlying EventTarget for advanced use cases\n * @returns The EventTarget instance\n */\n getEventTarget(): EventTarget {\n return this.eventTarget\n }\n}\n\nconst aiEventClient = new AiEventClient()\n\nexport { aiEventClient }\n"],"names":[],"mappings":";AAiTA,MAAM,sBAAsB,YAAgC;AAAA,EAG1D,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU;AAAA,IAAA,CACX;AACD,SAAK,cAAc,IAAI,YAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,GACP,aACA,SAIA,SACY;AACZ,UAAM,oBAAoB,MAAM,GAAG,aAAa,OAAO;AAEvD,UAAM,kBAAkB,SAAS,mBAAmB;AACpD,QAAI;AAEJ,QAAI,iBAAiB;AAEnB,sBAAgB,CAAC,UAAiB;AAChC,YAAI,iBAAiB,aAAa;AAChC,kBAAQ;AAAA,YACN,MAAM,GAAG,WAAW;AAAA,YACpB,SAAS,MAAM;AAAA,UAAA,CAChB;AAAA,QACH;AAAA,MACF;AAGA,WAAK,YAAY,iBAAiB,aAAa,aAAa;AAAA,IAC9D;AAGA,WAAO,MAAM;AACX,wBAAA;AACA,UAAI,mBAAmB,eAAe;AACpC,aAAK,YAAY,oBAAoB,aAAa,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,KACP,aACA,MACM;AACN,UAAM,KAAK,aAAa,IAAI;AAG5B,UAAM,cAAc,IAAI,YAAY,aAAa;AAAA,MAC/C,QAAQ;AAAA,IAAA,CACT;AACD,SAAK,YAAY,cAAc,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AACF;AAEA,MAAM,gBAAgB,IAAI,cAAA;"}
@@ -0,0 +1,16 @@
1
+ export { chat } from './core/chat.js';
2
+ export { summarize } from './core/summarize.js';
3
+ export { embedding } from './core/embedding.js';
4
+ export { toolDefinition, type ToolDefinition, type ToolDefinitionInstance, type ToolDefinitionConfig, type ServerTool, type ClientTool, type AnyClientTool, type InferToolName, type InferToolInput, type InferToolOutput, } from './tools/tool-definition.js';
5
+ export { convertZodToJsonSchema } from './tools/zod-converter.js';
6
+ export { toServerSentEventsStream, toStreamResponse, } from './utilities/stream-to-response.js';
7
+ export { BaseAdapter } from './base-adapter.js';
8
+ export { ToolCallManager } from './tools/tool-calls.js';
9
+ export { maxIterations, untilFinishReason, combineStrategies, } from './utilities/agent-loop-strategies.js';
10
+ export * from './types.js';
11
+ export { chatOptions } from './utilities/chat-options.js';
12
+ export { messages } from './utilities/messages.js';
13
+ export { aiEventClient } from './event-client.js';
14
+ export { convertMessagesToModelMessages, uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, generateMessageId, } from './message-converters.js';
15
+ export { StreamProcessor, createReplayStream, ImmediateStrategy, PunctuationStrategy, BatchStrategy, WordBoundaryStrategy, CompositeStrategy, PartialJSONParser, defaultJSONParser, parsePartialJSON, } from './stream.js';
16
+ export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorHandlers, StreamProcessorOptions, ToolCallState, ToolResultState, JSONParser, } from './stream.js';
@@ -0,0 +1,50 @@
1
+ import { chat } from "./core/chat.js";
2
+ import { summarize } from "./core/summarize.js";
3
+ import { embedding } from "./core/embedding.js";
4
+ import { toolDefinition } from "./tools/tool-definition.js";
5
+ import { convertZodToJsonSchema } from "./tools/zod-converter.js";
6
+ import { toServerSentEventsStream, toStreamResponse } from "./utilities/stream-to-response.js";
7
+ import { BaseAdapter } from "./base-adapter.js";
8
+ import { ToolCallManager } from "./tools/tool-calls.js";
9
+ import { combineStrategies, maxIterations, untilFinishReason } from "./utilities/agent-loop-strategies.js";
10
+ import { chatOptions } from "./utilities/chat-options.js";
11
+ import { messages } from "./utilities/messages.js";
12
+ import { aiEventClient } from "./event-client.js";
13
+ import { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages } from "./message-converters.js";
14
+ import { StreamProcessor, createReplayStream } from "./stream/processor.js";
15
+ import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./stream/strategies.js";
16
+ import { PartialJSONParser, defaultJSONParser, parsePartialJSON } from "./stream/json-parser.js";
17
+ export {
18
+ BaseAdapter,
19
+ BatchStrategy,
20
+ CompositeStrategy,
21
+ ImmediateStrategy,
22
+ PartialJSONParser,
23
+ PunctuationStrategy,
24
+ StreamProcessor,
25
+ ToolCallManager,
26
+ WordBoundaryStrategy,
27
+ aiEventClient,
28
+ chat,
29
+ chatOptions,
30
+ combineStrategies,
31
+ convertMessagesToModelMessages,
32
+ convertZodToJsonSchema,
33
+ createReplayStream,
34
+ defaultJSONParser,
35
+ embedding,
36
+ generateMessageId,
37
+ maxIterations,
38
+ messages,
39
+ modelMessageToUIMessage,
40
+ modelMessagesToUIMessages,
41
+ normalizeToUIMessage,
42
+ parsePartialJSON,
43
+ summarize,
44
+ toServerSentEventsStream,
45
+ toStreamResponse,
46
+ toolDefinition,
47
+ uiMessageToModelMessages,
48
+ untilFinishReason
49
+ };
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
@@ -0,0 +1,52 @@
1
+ import { ModelMessage, UIMessage } from './types.js';
2
+ /**
3
+ * Convert UIMessages or ModelMessages to ModelMessages
4
+ */
5
+ export declare function convertMessagesToModelMessages(messages: Array<UIMessage | ModelMessage>): Array<ModelMessage>;
6
+ /**
7
+ * Convert a UIMessage to ModelMessage(s)
8
+ *
9
+ * This conversion handles the parts-based structure:
10
+ * - Text parts → content field
11
+ * - ToolCall parts → toolCalls array
12
+ * - ToolResult parts → separate role="tool" messages
13
+ *
14
+ * @param uiMessage - The UIMessage to convert
15
+ * @returns An array of ModelMessages (may be multiple if tool results are present)
16
+ */
17
+ export declare function uiMessageToModelMessages(uiMessage: UIMessage): Array<ModelMessage>;
18
+ /**
19
+ * Convert a ModelMessage to UIMessage
20
+ *
21
+ * This conversion creates a parts-based structure:
22
+ * - content field → TextPart
23
+ * - toolCalls array → ToolCallPart[]
24
+ * - role="tool" messages should be converted separately and merged
25
+ *
26
+ * @param modelMessage - The ModelMessage to convert
27
+ * @param id - Optional ID for the UIMessage (generated if not provided)
28
+ * @returns A UIMessage with parts
29
+ */
30
+ export declare function modelMessageToUIMessage(modelMessage: ModelMessage, id?: string): UIMessage;
31
+ /**
32
+ * Convert an array of ModelMessages to UIMessages
33
+ *
34
+ * This handles merging tool result messages with their corresponding assistant messages
35
+ *
36
+ * @param modelMessages - Array of ModelMessages to convert
37
+ * @returns Array of UIMessages
38
+ */
39
+ export declare function modelMessagesToUIMessages(modelMessages: Array<ModelMessage>): Array<UIMessage>;
40
+ /**
41
+ * Normalize a message (UIMessage or ModelMessage) to a UIMessage
42
+ * Ensures the message has an ID and createdAt timestamp
43
+ *
44
+ * @param message - Either a UIMessage or ModelMessage
45
+ * @param generateId - Function to generate a message ID if needed
46
+ * @returns A UIMessage with guaranteed id and createdAt
47
+ */
48
+ export declare function normalizeToUIMessage(message: UIMessage | ModelMessage, generateId: () => string): UIMessage;
49
+ /**
50
+ * Generate a unique message ID
51
+ */
52
+ export declare function generateMessageId(): string;