@agentxjs/mono-driver 2.0.0 → 2.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.
package/dist/index.d.ts CHANGED
@@ -1,7 +1,32 @@
1
- import { DriverConfig, Driver, DriverState, DriverStreamEvent, StopReason } from '@agentxjs/core/driver';
2
- import { UserMessage, Message } from '@agentxjs/core/agent';
3
1
  import { ModelMessage } from 'ai';
4
2
  export { stepCountIs } from 'ai';
3
+ import { Message, UserMessage } from '@agentxjs/core/agent';
4
+ import { DriverStreamEvent, StopReason, DriverConfig, Driver, DriverState } from '@agentxjs/core/driver';
5
+
6
+ /**
7
+ * Message and Event Converters
8
+ *
9
+ * Converts between AgentX types and Vercel AI SDK v6 types
10
+ */
11
+
12
+ /**
13
+ * Convert AgentX Message to Vercel ModelMessage
14
+ */
15
+ declare function toVercelMessage(message: Message): ModelMessage | null;
16
+ /**
17
+ * Convert array of AgentX Messages to Vercel ModelMessages
18
+ */
19
+ declare function toVercelMessages(messages: Message[]): ModelMessage[];
20
+ /**
21
+ * Map Vercel AI SDK v6 finish reason to AgentX StopReason
22
+ */
23
+ declare function toStopReason(finishReason: string | null | undefined): StopReason;
24
+ /**
25
+ * Create a DriverStreamEvent with timestamp
26
+ */
27
+ declare function createEvent<T extends DriverStreamEvent["type"]>(type: T, data: Extract<DriverStreamEvent, {
28
+ type: T;
29
+ }>["data"]): DriverStreamEvent;
5
30
 
6
31
  /**
7
32
  * MonoDriver Types
@@ -110,10 +135,6 @@ declare class MonoDriver implements Driver {
110
135
  private readonly provider;
111
136
  private readonly maxSteps;
112
137
  private readonly compatibleConfig?;
113
- /** MCP clients created during initialize() */
114
- private mcpClients;
115
- /** Tools discovered from MCP servers */
116
- private mcpTools;
117
138
  constructor(config: MonoDriverConfig);
118
139
  get sessionId(): string | null;
119
140
  get state(): DriverState;
