@hashgraphonline/conversational-agent 0.0.3 → 0.1.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/README.md +79 -0
- package/dist/cjs/agent-factory.d.ts +5 -0
- package/dist/cjs/base-agent.d.ts +95 -0
- package/dist/cjs/conversational-agent.d.ts +62 -5
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/langchain-agent.d.ts +22 -0
- package/dist/cjs/mcp/MCPClientManager.d.ts +40 -0
- package/dist/cjs/mcp/adapters/langchain.d.ts +8 -0
- package/dist/cjs/mcp/helpers.d.ts +45 -0
- package/dist/cjs/mcp/types.d.ts +27 -0
- package/dist/cjs/plugins/hbar-transfer/AccountBuilder.d.ts +13 -0
- package/dist/cjs/plugins/hbar-transfer/HbarTransferPlugin.d.ts +15 -0
- package/dist/cjs/plugins/hbar-transfer/TransferHbarTool.d.ts +61 -0
- package/dist/cjs/plugins/hbar-transfer/index.d.ts +1 -0
- package/dist/cjs/plugins/hbar-transfer/types.d.ts +10 -0
- package/dist/cjs/plugins/index.d.ts +1 -0
- package/dist/cjs/providers.d.ts +48 -0
- package/dist/esm/index.js +18 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index10.js +22 -0
- package/dist/esm/index10.js.map +1 -0
- package/dist/esm/index11.js +104 -0
- package/dist/esm/index11.js.map +1 -0
- package/dist/esm/index12.js +36 -0
- package/dist/esm/index12.js.map +1 -0
- package/dist/esm/index13.js +16 -0
- package/dist/esm/index13.js.map +1 -0
- package/dist/esm/index14.js +127 -0
- package/dist/esm/index14.js.map +1 -0
- package/dist/esm/index15.js +132 -0
- package/dist/esm/index15.js.map +1 -0
- package/dist/esm/index16.js +95 -0
- package/dist/esm/index16.js.map +1 -0
- package/dist/esm/index5.js +42 -202
- package/dist/esm/index5.js.map +1 -1
- package/dist/esm/index6.js +295 -13
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index7.js +87 -0
- package/dist/esm/index7.js.map +1 -0
- package/dist/esm/index8.js +255 -0
- package/dist/esm/index8.js.map +1 -0
- package/dist/esm/index9.js +18 -0
- package/dist/esm/index9.js.map +1 -0
- package/dist/types/agent-factory.d.ts +5 -0
- package/dist/types/base-agent.d.ts +95 -0
- package/dist/types/conversational-agent.d.ts +62 -5
- package/dist/types/index.d.ts +8 -0
- package/dist/types/langchain-agent.d.ts +22 -0
- package/dist/types/mcp/MCPClientManager.d.ts +40 -0
- package/dist/types/mcp/adapters/langchain.d.ts +8 -0
- package/dist/types/mcp/helpers.d.ts +45 -0
- package/dist/types/mcp/types.d.ts +27 -0
- package/dist/types/plugins/hbar-transfer/AccountBuilder.d.ts +13 -0
- package/dist/types/plugins/hbar-transfer/HbarTransferPlugin.d.ts +15 -0
- package/dist/types/plugins/hbar-transfer/TransferHbarTool.d.ts +61 -0
- package/dist/types/plugins/hbar-transfer/index.d.ts +1 -0
- package/dist/types/plugins/hbar-transfer/types.d.ts +10 -0
- package/dist/types/plugins/index.d.ts +1 -0
- package/dist/types/providers.d.ts +48 -0
- package/package.json +12 -6
- package/src/agent-factory.ts +21 -0
- package/src/base-agent.ts +222 -0
- package/src/conversational-agent.ts +204 -102
- package/src/index.ts +24 -0
- package/src/langchain-agent.ts +333 -0
- package/src/mcp/MCPClientManager.ts +148 -0
- package/src/mcp/adapters/langchain.ts +185 -0
- package/src/mcp/helpers.ts +122 -0
- package/src/mcp/types.ts +29 -0
- package/src/plugins/hbar-transfer/AccountBuilder.ts +154 -0
- package/src/plugins/hbar-transfer/HbarTransferPlugin.ts +66 -0
- package/src/plugins/hbar-transfer/TransferHbarTool.ts +49 -0
- package/src/plugins/hbar-transfer/index.ts +1 -0
- package/src/plugins/hbar-transfer/types.ts +11 -0
- package/src/plugins/index.ts +2 -1
- package/src/providers.ts +82 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { BaseLanguageModelCallOptions } from '@langchain/core/language_models/base';
|
|
2
|
+
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Framework-agnostic AI provider interface for multi-framework support
|
|
6
|
+
*/
|
|
7
|
+
export interface AIProvider {
|
|
8
|
+
/**
|
|
9
|
+
* Generate a response from the AI model
|
|
10
|
+
*/
|
|
11
|
+
generate(prompt: string, options?: BaseLanguageModelCallOptions): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Stream a response from the AI model
|
|
14
|
+
*/
|
|
15
|
+
stream?(prompt: string, options?: BaseLanguageModelCallOptions): AsyncGenerator<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Get the underlying model if available
|
|
18
|
+
*/
|
|
19
|
+
getModel?(): BaseChatModel | unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* LangChain AI provider implementation
|
|
23
|
+
*/
|
|
24
|
+
export declare class LangChainProvider implements AIProvider {
|
|
25
|
+
private model;
|
|
26
|
+
constructor(model: BaseChatModel);
|
|
27
|
+
generate(prompt: string, options?: BaseLanguageModelCallOptions): Promise<string>;
|
|
28
|
+
stream(prompt: string, options?: BaseLanguageModelCallOptions): AsyncGenerator<string>;
|
|
29
|
+
getModel(): BaseChatModel;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Vercel AI SDK provider interface (forward-thinking)
|
|
33
|
+
*/
|
|
34
|
+
export interface VercelAIProvider extends AIProvider {
|
|
35
|
+
/**
|
|
36
|
+
* Use Vercel AI SDK's streamText function
|
|
37
|
+
*/
|
|
38
|
+
streamText?(prompt: string, options?: unknown): Promise<unknown>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* BAML provider interface (forward-thinking)
|
|
42
|
+
*/
|
|
43
|
+
export interface BAMLProvider extends AIProvider {
|
|
44
|
+
/**
|
|
45
|
+
* Execute a BAML function
|
|
46
|
+
*/
|
|
47
|
+
executeFunction?(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
48
|
+
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
import { HCS10Plugin } from "./index2.js";
|
|
1
|
+
import { HCS10Plugin, HCS10Plugin as HCS10Plugin2 } from "./index2.js";
|
|
2
2
|
import { HCS2Plugin } from "./index3.js";
|
|
3
3
|
import { InscribePlugin } from "./index4.js";
|
|
4
|
-
import {
|
|
4
|
+
import { HbarTransferPlugin } from "./index5.js";
|
|
5
|
+
import { ConversationalAgent } from "./index6.js";
|
|
6
|
+
import { BaseAgent } from "./index7.js";
|
|
7
|
+
import { LangChainAgent } from "./index8.js";
|
|
8
|
+
import { createAgent } from "./index9.js";
|
|
9
|
+
import { LangChainProvider } from "./index10.js";
|
|
5
10
|
export * from "hedera-agent-kit";
|
|
11
|
+
import { MCPServers, createMCPConfig, validateServerConfig } from "./index11.js";
|
|
6
12
|
export {
|
|
13
|
+
BaseAgent,
|
|
7
14
|
ConversationalAgent,
|
|
8
15
|
HCS10Plugin,
|
|
9
16
|
HCS2Plugin,
|
|
10
|
-
|
|
17
|
+
HbarTransferPlugin,
|
|
18
|
+
InscribePlugin,
|
|
19
|
+
LangChainAgent,
|
|
20
|
+
LangChainProvider,
|
|
21
|
+
MCPServers,
|
|
22
|
+
HCS10Plugin2 as OpenConvAIPlugin,
|
|
23
|
+
createAgent,
|
|
24
|
+
createMCPConfig,
|
|
25
|
+
validateServerConfig
|
|
11
26
|
};
|
|
12
27
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class LangChainProvider {
|
|
2
|
+
constructor(model) {
|
|
3
|
+
this.model = model;
|
|
4
|
+
}
|
|
5
|
+
async generate(prompt, options) {
|
|
6
|
+
const result = await this.model.invoke(prompt, options);
|
|
7
|
+
return typeof result === "string" ? result : result.toString();
|
|
8
|
+
}
|
|
9
|
+
async *stream(prompt, options) {
|
|
10
|
+
const stream = await this.model.stream(prompt, options);
|
|
11
|
+
for await (const chunk of stream) {
|
|
12
|
+
yield typeof chunk === "string" ? chunk : chunk.toString();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
getModel() {
|
|
16
|
+
return this.model;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
LangChainProvider
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=index10.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index10.js","sources":["../../src/providers.ts"],"sourcesContent":["import type { \n BaseLanguageModelCallOptions\n} from '@langchain/core/language_models/base';\nimport type { BaseChatModel } from '@langchain/core/language_models/chat_models';\n\n/**\n * Framework-agnostic AI provider interface for multi-framework support\n */\nexport interface AIProvider {\n /**\n * Generate a response from the AI model\n */\n generate(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): Promise<string>;\n\n /**\n * Stream a response from the AI model\n */\n stream?(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): AsyncGenerator<string>;\n\n /**\n * Get the underlying model if available\n */\n getModel?(): BaseChatModel | unknown;\n}\n\n/**\n * LangChain AI provider implementation\n */\nexport class LangChainProvider implements AIProvider {\n constructor(private model: BaseChatModel) {}\n\n async generate(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): Promise<string> {\n const result = await this.model.invoke(prompt, options);\n return typeof result === 'string' ? result : result.toString();\n }\n\n async *stream(\n prompt: string,\n options?: BaseLanguageModelCallOptions\n ): AsyncGenerator<string> {\n const stream = await this.model.stream(prompt, options);\n for await (const chunk of stream) {\n yield typeof chunk === 'string' ? chunk : chunk.toString();\n }\n }\n\n getModel(): BaseChatModel {\n return this.model;\n }\n}\n\n/**\n * Vercel AI SDK provider interface (forward-thinking)\n */\nexport interface VercelAIProvider extends AIProvider {\n /**\n * Use Vercel AI SDK's streamText function\n */\n streamText?(prompt: string, options?: unknown): Promise<unknown>;\n}\n\n/**\n * BAML provider interface (forward-thinking)\n */\nexport interface BAMLProvider extends AIProvider {\n /**\n * Execute a BAML function\n */\n executeFunction?(\n name: string,\n args: Record<string, unknown>\n ): Promise<unknown>;\n}"],"names":[],"mappings":"AAkCO,MAAM,kBAAwC;AAAA,EACnD,YAAoB,OAAsB;AAAtB,SAAA,QAAA;AAAA,EAAuB;AAAA,EAE3C,MAAM,SACJ,QACA,SACiB;AACjB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ,OAAO;AACtD,WAAO,OAAO,WAAW,WAAW,SAAS,OAAO,SAAA;AAAA,EACtD;AAAA,EAEA,OAAO,OACL,QACA,SACwB;AACxB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,QAAQ,OAAO;AACtD,qBAAiB,SAAS,QAAQ;AAChC,YAAM,OAAO,UAAU,WAAW,QAAQ,MAAM,SAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const MCPServers = {
|
|
2
|
+
/**
|
|
3
|
+
* Filesystem server for file operations
|
|
4
|
+
*/
|
|
5
|
+
filesystem: (path) => ({
|
|
6
|
+
name: "filesystem",
|
|
7
|
+
command: "npx",
|
|
8
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", path],
|
|
9
|
+
transport: "stdio",
|
|
10
|
+
autoConnect: true,
|
|
11
|
+
additionalContext: "This server provides access to files and directories in the current working directory.",
|
|
12
|
+
toolDescriptions: {
|
|
13
|
+
list_directory: 'Use this tool when users ask about files in the "current directory" or "working directory".',
|
|
14
|
+
read_file: "Use this tool when users ask to see or check files in the current directory."
|
|
15
|
+
}
|
|
16
|
+
}),
|
|
17
|
+
/**
|
|
18
|
+
* GitHub server for repository operations
|
|
19
|
+
*/
|
|
20
|
+
github: (token) => ({
|
|
21
|
+
name: "github",
|
|
22
|
+
command: "npx",
|
|
23
|
+
args: ["-y", "@modelcontextprotocol/server-github"],
|
|
24
|
+
...token && { env: { GITHUB_TOKEN: token } },
|
|
25
|
+
transport: "stdio",
|
|
26
|
+
autoConnect: true
|
|
27
|
+
}),
|
|
28
|
+
/**
|
|
29
|
+
* Slack server for messaging operations
|
|
30
|
+
*/
|
|
31
|
+
slack: (token) => ({
|
|
32
|
+
name: "slack",
|
|
33
|
+
command: "npx",
|
|
34
|
+
args: ["-y", "@modelcontextprotocol/server-slack"],
|
|
35
|
+
env: { SLACK_TOKEN: token },
|
|
36
|
+
transport: "stdio",
|
|
37
|
+
autoConnect: true
|
|
38
|
+
}),
|
|
39
|
+
/**
|
|
40
|
+
* Google Drive server for document operations
|
|
41
|
+
*/
|
|
42
|
+
googleDrive: (credentials) => ({
|
|
43
|
+
name: "google-drive",
|
|
44
|
+
command: "npx",
|
|
45
|
+
args: ["-y", "@modelcontextprotocol/server-google-drive"],
|
|
46
|
+
env: { GOOGLE_CREDENTIALS: credentials },
|
|
47
|
+
transport: "stdio",
|
|
48
|
+
autoConnect: true
|
|
49
|
+
}),
|
|
50
|
+
/**
|
|
51
|
+
* PostgreSQL server for database operations
|
|
52
|
+
*/
|
|
53
|
+
postgres: (connectionString) => ({
|
|
54
|
+
name: "postgres",
|
|
55
|
+
command: "npx",
|
|
56
|
+
args: ["-y", "@modelcontextprotocol/server-postgres", connectionString],
|
|
57
|
+
transport: "stdio",
|
|
58
|
+
autoConnect: true
|
|
59
|
+
}),
|
|
60
|
+
/**
|
|
61
|
+
* SQLite server for database operations
|
|
62
|
+
*/
|
|
63
|
+
sqlite: (dbPath) => ({
|
|
64
|
+
name: "sqlite",
|
|
65
|
+
command: "npx",
|
|
66
|
+
args: ["-y", "@modelcontextprotocol/server-sqlite", dbPath],
|
|
67
|
+
transport: "stdio",
|
|
68
|
+
autoConnect: true
|
|
69
|
+
}),
|
|
70
|
+
/**
|
|
71
|
+
* Custom server configuration
|
|
72
|
+
*/
|
|
73
|
+
custom: (config) => config
|
|
74
|
+
};
|
|
75
|
+
function validateServerConfig(config) {
|
|
76
|
+
const errors = [];
|
|
77
|
+
if (!config.name) {
|
|
78
|
+
errors.push("Server name is required");
|
|
79
|
+
}
|
|
80
|
+
if (!config.command) {
|
|
81
|
+
errors.push("Server command is required");
|
|
82
|
+
}
|
|
83
|
+
if (!config.args || !Array.isArray(config.args)) {
|
|
84
|
+
errors.push("Server args must be an array");
|
|
85
|
+
}
|
|
86
|
+
if (config.transport && !["stdio", "http", "websocket"].includes(config.transport)) {
|
|
87
|
+
errors.push("Invalid transport type. Must be stdio, http, or websocket");
|
|
88
|
+
}
|
|
89
|
+
return errors;
|
|
90
|
+
}
|
|
91
|
+
function createMCPConfig(servers, autoConnect = true) {
|
|
92
|
+
return {
|
|
93
|
+
mcpServers: servers.map((server) => ({
|
|
94
|
+
...server,
|
|
95
|
+
autoConnect: server.autoConnect ?? autoConnect
|
|
96
|
+
}))
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export {
|
|
100
|
+
MCPServers,
|
|
101
|
+
createMCPConfig,
|
|
102
|
+
validateServerConfig
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=index11.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index11.js","sources":["../../src/mcp/helpers.ts"],"sourcesContent":["import type { MCPServerConfig } from './types';\n\n/**\n * Common MCP server configurations for easy setup\n */\nexport const MCPServers = {\n /**\n * Filesystem server for file operations\n */\n filesystem: (path: string): MCPServerConfig => ({\n name: 'filesystem',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', path],\n transport: 'stdio',\n autoConnect: true,\n additionalContext: 'This server provides access to files and directories in the current working directory.',\n toolDescriptions: {\n list_directory: 'Use this tool when users ask about files in the \"current directory\" or \"working directory\".',\n read_file: 'Use this tool when users ask to see or check files in the current directory.',\n },\n }),\n\n /**\n * GitHub server for repository operations\n */\n github: (token?: string): MCPServerConfig => ({\n name: 'github',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n ...(token && { env: { GITHUB_TOKEN: token } }),\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Slack server for messaging operations\n */\n slack: (token: string): MCPServerConfig => ({\n name: 'slack',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: { SLACK_TOKEN: token },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Google Drive server for document operations\n */\n googleDrive: (credentials: string): MCPServerConfig => ({\n name: 'google-drive',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-drive'],\n env: { GOOGLE_CREDENTIALS: credentials },\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * PostgreSQL server for database operations\n */\n postgres: (connectionString: string): MCPServerConfig => ({\n name: 'postgres',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-postgres', connectionString],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * SQLite server for database operations\n */\n sqlite: (dbPath: string): MCPServerConfig => ({\n name: 'sqlite',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-sqlite', dbPath],\n transport: 'stdio',\n autoConnect: true,\n }),\n\n /**\n * Custom server configuration\n */\n custom: (config: MCPServerConfig): MCPServerConfig => config,\n};\n\n/**\n * Validate MCP server configuration\n */\nexport function validateServerConfig(config: MCPServerConfig): string[] {\n const errors: string[] = [];\n\n if (!config.name) {\n errors.push('Server name is required');\n }\n\n if (!config.command) {\n errors.push('Server command is required');\n }\n\n if (!config.args || !Array.isArray(config.args)) {\n errors.push('Server args must be an array');\n }\n\n if (config.transport && !['stdio', 'http', 'websocket'].includes(config.transport)) {\n errors.push('Invalid transport type. Must be stdio, http, or websocket');\n }\n\n return errors;\n}\n\n/**\n * Create a typed MCP configuration for ConversationalAgent\n */\nexport function createMCPConfig(servers: MCPServerConfig[], autoConnect = true): { mcpServers: MCPServerConfig[] } {\n return {\n mcpServers: servers.map(server => ({\n ...server,\n autoConnect: server.autoConnect ?? autoConnect,\n })),\n };\n}"],"names":[],"mappings":"AAKO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,CAAC,UAAmC;AAAA,IAC9C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C,IAAI;AAAA,IAC5D,WAAW;AAAA,IACX,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,IAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAMF,QAAQ,CAAC,WAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,qCAAqC;AAAA,IAClD,GAAI,SAAS,EAAE,KAAK,EAAE,cAAc,QAAM;AAAA,IAC1C,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,OAAO,CAAC,WAAoC;AAAA,IAC1C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,oCAAoC;AAAA,IACjD,KAAK,EAAE,aAAa,MAAA;AAAA,IACpB,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,aAAa,CAAC,iBAA0C;AAAA,IACtD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,2CAA2C;AAAA,IACxD,KAAK,EAAE,oBAAoB,YAAA;AAAA,IAC3B,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,UAAU,CAAC,sBAA+C;AAAA,IACxD,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,yCAAyC,gBAAgB;AAAA,IACtE,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,YAAqC;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,MAAM,uCAAuC,MAAM;AAAA,IAC1D,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMf,QAAQ,CAAC,WAA6C;AACxD;AAKO,SAAS,qBAAqB,QAAmC;AACtE,QAAM,SAAmB,CAAA;AAEzB,MAAI,CAAC,OAAO,MAAM;AAChB,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,MAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/C,WAAO,KAAK,8BAA8B;AAAA,EAC5C;AAEA,MAAI,OAAO,aAAa,CAAC,CAAC,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,SAAS,GAAG;AAClF,WAAO,KAAK,2DAA2D;AAAA,EACzE;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,SAA4B,cAAc,MAAyC;AACjH,SAAO;AAAA,IACL,YAAY,QAAQ,IAAI,CAAA,YAAW;AAAA,MACjC,GAAG;AAAA,MACH,aAAa,OAAO,eAAe;AAAA,IAAA,EACnC;AAAA,EAAA;AAEN;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AccountBuilder } from "./index16.js";
|
|
3
|
+
import { BaseHederaTransactionTool } from "hedera-agent-kit";
|
|
4
|
+
const HbarTransferInputSchema = z.object({
|
|
5
|
+
accountId: z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),
|
|
6
|
+
amount: z.union([z.number(), z.string()]).describe(
|
|
7
|
+
"HBAR amount. Positive for credit, negative for debit. Builder handles Hbar unit & sum validation."
|
|
8
|
+
)
|
|
9
|
+
});
|
|
10
|
+
const TransferHbarZodSchemaCore = z.object({
|
|
11
|
+
transfers: z.array(HbarTransferInputSchema).min(1).describe(
|
|
12
|
+
'Array of ALL transfers for this transaction. For multi-party transfers (e.g., "A sends 5 to C and B sends 3 to C"), include all transfers here: [{accountId: "A", amount: -5}, {accountId: "B", amount: -3}, {accountId: "C", amount: 8}]. Amounts must sum to zero.'
|
|
13
|
+
),
|
|
14
|
+
memo: z.string().optional().describe("Optional. Memo for the transaction.")
|
|
15
|
+
});
|
|
16
|
+
class TransferHbarTool extends BaseHederaTransactionTool {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.name = "hedera-account-transfer-hbar-v2";
|
|
20
|
+
this.description = 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. Supports multiple transfers in a single transaction - when multiple accounts need to send/receive HBAR (e.g., "A sends 5 HBAR to C and B sends 3 HBAR to C"), include ALL transfers in one transfers array. The sum of all transfers must equal zero. Use this for scheduled transactions and multi-signature scenarios.';
|
|
21
|
+
this.specificInputSchema = TransferHbarZodSchemaCore;
|
|
22
|
+
this.namespace = "account";
|
|
23
|
+
}
|
|
24
|
+
getServiceBuilder() {
|
|
25
|
+
return new AccountBuilder(this.hederaKit);
|
|
26
|
+
}
|
|
27
|
+
async callBuilderMethod(builder, specificArgs) {
|
|
28
|
+
await builder.transferHbar(
|
|
29
|
+
specificArgs
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
TransferHbarTool
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=index12.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index12.js","sources":["../../src/plugins/hbar-transfer/TransferHbarTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { HbarTransferParams } from './types';\nimport { AccountBuilder } from './AccountBuilder';\nimport { BaseHederaTransactionTool, BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst HbarTransferInputSchema = z.object({\n accountId: z\n .string()\n .describe('Account ID for the transfer (e.g., \"0.0.xxxx\").'),\n amount: z\n .union([z.number(), z.string()])\n .describe(\n 'HBAR amount. Positive for credit, negative for debit. Builder handles Hbar unit & sum validation.'\n ),\n});\n\nconst TransferHbarZodSchemaCore = z.object({\n transfers: z\n .array(HbarTransferInputSchema)\n .min(1)\n .describe(\n 'Array of ALL transfers for this transaction. For multi-party transfers (e.g., \"A sends 5 to C and B sends 3 to C\"), include all transfers here: [{accountId: \"A\", amount: -5}, {accountId: \"B\", amount: -3}, {accountId: \"C\", amount: 8}]. Amounts must sum to zero.'\n ),\n memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class TransferHbarTool extends BaseHederaTransactionTool<\n typeof TransferHbarZodSchemaCore\n> {\n name = 'hedera-account-transfer-hbar-v2';\n description =\n 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. Supports multiple transfers in a single transaction - when multiple accounts need to send/receive HBAR (e.g., \"A sends 5 HBAR to C and B sends 3 HBAR to C\"), include ALL transfers in one transfers array. The sum of all transfers must equal zero. Use this for scheduled transactions and multi-signature scenarios.';\n specificInputSchema = TransferHbarZodSchemaCore;\n namespace = 'account';\n\n\n protected getServiceBuilder(): BaseServiceBuilder {\n return new AccountBuilder(this.hederaKit) as BaseServiceBuilder;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof TransferHbarZodSchemaCore>\n ): Promise<void> {\n await (builder as AccountBuilder).transferHbar(\n specificArgs as unknown as HbarTransferParams\n );\n }\n}"],"names":[],"mappings":";;;AAKA,MAAM,0BAA0B,EAAE,OAAO;AAAA,EACvC,WAAW,EACR,SACA,SAAS,iDAAiD;AAAA,EAC7D,QAAQ,EACL,MAAM,CAAC,EAAE,OAAA,GAAU,EAAE,QAAQ,CAAC,EAC9B;AAAA,IACC;AAAA,EAAA;AAEN,CAAC;AAED,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,WAAW,EACR,MAAM,uBAAuB,EAC7B,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EAAA;AAAA,EAEJ,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,qCAAqC;AAC5E,CAAC;AAEM,MAAM,yBAAyB,0BAEpC;AAAA,EAFK,cAAA;AAAA,UAAA,GAAA,SAAA;AAGL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,sBAAsB;AACtB,SAAA,YAAY;AAAA,EAAA;AAAA,EAGF,oBAAwC;AAChD,WAAO,IAAI,eAAe,KAAK,SAAS;AAAA,EAC1C;AAAA,EAEA,MAAgB,kBACd,SACA,cACe;AACf,UAAO,QAA2B;AAAA,MAChC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const getSystemMessage = (accountId) => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, and content inscription.
|
|
2
|
+
|
|
3
|
+
You have access to tools for:
|
|
4
|
+
- HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages
|
|
5
|
+
- HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents
|
|
6
|
+
- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions
|
|
7
|
+
|
|
8
|
+
*** IMPORTANT CONTEXT ***
|
|
9
|
+
You are currently operating as agent: ${accountId} on the Hashgraph Online network
|
|
10
|
+
When users ask about "my profile", "my account", "my connections", etc., use this account ID: ${accountId}
|
|
11
|
+
|
|
12
|
+
Remember the connection numbers when listing connections, as users might refer to them.`;
|
|
13
|
+
export {
|
|
14
|
+
getSystemMessage
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=index13.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index13.js","sources":["../../src/config/system-message.ts"],"sourcesContent":["export const getSystemMessage = (accountId: string): string => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, and content inscription.\n\nYou have access to tools for:\n- HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages\n- HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents\n- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions\n\n*** IMPORTANT CONTEXT ***\nYou are currently operating as agent: ${accountId} on the Hashgraph Online network\nWhen users ask about \"my profile\", \"my account\", \"my connections\", etc., use this account ID: ${accountId}\n\nRemember the connection numbers when listing connections, as users might refer to them.`"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,CAAC,cAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAQvB,SAAS;AAAA,gGAC+C,SAAS;AAAA;AAAA;"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
class MCPClientManager {
|
|
4
|
+
constructor(logger) {
|
|
5
|
+
this.clients = /* @__PURE__ */ new Map();
|
|
6
|
+
this.tools = /* @__PURE__ */ new Map();
|
|
7
|
+
this.logger = logger;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Connect to an MCP server and discover its tools
|
|
11
|
+
*/
|
|
12
|
+
async connectServer(config) {
|
|
13
|
+
try {
|
|
14
|
+
if (this.isServerConnected(config.name)) {
|
|
15
|
+
return {
|
|
16
|
+
serverName: config.name,
|
|
17
|
+
connected: false,
|
|
18
|
+
error: `Server ${config.name} is already connected`,
|
|
19
|
+
tools: []
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (config.transport && config.transport !== "stdio") {
|
|
23
|
+
throw new Error(`Transport ${config.transport} not yet supported`);
|
|
24
|
+
}
|
|
25
|
+
const transport = new StdioClientTransport({
|
|
26
|
+
command: config.command,
|
|
27
|
+
args: config.args,
|
|
28
|
+
...config.env && { env: config.env }
|
|
29
|
+
});
|
|
30
|
+
const client = new Client({
|
|
31
|
+
name: `conversational-agent-${config.name}`,
|
|
32
|
+
version: "1.0.0"
|
|
33
|
+
}, {
|
|
34
|
+
capabilities: {}
|
|
35
|
+
});
|
|
36
|
+
await client.connect(transport);
|
|
37
|
+
this.clients.set(config.name, client);
|
|
38
|
+
const toolsResponse = await client.listTools();
|
|
39
|
+
const toolsWithServer = toolsResponse.tools.map((tool) => ({
|
|
40
|
+
...tool,
|
|
41
|
+
serverName: config.name
|
|
42
|
+
}));
|
|
43
|
+
this.tools.set(config.name, toolsWithServer);
|
|
44
|
+
this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);
|
|
45
|
+
return {
|
|
46
|
+
serverName: config.name,
|
|
47
|
+
connected: true,
|
|
48
|
+
tools: toolsWithServer
|
|
49
|
+
};
|
|
50
|
+
} catch (error) {
|
|
51
|
+
this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);
|
|
52
|
+
return {
|
|
53
|
+
serverName: config.name,
|
|
54
|
+
connected: false,
|
|
55
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
56
|
+
tools: []
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Execute a tool on a specific MCP server
|
|
62
|
+
*/
|
|
63
|
+
async executeTool(serverName, toolName, args) {
|
|
64
|
+
const client = this.clients.get(serverName);
|
|
65
|
+
if (!client) {
|
|
66
|
+
throw new Error(`MCP server ${serverName} not connected`);
|
|
67
|
+
}
|
|
68
|
+
this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);
|
|
69
|
+
try {
|
|
70
|
+
const result = await client.callTool({
|
|
71
|
+
name: toolName,
|
|
72
|
+
arguments: args
|
|
73
|
+
});
|
|
74
|
+
return result;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
this.logger.error(`Error executing MCP tool ${toolName}:`, error);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Disconnect all MCP servers
|
|
82
|
+
*/
|
|
83
|
+
async disconnectAll() {
|
|
84
|
+
for (const [name, client] of this.clients) {
|
|
85
|
+
try {
|
|
86
|
+
await client.close();
|
|
87
|
+
this.logger.info(`Disconnected from MCP server ${name}`);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
this.logger.error(`Error disconnecting MCP server ${name}:`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
this.clients.clear();
|
|
93
|
+
this.tools.clear();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all discovered tools from all connected servers
|
|
97
|
+
*/
|
|
98
|
+
getAllTools() {
|
|
99
|
+
const allTools = [];
|
|
100
|
+
for (const tools of this.tools.values()) {
|
|
101
|
+
allTools.push(...tools);
|
|
102
|
+
}
|
|
103
|
+
return allTools;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get tools from a specific server
|
|
107
|
+
*/
|
|
108
|
+
getServerTools(serverName) {
|
|
109
|
+
return this.tools.get(serverName) || [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if a server is connected
|
|
113
|
+
*/
|
|
114
|
+
isServerConnected(serverName) {
|
|
115
|
+
return this.clients.has(serverName);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get list of connected server names
|
|
119
|
+
*/
|
|
120
|
+
getConnectedServers() {
|
|
121
|
+
return Array.from(this.clients.keys());
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export {
|
|
125
|
+
MCPClientManager
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=index14.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index14.js","sources":["../../src/mcp/MCPClientManager.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { MCPServerConfig, MCPToolInfo, MCPConnectionStatus } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Manages connections to MCP servers and tool discovery\n */\nexport class MCPClientManager {\n private clients: Map<string, Client> = new Map();\n private tools: Map<string, MCPToolInfo[]> = new Map();\n private logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Connect to an MCP server and discover its tools\n */\n async connectServer(config: MCPServerConfig): Promise<MCPConnectionStatus> {\n try {\n if (this.isServerConnected(config.name)) {\n return {\n serverName: config.name,\n connected: false,\n error: `Server ${config.name} is already connected`,\n tools: [],\n };\n }\n\n if (config.transport && config.transport !== 'stdio') {\n throw new Error(`Transport ${config.transport} not yet supported`);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n ...(config.env && { env: config.env }),\n });\n\n const client = new Client({\n name: `conversational-agent-${config.name}`,\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n\n await client.connect(transport);\n this.clients.set(config.name, client);\n\n const toolsResponse = await client.listTools();\n const toolsWithServer: MCPToolInfo[] = toolsResponse.tools.map(tool => ({\n ...tool,\n serverName: config.name,\n }));\n\n this.tools.set(config.name, toolsWithServer);\n this.logger.info(`Connected to MCP server ${config.name} with ${toolsWithServer.length} tools`);\n\n return {\n serverName: config.name,\n connected: true,\n tools: toolsWithServer,\n };\n } catch (error) {\n this.logger.error(`Failed to connect to MCP server ${config.name}:`, error);\n return {\n serverName: config.name,\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n tools: [],\n };\n }\n }\n\n /**\n * Execute a tool on a specific MCP server\n */\n async executeTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const client = this.clients.get(serverName);\n if (!client) {\n throw new Error(`MCP server ${serverName} not connected`);\n }\n\n this.logger.debug(`Executing MCP tool ${toolName} on server ${serverName}`, args);\n\n try {\n const result = await client.callTool({\n name: toolName,\n arguments: args,\n });\n\n return result;\n } catch (error) {\n this.logger.error(`Error executing MCP tool ${toolName}:`, error);\n throw error;\n }\n }\n\n /**\n * Disconnect all MCP servers\n */\n async disconnectAll(): Promise<void> {\n for (const [name, client] of this.clients) {\n try {\n await client.close();\n this.logger.info(`Disconnected from MCP server ${name}`);\n } catch (error) {\n this.logger.error(`Error disconnecting MCP server ${name}:`, error);\n }\n }\n this.clients.clear();\n this.tools.clear();\n }\n\n /**\n * Get all discovered tools from all connected servers\n */\n getAllTools(): MCPToolInfo[] {\n const allTools: MCPToolInfo[] = [];\n for (const tools of this.tools.values()) {\n allTools.push(...tools);\n }\n return allTools;\n }\n\n /**\n * Get tools from a specific server\n */\n getServerTools(serverName: string): MCPToolInfo[] {\n return this.tools.get(serverName) || [];\n }\n\n /**\n * Check if a server is connected\n */\n isServerConnected(serverName: string): boolean {\n return this.clients.has(serverName);\n }\n\n /**\n * Get list of connected server names\n */\n getConnectedServers(): string[] {\n return Array.from(this.clients.keys());\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { DynamicStructuredTool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
function convertMCPToolToLangChain(tool, mcpManager, serverConfig) {
|
|
4
|
+
const zodSchema = jsonSchemaToZod(tool.inputSchema);
|
|
5
|
+
const sanitizedName = `${tool.serverName}_${tool.name}`.replace(
|
|
6
|
+
/[^a-zA-Z0-9_]/g,
|
|
7
|
+
"_"
|
|
8
|
+
);
|
|
9
|
+
let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;
|
|
10
|
+
if (serverConfig?.toolDescriptions?.[tool.name]) {
|
|
11
|
+
description = `${description}
|
|
12
|
+
|
|
13
|
+
${serverConfig.toolDescriptions[tool.name]}`;
|
|
14
|
+
}
|
|
15
|
+
if (serverConfig?.additionalContext) {
|
|
16
|
+
description = `${description}
|
|
17
|
+
|
|
18
|
+
Context: ${serverConfig.additionalContext}`;
|
|
19
|
+
}
|
|
20
|
+
return new DynamicStructuredTool({
|
|
21
|
+
name: sanitizedName,
|
|
22
|
+
description,
|
|
23
|
+
schema: zodSchema,
|
|
24
|
+
func: async (input) => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await mcpManager.executeTool(
|
|
27
|
+
tool.serverName,
|
|
28
|
+
tool.name,
|
|
29
|
+
input
|
|
30
|
+
);
|
|
31
|
+
if (typeof result === "string") {
|
|
32
|
+
return result;
|
|
33
|
+
} else if (result && typeof result === "object" && "content" in result) {
|
|
34
|
+
const content = result.content;
|
|
35
|
+
if (Array.isArray(content)) {
|
|
36
|
+
const textParts = content.filter(
|
|
37
|
+
(item) => typeof item === "object" && item !== null && "type" in item && item.type === "text" && "text" in item
|
|
38
|
+
).map((item) => item.text);
|
|
39
|
+
return textParts.join("\n");
|
|
40
|
+
}
|
|
41
|
+
return JSON.stringify(content);
|
|
42
|
+
}
|
|
43
|
+
return JSON.stringify(result);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
46
|
+
return `Error executing MCP tool ${tool.name}: ${errorMessage}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function jsonSchemaToZod(schema) {
|
|
52
|
+
if (!schema || typeof schema !== "object") {
|
|
53
|
+
return z.object({});
|
|
54
|
+
}
|
|
55
|
+
const schemaObj = schema;
|
|
56
|
+
if (schemaObj.type && schemaObj.type !== "object") {
|
|
57
|
+
return convertType(schemaObj);
|
|
58
|
+
}
|
|
59
|
+
if (!schemaObj.properties || typeof schemaObj.properties !== "object") {
|
|
60
|
+
return z.object({});
|
|
61
|
+
}
|
|
62
|
+
const shape = {};
|
|
63
|
+
for (const [key, value] of Object.entries(schemaObj.properties)) {
|
|
64
|
+
let zodType = convertType(value);
|
|
65
|
+
const isRequired = Array.isArray(schemaObj.required) && schemaObj.required.includes(key);
|
|
66
|
+
if (!isRequired) {
|
|
67
|
+
zodType = zodType.optional();
|
|
68
|
+
}
|
|
69
|
+
shape[key] = zodType;
|
|
70
|
+
}
|
|
71
|
+
return z.object(shape);
|
|
72
|
+
}
|
|
73
|
+
function convertType(schema) {
|
|
74
|
+
if (!schema || typeof schema !== "object" || !("type" in schema)) {
|
|
75
|
+
return z.unknown();
|
|
76
|
+
}
|
|
77
|
+
const schemaObj = schema;
|
|
78
|
+
let zodType;
|
|
79
|
+
switch (schemaObj.type) {
|
|
80
|
+
case "string":
|
|
81
|
+
zodType = z.string();
|
|
82
|
+
if (schemaObj.enum && Array.isArray(schemaObj.enum)) {
|
|
83
|
+
zodType = z.enum(schemaObj.enum);
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
case "number":
|
|
87
|
+
zodType = z.number();
|
|
88
|
+
if ("minimum" in schemaObj && typeof schemaObj.minimum === "number") {
|
|
89
|
+
zodType = zodType.min(schemaObj.minimum);
|
|
90
|
+
}
|
|
91
|
+
if ("maximum" in schemaObj && typeof schemaObj.maximum === "number") {
|
|
92
|
+
zodType = zodType.max(schemaObj.maximum);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
case "integer":
|
|
96
|
+
zodType = z.number().int();
|
|
97
|
+
if ("minimum" in schemaObj && typeof schemaObj.minimum === "number") {
|
|
98
|
+
zodType = zodType.min(schemaObj.minimum);
|
|
99
|
+
}
|
|
100
|
+
if ("maximum" in schemaObj && typeof schemaObj.maximum === "number") {
|
|
101
|
+
zodType = zodType.max(schemaObj.maximum);
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case "boolean":
|
|
105
|
+
zodType = z.boolean();
|
|
106
|
+
break;
|
|
107
|
+
case "array":
|
|
108
|
+
if (schemaObj.items) {
|
|
109
|
+
zodType = z.array(convertType(schemaObj.items));
|
|
110
|
+
} else {
|
|
111
|
+
zodType = z.array(z.unknown());
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
case "object":
|
|
115
|
+
if ("properties" in schemaObj) {
|
|
116
|
+
zodType = jsonSchemaToZod(schemaObj);
|
|
117
|
+
} else {
|
|
118
|
+
zodType = z.object({}).passthrough();
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
zodType = z.unknown();
|
|
123
|
+
}
|
|
124
|
+
if ("description" in schemaObj && typeof schemaObj.description === "string") {
|
|
125
|
+
zodType = zodType.describe(schemaObj.description);
|
|
126
|
+
}
|
|
127
|
+
return zodType;
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
convertMCPToolToLangChain
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=index15.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index15.js","sources":["../../src/mcp/adapters/langchain.ts"],"sourcesContent":["import { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { MCPToolInfo, MCPServerConfig } from '../types';\nimport type { MCPClientManager } from '../MCPClientManager';\n\n/**\n * Convert an MCP tool to a LangChain DynamicStructuredTool\n */\nexport function convertMCPToolToLangChain(\n tool: MCPToolInfo,\n mcpManager: MCPClientManager,\n serverConfig?: MCPServerConfig\n): DynamicStructuredTool {\n const zodSchema = jsonSchemaToZod(tool.inputSchema);\n\n const sanitizedName = `${tool.serverName}_${tool.name}`.replace(\n /[^a-zA-Z0-9_]/g,\n '_'\n );\n\n let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;\n \n if (serverConfig?.toolDescriptions?.[tool.name]) {\n description = `${description}\\n\\n${serverConfig.toolDescriptions[tool.name]}`;\n }\n \n if (serverConfig?.additionalContext) {\n description = `${description}\\n\\nContext: ${serverConfig.additionalContext}`;\n }\n\n return new DynamicStructuredTool({\n name: sanitizedName,\n description,\n schema: zodSchema,\n func: async (input) => {\n try {\n const result = await mcpManager.executeTool(\n tool.serverName,\n tool.name,\n input\n );\n\n if (typeof result === 'string') {\n return result;\n } else if (\n result &&\n typeof result === 'object' &&\n 'content' in result\n ) {\n const content = (result as { content: unknown }).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (item): item is { type: string; text: string } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text' &&\n 'text' in item\n )\n .map((item) => item.text);\n return textParts.join('\\n');\n }\n return JSON.stringify(content);\n }\n\n return JSON.stringify(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n return `Error executing MCP tool ${tool.name}: ${errorMessage}`;\n }\n },\n });\n}\n\n/**\n * Convert JSON Schema to Zod schema\n * This is a simplified converter that handles common cases\n */\nfunction jsonSchemaToZod(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object') {\n return z.object({});\n }\n\n const schemaObj = schema as Record<string, unknown>;\n\n if (schemaObj.type && schemaObj.type !== 'object') {\n return convertType(schemaObj);\n }\n\n if (!schemaObj.properties || typeof schemaObj.properties !== 'object') {\n return z.object({});\n }\n\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(schemaObj.properties)) {\n let zodType = convertType(value);\n\n const isRequired =\n Array.isArray(schemaObj.required) && schemaObj.required.includes(key);\n if (!isRequired) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape);\n}\n\n/**\n * Convert a single JSON Schema type to Zod\n */\nfunction convertType(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object' || !('type' in schema)) {\n return z.unknown();\n }\n\n const schemaObj = schema as {\n type: string;\n enum?: unknown[];\n items?: unknown;\n };\n let zodType: z.ZodTypeAny;\n\n switch (schemaObj.type) {\n case 'string':\n zodType = z.string();\n if (schemaObj.enum && Array.isArray(schemaObj.enum)) {\n zodType = z.enum(schemaObj.enum as [string, ...string[]]);\n }\n break;\n\n case 'number':\n zodType = z.number();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'integer':\n zodType = z.number().int();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'boolean':\n zodType = z.boolean();\n break;\n\n case 'array':\n if (schemaObj.items) {\n zodType = z.array(convertType(schemaObj.items));\n } else {\n zodType = z.array(z.unknown());\n }\n break;\n\n case 'object':\n if ('properties' in schemaObj) {\n zodType = jsonSchemaToZod(schemaObj);\n } else {\n zodType = z.object({}).passthrough();\n }\n break;\n\n default:\n zodType = z.unknown();\n }\n\n if ('description' in schemaObj && typeof schemaObj.description === 'string') {\n zodType = zodType.describe(schemaObj.description);\n }\n\n return zodType;\n}\n"],"names":[],"mappings":"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"}
|