@mondaydotcomorg/atp-vercel-sdk 0.20.1 → 0.20.3

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.
package/dist/tools.js CHANGED
@@ -3,6 +3,7 @@ import { VercelAIATPClient } from './client.js';
3
3
  import { createToolsFromATPClient, ToolNames } from '@mondaydotcomorg/atp-client';
4
4
  import { ExecutionStatus } from '@mondaydotcomorg/atp-protocol';
5
5
  import { tool } from 'ai';
6
+ import { createVercelEventHandler } from './event-adapter.js';
6
7
  export async function createATPTools(options) {
7
8
  const { defaultExecutionConfig, ...clientOptions } = options;
8
9
  const client = new VercelAIATPClient(clientOptions);
@@ -97,4 +98,98 @@ export async function createATPTools(options) {
97
98
  tools: vercelTools,
98
99
  };
99
100
  }
101
+ /**
102
+ * Creates ATP tools with streaming event support.
103
+ * Events from tool execution will be forwarded to the provided dataStream.
104
+ *
105
+ * @param options - Tool creation options including dataStream for event forwarding
106
+ * @returns Promise resolving to client and tools with streaming support
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * // In your Vercel AI SDK route handler
111
+ * const dataStream = createUIMessageStream({...});
112
+ *
113
+ * const { tools } = await createATPStreamingTools({
114
+ * serverUrl: 'http://localhost:3333',
115
+ * model: openai('gpt-4'),
116
+ * dataStream,
117
+ * });
118
+ *
119
+ * // Use tools in streamText
120
+ * const result = streamText({
121
+ * model: openai('gpt-4'),
122
+ * messages,
123
+ * tools,
124
+ * });
125
+ * ```
126
+ */
127
+ export async function createATPStreamingTools(options) {
128
+ const { dataStream, defaultExecutionConfig, ...clientOptions } = options;
129
+ const client = new VercelAIATPClient(clientOptions);
130
+ await client.connect();
131
+ const eventHandler = createVercelEventHandler(dataStream);
132
+ const underlyingClient = client.getUnderlyingClient();
133
+ const vercelTools = {};
134
+ vercelTools.atp_execute_code = tool({
135
+ description: 'Execute TypeScript code in ATP sandbox with streaming events for thinking, tool execution, and text output',
136
+ parameters: z.object({
137
+ code: z.string().describe('TypeScript code to execute in the ATP sandbox'),
138
+ }),
139
+ execute: async ({ code }) => {
140
+ try {
141
+ const result = await underlyingClient.executeStream(code, defaultExecutionConfig, eventHandler);
142
+ if (result.status === ExecutionStatus.COMPLETED) {
143
+ return {
144
+ success: true,
145
+ result: result.result,
146
+ stats: result.stats,
147
+ };
148
+ }
149
+ else if (result.status === ExecutionStatus.FAILED) {
150
+ return {
151
+ success: false,
152
+ error: result.error,
153
+ stats: result.stats,
154
+ };
155
+ }
156
+ else {
157
+ return {
158
+ success: false,
159
+ error: 'Execution in unexpected state: ' + result.status,
160
+ };
161
+ }
162
+ }
163
+ catch (error) {
164
+ return {
165
+ success: false,
166
+ error: error.message || 'Unknown error',
167
+ };
168
+ }
169
+ },
170
+ });
171
+ vercelTools.atp_get_type_definitions = tool({
172
+ description: 'Get TypeScript type definitions for ATP runtime APIs to understand available functions',
173
+ parameters: z.object({}),
174
+ execute: async () => {
175
+ try {
176
+ const types = client.getTypeDefinitions();
177
+ return {
178
+ success: true,
179
+ types,
180
+ };
181
+ }
182
+ catch (error) {
183
+ return {
184
+ success: false,
185
+ error: error.message,
186
+ };
187
+ }
188
+ },
189
+ });
190
+ return {
191
+ client,
192
+ tools: vercelTools,
193
+ };
194
+ }
100
195
  //# sourceMappingURL=tools.js.map
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAA8B,MAAM,oBAAoB,CAAC;AAE1F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IAClE,MAAM,EAAE,sBAAsB,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExE,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,YAAY,EAAE,CAAC;YAC7C,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBACnC,WAAW,EACV,OAAO,CAAC,WAAW;oBACnB,iHAAiH;gBAClH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;iBAC1E,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAoB,EAAE,EAAE;oBAC7C,IAAI,CAAC;wBACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;wBAElE,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;4BACjD,OAAO;gCACN,OAAO,EAAE,IAAI;gCACb,MAAM,EAAE,MAAM,CAAC,MAAM;gCACrB,KAAK,EAAE,MAAM,CAAC,KAAK;6BACnB,CAAC;wBACH,CAAC;6BAAM,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;4BACrD,OAAO;gCACN,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,KAAK,EAAE,MAAM,CAAC,KAAK;6BACnB,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACP,OAAO;gCACN,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,iCAAiC,GAAG,MAAM,CAAC,MAAM;6BACxD,CAAC;wBACH,CAAC;oBACF,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACrB,OAAO;4BACN,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;yBACvC,CAAC;oBACH,CAAC;gBACF,CAAC;aACD,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;YACvC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;gBACtC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE;oBAC7B,IAAI,CAAC;wBACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACzC,OAAO;4BACN,OAAO,EAAE,IAAI;4BACb,MAAM;yBACN,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACrB,OAAO;4BACN,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,KAAK,CAAC,OAAO;yBACpB,CAAC;oBACH,CAAC;gBACF,CAAC;aACD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAC3C,WAAW,EACV,wFAAwF;QACzF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1C,OAAO;oBACN,OAAO,EAAE,IAAI;oBACb,KAAK;iBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACrB,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,CAAC,OAAO;iBACpB,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC,CAAC;IAEH,OAAO;QACN,MAAM;QACN,KAAK,EAAE,WAAW;KAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,OAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAEzE,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvB,MAAM,YAAY,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAEtD,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACnC,WAAW,EACV,4GAA4G;QAC7G,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;SAC1E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAoB,EAAE,EAAE;YAC7C,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAClD,IAAI,EACJ,sBAAsB,EACtB,YAAY,CACZ,CAAC;gBAEF,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACjD,OAAO;wBACN,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACnB,CAAC;gBACH,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;oBACrD,OAAO;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACnB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,OAAO;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,iCAAiC,GAAG,MAAM,CAAC,MAAM;qBACxD,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACrB,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;iBACvC,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC,CAAC;IAEH,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAC3C,WAAW,EACV,wFAAwF;QACzF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC1C,OAAO;oBACN,OAAO,EAAE,IAAI;oBACb,KAAK;iBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACrB,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,CAAC,OAAO;iBACpB,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC,CAAC;IAEH,OAAO;QACN,MAAM;QACN,KAAK,EAAE,WAAW;KAClB,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ExecutionConfig, ClientTool } from '@mondaydotcomorg/atp-protocol';
2
2
  import type { ClientHooks } from '@mondaydotcomorg/atp-client';