@@ -122,10 +143,10 @@ declare class MonoDriver implements Driver {
122
143
  receive(message: UserMessage): AsyncIterable<DriverStreamEvent>;
123
144
  interrupt(): void;
124
145
  /**
125
- * Merge MCP tools and config tools into a single ToolSet.
126
- * Config tools (bash etc.) take precedence over MCP tools with the same name.
146
+ * Convert config tools to Vercel AI SDK ToolSet.
147
+ * Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
127
148
  */
128
- private mergeTools;
149
+ private getTools;
129
150
  private getModel;
130
151
  /**
131
152
  * Get the base URL for the provider SDK.
@@ -142,29 +163,4 @@ declare class MonoDriver implements Driver {
142
163
  */
143
164
  declare function createMonoDriver(config: MonoDriverConfig): Driver;
144
165
 
145
- /**
146
- * Message and Event Converters
147
- *
148
- * Converts between AgentX types and Vercel AI SDK v6 types
149
- */
150
-
151
- /**
152
- * Convert AgentX Message to Vercel ModelMessage
153
- */
154
- declare function toVercelMessage(message: Message): ModelMessage | null;
155
- /**
156
- * Convert array of AgentX Messages to Vercel ModelMessages
157
- */
158
- declare function toVercelMessages(messages: Message[]): ModelMessage[];
159
- /**
160
- * Map Vercel AI SDK v6 finish reason to AgentX StopReason
161
- */
162
- declare function toStopReason(finishReason: string | null | undefined): StopReason;
163
- /**
164
- * Create a DriverStreamEvent with timestamp
165
- */
166
- declare function createEvent<T extends DriverStreamEvent["type"]>(type: T, data: Extract<DriverStreamEvent, {
167
- type: T;
168
- }>["data"]): DriverStreamEvent;
169
-
170
166
  export { type MonoBuiltinProvider, MonoDriver, type MonoDriverConfig, type MonoDriverOptions, type MonoProvider, type OpenAICompatibleConfig, createEvent, createMonoDriver, toStopReason, toVercelMessage, toVercelMessages };
package/dist/index.js CHANGED
@@ -1,18 +1,8 @@
1
- // src/MonoDriver.ts
2
- import { streamText, stepCountIs } from "ai";
3
- import { createAnthropic } from "@ai-sdk/anthropic";
4
- import { createOpenAI } from "@ai-sdk/openai";
5
- import { createGoogleGenerativeAI } from "@ai-sdk/google";
6
- import { createXai } from "@ai-sdk/xai";
7
- import { createDeepSeek } from "@ai-sdk/deepseek";
8
- import { createMistral } from "@ai-sdk/mistral";
9
- import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
10
- import { createMCPClient } from "@ai-sdk/mcp";
11
- import { Experimental_StdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
12
- import { createLogger } from "commonxjs/logger";
1
+ // src/index.ts
2
+ import { stepCountIs as stepCountIs2 } from "ai";
13
3
 
14
4
  // src/converters.ts
15
- import { tool, jsonSchema } from "ai";
5
+ import { jsonSchema, tool } from "ai";
16
6
  function toVercelMessage(message) {
17
7
  switch (message.subtype) {
18
8
  case "user":
@@ -117,6 +107,15 @@ function toVercelTools(tools) {
117
107
  }
118
108
 
119
109
  // src/MonoDriver.ts
110
+ import { createAnthropic } from "@ai-sdk/anthropic";
111
+ import { createDeepSeek } from "@ai-sdk/deepseek";
112
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
113
+ import { createMistral } from "@ai-sdk/mistral";
114
+ import { createOpenAI } from "@ai-sdk/openai";
115
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
116
+ import { createXai } from "@ai-sdk/xai";
117
+ import { stepCountIs, streamText } from "ai";
118
+ import { createLogger } from "commonxjs/logger";
120
119
  var logger = createLogger("mono-driver/MonoDriver");
121
120
  var MonoDriver = class {
122
121
  name = "MonoDriver";
@@ -128,10 +127,6 @@ var MonoDriver = class {
128
127
  provider;
129
128
  maxSteps;
130
129
  compatibleConfig;
131
- /** MCP clients created during initialize() */
132
- mcpClients = [];
133
- /** Tools discovered from MCP servers */
134
- mcpTools = {};
135
130
  constructor(config) {
136
131
  this.config = config;
137
132
  this.session = config.session;
@@ -161,34 +156,6 @@ var MonoDriver = class {
161
156
  });
162
157
  this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
163
158
  this.config.onSessionIdCaptured?.(this._sessionId);
164
- if (this.config.mcpServers) {
165
- for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
166
- let client;
167
- if ("command" in serverConfig) {
168
- const transport = new Experimental_StdioMCPTransport({
169
- command: serverConfig.command,
170
- args: serverConfig.args,
171
- env: serverConfig.env
172
- });
173
- client = await createMCPClient({ transport });
174
- } else {
175
- client = await createMCPClient({
176
- transport: {
177
- type: serverConfig.type,
178
- url: serverConfig.url,
179
- headers: serverConfig.headers
180
- }
181
- });
182
- }
183
- this.mcpClients.push(client);
184
- const tools = await client.tools();
185
- Object.assign(this.mcpTools, tools);
186
- logger.info("MCP server connected", {
187
- name,
188
- toolCount: Object.keys(tools).length
189
- });
190
- }
191
- }
192
159
  logger.info("MonoDriver initialized", { sessionId: this._sessionId });
193
160
  }
194
161
  async dispose() {
@@ -198,11 +165,6 @@ var MonoDriver = class {
198
165
  logger.info("Disposing MonoDriver", { agentId: this.config.agentId });
199
166
  this.abortController?.abort();
200
167
  this.abortController = null;
201
- for (const client of this.mcpClients) {
202
- await client.close();
203
- }
204
- this.mcpClients = [];
205
- this.mcpTools = {};
206
168
  this._state = "disposed";
207
169
  logger.info("MonoDriver disposed");
208
170
  }
@@ -237,7 +199,7 @@ var MonoDriver = class {
237
199
  model: this.getModel(),
238
200
  system: this.config.systemPrompt,
239
201
  messages,
240
- tools: this.mergeTools(),
202
+ tools: this.getTools(),
241
203
  stopWhen: stepCountIs(this.maxSteps),
242
204
  abortSignal: this.abortController.signal
243
205
  });
@@ -358,13 +320,12 @@ var MonoDriver = class {
358
320
  // Private Methods
359
321
  // ============================================================================
360
322
  /**
361
- * Merge MCP tools and config tools into a single ToolSet.
362
- * Config tools (bash etc.) take precedence over MCP tools with the same name.
323
+ * Convert config tools to Vercel AI SDK ToolSet.
324
+ * Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
363
325
  */
364
- mergeTools() {
365
- const configTools = this.config.tools?.length ? toVercelTools(this.config.tools) : {};
366
- const merged = { ...this.mcpTools, ...configTools };
367
- return Object.keys(merged).length > 0 ? merged : void 0;
326
+ getTools() {
327
+ if (!this.config.tools?.length) return void 0;
328
+ return toVercelTools(this.config.tools);
368
329
  }
369
330
  getModel() {
370
331
  const modelId = this.config.model ?? this.getDefaultModel();
@@ -435,9 +396,6 @@ var MonoDriver = class {
435
396
  function createMonoDriver(config) {
436
397
  return new MonoDriver(config);
437
398
  }
438
-
439
- // src/index.ts
440
- import { stepCountIs as stepCountIs2 } from "ai";
441
399
  export {
442
400
  MonoDriver,
443
401
  createEvent,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/MonoDriver.ts","../src/converters.ts","../src/index.ts"],"sourcesContent":["/**\n * MonoDriver - Unified Cross-Platform Driver\n *\n * Implements the Driver interface using Vercel AI SDK.\n * Supports multiple LLM providers (Anthropic, OpenAI, Google).\n *\n * ```\n * UserMessage\n * │\n * ▼\n * ┌─────────────────┐\n * │ MonoDriver │\n * │ │\n * │ receive() │──► AsyncIterable<DriverStreamEvent>\n * │ │ │\n * │ ▼ │\n * │ Vercel AI SDK │\n * └─────────────────┘\n * │\n * ▼\n * LLM Provider\n * (Anthropic/OpenAI/...)\n * ```\n */\n\nimport { streamText, stepCountIs } from \"ai\";\nimport type { ToolSet } from \"ai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { createMCPClient } from \"@ai-sdk/mcp\";\nimport type { MCPClient } from \"@ai-sdk/mcp\";\nimport { Experimental_StdioMCPTransport } from \"@ai-sdk/mcp/mcp-stdio\";\nimport type { Driver, DriverState, DriverStreamEvent } from \"@agentxjs/core/driver\";\nimport type { UserMessage } from \"@agentxjs/core/agent\";\nimport type { Session } from \"@agentxjs/core/session\";\nimport { createLogger } from \"commonxjs/logger\";\nimport type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from \"./types\";\nimport { toVercelMessages, toStopReason, createEvent, toVercelTools } from \"./converters\";\n\nconst logger = createLogger(\"mono-driver/MonoDriver\");\n\n/**\n * MonoDriver - Driver implementation using Vercel AI SDK\n */\nexport class MonoDriver implements Driver {\n readonly name = \"MonoDriver\";\n\n private _sessionId: string | null = null;\n private _state: DriverState = \"idle\";\n private abortController: AbortController | null = null;\n\n private readonly config: MonoDriverConfig;\n private readonly session?: Session;\n private readonly provider: MonoProvider;\n private readonly maxSteps: number;\n private readonly compatibleConfig?: OpenAICompatibleConfig;\n\n /** MCP clients created during initialize() */\n private mcpClients: MCPClient[] = [];\n /** Tools discovered from MCP servers */\n private mcpTools: ToolSet = {};\n\n constructor(config: MonoDriverConfig) {\n this.config = config;\n this.session = config.session;\n this.provider = config.options?.provider ?? \"anthropic\";\n this.maxSteps = config.options?.maxSteps ?? 10;\n this.compatibleConfig = config.options?.compatibleConfig;\n }\n\n // ============================================================================\n // Driver Interface Properties\n // ============================================================================\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get state(): DriverState {\n return this._state;\n }\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this._state !== \"idle\") {\n throw new Error(`Cannot initialize: Driver is in \"${this._state}\" state`);\n }\n\n logger.info(\"Initializing MonoDriver\", {\n agentId: this.config.agentId,\n provider: this.provider,\n });\n\n // Generate a session ID for tracking\n this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n // Notify session ID captured\n this.config.onSessionIdCaptured?.(this._sessionId);\n\n // Initialize MCP servers\n if (this.config.mcpServers) {\n for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {\n let client: MCPClient;\n\n if (\"command\" in serverConfig) {\n // Stdio transport — local subprocess\n const transport = new Experimental_StdioMCPTransport({\n command: serverConfig.command,\n args: serverConfig.args,\n env: serverConfig.env,\n });\n client = await createMCPClient({ transport });\n } else {\n // HTTP Streamable transport — remote server\n client = await createMCPClient({\n transport: {\n type: serverConfig.type,\n url: serverConfig.url,\n headers: serverConfig.headers,\n },\n });\n }\n\n this.mcpClients.push(client);\n const tools = await client.tools();\n Object.assign(this.mcpTools, tools);\n logger.info(\"MCP server connected\", {\n name,\n toolCount: Object.keys(tools).length,\n });\n }\n }\n\n logger.info(\"MonoDriver initialized\", { sessionId: this._sessionId });\n }\n\n async dispose(): Promise<void> {\n if (this._state === \"disposed\") {\n return;\n }\n\n logger.info(\"Disposing MonoDriver\", { agentId: this.config.agentId });\n\n // Abort any ongoing request\n this.abortController?.abort();\n this.abortController = null;\n\n // Close MCP clients\n for (const client of this.mcpClients) {\n await client.close();\n }\n this.mcpClients = [];\n this.mcpTools = {};\n\n this._state = \"disposed\";\n logger.info(\"MonoDriver disposed\");\n }\n\n // ============================================================================\n // Core Methods\n // ============================================================================\n\n async *receive(message: UserMessage): AsyncIterable<DriverStreamEvent> {\n if (this._state === \"disposed\") {\n throw new Error(\"Cannot receive: Driver is disposed\");\n }\n\n if (this._state === \"active\") {\n throw new Error(\"Cannot receive: Driver is already processing a message\");\n }\n\n this._state = \"active\";\n this.abortController = new AbortController();\n\n try {\n // Get history from Session\n const history = this.session ? await this.session.getMessages() : [];\n\n // Convert to Vercel AI SDK format\n const messages = toVercelMessages(history);\n\n // Add current user message\n messages.push({\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (\"text\" in part) return { type: \"text\" as const, text: part.text };\n return { type: \"text\" as const, text: String(part) };\n }),\n });\n\n logger.debug(\"Sending message to LLM\", {\n provider: this.provider,\n messageCount: messages.length,\n agentId: this.config.agentId,\n });\n\n // Call Vercel AI SDK (v6)\n const result = streamText({\n model: this.getModel(),\n system: this.config.systemPrompt,\n messages,\n tools: this.mergeTools(),\n stopWhen: stepCountIs(this.maxSteps),\n abortSignal: this.abortController.signal,\n });\n\n // Track state for event conversion\n let messageStartEmitted = false;\n // Track tool calls in current step for correct message ordering.\n // AI SDK emits: tool-call → tool-result → finish-step\n // Engine needs: AssistantMessage(with tool-calls) BEFORE ToolResultMessage\n // So we inject message_stop before the first tool-result in each step.\n let hasToolCallsInStep = false;\n\n // Process fullStream (AI SDK v6 event types)\n for await (const part of result.fullStream) {\n if (this.abortController?.signal.aborted) {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n break;\n }\n\n switch (part.type) {\n case \"start\":\n case \"start-step\":\n if (!messageStartEmitted) {\n const messageId = `msg_${Date.now()}`;\n const model = this.config.model ?? this.getDefaultModel();\n yield createEvent(\"message_start\", { messageId, model });\n messageStartEmitted = true;\n }\n hasToolCallsInStep = false;\n break;\n\n case \"text-delta\":\n yield createEvent(\"text_delta\", { text: part.text });\n break;\n\n case \"tool-input-start\":\n yield createEvent(\"tool_use_start\", {\n toolCallId: part.id,\n toolName: part.toolName,\n });\n break;\n\n case \"tool-input-delta\":\n yield createEvent(\"input_json_delta\", {\n partialJson: part.delta,\n });\n break;\n\n case \"tool-call\":\n hasToolCallsInStep = true;\n yield createEvent(\"tool_use_stop\", {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input as Record<string, unknown>,\n });\n break;\n\n case \"tool-result\":\n // Flush AssistantMessage before first tool-result in this step.\n // Ensures correct ordering: Assistant(tool-calls) → ToolResult\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.output,\n isError: false,\n });\n break;\n\n case \"tool-error\":\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.error,\n isError: true,\n });\n break;\n\n case \"finish-step\":\n // Emit usage data for this step\n if (part.usage) {\n yield createEvent(\"message_delta\", {\n usage: {\n inputTokens: part.usage.inputTokens ?? 0,\n outputTokens: part.usage.outputTokens ?? 0,\n },\n });\n }\n // Reset for next step so start-step emits a new message_start\n messageStartEmitted = false;\n break;\n\n case \"finish\":\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(part.finishReason),\n });\n break;\n\n case \"error\":\n yield createEvent(\"error\", {\n message: String(part.error),\n errorCode: \"stream_error\",\n });\n break;\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n } else {\n yield createEvent(\"error\", {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n });\n throw error;\n }\n } finally {\n this._state = \"idle\";\n this.abortController = null;\n }\n }\n\n interrupt(): void {\n if (this._state !== \"active\") {\n logger.debug(\"Interrupt called but no active operation\");\n return;\n }\n\n logger.debug(\"Interrupting MonoDriver\");\n this.abortController?.abort();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Merge MCP tools and config tools into a single ToolSet.\n * Config tools (bash etc.) take precedence over MCP tools with the same name.\n */\n private mergeTools(): ToolSet | undefined {\n const configTools = this.config.tools?.length ? toVercelTools(this.config.tools) : {};\n const merged = { ...this.mcpTools, ...configTools };\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n private getModel() {\n const modelId = this.config.model ?? this.getDefaultModel();\n const { apiKey } = this.config;\n const baseURL = this.getBaseURL();\n\n switch (this.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey, baseURL })(modelId);\n case \"openai\":\n return createOpenAI({ apiKey, baseURL })(modelId);\n case \"google\":\n return createGoogleGenerativeAI({ apiKey, baseURL })(modelId);\n case \"xai\":\n return createXai({ apiKey, baseURL })(modelId);\n case \"deepseek\":\n return createDeepSeek({ apiKey, baseURL })(modelId);\n case \"mistral\":\n return createMistral({ apiKey, baseURL })(modelId);\n case \"openai-compatible\": {\n if (!this.compatibleConfig) {\n throw new Error(\"openai-compatible provider requires compatibleConfig in options\");\n }\n const provider = createOpenAICompatible({\n name: this.compatibleConfig.name,\n baseURL: this.compatibleConfig.baseURL,\n apiKey: this.compatibleConfig.apiKey ?? apiKey,\n });\n return provider.chatModel(modelId);\n }\n default:\n return createAnthropic({ apiKey, baseURL })(modelId);\n }\n }\n\n /**\n * Get the base URL for the provider SDK.\n *\n * Provider SDKs expect baseURL to include the version path (e.g. /v1).\n * DriverConfig.baseUrl is the API root without version path.\n * This method bridges the gap.\n */\n private getBaseURL(): string | undefined {\n if (!this.config.baseUrl) return undefined;\n const base = this.config.baseUrl.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return base;\n return `${base}/v1`;\n }\n\n private getDefaultModel(): string {\n switch (this.provider) {\n case \"anthropic\":\n return \"claude-sonnet-4-20250514\";\n case \"openai\":\n return \"gpt-4o\";\n case \"google\":\n return \"gemini-2.0-flash\";\n case \"xai\":\n return \"grok-3\";\n case \"deepseek\":\n return \"deepseek-chat\";\n case \"mistral\":\n return \"mistral-large-latest\";\n case \"openai-compatible\":\n return \"default\";\n default:\n return \"claude-sonnet-4-20250514\";\n }\n }\n}\n\n/**\n * Create a MonoDriver instance\n */\nexport function createMonoDriver(config: MonoDriverConfig): Driver {\n return new MonoDriver(config);\n}\n","/**\n * Message and Event Converters\n *\n * Converts between AgentX types and Vercel AI SDK v6 types\n */\n\nimport { tool, jsonSchema } from \"ai\";\nimport type { ModelMessage, ToolSet } from \"ai\";\nimport type { Message, ToolResultMessage } from \"@agentxjs/core/agent\";\nimport type { DriverStreamEvent, StopReason, ToolDefinition } from \"@agentxjs/core/driver\";\n\n// ============================================================================\n// Message Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX Message to Vercel ModelMessage\n */\nexport function toVercelMessage(message: Message): ModelMessage | null {\n switch (message.subtype) {\n case \"user\":\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\" ? message.content : extractText(message.content),\n };\n\n case \"assistant\": {\n // Assistant message may contain text and tool calls in content\n const content = \"content\" in message ? message.content : \"\";\n if (typeof content === \"string\") {\n return { role: \"assistant\", content };\n }\n // Extract tool calls from content parts\n const toolCalls = content.filter(\n (p): p is { type: \"tool-call\"; id: string; name: string; input: Record<string, unknown> } =>\n p.type === \"tool-call\"\n );\n if (toolCalls.length > 0) {\n // Vercel AI SDK format: assistant with tool-call content\n return {\n role: \"assistant\",\n content: [\n ...content\n .filter((p) => p.type === \"text\")\n .map((p) => ({ type: \"text\" as const, text: (p as { text: string }).text })),\n ...toolCalls.map((tc) => ({\n type: \"tool-call\" as const,\n toolCallId: tc.id,\n toolName: tc.name,\n input: tc.input,\n })),\n ],\n } as unknown as ModelMessage;\n }\n return { role: \"assistant\", content: extractText(content) };\n }\n\n case \"tool-result\": {\n const msg = message as ToolResultMessage;\n return {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\" as const,\n toolCallId: msg.toolCallId,\n toolName: msg.toolResult.name,\n output: msg.toolResult.output,\n },\n ],\n } as unknown as ModelMessage;\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert array of AgentX Messages to Vercel ModelMessages\n */\nexport function toVercelMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n for (const message of messages) {\n const converted = toVercelMessage(message);\n if (converted) {\n result.push(converted);\n }\n }\n return result;\n}\n\n/**\n * Extract text from any content shape\n */\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\") return content;\n\n if (Array.isArray(content)) {\n return content\n .filter(\n (part) =>\n part !== null &&\n typeof part === \"object\" &&\n \"text\" in part &&\n typeof part.text === \"string\"\n )\n .map((part) => part.text)\n .join(\"\");\n }\n\n return String(content ?? \"\");\n}\n\n// ============================================================================\n// Event Converters (Vercel AI SDK → AgentX)\n// ============================================================================\n\n/**\n * Map Vercel AI SDK v6 finish reason to AgentX StopReason\n */\nexport function toStopReason(finishReason: string | null | undefined): StopReason {\n switch (finishReason) {\n case \"stop\":\n return \"end_turn\";\n case \"length\":\n return \"max_tokens\";\n case \"tool-calls\":\n return \"tool_use\";\n case \"content-filter\":\n return \"content_filter\";\n case \"error\":\n return \"error\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Create a DriverStreamEvent with timestamp\n */\nexport function createEvent<T extends DriverStreamEvent[\"type\"]>(\n type: T,\n data: Extract<DriverStreamEvent, { type: T }>[\"data\"]\n): DriverStreamEvent {\n return {\n type,\n timestamp: Date.now(),\n data,\n } as DriverStreamEvent;\n}\n\n// ============================================================================\n// Tool Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX ToolDefinitions to Vercel AI SDK tool format\n *\n * Uses jsonSchema() instead of Zod to avoid adding Zod dependency to core.\n * Type casts are needed to bridge our ToolDefinition.parameters (simplified\n * JSON Schema) to the AI SDK's strict JSONSchema7 type.\n */\nexport function toVercelTools(tools: ToolDefinition[]): ToolSet {\n const result: ToolSet = {};\n for (const t of tools) {\n result[t.name] = tool({\n description: t.description,\n\n inputSchema: jsonSchema(t.parameters as any),\n execute: async (input) => t.execute(input as Record<string, unknown>),\n });\n }\n return result;\n}\n","/**\n * @agentxjs/mono-driver\n *\n * Unified cross-platform Driver using Vercel AI SDK.\n *\n * Features:\n * - Multi-provider: Anthropic, OpenAI, Google (and more)\n * - Cross-platform: Node.js, Bun, Cloudflare Workers, Edge Runtime\n * - Lightweight: Direct HTTP API calls, no subprocess\n *\n * @example\n * ```typescript\n * import { createMonoDriver } from \"@agentxjs/mono-driver\";\n *\n * const driver = createMonoDriver({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * agentId: \"my-agent\",\n * systemPrompt: \"You are helpful\",\n * options: {\n * provider: \"anthropic\",\n * maxSteps: 10,\n * },\n * });\n *\n * await driver.initialize();\n *\n * for await (const event of driver.receive({ content: \"Hello\" })) {\n * if (event.type === \"text_delta\") {\n * process.stdout.write(event.data.text);\n * }\n * }\n *\n * await driver.dispose();\n * ```\n */\n\n// Main exports\nexport { MonoDriver, createMonoDriver } from \"./MonoDriver\";\n\n// Types\nexport type {\n MonoDriverConfig,\n MonoDriverOptions,\n MonoProvider,\n MonoBuiltinProvider,\n OpenAICompatibleConfig,\n} from \"./types\";\n\n// Converters (for advanced usage)\nexport { toVercelMessage, toVercelMessages, toStopReason, createEvent } from \"./converters\";\n\n// Re-export Vercel AI SDK utilities for advanced usage\nexport { stepCountIs } from \"ai\";\n"],"mappings":"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","names":["stepCountIs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/converters.ts","../src/MonoDriver.ts"],"sourcesContent":["/**\n * @agentxjs/mono-driver\n *\n * Unified cross-platform Driver using Vercel AI SDK.\n *\n * Features:\n * - Multi-provider: Anthropic, OpenAI, Google (and more)\n * - Cross-platform: Node.js, Bun, Cloudflare Workers, Edge Runtime\n * - Lightweight: Direct HTTP API calls, no subprocess\n *\n * @example\n * ```typescript\n * import { createMonoDriver } from \"@agentxjs/mono-driver\";\n *\n * const driver = createMonoDriver({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * agentId: \"my-agent\",\n * systemPrompt: \"You are helpful\",\n * options: {\n * provider: \"anthropic\",\n * maxSteps: 10,\n * },\n * });\n *\n * await driver.initialize();\n *\n * for await (const event of driver.receive({ content: \"Hello\" })) {\n * if (event.type === \"text_delta\") {\n * process.stdout.write(event.data.text);\n * }\n * }\n *\n * await driver.dispose();\n * ```\n */\n\n// Re-export Vercel AI SDK utilities for advanced usage\nexport { stepCountIs } from \"ai\";\n// Converters (for advanced usage)\nexport { createEvent, toStopReason, toVercelMessage, toVercelMessages } from \"./converters\";\n// Main exports\nexport { createMonoDriver, MonoDriver } from \"./MonoDriver\";\n// Types\nexport type {\n MonoBuiltinProvider,\n MonoDriverConfig,\n MonoDriverOptions,\n MonoProvider,\n OpenAICompatibleConfig,\n} from \"./types\";\n","/**\n * Message and Event Converters\n *\n * Converts between AgentX types and Vercel AI SDK v6 types\n */\n\nimport type { Message, ToolResultMessage } from \"@agentxjs/core/agent\";\nimport type { DriverStreamEvent, StopReason, ToolDefinition } from \"@agentxjs/core/driver\";\nimport type { ModelMessage, ToolSet } from \"ai\";\nimport { jsonSchema, tool } from \"ai\";\n\n// ============================================================================\n// Message Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX Message to Vercel ModelMessage\n */\nexport function toVercelMessage(message: Message): ModelMessage | null {\n switch (message.subtype) {\n case \"user\":\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\" ? message.content : extractText(message.content),\n };\n\n case \"assistant\": {\n // Assistant message may contain text and tool calls in content\n const content = \"content\" in message ? message.content : \"\";\n if (typeof content === \"string\") {\n return { role: \"assistant\", content };\n }\n // Extract tool calls from content parts\n const toolCalls = content.filter(\n (p): p is { type: \"tool-call\"; id: string; name: string; input: Record<string, unknown> } =>\n p.type === \"tool-call\"\n );\n if (toolCalls.length > 0) {\n // Vercel AI SDK format: assistant with tool-call content\n return {\n role: \"assistant\",\n content: [\n ...content\n .filter((p) => p.type === \"text\")\n .map((p) => ({ type: \"text\" as const, text: (p as { text: string }).text })),\n ...toolCalls.map((tc) => ({\n type: \"tool-call\" as const,\n toolCallId: tc.id,\n toolName: tc.name,\n input: tc.input,\n })),\n ],\n } as unknown as ModelMessage;\n }\n return { role: \"assistant\", content: extractText(content) };\n }\n\n case \"tool-result\": {\n const msg = message as ToolResultMessage;\n return {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\" as const,\n toolCallId: msg.toolCallId,\n toolName: msg.toolResult.name,\n output: msg.toolResult.output,\n },\n ],\n } as unknown as ModelMessage;\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert array of AgentX Messages to Vercel ModelMessages\n */\nexport function toVercelMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n for (const message of messages) {\n const converted = toVercelMessage(message);\n if (converted) {\n result.push(converted);\n }\n }\n return result;\n}\n\n/**\n * Extract text from any content shape\n */\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\") return content;\n\n if (Array.isArray(content)) {\n return content\n .filter(\n (part) =>\n part !== null &&\n typeof part === \"object\" &&\n \"text\" in part &&\n typeof part.text === \"string\"\n )\n .map((part) => part.text)\n .join(\"\");\n }\n\n return String(content ?? \"\");\n}\n\n// ============================================================================\n// Event Converters (Vercel AI SDK → AgentX)\n// ============================================================================\n\n/**\n * Map Vercel AI SDK v6 finish reason to AgentX StopReason\n */\nexport function toStopReason(finishReason: string | null | undefined): StopReason {\n switch (finishReason) {\n case \"stop\":\n return \"end_turn\";\n case \"length\":\n return \"max_tokens\";\n case \"tool-calls\":\n return \"tool_use\";\n case \"content-filter\":\n return \"content_filter\";\n case \"error\":\n return \"error\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Create a DriverStreamEvent with timestamp\n */\nexport function createEvent<T extends DriverStreamEvent[\"type\"]>(\n type: T,\n data: Extract<DriverStreamEvent, { type: T }>[\"data\"]\n): DriverStreamEvent {\n return {\n type,\n timestamp: Date.now(),\n data,\n } as DriverStreamEvent;\n}\n\n// ============================================================================\n// Tool Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX ToolDefinitions to Vercel AI SDK tool format\n *\n * Uses jsonSchema() instead of Zod to avoid adding Zod dependency to core.\n * Type casts are needed to bridge our ToolDefinition.parameters (simplified\n * JSON Schema) to the AI SDK's strict JSONSchema7 type.\n */\nexport function toVercelTools(tools: ToolDefinition[]): ToolSet {\n const result: ToolSet = {};\n for (const t of tools) {\n result[t.name] = tool({\n description: t.description,\n\n inputSchema: jsonSchema(t.parameters as any),\n execute: async (input) => t.execute(input as Record<string, unknown>),\n });\n }\n return result;\n}\n","/**\n * MonoDriver - Unified Cross-Platform Driver\n *\n * Implements the Driver interface using Vercel AI SDK.\n * Supports multiple LLM providers (Anthropic, OpenAI, Google).\n *\n * ```\n * UserMessage\n * │\n * ▼\n * ┌─────────────────┐\n * │ MonoDriver │\n * │ │\n * │ receive() │──► AsyncIterable<DriverStreamEvent>\n * │ │ │\n * │ ▼ │\n * │ Vercel AI SDK │\n * └─────────────────┘\n * │\n * ▼\n * LLM Provider\n * (Anthropic/OpenAI/...)\n * ```\n */\n\nimport type { UserMessage } from \"@agentxjs/core/agent\";\nimport type { Driver, DriverState, DriverStreamEvent } from \"@agentxjs/core/driver\";\nimport type { Session } from \"@agentxjs/core/session\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport type { ToolSet } from \"ai\";\nimport { stepCountIs, streamText } from \"ai\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createEvent, toStopReason, toVercelMessages, toVercelTools } from \"./converters\";\nimport type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from \"./types\";\n\nconst logger = createLogger(\"mono-driver/MonoDriver\");\n\n/**\n * MonoDriver - Driver implementation using Vercel AI SDK\n */\nexport class MonoDriver implements Driver {\n readonly name = \"MonoDriver\";\n\n private _sessionId: string | null = null;\n private _state: DriverState = \"idle\";\n private abortController: AbortController | null = null;\n\n private readonly config: MonoDriverConfig;\n private readonly session?: Session;\n private readonly provider: MonoProvider;\n private readonly maxSteps: number;\n private readonly compatibleConfig?: OpenAICompatibleConfig;\n\n constructor(config: MonoDriverConfig) {\n this.config = config;\n this.session = config.session;\n this.provider = config.options?.provider ?? \"anthropic\";\n this.maxSteps = config.options?.maxSteps ?? 10;\n this.compatibleConfig = config.options?.compatibleConfig;\n }\n\n // ============================================================================\n // Driver Interface Properties\n // ============================================================================\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get state(): DriverState {\n return this._state;\n }\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this._state !== \"idle\") {\n throw new Error(`Cannot initialize: Driver is in \"${this._state}\" state`);\n }\n\n logger.info(\"Initializing MonoDriver\", {\n agentId: this.config.agentId,\n provider: this.provider,\n });\n\n // Generate a session ID for tracking\n this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n // Notify session ID captured\n this.config.onSessionIdCaptured?.(this._sessionId);\n\n logger.info(\"MonoDriver initialized\", { sessionId: this._sessionId });\n }\n\n async dispose(): Promise<void> {\n if (this._state === \"disposed\") {\n return;\n }\n\n logger.info(\"Disposing MonoDriver\", { agentId: this.config.agentId });\n\n // Abort any ongoing request\n this.abortController?.abort();\n this.abortController = null;\n\n this._state = \"disposed\";\n logger.info(\"MonoDriver disposed\");\n }\n\n // ============================================================================\n // Core Methods\n // ============================================================================\n\n async *receive(message: UserMessage): AsyncIterable<DriverStreamEvent> {\n if (this._state === \"disposed\") {\n throw new Error(\"Cannot receive: Driver is disposed\");\n }\n\n if (this._state === \"active\") {\n throw new Error(\"Cannot receive: Driver is already processing a message\");\n }\n\n this._state = \"active\";\n this.abortController = new AbortController();\n\n try {\n // Get history from Session\n const history = this.session ? await this.session.getMessages() : [];\n\n // Convert to Vercel AI SDK format\n const messages = toVercelMessages(history);\n\n // Add current user message\n messages.push({\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (\"text\" in part) return { type: \"text\" as const, text: part.text };\n return { type: \"text\" as const, text: String(part) };\n }),\n });\n\n logger.debug(\"Sending message to LLM\", {\n provider: this.provider,\n messageCount: messages.length,\n agentId: this.config.agentId,\n });\n\n // Call Vercel AI SDK (v6)\n const result = streamText({\n model: this.getModel(),\n system: this.config.systemPrompt,\n messages,\n tools: this.getTools(),\n stopWhen: stepCountIs(this.maxSteps),\n abortSignal: this.abortController.signal,\n });\n\n // Track state for event conversion\n let messageStartEmitted = false;\n // Track tool calls in current step for correct message ordering.\n // AI SDK emits: tool-call → tool-result → finish-step\n // Engine needs: AssistantMessage(with tool-calls) BEFORE ToolResultMessage\n // So we inject message_stop before the first tool-result in each step.\n let hasToolCallsInStep = false;\n\n // Process fullStream (AI SDK v6 event types)\n for await (const part of result.fullStream) {\n if (this.abortController?.signal.aborted) {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n break;\n }\n\n switch (part.type) {\n case \"start\":\n case \"start-step\":\n if (!messageStartEmitted) {\n const messageId = `msg_${Date.now()}`;\n const model = this.config.model ?? this.getDefaultModel();\n yield createEvent(\"message_start\", { messageId, model });\n messageStartEmitted = true;\n }\n hasToolCallsInStep = false;\n break;\n\n case \"text-delta\":\n yield createEvent(\"text_delta\", { text: part.text });\n break;\n\n case \"tool-input-start\":\n yield createEvent(\"tool_use_start\", {\n toolCallId: part.id,\n toolName: part.toolName,\n });\n break;\n\n case \"tool-input-delta\":\n yield createEvent(\"input_json_delta\", {\n partialJson: part.delta,\n });\n break;\n\n case \"tool-call\":\n hasToolCallsInStep = true;\n yield createEvent(\"tool_use_stop\", {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input as Record<string, unknown>,\n });\n break;\n\n case \"tool-result\":\n // Flush AssistantMessage before first tool-result in this step.\n // Ensures correct ordering: Assistant(tool-calls) → ToolResult\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.output,\n isError: false,\n });\n break;\n\n case \"tool-error\":\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.error,\n isError: true,\n });\n break;\n\n case \"finish-step\":\n // Emit usage data for this step\n if (part.usage) {\n yield createEvent(\"message_delta\", {\n usage: {\n inputTokens: part.usage.inputTokens ?? 0,\n outputTokens: part.usage.outputTokens ?? 0,\n },\n });\n }\n // Reset for next step so start-step emits a new message_start\n messageStartEmitted = false;\n break;\n\n case \"finish\":\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(part.finishReason),\n });\n break;\n\n case \"error\":\n yield createEvent(\"error\", {\n message: String(part.error),\n errorCode: \"stream_error\",\n });\n break;\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n } else {\n yield createEvent(\"error\", {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n });\n throw error;\n }\n } finally {\n this._state = \"idle\";\n this.abortController = null;\n }\n }\n\n interrupt(): void {\n if (this._state !== \"active\") {\n logger.debug(\"Interrupt called but no active operation\");\n return;\n }\n\n logger.debug(\"Interrupting MonoDriver\");\n this.abortController?.abort();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Convert config tools to Vercel AI SDK ToolSet.\n * Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).\n */\n private getTools(): ToolSet | undefined {\n if (!this.config.tools?.length) return undefined;\n return toVercelTools(this.config.tools);\n }\n\n private getModel() {\n const modelId = this.config.model ?? this.getDefaultModel();\n const { apiKey } = this.config;\n const baseURL = this.getBaseURL();\n\n switch (this.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey, baseURL })(modelId);\n case \"openai\":\n return createOpenAI({ apiKey, baseURL })(modelId);\n case \"google\":\n return createGoogleGenerativeAI({ apiKey, baseURL })(modelId);\n case \"xai\":\n return createXai({ apiKey, baseURL })(modelId);\n case \"deepseek\":\n return createDeepSeek({ apiKey, baseURL })(modelId);\n case \"mistral\":\n return createMistral({ apiKey, baseURL })(modelId);\n case \"openai-compatible\": {\n if (!this.compatibleConfig) {\n throw new Error(\"openai-compatible provider requires compatibleConfig in options\");\n }\n const provider = createOpenAICompatible({\n name: this.compatibleConfig.name,\n baseURL: this.compatibleConfig.baseURL,\n apiKey: this.compatibleConfig.apiKey ?? apiKey,\n });\n return provider.chatModel(modelId);\n }\n default:\n return createAnthropic({ apiKey, baseURL })(modelId);\n }\n }\n\n /**\n * Get the base URL for the provider SDK.\n *\n * Provider SDKs expect baseURL to include the version path (e.g. /v1).\n * DriverConfig.baseUrl is the API root without version path.\n * This method bridges the gap.\n */\n private getBaseURL(): string | undefined {\n if (!this.config.baseUrl) return undefined;\n const base = this.config.baseUrl.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return base;\n return `${base}/v1`;\n }\n\n private getDefaultModel(): string {\n switch (this.provider) {\n case \"anthropic\":\n return \"claude-sonnet-4-20250514\";\n case \"openai\":\n return \"gpt-4o\";\n case \"google\":\n return \"gemini-2.0-flash\";\n case \"xai\":\n return \"grok-3\";\n case \"deepseek\":\n return \"deepseek-chat\";\n case \"mistral\":\n return \"mistral-large-latest\";\n case \"openai-compatible\":\n return \"default\";\n default:\n return \"claude-sonnet-4-20250514\";\n }\n }\n}\n\n/**\n * Create a MonoDriver instance\n */\nexport function createMonoDriver(config: MonoDriverConfig): Driver {\n return new MonoDriver(config);\n}\n"],"mappings":"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","names":["stepCountIs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentxjs/mono-driver",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Unified cross-platform Driver using Vercel AI SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,11 +22,10 @@
22
22
  "test": "echo 'No tests yet'"
23
23
  },
24
24
  "dependencies": {
25
- "@agentxjs/core": "^2.0.0",
25
+ "@agentxjs/core": "^2.0.1",
26
26
  "@ai-sdk/anthropic": "^3.0.36",
27
27
  "@ai-sdk/deepseek": "2.0.17",
28
28
  "@ai-sdk/google": "^3.0.21",
29
- "@ai-sdk/mcp": "1.0.18",
30
29
  "@ai-sdk/mistral": "3.0.18",
31
30
  "@ai-sdk/openai": "^3.0.25",
32
31
  "@ai-sdk/openai-compatible": "2.0.27",
package/src/MonoDriver.ts CHANGED
@@ -23,24 +23,21 @@
23
23
  * ```
24
24
  */
25
25
 
26
- import { streamText, stepCountIs } from "ai";
27
- import type { ToolSet } from "ai";
26
+ import type { UserMessage } from "@agentxjs/core/agent";
27
+ import type { Driver, DriverState, DriverStreamEvent } from "@agentxjs/core/driver";
28
+ import type { Session } from "@agentxjs/core/session";
28
29
  import { createAnthropic } from "@ai-sdk/anthropic";
29
- import { createOpenAI } from "@ai-sdk/openai";
30
- import { createGoogleGenerativeAI } from "@ai-sdk/google";
31
- import { createXai } from "@ai-sdk/xai";
32
30
  import { createDeepSeek } from "@ai-sdk/deepseek";
31
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
33
32
  import { createMistral } from "@ai-sdk/mistral";
33
+ import { createOpenAI } from "@ai-sdk/openai";
34
34
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
35
- import { createMCPClient } from "@ai-sdk/mcp";
36
- import type { MCPClient } from "@ai-sdk/mcp";
37
- import { Experimental_StdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
38
- import type { Driver, DriverState, DriverStreamEvent } from "@agentxjs/core/driver";
39
- import type { UserMessage } from "@agentxjs/core/agent";
40
- import type { Session } from "@agentxjs/core/session";
35
+ import { createXai } from "@ai-sdk/xai";
36
+ import type { ToolSet } from "ai";
37
+ import { stepCountIs, streamText } from "ai";
41
38
  import { createLogger } from "commonxjs/logger";
39
+ import { createEvent, toStopReason, toVercelMessages, toVercelTools } from "./converters";
42
40
  import type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from "./types";
43
- import { toVercelMessages, toStopReason, createEvent, toVercelTools } from "./converters";
44
41
 
45
42
  const logger = createLogger("mono-driver/MonoDriver");
46
43
 
@@ -60,11 +57,6 @@ export class MonoDriver implements Driver {
60
57
  private readonly maxSteps: number;
61
58
  private readonly compatibleConfig?: OpenAICompatibleConfig;
62
59
 
63
- /** MCP clients created during initialize() */
64
- private mcpClients: MCPClient[] = [];
65
- /** Tools discovered from MCP servers */
66
- private mcpTools: ToolSet = {};
67
-
68
60
  constructor(config: MonoDriverConfig) {
69
61
  this.config = config;
70
62
  this.session = config.session;
@@ -105,40 +97,6 @@ export class MonoDriver implements Driver {
105
97
  // Notify session ID captured
106
98
  this.config.onSessionIdCaptured?.(this._sessionId);
107
99
 
108
- // Initialize MCP servers
109
- if (this.config.mcpServers) {
110
- for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
111
- let client: MCPClient;
112
-
113
- if ("command" in serverConfig) {
114
- // Stdio transport — local subprocess
115
- const transport = new Experimental_StdioMCPTransport({
116
- command: serverConfig.command,
117
- args: serverConfig.args,
118
- env: serverConfig.env,
119
- });
120
- client = await createMCPClient({ transport });
121
- } else {
122
- // HTTP Streamable transport — remote server
123
- client = await createMCPClient({
124
- transport: {
125
- type: serverConfig.type,
126
- url: serverConfig.url,
127
- headers: serverConfig.headers,
128
- },
129
- });
130
- }
131
-
132
- this.mcpClients.push(client);
133
- const tools = await client.tools();
134
- Object.assign(this.mcpTools, tools);
135
- logger.info("MCP server connected", {
136
- name,
137
- toolCount: Object.keys(tools).length,
138
- });
139
- }
140
- }
141
-
142
100
  logger.info("MonoDriver initialized", { sessionId: this._sessionId });
143
101
  }
144
102
 
@@ -153,13 +111,6 @@ export class MonoDriver implements Driver {
153
111
  this.abortController?.abort();
154
112
  this.abortController = null;
155
113
 
156
- // Close MCP clients
157
- for (const client of this.mcpClients) {
158
- await client.close();
159
- }
160
- this.mcpClients = [];
161
- this.mcpTools = {};
162
-
163
114
  this._state = "disposed";
164
115
  logger.info("MonoDriver disposed");
165
116
  }
@@ -210,7 +161,7 @@ export class MonoDriver implements Driver {
210
161
  model: this.getModel(),
211
162
  system: this.config.systemPrompt,
212
163
  messages,
213
- tools: this.mergeTools(),
164
+ tools: this.getTools(),
214
165
  stopWhen: stepCountIs(this.maxSteps),
215
166
  abortSignal: this.abortController.signal,
216
167
  });
@@ -357,13 +308,12 @@ export class MonoDriver implements Driver {
357
308
  // ============================================================================
358
309
 
359
310
  /**
360
- * Merge MCP tools and config tools into a single ToolSet.
361
- * Config tools (bash etc.) take precedence over MCP tools with the same name.
311
+ * Convert config tools to Vercel AI SDK ToolSet.
312
+ * Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
362
313
  */
363
- private mergeTools(): ToolSet | undefined {
364
- const configTools = this.config.tools?.length ? toVercelTools(this.config.tools) : {};
365
- const merged = { ...this.mcpTools, ...configTools };
366
- return Object.keys(merged).length > 0 ? merged : undefined;
314
+ private getTools(): ToolSet | undefined {
315
+ if (!this.config.tools?.length) return undefined;
316
+ return toVercelTools(this.config.tools);
367
317
  }
368
318
 
369
319
  private getModel() {
package/src/converters.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  * Converts between AgentX types and Vercel AI SDK v6 types
5
5
  */
6
6
 
7
- import { tool, jsonSchema } from "ai";
8
- import type { ModelMessage, ToolSet } from "ai";
9
7
  import type { Message, ToolResultMessage } from "@agentxjs/core/agent";
10
8
  import type { DriverStreamEvent, StopReason, ToolDefinition } from "@agentxjs/core/driver";
9
+ import type { ModelMessage, ToolSet } from "ai";
10
+ import { jsonSchema, tool } from "ai";
11
11
 
12
12
  // ============================================================================
13
13
  // Message Converters (AgentX → Vercel AI SDK v6)
package/src/index.ts CHANGED
@@ -34,20 +34,17 @@
34
34
  * ```
35
35
  */
36
36
 
37
+ // Re-export Vercel AI SDK utilities for advanced usage
38
+ export { stepCountIs } from "ai";
39
+ // Converters (for advanced usage)
40
+ export { createEvent, toStopReason, toVercelMessage, toVercelMessages } from "./converters";
37
41
  // Main exports
38
- export { MonoDriver, createMonoDriver } from "./MonoDriver";
39
-
42
+ export { createMonoDriver, MonoDriver } from "./MonoDriver";
40
43
  // Types
41
44
  export type {
45
+ MonoBuiltinProvider,
42
46
  MonoDriverConfig,
43
47
  MonoDriverOptions,
44
48
  MonoProvider,
45
- MonoBuiltinProvider,
46
49
  OpenAICompatibleConfig,
47
50
  } from "./types";
48
-
49
- // Converters (for advanced usage)
50
- export { toVercelMessage, toVercelMessages, toStopReason, createEvent } from "./converters";
51
-
52
- // Re-export Vercel AI SDK utilities for advanced usage
53
- export { stepCountIs } from "ai";