@toolplex/ai-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +292 -0
  3. package/dist/adapters/index.d.ts +9 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +9 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/types.d.ts +137 -0
  8. package/dist/adapters/types.d.ts.map +1 -0
  9. package/dist/adapters/types.js +14 -0
  10. package/dist/adapters/types.js.map +1 -0
  11. package/dist/core/ChatEngine.d.ts +47 -0
  12. package/dist/core/ChatEngine.d.ts.map +1 -0
  13. package/dist/core/ChatEngine.js +355 -0
  14. package/dist/core/ChatEngine.js.map +1 -0
  15. package/dist/core/ToolBuilder.d.ts +25 -0
  16. package/dist/core/ToolBuilder.d.ts.map +1 -0
  17. package/dist/core/ToolBuilder.js +215 -0
  18. package/dist/core/ToolBuilder.js.map +1 -0
  19. package/dist/core/index.d.ts +6 -0
  20. package/dist/core/index.d.ts.map +1 -0
  21. package/dist/core/index.js +6 -0
  22. package/dist/core/index.js.map +1 -0
  23. package/dist/index.d.ts +41 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +49 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mcp/DefaultStdioTransportFactory.d.ts +27 -0
  28. package/dist/mcp/DefaultStdioTransportFactory.d.ts.map +1 -0
  29. package/dist/mcp/DefaultStdioTransportFactory.js +60 -0
  30. package/dist/mcp/DefaultStdioTransportFactory.js.map +1 -0
  31. package/dist/mcp/MCPClient.d.ts +60 -0
  32. package/dist/mcp/MCPClient.d.ts.map +1 -0
  33. package/dist/mcp/MCPClient.js +164 -0
  34. package/dist/mcp/MCPClient.js.map +1 -0
  35. package/dist/mcp/index.d.ts +10 -0
  36. package/dist/mcp/index.d.ts.map +1 -0
  37. package/dist/mcp/index.js +11 -0
  38. package/dist/mcp/index.js.map +1 -0
  39. package/dist/mcp/paths.d.ts +16 -0
  40. package/dist/mcp/paths.d.ts.map +1 -0
  41. package/dist/mcp/paths.js +58 -0
  42. package/dist/mcp/paths.js.map +1 -0
  43. package/dist/mcp/types.d.ts +85 -0
  44. package/dist/mcp/types.d.ts.map +1 -0
  45. package/dist/mcp/types.js +7 -0
  46. package/dist/mcp/types.js.map +1 -0
  47. package/dist/providers/index.d.ts +40 -0
  48. package/dist/providers/index.d.ts.map +1 -0
  49. package/dist/providers/index.js +148 -0
  50. package/dist/providers/index.js.map +1 -0
  51. package/dist/providers/toolplex.d.ts +43 -0
  52. package/dist/providers/toolplex.d.ts.map +1 -0
  53. package/dist/providers/toolplex.js +168 -0
  54. package/dist/providers/toolplex.js.map +1 -0
  55. package/dist/types/index.d.ts +218 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/index.js +8 -0
  58. package/dist/types/index.js.map +1 -0
  59. package/dist/utils/index.d.ts +8 -0
  60. package/dist/utils/index.d.ts.map +1 -0
  61. package/dist/utils/index.js +8 -0
  62. package/dist/utils/index.js.map +1 -0
  63. package/dist/utils/models.d.ts +30 -0
  64. package/dist/utils/models.d.ts.map +1 -0
  65. package/dist/utils/models.js +52 -0
  66. package/dist/utils/models.js.map +1 -0
  67. package/dist/utils/schema.d.ts +74 -0
  68. package/dist/utils/schema.d.ts.map +1 -0
  69. package/dist/utils/schema.js +253 -0
  70. package/dist/utils/schema.js.map +1 -0
  71. package/package.json +70 -0
  72. package/src/adapters/index.ts +9 -0
  73. package/src/adapters/types.ts +241 -0
  74. package/src/core/ChatEngine.ts +464 -0
  75. package/src/core/ToolBuilder.ts +323 -0
  76. package/src/core/index.ts +6 -0
  77. package/src/index.ts +86 -0
  78. package/src/mcp/DefaultStdioTransportFactory.ts +71 -0
  79. package/src/mcp/MCPClient.ts +209 -0
  80. package/src/mcp/index.ts +24 -0
  81. package/src/mcp/paths.ts +91 -0
  82. package/src/mcp/types.ts +93 -0
  83. package/src/providers/index.ts +177 -0
  84. package/src/providers/toolplex.ts +217 -0
  85. package/src/types/index.ts +290 -0
  86. package/src/utils/index.ts +8 -0
  87. package/src/utils/models.ts +59 -0
  88. package/src/utils/schema.ts +307 -0