3
+ import type { UIMessageStreamWriter } from './event-adapter.js';
3
4
  export interface ApprovalRequest {
4
5
  message: string;
5
6
  context?: Record<string, unknown>;
@@ -14,26 +15,54 @@ export type ApprovalHandler = (message: string, context?: Record<string, unknown
14
15
  export interface EmbeddingProvider {
15
16
  embed(text: string): Promise<number[]>;
16
17
  }
17
- export interface VercelAIATPClientOptions {
18
- serverUrl: string;
19
- headers?: Record<string, string>;
18
+ export interface InProcessServer {
19
+ start(): Promise<void>;
20
+ handleInit(ctx: unknown): Promise<unknown>;
21
+ getDefinitions(ctx?: unknown): Promise<unknown>;
22
+ getRuntimeDefinitions(ctx?: unknown): Promise<string>;
23
+ getInfo(): unknown;
24
+ handleSearch(ctx: unknown): Promise<unknown>;
25
+ handleExplore(ctx: unknown): Promise<unknown>;
26
+ handleExecute(ctx: unknown): Promise<unknown>;
27
+ handleResume(ctx: unknown, executionId: string): Promise<unknown>;
28
+ }
29
+ interface BaseClientOptions {
20
30
  model: any;
21
31
  embeddings?: EmbeddingProvider;
22
32
  tools?: ClientTool[];
23
33
  approvalHandler?: ApprovalHandler;
24
34
  hooks?: ClientHooks;
25
35
  }
26
- export interface CreateATPToolsOptions {
36
+ /** HTTP mode options */
37
+ interface HttpModeOptions extends BaseClientOptions {
27
38
  serverUrl: string;
28
39
  headers?: Record<string, string>;
29
- model: any;
30
- embeddings?: EmbeddingProvider;
31
- approvalHandler?: ApprovalHandler;
32
- defaultExecutionConfig?: Partial<ExecutionConfig>;
33
- hooks?: ClientHooks;
40
+ server?: never;
34
41
  }
42
+ /** In-process mode options */
43
+ interface InProcessModeOptions extends BaseClientOptions {
44
+ server: InProcessServer;
45
+ serverUrl?: never;
46
+ headers?: never;
47
+ }
48
+ export type VercelAIATPClientOptions = HttpModeOptions | InProcessModeOptions;
49
+ export type CreateATPToolsOptions = (HttpModeOptions | InProcessModeOptions) & {
50
+ defaultExecutionConfig?: Partial<ExecutionConfig>;
51
+ };
52
+ /**
53
+ * Options for creating ATP tools with streaming event support
54
+ */
55
+ export type StreamingToolsOptions = CreateATPToolsOptions & {
56
+ /**
57
+ * UIMessageStreamWriter to forward events to.
58
+ * Events like 'thinking', 'tool_start', 'tool_end', 'text', 'source' will be
59
+ * converted to Vercel AI SDK format and written to this stream.
60
+ */
61
+ dataStream: UIMessageStreamWriter;
62
+ };
35
63
  export interface ATPToolsResult {
36
64
  client: any;
37
65
  tools: Record<string, any>;
38
66
  }
67
+ export {};
39
68
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IACjC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mondaydotcomorg/atp-vercel-sdk",
3
- "version": "0.20.1",
3
+ "version": "0.20.3",
4
4
  "description": "Vercel AI SDK integration for Agent Tool Protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -44,8 +44,8 @@
44
44
  ],
45
45
  "license": "MIT",
46
46
  "dependencies": {
47
- "@mondaydotcomorg/atp-client": "0.19.14",
48
- "@mondaydotcomorg/atp-protocol": "0.19.14"
47
+ "@mondaydotcomorg/atp-client": "0.19.15",
48
+ "@mondaydotcomorg/atp-protocol": "0.19.15"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "ai": "^4.0.0",
package/src/client.ts CHANGED
@@ -15,14 +15,25 @@ export class VercelAIATPClient {
15
15
  private approvalHandler?: ApprovalHandler;
16
16
 
17
17
  constructor(options: VercelAIATPClientOptions) {
18
- const { serverUrl, headers, model, embeddings, tools, approvalHandler, hooks } = options;
18
+ const { model, embeddings, tools, approvalHandler, hooks } = options;
19
+
20
+ if ('server' in options && options.server) {
21
+ this.client = new AgentToolProtocolClient({
22
+ server: options.server,
23
+ hooks,
24
+ serviceProviders: tools ? { tools } : undefined,
25
+ });
26
+ } else if ('serverUrl' in options && options.serverUrl) {
27
+ this.client = new AgentToolProtocolClient({
28
+ baseUrl: options.serverUrl,
29
+ headers: options.headers,
30
+ hooks,
31
+ serviceProviders: tools ? { tools } : undefined,
32
+ });
33
+ } else {
34
+ throw new Error('Either serverUrl or server must be provided');
35
+ }
19
36
 
20
- this.client = new AgentToolProtocolClient({
21
- baseUrl: serverUrl,
22
- headers,
23
- hooks,
24
- serviceProviders: tools ? { tools } : undefined,
25
- });
26
37
  this.model = model;
27
38
  this.embeddings = embeddings;
28
39
  this.approvalHandler = approvalHandler;
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Vercel AI SDK Event Adapter
3
+ *
4
+ * Converts ATP streaming events to Vercel AI SDK UIMessageStream format.
5
+ * Use this to forward ATP events to the chat UI.
6
+ */
7
+
8
+ import { type ATPEvent, ATPEventType } from '@mondaydotcomorg/atp-protocol';
9
+
10
+ /**
11
+ * UIMessageStreamWriter interface (subset of Vercel AI SDK's UIMessageStreamWriter)
12
+ */
13
+ export interface UIMessageStreamWriter {
14
+ write(event: UIStreamEvent): void;
15
+ }
16
+
17
+ /**
18
+ * UI Stream event types that Vercel AI SDK understands
19
+ */
20
+ export type UIStreamEvent =
21
+ | { type: 'text-start'; id: string }
22
+ | { type: 'text-delta'; id: string; delta: string }
23
+ | { type: 'text-end'; id: string }
24
+ | { type: 'reasoning-start'; id: string }
25
+ | { type: 'reasoning-delta'; id: string; delta: string }
26
+ | { type: 'reasoning-end'; id: string }
27
+ | { type: 'source-url'; url: string; title: string; sourceId: string; providerMetadata?: unknown }
28
+ | { type: string; data?: unknown; transient?: boolean };
29
+
30
+ /**
31
+ * Options for creating the Vercel event handler
32
+ */
33
+ export interface CreateVercelEventHandlerOptions {
34
+ /**
35
+ * Prefix for generated text run IDs
36
+ * @default 'atp-text'
37
+ */
38
+ textRunIdPrefix?: string;
39
+ }
40
+
41
+ /**
42
+ * Creates an event handler that forwards ATP events to a Vercel AI SDK UIMessageStreamWriter.
43
+ *
44
+ * Handles nested tool calls properly:
45
+ * - First tool_start triggers agentStepStart
46
+ * - Inner tool_start/end emit agentStep updates (not start/end)
47
+ * - Last tool_end triggers agentStepEnd
48
+ *
49
+ * @param dataStream - The Vercel AI SDK UIMessageStreamWriter to write events to
50
+ * @param options - Optional configuration
51
+ * @returns An event handler function to pass to ATP's executeStream
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const handler = createVercelEventHandler(dataStream);
56
+ *
57
+ * const result = await client.executeStream(code, {}, handler);
58
+ * ```
59
+ */
60
+ export function createVercelEventHandler(
61
+ dataStream: UIMessageStreamWriter,
62
+ options: CreateVercelEventHandlerOptions = {}
63
+ ): (event: ATPEvent) => void {
64
+ const { textRunIdPrefix = 'atp-text' } = options;
65
+
66
+ let currentTextRunId: string | undefined;
67
+ let textRunCounter = 0;
68
+
69
+ // Track reasoning state for proper start/delta/end events
70
+ let reasoningRunId: string | undefined;
71
+ let reasoningCounter = 0;
72
+
73
+ // Track nested tool calls with a stack
74
+ const toolStack: Array<{ toolName: string; apiGroup: string }> = [];
75
+
76
+ return (event: ATPEvent) => {
77
+ switch (event.type) {
78
+ case ATPEventType.THINKING: {
79
+ const data = event.data as { content: string; step?: string };
80
+
81
+ // Start new reasoning block if needed
82
+ if (!reasoningRunId) {
83
+ reasoningRunId = `atp-reasoning-${++reasoningCounter}`;
84
+ dataStream.write({
85
+ type: 'reasoning-start',
86
+ id: reasoningRunId,
87
+ } as UIStreamEvent);
88
+ }
89
+
90
+ // Write reasoning delta
91
+ dataStream.write({
92
+ type: 'reasoning-delta',
93
+ id: reasoningRunId,
94
+ delta: data.content + '\n',
95
+ } as UIStreamEvent);
96
+ break;
97
+ }
98
+
99
+ case ATPEventType.TOOL_START: {
100
+ const data = event.data as { toolName: string; apiGroup: string; input: unknown };
101
+ const isFirstTool = toolStack.length === 0;
102
+
103
+ toolStack.push({ toolName: data.toolName, apiGroup: data.apiGroup });
104
+
105
+ if (isFirstTool) {
106
+ // First tool - emit agentStepStart
107
+ dataStream.write({
108
+ type: 'data-agentStepStart',
109
+ data: `Executing ${data.apiGroup}.${data.toolName}...`,
110
+ transient: true,
111
+ });
112
+ } else {
113
+ // Nested tool - emit progress update instead
114
+ dataStream.write({
115
+ type: 'data-agentStep',
116
+ data: `→ ${data.apiGroup}.${data.toolName}`,
117
+ transient: true,
118
+ });
119
+ }
120
+ break;
121
+ }
122
+
123
+ case ATPEventType.TOOL_END: {
124
+ const data = event.data as {
125
+ toolName: string;
126
+ apiGroup: string;
127
+ output: unknown;
128
+ duration: number;
129
+ success: boolean;
130
+ error?: string;
131
+ };
132
+
133
+ toolStack.pop();
134
+ const isLastTool = toolStack.length === 0;
135
+
136
+ // Close reasoning block when outer tool ends
137
+ if (isLastTool && reasoningRunId) {
138
+ dataStream.write({
139
+ type: 'reasoning-end',
140
+ id: reasoningRunId,
141
+ } as UIStreamEvent);
142
+ reasoningRunId = undefined;
143
+ }
144
+
145
+ if (isLastTool) {
146
+ // Last tool - emit agentStepEnd
147
+ dataStream.write({
148
+ type: 'data-agentStepEnd',
149
+ data: data.success
150
+ ? `Completed ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
151
+ : `Failed ${data.apiGroup}.${data.toolName}: ${data.error}`,
152
+ transient: true,
153
+ });
154
+ } else {
155
+ // Nested tool finished - emit progress update
156
+ dataStream.write({
157
+ type: 'data-agentStep',
158
+ data: data.success
159
+ ? `✓ ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
160
+ : `✗ ${data.apiGroup}.${data.toolName}: ${data.error}`,
161
+ transient: true,
162
+ });
163
+ }
164
+ break;
165
+ }
166
+
167
+ case ATPEventType.TEXT: {
168
+ const data = event.data as { text: string };
169
+ const runId = event.runId || `${textRunIdPrefix}-${++textRunCounter}`;
170
+
171
+ // If we're starting a new text run, close the previous one
172
+ if (currentTextRunId && currentTextRunId !== runId) {
173
+ dataStream.write({ type: 'text-end', id: currentTextRunId });
174
+ currentTextRunId = undefined;
175
+ }
176
+
177
+ // Start new text run if needed
178
+ if (!currentTextRunId || currentTextRunId !== runId) {
179
+ currentTextRunId = runId;
180
+ dataStream.write({ type: 'text-start', id: currentTextRunId });
181
+ }
182
+
183
+ // Write text delta
184
+ dataStream.write({
185
+ type: 'text-delta',
186
+ id: currentTextRunId,
187
+ delta: data.text,
188
+ });
189
+ break;
190
+ }
191
+
192
+ case ATPEventType.TEXT_END:
193
+ if (currentTextRunId) {
194
+ dataStream.write({ type: 'text-end', id: currentTextRunId });
195
+ currentTextRunId = undefined;
196
+ }
197
+ break;
198
+
199
+ case ATPEventType.SOURCE: {
200
+ const data = event.data as {
201
+ url: string;
202
+ title: string;
203
+ summary?: string;
204
+ createdAt?: string;
205
+ };
206
+ dataStream.write({
207
+ type: 'source-url',
208
+ url: data.url,
209
+ title: data.title,
210
+ sourceId: `${data.title}-${event.timestamp}`,
211
+ providerMetadata: {
212
+ aiChat: {
213
+ summary: data.summary,
214
+ createdAt: data.createdAt,
215
+ },
216
+ },
217
+ });
218
+ break;
219
+ }
220
+
221
+ case ATPEventType.PROGRESS: {
222
+ const data = event.data as { message: string; fraction: number };
223
+ dataStream.write({
224
+ type: 'data-agentStep',
225
+ data: `${data.message} (${Math.round(data.fraction * 100)}%)`,
226
+ transient: true,
227
+ });
228
+ break;
229
+ }
230
+
231
+ case ATPEventType.ERROR: {
232
+ const data = event.data as { message: string; code?: string };
233
+ dataStream.write({
234
+ type: 'data-error',
235
+ data: data.message,
236
+ });
237
+ break;
238
+ }
239
+
240
+ default:
241
+ // Forward unknown events as custom data events
242
+ dataStream.write({
243
+ type: `data-${event.type}`,
244
+ data: event.data,
245
+ transient: true,
246
+ });
247
+ break;
248
+ }
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Creates an event handler that collects events into an array.
254
+ * Useful for testing or post-processing events.
255
+ *
256
+ * @returns Object with handler function and collected events array
257
+ */
258
+ export function createEventCollector(): {
259
+ handler: (event: ATPEvent) => void;
260
+ events: ATPEvent[];
261
+ clear: () => void;
262
+ } {
263
+ const events: ATPEvent[] = [];
264
+
265
+ return {
266
+ handler: (event: ATPEvent) => {
267
+ events.push(event);
268
+ },
269
+ events,
270
+ clear: () => {
271
+ events.length = 0;
272
+ },
273
+ };
274
+ }
275
+
package/src/index.ts CHANGED
@@ -1,8 +1,16 @@
1
1
  export { VercelAIATPClient } from './client.js';
2
- export { createATPTools } from './tools.js';
2
+ export { createATPTools, createATPStreamingTools } from './tools.js';
3
+ export {
4
+ createVercelEventHandler,
5
+ createEventCollector,
6
+ type UIMessageStreamWriter,
7
+ type UIStreamEvent,
8
+ type CreateVercelEventHandlerOptions,
9
+ } from './event-adapter.js';
3
10
  export type {
4
11
  VercelAIATPClientOptions,
5
12
  CreateATPToolsOptions,
13
+ StreamingToolsOptions,
6
14
  ATPToolsResult,
7
15
  ApprovalHandler,
8
16
  ApprovalRequest,
package/src/tools.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { z } from 'zod';
2
2
  import { VercelAIATPClient } from './client.js';
3
- import type { CreateATPToolsOptions, ATPToolsResult } from './types.js';
3
+ import type { CreateATPToolsOptions, ATPToolsResult, StreamingToolsOptions } from './types.js';
4
4
  import { createToolsFromATPClient, ToolNames } from '@mondaydotcomorg/atp-client';
5
5
  import { ExecutionStatus } from '@mondaydotcomorg/atp-protocol';
6
6
  import { tool } from 'ai';
7
+ import { createVercelEventHandler, type UIMessageStreamWriter } from './event-adapter.js';
7
8
 
8
9
  export async function createATPTools(options: CreateATPToolsOptions): Promise<ATPToolsResult> {
9
10
  const { defaultExecutionConfig, ...clientOptions } = options;
@@ -102,3 +103,109 @@ export async function createATPTools(options: CreateATPToolsOptions): Promise<AT
102
103
  tools: vercelTools,
103
104
  };
104
105
  }
106
+
107
+ /**
108
+ * Creates ATP tools with streaming event support.
109
+ * Events from tool execution will be forwarded to the provided dataStream.
110
+ *
111
+ * @param options - Tool creation options including dataStream for event forwarding
112
+ * @returns Promise resolving to client and tools with streaming support
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * // In your Vercel AI SDK route handler
117
+ * const dataStream = createUIMessageStream({...});
118
+ *
119
+ * const { tools } = await createATPStreamingTools({
120
+ * serverUrl: 'http://localhost:3333',
121
+ * model: openai('gpt-4'),
122
+ * dataStream,
123
+ * });
124
+ *
125
+ * // Use tools in streamText
126
+ * const result = streamText({
127
+ * model: openai('gpt-4'),
128
+ * messages,
129
+ * tools,
130
+ * });
131
+ * ```
132
+ */
133
+ export async function createATPStreamingTools(
134
+ options: StreamingToolsOptions
135
+ ): Promise<ATPToolsResult> {
136
+ const { dataStream, defaultExecutionConfig, ...clientOptions } = options;
137
+
138
+ const client = new VercelAIATPClient(clientOptions);
139
+ await client.connect();
140
+
141
+ const eventHandler = createVercelEventHandler(dataStream);
142
+ const underlyingClient = client.getUnderlyingClient();
143
+
144
+ const vercelTools: Record<string, any> = {};
145
+
146
+ vercelTools.atp_execute_code = tool({
147
+ description:
148
+ 'Execute TypeScript code in ATP sandbox with streaming events for thinking, tool execution, and text output',
149
+ parameters: z.object({
150
+ code: z.string().describe('TypeScript code to execute in the ATP sandbox'),
151
+ }),
152
+ execute: async ({ code }: { code: string }) => {
153
+ try {
154
+ const result = await underlyingClient.executeStream(
155
+ code,
156
+ defaultExecutionConfig,
157
+ eventHandler
158
+ );
159
+
160
+ if (result.status === ExecutionStatus.COMPLETED) {
161
+ return {
162
+ success: true,
163
+ result: result.result,
164
+ stats: result.stats,
165
+ };
166
+ } else if (result.status === ExecutionStatus.FAILED) {
167
+ return {
168
+ success: false,
169
+ error: result.error,
170
+ stats: result.stats,
171
+ };
172
+ } else {
173
+ return {
174
+ success: false,
175
+ error: 'Execution in unexpected state: ' + result.status,
176
+ };
177
+ }
178
+ } catch (error: any) {
179
+ return {
180
+ success: false,
181
+ error: error.message || 'Unknown error',
182
+ };
183
+ }
184
+ },
185
+ });
186
+
187
+ vercelTools.atp_get_type_definitions = tool({
188
+ description:
189
+ 'Get TypeScript type definitions for ATP runtime APIs to understand available functions',
190
+ parameters: z.object({}),
191
+ execute: async () => {
192
+ try {
193
+ const types = client.getTypeDefinitions();
194
+ return {
195
+ success: true,
196
+ types,
197
+ };
198
+ } catch (error: any) {
199
+ return {
200
+ success: false,
201
+ error: error.message,
202
+ };
203
+ }
204
+ },
205
+ });
206
+
207
+ return {
208
+ client,
209
+ tools: vercelTools,
210
+ };
211
+ }