@hashgraphonline/conversational-agent 0.1.1 → 0.1.2
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/cjs/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("hedera-agent-kit"),t=require("@hashgraphonline/standards-agent-kit"),n=require("zod"),r=require("@hashgraph/sdk"),o=require("bignumber.js"),i=require("@hashgraphonline/standards-sdk"),s=require("langchain/agents"),a=require("@langchain/core/prompts"),c=require("@langchain/openai"),l=require("@modelcontextprotocol/sdk/client/index.js"),g=require("@modelcontextprotocol/sdk/client/stdio.js"),h=require("@langchain/core/tools"),u=require("@langchain/core/messages");class d extends e.BasePlugin{constructor(){super(...arguments),this.id="hcs-10",this.name="HCS-10 Plugin",this.description="HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="hcs10",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.stateManager=e.stateManager||new t.OpenConvaiState,this.initializeTools(),this.context.logger.info("HCS-10 Plugin initialized successfully")}catch(n){this.context.logger.error("Failed to initialize HCS-10 plugin:",n)}else this.context.logger.warn("HederaKit not found in context. HCS-10 tools will not be available.")}initializeTools(){if(!this.stateManager)throw new Error("StateManager must be initialized before creating tools");const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.HCS10Builder(e,this.stateManager);this.tools=[new t.RegisterAgentTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.FindRegistrationsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.RetrieveProfileTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.InitiateConnectionTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ListConnectionsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.SendMessageToConnectionTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.CheckMessagesTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ConnectionMonitorTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ManageConnectionRequestsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.AcceptConnectionRequestTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ListUnapprovedConnectionRequestsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger})]}getTools(){return this.tools}getStateManager(){return this.stateManager}async cleanup(){this.tools=[],delete this.stateManager,this.context?.logger&&this.context.logger.info("HCS-10 Plugin cleaned up")}}class m extends e.BasePlugin{constructor(){super(...arguments),this.id="hcs-2",this.name="HCS-2 Plugin",this.description="HCS-2 registry management tools for decentralized registries on Hedera",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="hcs2",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("HCS-2 Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize HCS-2 plugin:",t)}else this.context.logger.warn("HederaKit not found in context. HCS-2 tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.HCS2Builder(e);this.tools=[new t.CreateRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.RegisterEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.UpdateEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.DeleteEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.MigrateRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.QueryRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger})]}getTools(){return this.tools}async cleanup(){this.tools=[],this.context?.logger&&this.context.logger.info("HCS-2 Plugin cleaned up")}}class p extends e.BasePlugin{constructor(){super(...arguments),this.id="inscribe",this.name="Inscribe Plugin",this.description="Content inscription tools for storing data on Hedera Consensus Service",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="inscribe",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("Inscribe Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize Inscribe plugin:",t)}else this.context.logger.warn("HederaKit not found in context. Inscription tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.InscriberBuilder(e);this.tools=[new t.InscribeFromUrlTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeFromFileTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeFromBufferTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeHashinalTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.RetrieveInscriptionTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger})]}getTools(){return this.tools}async cleanup(){this.tools=[],this.context?.logger&&this.context.logger.info("Inscribe Plugin cleaned up")}}class f extends e.BaseServiceBuilder{constructor(e){super(e)}transferHbar(e,t=!0){this.clearNotes();const n=new r.TransferTransaction;if(!e.transfers||0===e.transfers.length)throw new Error("HbarTransferParams must include at least one transfer.");let i=new o(0),s=!1;if(t&&this.kit.userAccountId&&"provideBytes"===this.kit.operationalMode&&1===e.transfers.length){const t=e.transfers[0],i="string"==typeof t.amount||"number"==typeof t.amount?t.amount:t.amount.toString(),a=new o(i);if(a.isPositive()){const e="string"==typeof t.accountId?r.AccountId.fromString(t.accountId):t.accountId,i=a.toFixed(8,o.ROUND_DOWN),c=r.Hbar.fromString(i);this.logger.info(`[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${c.toString()} from ${this.kit.userAccountId} to ${e.toString()}`),this.addNote(`Configured HBAR transfer from your account (${this.kit.userAccountId}) to ${e.toString()} for ${c.toString()}.`),n.addHbarTransfer(e,c),n.addHbarTransfer(r.AccountId.fromString(this.kit.userAccountId),c.negated()),s=!0}}if(!s){const t=[];for(const n of e.transfers){const e="string"==typeof n.accountId?r.AccountId.fromString(n.accountId):n.accountId,s="string"==typeof n.amount||"number"==typeof n.amount?n.amount:n.amount.toString(),a=new o(s),c=a.toFixed(8,o.ROUND_DOWN);this.logger.info(`Processing transfer: ${s} HBAR (rounded to ${c}) for account ${e.toString()}`);const l=r.Hbar.fromString(c);t.push({accountId:e,amount:a,hbar:l});const g=l.toTinybars();i=i.plus(g.toString())}if(!i.isZero()&&(this.logger.warn(`Transfer sum not zero: ${i.toString()} tinybars off. Adjusting last transfer.`),t.length>0)){const e=t[t.length-1],n=i.dividedBy(-1e8),s=e.amount.plus(n).toFixed(8,o.ROUND_DOWN);e.hbar=r.Hbar.fromString(s),this.logger.info(`Adjusted last transfer for ${e.accountId.toString()} to ${s} HBAR`)}for(const e of t)n.addHbarTransfer(e.accountId,e.hbar)}return void 0!==e.memo&&(null===e.memo?this.logger.warn("Received null for memo in transferHbar."):n.setTransactionMemo(e.memo)),this.setCurrentTransaction(n),this}}const y=n.z.object({accountId:n.z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),amount:n.z.union([n.z.number(),n.z.string()]).describe("HBAR amount. Positive for credit, negative for debit. Builder handles Hbar unit & sum validation.")}),w=n.z.object({transfers:n.z.array(y).min(1).describe('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.'),memo:n.z.string().optional().describe("Optional. Memo for the transaction.")});class b extends e.BaseHederaTransactionTool{constructor(){super(...arguments),this.name="hedera-account-transfer-hbar-v2",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.',this.specificInputSchema=w,this.namespace="account"}getServiceBuilder(){return new f(this.hederaKit)}async callBuilderMethod(e,t){await e.transferHbar(t)}}class x extends e.BasePlugin{constructor(){super(...arguments),this.id="hbar-transfer",this.name="HBAR Transfer Plugin",this.description="HBAR transfer tool with proper decimal handling for multi-signature transactions",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="account",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("HBAR Transfer Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize HBAR Transfer plugin:",t)}else this.context.logger.warn("HederaKit not found in context. HBAR transfer tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");this.tools=[new b({hederaKit:e,logger:this.context.logger})]}getTools(){return this.tools}async shutdown(){this.tools=[]}}class v{constructor(e){this.config=e,this.tools=[],this.initialized=!1,this.logger=new i.Logger({module:"BaseAgent",silent:e.debug?.silent||!1})}getCore(){return this.agentKit}filterTools(e){let t=[...e];const n=this.config.filtering;return n?(n.namespaceWhitelist?.length&&(t=t.filter(e=>{const t=e.namespace;return!t||n.namespaceWhitelist.includes(t)})),n.toolBlacklist?.length&&(t=t.filter(e=>!n.toolBlacklist.includes(e.name))),n.toolPredicate&&(t=t.filter(n.toolPredicate)),this.logger.debug(`Filtered tools: ${e.length} → ${t.length}`),t):t}buildSystemPrompt(){const e=[],t=this.config.signer.getAccountId().toString(),n=this.config.execution?.userAccountId;this.config.messaging?.systemPreamble&&e.push(this.config.messaging.systemPreamble),e.push(`You are a helpful Hedera assistant. Your primary operator account is ${t}. You have tools to interact with the Hedera network. When using any tool, provide all necessary parameters as defined by that tool's schema and description.`),n&&e.push(`The user you are assisting has a personal Hedera account ID: ${n}. IMPORTANT: When the user says things like "I want to send HBAR" or "transfer my tokens", you MUST use ${n} as the sender/from account. For example, if user says "I want to send 2 HBAR to 0.0.800", you must set up a transfer where ${n} sends the HBAR, not your operator account.`);return"autonomous"===(this.config.execution?.operationalMode||"returnBytes")?e.push(`\nOPERATIONAL MODE: 'autonomous'. Your goal is to execute transactions directly using your tools. Your account ${t} will be the payer for these transactions. Even if the user's account (${n||"a specified account"}) is the actor in the transaction body (e.g., sender of HBAR), you (the agent with operator ${t}) are still executing and paying. For HBAR transfers, ensure the amounts in the 'transfers' array sum to zero (as per tool schema), balancing with your operator account if necessary.`):this.config.execution?.scheduleUserTransactionsInBytesMode&&n?e.push(`\nOPERATIONAL MODE: 'returnBytes' with scheduled transactions for user actions. When a user asks for a transaction to be prepared (e.g., creating a token, topic, transferring assets for them to sign, etc), you MUST default to creating a Scheduled Transaction using the appropriate tool with the metaOption 'schedule: true'. The user (with account ID ${n}) will be the one to ultimately pay for and (if needed) sign the inner transaction. Your operator account (${t}) will pay for creating the schedule entity itself. You MUST return the ScheduleId and details of the scheduled operation in a structured JSON format with these fields: success, op, schedule_id, description, payer_account_id_scheduled_tx, and scheduled_transaction_details.`):e.push(`\nOPERATIONAL MODE: 'returnBytes'. Your goal is to provide transaction bytes directly. When a user asks for a transaction to be prepared (e.g., for them to sign, or for scheduling without the default scheduling flow), you MUST call the appropriate tool. If you want raw bytes for the user to sign for their own account ${n||"if specified"}, ensure the tool constructs the transaction body accordingly and use metaOption 'returnBytes: true' if available, or ensure the builder is configured for the user.`),!1!==this.config.messaging?.conciseMode&&e.push("\nAlways be concise. If the tool provides a JSON string as its primary output (especially in returnBytes mode), make your accompanying text brief. If the tool does not provide JSON output or an error occurs, your narrative becomes primary; if notes were generated by the tool in such cases, append them to your textual response."),this.config.messaging?.systemPostamble&&e.push(this.config.messaging.systemPostamble),e.join("\n")}isReady(){return this.initialized}}class T{constructor(e){this.clients=new Map,this.tools=new Map,this.logger=e}async connectServer(e){try{if(this.isServerConnected(e.name))return{serverName:e.name,connected:!1,error:`Server ${e.name} is already connected`,tools:[]};if(e.transport&&"stdio"!==e.transport)throw new Error(`Transport ${e.transport} not yet supported`);const t=new g.StdioClientTransport({command:e.command,args:e.args,...e.env&&{env:e.env}}),n=new l.Client({name:`conversational-agent-${e.name}`,version:"1.0.0"},{capabilities:{}});await n.connect(t),this.clients.set(e.name,n);const r=(await n.listTools()).tools.map(t=>({...t,serverName:e.name}));return this.tools.set(e.name,r),this.logger.info(`Connected to MCP server ${e.name} with ${r.length} tools`),{serverName:e.name,connected:!0,tools:r}}catch(t){return this.logger.error(`Failed to connect to MCP server ${e.name}:`,t),{serverName:e.name,connected:!1,error:t instanceof Error?t.message:"Unknown error",tools:[]}}}async executeTool(e,t,n){const r=this.clients.get(e);if(!r)throw new Error(`MCP server ${e} not connected`);this.logger.debug(`Executing MCP tool ${t} on server ${e}`,n);try{return await r.callTool({name:t,arguments:n})}catch(o){throw this.logger.error(`Error executing MCP tool ${t}:`,o),o}}async disconnectAll(){for(const[t,n]of this.clients)try{await n.close(),this.logger.info(`Disconnected from MCP server ${t}`)}catch(e){this.logger.error(`Error disconnecting MCP server ${t}:`,e)}this.clients.clear(),this.tools.clear()}getAllTools(){const e=[];for(const t of this.tools.values())e.push(...t);return e}getServerTools(e){return this.tools.get(e)||[]}isServerConnected(e){return this.clients.has(e)}getConnectedServers(){return Array.from(this.clients.keys())}}function C(e,t,n){const r=S(e.inputSchema),o=`${e.serverName}_${e.name}`.replace(/[^a-zA-Z0-9_]/g,"_");let i=e.description||`MCP tool ${e.name} from ${e.serverName}`;return n?.toolDescriptions?.[e.name]&&(i=`${i}\n\n${n.toolDescriptions[e.name]}`),n?.additionalContext&&(i=`${i}\n\nContext: ${n.additionalContext}`),new h.DynamicStructuredTool({name:o,description:i,schema:r,func:async n=>{try{const r=await t.executeTool(e.serverName,e.name,n);if("string"==typeof r)return r;if(r&&"object"==typeof r&&"content"in r){const e=r.content;if(Array.isArray(e)){return e.filter(e=>"object"==typeof e&&null!==e&&"type"in e&&"text"===e.type&&"text"in e).map(e=>e.text).join("\n")}return JSON.stringify(e)}return JSON.stringify(r)}catch(r){const t=r instanceof Error?r.message:"Unknown error";return`Error executing MCP tool ${e.name}: ${t}`}}})}function S(e){if(!e||"object"!=typeof e)return n.z.object({});const t=e;if(t.type&&"object"!==t.type)return A(t);if(!t.properties||"object"!=typeof t.properties)return n.z.object({});const r={};for(const[n,o]of Object.entries(t.properties)){let e=A(o);Array.isArray(t.required)&&t.required.includes(n)||(e=e.optional()),r[n]=e}return n.z.object(r)}function A(e){if(!e||"object"!=typeof e||!("type"in e))return n.z.unknown();const t=e;let r;switch(t.type){case"string":r=n.z.string(),t.enum&&Array.isArray(t.enum)&&(r=n.z.enum(t.enum));break;case"number":r=n.z.number(),"minimum"in t&&"number"==typeof t.minimum&&(r=r.min(t.minimum)),"maximum"in t&&"number"==typeof t.maximum&&(r=r.max(t.maximum));break;case"integer":r=n.z.number().int(),"minimum"in t&&"number"==typeof t.minimum&&(r=r.min(t.minimum)),"maximum"in t&&"number"==typeof t.maximum&&(r=r.max(t.maximum));break;case"boolean":r=n.z.boolean();break;case"array":r=t.items?n.z.array(A(t.items)):n.z.array(n.z.unknown());break;case"object":r="properties"in t?S(t):n.z.object({}).passthrough();break;default:r=n.z.unknown()}return"description"in t&&"string"==typeof t.description&&(r=r.describe(t.description)),r}class P extends v{constructor(){super(...arguments),this.systemMessage=""}async boot(){if(this.initialized)this.logger.warn("Agent already initialized");else try{this.agentKit=await this.createAgentKit(),await this.agentKit.initialize();const t=this.config.ai?.modelName||process.env.OPENAI_MODEL_NAME||"gpt-4o-mini";this.tokenTracker=new e.TokenUsageCallbackHandler(t);const n=this.agentKit.getAggregatedLangChainTools();this.tools=this.filterTools(n),this.config.mcp?.servers&&this.config.mcp.servers.length>0&&await this.initializeMCP(),this.systemMessage=this.buildSystemPrompt(),await this.createExecutor(),this.initialized=!0,this.logger.info("LangChain Hedera agent initialized")}catch(t){throw this.logger.error("Failed to initialize agent:",t),t}}async chat(t,n){if(!this.initialized||!this.executor)throw new Error("Agent not initialized. Call boot() first.");try{const o=await this.executor.invoke({input:t,chat_history:n?.messages||[]});let i={output:o.output||"",message:o.output||"",notes:[]};const s=o?.intermediateSteps?.[0]?.observation;if(s&&"string"==typeof s&&this.isJSON(s))try{const e=JSON.parse(s);i={...i,...e}}catch(r){this.logger.error("Error parsing intermediate steps:",r)}if(i.output&&""!==i.output.trim()||(i.output="Agent action complete."),this.tokenTracker){const t=this.tokenTracker.getLatestTokenUsage();t&&(i.tokenUsage=t,i.cost=e.calculateTokenCostSync(t))}return i}catch(r){return this.handleError(r)}}async shutdown(){this.mcpManager&&await this.mcpManager.disconnectAll(),this.executor=void 0,this.agentKit=void 0,this.tools=[],this.initialized=!1,this.logger.info("Agent cleaned up")}switchMode(e){this.config.execution?this.config.execution.operationalMode=e:this.config.execution={operationalMode:e},this.agentKit&&(this.agentKit.operationalMode=e),this.systemMessage=this.buildSystemPrompt(),this.logger.info(`Operational mode switched to: ${e}`)}getUsageStats(){if(!this.tokenTracker)return{promptTokens:0,completionTokens:0,totalTokens:0,cost:{totalCost:0}};const t=this.tokenTracker.getTotalTokenUsage(),n=e.calculateTokenCostSync(t);return{...t,cost:n}}getUsageLog(){return this.tokenTracker?this.tokenTracker.getTokenUsageHistory().map(t=>({...t,cost:e.calculateTokenCostSync(t)})):[]}clearUsageStats(){this.tokenTracker&&(this.tokenTracker.reset(),this.logger.info("Usage statistics cleared"))}async createAgentKit(){const t=[...e.getAllHederaCorePlugins(),...this.config.extensions?.plugins||[]],n=this.config.execution?.operationalMode||"returnBytes",r=this.config.ai?.modelName||"gpt-4o";return new e.HederaAgentKit(this.config.signer,{plugins:t},n,this.config.execution?.userAccountId,this.config.execution?.scheduleUserTransactionsInBytesMode??!0,void 0,r,this.config.extensions?.mirrorConfig,this.config.debug?.silent??!1)}async createExecutor(){let e;if(this.config.ai?.provider&&this.config.ai.provider.getModel)e=this.config.ai.provider.getModel();else if(this.config.ai?.llm)e=this.config.ai.llm;else{const t=this.config.ai?.apiKey||process.env.OPENAI_API_KEY;if(!t)throw new Error("OpenAI API key required");e=new c.ChatOpenAI({apiKey:t,modelName:this.config.ai?.modelName||"gpt-4o-mini",temperature:this.config.ai?.temperature??.1,callbacks:this.tokenTracker?[this.tokenTracker]:[]})}const t=a.ChatPromptTemplate.fromMessages([["system",this.systemMessage],new a.MessagesPlaceholder("chat_history"),["human","{input}"],new a.MessagesPlaceholder("agent_scratchpad")]),n=this.tools,r=await s.createOpenAIToolsAgent({llm:e,tools:n,prompt:t});this.executor=new s.AgentExecutor({agent:r,tools:n,verbose:this.config.debug?.verbose??!1,returnIntermediateSteps:!0})}handleError(t){const n=t instanceof Error?t.message:"Unknown error";let r,o;this.logger.error("Chat error:",t),this.tokenTracker&&(r=this.tokenTracker.getLatestTokenUsage(),r&&(o=e.calculateTokenCostSync(r)));const i={output:"Sorry, I encountered an error processing your request.",message:"Error processing request.",error:n,notes:[]};return r&&(i.tokenUsage=r),o&&(i.cost=o),i}async initializeMCP(){this.mcpManager=new T(this.logger);for(const e of this.config.mcp.servers){if(!1===e.autoConnect){this.logger.info(`Skipping MCP server ${e.name} (autoConnect=false)`);continue}const t=await this.mcpManager.connectServer(e);if(t.connected){this.logger.info(`Connected to MCP server ${t.serverName} with ${t.tools.length} tools`);for(const n of t.tools){const t=C(n,this.mcpManager,e);this.tools.push(t)}}else this.logger.error(`Failed to connect to MCP server ${t.serverName}: ${t.error}`)}}isJSON(e){if("string"!=typeof e)return!1;const t=e.trim();if(!t)return!1;if(!(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))return!1;try{return JSON.parse(t),!0}catch{return!1}}}function k(e){const t=e.framework||"langchain";switch(t){case"langchain":return new P(e);case"vercel":throw new Error("Vercel AI SDK support coming soon");case"baml":throw new Error("BAML support coming soon");default:throw new Error(`Unknown framework: ${t}`)}}class M{constructor(e){this.model=e}async generate(e,t){const n=await this.model.invoke(e,t);return"string"==typeof n?n:n.toString()}async*stream(e,t){const n=await this.model.stream(e,t);for await(const r of n)yield"string"==typeof r?r:r.toString()}getModel(){return this.model}}const H=e=>`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: ${e} on the Hashgraph Online network\nWhen users ask about "my profile", "my account", "my connections", etc., use this account ID: ${e}\n\nRemember the connection numbers when listing connections, as users might refer to them.`,I="gpt-4o",B="testnet",z="autonomous";class K{constructor(e){this.options=e,this.stateManager=e.stateManager||new t.OpenConvaiState,this.hcs10Plugin=new d,this.hcs2Plugin=new m,this.inscribePlugin=new p,this.hbarTransferPlugin=new x,this.logger=new i.Logger({module:"ConversationalAgent",silent:e.disableLogging||!1})}async initialize(){const{accountId:t,privateKey:n,network:r=B,openAIApiKey:o,openAIModelName:i=I,verbose:s=!1,operationalMode:a=z,userAccountId:l,customSystemMessagePreamble:g,customSystemMessagePostamble:h,additionalPlugins:u=[],mirrorNodeConfig:d,disableLogging:m,scheduleUserTransactionsInBytesMode:p}=this.options;if(!t||!n)throw new Error("Account ID and private key are required");try{const f=await this.detectPrivateKeyType(t,n,r),y=new e.ServerSigner(t,f,r),w=[this.hcs10Plugin,this.hcs2Plugin,this.inscribePlugin,this.hbarTransferPlugin],b=e.getAllHederaCorePlugins();let x;if(this.options.enabledPlugins){const e=new Set(this.options.enabledPlugins);x=[...[...w,...b].filter(t=>e.has(t.id)),...u]}else x=[...w,...b,...u];const v=new c.ChatOpenAI({apiKey:o,modelName:i,temperature:.1});this.agent=k({framework:"langchain",signer:y,execution:{mode:"autonomous"===a?"direct":"bytes",operationalMode:a,...l&&{userAccountId:l},...void 0!==p&&{scheduleUserTransactions:p}},ai:{provider:new M(v),temperature:.1},filtering:{toolPredicate:e=>"hedera-account-transfer-hbar"!==e.name&&!(this.options.toolFilter&&!this.options.toolFilter(e))},messaging:{systemPreamble:g||H(t),...h&&{systemPostamble:h},conciseMode:!0},extensions:{plugins:x,...d&&{mirrorConfig:d}},...this.options.mcpServers&&{mcp:{servers:this.options.mcpServers,autoConnect:!0}},debug:{verbose:s,silent:m??!1}});const T=x.find(e=>"hcs-10"===e.id);T&&(T.appConfig={stateManager:this.stateManager}),await this.agent.boot()}catch(f){throw this.logger.error("Failed to initialize ConversationalAgent:",f),f}}getPlugin(){return this.hcs10Plugin}getStateManager(){return this.stateManager}getAgent(){if(!this.agent)throw new Error("Agent not initialized. Call initialize() first.");return this.agent}getConversationalAgent(){return this.getAgent()}async processMessage(e,t=[]){if(!this.agent)throw new Error("Agent not initialized. Call initialize() first.");const n={messages:t.map(e=>"human"===e.type?new u.HumanMessage(e.content):new u.AIMessage(e.content))};return this.agent.chat(e,n)}static withPlugins(e,t){return new K({...e,enabledPlugins:t})}static withHTS(e){return this.withPlugins(e,["hts-token"])}static withHCS2(e){return this.withPlugins(e,["hcs-2"])}static withHCS10(e){return this.withPlugins(e,["hcs-10"])}static withInscribe(e){return this.withPlugins(e,["inscribe"])}static withAccount(e){return this.withPlugins(e,["account"])}static withFileService(e){return this.withPlugins(e,["file-service"])}static withConsensusService(e){return this.withPlugins(e,["consensus-service"])}static withSmartContract(e){return this.withPlugins(e,["smart-contract"])}static withAllStandards(e){return this.withPlugins(e,["hcs-10","hcs-2","inscribe"])}static minimal(e){return this.withPlugins(e,[])}static withMCP(e,t){return new K({...e,mcpServers:t})}async detectPrivateKeyType(e,t,n){const o=new i.HederaMirrorNode(n),s=await o.requestAccount(e),a=s?.key?._type||"";return a?.toLowerCase()?.includes("ecdsa")?r.PrivateKey.fromStringECDSA(t):r.PrivateKey.fromStringED25519(t)}}exports.BaseAgent=v,exports.ConversationalAgent=K,exports.HCS10Plugin=d,exports.HCS2Plugin=m,exports.HbarTransferPlugin=x,exports.InscribePlugin=p,exports.LangChainAgent=P,exports.LangChainProvider=M,exports.MCPServers={filesystem:e=>({name:"filesystem",command:"npx",args:["-y","@modelcontextprotocol/server-filesystem",e],transport:"stdio",autoConnect:!0,additionalContext:"This server provides access to files and directories in the current working directory.",toolDescriptions:{list_directory:'Use this tool when users ask about files in the "current directory" or "working directory".',read_file:"Use this tool when users ask to see or check files in the current directory."}}),github:e=>({name:"github",command:"npx",args:["-y","@modelcontextprotocol/server-github"],...e&&{env:{GITHUB_TOKEN:e}},transport:"stdio",autoConnect:!0}),slack:e=>({name:"slack",command:"npx",args:["-y","@modelcontextprotocol/server-slack"],env:{SLACK_TOKEN:e},transport:"stdio",autoConnect:!0}),googleDrive:e=>({name:"google-drive",command:"npx",args:["-y","@modelcontextprotocol/server-google-drive"],env:{GOOGLE_CREDENTIALS:e},transport:"stdio",autoConnect:!0}),postgres:e=>({name:"postgres",command:"npx",args:["-y","@modelcontextprotocol/server-postgres",e],transport:"stdio",autoConnect:!0}),sqlite:e=>({name:"sqlite",command:"npx",args:["-y","@modelcontextprotocol/server-sqlite",e],transport:"stdio",autoConnect:!0}),custom:e=>e},exports.OpenConvAIPlugin=d,exports.createAgent=k,exports.createMCPConfig=function(e,t=!0){return{mcpServers:e.map(e=>({...e,autoConnect:e.autoConnect??t}))}},exports.validateServerConfig=function(e){const t=[];return e.name||t.push("Server name is required"),e.command||t.push("Server command is required"),e.args&&Array.isArray(e.args)||t.push("Server args must be an array"),e.transport&&!["stdio","http","websocket"].includes(e.transport)&&t.push("Invalid transport type. Must be stdio, http, or websocket"),t},Object.keys(e).forEach(t=>{"default"===t||Object.prototype.hasOwnProperty.call(exports,t)||Object.defineProperty(exports,t,{enumerable:!0,get:()=>e[t]})});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("hedera-agent-kit"),t=require("@hashgraphonline/standards-agent-kit"),n=require("zod"),r=require("@hashgraph/sdk"),o=require("bignumber.js"),i=require("@hashgraphonline/standards-sdk"),s=require("langchain/agents"),a=require("@langchain/core/prompts"),c=require("@langchain/openai"),l=require("@modelcontextprotocol/sdk/client/index.js"),g=require("@modelcontextprotocol/sdk/client/stdio.js"),h=require("@langchain/core/tools"),u=require("@langchain/core/messages");class d extends e.BasePlugin{constructor(){super(...arguments),this.id="hcs-10",this.name="HCS-10 Plugin",this.description="HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="hcs10",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.stateManager=e.stateManager||e.config.stateManager||new t.OpenConvaiState,this.initializeTools(),this.context.logger.info("HCS-10 Plugin initialized successfully")}catch(n){this.context.logger.error("Failed to initialize HCS-10 plugin:",n)}else this.context.logger.warn("HederaKit not found in context. HCS-10 tools will not be available.")}initializeTools(){if(!this.stateManager)throw new Error("StateManager must be initialized before creating tools");const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.HCS10Builder(e,this.stateManager);this.tools=[new t.RegisterAgentTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.FindRegistrationsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.RetrieveProfileTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.InitiateConnectionTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ListConnectionsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.SendMessageToConnectionTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.CheckMessagesTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ConnectionMonitorTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ManageConnectionRequestsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.AcceptConnectionRequestTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger}),new t.ListUnapprovedConnectionRequestsTool({hederaKit:e,hcs10Builder:n,logger:this.context.logger})]}getTools(){return this.tools}getStateManager(){return this.stateManager}async cleanup(){this.tools=[],delete this.stateManager,this.context?.logger&&this.context.logger.info("HCS-10 Plugin cleaned up")}}class m extends e.BasePlugin{constructor(){super(...arguments),this.id="hcs-2",this.name="HCS-2 Plugin",this.description="HCS-2 registry management tools for decentralized registries on Hedera",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="hcs2",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("HCS-2 Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize HCS-2 plugin:",t)}else this.context.logger.warn("HederaKit not found in context. HCS-2 tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.HCS2Builder(e);this.tools=[new t.CreateRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.RegisterEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.UpdateEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.DeleteEntryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.MigrateRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger}),new t.QueryRegistryTool({hederaKit:e,hcs2Builder:n,logger:this.context.logger})]}getTools(){return this.tools}async cleanup(){this.tools=[],this.context?.logger&&this.context.logger.info("HCS-2 Plugin cleaned up")}}class p extends e.BasePlugin{constructor(){super(...arguments),this.id="inscribe",this.name="Inscribe Plugin",this.description="Content inscription tools for storing data on Hedera Consensus Service",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="inscribe",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("Inscribe Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize Inscribe plugin:",t)}else this.context.logger.warn("HederaKit not found in context. Inscription tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");const n=new t.InscriberBuilder(e);this.tools=[new t.InscribeFromUrlTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeFromFileTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeFromBufferTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.InscribeHashinalTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger}),new t.RetrieveInscriptionTool({hederaKit:e,inscriberBuilder:n,logger:this.context.logger})]}getTools(){return this.tools}async cleanup(){this.tools=[],this.context?.logger&&this.context.logger.info("Inscribe Plugin cleaned up")}}class f extends e.BaseServiceBuilder{constructor(e){super(e)}transferHbar(e,t=!0){this.clearNotes();const n=new r.TransferTransaction;if(!e.transfers||0===e.transfers.length)throw new Error("HbarTransferParams must include at least one transfer.");let i=new o(0),s=!1;if(t&&this.kit.userAccountId&&"provideBytes"===this.kit.operationalMode&&1===e.transfers.length){const t=e.transfers[0],i="string"==typeof t.amount||"number"==typeof t.amount?t.amount:t.amount.toString(),a=new o(i);if(a.isPositive()){const e="string"==typeof t.accountId?r.AccountId.fromString(t.accountId):t.accountId,i=a.toFixed(8,o.ROUND_DOWN),c=r.Hbar.fromString(i);this.logger.info(`[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${c.toString()} from ${this.kit.userAccountId} to ${e.toString()}`),this.addNote(`Configured HBAR transfer from your account (${this.kit.userAccountId}) to ${e.toString()} for ${c.toString()}.`),n.addHbarTransfer(e,c),n.addHbarTransfer(r.AccountId.fromString(this.kit.userAccountId),c.negated()),s=!0}}if(!s){const t=[];for(const n of e.transfers){const e="string"==typeof n.accountId?r.AccountId.fromString(n.accountId):n.accountId,s="string"==typeof n.amount||"number"==typeof n.amount?n.amount:n.amount.toString(),a=new o(s),c=a.toFixed(8,o.ROUND_DOWN);this.logger.info(`Processing transfer: ${s} HBAR (rounded to ${c}) for account ${e.toString()}`);const l=r.Hbar.fromString(c);t.push({accountId:e,amount:a,hbar:l});const g=l.toTinybars();i=i.plus(g.toString())}if(!i.isZero()&&(this.logger.warn(`Transfer sum not zero: ${i.toString()} tinybars off. Adjusting last transfer.`),t.length>0)){const e=t[t.length-1],n=i.dividedBy(-1e8),s=e.amount.plus(n).toFixed(8,o.ROUND_DOWN);e.hbar=r.Hbar.fromString(s),this.logger.info(`Adjusted last transfer for ${e.accountId.toString()} to ${s} HBAR`)}for(const e of t)n.addHbarTransfer(e.accountId,e.hbar)}return void 0!==e.memo&&(null===e.memo?this.logger.warn("Received null for memo in transferHbar."):n.setTransactionMemo(e.memo)),this.setCurrentTransaction(n),this}}const y=n.z.object({accountId:n.z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),amount:n.z.union([n.z.number(),n.z.string()]).describe("HBAR amount. Positive for credit, negative for debit. Builder handles Hbar unit & sum validation.")}),w=n.z.object({transfers:n.z.array(y).min(1).describe('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.'),memo:n.z.string().optional().describe("Optional. Memo for the transaction.")});class b extends e.BaseHederaTransactionTool{constructor(){super(...arguments),this.name="hedera-account-transfer-hbar-v2",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.',this.specificInputSchema=w,this.namespace="account"}getServiceBuilder(){return new f(this.hederaKit)}async callBuilderMethod(e,t){await e.transferHbar(t)}}class x extends e.BasePlugin{constructor(){super(...arguments),this.id="hbar-transfer",this.name="HBAR Transfer Plugin",this.description="HBAR transfer tool with proper decimal handling for multi-signature transactions",this.version="1.0.0",this.author="Hashgraph Online",this.namespace="account",this.tools=[]}async initialize(e){await super.initialize(e);if(e.config.hederaKit)try{this.initializeTools(),this.context.logger.info("HBAR Transfer Plugin initialized successfully")}catch(t){this.context.logger.error("Failed to initialize HBAR Transfer plugin:",t)}else this.context.logger.warn("HederaKit not found in context. HBAR transfer tools will not be available.")}initializeTools(){const e=this.context.config.hederaKit;if(!e)throw new Error("HederaKit not found in context config");this.tools=[new b({hederaKit:e,logger:this.context.logger})]}getTools(){return this.tools}async shutdown(){this.tools=[]}}class v{constructor(e){this.config=e,this.tools=[],this.initialized=!1,this.logger=new i.Logger({module:"BaseAgent",silent:e.debug?.silent||!1})}getCore(){return this.agentKit}filterTools(e){let t=[...e];const n=this.config.filtering;return n?(n.namespaceWhitelist?.length&&(t=t.filter(e=>{const t=e.namespace;return!t||n.namespaceWhitelist.includes(t)})),n.toolBlacklist?.length&&(t=t.filter(e=>!n.toolBlacklist.includes(e.name))),n.toolPredicate&&(t=t.filter(n.toolPredicate)),this.logger.debug(`Filtered tools: ${e.length} → ${t.length}`),t):t}buildSystemPrompt(){const e=[],t=this.config.signer.getAccountId().toString(),n=this.config.execution?.userAccountId;this.config.messaging?.systemPreamble&&e.push(this.config.messaging.systemPreamble),e.push(`You are a helpful Hedera assistant. Your primary operator account is ${t}. You have tools to interact with the Hedera network. When using any tool, provide all necessary parameters as defined by that tool's schema and description.`),n&&e.push(`The user you are assisting has a personal Hedera account ID: ${n}. IMPORTANT: When the user says things like "I want to send HBAR" or "transfer my tokens", you MUST use ${n} as the sender/from account. For example, if user says "I want to send 2 HBAR to 0.0.800", you must set up a transfer where ${n} sends the HBAR, not your operator account.`);return"autonomous"===(this.config.execution?.operationalMode||"returnBytes")?e.push(`\nOPERATIONAL MODE: 'autonomous'. Your goal is to execute transactions directly using your tools. Your account ${t} will be the payer for these transactions. Even if the user's account (${n||"a specified account"}) is the actor in the transaction body (e.g., sender of HBAR), you (the agent with operator ${t}) are still executing and paying. For HBAR transfers, ensure the amounts in the 'transfers' array sum to zero (as per tool schema), balancing with your operator account if necessary.`):this.config.execution?.scheduleUserTransactionsInBytesMode&&n?e.push(`\nOPERATIONAL MODE: 'returnBytes' with scheduled transactions for user actions. When a user asks for a transaction to be prepared (e.g., creating a token, topic, transferring assets for them to sign, etc), you MUST default to creating a Scheduled Transaction using the appropriate tool with the metaOption 'schedule: true'. The user (with account ID ${n}) will be the one to ultimately pay for and (if needed) sign the inner transaction. Your operator account (${t}) will pay for creating the schedule entity itself. You MUST return the ScheduleId and details of the scheduled operation in a structured JSON format with these fields: success, op, schedule_id, description, payer_account_id_scheduled_tx, and scheduled_transaction_details.`):e.push(`\nOPERATIONAL MODE: 'returnBytes'. Your goal is to provide transaction bytes directly. When a user asks for a transaction to be prepared (e.g., for them to sign, or for scheduling without the default scheduling flow), you MUST call the appropriate tool. If you want raw bytes for the user to sign for their own account ${n||"if specified"}, ensure the tool constructs the transaction body accordingly and use metaOption 'returnBytes: true' if available, or ensure the builder is configured for the user.`),!1!==this.config.messaging?.conciseMode&&e.push("\nAlways be concise. If the tool provides a JSON string as its primary output (especially in returnBytes mode), make your accompanying text brief. If the tool does not provide JSON output or an error occurs, your narrative becomes primary; if notes were generated by the tool in such cases, append them to your textual response."),this.config.messaging?.systemPostamble&&e.push(this.config.messaging.systemPostamble),e.join("\n")}isReady(){return this.initialized}}class T{constructor(e){this.clients=new Map,this.tools=new Map,this.logger=e}async connectServer(e){try{if(this.isServerConnected(e.name))return{serverName:e.name,connected:!1,error:`Server ${e.name} is already connected`,tools:[]};if(e.transport&&"stdio"!==e.transport)throw new Error(`Transport ${e.transport} not yet supported`);const t=new g.StdioClientTransport({command:e.command,args:e.args,...e.env&&{env:e.env}}),n=new l.Client({name:`conversational-agent-${e.name}`,version:"1.0.0"},{capabilities:{}});await n.connect(t),this.clients.set(e.name,n);const r=(await n.listTools()).tools.map(t=>({...t,serverName:e.name}));return this.tools.set(e.name,r),this.logger.info(`Connected to MCP server ${e.name} with ${r.length} tools`),{serverName:e.name,connected:!0,tools:r}}catch(t){return this.logger.error(`Failed to connect to MCP server ${e.name}:`,t),{serverName:e.name,connected:!1,error:t instanceof Error?t.message:"Unknown error",tools:[]}}}async executeTool(e,t,n){const r=this.clients.get(e);if(!r)throw new Error(`MCP server ${e} not connected`);this.logger.debug(`Executing MCP tool ${t} on server ${e}`,n);try{return await r.callTool({name:t,arguments:n})}catch(o){throw this.logger.error(`Error executing MCP tool ${t}:`,o),o}}async disconnectAll(){for(const[t,n]of this.clients)try{await n.close(),this.logger.info(`Disconnected from MCP server ${t}`)}catch(e){this.logger.error(`Error disconnecting MCP server ${t}:`,e)}this.clients.clear(),this.tools.clear()}getAllTools(){const e=[];for(const t of this.tools.values())e.push(...t);return e}getServerTools(e){return this.tools.get(e)||[]}isServerConnected(e){return this.clients.has(e)}getConnectedServers(){return Array.from(this.clients.keys())}}function C(e,t,n){const r=S(e.inputSchema),o=`${e.serverName}_${e.name}`.replace(/[^a-zA-Z0-9_]/g,"_");let i=e.description||`MCP tool ${e.name} from ${e.serverName}`;return n?.toolDescriptions?.[e.name]&&(i=`${i}\n\n${n.toolDescriptions[e.name]}`),n?.additionalContext&&(i=`${i}\n\nContext: ${n.additionalContext}`),new h.DynamicStructuredTool({name:o,description:i,schema:r,func:async n=>{try{const r=await t.executeTool(e.serverName,e.name,n);if("string"==typeof r)return r;if(r&&"object"==typeof r&&"content"in r){const e=r.content;if(Array.isArray(e)){return e.filter(e=>"object"==typeof e&&null!==e&&"type"in e&&"text"===e.type&&"text"in e).map(e=>e.text).join("\n")}return JSON.stringify(e)}return JSON.stringify(r)}catch(r){const t=r instanceof Error?r.message:"Unknown error";return`Error executing MCP tool ${e.name}: ${t}`}}})}function S(e){if(!e||"object"!=typeof e)return n.z.object({});const t=e;if(t.type&&"object"!==t.type)return A(t);if(!t.properties||"object"!=typeof t.properties)return n.z.object({});const r={};for(const[n,o]of Object.entries(t.properties)){let e=A(o);Array.isArray(t.required)&&t.required.includes(n)||(e=e.optional()),r[n]=e}return n.z.object(r)}function A(e){if(!e||"object"!=typeof e||!("type"in e))return n.z.unknown();const t=e;let r;switch(t.type){case"string":r=n.z.string(),t.enum&&Array.isArray(t.enum)&&(r=n.z.enum(t.enum));break;case"number":r=n.z.number(),"minimum"in t&&"number"==typeof t.minimum&&(r=r.min(t.minimum)),"maximum"in t&&"number"==typeof t.maximum&&(r=r.max(t.maximum));break;case"integer":r=n.z.number().int(),"minimum"in t&&"number"==typeof t.minimum&&(r=r.min(t.minimum)),"maximum"in t&&"number"==typeof t.maximum&&(r=r.max(t.maximum));break;case"boolean":r=n.z.boolean();break;case"array":r=t.items?n.z.array(A(t.items)):n.z.array(n.z.unknown());break;case"object":r="properties"in t?S(t):n.z.object({}).passthrough();break;default:r=n.z.unknown()}return"description"in t&&"string"==typeof t.description&&(r=r.describe(t.description)),r}class P extends v{constructor(){super(...arguments),this.systemMessage=""}async boot(){if(this.initialized)this.logger.warn("Agent already initialized");else try{this.agentKit=await this.createAgentKit(),await this.agentKit.initialize();const t=this.config.ai?.modelName||process.env.OPENAI_MODEL_NAME||"gpt-4o-mini";this.tokenTracker=new e.TokenUsageCallbackHandler(t);const n=this.agentKit.getAggregatedLangChainTools();this.tools=this.filterTools(n),this.config.mcp?.servers&&this.config.mcp.servers.length>0&&await this.initializeMCP(),this.systemMessage=this.buildSystemPrompt(),await this.createExecutor(),this.initialized=!0,this.logger.info("LangChain Hedera agent initialized")}catch(t){throw this.logger.error("Failed to initialize agent:",t),t}}async chat(t,n){if(!this.initialized||!this.executor)throw new Error("Agent not initialized. Call boot() first.");try{const o=await this.executor.invoke({input:t,chat_history:n?.messages||[]});let i={output:o.output||"",message:o.output||"",notes:[]};const s=o?.intermediateSteps?.[0]?.observation;if(s&&"string"==typeof s&&this.isJSON(s))try{const e=JSON.parse(s);i={...i,...e}}catch(r){this.logger.error("Error parsing intermediate steps:",r)}if(i.output&&""!==i.output.trim()||(i.output="Agent action complete."),this.tokenTracker){const t=this.tokenTracker.getLatestTokenUsage();t&&(i.tokenUsage=t,i.cost=e.calculateTokenCostSync(t))}return i}catch(r){return this.handleError(r)}}async shutdown(){this.mcpManager&&await this.mcpManager.disconnectAll(),this.executor=void 0,this.agentKit=void 0,this.tools=[],this.initialized=!1,this.logger.info("Agent cleaned up")}switchMode(e){this.config.execution?this.config.execution.operationalMode=e:this.config.execution={operationalMode:e},this.agentKit&&(this.agentKit.operationalMode=e),this.systemMessage=this.buildSystemPrompt(),this.logger.info(`Operational mode switched to: ${e}`)}getUsageStats(){if(!this.tokenTracker)return{promptTokens:0,completionTokens:0,totalTokens:0,cost:{totalCost:0}};const t=this.tokenTracker.getTotalTokenUsage(),n=e.calculateTokenCostSync(t);return{...t,cost:n}}getUsageLog(){return this.tokenTracker?this.tokenTracker.getTokenUsageHistory().map(t=>({...t,cost:e.calculateTokenCostSync(t)})):[]}clearUsageStats(){this.tokenTracker&&(this.tokenTracker.reset(),this.logger.info("Usage statistics cleared"))}async createAgentKit(){const t=[...e.getAllHederaCorePlugins(),...this.config.extensions?.plugins||[]],n=this.config.execution?.operationalMode||"returnBytes",r=this.config.ai?.modelName||"gpt-4o";return new e.HederaAgentKit(this.config.signer,{plugins:t},n,this.config.execution?.userAccountId,this.config.execution?.scheduleUserTransactionsInBytesMode??!0,void 0,r,this.config.extensions?.mirrorConfig,this.config.debug?.silent??!1)}async createExecutor(){let e;if(this.config.ai?.provider&&this.config.ai.provider.getModel)e=this.config.ai.provider.getModel();else if(this.config.ai?.llm)e=this.config.ai.llm;else{const t=this.config.ai?.apiKey||process.env.OPENAI_API_KEY;if(!t)throw new Error("OpenAI API key required");e=new c.ChatOpenAI({apiKey:t,modelName:this.config.ai?.modelName||"gpt-4o-mini",temperature:this.config.ai?.temperature??.1,callbacks:this.tokenTracker?[this.tokenTracker]:[]})}const t=a.ChatPromptTemplate.fromMessages([["system",this.systemMessage],new a.MessagesPlaceholder("chat_history"),["human","{input}"],new a.MessagesPlaceholder("agent_scratchpad")]),n=this.tools,r=await s.createOpenAIToolsAgent({llm:e,tools:n,prompt:t});this.executor=new s.AgentExecutor({agent:r,tools:n,verbose:this.config.debug?.verbose??!1,returnIntermediateSteps:!0})}handleError(t){const n=t instanceof Error?t.message:"Unknown error";let r,o;this.logger.error("Chat error:",t),this.tokenTracker&&(r=this.tokenTracker.getLatestTokenUsage(),r&&(o=e.calculateTokenCostSync(r)));const i={output:"Sorry, I encountered an error processing your request.",message:"Error processing request.",error:n,notes:[]};return r&&(i.tokenUsage=r),o&&(i.cost=o),i}async initializeMCP(){this.mcpManager=new T(this.logger);for(const e of this.config.mcp.servers){if(!1===e.autoConnect){this.logger.info(`Skipping MCP server ${e.name} (autoConnect=false)`);continue}const t=await this.mcpManager.connectServer(e);if(t.connected){this.logger.info(`Connected to MCP server ${t.serverName} with ${t.tools.length} tools`);for(const n of t.tools){const t=C(n,this.mcpManager,e);this.tools.push(t)}}else this.logger.error(`Failed to connect to MCP server ${t.serverName}: ${t.error}`)}}isJSON(e){if("string"!=typeof e)return!1;const t=e.trim();if(!t)return!1;if(!(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")))return!1;try{return JSON.parse(t),!0}catch{return!1}}}function k(e){const t=e.framework||"langchain";switch(t){case"langchain":return new P(e);case"vercel":throw new Error("Vercel AI SDK support coming soon");case"baml":throw new Error("BAML support coming soon");default:throw new Error(`Unknown framework: ${t}`)}}class M{constructor(e){this.model=e}async generate(e,t){const n=await this.model.invoke(e,t);return"string"==typeof n?n:n.toString()}async*stream(e,t){const n=await this.model.stream(e,t);for await(const r of n)yield"string"==typeof r?r:r.toString()}getModel(){return this.model}}const H=e=>`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: ${e} on the Hashgraph Online network\nWhen users ask about "my profile", "my account", "my connections", etc., use this account ID: ${e}\n\nRemember the connection numbers when listing connections, as users might refer to them.`,I="gpt-4o",B="testnet",z="autonomous";class K{constructor(e){this.options=e,this.stateManager=e.stateManager||new t.OpenConvaiState,this.hcs10Plugin=new d,this.hcs2Plugin=new m,this.inscribePlugin=new p,this.hbarTransferPlugin=new x,this.logger=new i.Logger({module:"ConversationalAgent",silent:e.disableLogging||!1})}async initialize(){const{accountId:t,privateKey:n,network:r=B,openAIApiKey:o,openAIModelName:i=I,verbose:s=!1,operationalMode:a=z,userAccountId:l,customSystemMessagePreamble:g,customSystemMessagePostamble:h,additionalPlugins:u=[],mirrorNodeConfig:d,disableLogging:m,scheduleUserTransactionsInBytesMode:p}=this.options;if(!t||!n)throw new Error("Account ID and private key are required");try{const f=await this.detectPrivateKeyType(t,n,r),y=new e.ServerSigner(t,f,r),w=[this.hcs10Plugin,this.hcs2Plugin,this.inscribePlugin,this.hbarTransferPlugin],b=e.getAllHederaCorePlugins();let x;if(this.options.enabledPlugins){const e=new Set(this.options.enabledPlugins);x=[...[...w,...b].filter(t=>e.has(t.id)),...u]}else x=[...w,...b,...u];const v=new c.ChatOpenAI({apiKey:o,modelName:i,temperature:.1});this.agent=k({framework:"langchain",signer:y,execution:{mode:"autonomous"===a?"direct":"bytes",operationalMode:a,...l&&{userAccountId:l},...void 0!==p&&{scheduleUserTransactions:p}},ai:{provider:new M(v),temperature:.1},filtering:{toolPredicate:e=>"hedera-account-transfer-hbar"!==e.name&&!(this.options.toolFilter&&!this.options.toolFilter(e))},messaging:{systemPreamble:g||H(t),...h&&{systemPostamble:h},conciseMode:!0},extensions:{plugins:x,...d&&{mirrorConfig:d}},...this.options.mcpServers&&{mcp:{servers:this.options.mcpServers,autoConnect:!0}},debug:{verbose:s,silent:m??!1}});const T=x.find(e=>"hcs-10"===e.id);T&&(T.appConfig={stateManager:this.stateManager}),await this.agent.boot()}catch(f){throw this.logger.error("Failed to initialize ConversationalAgent:",f),f}}getPlugin(){return this.hcs10Plugin}getStateManager(){return this.stateManager}getAgent(){if(!this.agent)throw new Error("Agent not initialized. Call initialize() first.");return this.agent}getConversationalAgent(){return this.getAgent()}async processMessage(e,t=[]){if(!this.agent)throw new Error("Agent not initialized. Call initialize() first.");const n={messages:t.map(e=>"human"===e.type?new u.HumanMessage(e.content):new u.AIMessage(e.content))};return this.agent.chat(e,n)}static withPlugins(e,t){return new K({...e,enabledPlugins:t})}static withHTS(e){return this.withPlugins(e,["hts-token"])}static withHCS2(e){return this.withPlugins(e,["hcs-2"])}static withHCS10(e){return this.withPlugins(e,["hcs-10"])}static withInscribe(e){return this.withPlugins(e,["inscribe"])}static withAccount(e){return this.withPlugins(e,["account"])}static withFileService(e){return this.withPlugins(e,["file-service"])}static withConsensusService(e){return this.withPlugins(e,["consensus-service"])}static withSmartContract(e){return this.withPlugins(e,["smart-contract"])}static withAllStandards(e){return this.withPlugins(e,["hcs-10","hcs-2","inscribe"])}static minimal(e){return this.withPlugins(e,[])}static withMCP(e,t){return new K({...e,mcpServers:t})}async detectPrivateKeyType(e,t,n){const o=new i.HederaMirrorNode(n),s=await o.requestAccount(e),a=s?.key?._type||"";return a?.toLowerCase()?.includes("ecdsa")?r.PrivateKey.fromStringECDSA(t):r.PrivateKey.fromStringED25519(t)}}exports.BaseAgent=v,exports.ConversationalAgent=K,exports.HCS10Plugin=d,exports.HCS2Plugin=m,exports.HbarTransferPlugin=x,exports.InscribePlugin=p,exports.LangChainAgent=P,exports.LangChainProvider=M,exports.MCPServers={filesystem:e=>({name:"filesystem",command:"npx",args:["-y","@modelcontextprotocol/server-filesystem",e],transport:"stdio",autoConnect:!0,additionalContext:"This server provides access to files and directories in the current working directory.",toolDescriptions:{list_directory:'Use this tool when users ask about files in the "current directory" or "working directory".',read_file:"Use this tool when users ask to see or check files in the current directory."}}),github:e=>({name:"github",command:"npx",args:["-y","@modelcontextprotocol/server-github"],...e&&{env:{GITHUB_TOKEN:e}},transport:"stdio",autoConnect:!0}),slack:e=>({name:"slack",command:"npx",args:["-y","@modelcontextprotocol/server-slack"],env:{SLACK_TOKEN:e},transport:"stdio",autoConnect:!0}),googleDrive:e=>({name:"google-drive",command:"npx",args:["-y","@modelcontextprotocol/server-google-drive"],env:{GOOGLE_CREDENTIALS:e},transport:"stdio",autoConnect:!0}),postgres:e=>({name:"postgres",command:"npx",args:["-y","@modelcontextprotocol/server-postgres",e],transport:"stdio",autoConnect:!0}),sqlite:e=>({name:"sqlite",command:"npx",args:["-y","@modelcontextprotocol/server-sqlite",e],transport:"stdio",autoConnect:!0}),custom:e=>e},exports.OpenConvAIPlugin=d,exports.createAgent=k,exports.createMCPConfig=function(e,t=!0){return{mcpServers:e.map(e=>({...e,autoConnect:e.autoConnect??t}))}},exports.validateServerConfig=function(e){const t=[];return e.name||t.push("Server name is required"),e.command||t.push("Server command is required"),e.args&&Array.isArray(e.args)||t.push("Server args must be an array"),e.transport&&!["stdio","http","websocket"].includes(e.transport)&&t.push("Invalid transport type. Must be stdio, http, or websocket"),t},Object.keys(e).forEach(t=>{"default"===t||Object.prototype.hasOwnProperty.call(exports,t)||Object.defineProperty(exports,t,{enumerable:!0,get:()=>e[t]})});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts","../../src/plugins/hcs-2/HCS2Plugin.ts","../../src/plugins/inscribe/InscribePlugin.ts","../../src/plugins/hbar-transfer/AccountBuilder.ts","../../src/plugins/hbar-transfer/TransferHbarTool.ts","../../src/plugins/hbar-transfer/HbarTransferPlugin.ts","../../src/base-agent.ts","../../src/mcp/MCPClientManager.ts","../../src/mcp/adapters/langchain.ts","../../src/langchain-agent.ts","../../src/agent-factory.ts","../../src/providers.ts","../../src/config/system-message.ts","../../src/conversational-agent.ts","../../src/mcp/helpers.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) || new OpenConvaiState();\n\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-10 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-10 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info(\n 'HCS-10 Plugin cleaned up'\n );\n }\n }\n}\n","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n HCS2Builder,\n CreateRegistryTool,\n RegisterEntryTool,\n UpdateEntryTool,\n DeleteEntryTool,\n MigrateRegistryTool,\n QueryRegistryTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing HCS-2 registry management tools\n */\nexport class HCS2Plugin extends BasePlugin {\n id = 'hcs-2';\n name = 'HCS-2 Plugin';\n description =\n 'HCS-2 registry management tools for decentralized registries on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs2';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-2 tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-2 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-2 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs2Builder = new HCS2Builder(hederaKit);\n\n this.tools = [\n new CreateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new RegisterEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new UpdateEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new DeleteEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new MigrateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new QueryRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.context?.logger) {\n this.context.logger.info('HCS-2 Plugin cleaned up');\n }\n }\n}","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n InscriberBuilder,\n InscribeFromUrlTool,\n InscribeFromFileTool,\n InscribeFromBufferTool,\n InscribeHashinalTool,\n RetrieveInscriptionTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing content inscription tools for Hedera\n */\nexport class InscribePlugin extends BasePlugin {\n id = 'inscribe';\n name = 'Inscribe Plugin';\n description =\n 'Content inscription tools for storing data on Hedera Consensus Service';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'inscribe';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. Inscription tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'Inscribe Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize Inscribe plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const inscriberBuilder = new InscriberBuilder(hederaKit);\n\n this.tools = [\n new InscribeFromUrlTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromFileTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromBufferTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeHashinalTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new RetrieveInscriptionTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.context?.logger) {\n this.context.logger.info('Inscribe Plugin cleaned up');\n }\n }\n}","import {\n AccountId,\n Hbar,\n TransferTransaction,\n} from '@hashgraph/sdk';\nimport BigNumber from 'bignumber.js';\nimport { HederaAgentKit, BaseServiceBuilder } from 'hedera-agent-kit';\nimport { HbarTransferParams } from './types';\n\n/**\n * Custom AccountBuilder that properly handles HBAR decimal conversion\n */\nexport class AccountBuilder extends BaseServiceBuilder {\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Transfers HBAR between accounts with proper decimal handling\n */\n public transferHbar(\n params: HbarTransferParams,\n isUserInitiated: boolean = true\n ): this {\n this.clearNotes();\n const transaction = new TransferTransaction();\n \n if (!params.transfers || params.transfers.length === 0) {\n throw new Error('HbarTransferParams must include at least one transfer.');\n }\n\n let netZeroInTinybars = new BigNumber(0);\n let userTransferProcessedForScheduling = false;\n\n if (\n isUserInitiated &&\n this.kit.userAccountId &&\n (this.kit.operationalMode as string) === 'provideBytes' &&\n params.transfers.length === 1\n ) {\n const receiverTransfer = params.transfers[0];\n const amountValue =\n typeof receiverTransfer.amount === 'string' ||\n typeof receiverTransfer.amount === 'number'\n ? receiverTransfer.amount\n : receiverTransfer.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n\n if (amountBigNum.isPositive()) {\n const recipientAccountId =\n typeof receiverTransfer.accountId === 'string'\n ? AccountId.fromString(receiverTransfer.accountId)\n : receiverTransfer.accountId;\n\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n\n this.logger.info(\n `[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${sdkHbarAmount.toString()} from ${\n this.kit.userAccountId\n } to ${recipientAccountId.toString()}`\n );\n \n this.addNote(\n `Configured HBAR transfer from your account (${\n this.kit.userAccountId\n }) to ${recipientAccountId.toString()} for ${sdkHbarAmount.toString()}.`\n );\n\n transaction.addHbarTransfer(recipientAccountId, sdkHbarAmount);\n transaction.addHbarTransfer(\n AccountId.fromString(this.kit.userAccountId),\n sdkHbarAmount.negated()\n );\n\n userTransferProcessedForScheduling = true;\n }\n }\n\n if (!userTransferProcessedForScheduling) {\n const processedTransfers: Array<{\n accountId: AccountId;\n amount: BigNumber;\n hbar: Hbar;\n }> = [];\n \n for (const transferInput of params.transfers) {\n const accountId =\n typeof transferInput.accountId === 'string'\n ? AccountId.fromString(transferInput.accountId)\n : transferInput.accountId;\n\n const amountValue =\n typeof transferInput.amount === 'string' ||\n typeof transferInput.amount === 'number'\n ? transferInput.amount\n : transferInput.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n \n this.logger.info(\n `Processing transfer: ${amountValue} HBAR (rounded to ${roundedAmount}) for account ${accountId.toString()}`\n );\n\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n processedTransfers.push({\n accountId,\n amount: amountBigNum,\n hbar: sdkHbarAmount\n });\n\n const tinybarsContribution = sdkHbarAmount.toTinybars();\n netZeroInTinybars = netZeroInTinybars.plus(\n tinybarsContribution.toString()\n );\n }\n\n if (!netZeroInTinybars.isZero()) {\n this.logger.warn(\n `Transfer sum not zero: ${netZeroInTinybars.toString()} tinybars off. Adjusting last transfer.`\n );\n \n if (processedTransfers.length > 0) {\n const lastTransfer = processedTransfers[processedTransfers.length - 1];\n const adjustment = netZeroInTinybars.dividedBy(-100000000);\n const adjustedAmount = lastTransfer.amount.plus(adjustment);\n const adjustedRounded = adjustedAmount.toFixed(8, BigNumber.ROUND_DOWN);\n lastTransfer.hbar = Hbar.fromString(adjustedRounded);\n \n this.logger.info(\n `Adjusted last transfer for ${lastTransfer.accountId.toString()} to ${adjustedRounded} HBAR`\n );\n }\n }\n \n for (const transfer of processedTransfers) {\n transaction.addHbarTransfer(transfer.accountId, transfer.hbar);\n }\n }\n\n if (typeof params.memo !== 'undefined') {\n if (params.memo === null) {\n this.logger.warn('Received null for memo in transferHbar.');\n } else {\n transaction.setTransactionMemo(params.memo);\n }\n }\n\n this.setCurrentTransaction(transaction);\n return this;\n }\n}","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}","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport { TransferHbarTool } from './TransferHbarTool';\n\nexport class HbarTransferPlugin extends BasePlugin {\n id = 'hbar-transfer';\n name = 'HBAR Transfer Plugin';\n description =\n 'HBAR transfer tool with proper decimal handling for multi-signature transactions';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'account';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HBAR transfer tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HBAR Transfer Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HBAR Transfer plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n this.tools = [\n new TransferHbarTool({\n hederaKit: hederaKit,\n logger: this.context.logger,\n }),\n ];\n }\n\n override getTools(): HederaTool[] {\n return this.tools;\n }\n\n async shutdown(): Promise<void> {\n this.tools = [];\n }\n}","import type { BaseMessage } from '@langchain/core/messages';\nimport type { StructuredTool } from '@langchain/core/tools';\nimport type { TransactionReceipt } from '@hashgraph/sdk';\nimport {\n HederaAgentKit,\n ServerSigner,\n TokenUsageCallbackHandler,\n TokenUsage,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport type { CostCalculation } from 'hedera-agent-kit';\nimport type { AIProvider, VercelAIProvider, BAMLProvider } from './providers';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { MCPServerConfig } from './mcp/types';\n\nexport interface ToolFilterConfig {\n namespaceWhitelist?: string[];\n toolBlacklist?: string[];\n toolPredicate?: (tool: StructuredTool) => boolean;\n}\n\nexport type ExecutionMode = 'direct' | 'bytes';\nexport type OperationalMode = 'autonomous' | 'returnBytes';\n\nexport interface HederaAgentConfiguration {\n signer: ServerSigner;\n execution?: {\n mode?: ExecutionMode;\n operationalMode?: OperationalMode;\n userAccountId?: string;\n scheduleUserTransactions?: boolean;\n scheduleUserTransactionsInBytesMode?: boolean;\n };\n ai?: {\n provider?: AIProvider;\n llm?: unknown;\n apiKey?: string;\n modelName?: string;\n temperature?: number;\n };\n filtering?: ToolFilterConfig;\n messaging?: {\n systemPreamble?: string;\n systemPostamble?: string;\n conciseMode?: boolean;\n };\n extensions?: {\n plugins?: BasePlugin[];\n mirrorConfig?: Record<string, unknown>;\n modelCapability?: string;\n };\n mcp?: {\n servers?: MCPServerConfig[];\n autoConnect?: boolean;\n };\n debug?: {\n verbose?: boolean;\n silent?: boolean;\n };\n}\n\nexport interface ConversationContext {\n messages: BaseMessage[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ChatResponse {\n output: string;\n message?: string;\n transactionBytes?: string;\n receipt?: TransactionReceipt | object;\n scheduleId?: string;\n transactionId?: string;\n notes?: string[];\n error?: string;\n intermediateSteps?: unknown;\n rawToolOutput?: unknown;\n tokenUsage?: TokenUsage;\n cost?: CostCalculation;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface UsageStats extends TokenUsage {\n cost: CostCalculation;\n}\n\nexport abstract class BaseAgent {\n protected logger: Logger;\n protected agentKit: HederaAgentKit | undefined;\n protected tools: StructuredTool[] = [];\n protected initialized = false;\n protected tokenTracker: TokenUsageCallbackHandler | undefined;\n\n constructor(protected config: HederaAgentConfiguration) {\n this.logger = new Logger({\n module: 'BaseAgent',\n silent: config.debug?.silent || false,\n });\n }\n\n abstract boot(): Promise<void>;\n abstract chat(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse>;\n abstract shutdown(): Promise<void>;\n abstract switchMode(mode: OperationalMode): void;\n abstract getUsageStats(): UsageStats;\n abstract getUsageLog(): UsageStats[];\n abstract clearUsageStats(): void;\n\n getCore(): HederaAgentKit | undefined {\n return this.agentKit;\n }\n\n protected filterTools(\n tools: StructuredTool[]\n ): StructuredTool[] {\n let filtered = [...tools];\n const filter = this.config.filtering;\n if (!filter) return filtered;\n\n if (filter.namespaceWhitelist?.length) {\n filtered = filtered.filter((tool) => {\n const namespace = (tool as StructuredTool & { namespace?: string })\n .namespace;\n return !namespace || filter.namespaceWhitelist!.includes(namespace);\n });\n }\n\n if (filter.toolBlacklist?.length) {\n filtered = filtered.filter(\n (tool) => !filter.toolBlacklist!.includes(tool.name)\n );\n }\n\n if (filter.toolPredicate) {\n filtered = filtered.filter(filter.toolPredicate);\n }\n\n this.logger.debug(`Filtered tools: ${tools.length} → ${filtered.length}`);\n return filtered;\n }\n\n protected buildSystemPrompt(): string {\n const parts: string[] = [];\n const operatorId = this.config.signer.getAccountId().toString();\n const userAccId = this.config.execution?.userAccountId;\n\n if (this.config.messaging?.systemPreamble) {\n parts.push(this.config.messaging.systemPreamble);\n }\n\n parts.push(\n `You are a helpful Hedera assistant. Your primary operator account is ${operatorId}. ` +\n `You have tools to interact with the Hedera network. ` +\n `When using any tool, provide all necessary parameters as defined by that tool's schema and description.`\n );\n\n if (userAccId) {\n parts.push(\n `The user you are assisting has a personal Hedera account ID: ${userAccId}. ` +\n `IMPORTANT: When the user says things like \"I want to send HBAR\" or \"transfer my tokens\", you MUST use ${userAccId} as the sender/from account. ` +\n `For example, if user says \"I want to send 2 HBAR to 0.0.800\", you must set up a transfer where ${userAccId} sends the HBAR, not your operator account.`\n );\n }\n\n const operationalMode =\n this.config.execution?.operationalMode || 'returnBytes';\n if (operationalMode === 'autonomous') {\n parts.push(\n `\\nOPERATIONAL MODE: 'autonomous'. Your goal is to execute transactions directly using your tools. ` +\n `Your account ${operatorId} will be the payer for these transactions. ` +\n `Even if the user's account (${\n userAccId || 'a specified account'\n }) is the actor in the transaction body (e.g., sender of HBAR), ` +\n `you (the agent with operator ${operatorId}) are still executing and paying. For HBAR transfers, ensure the amounts in the 'transfers' array sum to zero (as per tool schema), balancing with your operator account if necessary.`\n );\n } else {\n if (\n this.config.execution?.scheduleUserTransactionsInBytesMode &&\n userAccId\n ) {\n parts.push(\n `\\nOPERATIONAL MODE: 'returnBytes' with scheduled transactions for user actions. ` +\n `When a user asks for a transaction to be prepared (e.g., creating a token, topic, transferring assets for them to sign, etc), ` +\n `you MUST default to creating a Scheduled Transaction using the appropriate tool with the metaOption 'schedule: true'. ` +\n `The user (with account ID ${userAccId}) will be the one to ultimately pay for and (if needed) sign the inner transaction. ` +\n `Your operator account (${operatorId}) will pay for creating the schedule entity itself. ` +\n `You MUST return the ScheduleId and details of the scheduled operation in a structured JSON format with these fields: success, op, schedule_id, description, payer_account_id_scheduled_tx, and scheduled_transaction_details.`\n );\n } else {\n parts.push(\n `\\nOPERATIONAL MODE: 'returnBytes'. Your goal is to provide transaction bytes directly. ` +\n `When a user asks for a transaction to be prepared (e.g., for them to sign, or for scheduling without the default scheduling flow), ` +\n `you MUST call the appropriate tool. If you want raw bytes for the user to sign for their own account ${\n userAccId || 'if specified'\n }, ensure the tool constructs the transaction body accordingly and use metaOption 'returnBytes: true' if available, or ensure the builder is configured for the user.`\n );\n }\n }\n\n if (this.config.messaging?.conciseMode !== false) {\n parts.push(\n '\\nAlways be concise. If the tool provides a JSON string as its primary output (especially in returnBytes mode), make your accompanying text brief. If the tool does not provide JSON output or an error occurs, your narrative becomes primary; if notes were generated by the tool in such cases, append them to your textual response.'\n );\n }\n\n if (this.config.messaging?.systemPostamble) {\n parts.push(this.config.messaging.systemPostamble);\n }\n\n return parts.join('\\n');\n }\n\n isReady(): boolean {\n return this.initialized;\n }\n}\n\nexport type { AIProvider, VercelAIProvider, BAMLProvider };\n","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}","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","import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { StructuredTool } from '@langchain/core/tools';\nimport { createOpenAIToolsAgent, AgentExecutor } from 'langchain/agents';\nimport {\n ChatPromptTemplate,\n MessagesPlaceholder,\n} from '@langchain/core/prompts';\nimport { ChatOpenAI } from '@langchain/openai';\nimport {\n calculateTokenCostSync,\n getAllHederaCorePlugins,\n HederaAgentKit,\n TokenUsageCallbackHandler,\n} from 'hedera-agent-kit';\nimport type { TokenUsage, CostCalculation } from 'hedera-agent-kit';\nimport {\n BaseAgent,\n type ConversationContext,\n type ChatResponse,\n type OperationalMode,\n type UsageStats,\n} from './base-agent';\nimport { MCPClientManager } from './mcp/MCPClientManager';\nimport { convertMCPToolToLangChain } from './mcp/adapters/langchain';\n\nexport class LangChainAgent extends BaseAgent {\n private executor: AgentExecutor | undefined;\n private systemMessage = '';\n private mcpManager?: MCPClientManager;\n\n async boot(): Promise<void> {\n if (this.initialized) {\n this.logger.warn('Agent already initialized');\n return;\n }\n\n try {\n this.agentKit = await this.createAgentKit();\n await this.agentKit.initialize();\n\n const modelName =\n this.config.ai?.modelName ||\n process.env.OPENAI_MODEL_NAME ||\n 'gpt-4o-mini';\n this.tokenTracker = new TokenUsageCallbackHandler(modelName);\n\n const allTools = this.agentKit.getAggregatedLangChainTools();\n this.tools = this.filterTools(allTools);\n\n if (this.config.mcp?.servers && this.config.mcp.servers.length > 0) {\n await this.initializeMCP();\n }\n\n this.systemMessage = this.buildSystemPrompt();\n\n await this.createExecutor();\n\n this.initialized = true;\n this.logger.info('LangChain Hedera agent initialized');\n } catch (error) {\n this.logger.error('Failed to initialize agent:', error);\n throw error;\n }\n }\n\n async chat(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse> {\n if (!this.initialized || !this.executor) {\n throw new Error('Agent not initialized. Call boot() first.');\n }\n\n try {\n const result = await this.executor.invoke({\n input: message,\n chat_history: context?.messages || [],\n });\n\n let response: ChatResponse = {\n output: result.output || '',\n message: result.output || '',\n notes: [],\n };\n\n const parsedSteps = result?.intermediateSteps?.[0]?.observation;\n if (\n parsedSteps &&\n typeof parsedSteps === 'string' &&\n this.isJSON(parsedSteps)\n ) {\n try {\n const parsed = JSON.parse(parsedSteps);\n response = { ...response, ...parsed };\n } catch (error) {\n this.logger.error('Error parsing intermediate steps:', error);\n }\n }\n\n if (!response.output || response.output.trim() === '') {\n response.output = 'Agent action complete.';\n }\n\n if (this.tokenTracker) {\n const tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n response.tokenUsage = tokenUsage;\n response.cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n return response;\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.mcpManager) {\n await this.mcpManager.disconnectAll();\n }\n\n this.executor = undefined;\n this.agentKit = undefined;\n this.tools = [];\n this.initialized = false;\n this.logger.info('Agent cleaned up');\n }\n\n switchMode(mode: OperationalMode): void {\n if (this.config.execution) {\n this.config.execution.operationalMode = mode;\n } else {\n this.config.execution = { operationalMode: mode };\n }\n\n if (this.agentKit) {\n this.agentKit.operationalMode = mode;\n }\n\n this.systemMessage = this.buildSystemPrompt();\n this.logger.info(`Operational mode switched to: ${mode}`);\n }\n\n getUsageStats(): UsageStats {\n if (!this.tokenTracker) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: { totalCost: 0 } as CostCalculation,\n };\n }\n\n const usage = this.tokenTracker.getTotalTokenUsage();\n const cost = calculateTokenCostSync(usage);\n return { ...usage, cost };\n }\n\n getUsageLog(): UsageStats[] {\n if (!this.tokenTracker) {\n return [];\n }\n\n return this.tokenTracker.getTokenUsageHistory().map((usage) => ({\n ...usage,\n cost: calculateTokenCostSync(usage),\n }));\n }\n\n clearUsageStats(): void {\n if (this.tokenTracker) {\n this.tokenTracker.reset();\n this.logger.info('Usage statistics cleared');\n }\n }\n\n private async createAgentKit(): Promise<HederaAgentKit> {\n const corePlugins = getAllHederaCorePlugins();\n const extensionPlugins = this.config.extensions?.plugins || [];\n const plugins = [...corePlugins, ...extensionPlugins];\n\n const operationalMode =\n this.config.execution?.operationalMode || 'returnBytes';\n const modelName = this.config.ai?.modelName || 'gpt-4o';\n\n return new HederaAgentKit(\n this.config.signer,\n { plugins },\n operationalMode,\n this.config.execution?.userAccountId,\n this.config.execution?.scheduleUserTransactionsInBytesMode ?? true,\n undefined,\n modelName,\n this.config.extensions?.mirrorConfig,\n this.config.debug?.silent ?? false\n );\n }\n\n private async createExecutor(): Promise<void> {\n let llm: BaseChatModel;\n if (this.config.ai?.provider && this.config.ai.provider.getModel) {\n llm = this.config.ai.provider.getModel() as BaseChatModel;\n } else if (this.config.ai?.llm) {\n llm = this.config.ai.llm as BaseChatModel;\n } else {\n const apiKey = this.config.ai?.apiKey || process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key required');\n }\n\n llm = new ChatOpenAI({\n apiKey,\n modelName: this.config.ai?.modelName || 'gpt-4o-mini',\n temperature: this.config.ai?.temperature ?? 0.1,\n callbacks: this.tokenTracker ? [this.tokenTracker] : [],\n });\n }\n\n const prompt = ChatPromptTemplate.fromMessages([\n ['system', this.systemMessage],\n new MessagesPlaceholder('chat_history'),\n ['human', '{input}'],\n new MessagesPlaceholder('agent_scratchpad'),\n ]);\n\n const langchainTools = this.tools as unknown as StructuredTool[];\n\n const agent = await createOpenAIToolsAgent({\n llm,\n tools: langchainTools,\n prompt,\n });\n\n this.executor = new AgentExecutor({\n agent,\n tools: langchainTools,\n verbose: this.config.debug?.verbose ?? false,\n returnIntermediateSteps: true,\n });\n }\n\n private handleError(error: unknown): ChatResponse {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n this.logger.error('Chat error:', error);\n\n let tokenUsage: TokenUsage | undefined;\n let cost: CostCalculation | undefined;\n\n if (this.tokenTracker) {\n tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n const errorResponse: ChatResponse = {\n output: 'Sorry, I encountered an error processing your request.',\n message: 'Error processing request.',\n error: errorMessage,\n notes: [],\n };\n\n if (tokenUsage) {\n errorResponse.tokenUsage = tokenUsage;\n }\n\n if (cost) {\n errorResponse.cost = cost;\n }\n\n return errorResponse;\n }\n\n private async initializeMCP(): Promise<void> {\n this.mcpManager = new MCPClientManager(this.logger);\n\n for (const serverConfig of this.config.mcp!.servers!) {\n if (serverConfig.autoConnect === false) {\n this.logger.info(\n `Skipping MCP server ${serverConfig.name} (autoConnect=false)`\n );\n continue;\n }\n\n const status = await this.mcpManager.connectServer(serverConfig);\n\n if (status.connected) {\n this.logger.info(\n `Connected to MCP server ${status.serverName} with ${status.tools.length} tools`\n );\n\n for (const mcpTool of status.tools) {\n const langchainTool = convertMCPToolToLangChain(\n mcpTool,\n this.mcpManager,\n serverConfig\n );\n this.tools.push(langchainTool);\n }\n } else {\n this.logger.error(\n `Failed to connect to MCP server ${status.serverName}: ${status.error}`\n );\n }\n }\n }\n\n /**\n * Check if a string is valid JSON\n */\n private isJSON(str: string): boolean {\n if (typeof str !== 'string') return false;\n\n const trimmed = str.trim();\n if (!trimmed) return false;\n\n if (\n !(trimmed.startsWith('{') && trimmed.endsWith('}')) &&\n !(trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { BaseAgent, type HederaAgentConfiguration } from './base-agent';\nimport { LangChainAgent } from './langchain-agent';\n\nexport function createAgent(\n config: HederaAgentConfiguration & {\n framework?: 'langchain' | 'vercel' | 'baml';\n }\n): BaseAgent {\n const framework = config.framework || 'langchain';\n\n switch (framework) {\n case 'langchain':\n return new LangChainAgent(config);\n case 'vercel':\n throw new Error('Vercel AI SDK support coming soon');\n case 'baml':\n throw new Error('BAML support coming soon');\n default:\n throw new Error(`Unknown framework: ${framework}`);\n }\n}","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}","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.`","import {\n ServerSigner,\n getAllHederaCorePlugins,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport {\n HederaMirrorNode,\n Logger,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\nimport { createAgent } from './agent-factory';\nimport { LangChainProvider } from './providers';\nimport type { ChatResponse, ConversationContext } from './base-agent';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { HumanMessage, AIMessage } from '@langchain/core/messages';\nimport type { AgentOperationalMode, MirrorNodeConfig } from 'hedera-agent-kit';\nimport { HCS10Plugin } from './plugins/hcs-10/HCS10Plugin';\nimport { HCS2Plugin } from './plugins/hcs-2/HCS2Plugin';\nimport { InscribePlugin } from './plugins/inscribe/InscribePlugin';\nimport { HbarTransferPlugin } from './plugins/hbar-transfer/HbarTransferPlugin';\nimport { OpenConvaiState } from '@hashgraphonline/standards-agent-kit';\nimport type { IStateManager } from '@hashgraphonline/standards-agent-kit';\nimport { PrivateKey } from '@hashgraph/sdk';\nimport { getSystemMessage } from './config/system-message';\nimport type { MCPServerConfig } from './mcp/types';\n\nconst DEFAULT_MODEL_NAME = 'gpt-4o';\nconst DEFAULT_TEMPERATURE = 0.1;\nconst DEFAULT_NETWORK = 'testnet';\nconst DEFAULT_OPERATIONAL_MODE: AgentOperationalMode = 'autonomous';\n\nexport interface ConversationalAgentOptions {\n accountId: string;\n privateKey: string;\n network?: NetworkType;\n openAIApiKey: string;\n openAIModelName?: string;\n verbose?: boolean;\n operationalMode?: AgentOperationalMode;\n userAccountId?: string;\n customSystemMessagePreamble?: string;\n customSystemMessagePostamble?: string;\n additionalPlugins?: BasePlugin[];\n stateManager?: IStateManager;\n scheduleUserTransactionsInBytesMode?: boolean;\n mirrorNodeConfig?: MirrorNodeConfig;\n disableLogging?: boolean;\n enabledPlugins?: string[];\n toolFilter?: (tool: { name: string; namespace?: string }) => boolean;\n mcpServers?: MCPServerConfig[];\n}\n\n/**\n * The ConversationalAgent class is an optional wrapper around the HederaConversationalAgent class,\n * which includes the OpenConvAIPlugin and the OpenConvaiState by default.\n * If you want to use a different plugin or state manager, you can pass them in the options.\n * This class is not required and the plugin can be used directly with the HederaConversationalAgent class.\n *\n * @param options - The options for the ConversationalAgent.\n * @returns A new instance of the ConversationalAgent class.\n */\nexport class ConversationalAgent {\n private agent?: ReturnType<typeof createAgent>;\n public hcs10Plugin: HCS10Plugin;\n public hcs2Plugin: HCS2Plugin;\n public inscribePlugin: InscribePlugin;\n public hbarTransferPlugin: HbarTransferPlugin;\n public stateManager: IStateManager;\n private options: ConversationalAgentOptions;\n private logger: Logger;\n\n constructor(options: ConversationalAgentOptions) {\n this.options = options;\n this.stateManager = options.stateManager || new OpenConvaiState();\n this.hcs10Plugin = new HCS10Plugin();\n this.hcs2Plugin = new HCS2Plugin();\n this.inscribePlugin = new InscribePlugin();\n this.hbarTransferPlugin = new HbarTransferPlugin();\n this.logger = new Logger({\n module: 'ConversationalAgent',\n silent: options.disableLogging || false,\n });\n }\n\n /**\n * Initialize the conversational agent with Hedera network connection and AI configuration\n * @throws {Error} If account ID or private key is missing\n * @throws {Error} If initialization fails\n */\n async initialize(): Promise<void> {\n const {\n accountId,\n privateKey,\n network = DEFAULT_NETWORK,\n openAIApiKey,\n openAIModelName = DEFAULT_MODEL_NAME,\n verbose = false,\n operationalMode = DEFAULT_OPERATIONAL_MODE,\n userAccountId,\n customSystemMessagePreamble,\n customSystemMessagePostamble,\n additionalPlugins = [],\n mirrorNodeConfig,\n disableLogging,\n scheduleUserTransactionsInBytesMode,\n } = this.options;\n\n if (!accountId || !privateKey) {\n throw new Error('Account ID and private key are required');\n }\n\n try {\n const privateKeyInstance = await this.detectPrivateKeyType(\n accountId,\n privateKey,\n network\n );\n\n const serverSigner = new ServerSigner(\n accountId,\n privateKeyInstance,\n network as 'testnet' | 'mainnet' | 'previewnet'\n );\n\n const standardPlugins = [\n this.hcs10Plugin,\n this.hcs2Plugin,\n this.inscribePlugin,\n this.hbarTransferPlugin,\n ];\n\n const corePlugins = getAllHederaCorePlugins();\n\n let allPlugins: BasePlugin[];\n\n if (this.options.enabledPlugins) {\n const enabledSet = new Set(this.options.enabledPlugins);\n const filteredPlugins = [...standardPlugins, ...corePlugins].filter(\n (plugin) => enabledSet.has(plugin.id)\n );\n allPlugins = [...filteredPlugins, ...additionalPlugins];\n } else {\n allPlugins = [...standardPlugins, ...corePlugins, ...additionalPlugins];\n }\n\n const llm = new ChatOpenAI({\n apiKey: openAIApiKey,\n modelName: openAIModelName,\n temperature: DEFAULT_TEMPERATURE,\n });\n\n this.agent = createAgent({\n framework: 'langchain',\n signer: serverSigner,\n execution: {\n mode: operationalMode === 'autonomous' ? 'direct' : 'bytes',\n operationalMode: operationalMode,\n ...(userAccountId && { userAccountId }),\n ...(scheduleUserTransactionsInBytesMode !== undefined && {\n scheduleUserTransactions: scheduleUserTransactionsInBytesMode,\n }),\n },\n ai: {\n provider: new LangChainProvider(llm),\n temperature: DEFAULT_TEMPERATURE,\n },\n filtering: {\n toolPredicate: (tool) => {\n if (tool.name === 'hedera-account-transfer-hbar') return false;\n if (this.options.toolFilter && !this.options.toolFilter(tool)) {\n return false;\n }\n return true;\n },\n },\n messaging: {\n systemPreamble:\n customSystemMessagePreamble || getSystemMessage(accountId),\n ...(customSystemMessagePostamble && { systemPostamble: customSystemMessagePostamble }),\n conciseMode: true,\n },\n extensions: {\n plugins: allPlugins,\n ...(mirrorNodeConfig && {\n mirrorConfig: mirrorNodeConfig as Record<string, unknown>,\n }),\n },\n ...(this.options.mcpServers && {\n mcp: {\n servers: this.options.mcpServers,\n autoConnect: true,\n },\n }),\n debug: {\n verbose,\n silent: disableLogging ?? false,\n },\n });\n\n const hcs10 = allPlugins.find((p) => p.id === 'hcs-10');\n if (hcs10) {\n (hcs10 as { appConfig?: Record<string, unknown> }).appConfig = {\n stateManager: this.stateManager,\n };\n }\n\n await this.agent.boot();\n } catch (error) {\n this.logger.error('Failed to initialize ConversationalAgent:', error);\n throw error;\n }\n }\n\n /**\n * Get the HCS-10 plugin instance\n * @returns {HCS10Plugin} The HCS-10 plugin instance\n */\n getPlugin(): HCS10Plugin {\n return this.hcs10Plugin;\n }\n\n /**\n * Get the state manager instance\n * @returns {IStateManager} The state manager instance\n */\n getStateManager(): IStateManager {\n return this.stateManager;\n }\n\n /**\n * Get the underlying agent instance\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getAgent(): ReturnType<typeof createAgent> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n return this.agent;\n }\n\n /**\n * Get the conversational agent instance (alias for getAgent)\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getConversationalAgent(): ReturnType<typeof createAgent> {\n return this.getAgent();\n }\n\n /**\n * Process a message through the conversational agent\n * @param {string} message - The message to process\n * @param {Array<{type: 'human' | 'ai'; content: string}>} chatHistory - Previous chat history\n * @returns {Promise<ChatResponse>} The agent's response\n * @throws {Error} If agent is not initialized\n */\n async processMessage(\n message: string,\n chatHistory: {\n type: 'human' | 'ai';\n content: string;\n }[] = []\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n\n const messages = chatHistory.map((msg) =>\n msg.type === 'human'\n ? new HumanMessage(msg.content)\n : new AIMessage(msg.content)\n );\n\n const context: ConversationContext = {\n messages,\n };\n\n return this.agent.chat(message, context);\n }\n\n /**\n * Create a ConversationalAgent with specific plugins enabled\n */\n private static withPlugins(\n options: ConversationalAgentOptions,\n plugins: string[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: plugins,\n });\n }\n\n /**\n * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled\n */\n static withHTS(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hts-token']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-2 tools enabled\n */\n static withHCS2(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-2']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-10 tools enabled\n */\n static withHCS10(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10']);\n }\n\n /**\n * Create a ConversationalAgent with only inscription tools enabled\n */\n static withInscribe(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with only account management tools enabled\n */\n static withAccount(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['account']);\n }\n\n /**\n * Create a ConversationalAgent with only file service tools enabled\n */\n static withFileService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['file-service']);\n }\n\n /**\n * Create a ConversationalAgent with only consensus service tools enabled\n */\n static withConsensusService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['consensus-service']);\n }\n\n /**\n * Create a ConversationalAgent with only smart contract tools enabled\n */\n static withSmartContract(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['smart-contract']);\n }\n\n /**\n * Create a ConversationalAgent with all HCS standards plugins\n */\n static withAllStandards(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10', 'hcs-2', 'inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)\n */\n static minimal(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, []);\n }\n\n /**\n * Create a ConversationalAgent with MCP servers configured\n */\n static withMCP(\n options: ConversationalAgentOptions,\n mcpServers: MCPServerConfig[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n mcpServers,\n });\n }\n\n /**\n * Detect the private key type by querying the account info from mirror node\n * @param {string} accountId - The Hedera account ID\n * @param {string} privateKey - The private key string\n * @param {NetworkType} network - The Hedera network\n * @returns {Promise<PrivateKey>} The appropriate PrivateKey instance\n */\n private async detectPrivateKeyType(\n accountId: string,\n privateKey: string,\n network: NetworkType\n ): Promise<PrivateKey> {\n const mirrorNode = new HederaMirrorNode(network as 'testnet' | 'mainnet');\n const accountInfo = await mirrorNode.requestAccount(accountId);\n\n const keyType = accountInfo?.key?._type || '';\n\n if (keyType?.toLowerCase()?.includes('ecdsa')) {\n return PrivateKey.fromStringECDSA(privateKey);\n } else {\n return PrivateKey.fromStringED25519(privateKey);\n }\n }\n}\n","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":["HCS10Plugin","BasePlugin","constructor","super","arguments","this","id","name","description","version","author","namespace","tools","initialize","context","config","hederaKit","stateManager","OpenConvaiState","initializeTools","logger","info","error","warn","Error","hcs10Builder","HCS10Builder","RegisterAgentTool","FindRegistrationsTool","RetrieveProfileTool","InitiateConnectionTool","ListConnectionsTool","SendMessageToConnectionTool","CheckMessagesTool","ConnectionMonitorTool","ManageConnectionRequestsTool","AcceptConnectionRequestTool","ListUnapprovedConnectionRequestsTool","getTools","getStateManager","cleanup","HCS2Plugin","hcs2Builder","HCS2Builder","CreateRegistryTool","RegisterEntryTool","UpdateEntryTool","DeleteEntryTool","MigrateRegistryTool","QueryRegistryTool","InscribePlugin","inscriberBuilder","InscriberBuilder","InscribeFromUrlTool","InscribeFromFileTool","InscribeFromBufferTool","InscribeHashinalTool","RetrieveInscriptionTool","AccountBuilder","BaseServiceBuilder","transferHbar","params","isUserInitiated","clearNotes","transaction","TransferTransaction","transfers","length","netZeroInTinybars","BigNumber","userTransferProcessedForScheduling","kit","userAccountId","operationalMode","receiverTransfer","amountValue","amount","toString","amountBigNum","isPositive","recipientAccountId","accountId","AccountId","fromString","roundedAmount","toFixed","ROUND_DOWN","sdkHbarAmount","Hbar","addNote","addHbarTransfer","negated","processedTransfers","transferInput","push","hbar","tinybarsContribution","toTinybars","plus","isZero","lastTransfer","adjustment","dividedBy","adjustedRounded","transfer","memo","setTransactionMemo","setCurrentTransaction","HbarTransferInputSchema","z","object","string","describe","union","number","TransferHbarZodSchemaCore","array","min","optional","TransferHbarTool","BaseHederaTransactionTool","specificInputSchema","getServiceBuilder","callBuilderMethod","builder","specificArgs","HbarTransferPlugin","shutdown","BaseAgent","initialized","Logger","module","silent","debug","getCore","agentKit","filterTools","filtered","filter","filtering","namespaceWhitelist","tool","includes","toolBlacklist","toolPredicate","buildSystemPrompt","parts","operatorId","signer","getAccountId","userAccId","execution","messaging","systemPreamble","scheduleUserTransactionsInBytesMode","conciseMode","systemPostamble","join","isReady","MCPClientManager","clients","Map","connectServer","isServerConnected","serverName","connected","transport","StdioClientTransport","command","args","env","client","Client","capabilities","connect","set","toolsWithServer","listTools","map","message","executeTool","toolName","get","callTool","disconnectAll","close","clear","getAllTools","allTools","values","getServerTools","has","getConnectedServers","Array","from","keys","convertMCPToolToLangChain","mcpManager","serverConfig","zodSchema","jsonSchemaToZod","inputSchema","sanitizedName","replace","toolDescriptions","additionalContext","DynamicStructuredTool","schema","func","async","input","result","content","isArray","item","type","text","JSON","stringify","errorMessage","schemaObj","convertType","properties","shape","key","value","Object","entries","zodType","required","unknown","enum","minimum","maximum","max","int","boolean","items","passthrough","LangChainAgent","systemMessage","boot","createAgentKit","modelName","ai","process","OPENAI_MODEL_NAME","tokenTracker","TokenUsageCallbackHandler","getAggregatedLangChainTools","mcp","servers","initializeMCP","createExecutor","chat","executor","invoke","chat_history","messages","response","output","notes","parsedSteps","intermediateSteps","observation","isJSON","parsed","parse","trim","tokenUsage","getLatestTokenUsage","cost","calculateTokenCostSync","handleError","switchMode","mode","getUsageStats","promptTokens","completionTokens","totalTokens","totalCost","usage","getTotalTokenUsage","getUsageLog","getTokenUsageHistory","clearUsageStats","reset","plugins","getAllHederaCorePlugins","extensions","HederaAgentKit","mirrorConfig","llm","provider","getModel","apiKey","OPENAI_API_KEY","ChatOpenAI","temperature","callbacks","prompt","ChatPromptTemplate","fromMessages","MessagesPlaceholder","langchainTools","agent","createOpenAIToolsAgent","AgentExecutor","verbose","returnIntermediateSteps","errorResponse","autoConnect","status","mcpTool","langchainTool","str","trimmed","startsWith","endsWith","createAgent","framework","LangChainProvider","model","generate","options","stream","chunk","getSystemMessage","DEFAULT_MODEL_NAME","DEFAULT_NETWORK","DEFAULT_OPERATIONAL_MODE","ConversationalAgent","hcs10Plugin","hcs2Plugin","inscribePlugin","hbarTransferPlugin","disableLogging","privateKey","network","openAIApiKey","openAIModelName","customSystemMessagePreamble","customSystemMessagePostamble","additionalPlugins","mirrorNodeConfig","privateKeyInstance","detectPrivateKeyType","serverSigner","ServerSigner","standardPlugins","corePlugins","allPlugins","enabledPlugins","enabledSet","Set","plugin","scheduleUserTransactions","toolFilter","mcpServers","hcs10","find","p","appConfig","getPlugin","getAgent","getConversationalAgent","processMessage","chatHistory","msg","HumanMessage","AIMessage","withPlugins","withHTS","withHCS2","withHCS10","withInscribe","withAccount","withFileService","withConsensusService","withSmartContract","withAllStandards","minimal","withMCP","mirrorNode","HederaMirrorNode","accountInfo","requestAccount","keyType","_type","toLowerCase","PrivateKey","fromStringECDSA","fromStringED25519","filesystem","path","list_directory","read_file","github","token","GITHUB_TOKEN","slack","SLACK_TOKEN","googleDrive","credentials","GOOGLE_CREDENTIALS","postgres","connectionString","sqlite","dbPath","custom","server","errors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts","../../src/plugins/hcs-2/HCS2Plugin.ts","../../src/plugins/inscribe/InscribePlugin.ts","../../src/plugins/hbar-transfer/AccountBuilder.ts","../../src/plugins/hbar-transfer/TransferHbarTool.ts","../../src/plugins/hbar-transfer/HbarTransferPlugin.ts","../../src/base-agent.ts","../../src/mcp/MCPClientManager.ts","../../src/mcp/adapters/langchain.ts","../../src/langchain-agent.ts","../../src/agent-factory.ts","../../src/providers.ts","../../src/config/system-message.ts","../../src/conversational-agent.ts","../../src/mcp/helpers.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) || \n (context.config.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-10 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-10 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info(\n 'HCS-10 Plugin cleaned up'\n );\n }\n }\n}\n","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n HCS2Builder,\n CreateRegistryTool,\n RegisterEntryTool,\n UpdateEntryTool,\n DeleteEntryTool,\n MigrateRegistryTool,\n QueryRegistryTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing HCS-2 registry management tools\n */\nexport class HCS2Plugin extends BasePlugin {\n id = 'hcs-2';\n name = 'HCS-2 Plugin';\n description =\n 'HCS-2 registry management tools for decentralized registries on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs2';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-2 tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-2 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-2 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs2Builder = new HCS2Builder(hederaKit);\n\n this.tools = [\n new CreateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new RegisterEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new UpdateEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new DeleteEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new MigrateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new QueryRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.context?.logger) {\n this.context.logger.info('HCS-2 Plugin cleaned up');\n }\n }\n}","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n InscriberBuilder,\n InscribeFromUrlTool,\n InscribeFromFileTool,\n InscribeFromBufferTool,\n InscribeHashinalTool,\n RetrieveInscriptionTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing content inscription tools for Hedera\n */\nexport class InscribePlugin extends BasePlugin {\n id = 'inscribe';\n name = 'Inscribe Plugin';\n description =\n 'Content inscription tools for storing data on Hedera Consensus Service';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'inscribe';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. Inscription tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'Inscribe Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize Inscribe plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const inscriberBuilder = new InscriberBuilder(hederaKit);\n\n this.tools = [\n new InscribeFromUrlTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromFileTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromBufferTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeHashinalTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new RetrieveInscriptionTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.context?.logger) {\n this.context.logger.info('Inscribe Plugin cleaned up');\n }\n }\n}","import {\n AccountId,\n Hbar,\n TransferTransaction,\n} from '@hashgraph/sdk';\nimport BigNumber from 'bignumber.js';\nimport { HederaAgentKit, BaseServiceBuilder } from 'hedera-agent-kit';\nimport { HbarTransferParams } from './types';\n\n/**\n * Custom AccountBuilder that properly handles HBAR decimal conversion\n */\nexport class AccountBuilder extends BaseServiceBuilder {\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Transfers HBAR between accounts with proper decimal handling\n */\n public transferHbar(\n params: HbarTransferParams,\n isUserInitiated: boolean = true\n ): this {\n this.clearNotes();\n const transaction = new TransferTransaction();\n \n if (!params.transfers || params.transfers.length === 0) {\n throw new Error('HbarTransferParams must include at least one transfer.');\n }\n\n let netZeroInTinybars = new BigNumber(0);\n let userTransferProcessedForScheduling = false;\n\n if (\n isUserInitiated &&\n this.kit.userAccountId &&\n (this.kit.operationalMode as string) === 'provideBytes' &&\n params.transfers.length === 1\n ) {\n const receiverTransfer = params.transfers[0];\n const amountValue =\n typeof receiverTransfer.amount === 'string' ||\n typeof receiverTransfer.amount === 'number'\n ? receiverTransfer.amount\n : receiverTransfer.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n\n if (amountBigNum.isPositive()) {\n const recipientAccountId =\n typeof receiverTransfer.accountId === 'string'\n ? AccountId.fromString(receiverTransfer.accountId)\n : receiverTransfer.accountId;\n\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n\n this.logger.info(\n `[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${sdkHbarAmount.toString()} from ${\n this.kit.userAccountId\n } to ${recipientAccountId.toString()}`\n );\n \n this.addNote(\n `Configured HBAR transfer from your account (${\n this.kit.userAccountId\n }) to ${recipientAccountId.toString()} for ${sdkHbarAmount.toString()}.`\n );\n\n transaction.addHbarTransfer(recipientAccountId, sdkHbarAmount);\n transaction.addHbarTransfer(\n AccountId.fromString(this.kit.userAccountId),\n sdkHbarAmount.negated()\n );\n\n userTransferProcessedForScheduling = true;\n }\n }\n\n if (!userTransferProcessedForScheduling) {\n const processedTransfers: Array<{\n accountId: AccountId;\n amount: BigNumber;\n hbar: Hbar;\n }> = [];\n \n for (const transferInput of params.transfers) {\n const accountId =\n typeof transferInput.accountId === 'string'\n ? AccountId.fromString(transferInput.accountId)\n : transferInput.accountId;\n\n const amountValue =\n typeof transferInput.amount === 'string' ||\n typeof transferInput.amount === 'number'\n ? transferInput.amount\n : transferInput.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n \n this.logger.info(\n `Processing transfer: ${amountValue} HBAR (rounded to ${roundedAmount}) for account ${accountId.toString()}`\n );\n\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n processedTransfers.push({\n accountId,\n amount: amountBigNum,\n hbar: sdkHbarAmount\n });\n\n const tinybarsContribution = sdkHbarAmount.toTinybars();\n netZeroInTinybars = netZeroInTinybars.plus(\n tinybarsContribution.toString()\n );\n }\n\n if (!netZeroInTinybars.isZero()) {\n this.logger.warn(\n `Transfer sum not zero: ${netZeroInTinybars.toString()} tinybars off. Adjusting last transfer.`\n );\n \n if (processedTransfers.length > 0) {\n const lastTransfer = processedTransfers[processedTransfers.length - 1];\n const adjustment = netZeroInTinybars.dividedBy(-100000000);\n const adjustedAmount = lastTransfer.amount.plus(adjustment);\n const adjustedRounded = adjustedAmount.toFixed(8, BigNumber.ROUND_DOWN);\n lastTransfer.hbar = Hbar.fromString(adjustedRounded);\n \n this.logger.info(\n `Adjusted last transfer for ${lastTransfer.accountId.toString()} to ${adjustedRounded} HBAR`\n );\n }\n }\n \n for (const transfer of processedTransfers) {\n transaction.addHbarTransfer(transfer.accountId, transfer.hbar);\n }\n }\n\n if (typeof params.memo !== 'undefined') {\n if (params.memo === null) {\n this.logger.warn('Received null for memo in transferHbar.');\n } else {\n transaction.setTransactionMemo(params.memo);\n }\n }\n\n this.setCurrentTransaction(transaction);\n return this;\n }\n}","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}","import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport { TransferHbarTool } from './TransferHbarTool';\n\nexport class HbarTransferPlugin extends BasePlugin {\n id = 'hbar-transfer';\n name = 'HBAR Transfer Plugin';\n description =\n 'HBAR transfer tool with proper decimal handling for multi-signature transactions';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'account';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HBAR transfer tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HBAR Transfer Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HBAR Transfer plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n this.tools = [\n new TransferHbarTool({\n hederaKit: hederaKit,\n logger: this.context.logger,\n }),\n ];\n }\n\n override getTools(): HederaTool[] {\n return this.tools;\n }\n\n async shutdown(): Promise<void> {\n this.tools = [];\n }\n}","import type { BaseMessage } from '@langchain/core/messages';\nimport type { StructuredTool } from '@langchain/core/tools';\nimport type { TransactionReceipt } from '@hashgraph/sdk';\nimport {\n HederaAgentKit,\n ServerSigner,\n TokenUsageCallbackHandler,\n TokenUsage,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport type { CostCalculation } from 'hedera-agent-kit';\nimport type { AIProvider, VercelAIProvider, BAMLProvider } from './providers';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { MCPServerConfig } from './mcp/types';\n\nexport interface ToolFilterConfig {\n namespaceWhitelist?: string[];\n toolBlacklist?: string[];\n toolPredicate?: (tool: StructuredTool) => boolean;\n}\n\nexport type ExecutionMode = 'direct' | 'bytes';\nexport type OperationalMode = 'autonomous' | 'returnBytes';\n\nexport interface HederaAgentConfiguration {\n signer: ServerSigner;\n execution?: {\n mode?: ExecutionMode;\n operationalMode?: OperationalMode;\n userAccountId?: string;\n scheduleUserTransactions?: boolean;\n scheduleUserTransactionsInBytesMode?: boolean;\n };\n ai?: {\n provider?: AIProvider;\n llm?: unknown;\n apiKey?: string;\n modelName?: string;\n temperature?: number;\n };\n filtering?: ToolFilterConfig;\n messaging?: {\n systemPreamble?: string;\n systemPostamble?: string;\n conciseMode?: boolean;\n };\n extensions?: {\n plugins?: BasePlugin[];\n mirrorConfig?: Record<string, unknown>;\n modelCapability?: string;\n };\n mcp?: {\n servers?: MCPServerConfig[];\n autoConnect?: boolean;\n };\n debug?: {\n verbose?: boolean;\n silent?: boolean;\n };\n}\n\nexport interface ConversationContext {\n messages: BaseMessage[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ChatResponse {\n output: string;\n message?: string;\n transactionBytes?: string;\n receipt?: TransactionReceipt | object;\n scheduleId?: string;\n transactionId?: string;\n notes?: string[];\n error?: string;\n intermediateSteps?: unknown;\n rawToolOutput?: unknown;\n tokenUsage?: TokenUsage;\n cost?: CostCalculation;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface UsageStats extends TokenUsage {\n cost: CostCalculation;\n}\n\nexport abstract class BaseAgent {\n protected logger: Logger;\n protected agentKit: HederaAgentKit | undefined;\n protected tools: StructuredTool[] = [];\n protected initialized = false;\n protected tokenTracker: TokenUsageCallbackHandler | undefined;\n\n constructor(protected config: HederaAgentConfiguration) {\n this.logger = new Logger({\n module: 'BaseAgent',\n silent: config.debug?.silent || false,\n });\n }\n\n abstract boot(): Promise<void>;\n abstract chat(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse>;\n abstract shutdown(): Promise<void>;\n abstract switchMode(mode: OperationalMode): void;\n abstract getUsageStats(): UsageStats;\n abstract getUsageLog(): UsageStats[];\n abstract clearUsageStats(): void;\n\n getCore(): HederaAgentKit | undefined {\n return this.agentKit;\n }\n\n protected filterTools(\n tools: StructuredTool[]\n ): StructuredTool[] {\n let filtered = [...tools];\n const filter = this.config.filtering;\n if (!filter) return filtered;\n\n if (filter.namespaceWhitelist?.length) {\n filtered = filtered.filter((tool) => {\n const namespace = (tool as StructuredTool & { namespace?: string })\n .namespace;\n return !namespace || filter.namespaceWhitelist!.includes(namespace);\n });\n }\n\n if (filter.toolBlacklist?.length) {\n filtered = filtered.filter(\n (tool) => !filter.toolBlacklist!.includes(tool.name)\n );\n }\n\n if (filter.toolPredicate) {\n filtered = filtered.filter(filter.toolPredicate);\n }\n\n this.logger.debug(`Filtered tools: ${tools.length} → ${filtered.length}`);\n return filtered;\n }\n\n protected buildSystemPrompt(): string {\n const parts: string[] = [];\n const operatorId = this.config.signer.getAccountId().toString();\n const userAccId = this.config.execution?.userAccountId;\n\n if (this.config.messaging?.systemPreamble) {\n parts.push(this.config.messaging.systemPreamble);\n }\n\n parts.push(\n `You are a helpful Hedera assistant. Your primary operator account is ${operatorId}. ` +\n `You have tools to interact with the Hedera network. ` +\n `When using any tool, provide all necessary parameters as defined by that tool's schema and description.`\n );\n\n if (userAccId) {\n parts.push(\n `The user you are assisting has a personal Hedera account ID: ${userAccId}. ` +\n `IMPORTANT: When the user says things like \"I want to send HBAR\" or \"transfer my tokens\", you MUST use ${userAccId} as the sender/from account. ` +\n `For example, if user says \"I want to send 2 HBAR to 0.0.800\", you must set up a transfer where ${userAccId} sends the HBAR, not your operator account.`\n );\n }\n\n const operationalMode =\n this.config.execution?.operationalMode || 'returnBytes';\n if (operationalMode === 'autonomous') {\n parts.push(\n `\\nOPERATIONAL MODE: 'autonomous'. Your goal is to execute transactions directly using your tools. ` +\n `Your account ${operatorId} will be the payer for these transactions. ` +\n `Even if the user's account (${\n userAccId || 'a specified account'\n }) is the actor in the transaction body (e.g., sender of HBAR), ` +\n `you (the agent with operator ${operatorId}) are still executing and paying. For HBAR transfers, ensure the amounts in the 'transfers' array sum to zero (as per tool schema), balancing with your operator account if necessary.`\n );\n } else {\n if (\n this.config.execution?.scheduleUserTransactionsInBytesMode &&\n userAccId\n ) {\n parts.push(\n `\\nOPERATIONAL MODE: 'returnBytes' with scheduled transactions for user actions. ` +\n `When a user asks for a transaction to be prepared (e.g., creating a token, topic, transferring assets for them to sign, etc), ` +\n `you MUST default to creating a Scheduled Transaction using the appropriate tool with the metaOption 'schedule: true'. ` +\n `The user (with account ID ${userAccId}) will be the one to ultimately pay for and (if needed) sign the inner transaction. ` +\n `Your operator account (${operatorId}) will pay for creating the schedule entity itself. ` +\n `You MUST return the ScheduleId and details of the scheduled operation in a structured JSON format with these fields: success, op, schedule_id, description, payer_account_id_scheduled_tx, and scheduled_transaction_details.`\n );\n } else {\n parts.push(\n `\\nOPERATIONAL MODE: 'returnBytes'. Your goal is to provide transaction bytes directly. ` +\n `When a user asks for a transaction to be prepared (e.g., for them to sign, or for scheduling without the default scheduling flow), ` +\n `you MUST call the appropriate tool. If you want raw bytes for the user to sign for their own account ${\n userAccId || 'if specified'\n }, ensure the tool constructs the transaction body accordingly and use metaOption 'returnBytes: true' if available, or ensure the builder is configured for the user.`\n );\n }\n }\n\n if (this.config.messaging?.conciseMode !== false) {\n parts.push(\n '\\nAlways be concise. If the tool provides a JSON string as its primary output (especially in returnBytes mode), make your accompanying text brief. If the tool does not provide JSON output or an error occurs, your narrative becomes primary; if notes were generated by the tool in such cases, append them to your textual response.'\n );\n }\n\n if (this.config.messaging?.systemPostamble) {\n parts.push(this.config.messaging.systemPostamble);\n }\n\n return parts.join('\\n');\n }\n\n isReady(): boolean {\n return this.initialized;\n }\n}\n\nexport type { AIProvider, VercelAIProvider, BAMLProvider };\n","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}","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","import type { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport type { StructuredTool } from '@langchain/core/tools';\nimport { createOpenAIToolsAgent, AgentExecutor } from 'langchain/agents';\nimport {\n ChatPromptTemplate,\n MessagesPlaceholder,\n} from '@langchain/core/prompts';\nimport { ChatOpenAI } from '@langchain/openai';\nimport {\n calculateTokenCostSync,\n getAllHederaCorePlugins,\n HederaAgentKit,\n TokenUsageCallbackHandler,\n} from 'hedera-agent-kit';\nimport type { TokenUsage, CostCalculation } from 'hedera-agent-kit';\nimport {\n BaseAgent,\n type ConversationContext,\n type ChatResponse,\n type OperationalMode,\n type UsageStats,\n} from './base-agent';\nimport { MCPClientManager } from './mcp/MCPClientManager';\nimport { convertMCPToolToLangChain } from './mcp/adapters/langchain';\n\nexport class LangChainAgent extends BaseAgent {\n private executor: AgentExecutor | undefined;\n private systemMessage = '';\n private mcpManager?: MCPClientManager;\n\n async boot(): Promise<void> {\n if (this.initialized) {\n this.logger.warn('Agent already initialized');\n return;\n }\n\n try {\n this.agentKit = await this.createAgentKit();\n await this.agentKit.initialize();\n\n const modelName =\n this.config.ai?.modelName ||\n process.env.OPENAI_MODEL_NAME ||\n 'gpt-4o-mini';\n this.tokenTracker = new TokenUsageCallbackHandler(modelName);\n\n const allTools = this.agentKit.getAggregatedLangChainTools();\n this.tools = this.filterTools(allTools);\n\n if (this.config.mcp?.servers && this.config.mcp.servers.length > 0) {\n await this.initializeMCP();\n }\n\n this.systemMessage = this.buildSystemPrompt();\n\n await this.createExecutor();\n\n this.initialized = true;\n this.logger.info('LangChain Hedera agent initialized');\n } catch (error) {\n this.logger.error('Failed to initialize agent:', error);\n throw error;\n }\n }\n\n async chat(\n message: string,\n context?: ConversationContext\n ): Promise<ChatResponse> {\n if (!this.initialized || !this.executor) {\n throw new Error('Agent not initialized. Call boot() first.');\n }\n\n try {\n const result = await this.executor.invoke({\n input: message,\n chat_history: context?.messages || [],\n });\n\n let response: ChatResponse = {\n output: result.output || '',\n message: result.output || '',\n notes: [],\n };\n\n const parsedSteps = result?.intermediateSteps?.[0]?.observation;\n if (\n parsedSteps &&\n typeof parsedSteps === 'string' &&\n this.isJSON(parsedSteps)\n ) {\n try {\n const parsed = JSON.parse(parsedSteps);\n response = { ...response, ...parsed };\n } catch (error) {\n this.logger.error('Error parsing intermediate steps:', error);\n }\n }\n\n if (!response.output || response.output.trim() === '') {\n response.output = 'Agent action complete.';\n }\n\n if (this.tokenTracker) {\n const tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n response.tokenUsage = tokenUsage;\n response.cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n return response;\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.mcpManager) {\n await this.mcpManager.disconnectAll();\n }\n\n this.executor = undefined;\n this.agentKit = undefined;\n this.tools = [];\n this.initialized = false;\n this.logger.info('Agent cleaned up');\n }\n\n switchMode(mode: OperationalMode): void {\n if (this.config.execution) {\n this.config.execution.operationalMode = mode;\n } else {\n this.config.execution = { operationalMode: mode };\n }\n\n if (this.agentKit) {\n this.agentKit.operationalMode = mode;\n }\n\n this.systemMessage = this.buildSystemPrompt();\n this.logger.info(`Operational mode switched to: ${mode}`);\n }\n\n getUsageStats(): UsageStats {\n if (!this.tokenTracker) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: { totalCost: 0 } as CostCalculation,\n };\n }\n\n const usage = this.tokenTracker.getTotalTokenUsage();\n const cost = calculateTokenCostSync(usage);\n return { ...usage, cost };\n }\n\n getUsageLog(): UsageStats[] {\n if (!this.tokenTracker) {\n return [];\n }\n\n return this.tokenTracker.getTokenUsageHistory().map((usage) => ({\n ...usage,\n cost: calculateTokenCostSync(usage),\n }));\n }\n\n clearUsageStats(): void {\n if (this.tokenTracker) {\n this.tokenTracker.reset();\n this.logger.info('Usage statistics cleared');\n }\n }\n\n private async createAgentKit(): Promise<HederaAgentKit> {\n const corePlugins = getAllHederaCorePlugins();\n const extensionPlugins = this.config.extensions?.plugins || [];\n const plugins = [...corePlugins, ...extensionPlugins];\n\n const operationalMode =\n this.config.execution?.operationalMode || 'returnBytes';\n const modelName = this.config.ai?.modelName || 'gpt-4o';\n\n return new HederaAgentKit(\n this.config.signer,\n { plugins },\n operationalMode,\n this.config.execution?.userAccountId,\n this.config.execution?.scheduleUserTransactionsInBytesMode ?? true,\n undefined,\n modelName,\n this.config.extensions?.mirrorConfig,\n this.config.debug?.silent ?? false\n );\n }\n\n private async createExecutor(): Promise<void> {\n let llm: BaseChatModel;\n if (this.config.ai?.provider && this.config.ai.provider.getModel) {\n llm = this.config.ai.provider.getModel() as BaseChatModel;\n } else if (this.config.ai?.llm) {\n llm = this.config.ai.llm as BaseChatModel;\n } else {\n const apiKey = this.config.ai?.apiKey || process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key required');\n }\n\n llm = new ChatOpenAI({\n apiKey,\n modelName: this.config.ai?.modelName || 'gpt-4o-mini',\n temperature: this.config.ai?.temperature ?? 0.1,\n callbacks: this.tokenTracker ? [this.tokenTracker] : [],\n });\n }\n\n const prompt = ChatPromptTemplate.fromMessages([\n ['system', this.systemMessage],\n new MessagesPlaceholder('chat_history'),\n ['human', '{input}'],\n new MessagesPlaceholder('agent_scratchpad'),\n ]);\n\n const langchainTools = this.tools as unknown as StructuredTool[];\n\n const agent = await createOpenAIToolsAgent({\n llm,\n tools: langchainTools,\n prompt,\n });\n\n this.executor = new AgentExecutor({\n agent,\n tools: langchainTools,\n verbose: this.config.debug?.verbose ?? false,\n returnIntermediateSteps: true,\n });\n }\n\n private handleError(error: unknown): ChatResponse {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n this.logger.error('Chat error:', error);\n\n let tokenUsage: TokenUsage | undefined;\n let cost: CostCalculation | undefined;\n\n if (this.tokenTracker) {\n tokenUsage = this.tokenTracker.getLatestTokenUsage();\n if (tokenUsage) {\n cost = calculateTokenCostSync(tokenUsage);\n }\n }\n\n const errorResponse: ChatResponse = {\n output: 'Sorry, I encountered an error processing your request.',\n message: 'Error processing request.',\n error: errorMessage,\n notes: [],\n };\n\n if (tokenUsage) {\n errorResponse.tokenUsage = tokenUsage;\n }\n\n if (cost) {\n errorResponse.cost = cost;\n }\n\n return errorResponse;\n }\n\n private async initializeMCP(): Promise<void> {\n this.mcpManager = new MCPClientManager(this.logger);\n\n for (const serverConfig of this.config.mcp!.servers!) {\n if (serverConfig.autoConnect === false) {\n this.logger.info(\n `Skipping MCP server ${serverConfig.name} (autoConnect=false)`\n );\n continue;\n }\n\n const status = await this.mcpManager.connectServer(serverConfig);\n\n if (status.connected) {\n this.logger.info(\n `Connected to MCP server ${status.serverName} with ${status.tools.length} tools`\n );\n\n for (const mcpTool of status.tools) {\n const langchainTool = convertMCPToolToLangChain(\n mcpTool,\n this.mcpManager,\n serverConfig\n );\n this.tools.push(langchainTool);\n }\n } else {\n this.logger.error(\n `Failed to connect to MCP server ${status.serverName}: ${status.error}`\n );\n }\n }\n }\n\n /**\n * Check if a string is valid JSON\n */\n private isJSON(str: string): boolean {\n if (typeof str !== 'string') return false;\n\n const trimmed = str.trim();\n if (!trimmed) return false;\n\n if (\n !(trimmed.startsWith('{') && trimmed.endsWith('}')) &&\n !(trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { BaseAgent, type HederaAgentConfiguration } from './base-agent';\nimport { LangChainAgent } from './langchain-agent';\n\nexport function createAgent(\n config: HederaAgentConfiguration & {\n framework?: 'langchain' | 'vercel' | 'baml';\n }\n): BaseAgent {\n const framework = config.framework || 'langchain';\n\n switch (framework) {\n case 'langchain':\n return new LangChainAgent(config);\n case 'vercel':\n throw new Error('Vercel AI SDK support coming soon');\n case 'baml':\n throw new Error('BAML support coming soon');\n default:\n throw new Error(`Unknown framework: ${framework}`);\n }\n}","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}","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.`","import {\n ServerSigner,\n getAllHederaCorePlugins,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport {\n HederaMirrorNode,\n Logger,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\nimport { createAgent } from './agent-factory';\nimport { LangChainProvider } from './providers';\nimport type { ChatResponse, ConversationContext } from './base-agent';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { HumanMessage, AIMessage } from '@langchain/core/messages';\nimport type { AgentOperationalMode, MirrorNodeConfig } from 'hedera-agent-kit';\nimport { HCS10Plugin } from './plugins/hcs-10/HCS10Plugin';\nimport { HCS2Plugin } from './plugins/hcs-2/HCS2Plugin';\nimport { InscribePlugin } from './plugins/inscribe/InscribePlugin';\nimport { HbarTransferPlugin } from './plugins/hbar-transfer/HbarTransferPlugin';\nimport { OpenConvaiState } from '@hashgraphonline/standards-agent-kit';\nimport type { IStateManager } from '@hashgraphonline/standards-agent-kit';\nimport { PrivateKey } from '@hashgraph/sdk';\nimport { getSystemMessage } from './config/system-message';\nimport type { MCPServerConfig } from './mcp/types';\n\nconst DEFAULT_MODEL_NAME = 'gpt-4o';\nconst DEFAULT_TEMPERATURE = 0.1;\nconst DEFAULT_NETWORK = 'testnet';\nconst DEFAULT_OPERATIONAL_MODE: AgentOperationalMode = 'autonomous';\n\nexport interface ConversationalAgentOptions {\n accountId: string;\n privateKey: string;\n network?: NetworkType;\n openAIApiKey: string;\n openAIModelName?: string;\n verbose?: boolean;\n operationalMode?: AgentOperationalMode;\n userAccountId?: string;\n customSystemMessagePreamble?: string;\n customSystemMessagePostamble?: string;\n additionalPlugins?: BasePlugin[];\n stateManager?: IStateManager;\n scheduleUserTransactionsInBytesMode?: boolean;\n mirrorNodeConfig?: MirrorNodeConfig;\n disableLogging?: boolean;\n enabledPlugins?: string[];\n toolFilter?: (tool: { name: string; namespace?: string }) => boolean;\n mcpServers?: MCPServerConfig[];\n}\n\n/**\n * The ConversationalAgent class is an optional wrapper around the HederaConversationalAgent class,\n * which includes the OpenConvAIPlugin and the OpenConvaiState by default.\n * If you want to use a different plugin or state manager, you can pass them in the options.\n * This class is not required and the plugin can be used directly with the HederaConversationalAgent class.\n *\n * @param options - The options for the ConversationalAgent.\n * @returns A new instance of the ConversationalAgent class.\n */\nexport class ConversationalAgent {\n private agent?: ReturnType<typeof createAgent>;\n public hcs10Plugin: HCS10Plugin;\n public hcs2Plugin: HCS2Plugin;\n public inscribePlugin: InscribePlugin;\n public hbarTransferPlugin: HbarTransferPlugin;\n public stateManager: IStateManager;\n private options: ConversationalAgentOptions;\n private logger: Logger;\n\n constructor(options: ConversationalAgentOptions) {\n this.options = options;\n this.stateManager = options.stateManager || new OpenConvaiState();\n this.hcs10Plugin = new HCS10Plugin();\n this.hcs2Plugin = new HCS2Plugin();\n this.inscribePlugin = new InscribePlugin();\n this.hbarTransferPlugin = new HbarTransferPlugin();\n this.logger = new Logger({\n module: 'ConversationalAgent',\n silent: options.disableLogging || false,\n });\n }\n\n /**\n * Initialize the conversational agent with Hedera network connection and AI configuration\n * @throws {Error} If account ID or private key is missing\n * @throws {Error} If initialization fails\n */\n async initialize(): Promise<void> {\n const {\n accountId,\n privateKey,\n network = DEFAULT_NETWORK,\n openAIApiKey,\n openAIModelName = DEFAULT_MODEL_NAME,\n verbose = false,\n operationalMode = DEFAULT_OPERATIONAL_MODE,\n userAccountId,\n customSystemMessagePreamble,\n customSystemMessagePostamble,\n additionalPlugins = [],\n mirrorNodeConfig,\n disableLogging,\n scheduleUserTransactionsInBytesMode,\n } = this.options;\n\n if (!accountId || !privateKey) {\n throw new Error('Account ID and private key are required');\n }\n\n try {\n const privateKeyInstance = await this.detectPrivateKeyType(\n accountId,\n privateKey,\n network\n );\n\n const serverSigner = new ServerSigner(\n accountId,\n privateKeyInstance,\n network as 'testnet' | 'mainnet' | 'previewnet'\n );\n\n const standardPlugins = [\n this.hcs10Plugin,\n this.hcs2Plugin,\n this.inscribePlugin,\n this.hbarTransferPlugin,\n ];\n\n const corePlugins = getAllHederaCorePlugins();\n\n let allPlugins: BasePlugin[];\n\n if (this.options.enabledPlugins) {\n const enabledSet = new Set(this.options.enabledPlugins);\n const filteredPlugins = [...standardPlugins, ...corePlugins].filter(\n (plugin) => enabledSet.has(plugin.id)\n );\n allPlugins = [...filteredPlugins, ...additionalPlugins];\n } else {\n allPlugins = [...standardPlugins, ...corePlugins, ...additionalPlugins];\n }\n\n const llm = new ChatOpenAI({\n apiKey: openAIApiKey,\n modelName: openAIModelName,\n temperature: DEFAULT_TEMPERATURE,\n });\n\n this.agent = createAgent({\n framework: 'langchain',\n signer: serverSigner,\n execution: {\n mode: operationalMode === 'autonomous' ? 'direct' : 'bytes',\n operationalMode: operationalMode,\n ...(userAccountId && { userAccountId }),\n ...(scheduleUserTransactionsInBytesMode !== undefined && {\n scheduleUserTransactions: scheduleUserTransactionsInBytesMode,\n }),\n },\n ai: {\n provider: new LangChainProvider(llm),\n temperature: DEFAULT_TEMPERATURE,\n },\n filtering: {\n toolPredicate: (tool) => {\n if (tool.name === 'hedera-account-transfer-hbar') return false;\n if (this.options.toolFilter && !this.options.toolFilter(tool)) {\n return false;\n }\n return true;\n },\n },\n messaging: {\n systemPreamble:\n customSystemMessagePreamble || getSystemMessage(accountId),\n ...(customSystemMessagePostamble && { systemPostamble: customSystemMessagePostamble }),\n conciseMode: true,\n },\n extensions: {\n plugins: allPlugins,\n ...(mirrorNodeConfig && {\n mirrorConfig: mirrorNodeConfig as Record<string, unknown>,\n }),\n },\n ...(this.options.mcpServers && {\n mcp: {\n servers: this.options.mcpServers,\n autoConnect: true,\n },\n }),\n debug: {\n verbose,\n silent: disableLogging ?? false,\n },\n });\n\n const hcs10 = allPlugins.find((p) => p.id === 'hcs-10');\n if (hcs10) {\n (hcs10 as { appConfig?: Record<string, unknown> }).appConfig = {\n stateManager: this.stateManager,\n };\n }\n\n await this.agent.boot();\n } catch (error) {\n this.logger.error('Failed to initialize ConversationalAgent:', error);\n throw error;\n }\n }\n\n /**\n * Get the HCS-10 plugin instance\n * @returns {HCS10Plugin} The HCS-10 plugin instance\n */\n getPlugin(): HCS10Plugin {\n return this.hcs10Plugin;\n }\n\n /**\n * Get the state manager instance\n * @returns {IStateManager} The state manager instance\n */\n getStateManager(): IStateManager {\n return this.stateManager;\n }\n\n /**\n * Get the underlying agent instance\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getAgent(): ReturnType<typeof createAgent> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n return this.agent;\n }\n\n /**\n * Get the conversational agent instance (alias for getAgent)\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getConversationalAgent(): ReturnType<typeof createAgent> {\n return this.getAgent();\n }\n\n /**\n * Process a message through the conversational agent\n * @param {string} message - The message to process\n * @param {Array<{type: 'human' | 'ai'; content: string}>} chatHistory - Previous chat history\n * @returns {Promise<ChatResponse>} The agent's response\n * @throws {Error} If agent is not initialized\n */\n async processMessage(\n message: string,\n chatHistory: {\n type: 'human' | 'ai';\n content: string;\n }[] = []\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n\n const messages = chatHistory.map((msg) =>\n msg.type === 'human'\n ? new HumanMessage(msg.content)\n : new AIMessage(msg.content)\n );\n\n const context: ConversationContext = {\n messages,\n };\n\n return this.agent.chat(message, context);\n }\n\n /**\n * Create a ConversationalAgent with specific plugins enabled\n */\n private static withPlugins(\n options: ConversationalAgentOptions,\n plugins: string[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: plugins,\n });\n }\n\n /**\n * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled\n */\n static withHTS(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hts-token']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-2 tools enabled\n */\n static withHCS2(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-2']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-10 tools enabled\n */\n static withHCS10(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10']);\n }\n\n /**\n * Create a ConversationalAgent with only inscription tools enabled\n */\n static withInscribe(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with only account management tools enabled\n */\n static withAccount(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['account']);\n }\n\n /**\n * Create a ConversationalAgent with only file service tools enabled\n */\n static withFileService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['file-service']);\n }\n\n /**\n * Create a ConversationalAgent with only consensus service tools enabled\n */\n static withConsensusService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['consensus-service']);\n }\n\n /**\n * Create a ConversationalAgent with only smart contract tools enabled\n */\n static withSmartContract(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['smart-contract']);\n }\n\n /**\n * Create a ConversationalAgent with all HCS standards plugins\n */\n static withAllStandards(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10', 'hcs-2', 'inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)\n */\n static minimal(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, []);\n }\n\n /**\n * Create a ConversationalAgent with MCP servers configured\n */\n static withMCP(\n options: ConversationalAgentOptions,\n mcpServers: MCPServerConfig[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n mcpServers,\n });\n }\n\n /**\n * Detect the private key type by querying the account info from mirror node\n * @param {string} accountId - The Hedera account ID\n * @param {string} privateKey - The private key string\n * @param {NetworkType} network - The Hedera network\n * @returns {Promise<PrivateKey>} The appropriate PrivateKey instance\n */\n private async detectPrivateKeyType(\n accountId: string,\n privateKey: string,\n network: NetworkType\n ): Promise<PrivateKey> {\n const mirrorNode = new HederaMirrorNode(network as 'testnet' | 'mainnet');\n const accountInfo = await mirrorNode.requestAccount(accountId);\n\n const keyType = accountInfo?.key?._type || '';\n\n if (keyType?.toLowerCase()?.includes('ecdsa')) {\n return PrivateKey.fromStringECDSA(privateKey);\n } else {\n return PrivateKey.fromStringED25519(privateKey);\n }\n }\n}\n","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":["HCS10Plugin","BasePlugin","constructor","super","arguments","this","id","name","description","version","author","namespace","tools","initialize","context","config","hederaKit","stateManager","OpenConvaiState","initializeTools","logger","info","error","warn","Error","hcs10Builder","HCS10Builder","RegisterAgentTool","FindRegistrationsTool","RetrieveProfileTool","InitiateConnectionTool","ListConnectionsTool","SendMessageToConnectionTool","CheckMessagesTool","ConnectionMonitorTool","ManageConnectionRequestsTool","AcceptConnectionRequestTool","ListUnapprovedConnectionRequestsTool","getTools","getStateManager","cleanup","HCS2Plugin","hcs2Builder","HCS2Builder","CreateRegistryTool","RegisterEntryTool","UpdateEntryTool","DeleteEntryTool","MigrateRegistryTool","QueryRegistryTool","InscribePlugin","inscriberBuilder","InscriberBuilder","InscribeFromUrlTool","InscribeFromFileTool","InscribeFromBufferTool","InscribeHashinalTool","RetrieveInscriptionTool","AccountBuilder","BaseServiceBuilder","transferHbar","params","isUserInitiated","clearNotes","transaction","TransferTransaction","transfers","length","netZeroInTinybars","BigNumber","userTransferProcessedForScheduling","kit","userAccountId","operationalMode","receiverTransfer","amountValue","amount","toString","amountBigNum","isPositive","recipientAccountId","accountId","AccountId","fromString","roundedAmount","toFixed","ROUND_DOWN","sdkHbarAmount","Hbar","addNote","addHbarTransfer","negated","processedTransfers","transferInput","push","hbar","tinybarsContribution","toTinybars","plus","isZero","lastTransfer","adjustment","dividedBy","adjustedRounded","transfer","memo","setTransactionMemo","setCurrentTransaction","HbarTransferInputSchema","z","object","string","describe","union","number","TransferHbarZodSchemaCore","array","min","optional","TransferHbarTool","BaseHederaTransactionTool","specificInputSchema","getServiceBuilder","callBuilderMethod","builder","specificArgs","HbarTransferPlugin","shutdown","BaseAgent","initialized","Logger","module","silent","debug","getCore","agentKit","filterTools","filtered","filter","filtering","namespaceWhitelist","tool","includes","toolBlacklist","toolPredicate","buildSystemPrompt","parts","operatorId","signer","getAccountId","userAccId","execution","messaging","systemPreamble","scheduleUserTransactionsInBytesMode","conciseMode","systemPostamble","join","isReady","MCPClientManager","clients","Map","connectServer","isServerConnected","serverName","connected","transport","StdioClientTransport","command","args","env","client","Client","capabilities","connect","set","toolsWithServer","listTools","map","message","executeTool","toolName","get","callTool","disconnectAll","close","clear","getAllTools","allTools","values","getServerTools","has","getConnectedServers","Array","from","keys","convertMCPToolToLangChain","mcpManager","serverConfig","zodSchema","jsonSchemaToZod","inputSchema","sanitizedName","replace","toolDescriptions","additionalContext","DynamicStructuredTool","schema","func","async","input","result","content","isArray","item","type","text","JSON","stringify","errorMessage","schemaObj","convertType","properties","shape","key","value","Object","entries","zodType","required","unknown","enum","minimum","maximum","max","int","boolean","items","passthrough","LangChainAgent","systemMessage","boot","createAgentKit","modelName","ai","process","OPENAI_MODEL_NAME","tokenTracker","TokenUsageCallbackHandler","getAggregatedLangChainTools","mcp","servers","initializeMCP","createExecutor","chat","executor","invoke","chat_history","messages","response","output","notes","parsedSteps","intermediateSteps","observation","isJSON","parsed","parse","trim","tokenUsage","getLatestTokenUsage","cost","calculateTokenCostSync","handleError","switchMode","mode","getUsageStats","promptTokens","completionTokens","totalTokens","totalCost","usage","getTotalTokenUsage","getUsageLog","getTokenUsageHistory","clearUsageStats","reset","plugins","getAllHederaCorePlugins","extensions","HederaAgentKit","mirrorConfig","llm","provider","getModel","apiKey","OPENAI_API_KEY","ChatOpenAI","temperature","callbacks","prompt","ChatPromptTemplate","fromMessages","MessagesPlaceholder","langchainTools","agent","createOpenAIToolsAgent","AgentExecutor","verbose","returnIntermediateSteps","errorResponse","autoConnect","status","mcpTool","langchainTool","str","trimmed","startsWith","endsWith","createAgent","framework","LangChainProvider","model","generate","options","stream","chunk","getSystemMessage","DEFAULT_MODEL_NAME","DEFAULT_NETWORK","DEFAULT_OPERATIONAL_MODE","ConversationalAgent","hcs10Plugin","hcs2Plugin","inscribePlugin","hbarTransferPlugin","disableLogging","privateKey","network","openAIApiKey","openAIModelName","customSystemMessagePreamble","customSystemMessagePostamble","additionalPlugins","mirrorNodeConfig","privateKeyInstance","detectPrivateKeyType","serverSigner","ServerSigner","standardPlugins","corePlugins","allPlugins","enabledPlugins","enabledSet","Set","plugin","scheduleUserTransactions","toolFilter","mcpServers","hcs10","find","p","appConfig","getPlugin","getAgent","getConversationalAgent","processMessage","chatHistory","msg","HumanMessage","AIMessage","withPlugins","withHTS","withHCS2","withHCS10","withInscribe","withAccount","withFileService","withConsensusService","withSmartContract","withAllStandards","minimal","withMCP","mirrorNode","HederaMirrorNode","accountInfo","requestAccount","keyType","_type","toLowerCase","PrivateKey","fromStringECDSA","fromStringED25519","filesystem","path","list_directory","read_file","github","token","GITHUB_TOKEN","slack","SLACK_TOKEN","googleDrive","credentials","GOOGLE_CREDENTIALS","postgres","connectionString","sqlite","dbPath","custom","server","errors"],"mappings":"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"}
|
package/dist/esm/index2.js
CHANGED
|
@@ -21,7 +21,7 @@ class HCS10Plugin extends BasePlugin {
|
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
try {
|
|
24
|
-
this.stateManager = context.stateManager || new OpenConvaiState();
|
|
24
|
+
this.stateManager = context.stateManager || context.config.stateManager || new OpenConvaiState();
|
|
25
25
|
this.initializeTools();
|
|
26
26
|
this.context.logger.info(
|
|
27
27
|
"HCS-10 Plugin initialized successfully"
|
package/dist/esm/index2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) || new OpenConvaiState();\n\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-10 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-10 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info(\n 'HCS-10 Plugin cleaned up'\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAuBO,MAAM,oBAAoB,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAGZ,SAAQ,QAAsB,CAAA;AAAA,EAAC;AAAA,EAE/B,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,eACF,QAAQ,
|
|
1
|
+
{"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) || \n (context.config.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-10 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-10 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info(\n 'HCS-10 Plugin cleaned up'\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAuBO,MAAM,oBAAoB,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAGZ,SAAQ,QAAsB,CAAA;AAAA,EAAC;AAAA,EAE/B,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,eACF,QAAQ,gBACR,QAAQ,OAAO,gBAChB,IAAI,gBAAA;AAEN,WAAK,gBAAA;AAEL,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,eAAe,IAAI,aAAa,WAAW,KAAK,YAAY;AAElE,SAAK,QAAQ;AAAA,MACX,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,sBAAsB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,uBAAuB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,4BAA4B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,sBAAsB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,6BAA6B;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,4BAA4B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,qCAAqC;AAAA,QACvC;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,WAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA6C;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAe,UAAyB;AACtC,SAAK,QAAQ,CAAA;AACb,WAAO,KAAK;AACZ,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACF;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hashgraphonline/conversational-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/cjs/index.cjs",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
88
|
"@hashgraph/sdk": "^2.69.0",
|
|
89
|
-
"@hashgraphonline/standards-agent-kit": "
|
|
89
|
+
"@hashgraphonline/standards-agent-kit": "file:.yalc/@hashgraphonline/standards-agent-kit",
|
|
90
90
|
"@hashgraphonline/standards-sdk": "^0.0.156",
|
|
91
91
|
"@langchain/core": "^0.3.66",
|
|
92
92
|
"@langchain/openai": "^0.6.3",
|
|
@@ -46,7 +46,9 @@ export class HCS10Plugin extends BasePlugin {
|
|
|
46
46
|
|
|
47
47
|
try {
|
|
48
48
|
this.stateManager =
|
|
49
|
-
(context.stateManager as IStateManager) ||
|
|
49
|
+
(context.stateManager as IStateManager) ||
|
|
50
|
+
(context.config.stateManager as IStateManager) ||
|
|
51
|
+
new OpenConvaiState();
|
|
50
52
|
|
|
51
53
|
this.initializeTools();
|
|
52
54
|
|