diff --git a/examples/package.json b/examples/package.json index a920acd..63dddcb 100644 --- a/examples/package.json +++ b/examples/package.json @@ -13,7 +13,8 @@ "@ai-sdk/openai": "catalog:dev", "@types/node": "catalog:dev", "ai": "catalog:peer", - "openai": "catalog:peer" + "openai": "catalog:peer", + "zod": "catalog:dev" }, "devEngines": { "runtime": [ diff --git a/package.json b/package.json index 2c43bb4..cc41df6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "dependencies": { "@modelcontextprotocol/sdk": "catalog:prod", "@orama/orama": "catalog:prod", - "json-schema": "catalog:prod" + "json-schema": "catalog:prod", + "zod": "catalog:dev" }, "devDependencies": { "@ai-sdk/provider-utils": "catalog:dev", @@ -58,8 +59,7 @@ "type-fest": "catalog:dev", "typescript": "catalog:dev", "unplugin-unused": "catalog:dev", - "vitest": "catalog:dev", - "zod": "catalog:dev" + "vitest": "catalog:dev" }, "peerDependencies": { "ai": "catalog:peer", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 981f299..c97156e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: dev: '@ai-sdk/openai': - specifier: ^2.0.46 - version: 2.0.76 + specifier: ^2.0.80 + version: 2.0.80 '@ai-sdk/provider-utils': specifier: ^3.0.18 version: 3.0.18 @@ -61,19 +61,19 @@ catalogs: specifier: ^3.2.4 version: 3.2.4 zod: - specifier: ^3.23.8 - version: 3.25.76 + specifier: ^4.1.13 + version: 4.1.13 peer: ai: - specifier: ^5.0.63 - version: 5.0.106 + specifier: ^5.0.108 + version: 5.0.108 openai: specifier: ^6.2.0 version: 6.9.1 prod: '@modelcontextprotocol/sdk': - specifier: ^1.19.1 - version: 1.24.2 + specifier: ^1.24.3 + version: 1.24.3 '@orama/orama': specifier: ^3.1.11 version: 3.1.16 @@ -87,23 +87,26 @@ importers: dependencies: '@modelcontextprotocol/sdk': specifier: catalog:prod - version: 1.24.2(zod@3.25.76) + version: 1.24.3(zod@4.1.13) '@orama/orama': specifier: catalog:prod version: 3.1.16 json-schema: specifier: catalog:prod version: 0.4.0 + zod: + specifier: catalog:dev + version: 4.1.13 devDependencies: '@ai-sdk/provider-utils': specifier: catalog:dev - version: 3.0.18(zod@3.25.76) + version: 3.0.18(zod@4.1.13) '@biomejs/biome': specifier: catalog:dev version: 1.9.4 '@hono/mcp': specifier: catalog:dev - version: 0.1.5(@modelcontextprotocol/sdk@1.24.2(zod@3.25.76))(hono@4.10.7) + version: 0.1.5(@modelcontextprotocol/sdk@1.24.3(zod@4.1.13))(hono@4.10.7) '@types/json-schema': specifier: catalog:dev version: 7.0.15 @@ -118,7 +121,7 @@ importers: version: 3.2.4(vitest@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(msw@2.12.3(@types/node@22.19.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) ai: specifier: catalog:peer - version: 5.0.106(zod@3.25.76) + version: 5.0.108(zod@4.1.13) hono: specifier: catalog:dev version: 4.10.7 @@ -136,7 +139,7 @@ importers: version: runtime:24.11.1 openai: specifier: catalog:peer - version: 6.9.1(zod@3.25.76) + version: 6.9.1(zod@4.1.13) publint: specifier: catalog:dev version: 0.3.15 @@ -155,9 +158,6 @@ importers: vitest: specifier: catalog:dev version: 3.2.4(@types/node@22.19.1)(jiti@2.6.1)(msw@2.12.3(@types/node@22.19.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - zod: - specifier: catalog:dev - version: 3.25.76 examples: dependencies: @@ -167,19 +167,22 @@ importers: devDependencies: '@ai-sdk/openai': specifier: catalog:dev - version: 2.0.76(zod@4.1.13) + version: 2.0.80(zod@4.1.13) '@types/node': specifier: catalog:dev version: 22.19.1 ai: specifier: catalog:peer - version: 5.0.106(zod@4.1.13) + version: 5.0.108(zod@4.1.13) node: specifier: runtime:^24.11.0 version: runtime:24.11.1 openai: specifier: catalog:peer version: 6.9.1(zod@4.1.13) + zod: + specifier: catalog:dev + version: 4.1.13 packages: @@ -189,8 +192,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.76': - resolution: {integrity: sha512-ryUkhTDVxe3D1GSAGc94vPZsJlSY8ZuBDLkpf4L81Dm7Ik5AgLfhQrZa8+0hD4kp0dxdVaIoxhpa3QOt1CmncA==} + '@ai-sdk/openai@2.0.80': + resolution: {integrity: sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -677,8 +680,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@modelcontextprotocol/sdk@1.24.2': - resolution: {integrity: sha512-hS/kzSfchqzvUeJUsdiDHi84/kNhLIZaZ6coGQVwbYIelOBbcAwUohUfaQTLa1MvFOK/jbTnGFzraHSFwB7pjQ==} + '@modelcontextprotocol/sdk@1.24.3': + resolution: {integrity: sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -1170,8 +1173,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ai@5.0.106: - resolution: {integrity: sha512-M5obwavxSJJ3tGlAFqI6eltYNJB0D20X6gIBCFx/KVorb/X1fxVVfiZZpZb+Gslu4340droSOjT0aKQFCarNVg==} + ai@5.0.108: + resolution: {integrity: sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2408,21 +2411,11 @@ packages: peerDependencies: zod: ^3.25 || ^4 - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.1.13: resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} snapshots: - '@ai-sdk/gateway@2.0.18(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@3.25.76) - '@vercel/oidc': 3.0.5 - zod: 3.25.76 - '@ai-sdk/gateway@2.0.18(zod@4.1.13)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -2430,19 +2423,12 @@ snapshots: '@vercel/oidc': 3.0.5 zod: 4.1.13 - '@ai-sdk/openai@2.0.76(zod@4.1.13)': + '@ai-sdk/openai@2.0.80(zod@4.1.13)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.18(zod@4.1.13) zod: 4.1.13 - '@ai-sdk/provider-utils@3.0.18(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.18(zod@4.1.13)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -2689,9 +2675,9 @@ snapshots: '@esbuild/win32-x64@0.27.0': optional: true - '@hono/mcp@0.1.5(@modelcontextprotocol/sdk@1.24.2(zod@3.25.76))(hono@4.10.7)': + '@hono/mcp@0.1.5(@modelcontextprotocol/sdk@1.24.3(zod@4.1.13))(hono@4.10.7)': dependencies: - '@modelcontextprotocol/sdk': 1.24.2(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.24.3(zod@4.1.13) hono: 4.10.7 '@inquirer/ansi@1.0.2': {} @@ -2752,7 +2738,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@modelcontextprotocol/sdk@1.24.2(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.24.3(zod@4.1.13)': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) @@ -2766,8 +2752,8 @@ snapshots: jose: 6.1.3 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod: 4.1.13 + zod-to-json-schema: 3.25.0(zod@4.1.13) transitivePeerDependencies: - supports-color @@ -3123,15 +3109,7 @@ snapshots: acorn@8.15.0: {} - ai@5.0.106(zod@3.25.76): - dependencies: - '@ai-sdk/gateway': 2.0.18(zod@3.25.76) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - zod: 3.25.76 - - ai@5.0.106(zod@4.1.13): + ai@5.0.108(zod@4.1.13): dependencies: '@ai-sdk/gateway': 2.0.18(zod@4.1.13) '@ai-sdk/provider': 2.0.0 @@ -3771,10 +3749,6 @@ snapshots: dependencies: wrappy: 1.0.2 - openai@6.9.1(zod@3.25.76): - optionalDependencies: - zod: 3.25.76 - openai@6.9.1(zod@4.1.13): optionalDependencies: zod: 4.1.13 @@ -4336,10 +4310,8 @@ snapshots: yoctocolors-cjs@2.1.3: {} - zod-to-json-schema@3.25.0(zod@3.25.76): + zod-to-json-schema@3.25.0(zod@4.1.13): dependencies: - zod: 3.25.76 - - zod@3.25.76: {} + zod: 4.1.13 zod@4.1.13: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0353d21..23f9ecc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,7 +6,7 @@ catalogMode: strict catalogs: dev: - '@ai-sdk/openai': ^2.0.46 + '@ai-sdk/openai': ^2.0.80 '@ai-sdk/provider-utils': ^3.0.18 '@biomejs/biome': ^1.5.3 '@hono/mcp': ^0.1.4 @@ -24,12 +24,12 @@ catalogs: typescript: ^5.8.3 unplugin-unused: ^0.5.4 vitest: ^3.2.4 - zod: ^3.23.8 + zod: ^4.1.13 peer: - ai: ^5.0.63 + ai: ^5.0.108 openai: ^6.2.0 prod: - '@modelcontextprotocol/sdk': ^1.19.1 + '@modelcontextprotocol/sdk': ^1.24.3 '@orama/orama': ^3.1.11 json-schema: ^0.4.0 diff --git a/src/rpc-client.ts b/src/rpc-client.ts index 8607a87..4a0dee9 100644 --- a/src/rpc-client.ts +++ b/src/rpc-client.ts @@ -1,4 +1,4 @@ -import { z } from 'zod'; +import { z } from 'zod/mini'; import { StackOneAPIError } from './utils/errors'; /** @@ -7,10 +7,10 @@ import { StackOneAPIError } from './utils/errors'; */ const rpcActionRequestSchema = z.object({ action: z.string(), - body: z.record(z.unknown()).optional(), - headers: z.record(z.unknown()).optional(), - path: z.record(z.unknown()).optional(), - query: z.record(z.unknown()).optional(), + body: z.optional(z.record(z.string(), z.unknown())), + headers: z.optional(z.record(z.string(), z.unknown())), + path: z.optional(z.record(z.string(), z.unknown())), + query: z.optional(z.record(z.string(), z.unknown())), }); /** @@ -22,8 +22,8 @@ type RpcActionRequest = z.infer; * Zod schema for RPC action response data */ const rpcActionResponseDataSchema = z.union([ - z.record(z.unknown()), - z.array(z.record(z.unknown())), + z.record(z.string(), z.unknown()), + z.array(z.record(z.string(), z.unknown())), z.null(), ]); @@ -37,12 +37,10 @@ const rpcActionResponseDataSchema = z.union([ * Additional fields from the connector response are passed through. * @see unified-cloud-api/src/unified-api-v2/unifiedAPIv2.service.ts processActionCall */ -const rpcActionResponseSchema = z - .object({ - next: z.string().nullish(), - data: rpcActionResponseDataSchema.optional(), - }) - .passthrough(); +const rpcActionResponseSchema = z.looseObject({ + next: z.nullable(z.optional(z.string())), + data: z.optional(rpcActionResponseDataSchema), +}); /** * RPC action response from the StackOne API @@ -54,10 +52,10 @@ export type RpcActionResponse = z.infer; * Zod schema for RPC client configuration validation */ const rpcClientConfigSchema = z.object({ - serverURL: z.string().optional(), + serverURL: z.optional(z.string()), security: z.object({ username: z.string(), - password: z.string().optional(), + password: z.optional(z.string()), }), }); diff --git a/src/types.ts b/src/types.ts index 4ab2294..52873ac 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,6 +3,7 @@ */ import type { Tool } from '@ai-sdk/provider-utils'; +import type { ToolSet } from 'ai'; import type { JSONSchema7, JSONSchema7Definition } from 'json-schema'; import type { ValueOf } from 'type-fest'; @@ -175,9 +176,13 @@ export type AISDKToolDefinition = Tool & { /** * Result type for toAISDK() method. - * Maps tool names to their AI SDK tool definitions. + * Uses the ToolSet type from AI SDK to ensure full compatibility with + * generateText, streamText, and other AI SDK functions. * - * NOTE: We avoid defining our own types as much as possible and use existing - * types from dependencies. This is a simple mapped type over AISDKToolDefinition. + * NOTE: We extend ToolSet with our custom AISDKToolDefinition to ensure + * both AI SDK compatibility and access to StackOne-specific properties + * like `execution` metadata. */ -export type AISDKToolResult = Record; +export type AISDKToolResult = ToolSet & { + [K in T]: AISDKToolDefinition; +}; diff --git a/tsdown.config.ts b/tsdown.config.ts index 559e512..638cee9 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -9,7 +9,7 @@ export default defineConfig({ treeshake: true, dts: { tsgo: true, - resolve: [/^@types\//, 'type-fest'], + resolve: [/^@types\//, 'type-fest', 'ai', '@ai-sdk/provider-utils'], }, publint: true, unused: true,