@@ -0,0 +1,355 @@
1
+ /**
2
+ * @toolplex/ai-engine - Chat Engine
3
+ *
4
+ * Core streaming engine that orchestrates AI chat sessions.
5
+ * Uses adapters for all platform-specific I/O operations.
6
+ */
7
+ import { streamText, stepCountIs } from "ai";
8
+ import { randomUUID } from "crypto";
9
+ import { getModel, toolplexUsageMap } from "../providers/index.js";
10
+ import { buildMCPTools } from "./ToolBuilder.js";
11
+ export class ChatEngine {
12
+ adapter;
13
+ config;
14
+ initialized = false;
15
+ constructor(options) {
16
+ this.adapter = options.adapter;
17
+ this.config = {
18
+ maxSteps: 50,
19
+ debug: false,
20
+ hiddenTools: ["initialize_toolplex"],
21
+ ...options.config,
22
+ };
23
+ }
24
+ /**
25
+ * Initialize the engine
26
+ */
27
+ async initialize() {
28
+ if (this.initialized)
29
+ return;
30
+ await this.adapter.initialize();
31
+ this.initialized = true;
32
+ }
33
+ /**
34
+ * Shutdown the engine
35
+ */
36
+ async shutdown() {
37
+ if (!this.initialized)
38
+ return;
39
+ await this.adapter.shutdown();
40
+ this.initialized = false;
41
+ }
42
+ /**
43
+ * Initialize MCP for a session
44
+ */
45
+ async initializeMCP(sessionId) {
46
+ const apiKey = await this.adapter.credentials.getToolPlexApiKey();
47
+ const sessionInfo = this.adapter.mcp.getSessionInfo(sessionId);
48
+ if (!sessionInfo.exists) {
49
+ this.adapter.logger.debug("ChatEngine: Initializing MCP transport", {
50
+ sessionId,
51
+ });
52
+ const result = await this.adapter.mcp.createTransport(sessionId, apiKey);
53
+ if (!result.success) {
54
+ throw new Error(`Failed to create MCP transport: ${result.error}`);
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Initialize a session with ToolPlex context
60
+ */
61
+ async initializeSession(sessionId, modelId, provider) {
62
+ try {
63
+ this.adapter.logger.debug("ChatEngine: Initializing session with ToolPlex", {
64
+ sessionId,
65
+ modelId,
66
+ provider,
67
+ });
68
+ // Initialize MCP transport
69
+ await this.initializeMCP(sessionId);
70
+ // Extract model metadata
71
+ const modelParts = modelId.split("/");
72
+ const modelName = modelParts[modelParts.length - 1] || modelId;
73
+ const toolArgs = {
74
+ llm_context: {
75
+ model_family: provider,
76
+ model_name: modelName,
77
+ model_version: modelId,
78
+ chat_client: "toolplex",
79
+ },
80
+ };
81
+ // Call initialize_toolplex to get the context
82
+ const result = await this.adapter.mcp.callTool(sessionId, "initialize_toolplex", toolArgs);
83
+ // Extract text content from the result
84
+ let contextText = "";
85
+ if (result && typeof result === "object" && result.content) {
86
+ for (const item of result.content) {
87
+ if (item.type === "text" && item.text) {
88
+ contextText += item.text + "\n\n";
89
+ }
90
+ }
91
+ }
92
+ else if (typeof result === "string") {
93
+ contextText = result;
94
+ }
95
+ return {
96
+ success: true,
97
+ context: contextText.trim(),
98
+ };
99
+ }
100
+ catch (error) {
101
+ this.adapter.logger.error("ChatEngine: Failed to initialize session", {
102
+ sessionId,
103
+ error,
104
+ });
105
+ return {
106
+ success: false,
107
+ error: error instanceof Error ? error.message : "Unknown error",
108
+ };
109
+ }
110
+ }
111
+ /**
112
+ * Stream a chat completion
113
+ */
114
+ async stream(options) {
115
+ const credentials = await this.adapter.credentials.getCredentials();
116
+ const streamId = options.streamId || randomUUID();
117
+ const { sessionId, modelId, provider, messages, tools: providedTools, temperature, topP, fileAttachments, modelConfig, } = options;
118
+ this.adapter.logger.debug("ChatEngine: Starting stream", {
119
+ sessionId,
120
+ modelId,
121
+ provider,
122
+ messageCount: messages.length,
123
+ hasTools: !!providedTools,
124
+ hasAttachments: !!fileAttachments?.length,
125
+ streamId,
126
+ });
127
+ // Create abort controller
128
+ const abortController = new AbortController();
129
+ // Get the model
130
+ const model = getModel(modelId, credentials, {
131
+ logger: this.adapter.logger,
132
+ clientVersion: this.adapter.getClientVersion(),
133
+ });
134
+ // Build MCP tools
135
+ let mcpTools = {};
136
+ const apiKey = await this.adapter.credentials.getToolPlexApiKey();
137
+ if (apiKey) {
138
+ try {
139
+ await this.initializeMCP(sessionId);
140
+ mcpTools = await buildMCPTools({
141
+ sessionId,
142
+ streamId,
143
+ modelId,
144
+ abortSignal: abortController.signal,
145
+ adapter: this.adapter,
146
+ hiddenTools: this.config.hiddenTools,
147
+ });
148
+ }
149
+ catch (error) {
150
+ this.adapter.logger.error("ChatEngine: Failed to initialize MCP tools", {
151
+ sessionId,
152
+ error,
153
+ });
154
+ // Continue without tools
155
+ }
156
+ }
157
+ // Merge tools
158
+ const allTools = { ...providedTools, ...mcpTools };
159
+ // Process messages
160
+ const processedMessages = this.processMessages(messages, fileAttachments, modelConfig);
161
+ // Track usage data
162
+ let capturedUsage = null;
163
+ // Promise for onFinish coordination
164
+ let resolveOnFinish = null;
165
+ const onFinishPromise = new Promise((resolve) => {
166
+ resolveOnFinish = resolve;
167
+ });
168
+ // Prepare stream options
169
+ const streamTextOptions = {
170
+ model,
171
+ messages: processedMessages,
172
+ tools: allTools,
173
+ stopWhen: stepCountIs(this.config.maxSteps),
174
+ temperature,
175
+ topP,
176
+ abortSignal: abortController.signal,
177
+ };
178
+ // Enforce maxTokens if specified by model config
179
+ if (modelConfig?.enforceMaxTokens && modelConfig?.maxOutputTokens) {
180
+ streamTextOptions.maxTokens = modelConfig.maxOutputTokens;
181
+ }
182
+ // Start streaming
183
+ const result = streamText({
184
+ ...streamTextOptions,
185
+ headers: {
186
+ "x-session-id": sessionId,
187
+ ...(provider === "openrouter" && {
188
+ "HTTP-Referer": "https://toolplex.ai",
189
+ "X-Title": "ToolPlex AI",
190
+ }),
191
+ },
192
+ onChunk: async (event) => {
193
+ // Capture usage data
194
+ if (provider === "toolplex" && event.chunk) {
195
+ const chunk = event.chunk;
196
+ if (chunk.providerMetadata?.usage || chunk.usage) {
197
+ const usage = chunk.providerMetadata?.usage || chunk.usage;
198
+ const promptTokens = usage.prompt_tokens || usage.input_tokens || 0;
199
+ const completionTokens = usage.completion_tokens || usage.output_tokens || 0;
200
+ const totalTokens = usage.total_tokens || promptTokens + completionTokens;
201
+ capturedUsage = {
202
+ prompt_tokens: promptTokens,
203
+ completion_tokens: completionTokens,
204
+ total_tokens: totalTokens,
205
+ };
206
+ }
207
+ }
208
+ },
209
+ onStepFinish: async (event) => {
210
+ // Emit step finish event if there are tool calls
211
+ const hasToolCalls = event.toolCalls && event.toolCalls.length > 0;
212
+ if (hasToolCalls) {
213
+ this.adapter.logger.debug("ChatEngine: Step finished with tool calls", {
214
+ sessionId,
215
+ textLength: event.text?.length || 0,
216
+ toolCallCount: event.toolCalls.length,
217
+ });
218
+ }
219
+ },
220
+ onFinish: async (completion) => {
221
+ this.adapter.logger.debug("ChatEngine: Stream finished", {
222
+ sessionId,
223
+ textLength: completion.text?.length,
224
+ finishReason: completion.finishReason,
225
+ usage: completion.usage,
226
+ });
227
+ // Get usage data
228
+ let usageSource = completion.usage;
229
+ if (provider === "toolplex") {
230
+ const mapUsage = toolplexUsageMap.get(sessionId);
231
+ if (mapUsage) {
232
+ usageSource = mapUsage;
233
+ toolplexUsageMap.delete(sessionId);
234
+ }
235
+ else if (capturedUsage) {
236
+ usageSource = capturedUsage;
237
+ }
238
+ }
239
+ // Emit complete event
240
+ this.adapter.events.emitComplete(streamId, completion.text || "", usageSource
241
+ ? {
242
+ promptTokens: usageSource.prompt_tokens ||
243
+ usageSource.inputTokens ||
244
+ usageSource.promptTokens ||
245
+ 0,
246
+ completionTokens: usageSource.completion_tokens ||
247
+ usageSource.outputTokens ||
248
+ usageSource.completionTokens ||
249
+ 0,
250
+ totalTokens: usageSource.total_tokens || usageSource.totalTokens || 0,
251
+ }
252
+ : undefined);
253
+ if (resolveOnFinish) {
254
+ resolveOnFinish();
255
+ }
256
+ },
257
+ onError: (error) => {
258
+ this.adapter.logger.error("ChatEngine: Stream error", {
259
+ error,
260
+ sessionId,
261
+ modelId,
262
+ });
263
+ this.adapter.events.emitError(streamId, error instanceof Error ? error.message : String(error));
264
+ if (resolveOnFinish) {
265
+ resolveOnFinish();
266
+ }
267
+ },
268
+ });
269
+ return {
270
+ streamId,
271
+ textStream: result.textStream,
272
+ fullStream: result.fullStream,
273
+ onFinishPromise,
274
+ abort: async () => {
275
+ this.adapter.logger.debug("ChatEngine: Aborting stream", {
276
+ streamId,
277
+ sessionId,
278
+ });
279
+ abortController.abort();
280
+ },
281
+ };
282
+ }
283
+ /**
284
+ * Process messages for streaming (handle attachments, filter empty blocks)
285
+ */
286
+ processMessages(messages, fileAttachments, modelConfig) {
287
+ let processedMessages = [...messages];
288
+ // Filter empty text blocks (unless model requires preserving them)
289
+ if (!modelConfig?.preserveEmptyContentBlocks) {
290
+ processedMessages = processedMessages.map((msg) => {
291
+ if ((msg.role === "user" || msg.role === "assistant") &&
292
+ Array.isArray(msg.content)) {
293
+ const filteredContent = msg.content.filter((part) => {
294
+ if (part.type !== "text")
295
+ return true;
296
+ return part.text && part.text.trim().length > 0;
297
+ });
298
+ return {
299
+ ...msg,
300
+ content: filteredContent.length > 0 ? filteredContent : "",
301
+ };
302
+ }
303
+ return msg;
304
+ });
305
+ }
306
+ // Handle file attachments
307
+ if (fileAttachments && fileAttachments.length > 0) {
308
+ const lastMessage = processedMessages[processedMessages.length - 1];
309
+ if (lastMessage && lastMessage.role === "user") {
310
+ const textContent = typeof lastMessage.content === "string" ? lastMessage.content : "";
311
+ const parts = textContent.trim()
312
+ ? [{ type: "text", text: textContent }]
313
+ : [];
314
+ for (const attachment of fileAttachments) {
315
+ const mimeType = attachment.mimeType || attachment.type;
316
+ if (!mimeType) {
317
+ parts.push({
318
+ type: "text",
319
+ text: `[Attached file: ${attachment.name} - type unknown]`,
320
+ });
321
+ continue;
322
+ }
323
+ if (mimeType.startsWith("image/")) {
324
+ parts.push({
325
+ type: "image",
326
+ image: attachment.data,
327
+ mimeType: mimeType,
328
+ });
329
+ }
330
+ else if (mimeType === "application/pdf" ||
331
+ mimeType.startsWith("text/") ||
332
+ mimeType.startsWith("application/")) {
333
+ parts.push({
334
+ type: "file",
335
+ data: Buffer.from(attachment.data, "base64"),
336
+ mediaType: mimeType,
337
+ });
338
+ }
339
+ else {
340
+ parts.push({
341
+ type: "text",
342
+ text: `[Attached file: ${attachment.name}]`,
343
+ });
344
+ }
345
+ }
346
+ processedMessages[processedMessages.length - 1] = {
347
+ ...lastMessage,
348
+ content: parts,
349
+ };
350
+ }
351
+ }
352
+ return processedMessages;
353
+ }
354
+ }
355
+ //# sourceMappingURL=ChatEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatEngine.js","sourceRoot":"","sources":["../../src/core/ChatEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @toolplex/ai-engine - Tool Builder
3
+ *
4
+ * Builds AI SDK tools from MCP tools, handling:
5
+ * - Schema cleaning and sanitization
6
+ * - Tool confirmation flows
7
+ * - Tool execution with cancellation support
8
+ */
9
+ import type { EngineAdapter } from "../adapters/types.js";
10
+ export interface BuildToolsOptions {
11
+ sessionId: string;
12
+ streamId: string;
13
+ modelId: string;
14
+ abortSignal: AbortSignal;
15
+ adapter: EngineAdapter;
16
+ /** Tools to hide from AI agents (e.g., 'initialize_toolplex') */
17
+ hiddenTools?: string[];
18
+ /** Callback for when tool args are edited during confirmation */
19
+ onArgsEdited?: (toolName: string, editedArgs: any, configEdited: boolean) => void;
20
+ }
21
+ /**
22
+ * Build AI SDK tools from MCP tools
23
+ */
24
+ export declare function buildMCPTools(options: BuildToolsOptions): Promise<Record<string, any>>;
25
+ //# sourceMappingURL=ToolBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolBuilder.d.ts","sourceRoot":"","sources":["../../src/core/ToolBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iEAAiE;IACjE,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,YAAY,EAAE,OAAO,KAClB,IAAI,CAAC;CACX;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAkO9B"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * @toolplex/ai-engine - Tool Builder
3
+ *
4
+ * Builds AI SDK tools from MCP tools, handling:
5
+ * - Schema cleaning and sanitization
6
+ * - Tool confirmation flows
7
+ * - Tool execution with cancellation support
8
+ */
9
+ import { tool, jsonSchema } from "ai";
10
+ import { deepSanitizeParams, cleanToolSchema } from "../utils/schema.js";
11
+ import { isChatGPTModel, isGoogleGeminiModel } from "../utils/models.js";
12
+ /**
13
+ * Build AI SDK tools from MCP tools
14
+ */
15
+ export async function buildMCPTools(options) {
16
+ const { sessionId, streamId, modelId, abortSignal, adapter, hiddenTools = ["initialize_toolplex"], onArgsEdited, } = options;
17
+ const logger = adapter.logger;
18
+ const isGemini = isGoogleGeminiModel(modelId);
19
+ // Get tools from MCP
20
+ const mcpToolsResult = await adapter.mcp.listTools(sessionId);
21
+ const mcpTools = mcpToolsResult?.tools || [];
22
+ const aiSdkTools = {};
23
+ // Track active tool executions for cancellation
24
+ const activeToolExecutions = new Map();
25
+ // Clean up when stream is aborted
26
+ abortSignal.addEventListener("abort", () => {
27
+ logger.debug("Tool builder: Stream aborted, cancelling active tool executions", {
28
+ sessionId,
29
+ streamId,
30
+ activeToolCount: activeToolExecutions.size,
31
+ });
32
+ for (const [toolExecutionId, controller,] of activeToolExecutions.entries()) {
33
+ logger.debug("Tool builder: Aborting tool execution", {
34
+ toolExecutionId,
35
+ });
36
+ controller.abort();
37
+ }
38
+ activeToolExecutions.clear();
39
+ });
40
+ for (const mcpTool of mcpTools) {
41
+ // Skip hidden tools
42
+ if (hiddenTools.includes(mcpTool.name)) {
43
+ continue;
44
+ }
45
+ const toolSchema = mcpTool.inputSchema || {
46
+ type: "object",
47
+ properties: {},
48
+ };
49
+ const finalSchema = cleanToolSchema(toolSchema, isGemini, logger);
50
+ aiSdkTools[mcpTool.name] = tool({
51
+ description: mcpTool.description || `Tool: ${mcpTool.name}`,
52
+ inputSchema: jsonSchema(finalSchema),
53
+ execute: async (params) => {
54
+ const toolExecutionId = `${mcpTool.name}-${Date.now()}`;
55
+ const toolAbortController = new AbortController();
56
+ activeToolExecutions.set(toolExecutionId, toolAbortController);
57
+ // Check if stream was already aborted
58
+ if (abortSignal.aborted) {
59
+ logger.debug("Tool builder: Stream already aborted, skipping tool execution", {
60
+ toolName: mcpTool.name,
61
+ sessionId,
62
+ });
63
+ activeToolExecutions.delete(toolExecutionId);
64
+ throw new Error("Stream cancelled");
65
+ }
66
+ try {
67
+ // Normalize ChatGPT args -> arguments workaround
68
+ if (mcpTool.name === "call_tool" &&
69
+ isChatGPTModel(modelId) &&
70
+ params?.args &&
71
+ !params?.arguments) {
72
+ logger.info("Tool builder: Normalizing call_tool params for ChatGPT", {
73
+ modelId,
74
+ originalKeys: Object.keys(params),
75
+ });
76
+ const { args, ...rest } = params;
77
+ params = { ...rest, arguments: args };
78
+ }
79
+ // Deep sanitize params
80
+ const sanitizedParams = deepSanitizeParams(params, toolSchema, undefined, logger);
81
+ // Log when sanitization modifies parameters
82
+ if (JSON.stringify(params) !== JSON.stringify(sanitizedParams)) {
83
+ logger.debug("Tool builder: deepSanitizeParams modified tool arguments", {
84
+ toolName: mcpTool.name,
85
+ sessionId,
86
+ });
87
+ }
88
+ // Check abort before confirmation
89
+ if (toolAbortController.signal.aborted) {
90
+ throw new Error("Tool execution cancelled");
91
+ }
92
+ // Handle confirmation if adapter supports it
93
+ let finalParams = sanitizedParams;
94
+ if (adapter.confirmations.isInteractive()) {
95
+ const confirmationRequest = await checkToolConfirmation(mcpTool.name, sanitizedParams, { sessionId, streamId });
96
+ if (confirmationRequest) {
97
+ logger.debug("Tool builder: Tool requires user confirmation", {
98
+ sessionId,
99
+ toolName: mcpTool.name,
100
+ confirmationType: confirmationRequest.type,
101
+ });
102
+ try {
103
+ const result = await adapter.confirmations.requestConfirmation(streamId, confirmationRequest);
104
+ if (!result.allowed) {
105
+ return {
106
+ content: [
107
+ {
108
+ type: "text",
109
+ text: `Operation cancelled: ${result.reason || "User denied the operation"}`,
110
+ },
111
+ ],
112
+ };
113
+ }
114
+ // Apply edited config if provided
115
+ if (result.editedConfig) {
116
+ finalParams = { ...sanitizedParams };
117
+ if (confirmationRequest.type === "install") {
118
+ finalParams.config = result.editedConfig;
119
+ }
120
+ if (onArgsEdited) {
121
+ onArgsEdited(mcpTool.name, finalParams, result.wasEdited === true);
122
+ }
123
+ }
124
+ }
125
+ catch (confirmationError) {
126
+ if (confirmationError?.message === "Stream cancelled by user") {
127
+ throw new Error("Tool execution cancelled");
128
+ }
129
+ throw confirmationError;
130
+ }
131
+ }
132
+ }
133
+ // Check abort before MCP call
134
+ if (toolAbortController.signal.aborted) {
135
+ throw new Error("Tool execution cancelled");
136
+ }
137
+ // Execute the MCP tool
138
+ const result = await adapter.mcp.callTool(sessionId, mcpTool.name, finalParams);
139
+ return result;
140
+ }
141
+ catch (error) {
142
+ activeToolExecutions.delete(toolExecutionId);
143
+ if (toolAbortController.signal.aborted ||
144
+ abortSignal.aborted ||
145
+ error?.message === "Tool execution cancelled") {
146
+ throw new Error("Tool execution cancelled");
147
+ }
148
+ logger.error("Tool builder: Tool execution failed", {
149
+ sessionId,
150
+ toolName: mcpTool.name,
151
+ error,
152
+ });
153
+ return {
154
+ isError: true,
155
+ content: [
156
+ {
157
+ type: "text",
158
+ text: `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`,
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ },
164
+ });
165
+ }
166
+ return aiSdkTools;
167
+ }
168
+ /**
169
+ * Check if a tool requires confirmation
170
+ * This is a simplified version - the full implementation would be in the confirmation registry
171
+ */
172
+ async function checkToolConfirmation(toolName, params, _context) {
173
+ // Install/uninstall operations always require confirmation
174
+ if (toolName === "install_server" || toolName === "install_mcp_server") {
175
+ return {
176
+ type: "install",
177
+ data: {
178
+ serverId: params.server_id,
179
+ serverName: params.server_name,
180
+ config: params.config,
181
+ },
182
+ };
183
+ }
184
+ if (toolName === "uninstall_server" || toolName === "uninstall_mcp_server") {
185
+ return {
186
+ type: "uninstall",
187
+ data: {
188
+ serverId: params.server_id,
189
+ serverName: params.server_name,
190
+ },
191
+ };
192
+ }
193
+ if (toolName === "save_playbook") {
194
+ return {
195
+ type: "save-playbook",
196
+ data: {
197
+ playbookName: params.playbook_name,
198
+ description: params.description,
199
+ actions: params.actions,
200
+ privacy: params.privacy,
201
+ },
202
+ };
203
+ }
204
+ if (toolName === "submit_feedback") {
205
+ return {
206
+ type: "submit-feedback",
207
+ data: {
208
+ vote: params.vote,
209
+ message: params.message,
210
+ },
211
+ };
212
+ }
213
+ return null;
214
+ }
215
+ //# sourceMappingURL=ToolBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolBuilder.js","sourceRoot":"","sources":["../../src/core/ToolBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @toolplex/ai-engine - Core Components
3
+ */
4
+ export { ChatEngine, type ChatEngineOptions } from "./ChatEngine.js";
5
+ export { buildMCPTools, type BuildToolsOptions } from "./ToolBuilder.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @toolplex/ai-engine - Core Components
3
+ */
4
+ export { ChatEngine } from "./ChatEngine.js";
5
+ export { buildMCPTools } from "./ToolBuilder.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAA0B,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,aAAa,EAA0B,MAAM,kBAAkB,CAAC"}