@hashgraphonline/standards-agent-kit 0.2.112 → 0.2.113
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.d.ts +1 -1
- package/dist/cjs/standards-agent-kit.cjs +1 -1
- package/dist/cjs/standards-agent-kit.cjs.map +1 -1
- package/dist/cjs/tools/hcs6/CreateDynamicRegistryTool.d.ts +44 -0
- package/dist/cjs/tools/hcs6/QueryDynamicRegistryTool.d.ts +50 -0
- package/dist/cjs/tools/hcs6/RegisterDynamicHashinalTool.d.ts +102 -0
- package/dist/cjs/tools/hcs6/UpdateDynamicHashinalTool.d.ts +96 -0
- package/dist/cjs/tools/hcs6/base-hcs6-tools.d.ts +28 -0
- package/dist/cjs/tools/hcs6/hcs6-tool-params.d.ts +18 -0
- package/dist/cjs/tools/hcs6/index.d.ts +6 -0
- package/dist/cjs/tools/index.d.ts +1 -0
- package/dist/cjs/tools/inscriber/InscribeFromBufferTool.d.ts +4 -4
- package/dist/es/index.d.ts +1 -1
- package/dist/es/standards-agent-kit.es.js +44 -31
- package/dist/es/standards-agent-kit.es.js.map +1 -1
- package/dist/es/standards-agent-kit.es10.js +27 -27
- package/dist/es/standards-agent-kit.es10.js.map +1 -1
- package/dist/es/standards-agent-kit.es11.js +20 -30
- package/dist/es/standards-agent-kit.es11.js.map +1 -1
- package/dist/es/standards-agent-kit.es12.js +27 -37
- package/dist/es/standards-agent-kit.es12.js.map +1 -1
- package/dist/es/standards-agent-kit.es13.js +48 -60
- package/dist/es/standards-agent-kit.es13.js.map +1 -1
- package/dist/es/standards-agent-kit.es14.js +60 -23
- package/dist/es/standards-agent-kit.es14.js.map +1 -1
- package/dist/es/standards-agent-kit.es15.js +23 -23
- package/dist/es/standards-agent-kit.es15.js.map +1 -1
- package/dist/es/standards-agent-kit.es16.js +23 -33
- package/dist/es/standards-agent-kit.es16.js.map +1 -1
- package/dist/es/standards-agent-kit.es17.js +34 -10
- package/dist/es/standards-agent-kit.es17.js.map +1 -1
- package/dist/es/standards-agent-kit.es18.js +16 -155
- package/dist/es/standards-agent-kit.es18.js.map +1 -1
- package/dist/es/standards-agent-kit.es19.js +150 -22
- package/dist/es/standards-agent-kit.es19.js.map +1 -1
- package/dist/es/standards-agent-kit.es20.js +25 -39
- package/dist/es/standards-agent-kit.es20.js.map +1 -1
- package/dist/es/standards-agent-kit.es21.js +26 -28
- package/dist/es/standards-agent-kit.es21.js.map +1 -1
- package/dist/es/standards-agent-kit.es22.js +16 -19
- package/dist/es/standards-agent-kit.es22.js.map +1 -1
- package/dist/es/standards-agent-kit.es23.js +21 -15
- package/dist/es/standards-agent-kit.es23.js.map +1 -1
- package/dist/es/standards-agent-kit.es24.js +18 -21
- package/dist/es/standards-agent-kit.es24.js.map +1 -1
- package/dist/es/standards-agent-kit.es25.js +35 -32
- package/dist/es/standards-agent-kit.es25.js.map +1 -1
- package/dist/es/standards-agent-kit.es26.js +38 -25
- package/dist/es/standards-agent-kit.es26.js.map +1 -1
- package/dist/es/standards-agent-kit.es27.js +25 -116
- package/dist/es/standards-agent-kit.es27.js.map +1 -1
- package/dist/es/standards-agent-kit.es28.js +33 -166
- package/dist/es/standards-agent-kit.es28.js.map +1 -1
- package/dist/es/standards-agent-kit.es29.js +42 -121
- package/dist/es/standards-agent-kit.es29.js.map +1 -1
- package/dist/es/standards-agent-kit.es30.js +40 -77
- package/dist/es/standards-agent-kit.es30.js.map +1 -1
- package/dist/es/standards-agent-kit.es31.js +42 -37
- package/dist/es/standards-agent-kit.es31.js.map +1 -1
- package/dist/es/standards-agent-kit.es32.js +20 -237
- package/dist/es/standards-agent-kit.es32.js.map +1 -1
- package/dist/es/standards-agent-kit.es33.js +154 -135
- package/dist/es/standards-agent-kit.es33.js.map +1 -1
- package/dist/es/standards-agent-kit.es34.js +168 -23
- package/dist/es/standards-agent-kit.es34.js.map +1 -1
- package/dist/es/standards-agent-kit.es35.js +126 -21
- package/dist/es/standards-agent-kit.es35.js.map +1 -1
- package/dist/es/standards-agent-kit.es36.js +86 -3
- package/dist/es/standards-agent-kit.es36.js.map +1 -1
- package/dist/es/standards-agent-kit.es37.js +45 -0
- package/dist/es/standards-agent-kit.es37.js.map +1 -0
- package/dist/es/standards-agent-kit.es38.js +249 -0
- package/dist/es/standards-agent-kit.es38.js.map +1 -0
- package/dist/es/standards-agent-kit.es39.js +141 -0
- package/dist/es/standards-agent-kit.es39.js.map +1 -0
- package/dist/es/standards-agent-kit.es4.js +65 -32
- package/dist/es/standards-agent-kit.es4.js.map +1 -1
- package/dist/es/standards-agent-kit.es40.js +33 -0
- package/dist/es/standards-agent-kit.es40.js.map +1 -0
- package/dist/es/standards-agent-kit.es41.js +28 -0
- package/dist/es/standards-agent-kit.es41.js.map +1 -0
- package/dist/es/standards-agent-kit.es42.js +7 -0
- package/dist/es/standards-agent-kit.es42.js.map +1 -0
- package/dist/es/standards-agent-kit.es5.js +35 -311
- package/dist/es/standards-agent-kit.es5.js.map +1 -1
- package/dist/es/standards-agent-kit.es6.js +320 -20
- package/dist/es/standards-agent-kit.es6.js.map +1 -1
- package/dist/es/standards-agent-kit.es7.js +19 -227
- package/dist/es/standards-agent-kit.es7.js.map +1 -1
- package/dist/es/standards-agent-kit.es8.js +216 -65
- package/dist/es/standards-agent-kit.es8.js.map +1 -1
- package/dist/es/standards-agent-kit.es9.js +72 -23
- package/dist/es/standards-agent-kit.es9.js.map +1 -1
- package/dist/es/tools/hcs6/CreateDynamicRegistryTool.d.ts +44 -0
- package/dist/es/tools/hcs6/QueryDynamicRegistryTool.d.ts +50 -0
- package/dist/es/tools/hcs6/RegisterDynamicHashinalTool.d.ts +102 -0
- package/dist/es/tools/hcs6/UpdateDynamicHashinalTool.d.ts +96 -0
- package/dist/es/tools/hcs6/base-hcs6-tools.d.ts +28 -0
- package/dist/es/tools/hcs6/hcs6-tool-params.d.ts +18 -0
- package/dist/es/tools/hcs6/index.d.ts +6 -0
- package/dist/es/tools/index.d.ts +1 -0
- package/dist/es/tools/inscriber/InscribeFromBufferTool.d.ts +4 -4
- package/dist/umd/index.d.ts +1 -1
- package/dist/umd/standards-agent-kit.umd.js +1 -1
- package/dist/umd/standards-agent-kit.umd.js.map +1 -1
- package/dist/umd/tools/hcs6/CreateDynamicRegistryTool.d.ts +44 -0
- package/dist/umd/tools/hcs6/QueryDynamicRegistryTool.d.ts +50 -0
- package/dist/umd/tools/hcs6/RegisterDynamicHashinalTool.d.ts +102 -0
- package/dist/umd/tools/hcs6/UpdateDynamicHashinalTool.d.ts +96 -0
- package/dist/umd/tools/hcs6/base-hcs6-tools.d.ts +28 -0
- package/dist/umd/tools/hcs6/hcs6-tool-params.d.ts +18 -0
- package/dist/umd/tools/hcs6/index.d.ts +6 -0
- package/dist/umd/tools/index.d.ts +1 -0
- package/dist/umd/tools/inscriber/InscribeFromBufferTool.d.ts +4 -4
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/tools/hcs6/CreateDynamicRegistryTool.ts +66 -0
- package/src/tools/hcs6/QueryDynamicRegistryTool.ts +72 -0
- package/src/tools/hcs6/RegisterDynamicHashinalTool.ts +79 -0
- package/src/tools/hcs6/UpdateDynamicHashinalTool.ts +74 -0
- package/src/tools/hcs6/base-hcs6-tools.ts +63 -0
- package/src/tools/hcs6/hcs6-tool-params.ts +21 -0
- package/src/tools/hcs6/index.ts +6 -0
- package/src/tools/index.ts +1 -0
- package/src/tools/inscriber/InscribeFromBufferTool.ts +1 -1
- package/src/tools/inscriber/InscribeFromUrlTool.ts +60 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.cjs","sources":["../../src/tools/hcs10/base-hcs10-tools.ts","../../src/tools/hcs10/natural-language-mapper.ts","../../src/tools/hcs10/RegisterAgentTool.ts","../../src/tools/hcs10/SendMessageToConnectionTool.ts","../../src/tools/hcs10/InitiateConnectionTool.ts","../../src/tools/hcs10/ListConnectionsTool.ts","../../src/tools/hcs10/CheckMessagesTool.ts","../../src/tools/hcs10/FindRegistrationsTool.ts","../../src/tools/hcs10/ConnectionMonitorTool.ts","../../src/tools/hcs10/ManageConnectionRequestsTool.ts","../../src/tools/hcs10/AcceptConnectionRequestTool.ts","../../src/tools/hcs10/RetrieveProfileTool.ts","../../src/tools/hcs10/ListUnapprovedConnectionRequestsTool.ts","../../src/tools/hcs2/base-hcs2-tools.ts","../../src/tools/hcs2/CreateRegistryTool.ts","../../src/tools/hcs2/RegisterEntryTool.ts","../../src/tools/hcs2/UpdateEntryTool.ts","../../src/tools/hcs2/DeleteEntryTool.ts","../../src/tools/hcs2/MigrateRegistryTool.ts","../../src/tools/hcs2/QueryRegistryTool.ts","../../src/tools/inscriber/base-inscriber-tools.ts","../../src/tools/inscriber/InscribeFromUrlTool.ts","../../src/tools/inscriber/InscribeFromFileTool.ts","../../src/tools/inscriber/InscribeFromBufferTool.ts","../../src/tools/inscriber/InscribeHashinalTool.ts","../../src/tools/inscriber/RetrieveInscriptionTool.ts","../../src/utils/state-tools.ts","../../src/state/open-convai-state.ts","../../src/builders/hcs10/hcs10-builder.ts","../../src/plugins/hedera/HbarPricePlugin.ts","../../src/builders/hcs2/hcs2-builder.ts","../../src/builders/inscriber/inscriber-builder.ts","../../src/hcs10/HCS10Client.ts","../../src/init/init.ts"],"sourcesContent":["import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport {\n HCS10TransactionToolParams,\n HCS10QueryToolParams,\n} from './hcs10-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for HCS10 transaction tools\n */\nexport abstract class BaseHCS10TransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected hcs10Builder: HCS10Builder;\n namespace = 'hcs10' as const;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.hcs10Builder = params.hcs10Builder;\n }\n\n /**\n * Override to return the HCS10Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs10Builder;\n }\n}\n\n/**\n * Base class for HCS10 query tools\n */\nexport abstract class BaseHCS10QueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected hcs10Builder: HCS10Builder;\n namespace = 'hcs10' as const;\n\n constructor(params: HCS10QueryToolParams) {\n super(params);\n this.hcs10Builder = params.hcs10Builder;\n }\n\n /**\n * Override to return the HCS10Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs10Builder;\n }\n}\n","import { AIAgentCapability } from '@hashgraphonline/standards-sdk';\n\n/**\n * Maps natural language terms to AIAgentCapability enum values\n */\nexport class NaturalLanguageMapper {\n private static readonly CAPABILITY_MAPPINGS: Record<string, AIAgentCapability[]> = {\n // Common terms\n 'ai': [AIAgentCapability.TEXT_GENERATION],\n 'artificial intelligence': [AIAgentCapability.TEXT_GENERATION],\n 'chat': [AIAgentCapability.TEXT_GENERATION],\n 'conversation': [AIAgentCapability.TEXT_GENERATION],\n 'text': [AIAgentCapability.TEXT_GENERATION],\n 'text generation': [AIAgentCapability.TEXT_GENERATION],\n \n // Image\n 'image': [AIAgentCapability.IMAGE_GENERATION],\n 'picture': [AIAgentCapability.IMAGE_GENERATION],\n 'visual': [AIAgentCapability.IMAGE_GENERATION],\n 'photo': [AIAgentCapability.IMAGE_GENERATION],\n \n // Audio\n 'audio': [AIAgentCapability.AUDIO_GENERATION],\n 'sound': [AIAgentCapability.AUDIO_GENERATION],\n 'voice': [AIAgentCapability.AUDIO_GENERATION],\n 'speech': [AIAgentCapability.AUDIO_GENERATION],\n \n // Video\n 'video': [AIAgentCapability.VIDEO_GENERATION],\n 'movie': [AIAgentCapability.VIDEO_GENERATION],\n 'animation': [AIAgentCapability.VIDEO_GENERATION],\n \n // Code\n 'code': [AIAgentCapability.CODE_GENERATION],\n 'programming': [AIAgentCapability.CODE_GENERATION],\n 'development': [AIAgentCapability.CODE_GENERATION],\n 'coding': [AIAgentCapability.CODE_GENERATION],\n \n // Translation\n 'translate': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'translation': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'language': [AIAgentCapability.LANGUAGE_TRANSLATION],\n \n // Summarization\n 'summarize': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'summary': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extract': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extraction': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n \n // Knowledge\n 'knowledge': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'search': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'retrieve': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'lookup': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n \n // Data\n 'data': [AIAgentCapability.DATA_INTEGRATION],\n 'data processing': [AIAgentCapability.DATA_INTEGRATION],\n 'data integration': [AIAgentCapability.DATA_INTEGRATION],\n 'etl': [AIAgentCapability.DATA_INTEGRATION],\n \n // Market\n 'market': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'trading': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'finance': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'financial': [AIAgentCapability.MARKET_INTELLIGENCE],\n \n // Analytics\n 'analytics': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analysis': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analyze': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'transactions': [AIAgentCapability.TRANSACTION_ANALYTICS],\n \n // Smart Contract\n 'audit': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'smart contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n \n // Governance\n 'governance': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'voting': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'dao': [AIAgentCapability.GOVERNANCE_FACILITATION],\n \n // Security\n 'security': [AIAgentCapability.SECURITY_MONITORING],\n 'monitoring': [AIAgentCapability.SECURITY_MONITORING],\n 'threat': [AIAgentCapability.SECURITY_MONITORING],\n \n // Compliance\n 'compliance': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulatory': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulation': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n \n // Fraud\n 'fraud': [AIAgentCapability.FRAUD_DETECTION],\n 'detection': [AIAgentCapability.FRAUD_DETECTION],\n 'anomaly': [AIAgentCapability.FRAUD_DETECTION],\n \n // Multi-agent\n 'coordination': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'multi-agent': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'orchestration': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n \n // API\n 'api': [AIAgentCapability.API_INTEGRATION],\n 'integration': [AIAgentCapability.API_INTEGRATION],\n 'webhook': [AIAgentCapability.API_INTEGRATION],\n \n // Workflow\n 'workflow': [AIAgentCapability.WORKFLOW_AUTOMATION],\n 'automation': [AIAgentCapability.WORKFLOW_AUTOMATION],\n 'process': [AIAgentCapability.WORKFLOW_AUTOMATION],\n };\n\n /**\n * Parse natural language text and extract capability values\n */\n static parseCapabilities(text: string): AIAgentCapability[] {\n if (!text) return [AIAgentCapability.TEXT_GENERATION];\n \n const normalizedText = text.toLowerCase();\n const capabilities = new Set<AIAgentCapability>();\n \n // Check for exact matches first\n for (const [term, caps] of Object.entries(this.CAPABILITY_MAPPINGS)) {\n if (normalizedText.includes(term)) {\n caps.forEach(cap => capabilities.add(cap));\n }\n }\n \n // Default to TEXT_GENERATION if no capabilities found\n if (capabilities.size === 0) {\n capabilities.add(AIAgentCapability.TEXT_GENERATION);\n }\n \n return Array.from(capabilities);\n }\n\n /**\n * Parse tags/capabilities from various input formats\n */\n static parseTagsOrCapabilities(input: any): AIAgentCapability[] {\n // If already an array of numbers, return as is\n if (Array.isArray(input) && input.every(item => typeof item === 'number')) {\n return input;\n }\n \n // If array of strings, parse each\n if (Array.isArray(input) && input.every(item => typeof item === 'string')) {\n const capabilities = new Set<AIAgentCapability>();\n input.forEach(term => {\n this.parseCapabilities(term).forEach(cap => capabilities.add(cap));\n });\n return Array.from(capabilities);\n }\n \n // If single string, parse it\n if (typeof input === 'string') {\n return this.parseCapabilities(input);\n }\n \n // Default\n return [AIAgentCapability.TEXT_GENERATION];\n }\n\n /**\n * Convert capability enum to human-readable name\n */\n static getCapabilityName(capability: AIAgentCapability): string {\n const names: Record<AIAgentCapability, string> = {\n [AIAgentCapability.TEXT_GENERATION]: 'Text Generation',\n [AIAgentCapability.IMAGE_GENERATION]: 'Image Generation',\n [AIAgentCapability.AUDIO_GENERATION]: 'Audio Generation',\n [AIAgentCapability.VIDEO_GENERATION]: 'Video Generation',\n [AIAgentCapability.CODE_GENERATION]: 'Code Generation',\n [AIAgentCapability.LANGUAGE_TRANSLATION]: 'Language Translation',\n [AIAgentCapability.SUMMARIZATION_EXTRACTION]: 'Summarization & Extraction',\n [AIAgentCapability.KNOWLEDGE_RETRIEVAL]: 'Knowledge Retrieval',\n [AIAgentCapability.DATA_INTEGRATION]: 'Data Integration',\n [AIAgentCapability.MARKET_INTELLIGENCE]: 'Market Intelligence',\n [AIAgentCapability.TRANSACTION_ANALYTICS]: 'Transaction Analytics',\n [AIAgentCapability.SMART_CONTRACT_AUDIT]: 'Smart Contract Audit',\n [AIAgentCapability.GOVERNANCE_FACILITATION]: 'Governance Facilitation',\n [AIAgentCapability.SECURITY_MONITORING]: 'Security Monitoring',\n [AIAgentCapability.COMPLIANCE_ANALYSIS]: 'Compliance Analysis',\n [AIAgentCapability.FRAUD_DETECTION]: 'Fraud Detection',\n [AIAgentCapability.MULTI_AGENT_COORDINATION]: 'Multi-Agent Coordination',\n [AIAgentCapability.API_INTEGRATION]: 'API Integration',\n [AIAgentCapability.WORKFLOW_AUTOMATION]: 'Workflow Automation',\n };\n \n return names[capability] || 'Unknown Capability';\n }\n}","import { AIAgentCapability } from '@hashgraphonline/standards-sdk';\nimport { z } from 'zod';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport {\n HCS10Builder,\n RegisterAgentParams,\n} from '../../builders/hcs10/hcs10-builder';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { RegisteredAgent } from '../../state/state-types';\nimport { NaturalLanguageMapper } from './natural-language-mapper';\n\nconst RegisterAgentZodSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(50)\n .describe('A unique name for the agent (1-50 characters)'),\n description: z\n .string()\n .max(500)\n .optional()\n .describe('Optional bio description for the agent (max 500 characters)'),\n alias: z\n .string()\n .optional()\n .transform((val) => {\n if (!val || val.toLowerCase().includes('random')) {\n const timestamp = Date.now().toString(36);\n const randomChars = Math.random().toString(36);\n return `bot${timestamp}${randomChars}`;\n }\n return val;\n })\n .describe(\n 'Optional custom username/alias for the agent. Use \"random\" to generate a unique alias'\n ),\n type: z\n .enum(['autonomous', 'manual'])\n .optional()\n .describe('Agent type (default: autonomous)'),\n model: z\n .string()\n .optional()\n .describe('AI model identifier (default: agent-model-2024)'),\n capabilities: z\n .union([\n z.array(z.nativeEnum(AIAgentCapability)),\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'string') {\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n }\n return val as AIAgentCapability[];\n })\n .describe('Agent capabilities - can be capability names (e.g. \"ai\", \"data processing\"), capability enum values, or array of either. Common values: \"ai\"/\"text\" (TEXT_GENERATION), \"data\" (DATA_INTEGRATION), \"analytics\" (TRANSACTION_ANALYTICS)'),\n tags: z\n .union([\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n })\n .describe('Tags for the agent (alternative to capabilities) - e.g. \"ai\", \"data\", \"analytics\". Will be converted to appropriate capabilities.'),\n creator: z.string().optional().describe('Creator attribution for the agent'),\n socials: z\n .record(\n z.enum([\n 'twitter',\n 'github',\n 'discord',\n 'telegram',\n 'linkedin',\n 'youtube',\n 'website',\n 'x',\n ] as const),\n z.string()\n )\n .optional()\n .describe(\n 'Social media links (e.g., {\"twitter\": \"@handle\", \"discord\": \"username\"})'\n ),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Custom metadata properties for the agent'),\n profilePicture: z\n .union([\n z.string().describe('URL or local file path to profile picture'),\n z.object({\n url: z.string().optional(),\n path: z.string().optional(),\n filename: z.string().optional(),\n }),\n ])\n .optional()\n .describe(\n 'Optional profile picture as URL, file path, or object with url/path/filename'\n ),\n existingProfilePictureTopicId: z\n .string()\n .optional()\n .describe(\n 'Topic ID of an existing profile picture to reuse (e.g., 0.0.12345)'\n ),\n initialBalance: z\n .number()\n .positive()\n .optional()\n .describe(\n 'Optional initial HBAR balance for the new agent account (will create new account if provided)'\n ),\n userAccountId: z\n .string()\n .optional()\n .describe(\n 'Optional account ID (e.g., 0.0.12345) to use as the agent account instead of creating a new one'\n ),\n hbarFee: z\n .number()\n .positive()\n .optional()\n .describe(\n 'Optional HBAR fee amount to charge per message on the inbound topic'\n ),\n tokenFees: z\n .array(\n z.object({\n amount: z.number().positive(),\n tokenId: z.string(),\n })\n )\n .optional()\n .describe('Optional token fees to charge per message'),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe('Optional account IDs to exempt from fees'),\n setAsCurrent: z\n .boolean()\n .optional()\n .describe('Whether to set as current agent (default: true)'),\n persistence: z\n .object({\n prefix: z.string().optional(),\n })\n .optional()\n .describe('Optional persistence configuration'),\n});\n\nexport class RegisterAgentTool extends BaseHCS10TransactionTool<\n typeof RegisterAgentZodSchema\n> {\n name = 'register_agent';\n description =\n 'Creates and registers the AI agent on the Hedera network. Returns JSON string with agent details (accountId, privateKey, topics) on success. Supports natural language for capabilities/tags like \"ai\", \"data processing\", \"analytics\". Note: This tool requires multiple transactions and cannot be used in returnBytes mode. If alias is set to \"random\" or contains \"random\", a unique alias will be generated.';\n specificInputSchema = RegisterAgentZodSchema;\n private specificArgs: z.infer<typeof RegisterAgentZodSchema> | undefined;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof RegisterAgentZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n this.specificArgs = specificArgs;\n const params: RegisterAgentParams = {\n name: specificArgs.name,\n };\n\n if (specificArgs.description !== undefined) {\n params.bio = specificArgs.description;\n }\n if (specificArgs.alias !== undefined) {\n params.alias = specificArgs.alias;\n } else {\n const randomSuffix = Date.now().toString(36);\n params.alias = `${specificArgs.name}${randomSuffix}`;\n }\n if (specificArgs.type !== undefined) {\n params.type = specificArgs.type;\n }\n if (specificArgs.model !== undefined) {\n params.model = specificArgs.model;\n }\n // Handle both capabilities and tags (tags takes precedence if both provided)\n if (specificArgs.tags !== undefined) {\n params.capabilities = specificArgs.tags as AIAgentCapability[];\n } else if (specificArgs.capabilities !== undefined) {\n params.capabilities = specificArgs.capabilities as AIAgentCapability[];\n }\n if (specificArgs.creator !== undefined) {\n params.creator = specificArgs.creator;\n }\n if (specificArgs.socials !== undefined) {\n params.socials = specificArgs.socials;\n }\n if (specificArgs.properties !== undefined) {\n params.properties = specificArgs.properties;\n }\n if (specificArgs.profilePicture !== undefined) {\n if (typeof specificArgs.profilePicture === 'string') {\n params.profilePicture = specificArgs.profilePicture;\n } else {\n const profilePicObj: {\n url?: string;\n path?: string;\n filename?: string;\n } = {};\n if (specificArgs.profilePicture.url !== undefined) {\n profilePicObj.url = specificArgs.profilePicture.url;\n }\n if (specificArgs.profilePicture.path !== undefined) {\n profilePicObj.path = specificArgs.profilePicture.path;\n }\n if (specificArgs.profilePicture.filename !== undefined) {\n profilePicObj.filename = specificArgs.profilePicture.filename;\n }\n params.profilePicture = profilePicObj;\n }\n }\n if (specificArgs.existingProfilePictureTopicId !== undefined) {\n params.existingProfilePictureTopicId =\n specificArgs.existingProfilePictureTopicId;\n }\n if (specificArgs.userAccountId !== undefined) {\n params.userAccountId = specificArgs.userAccountId;\n }\n if (specificArgs.hbarFee !== undefined) {\n params.hbarFee = specificArgs.hbarFee;\n }\n if (specificArgs.tokenFees !== undefined) {\n params.tokenFees = specificArgs.tokenFees;\n }\n if (specificArgs.exemptAccountIds !== undefined) {\n params.exemptAccountIds = specificArgs.exemptAccountIds;\n }\n if (specificArgs.initialBalance !== undefined) {\n params.initialBalance = specificArgs.initialBalance;\n }\n\n await hcs10Builder.registerAgent(params);\n }\n\n /**\n * Override _call to intercept the result and save agent to state if needed\n */\n protected override async _call(\n args: z.infer<ReturnType<this['schema']>>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n const result = await super._call(args, runManager);\n\n const shouldSetAsCurrent = this.specificArgs?.setAsCurrent !== false;\n\n if (this.specificArgs && shouldSetAsCurrent) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.rawResult) {\n this._handleRegistrationResult(parsed.rawResult);\n } else if (parsed.state || parsed.accountId || parsed.metadata) {\n this._handleRegistrationResult(parsed);\n }\n } catch (e) {}\n }\n\n return result;\n }\n\n /**\n * Extract agent data from registration result and save to state\n */\n private _handleRegistrationResult(rawResult: any): void {\n let accountId = rawResult.accountId || rawResult.metadata?.accountId;\n\n if (!accountId && rawResult.state?.createdResources) {\n const accountResource = rawResult.state.createdResources.find(\n (r: string) => r.startsWith('account:')\n );\n if (accountResource) {\n accountId = accountResource.split(':')[1];\n }\n }\n\n const inboundTopicId =\n rawResult.inboundTopicId ||\n rawResult.metadata?.inboundTopicId ||\n rawResult.state?.inboundTopicId;\n\n const outboundTopicId =\n rawResult.outboundTopicId ||\n rawResult.metadata?.outboundTopicId ||\n rawResult.state?.outboundTopicId;\n\n const profileTopicId =\n rawResult.profileTopicId ||\n rawResult.metadata?.profileTopicId ||\n rawResult.state?.profileTopicId;\n\n const privateKey = rawResult.privateKey || rawResult.metadata?.privateKey;\n\n if (accountId && inboundTopicId && outboundTopicId && this.specificArgs) {\n const registeredAgent: RegisteredAgent = {\n name: this.specificArgs.name,\n accountId,\n inboundTopicId,\n outboundTopicId,\n profileTopicId,\n privateKey,\n };\n\n const hcs10Builder = this.getServiceBuilder() as HCS10Builder;\n const stateManager = hcs10Builder.getStateManager();\n if (stateManager) {\n stateManager.setCurrentAgent(registeredAgent);\n\n if (stateManager.persistAgentData) {\n const prefix =\n this.specificArgs.persistence?.prefix ||\n this.specificArgs.name.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n stateManager\n .persistAgentData(registeredAgent, {\n type: 'env-file',\n prefix: prefix,\n })\n .catch(() => {});\n }\n }\n }\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst SendMessageToConnectionZodSchema = z.object({\n targetIdentifier: z\n .string()\n .optional()\n .describe(\n \"The request key (e.g., 'req-1:0.0.6155171@0.0.6154875'), account ID (e.g., 0.0.12345) of the target agent, OR the connection number (e.g., '1', '2') from the 'list_connections' tool. Request key is most deterministic.\"\n ),\n connectionId: z\n .string()\n .optional()\n .describe(\n \"The connection number (e.g., '1', '2') from the 'list_connections' tool.\"\n ),\n agentId: z\n .string()\n .optional()\n .describe('The account ID (e.g., 0.0.12345) of the target agent.'),\n message: z.string().describe('The text message content to send.'),\n disableMonitoring: z.boolean().optional().default(false),\n});\n\n/**\n * A tool to send a message to an agent over an established HCS-10 connection.\n */\nexport class SendMessageToConnectionTool extends BaseHCS10TransactionTool<\n typeof SendMessageToConnectionZodSchema\n> {\n name = 'send_message_to_connection';\n description =\n \"Use this to send a message to an agent you already have an active connection with. Provide the target agent's account ID (e.g., 0.0.12345) and your message. If no active connection exists, this will fail - use initiate_connection instead to create a new connection first.\";\n specificInputSchema = SendMessageToConnectionZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.requiresMultipleTransactions = true;\n this.neverScheduleThisTool = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof SendMessageToConnectionZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n\n const targetIdentifier =\n specificArgs.targetIdentifier ||\n specificArgs.agentId ||\n specificArgs.connectionId;\n\n if (!targetIdentifier) {\n throw new Error(\n 'Either targetIdentifier, connectionId, or agentId must be provided'\n );\n }\n\n const stateManager = hcs10Builder.getStateManager();\n if (stateManager) {\n const connectionsManager = stateManager.getConnectionsManager();\n if (connectionsManager) {\n try {\n const currentAgent = stateManager.getCurrentAgent();\n if (currentAgent && currentAgent.accountId) {\n await connectionsManager.fetchConnectionData(\n currentAgent.accountId\n );\n }\n } catch (error) {\n console.debug('Could not refresh connections:', error);\n }\n }\n\n if (targetIdentifier.match(/^\\d+$/)) {\n const connections = stateManager.listConnections();\n const connectionIndex = parseInt(targetIdentifier) - 1; // Connection numbers are 1-based\n\n const establishedConnections = connections.filter(\n (conn) =>\n conn.status === 'established' &&\n !conn.isPending &&\n !conn.needsConfirmation\n );\n\n if (\n connectionIndex >= 0 &&\n connectionIndex < establishedConnections.length\n ) {\n const selectedConnection = establishedConnections[connectionIndex];\n if (selectedConnection && selectedConnection.connectionTopicId) {\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: selectedConnection.connectionTopicId,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n return;\n }\n }\n }\n\n if (targetIdentifier.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n const connections = stateManager.listConnections();\n const establishedConnection = connections.find(\n (conn) =>\n (conn.targetAccountId === targetIdentifier ||\n conn.targetAccountId === `0.0.${targetIdentifier}`) &&\n conn.status === 'established' &&\n !conn.isPending &&\n !conn.needsConfirmation\n );\n\n if (establishedConnection && establishedConnection.connectionTopicId) {\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: establishedConnection.connectionTopicId,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n return;\n }\n }\n }\n\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: targetIdentifier,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst InitiateConnectionZodSchema = z.object({\n targetAccountId: z\n .string()\n .describe(\n 'The Hedera account ID (e.g., 0.0.12345) of the agent you want to connect with.'\n ),\n disableMonitor: z\n .boolean()\n .optional()\n .describe(\n 'If true, does not wait for connection confirmation. Returns immediately after sending the request.'\n ),\n memo: z\n .string()\n .optional()\n .describe(\n 'Optional memo to include with the connection request (e.g., \"Hello from Alice\"). If not provided, defaults to \"true\" or \"false\" based on monitoring preference.'\n ),\n});\n\n/**\n * A tool to actively START a NEW HCS-10 connection TO a target agent.\n * Requires the target agent's account ID.\n * It retrieves their profile, sends a connection request, and optionally waits for confirmation.\n * Use this tool ONLY to actively INITIATE an OUTGOING connection.\n */\nexport class InitiateConnectionTool extends BaseHCS10TransactionTool<\n typeof InitiateConnectionZodSchema\n> {\n name = 'initiate_connection';\n description =\n 'ONLY use this to START a BRAND NEW connection to an agent you have NEVER connected to before. If you already have an active connection to this agent, use send_message_to_connection instead. This creates a new connection request and waits for acceptance.';\n specificInputSchema = InitiateConnectionZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof InitiateConnectionZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n const params: {\n targetAccountId: string;\n disableMonitor?: boolean;\n memo?: string;\n } = {\n targetAccountId: specificArgs.targetAccountId,\n };\n if (specificArgs.disableMonitor !== undefined) {\n params.disableMonitor = specificArgs.disableMonitor;\n }\n if (specificArgs.memo !== undefined) {\n params.memo = specificArgs.memo;\n }\n await hcs10Builder.initiateConnection(params);\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\n/**\n * A tool to list currently active HCS-10 connections stored in the state manager.\n * Enhanced to show more details similar to moonscape's implementation.\n */\nconst ListConnectionsZodSchema = z.object({\n includeDetails: z\n .boolean()\n .optional()\n .describe(\n 'Whether to include detailed information about each connection'\n ),\n showPending: z\n .boolean()\n .optional()\n .describe('Whether to include pending connection requests'),\n});\n\nexport class ListConnectionsTool extends BaseHCS10QueryTool<\n typeof ListConnectionsZodSchema\n> {\n name = 'list_connections';\n description =\n 'Lists all active HCS-10 connections. Use this FIRST before sending messages to check if you already have an active connection to a target agent. Shows connection details and agent information for each active connection.';\n specificInputSchema = ListConnectionsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n args: z.infer<typeof ListConnectionsZodSchema>\n ): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { includeDetails?: boolean; showPending?: boolean } = {};\n if (args.includeDetails !== undefined) {\n params.includeDetails = args.includeDetails;\n }\n if (args.showPending !== undefined) {\n params.showPending = args.showPending;\n }\n await hcs10Builder.listConnections(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as { formattedOutput?: string; message?: string };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Connections listed'\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\n/**\n * A tool to check for new messages on an active HCS-10 connection topic,\n * or optionally fetch the latest messages regardless of timestamp.\n */\nconst CheckMessagesZodSchema = z.object({\n targetIdentifier: z\n .string()\n .describe(\n \"The account ID (e.g., 0.0.12345) of the target agent OR the connection number (e.g., '1', '2') from the 'list_connections' tool to check messages for.\"\n ),\n fetchLatest: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Set to true to fetch the latest messages even if they have been seen before, ignoring the last checked timestamp. Defaults to false (fetching only new messages).'\n ),\n lastMessagesCount: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'When fetchLatest is true, specifies how many of the most recent messages to retrieve. Defaults to 1.'\n ),\n});\n\nexport class CheckMessagesTool extends BaseHCS10QueryTool<\n typeof CheckMessagesZodSchema\n> {\n name = 'check_messages';\n description = `Checks for and retrieves messages from an active connection.\nIdentify the target agent using their account ID (e.g., 0.0.12345) or the connection number shown in 'list_connections'.\nBy default, it only retrieves messages newer than the last check.\nUse 'fetchLatest: true' to get the most recent messages regardless of when they arrived.\nUse 'lastMessagesCount' to specify how many latest messages to retrieve (default 1 when fetchLatest is true).`;\n specificInputSchema = CheckMessagesZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n targetIdentifier,\n fetchLatest,\n lastMessagesCount,\n }: z.infer<typeof CheckMessagesZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n await hcs10Builder.checkMessages({\n targetIdentifier,\n fetchLatest,\n lastMessagesCount: lastMessagesCount || 1,\n });\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n formattedOutput?: string;\n message?: string;\n };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Messages checked',\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { AIAgentCapability } from '@hashgraphonline/standards-sdk';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nimport { NaturalLanguageMapper } from './natural-language-mapper';\n\n/**\n * A tool to search for registered HCS-10 agents using the configured registry.\n */\nconst FindRegistrationsZodSchema = z.object({\n accountId: z\n .string()\n .optional()\n .describe(\n 'Optional: Filter registrations by a specific Hedera account ID (e.g., 0.0.12345).'\n ),\n tags: z\n .union([\n z.array(z.nativeEnum(AIAgentCapability)),\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'string') {\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n }\n return val as AIAgentCapability[];\n })\n .describe(\n 'Optional: Filter by capabilities/tags like \"ai\", \"data\", \"analytics\". Can be natural language terms or capability numbers.'\n ),\n});\n\nexport class FindRegistrationsTool extends BaseHCS10QueryTool<\n typeof FindRegistrationsZodSchema\n> {\n name = 'find_registrations';\n description =\n 'Searches the configured agent registry for HCS-10 agents. You can filter by account ID or tags/capabilities using natural language like \"ai\", \"data processing\", \"analytics\". Returns basic registration info.';\n specificInputSchema = FindRegistrationsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n accountId,\n tags,\n }: z.infer<typeof FindRegistrationsZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { accountId?: string; tags?: number[] } = {};\n if (accountId) {\n params.accountId = accountId;\n }\n if (tags) {\n params.tags = tags as number[];\n }\n await hcs10Builder.findRegistrations(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n formattedOutput?: string;\n message?: string;\n };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Registrations searched',\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst ConnectionMonitorZodSchema = z.object({\n acceptAll: z\n .boolean()\n .optional()\n .describe(\n 'Whether to automatically accept all incoming connection requests. Default is false.'\n ),\n targetAccountId: z\n .string()\n .optional()\n .describe(\n 'If provided, only accept connection requests from this specific account ID.'\n ),\n hbarFees: z\n .array(\n z.object({\n amount: z.number(),\n collectorAccount: z.string().optional(),\n })\n )\n .optional()\n .describe(\n 'Array of HBAR fee amounts to charge per message (with optional collector accounts).'\n ),\n tokenFees: z\n .array(\n z.object({\n amount: z.number(),\n tokenId: z.string(),\n collectorAccount: z.string().optional(),\n })\n )\n .optional()\n .describe(\n 'Array of token fee amounts and IDs to charge per message (with optional collector accounts).'\n ),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe(\n 'Array of account IDs to exempt from ALL fees set in this request.'\n ),\n monitorDurationSeconds: z\n .number()\n .optional()\n .describe(\n 'How long to monitor for incoming requests in seconds. Default is 120.'\n ),\n defaultCollectorAccount: z\n .string()\n .optional()\n .describe(\n 'Default account to collect fees if not specified at the fee level. Defaults to the agent account.'\n ),\n});\n\n/**\n * A tool for monitoring incoming connection requests and accepting them with optional fee settings.\n */\nexport class ConnectionMonitorTool extends BaseHCS10TransactionTool<\n typeof ConnectionMonitorZodSchema\n> {\n name = 'monitor_connections';\n description =\n 'Monitors for incoming connection requests and accepts them with optional fee settings. Use this to watch for connection requests and accept them, optionally setting HBAR or token fees on the connection. Note: When acceptAll=true, this tool requires multiple transactions and cannot be used in returnBytes mode.';\n specificInputSchema = ConnectionMonitorZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof ConnectionMonitorZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n await hcs10Builder.monitorConnections({\n ...(specificArgs.acceptAll !== undefined && {\n acceptAll: specificArgs.acceptAll,\n }),\n ...(specificArgs.targetAccountId !== undefined && {\n targetAccountId: specificArgs.targetAccountId,\n }),\n ...(specificArgs.monitorDurationSeconds !== undefined && {\n monitorDurationSeconds: specificArgs.monitorDurationSeconds,\n }),\n hbarFees: (specificArgs.hbarFees || []) as Array<{\n amount: number;\n collectorAccount?: string;\n }>,\n tokenFees: (specificArgs.tokenFees || []) as Array<{\n amount: number;\n tokenId: string;\n collectorAccount?: string;\n }>,\n ...(specificArgs.exemptAccountIds !== undefined && {\n exemptAccountIds: specificArgs.exemptAccountIds,\n }),\n ...(specificArgs.defaultCollectorAccount !== undefined && {\n defaultCollectorAccount: specificArgs.defaultCollectorAccount,\n }),\n });\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\nconst ManageConnectionRequestsZodSchema = z.object({\n action: z\n .enum(['list', 'view', 'reject'])\n .describe(\n 'The action to perform: list all requests, view details of a specific request, or reject a request'\n ),\n requestKey: z\n .string()\n .optional()\n .describe(\n 'The unique request key to view or reject (required for view and reject actions)'\n ),\n});\n\n/**\n * A tool for managing incoming connection requests in a LangChain-compatible way.\n * This tool allows an agent to list, view details of, and reject incoming connection requests.\n */\nexport class ManageConnectionRequestsTool extends BaseHCS10QueryTool<\n typeof ManageConnectionRequestsZodSchema\n> {\n name = 'manage_connection_requests';\n description =\n 'Manage incoming connection requests. List pending requests, view details about requesting agents, and reject connection requests. Use the separate \"accept_connection_request\" tool to accept.';\n specificInputSchema = ManageConnectionRequestsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n action,\n requestKey,\n }: z.infer<typeof ManageConnectionRequestsZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { action: 'list' | 'view' | 'reject'; requestKey?: string } =\n { action };\n if (requestKey !== undefined) {\n params.requestKey = requestKey;\n }\n await hcs10Builder.manageConnectionRequests(params);\n const result = await hcs10Builder.execute();\n return 'rawResult' in result ? result.rawResult : result;\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst AcceptConnectionRequestZodSchema = z.object({\n requestKey: z\n .string()\n .describe(\n 'The unique request key of the specific request to accept. Use the \"manage_connection_requests\" tool with action=\"list\" first to get valid keys.'\n ),\n hbarFee: z\n .number()\n .optional()\n .describe(\n 'Optional HBAR fee amount to charge the connecting agent per message on the new connection topic.'\n ),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe(\n 'Optional list of account IDs to exempt from any configured fees on the new connection topic.'\n ),\n});\n\n/**\n * Tool for accepting incoming HCS-10 connection requests\n */\nexport class AcceptConnectionRequestTool extends BaseHCS10TransactionTool<\n typeof AcceptConnectionRequestZodSchema\n> {\n name = 'accept_connection_request';\n description =\n 'Accepts a pending HCS-10 connection request from another agent. Use list_unapproved_connection_requests to see pending requests.';\n specificInputSchema = AcceptConnectionRequestZodSchema;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof AcceptConnectionRequestZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n\n await hcs10Builder.acceptConnection({\n requestKey: specificArgs.requestKey,\n hbarFee: specificArgs.hbarFee,\n exemptAccountIds: specificArgs.exemptAccountIds,\n });\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nconst RetrieveProfileZodSchema = z.object({\n accountId: z\n .string()\n .describe(\n 'The Hedera account ID of the agent whose profile you want to retrieve (e.g., 0.0.12345).'\n ),\n disableCache: z\n .boolean()\n .optional()\n .describe(\n 'Optional: Force refresh from the network instead of using cache.'\n ),\n});\n\n/**\n * Tool to retrieve detailed profile information for a specific HCS-10 agent\n */\nexport class RetrieveProfileTool extends BaseHCS10QueryTool<\n typeof RetrieveProfileZodSchema\n> {\n name = 'retrieve_profile';\n description =\n 'Gets the detailed profile information for a specific HCS-10 agent by their account ID. Returns name, bio, capabilities, topics, and other metadata.';\n specificInputSchema = RetrieveProfileZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n accountId,\n disableCache,\n }: z.infer<typeof RetrieveProfileZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { accountId: string; disableCache?: boolean } = {\n accountId,\n };\n if (disableCache !== undefined) {\n params.disableCache = disableCache;\n }\n await hcs10Builder.retrieveProfile(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n profileDetails?: string;\n rawProfile?: unknown;\n };\n return {\n success: true,\n data: raw.profileDetails || 'Profile retrieved',\n rawProfile: raw.rawProfile,\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nconst ListUnapprovedConnectionRequestsZodSchema = z.object({});\n\n/**\n * Lists all connection requests that are not fully established\n */\nexport class ListUnapprovedConnectionRequestsTool extends BaseHCS10QueryTool<\n typeof ListUnapprovedConnectionRequestsZodSchema\n> {\n name = 'list_unapproved_connection_requests';\n description =\n 'Lists all connection requests that are not fully established, including incoming requests needing approval and outgoing requests waiting for confirmation.';\n specificInputSchema = ListUnapprovedConnectionRequestsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n await hcs10Builder.listUnapprovedConnectionRequests();\n const result = await hcs10Builder.execute();\n return 'rawResult' in result ? result.rawResult : result;\n }\n}","import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { HCS2Builder } from '../../builders/hcs2/hcs2-builder';\nimport {\n HCS2TransactionToolParams,\n HCS2QueryToolParams,\n} from './hcs2-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for HCS2 transaction tools\n */\nexport abstract class BaseHCS2TransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected hcs2Builder: HCS2Builder;\n namespace = 'hcs2' as const;\n\n constructor(params: HCS2TransactionToolParams) {\n super(params);\n this.hcs2Builder = params.hcs2Builder;\n }\n\n /**\n * Override to return the HCS2Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs2Builder;\n }\n}\n\n/**\n * Base class for HCS2 query tools\n */\nexport abstract class BaseHCS2QueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected hcs2Builder: HCS2Builder;\n namespace = 'hcs2' as const;\n\n constructor(params: HCS2QueryToolParams) {\n super(params);\n this.hcs2Builder = params.hcs2Builder;\n }\n\n /**\n * Override to return the HCS2Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs2Builder;\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { HCS2RegistryType } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for creating an HCS-2 registry\n */\nconst createRegistrySchema = z.object({\n registryType: z\n .nativeEnum(HCS2RegistryType)\n .optional()\n .describe('Registry type: 0 for indexed, 1 for non-indexed (default: 0)'),\n ttl: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Time to live in seconds (default: 86400)'),\n adminKey: z\n .union([z.string(), z.boolean()])\n .optional()\n .describe('Admin key: public key string or true to use operator key'),\n submitKey: z\n .union([z.string(), z.boolean()])\n .optional()\n .describe('Submit key: public key string or true to use operator key'),\n});\n\n/**\n * Tool for creating HCS-2 registries\n */\nexport class CreateRegistryTool extends BaseHCS2QueryTool<typeof createRegistrySchema> {\n name = 'createHCS2Registry';\n description = 'Create a new HCS-2 registry topic for storing decentralized data';\n\n get specificInputSchema() {\n return createRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof createRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.createRegistry({\n registryType: params.registryType,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to create registry');\n }\n\n return `Successfully created HCS-2 registry!\\n\\nTopic ID: ${result.topicId}\\nRegistry Type: ${params.registryType === 1 ? 'Non-Indexed' : 'Indexed'}\\nTTL: ${params.ttl || 86400} seconds\\n\\nYou can now register entries to this registry using the topic ID.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to create HCS-2 registry';\n throw new Error(`Registry creation failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for registering an entry in HCS-2\n */\nconst registerEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (e.g., 0.0.123456)'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The target topic ID to register (e.g., 0.0.123456)'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI (HIP-412 format)'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n/**\n * Tool for registering entries in HCS-2 registries\n */\nexport class RegisterEntryTool extends BaseHCS2QueryTool<typeof registerEntrySchema> {\n name = 'registerHCS2Entry';\n description = 'Register a new entry in an HCS-2 registry';\n\n get specificInputSchema() {\n return registerEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof registerEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.registerEntry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to register entry');\n }\n\n return `Successfully registered entry in HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nTarget Topic ID: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been added to the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to register entry';\n throw new Error(`Entry registration failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for updating an entry in HCS-2\n */\nconst updateEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (must be indexed)'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The new topic ID to point to'),\n uid: z\n .string()\n .describe('The unique ID of the entry to update'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI (HIP-412 format)'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for updating entries in HCS-2 registries\n */\nexport class UpdateEntryTool extends BaseHCS2QueryTool<typeof updateEntrySchema> {\n name = 'updateHCS2Entry';\n description = 'Update an existing entry in an indexed HCS-2 registry';\n\n get specificInputSchema() {\n return updateEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof updateEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.updateEntry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n uid: params.uid,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to update entry');\n }\n\n return `Successfully updated entry in HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nUID: ${params.uid}\\nNew Target Topic ID: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been updated in the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to update entry';\n throw new Error(`Entry update failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for deleting an entry from HCS-2\n */\nconst deleteEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (must be indexed)'),\n uid: z\n .string()\n .describe('The unique ID of the entry to delete'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for deleting entries from HCS-2 registries\n */\nexport class DeleteEntryTool extends BaseHCS2QueryTool<typeof deleteEntrySchema> {\n name = 'deleteHCS2Entry';\n description = 'Delete an entry from an indexed HCS-2 registry';\n\n get specificInputSchema() {\n return deleteEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof deleteEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.deleteEntry(\n params.registryTopicId,\n {\n uid: params.uid,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to delete entry');\n }\n\n return `Successfully deleted entry from HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nUID: ${params.uid}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been removed from the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to delete entry';\n throw new Error(`Entry deletion failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for migrating an HCS-2 registry\n */\nconst migrateRegistrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The current HCS-2 registry topic ID'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The new topic ID to migrate to'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI for migration details'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for migrating HCS-2 registries\n */\nexport class MigrateRegistryTool extends BaseHCS2QueryTool<typeof migrateRegistrySchema> {\n name = 'migrateHCS2Registry';\n description = 'Migrate an HCS-2 registry to a new topic';\n\n get specificInputSchema() {\n return migrateRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof migrateRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.migrateRegistry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to migrate registry');\n }\n\n return `Successfully migrated HCS-2 registry!\\n\\nFrom Registry Topic: ${params.registryTopicId}\\nTo Target Topic: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe registry has been migrated to the new topic.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to migrate registry';\n throw new Error(`Registry migration failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for querying HCS-2 registry\n */\nconst queryRegistrySchema = z.object({\n topicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID to query'),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Maximum number of entries to return'),\n order: z\n .enum(['asc', 'desc'])\n .optional()\n .describe('Order of results (ascending or descending)'),\n skip: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Number of entries to skip'),\n});\n\n\n/**\n * Tool for querying HCS-2 registries\n */\nexport class QueryRegistryTool extends BaseHCS2QueryTool<typeof queryRegistrySchema> {\n name = 'queryHCS2Registry';\n description = 'Query entries from an HCS-2 registry';\n\n get specificInputSchema() {\n return queryRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof queryRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const registry = await this.hcs2Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n return {\n topicId: registry.topicId,\n registryType: registry.registryType === 0 ? 'indexed' : 'non-indexed',\n ttl: registry.ttl,\n totalEntries: registry.entries.length,\n entries: registry.entries.map(entry => ({\n sequence: entry.sequence,\n timestamp: entry.timestamp,\n payer: entry.payer,\n operation: entry.message.op,\n targetTopicId: entry.message.t_id,\n uid: entry.message.uid,\n metadata: entry.message.metadata,\n memo: entry.message.m,\n })),\n };\n }\n}","import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { InscriberBuilder } from '../../builders/inscriber/inscriber-builder';\nimport {\n InscriberTransactionToolParams,\n InscriberQueryToolParams,\n} from './inscriber-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for Inscriber transaction tools\n */\nexport abstract class BaseInscriberTransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberTransactionToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n}\n\n/**\n * Base class for Inscriber query tools\n */\nexport abstract class BaseInscriberQueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberQueryToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing from URL\n */\nconst inscribeFromUrlSchema = z.object({\n url: z.string().url().describe('The URL of the content to inscribe'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing content from URL\n */\nexport class InscribeFromUrlTool extends BaseInscriberQueryTool<typeof inscribeFromUrlSchema> {\n name = 'inscribeFromUrl';\n description = 'Inscribe content directly from a URL that points to a downloadable file (PDF, image, JSON, etc). DO NOT use this for web pages like Wikipedia, Twitter, or GitHub pages. This tool is ONLY for direct file URLs like https://example.com/document.pdf or https://api.example.com/data.json. For content you already have (from Wikipedia, MCP tools, or text), use inscribeFromBuffer instead.';\n\n get specificInputSchema() {\n return inscribeFromUrlSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromUrlSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromUrlTool.executeQuery called with URL: ${params.url}`);\n \n if (!params.url || params.url.trim() === '') {\n throw new Error('URL cannot be empty. Please provide a valid URL.');\n }\n\n try {\n const urlObj = new URL(params.url);\n if (!urlObj.protocol || !urlObj.host) {\n throw new Error('Invalid URL format. Please provide a complete URL with protocol (http/https).');\n }\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n throw new Error('Only HTTP and HTTPS URLs are supported for inscription.');\n }\n } catch (error) {\n throw new Error(`Invalid URL: ${params.url}. Please provide a valid URL.`);\n }\n\n console.log(`[InscribeFromUrlTool] Validating URL content before inscription...`);\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n \n try {\n const response = await fetch(params.url, {\n method: 'HEAD',\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n if (!response.ok) {\n throw new Error(`URL returned error status ${response.status}: ${response.statusText}. Cannot inscribe content from inaccessible URLs.`);\n }\n\n const contentLength = response.headers.get('content-length');\n if (contentLength && parseInt(contentLength) === 0) {\n throw new Error('URL returns empty content (Content-Length: 0). Cannot inscribe empty content.');\n }\n\n if (contentLength && parseInt(contentLength) < 10) {\n throw new Error(`URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`);\n }\n\n const contentType = response.headers.get('content-type');\n console.log(`[InscribeFromUrlTool] URL validation passed. Content-Type: ${contentType}, Content-Length: ${contentLength || 'unknown'}`);\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n console.log(`[InscribeFromUrlTool] Warning: URL validation timed out after 10 seconds. Proceeding with inscription attempt.`);\n } else if (error.message.includes('URL returned error') || error.message.includes('empty content') || error.message.includes('too small')) {\n throw error;\n } else {\n console.log(`[InscribeFromUrlTool] Warning: Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`);\n }\n }\n }\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Inscription timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise\n ]) as any;\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe from URL';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * Schema for inscribing from file\n */\nconst inscribeFromFileSchema = z.object({\n filePath: z.string().min(1, 'File path cannot be empty').describe('The file path of the content to inscribe. Must point to a valid, non-empty file.'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds for inscription (default: no timeout)'),\n apiKey: z.string().optional().describe('API key for inscription service'),\n});\n\n/**\n * Tool for inscribing content from file\n */\nexport class InscribeFromFileTool extends BaseInscriberQueryTool<\n typeof inscribeFromFileSchema\n> {\n name = 'inscribeFromFile';\n description =\n 'Inscribe content from a local file to the Hedera network using a file path. IMPORTANT: Only use this tool when you have a valid file path to actual content. The file must exist and contain meaningful data (minimum 10 bytes). For files accessed through MCP filesystem tools, consider reading the file content first and using inscribeFromBuffer instead.';\n\n get specificInputSchema(): typeof inscribeFromFileSchema {\n return inscribeFromFileSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromFileSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromFileTool.executeQuery called with: ${params.filePath}`);\n \n // File validation\n let fileContent: Buffer;\n try {\n console.log(`[DEBUG] Checking file: ${params.filePath}`);\n console.log(`[DEBUG] Current working directory: ${process.cwd()}`);\n\n const stats = await fs.stat(params.filePath);\n if (!stats.isFile()) {\n throw new Error(`Path \"${params.filePath}\" is not a file`);\n }\n\n console.log(`[DEBUG] File size: ${stats.size} bytes`);\n\n if (stats.size === 0) {\n throw new Error(\n `File \"${params.filePath}\" is empty (0 bytes). Cannot inscribe empty files.`\n );\n }\n\n if (stats.size < 10) {\n throw new Error(\n `File \"${params.filePath}\" is too small (${stats.size} bytes). Files must contain at least 10 bytes of meaningful content.`\n );\n }\n\n if (stats.size > 100 * 1024 * 1024) {\n console.log(`[InscribeFromFileTool] WARNING: Large file detected (${(stats.size / (1024 * 1024)).toFixed(2)} MB)`);\n }\n\n this.logger?.info('Reading file content...');\n fileContent = await fs.readFile(params.filePath);\n this.logger?.info(`Read ${fileContent.length} bytes from file`);\n\n if (!fileContent || fileContent.length === 0) {\n throw new Error(\n `File \"${params.filePath}\" has no content after reading. Cannot inscribe empty files.`\n );\n }\n\n if (fileContent.length < 10) {\n throw new Error(\n `File \"${params.filePath}\" content is too small (${fileContent.length} bytes). Files must contain at least 10 bytes of meaningful content.`\n );\n }\n\n const fileName = path.basename(params.filePath);\n const mimeType = this.getMimeType(fileName);\n if (mimeType.startsWith('text/') || mimeType === 'application/json') {\n const textContent = fileContent.toString('utf8', 0, Math.min(fileContent.length, 1000));\n if (textContent.trim() === '') {\n throw new Error(\n `File \"${params.filePath}\" contains only whitespace or empty content. Cannot inscribe meaningless data.`\n );\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('ENOENT')) {\n throw new Error(`File not found: \"${params.filePath}\"`);\n }\n throw error;\n }\n throw new Error(`Failed to read file: ${error}`);\n }\n\n const base64Data = fileContent.toString('base64');\n this.logger?.info(`Converted to base64: ${base64Data.length} characters`);\n\n const fileName = path.basename(params.filePath);\n const mimeType = this.getMimeType(fileName);\n this.logger?.info(`File: ${fileName}, MIME type: ${mimeType}`);\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n };\n\n try {\n let result: any;\n \n if (params.timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${params.timeoutMs}ms`)),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n );\n }\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId\n ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}`\n : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n result.result.transactionId\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to inscribe from file';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n private getMimeType(fileName: string): string {\n const ext = path.extname(fileName).toLowerCase();\n const mimeTypes: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.json': 'application/json',\n '.txt': 'text/plain',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.ts': 'application/typescript',\n '.mp4': 'video/mp4',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.zip': 'application/zip',\n };\n return mimeTypes[ext] || 'application/octet-stream';\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing from buffer\n */\nconst inscribeFromBufferSchema = z.object({\n base64Data: z.string().min(1, 'Base64 data cannot be empty').describe('Base64 encoded content to inscribe. Must contain valid, non-empty content (minimum 10 bytes after decoding).'),\n fileName: z.string().min(1, 'File name cannot be empty').describe('Name for the inscribed content. Required for all inscriptions.'),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds for inscription (default: no timeout)'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing content from buffer\n */\nexport class InscribeFromBufferTool extends BaseInscriberQueryTool<typeof inscribeFromBufferSchema> {\n name = 'inscribeFromBuffer';\n description = 'Inscribe content that you already have (text, data, or files) to the Hedera network. Use this tool when you have content from: Wikipedia articles, MCP tool responses, text data, API responses, or any content you\\'ve retrieved. Convert your content to base64 first. DO NOT use inscribeFromUrl for web page content - use this tool instead after retrieving the actual content.';\n\n get specificInputSchema() {\n return inscribeFromBufferSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromBufferTool.executeQuery called`);\n console.log(`[DEBUG] Buffer tool received base64Data length: ${params.base64Data?.length || 0}`);\n console.log(`[DEBUG] Buffer tool fileName: ${params.fileName}`);\n console.log(`[DEBUG] Buffer tool mimeType: ${params.mimeType}`);\n \n if (!params.base64Data || params.base64Data.trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: No data provided`);\n throw new Error('No data provided. Cannot inscribe empty content. Please provide valid base64 encoded data.');\n }\n\n if (!params.fileName || params.fileName.trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: No fileName provided`);\n throw new Error('No fileName provided. A valid fileName is required for inscription.');\n }\n\n let buffer: Buffer;\n try {\n buffer = Buffer.from(params.base64Data, 'base64');\n } catch (error) {\n console.log(`[InscribeFromBufferTool] ERROR: Invalid base64 data`);\n throw new Error('Invalid base64 data provided. Please ensure the data is properly base64 encoded.');\n }\n \n console.log(`[InscribeFromBufferTool] Buffer length after conversion: ${buffer.length}`);\n \n if (buffer.length === 0) {\n console.log(`[InscribeFromBufferTool] ERROR: Buffer is empty after conversion`);\n throw new Error('Buffer is empty after base64 conversion. The provided data appears to be invalid or empty.');\n }\n\n if (buffer.length < 10) {\n console.log(`[InscribeFromBufferTool] WARNING: Buffer is very small (${buffer.length} bytes)`);\n console.log(`[InscribeFromBufferTool] Buffer content preview: ${buffer.toString('utf8', 0, Math.min(buffer.length, 50))}`);\n throw new Error(`Buffer content is too small (${buffer.length} bytes). This may indicate empty or invalid content. Please verify the source data contains actual content.`);\n }\n\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(params.base64Data);\n if (!isValidBase64) {\n console.log(`[InscribeFromBufferTool] ERROR: Invalid base64 format`);\n throw new Error('Invalid base64 format. The data does not appear to be properly base64 encoded.');\n }\n\n if (buffer.toString('utf8', 0, Math.min(buffer.length, 100)).trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: Buffer contains only whitespace or empty content`);\n throw new Error('Buffer contains only whitespace or empty content. Cannot inscribe meaningless data.');\n }\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n let result: any;\n \n if (params.timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${params.timeoutMs}ms`)),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer,\n fileName: params.fileName,\n mimeType: params.mimeType,\n },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer,\n fileName: params.fileName,\n mimeType: params.mimeType,\n },\n options\n );\n }\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe from buffer';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = z.object({\n url: z.string().url().describe('The URL of the content to inscribe as Hashinal NFT'),\n name: z.string().describe('Name of the Hashinal NFT'),\n creator: z.string().describe('Creator account ID or name'),\n description: z.string().describe('Description of the Hashinal NFT'),\n type: z.string().describe('Type of NFT (e.g., \"image\", \"video\", \"audio\")'),\n attributes: z\n .array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n .optional()\n .describe('NFT attributes'),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Additional properties'),\n jsonFileURL: z\n .string()\n .url()\n .optional()\n .describe('URL to JSON metadata file'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the NFT'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool extends BaseInscriberQueryTool<typeof inscribeHashinalSchema> {\n name = 'inscribeHashinal';\n description = 'Inscribe content as a Hashinal NFT on the Hedera network';\n\n get specificInputSchema() {\n return inscribeHashinalSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const metadata = {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n properties: params.properties,\n };\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata,\n jsonFileURL: params.jsonFileURL,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Inscription timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise\n ]) as any;\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed Hashinal NFT on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe Hashinal NFT is now available.`;\n } else {\n return `Successfully submitted Hashinal NFT inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for retrieving inscription\n */\nconst retrieveInscriptionSchema = z.object({\n transactionId: z\n .string()\n .describe('The transaction ID of the inscription to retrieve'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for retrieving inscriptions\n */\nexport class RetrieveInscriptionTool extends BaseInscriberQueryTool<typeof retrieveInscriptionSchema> {\n name = 'retrieveInscription';\n description = 'Retrieve details of an existing inscription from the Hedera network';\n\n get specificInputSchema() {\n return retrieveInscriptionSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof retrieveInscriptionSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const result = await this.inscriberBuilder.retrieveInscription(\n params.transactionId,\n {\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n }\n );\n\n return {\n inscriptionId: (result as any).inscriptionId,\n transactionId: result.transactionId,\n topicId: (result as any).topic_id,\n status: result.status,\n holderId: (result as any).holderId,\n metadata: result.metadata,\n tags: (result as any).tags,\n mode: result.mode,\n chunks: (result as any).chunks,\n createdAt: (result as any).createdAt,\n completedAt: (result as any).completed || (result as any).completedAt,\n fileUrl: result.fileUrl,\n mimeType: (result as any).mimeType,\n fileSize: (result as any).fileSize,\n };\n }\n}","import {\n HCS10Client,\n AgentBuilder,\n Logger,\n} from '@hashgraphonline/standards-sdk';\nimport fs from 'fs';\nimport path from 'path';\nimport { ensureAgentHasEnoughHbar } from './ensure-agent-has-hbar';\n\nexport const ENV_FILE_PATH = path.join(process.cwd(), '.env');\n\nexport interface AgentData {\n accountId: string;\n operatorId: string;\n inboundTopicId: string;\n outboundTopicId: string;\n client: HCS10Client;\n}\n\nexport interface RegistrationProgressData {\n registered: boolean;\n accountId?: string;\n privateKey?: string;\n publicKey?: string;\n inboundTopicId?: string;\n outboundTopicId?: string;\n}\n\nexport async function getAgentFromEnv(\n logger: Logger,\n baseClient: HCS10Client,\n agentName: string,\n envPrefix: string\n): Promise<AgentData | null> {\n const accountIdEnvVar = `${envPrefix}_ACCOUNT_ID`;\n const privateKeyEnvVar = `${envPrefix}_PRIVATE_KEY`;\n const inboundTopicIdEnvVar = `${envPrefix}_INBOUND_TOPIC_ID`;\n const outboundTopicIdEnvVar = `${envPrefix}_OUTBOUND_TOPIC_ID`;\n\n const accountId = process.env[accountIdEnvVar];\n const privateKey = process.env[privateKeyEnvVar];\n const inboundTopicId = process.env[inboundTopicIdEnvVar];\n const outboundTopicId = process.env[outboundTopicIdEnvVar];\n\n if (!accountId || !privateKey || !inboundTopicId || !outboundTopicId) {\n logger.info(`${agentName} agent not found in environment variables`);\n return null;\n }\n\n logger.info(`${agentName} agent found in environment variables`);\n logger.info(`${agentName} account ID: ${accountId}`);\n logger.info(`${agentName} inbound topic ID: ${inboundTopicId}`);\n logger.info(`${agentName} outbound topic ID: ${outboundTopicId}`);\n\n const client = new HCS10Client({\n network: 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n guardedRegistryBaseUrl: process.env.REGISTRY_URL,\n prettyPrint: true,\n logLevel: 'debug',\n });\n\n await ensureAgentHasEnoughHbar(logger, baseClient, accountId, agentName);\n\n return {\n accountId,\n operatorId: `${inboundTopicId}@${accountId}`,\n inboundTopicId,\n outboundTopicId,\n client,\n };\n}\n\nexport async function createAgent(\n logger: Logger,\n baseClient: HCS10Client,\n agentName: string,\n agentBuilder: AgentBuilder,\n envPrefix: string\n): Promise<AgentData | null> {\n try {\n logger.info(`Creating ${agentName} agent...`);\n\n const result = await baseClient.createAndRegisterAgent(agentBuilder);\n\n if (!result.metadata) {\n logger.error(`${agentName} agent creation failed`);\n return null;\n }\n\n logger.info(`${agentName} agent created successfully`);\n logger.info(`${agentName} account ID: ${result.metadata.accountId}`);\n logger.info(`${agentName} private key: ${result.metadata.privateKey}`);\n logger.info(\n `${agentName} inbound topic ID: ${result.metadata.inboundTopicId}`\n );\n logger.info(\n `${agentName} outbound topic ID: ${result.metadata.outboundTopicId}`\n );\n\n const envVars = {\n [`${envPrefix}_ACCOUNT_ID`]: result.metadata.accountId,\n [`${envPrefix}_PRIVATE_KEY`]: result.metadata.privateKey,\n [`${envPrefix}_INBOUND_TOPIC_ID`]: result.metadata.inboundTopicId,\n [`${envPrefix}_OUTBOUND_TOPIC_ID`]: result.metadata.outboundTopicId,\n };\n\n await updateEnvFile(ENV_FILE_PATH, envVars);\n\n const client = new HCS10Client({\n network: 'testnet',\n operatorId: result.metadata.accountId,\n operatorPrivateKey: result.metadata.privateKey,\n guardedRegistryBaseUrl: process.env.REGISTRY_URL,\n prettyPrint: true,\n logLevel: 'debug',\n });\n\n return {\n accountId: result.metadata.accountId,\n operatorId: `${result.metadata.inboundTopicId}@${result.metadata.accountId}`,\n inboundTopicId: result.metadata.inboundTopicId,\n outboundTopicId: result.metadata.outboundTopicId,\n client,\n };\n } catch (error) {\n console.log('error', error, baseClient);\n logger.error(`Error creating ${agentName} agent:`, error);\n return null;\n }\n}\n\nexport async function updateEnvFile(\n envFilePath: string,\n variables: Record<string, string>\n): Promise<void> {\n let envContent = '';\n\n if (fs.existsSync(envFilePath)) {\n envContent = fs.readFileSync(envFilePath, 'utf8');\n }\n\n const envLines = envContent.split('\\n');\n const updatedLines = [...envLines];\n\n for (const [key, value] of Object.entries(variables)) {\n const lineIndex = updatedLines.findIndex((line) =>\n line.startsWith(`${key}=`)\n );\n\n if (lineIndex !== -1) {\n updatedLines[lineIndex] = `${key}=${value}`;\n } else {\n updatedLines.push(`${key}=${value}`);\n }\n }\n\n fs.writeFileSync(envFilePath, updatedLines.join('\\n'));\n}\n","import { updateEnvFile } from '../utils/state-tools';\nimport {\n RegisteredAgent,\n ActiveConnection,\n IStateManager,\n AgentPersistenceOptions,\n EnvFilePersistenceOptions,\n ConnectionStatus,\n} from './state-types';\nimport {\n ConnectionsManager,\n HCS10BaseClient,\n Connection,\n Logger,\n IConnectionsManager,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Implementation of the IStateManager interface for the OpenConvai system.\n * Manages agent state and connection information with thread safety and\n * proper timestamp tracking.\n */\nexport class OpenConvaiState implements IStateManager {\n private currentAgent: RegisteredAgent | null = null;\n private connectionMessageTimestamps: Record<string, number> = {};\n private defaultEnvFilePath?: string;\n private defaultPrefix: string;\n private connectionsManager: IConnectionsManager | null = null;\n private logger: Logger;\n\n /**\n * Creates a new OpenConvaiState instance\n * @param options - Options for environment variable persistence\n */\n constructor(options?: {\n defaultEnvFilePath?: string;\n defaultPrefix?: string;\n baseClient?: HCS10BaseClient;\n disableLogging?: boolean;\n }) {\n this.defaultEnvFilePath = options?.defaultEnvFilePath;\n this.defaultPrefix = options?.defaultPrefix ?? 'TODD';\n const shouldSilence = options?.disableLogging || process.env.DISABLE_LOGGING === 'true';\n this.logger = new Logger({ module: 'OpenConvaiState', silent: shouldSilence });\n\n // Initialize ConnectionsManager immediately if baseClient is provided\n if (options?.baseClient) {\n this.initializeConnectionsManager(options.baseClient);\n }\n }\n\n /**\n * Initializes the ConnectionsManager\n * @param baseClient - HCS10BaseClient instance to use\n */\n initializeConnectionsManager(\n baseClient: HCS10BaseClient\n ): IConnectionsManager {\n if (!this.connectionsManager) {\n this.logger.debug('Initializing ConnectionsManager');\n this.connectionsManager = new ConnectionsManager({\n baseClient,\n logLevel: 'error',\n });\n } else {\n this.logger.debug('ConnectionsManager already initialized');\n }\n return this.connectionsManager;\n }\n\n /**\n * Gets the ConnectionsManager instance\n * @returns The ConnectionsManager instance, or null if not initialized\n */\n getConnectionsManager(): IConnectionsManager | null {\n return this.connectionsManager;\n }\n\n /**\n * Sets the current active agent and clears any previous connection data.\n * This should be called when switching between agents.\n */\n setCurrentAgent(agent: RegisteredAgent | null): void {\n this.currentAgent = agent;\n this.connectionMessageTimestamps = {};\n\n // Clear connections manager when changing agents\n if (this.connectionsManager) {\n this.connectionsManager.clearAll();\n }\n }\n\n /**\n * Returns the currently active agent or null if none is set.\n */\n getCurrentAgent(): RegisteredAgent | null {\n return this.currentAgent;\n }\n\n /**\n * Adds a new connection to the active connections list.\n * Ensures no duplicates are added based on connectionTopicId.\n * Initializes timestamp tracking for the connection.\n */\n addActiveConnection(connection: ActiveConnection): void {\n if (!this.connectionsManager) {\n this.logger.error(\n 'ConnectionsManager not initialized. Call initializeConnectionsManager before adding connections.'\n );\n throw new Error(\n 'ConnectionsManager not initialized. Call initializeConnectionsManager before adding connections.'\n );\n }\n\n // Convert from ActiveConnection to Connection\n const sdkConnection: Connection = {\n connectionTopicId: connection.connectionTopicId,\n targetAccountId: connection.targetAccountId,\n targetAgentName: connection.targetAgentName,\n targetInboundTopicId: connection.targetInboundTopicId,\n status: this.convertConnectionStatus(connection.status || 'established'),\n isPending: connection.isPending || false,\n needsConfirmation: connection.needsConfirmation || false,\n created: connection.created || new Date(),\n lastActivity: connection.lastActivity,\n profileInfo: connection.profileInfo,\n connectionRequestId: connection.connectionRequestId,\n processed: true,\n };\n\n // Add to ConnectionsManager\n this.connectionsManager.updateOrAddConnection(sdkConnection);\n\n // Initialize timestamp tracking\n this.initializeTimestampIfNeeded(connection.connectionTopicId);\n }\n\n /**\n * Updates an existing connection or adds it if not found.\n * Preserves existing properties when updating by merging objects.\n */\n updateOrAddConnection(connection: ActiveConnection): void {\n this.addActiveConnection(connection);\n }\n\n /**\n * Returns a copy of all active connections.\n */\n listConnections(): ActiveConnection[] {\n if (!this.connectionsManager) {\n this.logger.debug(\n 'ConnectionsManager not initialized, returning empty connections list'\n );\n return [];\n }\n\n // Convert SDK Connections to ActiveConnection\n return this.connectionsManager\n .getAllConnections()\n .map((conn) => this.convertToActiveConnection(conn));\n }\n\n /**\n * Finds a connection by its identifier, which can be:\n * - A 1-based index as displayed in the connection list\n * - A target account ID string\n * - A connection topic ID string\n */\n getConnectionByIdentifier(identifier: string): ActiveConnection | undefined {\n if (!this.connectionsManager) {\n return undefined;\n }\n\n const connections = this.listConnections();\n\n // Check if it's a 1-based index\n const numericIndex = parseInt(identifier) - 1;\n if (\n !isNaN(numericIndex) &&\n numericIndex >= 0 &&\n numericIndex < connections.length\n ) {\n return connections[numericIndex];\n }\n\n // Check if it's a topic ID\n const byTopicId =\n this.connectionsManager.getConnectionByTopicId(identifier);\n if (byTopicId) {\n return this.convertToActiveConnection(byTopicId);\n }\n\n // Check if it's an account ID\n const byAccountId =\n this.connectionsManager.getConnectionByAccountId(identifier);\n if (byAccountId) {\n return this.convertToActiveConnection(byAccountId);\n }\n\n return undefined;\n }\n\n /**\n * Gets the last processed message timestamp for a connection.\n * Returns 0 if no timestamp has been recorded.\n */\n getLastTimestamp(connectionTopicId: string): number {\n return this.connectionMessageTimestamps[connectionTopicId] || 0;\n }\n\n /**\n * Updates the last processed message timestamp for a connection,\n * but only if the new timestamp is more recent than the existing one.\n */\n updateTimestamp(connectionTopicId: string, timestampNanos: number): void {\n // Initialize if this is first update and skip the comparison logic\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n return;\n }\n\n // Otherwise, only update if newer\n const currentTimestamp =\n this.connectionMessageTimestamps[connectionTopicId];\n if (timestampNanos > currentTimestamp) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n }\n }\n\n /**\n * Helper method to initialize timestamp tracking for a connection\n * if it doesn't already exist.\n */\n private initializeTimestampIfNeeded(connectionTopicId: string): void {\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] =\n Date.now() * 1_000_000;\n }\n }\n\n /**\n * Converts ConnectionStatus to SDK status format\n */\n private convertConnectionStatus(\n status: string\n ): 'pending' | 'established' | 'needs_confirmation' | 'closed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'established':\n return 'established';\n case 'needs confirmation':\n return 'needs_confirmation';\n default:\n return 'established';\n }\n }\n\n /**\n * Converts SDK Connection to ActiveConnection\n */\n private convertToActiveConnection(conn: Connection): ActiveConnection {\n return {\n targetAccountId: conn.targetAccountId,\n targetAgentName: conn.targetAgentName || `Agent ${conn.targetAccountId}`,\n targetInboundTopicId: conn.targetInboundTopicId || '',\n connectionTopicId: conn.connectionTopicId,\n status: this.convertToStateStatus(conn.status),\n created: conn.created,\n lastActivity: conn.lastActivity,\n isPending: conn.isPending,\n needsConfirmation: conn.needsConfirmation,\n profileInfo: conn.profileInfo,\n connectionRequestId: conn.connectionRequestId,\n };\n }\n\n /**\n * Converts SDK status to state status format\n */\n private convertToStateStatus(status: string): ConnectionStatus {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'established':\n return 'established';\n case 'needs_confirmation':\n return 'needs confirmation';\n case 'closed':\n return 'established'; // Mapping closed to established for compatibility\n default:\n return 'unknown';\n }\n }\n\n /**\n * Persists agent data to environment variables\n * @param agent - The agent data to persist\n * @param options - Environment file persistence options\n */\n async persistAgentData(\n agent: RegisteredAgent,\n options?: AgentPersistenceOptions\n ): Promise<void> {\n if (options?.type && options.type !== 'env-file') {\n throw new Error(\n `Unsupported persistence type: ${options.type}. Only 'env-file' is supported.`\n );\n }\n\n const envFilePath =\n (options as EnvFilePersistenceOptions)?.envFilePath ||\n this.defaultEnvFilePath ||\n process.env.ENV_FILE_PATH ||\n '.env';\n\n if (!envFilePath) {\n throw new Error(\n 'Environment file path could not be determined for agent data persistence'\n );\n }\n\n const prefix =\n (options as EnvFilePersistenceOptions)?.prefix || this.defaultPrefix;\n\n if (!agent.accountId || !agent.inboundTopicId || !agent.outboundTopicId) {\n throw new Error('Agent data incomplete, cannot persist to environment');\n }\n\n const updates: Record<string, string> = {\n [`${prefix}_ACCOUNT_ID`]: agent.accountId,\n [`${prefix}_INBOUND_TOPIC_ID`]: agent.inboundTopicId,\n [`${prefix}_OUTBOUND_TOPIC_ID`]: agent.outboundTopicId,\n };\n\n if (agent.privateKey) {\n updates[`${prefix}_PRIVATE_KEY`] = agent.privateKey;\n }\n\n if (agent.profileTopicId) {\n updates[`${prefix}_PROFILE_TOPIC_ID`] = agent.profileTopicId;\n }\n\n await updateEnvFile(envFilePath, updates);\n }\n}\n","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport { PrivateKey, TransactionReceipt } from '@hashgraph/sdk';\nimport { ActiveConnection, IStateManager } from '../../state/state-types';\nimport { ExecuteResult } from '../types';\nimport {\n FeeConfigBuilderInterface,\n FeeConfigBuilder,\n HCS10Client,\n AgentBuilder,\n InboundTopicType as StandardInboundTopicType,\n AIAgentCapability as StandardAIAgentCapability,\n AgentRegistrationResult,\n ProfileResponse as SDKProfileResponse,\n HCSMessage,\n LogLevel,\n Logger as SDKLogger,\n SocialPlatform,\n HandleConnectionRequestResponse,\n Connection,\n} from '@hashgraphonline/standards-sdk';\nimport fs from 'fs';\nimport path from 'path';\nimport axios from 'axios';\n\nconst NOT_INITIALIZED_ERROR = 'ConnectionsManager not initialized';\n\n/**\n * Internal agent data for registration\n */\ninterface AgentRegistrationData {\n name: string;\n bio?: string;\n alias?: string;\n type?: 'autonomous' | 'manual';\n model?: string;\n capabilities?: number[];\n creator?: string;\n socials?: Record<string, string>;\n properties?: Record<string, unknown>;\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n existingProfilePictureTopicId?: string;\n feeConfig?: FeeConfigBuilderInterface;\n}\n\n/**\n * Message response with timestamp\n */\nexport interface HCSMessageWithTimestamp extends Omit<HCSMessage, 'op'> {\n timestamp: number;\n data?: string;\n sequence_number: number;\n op?: HCSMessage['op'] | string;\n operator_id?: string;\n created?: Date;\n m?: string;\n}\n\n/**\n * Network type for HCS-10\n */\nexport type StandardNetworkType = 'mainnet' | 'testnet';\n\n/**\n * Parameters for agent registration\n */\nexport interface RegisterAgentParams {\n name: string;\n bio?: string;\n alias?: string;\n type?: 'autonomous' | 'manual';\n model?: string;\n capabilities?: number[];\n creator?: string;\n socials?: Record<string, string>;\n properties?: Record<string, unknown>;\n profilePicture?:\n | string\n | {\n url?: string;\n path?: string;\n filename?: string;\n };\n existingProfilePictureTopicId?: string;\n initialBalance?: number;\n userAccountId?: string;\n hbarFee?: number;\n tokenFees?: Array<{\n amount: number;\n tokenId: string;\n }>;\n exemptAccountIds?: string[];\n}\n\n/**\n * Parameters for initiating a connection\n */\nexport interface InitiateConnectionParams {\n targetAccountId: string;\n disableMonitor?: boolean;\n memo?: string;\n}\n\n/**\n * Parameters for accepting a connection request\n */\nexport interface AcceptConnectionParams {\n requestKey: string;\n hbarFee?: number | undefined;\n exemptAccountIds?: string[] | undefined;\n}\n\n/**\n * Parameters for sending a message\n */\nexport interface SendMessageParams {\n topicId: string;\n message: string;\n disableMonitoring?: boolean;\n}\n\n/**\n * Parameters for sending a message to a connected account\n */\nexport interface SendMessageToConnectionParams {\n targetIdentifier: string;\n message: string;\n disableMonitoring?: boolean;\n}\n\n/**\n * HCS10Builder facilitates HCS-10 protocol operations for agent communication\n * This builder incorporates all HCS10Client functionality directly\n */\nexport class HCS10Builder extends BaseServiceBuilder {\n private standardClient: HCS10Client;\n private stateManager: IStateManager | undefined;\n private executeResult?: ExecuteResult & { rawResult?: unknown };\n private useEncryption: boolean;\n private guardedRegistryBaseUrl: string;\n private network: StandardNetworkType;\n private sdkLogger: SDKLogger;\n\n constructor(\n hederaKit: HederaAgentKit,\n stateManager?: IStateManager,\n options?: {\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: LogLevel;\n }\n ) {\n super(hederaKit);\n this.stateManager = stateManager;\n this.useEncryption = options?.useEncryption || false;\n this.guardedRegistryBaseUrl = options?.registryUrl || '';\n\n const network = this.hederaKit.client.network;\n this.network = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n this.sdkLogger = new SDKLogger({\n module: 'HCS10Builder',\n level: options?.logLevel || 'info',\n });\n\n this.standardClient = new HCS10Client({\n network: this.network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\n guardedRegistryBaseUrl: this.guardedRegistryBaseUrl,\n logLevel: options?.logLevel || 'info',\n });\n\n if (this.stateManager) {\n this.stateManager.initializeConnectionsManager(this.standardClient);\n }\n }\n\n /**\n * Get the operator account ID\n */\n public getOperatorId(): string {\n const operator = this.standardClient.getClient().operatorAccountId;\n if (!operator) {\n throw new Error('Operator Account ID not configured in standard client.');\n }\n return operator.toString();\n }\n\n /**\n * Get the network type\n */\n public getNetwork(): StandardNetworkType {\n return this.network;\n }\n\n /**\n * Get state manager instance\n */\n public getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n /**\n * Get account and signer information\n */\n public getAccountAndSigner(): { accountId: string; signer: PrivateKey } {\n const result = this.standardClient.getAccountAndSigner();\n return {\n accountId: result.accountId,\n signer: result.signer as unknown as PrivateKey,\n };\n }\n\n /**\n * Get the inbound topic ID for the current operator\n */\n public async getInboundTopicId(): Promise<string> {\n try {\n const operatorId = this.getOperatorId();\n this.logger.info(\n `[HCS10Builder] Retrieving profile for operator ${operatorId} to find inbound topic...`\n );\n const profileResponse = await this.getAgentProfile(operatorId);\n if (profileResponse.success && profileResponse.topicInfo?.inboundTopic) {\n this.logger.info(\n `[HCS10Builder] Found inbound topic for operator ${operatorId}: ${profileResponse.topicInfo.inboundTopic}`\n );\n return profileResponse.topicInfo.inboundTopic;\n } else {\n throw new Error(\n `Could not retrieve inbound topic from profile for ${operatorId}. Profile success: ${profileResponse.success}, Error: ${profileResponse.error}`\n );\n }\n } catch (error) {\n this.logger.error(\n `[HCS10Builder] Error fetching operator's inbound topic ID (${this.getOperatorId()}):`,\n error\n );\n const operatorId = this.getOperatorId();\n let detailedMessage = `Failed to get inbound topic ID for operator ${operatorId}.`;\n if (\n error instanceof Error &&\n error.message.includes('does not have a valid HCS-11 memo')\n ) {\n detailedMessage += ` The account profile may not exist or is invalid. Please ensure this operator account (${operatorId}) is registered as an HCS-10 agent. You might need to register it first (e.g., using the 'register_agent' tool or SDK function).`;\n } else if (error instanceof Error) {\n detailedMessage += ` Reason: ${error.message}`;\n } else {\n detailedMessage += ` Unexpected error: ${String(error)}`;\n }\n throw new Error(detailedMessage);\n }\n }\n\n /**\n * Get agent profile\n */\n public async getAgentProfile(accountId: string): Promise<SDKProfileResponse> {\n try {\n return await this.standardClient.retrieveProfile(accountId);\n } catch (error) {\n this.logger.error(\n `[HCS10Builder] Error retrieving agent profile for account ${accountId}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Submit connection request\n */\n public async submitConnectionRequest(\n inboundTopicId: string,\n memo: string\n ): Promise<TransactionReceipt> {\n return this.standardClient.submitConnectionRequest(\n inboundTopicId,\n memo\n ) as Promise<TransactionReceipt>;\n }\n\n /**\n * Handle connection request\n */\n public async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionRequestId: number,\n feeConfig?: FeeConfigBuilderInterface\n ): Promise<HandleConnectionRequestResponse> {\n try {\n const result = await this.standardClient.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n\n if (\n result &&\n result.connectionTopicId &&\n typeof result.connectionTopicId === 'object' &&\n 'toString' in result.connectionTopicId\n ) {\n result.connectionTopicId = (\n result.connectionTopicId as { toString(): string }\n ).toString();\n }\n\n return result;\n } catch (error) {\n this.logger.error(\n `Error handling connection request #${connectionRequestId} for topic ${inboundTopicId}:`,\n error\n );\n throw new Error(\n `Failed to handle connection request: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Send message to a topic\n */\n public async sendMessage(\n topicId: string,\n data: string,\n memo?: string\n ): Promise<{\n sequenceNumber: number | undefined;\n receipt: TransactionReceipt;\n transactionId: string | undefined;\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to sendMessage: ${JSON.stringify(topicId)}`\n );\n }\n\n try {\n const messageResponse = await this.standardClient.sendMessage(\n topicId,\n data,\n memo,\n undefined\n );\n return {\n sequenceNumber: messageResponse.topicSequenceNumber?.toNumber(),\n receipt: messageResponse as unknown as TransactionReceipt,\n transactionId:\n 'transactionId' in messageResponse\n ? (\n messageResponse as { transactionId?: { toString(): string } }\n ).transactionId?.toString()\n : undefined,\n };\n } catch (error) {\n this.logger.error(`Error sending message to topic ${topicId}:`, error);\n throw new Error(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Get messages from a topic\n */\n public async getMessages(topicId: string): Promise<{\n messages: HCSMessageWithTimestamp[];\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to getMessages: ${JSON.stringify(topicId)}`\n );\n }\n\n try {\n const result = await this.standardClient.getMessages(topicId);\n\n const mappedMessages: HCSMessageWithTimestamp[] = result.messages.map(\n (sdkMessage) => {\n const timestamp = sdkMessage?.created?.getTime() || 0;\n\n return {\n ...sdkMessage,\n timestamp: timestamp,\n data: sdkMessage.data || '',\n sequence_number: sdkMessage.sequence_number,\n p: 'hcs-10' as const,\n } as HCSMessageWithTimestamp;\n }\n );\n mappedMessages.sort(\n (a: { timestamp: number }, b: { timestamp: number }) =>\n a.timestamp - b.timestamp\n );\n return { messages: mappedMessages };\n } catch (error) {\n this.logger.error(`Error getting messages from topic ${topicId}:`, error);\n return { messages: [] };\n }\n }\n\n /**\n * Get message stream from a topic\n */\n public async getMessageStream(topicId: string): Promise<{\n messages: HCSMessage[];\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to getMessageStream: ${JSON.stringify(\n topicId\n )}`\n );\n }\n\n return this.standardClient.getMessageStream(topicId) as Promise<{\n messages: HCSMessage[];\n }>;\n }\n\n /**\n * Get message content\n */\n public async getMessageContent(inscriptionIdOrData: string): Promise<string> {\n try {\n const content = await this.standardClient.getMessageContent(\n inscriptionIdOrData\n );\n return content as string;\n } catch (error) {\n this.logger.error(\n `Error retrieving message content for: ${inscriptionIdOrData}`,\n error\n );\n throw new Error(\n `Failed to retrieve message content: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Get the standard client instance (for compatibility)\n */\n public getStandardClient(): HCS10Client {\n return this.standardClient;\n }\n\n /**\n * Load profile picture from URL or file path\n */\n private async loadProfilePicture(\n profilePicture: string | { url?: string; path?: string; filename?: string }\n ): Promise<{ buffer: Buffer; filename: string } | null> {\n try {\n if (!profilePicture) {\n return null;\n }\n\n if (typeof profilePicture === 'string') {\n const isUrl =\n profilePicture.startsWith('http://') ||\n profilePicture.startsWith('https://');\n\n if (isUrl) {\n this.logger.info(\n `Loading profile picture from URL: ${profilePicture}`\n );\n const response = await axios.get(profilePicture, {\n responseType: 'arraybuffer',\n });\n const buffer = Buffer.from(response.data);\n const urlPathname = new URL(profilePicture).pathname;\n const filename = path.basename(urlPathname) || 'profile.png';\n return { buffer, filename };\n } else {\n if (!fs.existsSync(profilePicture)) {\n this.logger.warn(\n `Profile picture file not found: ${profilePicture}`\n );\n return null;\n }\n this.logger.info(\n `Loading profile picture from file: ${profilePicture}`\n );\n const buffer = fs.readFileSync(profilePicture);\n const filename = path.basename(profilePicture);\n return { buffer, filename };\n }\n } else if (profilePicture.url) {\n this.logger.info(\n `Loading profile picture from URL: ${profilePicture.url}`\n );\n const response = await axios.get(profilePicture.url, {\n responseType: 'arraybuffer',\n });\n const buffer = Buffer.from(response.data);\n const filename = profilePicture.filename || 'profile.png';\n return { buffer, filename };\n } else if (profilePicture.path) {\n if (!fs.existsSync(profilePicture.path)) {\n this.logger.warn(\n `Profile picture file not found: ${profilePicture.path}`\n );\n return null;\n }\n this.logger.info(\n `Loading profile picture from file: ${profilePicture.path}`\n );\n const buffer = fs.readFileSync(profilePicture.path);\n const filename =\n profilePicture.filename || path.basename(profilePicture.path);\n return { buffer, filename };\n }\n\n return null;\n } catch (error) {\n this.logger.error('Failed to load profile picture:', error);\n return null;\n }\n }\n\n /**\n * Create and register an agent\n */\n private async createAndRegisterAgent(\n data: AgentRegistrationData\n ): Promise<AgentRegistrationResult> {\n const builder = new AgentBuilder()\n .setName(data.name)\n .setBio(data.bio || '')\n .setCapabilities(\n data.capabilities || [StandardAIAgentCapability.TEXT_GENERATION]\n )\n .setType(data.type || 'autonomous')\n .setModel(data.model || 'agent-model-2024')\n .setNetwork(this.getNetwork())\n .setInboundTopicType(StandardInboundTopicType.PUBLIC);\n\n if (data.alias) {\n builder.setAlias(data.alias);\n }\n\n if (data.creator) {\n builder.setCreator(data.creator);\n }\n\n if (data?.feeConfig) {\n builder.setInboundTopicType(StandardInboundTopicType.FEE_BASED);\n builder.setFeeConfig(data.feeConfig);\n }\n\n if (data.existingProfilePictureTopicId) {\n builder.setExistingProfilePicture(data.existingProfilePictureTopicId);\n } else if (data.pfpBuffer && data.pfpFileName) {\n if (data.pfpBuffer.byteLength === 0) {\n this.logger.warn(\n 'Provided PFP buffer is empty. Skipping profile picture.'\n );\n } else {\n this.logger.info(\n `Setting profile picture: ${data.pfpFileName} (${data.pfpBuffer.byteLength} bytes)`\n );\n builder.setProfilePicture(data.pfpBuffer, data.pfpFileName);\n }\n } else {\n this.logger.warn(\n 'Profile picture not provided. Agent creation might fail if required by the underlying SDK builder.'\n );\n }\n\n if (data.socials) {\n Object.entries(data.socials).forEach(([platform, handle]) => {\n builder.addSocial(platform as SocialPlatform, handle);\n });\n }\n\n if (data.properties) {\n Object.entries(data.properties).forEach(([key, value]) => {\n builder.addProperty(key, value);\n });\n }\n\n try {\n const hasFees = Boolean(data?.feeConfig);\n const result = await this.standardClient.createAndRegisterAgent(builder, {\n initialBalance: hasFees ? 50 : 10,\n });\n return result;\n } catch (error) {\n this.logger.error('Error during agent creation/registration:', error);\n throw new Error(\n `Failed to create/register agent: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Register a new HCS-10 agent\n * Note: This performs multiple transactions and requires directExecution mode\n */\n public async registerAgent(params: RegisterAgentParams): Promise<this> {\n this.clearNotes();\n\n if (this.hederaKit.operationalMode === 'returnBytes') {\n throw new Error(\n 'Agent registration requires multiple transactions and cannot be performed in returnBytes mode. ' +\n 'Please use autonomous mode.'\n );\n }\n\n try {\n let profilePictureData: { buffer: Buffer; filename: string } | null =\n null;\n if (params.profilePicture) {\n profilePictureData = await this.loadProfilePicture(\n params.profilePicture\n );\n }\n\n const registrationData: AgentRegistrationData = {\n name: params.name,\n ...(params.bio !== undefined && { bio: params.bio }),\n ...(params.alias !== undefined && { alias: params.alias }),\n ...(params.type !== undefined && { type: params.type }),\n ...(params.model !== undefined && { model: params.model }),\n ...(params.capabilities !== undefined && {\n capabilities: params.capabilities,\n }),\n ...(params.creator !== undefined && { creator: params.creator }),\n ...(params.socials !== undefined && { socials: params.socials }),\n ...(params.properties !== undefined && {\n properties: params.properties,\n }),\n ...(params.existingProfilePictureTopicId !== undefined && {\n existingProfilePictureTopicId: params.existingProfilePictureTopicId,\n }),\n ...(profilePictureData?.buffer !== undefined && {\n pfpBuffer: profilePictureData.buffer,\n }),\n ...(profilePictureData?.filename !== undefined && {\n pfpFileName: profilePictureData.filename,\n }),\n };\n\n if (params.hbarFee && params.hbarFee > 0) {\n const feeConfigBuilder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n const { accountId: collectorAccountId } = this.getAccountAndSigner();\n if (!collectorAccountId) {\n throw new Error('Could not determine account ID for fee collection.');\n }\n this.addNote(\n `Setting the operator account (${collectorAccountId}) as the fee collector since no specific collector was provided.`\n );\n\n const effectiveExemptIds =\n params.exemptAccountIds?.filter(\n (id: string) => id !== collectorAccountId && id.startsWith('0.0')\n ) || [];\n\n registrationData.feeConfig = feeConfigBuilder.addHbarFee(\n params.hbarFee,\n collectorAccountId,\n effectiveExemptIds\n );\n }\n\n const result = await this.createAndRegisterAgent(registrationData);\n\n this.executeResult = {\n success: true,\n transactionId: result.transactionId,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n ...result,\n name: params.name,\n accountId:\n result?.metadata?.accountId ||\n result.state?.agentMetadata?.accountId,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to register agent:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Initiate a connection to another agent\n */\n public async initiateConnection(\n params: InitiateConnectionParams\n ): Promise<this> {\n this.clearNotes();\n\n try {\n const targetProfile = await this.getAgentProfile(params.targetAccountId);\n\n if (!targetProfile.success || !targetProfile.topicInfo?.inboundTopic) {\n throw new Error(\n `Could not retrieve inbound topic for target account ${params.targetAccountId}`\n );\n }\n\n const targetInboundTopicId = targetProfile.topicInfo.inboundTopic;\n let memo: string;\n if (params.memo !== undefined) {\n memo = params.memo;\n } else {\n memo = params.disableMonitor ? 'false' : 'true';\n this.addNote(\n `No custom memo was provided. Using default memo '${memo}' based on monitoring preference.`\n );\n }\n if (!params.disableMonitor) {\n this.addNote(\n `Monitoring will be enabled for this connection request as disableMonitor was not specified.`\n );\n }\n\n const result = await this.submitConnectionRequest(\n targetInboundTopicId,\n memo\n );\n\n this.executeResult = {\n success: true,\n transactionId:\n 'transactionId' in result\n ? (\n result as { transactionId?: { toString(): string } }\n ).transactionId?.toString()\n : undefined,\n receipt: result,\n scheduleId: undefined,\n rawResult: {\n targetAccountId: params.targetAccountId,\n targetInboundTopicId,\n connectionRequestSent: true,\n monitoringEnabled: !params.disableMonitor,\n ...result,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to initiate connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Accept a connection request\n * Note: This performs multiple transactions and requires directExecution mode\n */\n public async acceptConnection(params: AcceptConnectionParams): Promise<this> {\n this.clearNotes();\n\n if (this.hederaKit.operationalMode === 'returnBytes') {\n throw new Error(\n 'Accepting connections requires multiple transactions and cannot be performed in returnBytes mode. ' +\n 'Please use autonomous mode.'\n );\n }\n\n try {\n const currentAgent = this.stateManager?.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot accept connection request. No agent is currently active. Please register or select an agent first.'\n );\n }\n\n const connectionsManager = this.stateManager?.getConnectionsManager();\n if (!connectionsManager) {\n throw new Error(NOT_INITIALIZED_ERROR);\n }\n\n await connectionsManager.fetchConnectionData(currentAgent.accountId);\n\n const allRequests = [\n ...connectionsManager.getPendingRequests(),\n ...connectionsManager.getConnectionsNeedingConfirmation(),\n ];\n\n const request = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n\n if (!request) {\n throw new Error(\n `Request with key ${params.requestKey} not found or no longer pending.`\n );\n }\n\n if (!request.needsConfirmation || !request.inboundRequestId) {\n throw new Error(\n `Request with key ${params.requestKey} is not an inbound request that can be accepted.`\n );\n }\n\n const targetAccountId = request.targetAccountId;\n const inboundRequestId = request.inboundRequestId;\n\n let feeConfig: FeeConfigBuilderInterface | undefined;\n\n if (params.hbarFee && params.hbarFee > 0) {\n const feeConfigBuilder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n const { accountId: collectorAccountId } = this.getAccountAndSigner();\n if (!collectorAccountId) {\n throw new Error('Could not determine account ID for fee collection.');\n }\n this.addNote(\n `Setting the operator account (${collectorAccountId}) as the fee collector since no specific collector was provided.`\n );\n\n const effectiveExemptIds =\n params.exemptAccountIds?.filter(\n (id: string) => id !== collectorAccountId && id.startsWith('0.0')\n ) || [];\n\n feeConfig = feeConfigBuilder.addHbarFee(\n params.hbarFee,\n collectorAccountId,\n effectiveExemptIds\n );\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n const confirmationResult = await this.handleConnectionRequest(\n inboundTopicId,\n targetAccountId,\n inboundRequestId,\n feeConfig\n );\n\n let connectionTopicId = confirmationResult?.connectionTopicId;\n\n if (\n connectionTopicId &&\n typeof connectionTopicId === 'object' &&\n 'toString' in connectionTopicId\n ) {\n connectionTopicId = (\n connectionTopicId as unknown as { toString: () => string }\n )?.toString();\n }\n\n if (!connectionTopicId || typeof connectionTopicId !== 'string') {\n throw new Error(\n `Failed to create connection topic. Got: ${JSON.stringify(\n connectionTopicId\n )}`\n );\n }\n\n if (this.stateManager) {\n const targetAgentName =\n request.targetAgentName || `Agent ${targetAccountId}`;\n if (!request.targetAgentName) {\n this.addNote(\n `No agent name was provided in the connection request, using default name 'Agent ${targetAccountId}'.`\n );\n }\n\n let targetInboundTopicId = request.targetInboundTopicId || '';\n if (!targetInboundTopicId) {\n try {\n const targetProfile = await this.getAgentProfile(targetAccountId);\n if (\n targetProfile.success &&\n targetProfile.topicInfo?.inboundTopic\n ) {\n targetInboundTopicId = targetProfile.topicInfo.inboundTopic;\n }\n } catch (profileError) {\n this.logger.warn(\n `Could not fetch profile for ${targetAccountId}:`,\n profileError\n );\n }\n }\n\n const newConnection = {\n connectionId: `conn-${Date.now()}`,\n targetAccountId: targetAccountId,\n targetAgentName: targetAgentName,\n targetInboundTopicId: targetInboundTopicId,\n connectionTopicId: connectionTopicId,\n status: 'established' as const,\n created: new Date(),\n };\n this.stateManager.addActiveConnection(newConnection);\n\n connectionsManager.markConnectionRequestProcessed(\n request.targetInboundTopicId || '',\n inboundRequestId\n );\n }\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n targetAccountId,\n connectionTopicId,\n feeConfigured: !!params.hbarFee,\n hbarFee: params.hbarFee || 0,\n confirmationResult,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to accept connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Send a message using HCS (for operations that need direct topic access)\n */\n public async sendHCS10Message(params: SendMessageParams): Promise<this> {\n this.clearNotes();\n\n try {\n const result = await this.sendMessage(params.topicId, params.message);\n\n this.executeResult = {\n success: true,\n transactionId: result.transactionId,\n receipt: result.receipt,\n scheduleId: undefined,\n rawResult: result,\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n this.addNote(`Message sent to topic ${params.topicId}.`);\n } catch (error) {\n this.logger.error('Failed to send message:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Send a message to a connected account with optional response monitoring\n */\n public async sendMessageToConnection(\n params: SendMessageToConnectionParams\n ): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required to send messages to connections'\n );\n }\n\n try {\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot send message. No agent is currently active. Please register or select an agent first.'\n );\n }\n\n let connection: ActiveConnection | undefined;\n\n const identifier = params.targetIdentifier;\n\n if (identifier.includes('@')) {\n const parts = identifier.split('@');\n if (parts.length === 2) {\n const accountId = parts[1];\n connection = this.stateManager.getConnectionByIdentifier(accountId);\n\n if (!connection) {\n this.addNote(\n `Could not find connection using request key '${identifier}', extracted account ID '${accountId}'.`\n );\n }\n }\n }\n\n if (!connection) {\n connection = this.stateManager.getConnectionByIdentifier(identifier);\n }\n\n if (\n !connection &&\n !identifier.startsWith('0.0.') &&\n /^\\d+$/.test(identifier)\n ) {\n const accountIdWithPrefix = `0.0.${identifier}`;\n connection =\n this.stateManager.getConnectionByIdentifier(accountIdWithPrefix);\n if (connection) {\n this.addNote(\n `Found connection using account ID with prefix: ${accountIdWithPrefix}`\n );\n }\n }\n\n if (!connection && /^[1-9]\\d*$/.test(identifier)) {\n const connections = this.stateManager.listConnections();\n const index = parseInt(identifier) - 1;\n if (index >= 0 && index < connections.length) {\n connection = connections[index];\n if (connection) {\n this.addNote(\n `Found connection by index ${identifier}: ${connection.targetAccountId}`\n );\n }\n }\n }\n\n if (!connection) {\n const connections = this.stateManager.listConnections();\n const availableIds = connections.map(\n (c, i) =>\n `${i + 1}. ${c.targetAccountId} (Topic: ${c.connectionTopicId})`\n );\n\n let errorMsg = `Connection not found for identifier: \"${identifier}\"\\n`;\n errorMsg += `Available connections:\\n${\n availableIds.join('\\n') || 'No active connections'\n }`;\n errorMsg += `\\n\\nYou can use:\\n`;\n errorMsg += `- Connection number (e.g., \"1\", \"2\")\\n`;\n errorMsg += `- Account ID (e.g., \"0.0.6412936\")\\n`;\n errorMsg += `- Connection topic ID\\n`;\n errorMsg += `Use 'list_connections' to see all active connections.`;\n\n throw new Error(errorMsg);\n }\n\n let connectionTopicId = connection.connectionTopicId;\n if (\n connectionTopicId &&\n typeof connectionTopicId === 'object' &&\n 'toString' in connectionTopicId\n ) {\n connectionTopicId = (\n connectionTopicId as unknown as { toString: () => string }\n )?.toString();\n }\n\n if (!connectionTopicId || typeof connectionTopicId !== 'string') {\n throw new Error(\n `Invalid connection topic ID for ${\n connection.targetAccountId\n }: ${JSON.stringify(\n connectionTopicId\n )} (type: ${typeof connectionTopicId})`\n );\n }\n\n const targetAgentName = connection.targetAgentName;\n\n const operatorId = `${currentAgent.inboundTopicId}@${currentAgent.accountId}`;\n\n const messageResult = await this.sendMessage(\n connectionTopicId,\n params.message,\n `Agent message from ${currentAgent.name}`\n );\n\n if (!messageResult.sequenceNumber) {\n throw new Error('Failed to send message');\n }\n\n let reply: string | null = null;\n if (!params.disableMonitoring) {\n reply = await this.monitorResponses(\n connectionTopicId,\n operatorId,\n messageResult.sequenceNumber\n );\n } else {\n this.addNote(\n `Message sent successfully. Response monitoring was disabled.`\n );\n }\n\n this.executeResult = {\n success: true,\n transactionId: messageResult.transactionId,\n receipt: messageResult.receipt,\n scheduleId: undefined,\n rawResult: {\n targetAgentName,\n targetAccountId: connection.targetAccountId,\n connectionTopicId,\n sequenceNumber: messageResult.sequenceNumber,\n reply,\n monitoringEnabled: !params.disableMonitoring,\n message: params.message,\n messageResult,\n },\n };\n } catch (error) {\n this.logger.error('Failed to send message to connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Monitor responses on a topic after sending a message\n */\n private async monitorResponses(\n topicId: string,\n operatorId: string,\n sequenceNumber: number\n ): Promise<string | null> {\n const maxAttempts = 30;\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n const messages = await this.getMessageStream(topicId);\n\n for (const message of messages.messages) {\n if (\n message.sequence_number < sequenceNumber ||\n message.operator_id === operatorId\n ) {\n continue;\n }\n const content = await this.getMessageContent(message.data || '');\n return content;\n }\n } catch (error) {\n this.logger.error(`Error monitoring responses: ${error}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 4000));\n attempts++;\n }\n return null;\n }\n\n /**\n * Start passive monitoring for incoming connection requests\n * This method monitors continuously in the background\n */\n public async startPassiveConnectionMonitoring(): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required for passive monitoring');\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n this.logger.info(\n `Starting passive connection monitoring on topic ${inboundTopicId}...`\n );\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n inboundTopicId,\n message: `Started monitoring inbound topic ${inboundTopicId} for connection requests in the background.`,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n return this;\n }\n\n /**\n * Monitor for incoming connection requests\n */\n public async monitorConnections(params: {\n acceptAll?: boolean;\n targetAccountId?: string;\n monitorDurationSeconds?: number;\n hbarFees?: Array<{ amount: number; collectorAccount?: string }>;\n tokenFees?: Array<{\n amount: number;\n tokenId: string;\n collectorAccount?: string;\n }>;\n exemptAccountIds?: string[];\n defaultCollectorAccount?: string;\n }): Promise<this> {\n this.clearNotes();\n\n const {\n acceptAll = false,\n targetAccountId,\n monitorDurationSeconds = 120,\n hbarFees = [],\n tokenFees = [],\n exemptAccountIds = [],\n defaultCollectorAccount,\n } = params;\n\n if (!this.stateManager) {\n throw new Error('StateManager is required for connection monitoring');\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot monitor for connections. No agent is currently active.'\n );\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n const endTime = Date.now() + monitorDurationSeconds * 1000;\n const pollIntervalMs = 3000;\n let connectionRequestsFound = 0;\n let acceptedConnections = 0;\n const processedRequestIds = new Set<number>();\n\n while (Date.now() < endTime) {\n try {\n const messagesResult = await this.getMessages(inboundTopicId);\n const connectionRequests = messagesResult.messages.filter(\n (msg) =>\n msg.op === 'connection_request' &&\n typeof msg.sequence_number === 'number'\n );\n\n for (const request of connectionRequests) {\n const connectionRequestId = request.sequence_number;\n if (\n !connectionRequestId ||\n processedRequestIds.has(connectionRequestId)\n ) {\n continue;\n }\n\n const requestingAccountId = request.operator_id?.split('@')[1];\n if (!requestingAccountId) {\n continue;\n }\n\n connectionRequestsFound++;\n\n if (targetAccountId && requestingAccountId !== targetAccountId) {\n this.logger.info(\n `Skipping request from ${requestingAccountId} (not target account)`\n );\n continue;\n }\n\n if (acceptAll || targetAccountId === requestingAccountId) {\n this.logger.info(\n `Accepting connection request from ${requestingAccountId}`\n );\n\n let feeConfig;\n if (hbarFees.length > 0 || tokenFees.length > 0) {\n const builder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n for (const fee of hbarFees) {\n const collectorAccount =\n fee.collectorAccount ||\n defaultCollectorAccount ||\n this.getOperatorId();\n builder.addHbarFee(\n fee.amount,\n collectorAccount,\n exemptAccountIds\n );\n }\n\n for (const fee of tokenFees) {\n const collectorAccount =\n fee.collectorAccount ||\n defaultCollectorAccount ||\n this.getOperatorId();\n builder.addTokenFee(\n fee.amount,\n fee.tokenId,\n collectorAccount,\n undefined,\n exemptAccountIds\n );\n }\n\n feeConfig = builder;\n }\n\n await this.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n\n processedRequestIds.add(connectionRequestId);\n acceptedConnections++;\n }\n }\n } catch (error) {\n this.logger.error('Error during connection monitoring:', error);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n connectionRequestsFound,\n acceptedConnections,\n monitorDurationSeconds,\n processedRequestIds: Array.from(processedRequestIds),\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n this.addNote(\n `Monitoring completed. Found ${connectionRequestsFound} requests, accepted ${acceptedConnections}.`\n );\n\n return this;\n }\n\n /**\n * Manage connection requests (list, view, or reject)\n */\n public async manageConnectionRequests(params: {\n action: 'list' | 'view' | 'reject';\n requestKey?: string;\n }): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required for managing connection requests'\n );\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot manage connection requests. No agent is currently active.'\n );\n }\n\n const connectionsManager = this.stateManager.getConnectionsManager();\n if (!connectionsManager) {\n throw new Error(NOT_INITIALIZED_ERROR);\n }\n\n try {\n const { accountId } = this.getAccountAndSigner();\n await connectionsManager.fetchConnectionData(accountId);\n\n const pendingRequests = connectionsManager.getPendingRequests();\n const needsConfirmation =\n connectionsManager.getConnectionsNeedingConfirmation();\n const allRequests = [...pendingRequests, ...needsConfirmation];\n\n switch (params.action) {\n case 'list':\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n requests: allRequests.map((request, index) => ({\n index: index + 1,\n type: request.needsConfirmation ? 'incoming' : 'outgoing',\n requestKey:\n request.uniqueRequestKey ||\n `${\n request.connectionRequestId ||\n request.inboundRequestId ||\n 'unknown'\n }`,\n targetAccountId: request.targetAccountId,\n targetAgentName:\n request.targetAgentName || `Agent ${request.targetAccountId}`,\n created: request.created.toISOString(),\n memo: request.memo,\n bio: request.profileInfo?.bio,\n })),\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n\n case 'view': {\n if (!params.requestKey) {\n throw new Error('Request key is required for viewing a request');\n }\n const viewRequest = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n if (!viewRequest) {\n throw new Error(`Request with key ${params.requestKey} not found`);\n }\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n request: {\n type: viewRequest.needsConfirmation ? 'incoming' : 'outgoing',\n requestKey:\n viewRequest.uniqueRequestKey ||\n `${\n viewRequest.connectionRequestId ||\n viewRequest.inboundRequestId ||\n 'unknown'\n }`,\n targetAccountId: viewRequest.targetAccountId,\n targetAgentName:\n viewRequest.targetAgentName ||\n `Agent ${viewRequest.targetAccountId}`,\n created: viewRequest.created.toISOString(),\n memo: viewRequest.memo,\n profileInfo: viewRequest.profileInfo,\n },\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n }\n\n case 'reject': {\n if (!params.requestKey) {\n throw new Error('Request key is required for rejecting a request');\n }\n const rejectRequest = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n if (!rejectRequest) {\n throw new Error(`Request with key ${params.requestKey} not found`);\n }\n if (rejectRequest.inboundRequestId) {\n connectionsManager.markConnectionRequestProcessed(\n rejectRequest.targetInboundTopicId || '',\n rejectRequest.inboundRequestId\n );\n } else if (rejectRequest.connectionRequestId) {\n connectionsManager.markConnectionRequestProcessed(\n rejectRequest.originTopicId || '',\n rejectRequest.connectionRequestId\n );\n }\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n rejectedRequest: {\n requestKey: params.requestKey,\n targetAccountId: rejectRequest.targetAccountId,\n targetAgentName:\n rejectRequest.targetAgentName ||\n `Agent ${rejectRequest.targetAccountId}`,\n },\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n }\n }\n } catch (error) {\n this.logger.error('Failed to manage connection requests:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * List unapproved connection requests\n */\n public async listUnapprovedConnectionRequests(): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required for listing connection requests'\n );\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot list connection requests. No agent is currently active.'\n );\n }\n\n try {\n const inboundTopicId = await this.getInboundTopicId();\n const messages = await this.getMessages(inboundTopicId);\n\n const unapprovedRequests = messages.messages\n .filter(\n (msg): msg is HCSMessageWithTimestamp & { op: string } =>\n msg.op === 'connection_request'\n )\n .map((msg) => ({\n requestId: msg.sequence_number,\n fromAccountId: msg.operator_id?.split('@')[1] || 'unknown',\n timestamp: msg.timestamp || new Date(msg?.created || '').getTime(),\n memo: msg.m || '',\n data: msg.data,\n }))\n .filter(\n (req): req is typeof req & { fromAccountId: string } =>\n req.fromAccountId !== 'unknown'\n );\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n requests: unapprovedRequests,\n count: unapprovedRequests.length,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n if (unapprovedRequests.length === 0) {\n this.addNote('No unapproved connection requests found.');\n } else {\n this.addNote(\n `Found ${unapprovedRequests.length} unapproved connection request(s).`\n );\n }\n } catch (error) {\n this.logger.error(\n 'Failed to list unapproved connection requests:',\n error\n );\n throw error;\n }\n\n return this;\n }\n\n /**\n * List connections with enhanced details\n */\n public async listConnections(\n params: {\n includeDetails?: boolean;\n showPending?: boolean;\n } = {}\n ): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required to list connections');\n }\n\n const includeDetails = params.includeDetails ?? true;\n const showPending = params.showPending ?? true;\n\n try {\n const connections = await this.getEnhancedConnections();\n\n if (connections.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n connections: [],\n message: 'There are currently no active connections.',\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const activeConnections = connections.filter(\n (c): c is Connection => (c as Connection).status === 'established'\n );\n const pendingConnections = connections.filter(\n (c): c is Connection => (c as Connection).isPending\n );\n const needsConfirmation = connections.filter(\n (c): c is Connection => (c as Connection).needsConfirmation\n );\n\n let output = '';\n\n if (activeConnections.length > 0) {\n output += `🟢 Active Connections (${activeConnections.length}):\\n`;\n activeConnections.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n output += '\\n';\n }\n\n if (showPending && needsConfirmation.length > 0) {\n output += `🟠 Connections Needing Confirmation (${needsConfirmation.length}):\\n`;\n needsConfirmation.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n output += '\\n';\n }\n\n if (showPending && pendingConnections.length > 0) {\n output += `⚪ Pending Connection Requests (${pendingConnections.length}):\\n`;\n pendingConnections.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n connections,\n formattedOutput: output.trim(),\n activeCount: activeConnections.length,\n pendingCount: pendingConnections.length,\n needsConfirmationCount: needsConfirmation.length,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to list connections:', error);\n this.executeResult = {\n success: false,\n error: `Failed to list connections: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n private formatConnection(\n conn: unknown,\n index: number,\n includeDetails: boolean\n ): string {\n const connection = conn as {\n profileInfo?: { display_name?: string; bio?: string };\n targetAgentName?: string;\n targetAccountId?: string;\n isPending?: boolean;\n connectionTopicId?: string;\n status?: string;\n created?: Date;\n lastActivity?: Date;\n };\n\n let output = `${index + 1}. ${\n connection.profileInfo?.display_name ||\n connection.targetAgentName ||\n 'Unknown Agent'\n } (${connection.targetAccountId})\\n`;\n const displayTopicId = connection.isPending\n ? '(Pending Request)'\n : connection.connectionTopicId;\n output += ` Topic: ${displayTopicId}\\n`;\n const statusText = connection.status || 'unknown';\n output += ` Status: ${statusText}\\n`;\n\n if (includeDetails) {\n if (connection.profileInfo?.bio) {\n output += ` Bio: ${connection.profileInfo.bio.substring(0, 100)}${\n connection.profileInfo.bio.length > 100 ? '...' : ''\n }\\n`;\n }\n\n if (connection.created) {\n const createdLabel = connection.isPending\n ? 'Request sent'\n : 'Connection established';\n output += ` ${createdLabel}: ${connection.created.toLocaleString()}\\n`;\n }\n\n if (connection.lastActivity) {\n output += ` Last activity: ${connection.lastActivity.toLocaleString()}\\n`;\n }\n }\n\n return output;\n }\n\n private async getEnhancedConnections(): Promise<unknown[]> {\n try {\n const { accountId } = this.getAccountAndSigner();\n if (!accountId) {\n return this.stateManager!.listConnections();\n }\n\n const connectionManager = this.stateManager!.getConnectionsManager();\n if (!connectionManager) {\n this.logger.error(NOT_INITIALIZED_ERROR);\n return this.stateManager!.listConnections();\n }\n\n const connections = await connectionManager.fetchConnectionData(\n accountId\n );\n\n for (const connection of connections) {\n this.stateManager!.addActiveConnection(\n connection as unknown as ActiveConnection\n );\n }\n\n return connections;\n } catch (error) {\n this.logger.error('Failed to get enhanced connections:', error);\n return this.stateManager!.listConnections();\n }\n }\n\n /**\n * Check messages on a connection\n */\n public async checkMessages(params: {\n targetIdentifier: string;\n fetchLatest?: boolean;\n lastMessagesCount?: number;\n }): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required to check messages');\n }\n\n const connection = this.stateManager.getConnectionByIdentifier(\n params.targetIdentifier\n );\n\n if (!connection) {\n this.executeResult = {\n success: false,\n error: `Could not find an active connection matching identifier \"${params.targetIdentifier}\". Use 'list_connections' to see active connections.`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const connectionTopicId = connection.connectionTopicId || '';\n\n if (!connectionTopicId || !connectionTopicId.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n this.logger.error(\n `Invalid connection topic ID format: ${connectionTopicId}`\n );\n this.executeResult = {\n success: false,\n error: `Invalid connection topic ID format: ${connectionTopicId}. Expected format: 0.0.XXXXX`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const targetAgentName = connection.targetAgentName;\n const lastProcessedTimestamp =\n this.stateManager.getLastTimestamp(connectionTopicId);\n\n this.logger.info(\n `Checking messages for connection with ${targetAgentName} (${connection.targetAccountId}) on topic ${connectionTopicId} (fetchLatest: ${params.fetchLatest}, lastCount: ${params.lastMessagesCount}, since: ${lastProcessedTimestamp})`\n );\n\n try {\n const result = await this.getMessages(connectionTopicId);\n const allMessages = result.messages;\n\n if (!allMessages || allMessages.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n messages: [],\n message: `No messages found on connection topic ${connectionTopicId}.`,\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n let messagesToProcess: HCSMessageWithTimestamp[] = [];\n let latestTimestampNanos = lastProcessedTimestamp;\n const isFetchingLatest = params.fetchLatest === true;\n\n if (isFetchingLatest) {\n this.logger.info('Fetching latest messages regardless of timestamp.');\n const count = params.lastMessagesCount ?? 1;\n messagesToProcess = allMessages.slice(-count);\n } else {\n this.logger.info(\n `Filtering for messages newer than ${lastProcessedTimestamp}`\n );\n messagesToProcess = allMessages.filter(\n (msg: HCSMessageWithTimestamp) => {\n const msgTimestampNanos = msg.timestamp * 1_000_000;\n return msgTimestampNanos > lastProcessedTimestamp;\n }\n );\n\n if (messagesToProcess.length > 0) {\n latestTimestampNanos = messagesToProcess.reduce(\n (maxTs, msg) => Math.max(maxTs, msg.timestamp * 1_000_000),\n lastProcessedTimestamp\n );\n }\n }\n\n if (messagesToProcess.length === 0) {\n const message = isFetchingLatest\n ? `Could not retrieve the latest message(s). No messages found on topic ${connectionTopicId}.`\n : `No new messages found for connection with ${targetAgentName} since last check.`;\n\n this.executeResult = {\n success: true,\n rawResult: {\n messages: [],\n message,\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n this.logger.info(`Processing ${messagesToProcess.length} message(s).`);\n\n let outputString = isFetchingLatest\n ? `Latest message(s) from ${targetAgentName}:\\n`\n : `New messages from ${targetAgentName}:\\n`;\n\n const processedMessages: Array<{\n timestamp: number;\n sequenceNumber: number;\n content: string | undefined;\n raw: HCSMessageWithTimestamp;\n }> = [];\n\n for (const msg of messagesToProcess) {\n let content = msg.data;\n try {\n if (typeof content === 'string' && content.startsWith('hcs://')) {\n this.logger.debug(`Resolving inscribed message: ${content}`);\n content = await this.getMessageContent(content);\n this.logger.debug(`Resolved content length: ${content?.length}`);\n }\n\n let displayContent = content;\n try {\n const parsed = JSON.parse(content || '{}');\n if (\n parsed.p === 'hcs-10' &&\n parsed.op === 'message' &&\n parsed.data\n ) {\n const senderOpId = parsed.operator_id || 'unknown_sender';\n displayContent = `[${senderOpId}]: ${parsed.data}`;\n } else {\n displayContent = content;\n }\n } catch {\n displayContent = content;\n }\n\n const messageDate = new Date(msg.timestamp);\n outputString += `\\n[${messageDate.toLocaleString()}] (Seq: ${\n msg.sequence_number\n })\\n${displayContent}\\n`;\n\n processedMessages.push({\n timestamp: msg.timestamp,\n sequenceNumber: msg.sequence_number,\n content: displayContent,\n raw: msg,\n });\n } catch (error) {\n const errorMsg = `Error processing message (Seq: ${\n msg.sequence_number\n }): ${error instanceof Error ? error.message : String(error)}`;\n this.logger.error(errorMsg);\n outputString += `\\n[Error processing message Seq: ${msg.sequence_number}]\\n`;\n }\n }\n\n if (!isFetchingLatest && latestTimestampNanos > lastProcessedTimestamp) {\n this.logger.debug(\n `Updating timestamp for topic ${connectionTopicId} to ${latestTimestampNanos}`\n );\n this.stateManager.updateTimestamp(\n connectionTopicId,\n latestTimestampNanos\n );\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n messages: processedMessages,\n formattedOutput: outputString.trim(),\n targetAgentName,\n connectionTopicId,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error(\n `Failed to check messages for topic ${connectionTopicId}: ${error}`\n );\n this.executeResult = {\n success: false,\n error: `Error checking messages for ${targetAgentName}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Find registrations using the configured registry\n */\n public async findRegistrations(params: {\n accountId?: string;\n tags?: number[];\n }): Promise<this> {\n this.clearNotes();\n\n try {\n const options: {\n network: StandardNetworkType;\n accountId?: string;\n tags?: number[];\n } = {\n network: this.network,\n };\n\n if (params.accountId) {\n options.accountId = params.accountId;\n }\n\n if (params.tags && params.tags.length > 0) {\n options.tags = params.tags;\n }\n\n const result = await this.standardClient.findRegistrations(options);\n\n if (!result.success || result.error) {\n this.executeResult = {\n success: false,\n error: `Error finding registrations: ${\n result.error || 'Unknown error'\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n if (!result.registrations || result.registrations.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n registrations: [],\n message: 'No registrations found matching the criteria.',\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const formattedRegistrations = result.registrations\n .map((reg: unknown): string => {\n const registration = reg as {\n agent?: { name?: string; capabilities?: string[] };\n accountId?: string;\n };\n const agentName = registration.agent?.name || 'Unknown Agent';\n const accountId = registration.accountId || 'Unknown Account';\n const capabilities =\n registration.agent?.capabilities?.join(', ') || 'None';\n\n return `Agent: ${agentName} (${accountId}), Capabilities: ${capabilities}`;\n })\n .join('\\\\n');\n\n this.executeResult = {\n success: true,\n rawResult: {\n registrations: result.registrations,\n formattedOutput: `Found ${result.registrations.length} registration(s):\\\\n${formattedRegistrations}`,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Error during FindRegistrations execution:', error);\n this.executeResult = {\n success: false,\n error: `Failed to search registrations: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Retrieve detailed profile information for an agent\n */\n public async retrieveProfile(params: {\n accountId: string;\n disableCache?: boolean;\n }): Promise<this> {\n this.clearNotes();\n\n try {\n const profileResponse = await this.standardClient.retrieveProfile(\n params.accountId,\n params.disableCache || false\n );\n\n if (!profileResponse.success) {\n this.executeResult = {\n success: false,\n error: `Failed to retrieve profile: ${\n profileResponse.error || 'Unknown error'\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const profile = profileResponse.profile;\n const topicInfo = profileResponse.topicInfo;\n\n let profileDetails = `Profile for ${params.accountId}:\\n`;\n profileDetails += `Name: ${profile.name || 'Unknown'}\\n`;\n profileDetails += `Bio: ${profile.bio || 'No bio provided'}\\n`;\n profileDetails += `Type: ${profile.type || 'Unknown'}\\n`;\n profileDetails += `Model: ${profile.model || 'Unknown'}\\n`;\n\n if (profile.capabilities && profile.capabilities.length > 0) {\n profileDetails += `Capabilities: ${profile.capabilities.join(', ')}\\n`;\n } else {\n profileDetails += `Capabilities: None listed\\n`;\n }\n\n if (topicInfo) {\n profileDetails += `Inbound Topic: ${\n topicInfo.inboundTopic || 'Unknown'\n }\\n`;\n profileDetails += `Outbound Topic: ${\n topicInfo.outboundTopic || 'Unknown'\n }\\n`;\n profileDetails += `Profile Topic: ${\n topicInfo.profileTopicId || 'Unknown'\n }\\n`;\n }\n\n if (profile.social && Object.keys(profile.social).length > 0) {\n profileDetails += `Social: ${Object.entries(profile.social)\n .map(\n ([platform, handle]: [string, unknown]): string =>\n `${platform}: ${handle}`\n )\n .join(', ')}\\n`;\n }\n\n if (profile.properties && Object.keys(profile.properties).length > 0) {\n profileDetails += `Properties: ${JSON.stringify(profile.properties)}\\n`;\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n profileDetails,\n rawProfile: profileResponse,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error(\n `Unexpected error retrieving profile for ${params.accountId}:`,\n error\n );\n this.executeResult = {\n success: false,\n error: `Unexpected error retrieving profile for ${params.accountId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Override execute to return stored HCS10 operation results\n */\n public override async execute(): Promise<ExecuteResult> {\n if (this.executeResult) {\n return {\n success: this.executeResult.success,\n transactionId: this.executeResult.transactionId,\n receipt: this.executeResult.receipt,\n scheduleId: this.executeResult.scheduleId,\n error: this.executeResult.error,\n rawResult: this.executeResult.rawResult,\n notes: this.notes,\n } as ExecuteResult & { rawResult?: unknown; notes?: string[] };\n }\n\n return {\n success: false,\n error: 'No operation result available. Call a builder method first.',\n };\n }\n}\n","// Re-export the HBAR price tool from hedera-agent-kit\nexport { HederaGetHbarPriceTool as GetHbarPriceTool } from 'hedera-agent-kit';\n\nimport { BasePlugin, GenericPluginContext, HederaTool, HederaAgentKit } from 'hedera-agent-kit';\nimport { HederaGetHbarPriceTool } from 'hedera-agent-kit';\n\n/**\n * Plugin to provide tools related to Hedera network information, like HBAR price.\n * Uses the built-in HederaGetHbarPriceTool from hedera-agent-kit.\n */\nexport class HbarPricePlugin extends BasePlugin<GenericPluginContext> {\n id = 'hedera-hbar-price';\n name = 'Hedera HBAR Price Plugin';\n description = 'Provides tools to interact with Hedera network data, specifically HBAR price.';\n version = '1.0.0';\n author = 'Hashgraph Online';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n this.initializeTools();\n }\n\n private initializeTools(): void {\n this.tools = [\n new HederaGetHbarPriceTool({\n hederaKit: this.context.config.hederaKit as HederaAgentKit,\n logger: this.context.logger\n })\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n}","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n HCS2Client,\n SDKHCS2ClientConfig,\n CreateRegistryOptions,\n RegisterEntryOptions,\n UpdateEntryOptions,\n DeleteEntryOptions,\n MigrateTopicOptions,\n QueryRegistryOptions,\n TopicRegistrationResponse,\n RegistryOperationResponse,\n TopicRegistry,\n NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Builder for HCS-2 operations that delegates to HCS2Client\n */\nexport class HCS2Builder extends BaseServiceBuilder {\n protected hcs2Client?: HCS2Client;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Get or create HCS-2 client\n */\n protected async getHCS2Client(): Promise<HCS2Client> {\n if (!this.hcs2Client) {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const config: SDKHCS2ClientConfig = {\n network: networkType,\n operatorId: operatorId,\n operatorKey: operatorPrivateKey,\n };\n\n this.hcs2Client = new HCS2Client(config);\n }\n return this.hcs2Client;\n }\n\n /**\n * Create a new HCS-2 registry\n * Note: This executes the transaction directly via HCS2Client\n */\n async createRegistry(\n options: CreateRegistryOptions = {}\n ): Promise<TopicRegistrationResponse> {\n const client = await this.getHCS2Client();\n return await client.createRegistry(options);\n }\n\n /**\n * Register a new entry in an HCS-2 registry\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.registerEntry(registryTopicId, options);\n }\n\n /**\n * Update an existing entry in an HCS-2 registry\n */\n async updateEntry(\n registryTopicId: string,\n options: UpdateEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.updateEntry(registryTopicId, options);\n }\n\n /**\n * Delete an entry from an HCS-2 registry\n */\n async deleteEntry(\n registryTopicId: string,\n options: DeleteEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.deleteEntry(registryTopicId, options);\n }\n\n /**\n * Migrate an HCS-2 registry to a new topic\n */\n async migrateRegistry(\n registryTopicId: string,\n options: MigrateTopicOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.migrateRegistry(registryTopicId, options);\n }\n\n /**\n * Query entries from an HCS-2 registry\n */\n async getRegistry(\n topicId: string,\n options: QueryRegistryOptions = {}\n ): Promise<TopicRegistry> {\n const client = await this.getHCS2Client();\n return await client.getRegistry(topicId, options);\n }\n\n /**\n * Submit a raw message to an HCS-2 topic\n */\n async submitMessage(\n topicId: string,\n payload: any\n ): Promise<any> {\n const client = await this.getHCS2Client();\n return await client.submitMessage(topicId, payload);\n }\n\n /**\n * Get topic info from mirror node\n */\n async getTopicInfo(topicId: string): Promise<any> {\n const client = await this.getHCS2Client();\n return await client.getTopicInfo(topicId);\n }\n\n /**\n * Close the HCS-2 client\n */\n async close(): Promise<void> {\n if (this.hcs2Client) {\n this.hcs2Client.close();\n this.hcs2Client = undefined;\n }\n }\n}","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n inscribe,\n inscribeWithSigner,\n retrieveInscription,\n InscriptionInput,\n InscriptionOptions,\n InscriptionResponse,\n RetrievedInscriptionResult,\n HederaClientConfig,\n NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Type definition for DAppSigner since we don't have the actual package\n */\ninterface DAppSigner {\n getAccountId(): { toString(): string };\n}\n\n/**\n * Type definition for InscriptionSDK since we don't have the actual package\n */\ninterface InscriptionSDK {\n inscribeAndExecute(request: any, config: any): Promise<any>;\n inscribe(request: any, signer: any): Promise<any>;\n waitForInscription(txId: string, maxAttempts: number, intervalMs: number, checkCompletion: boolean, progressCallback?: Function): Promise<any>;\n}\n\n/**\n * Builder for Inscription operations\n */\nexport class InscriberBuilder extends BaseServiceBuilder {\n protected inscriptionSDK?: InscriptionSDK;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Get or create Inscription SDK - temporarily returns null since we don't have the actual SDK\n */\n protected async getInscriptionSDK(\n options: InscriptionOptions\n ): Promise<InscriptionSDK | null> {\n return null;\n }\n\n /**\n * Inscribe content using server-side authentication\n */\n async inscribe(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const clientConfig: HederaClientConfig = {\n accountId: operatorId,\n privateKey: operatorPrivateKey,\n network: networkType,\n };\n\n return await inscribe(input, clientConfig, options);\n }\n\n /**\n * Inscribe content using a DApp signer\n */\n async inscribeWithSigner(\n input: InscriptionInput,\n signer: DAppSigner,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n return await inscribeWithSigner(input, signer as any, options);\n }\n\n /**\n * Retrieve an existing inscription\n */\n async retrieveInscription(\n transactionId: string,\n options: InscriptionOptions\n ): Promise<RetrievedInscriptionResult> {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n return await retrieveInscription(transactionId, {\n ...options,\n accountId: operatorId,\n privateKey: operatorPrivateKey,\n });\n }\n\n /**\n * Close the inscription SDK\n */\n async close(): Promise<void> {\n this.inscriptionSDK = undefined;\n }\n}","import { TransactionReceipt, PrivateKey } from '@hashgraph/sdk';\nimport {\n HCS10Client as StandardSDKClient,\n AgentBuilder,\n InboundTopicType as StandardInboundTopicType,\n AIAgentCapability as StandardAIAgentCapability,\n AgentRegistrationResult,\n WaitForConnectionConfirmationResponse,\n ProfileResponse as SDKProfileResponse,\n HCSMessage,\n LogLevel,\n Logger,\n FeeConfigBuilderInterface,\n SocialPlatform,\n} from '@hashgraphonline/standards-sdk';\nimport { AgentMetadata, AgentChannels } from './types';\nimport { encryptMessage } from '../utils/Encryption';\nimport { IStateManager } from '../state/state-types';\n\n// Keep type alias as they were removed accidentally\ntype StandardHandleConnectionRequest = InstanceType<\n typeof StandardSDKClient\n>['handleConnectionRequest'];\ntype HandleConnectionRequestResponse = Awaited<\n ReturnType<StandardHandleConnectionRequest>\n>;\nexport type StandardNetworkType = 'mainnet' | 'testnet';\n\nexport interface ClientValidationOptions {\n accountId: string;\n privateKey: string;\n network?: StandardNetworkType;\n stateManager?: IStateManager;\n}\n\nexport interface HCSMessageWithTimestamp extends HCSMessage {\n timestamp: number;\n data?: string;\n sequence_number: number;\n}\n\nexport interface ExtendedAgentMetadata extends AgentMetadata {\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n feeConfig?: FeeConfigBuilderInterface;\n}\n\n/**\n * HCS10Client wraps the HCS-10 functionalities using the @hashgraphonline/standards-sdk.\n * - Creates and registers agents using the standard SDK flow.\n * - Manages agent communication channels (handled by standard SDK).\n * - Sends messages on Hedera topics (currently manual, potential for standard SDK integration).\n */\nexport class HCS10Client {\n public standardClient: StandardSDKClient;\n private useEncryption: boolean;\n public agentChannels?: AgentChannels;\n public guardedRegistryBaseUrl: string;\n public logger: Logger;\n\n constructor(\n operatorId: string,\n operatorPrivateKey: string,\n network: StandardNetworkType,\n options?: {\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: LogLevel;\n }\n ) {\n this.standardClient = new StandardSDKClient({\n network: network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\n guardedRegistryBaseUrl: options?.registryUrl,\n logLevel: options?.logLevel,\n });\n this.guardedRegistryBaseUrl = options?.registryUrl || '';\n this.useEncryption = options?.useEncryption || false;\n const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n this.logger = new Logger({\n level: options?.logLevel || 'info',\n silent: shouldSilence,\n });\n }\n\n public getOperatorId(): string {\n const operator = this.standardClient.getClient().operatorAccountId;\n if (!operator) {\n throw new Error('Operator Account ID not configured in standard client.');\n }\n return operator.toString();\n }\n\n public getNetwork(): StandardNetworkType {\n return this.standardClient.getNetwork() as StandardNetworkType;\n }\n\n public async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionRequestId: number,\n feeConfig?: FeeConfigBuilderInterface\n ): Promise<HandleConnectionRequestResponse> {\n try {\n const result = await this.standardClient.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n return result;\n } catch (error) {\n this.logger.error(\n `Error handling connection request #${connectionRequestId} for topic ${inboundTopicId}:`,\n error\n );\n throw new Error(\n `Failed to handle connection request: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves the profile for a given account ID using the standard SDK.\n */\n public async getAgentProfile(accountId: string): Promise<SDKProfileResponse> {\n return this.standardClient.retrieveProfile(accountId);\n }\n\n /**\n * Exposes the standard SDK's submitConnectionRequest method.\n */\n public async submitConnectionRequest(\n inboundTopicId: string,\n memo: string\n ): Promise<TransactionReceipt> {\n return this.standardClient.submitConnectionRequest(\n inboundTopicId,\n memo\n ) as Promise<TransactionReceipt>;\n }\n\n /**\n * Exposes the standard SDK's waitForConnectionConfirmation method.\n */\n public async waitForConnectionConfirmation(\n outboundTopicId: string,\n connectionRequestId: number,\n maxAttempts = 60,\n delayMs = 2000\n ): Promise<WaitForConnectionConfirmationResponse> {\n return this.standardClient.waitForConnectionConfirmation(\n outboundTopicId,\n connectionRequestId,\n maxAttempts,\n delayMs\n );\n }\n\n /**\n * Creates and registers an agent using the standard SDK's HCS10Client.\n * This handles account creation, key generation, topic setup, and registration.\n *\n * When metadata includes fee configuration:\n * 1. The properties.feeConfig will be passed to the AgentBuilder\n * 2. The properties.inboundTopicType will be set to FEE_BASED\n * 3. The SDK's createAndRegisterAgent will apply the fees to the agent's inbound topic\n *\n * @param metadata - The agent's metadata, potentially including pfpBuffer, pfpFileName,\n * and fee configuration in properties.feeConfig\n * @returns The registration result from the standard SDK, containing accountId, keys, topics etc.\n */\n public async createAndRegisterAgent(\n metadata: ExtendedAgentMetadata\n ): Promise<AgentRegistrationResult> {\n const builder = new AgentBuilder()\n .setName(metadata.name)\n .setBio(metadata.description || '')\n .setCapabilities(\n metadata.capabilities\n ? metadata.capabilities\n : [StandardAIAgentCapability.TEXT_GENERATION]\n )\n .setType((metadata.type || 'autonomous') as 'autonomous' | 'manual')\n .setModel(metadata.model || 'agent-model-2024')\n .setNetwork(this.getNetwork())\n .setInboundTopicType(StandardInboundTopicType.PUBLIC);\n\n if (metadata?.feeConfig) {\n builder.setInboundTopicType(StandardInboundTopicType.FEE_BASED);\n builder.setFeeConfig(metadata.feeConfig);\n }\n\n if (metadata.pfpBuffer && metadata.pfpFileName) {\n if (metadata.pfpBuffer.byteLength === 0) {\n this.logger.warn(\n 'Provided PFP buffer is empty. Skipping profile picture.'\n );\n } else {\n this.logger.info(\n `Setting profile picture: ${metadata.pfpFileName} (${metadata.pfpBuffer.byteLength} bytes)`\n );\n builder.setProfilePicture(metadata.pfpBuffer, metadata.pfpFileName);\n }\n } else {\n this.logger.warn(\n 'Profile picture not provided in metadata. Agent creation might fail if required by the underlying SDK builder.'\n );\n }\n\n if (metadata.social) {\n Object.entries(metadata.social).forEach(([platform, handle]) => {\n builder.addSocial(platform as SocialPlatform, handle);\n });\n }\n\n if (metadata.properties) {\n Object.entries(metadata.properties).forEach(([key, value]) => {\n builder.addProperty(key, value);\n });\n }\n\n try {\n const hasFees = Boolean(metadata?.feeConfig);\n const result = await this.standardClient.createAndRegisterAgent(builder, {\n initialBalance: hasFees ? 50 : undefined,\n });\n if (\n result?.metadata?.inboundTopicId &&\n result?.metadata?.outboundTopicId\n ) {\n this.agentChannels = {\n inboundTopicId: result.metadata.inboundTopicId,\n outboundTopicId: result.metadata.outboundTopicId,\n };\n }\n return result;\n } catch (error) {\n this.logger.error('Error during agent creation/registration:', error);\n throw new Error(\n `Failed to create/register agent: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Sends a structured HCS-10 message to the specified topic using the standard SDK client.\n * Handles potential inscription for large messages.\n *\n * @param topicId - The target topic ID (likely a connection topic).\n * @param operatorId - The operator ID string (e.g., \"inboundTopic@accountId\").\n * @param data - The actual message content/data.\n * @param memo - Optional memo for the message.\n * @param submitKey - Optional private key for topics requiring specific submit keys.\n * @returns A confirmation status string from the transaction receipt.\n */\n public async sendMessage(\n topicId: string,\n data: string,\n memo?: string,\n submitKey?: PrivateKey\n ): Promise<number | undefined> {\n if (this.useEncryption) {\n data = encryptMessage(data);\n }\n\n try {\n const messageResponse = await this.standardClient.sendMessage(\n topicId,\n data,\n memo,\n submitKey\n );\n return messageResponse.topicSequenceNumber?.toNumber();\n } catch (error) {\n this.logger.error(`Error sending message to topic ${topicId}:`, error);\n throw new Error(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves messages from a topic using the standard SDK client.\n *\n * @param topicId - The topic ID to get messages from.\n * @returns Messages from the topic, mapped to the expected format.\n */\n public async getMessages(topicId: string): Promise<{\n messages: HCSMessageWithTimestamp[];\n }> {\n try {\n const result = await this.standardClient.getMessages(topicId);\n\n const mappedMessages = result.messages.map((sdkMessage) => {\n const timestamp = sdkMessage?.created?.getTime() || 0;\n\n return {\n ...sdkMessage,\n timestamp: timestamp,\n data: sdkMessage.data,\n sequence_number: sdkMessage.sequence_number,\n };\n });\n mappedMessages.sort(\n (a: { timestamp: number }, b: { timestamp: number }) =>\n a.timestamp - b.timestamp\n );\n return { messages: mappedMessages as HCSMessageWithTimestamp[] };\n } catch (error) {\n this.logger.error(`Error getting messages from topic ${topicId}:`, error);\n return { messages: [] };\n }\n }\n\n public async getMessageStream(topicId: string): Promise<{\n messages: HCSMessage[];\n }> {\n const result = this.standardClient.getMessageStream(topicId);\n return result as Promise<{ messages: HCSMessage[] }>;\n }\n\n /**\n * Retrieves content from an inscribed message using the standard SDK client.\n * @param inscriptionIdOrData - The inscription ID (hcs://...) or potentially raw data string.\n * @returns The resolved message content.\n */\n public async getMessageContent(inscriptionIdOrData: string): Promise<string> {\n try {\n const content = await this.standardClient.getMessageContent(\n inscriptionIdOrData\n );\n return content as string;\n } catch (error) {\n this.logger.error(\n `Error retrieving message content for: ${inscriptionIdOrData}`,\n error\n );\n throw new Error(\n `Failed to retrieve message content: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves the inbound topic ID associated with the current operator.\n * This typically involves fetching the operator's own HCS-10 profile.\n * @returns A promise that resolves to the operator's inbound topic ID.\n * @throws {Error} If the operator ID cannot be determined or the profile/topic cannot be retrieved.\n */\n public async getInboundTopicId(): Promise<string> {\n try {\n const operatorId = this.getOperatorId();\n this.logger.info(\n `[HCS10Client] Retrieving profile for operator ${operatorId} to find inbound topic...`\n );\n const profileResponse = await this.getAgentProfile(operatorId);\n if (profileResponse.success && profileResponse.topicInfo?.inboundTopic) {\n this.logger.info(\n `[HCS10Client] Found inbound topic for operator ${operatorId}: ${profileResponse.topicInfo.inboundTopic}`\n );\n return profileResponse.topicInfo.inboundTopic;\n } else {\n throw new Error(\n `Could not retrieve inbound topic from profile for ${operatorId}. Profile success: ${profileResponse.success}, Error: ${profileResponse.error}`\n );\n }\n } catch (error) {\n this.logger.error(\n `[HCS10Client] Error fetching operator's inbound topic ID (${this.getOperatorId()}):`,\n error\n );\n const operatorId = this.getOperatorId();\n let detailedMessage = `Failed to get inbound topic ID for operator ${operatorId}.`;\n if (\n error instanceof Error &&\n error.message.includes('does not have a valid HCS-11 memo')\n ) {\n detailedMessage += ` The account profile may not exist or is invalid. Please ensure this operator account (${operatorId}) is registered as an HCS-10 agent. You might need to register it first (e.g., using the 'register_agent' tool or SDK function).`;\n } else if (error instanceof Error) {\n detailedMessage += ` Reason: ${error.message}`;\n } else {\n detailedMessage += ` Unexpected error: ${String(error)}`;\n }\n throw new Error(detailedMessage);\n }\n }\n\n /**\n * Retrieves the configured operator account ID and private key.\n * Required by tools needing to identify the current agent instance.\n */\n public getAccountAndSigner(): { accountId: string; signer: PrivateKey } {\n const result = this.standardClient.getAccountAndSigner();\n return {\n accountId: result.accountId,\n signer: result.signer as unknown as PrivateKey,\n };\n }\n\n /**\n * Retrieves the outbound topic ID for the current operator.\n * Fetches the operator's profile if necessary.\n * @returns The outbound topic ID string.\n * @throws If the outbound topic cannot be determined.\n */\n public async getOutboundTopicId(): Promise<string> {\n const operatorId = this.getOperatorId();\n const profile = await this.getAgentProfile(operatorId);\n if (profile.success && profile.topicInfo?.outboundTopic) {\n return profile.topicInfo.outboundTopic;\n } else {\n throw new Error(\n `Could not retrieve outbound topic from profile for ${operatorId}. Profile success: ${profile.success}, Error: ${profile.error}`\n );\n }\n }\n\n public setClient(accountId: string, privateKey: string): StandardSDKClient {\n this.standardClient = new StandardSDKClient({\n network: this.getNetwork(),\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n guardedRegistryBaseUrl: this.guardedRegistryBaseUrl,\n });\n return this.standardClient;\n }\n\n /**\n * Validates that the operator account exists and has proper access for agent operations\n */\n private async validateOperator(options: ClientValidationOptions): Promise<{\n isValid: boolean;\n operator?: { accountId: string };\n error?: string;\n }> {\n try {\n // Set up client with provided operator details\n this.setClient(options.accountId, options.privateKey);\n\n // Check if we can retrieve the operator ID\n const operatorId = this.getOperatorId();\n\n // If we got this far, basic validation passed\n return {\n isValid: true,\n operator: { accountId: operatorId },\n };\n } catch (error) {\n this.logger.error(`Validation error: ${error}`);\n return {\n isValid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async initializeWithValidation(options: ClientValidationOptions): Promise<{\n isValid: boolean;\n operator?: { accountId: string };\n error?: string;\n }> {\n const validationResult = await this.validateOperator(options);\n\n if (validationResult.isValid) {\n // If we have access to the state manager, initialize its connections manager\n if (options.stateManager) {\n options.stateManager.initializeConnectionsManager(this.standardClient);\n }\n }\n\n return validationResult;\n }\n}\n","import { HederaAgentKit, ServerSigner } from 'hedera-agent-kit';\nimport { HCS10Builder } from '../builders/hcs10/hcs10-builder';\nimport { RegisterAgentTool } from '../tools/hcs10/RegisterAgentTool';\nimport { FindRegistrationsTool } from '../tools/hcs10/FindRegistrationsTool';\nimport { InitiateConnectionTool } from '../tools/hcs10/InitiateConnectionTool';\nimport { ListConnectionsTool } from '../tools/hcs10/ListConnectionsTool';\nimport { SendMessageToConnectionTool } from '../tools/hcs10/SendMessageToConnectionTool';\nimport { CheckMessagesTool } from '../tools/hcs10/CheckMessagesTool';\nimport { ConnectionMonitorTool } from '../tools/hcs10/ConnectionMonitorTool';\nimport { ManageConnectionRequestsTool } from '../tools/hcs10/ManageConnectionRequestsTool';\nimport { AcceptConnectionRequestTool } from '../tools/hcs10/AcceptConnectionRequestTool';\nimport { RetrieveProfileTool } from '../tools/hcs10/RetrieveProfileTool';\nimport { ListUnapprovedConnectionRequestsTool } from '../tools/hcs10/ListUnapprovedConnectionRequestsTool';\nimport { IStateManager } from '../state/state-types';\nimport { OpenConvaiState } from '../state/open-convai-state';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { ENV_FILE_PATH } from '../utils/state-tools';\n\nexport interface HCS10ClientConfig {\n operatorId?: string;\n operatorKey?: string;\n network?: 'mainnet' | 'testnet';\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n}\n\nexport interface HCS10InitializationOptions {\n clientConfig?: HCS10ClientConfig;\n stateManager?: IStateManager;\n createAllTools?: boolean;\n monitoringClient?: boolean;\n}\n\n/**\n * Tool collection containing all available tools from the standards-agent-kit\n */\nexport interface HCS10Tools {\n registerAgentTool: RegisterAgentTool;\n findRegistrationsTool: FindRegistrationsTool;\n retrieveProfileTool: RetrieveProfileTool;\n initiateConnectionTool: InitiateConnectionTool;\n listConnectionsTool: ListConnectionsTool;\n sendMessageToConnectionTool: SendMessageToConnectionTool;\n checkMessagesTool: CheckMessagesTool;\n connectionMonitorTool: ConnectionMonitorTool;\n manageConnectionRequestsTool: ManageConnectionRequestsTool;\n acceptConnectionRequestTool: AcceptConnectionRequestTool;\n listUnapprovedConnectionRequestsTool: ListUnapprovedConnectionRequestsTool;\n}\n\n/**\n * Initializes the HCS10 client and returns pre-registered LangChain tools.\n *\n * @param options - Initialization options\n * @returns Object containing hederaKit, hcs10Builder and requested tools\n */\nexport const initializeStandardsAgentKit = async (\n options?: HCS10InitializationOptions\n): Promise<{\n hederaKit: HederaAgentKit;\n hcs10Builder: HCS10Builder;\n monitoringHederaKit?: HederaAgentKit;\n monitoringHcs10Builder?: HCS10Builder;\n tools: Partial<HCS10Tools>;\n stateManager: IStateManager;\n}> => {\n const config = options?.clientConfig || {};\n\n const operatorId = config.operatorId || process.env.HEDERA_OPERATOR_ID;\n const operatorPrivateKey =\n config.operatorKey || process.env.HEDERA_OPERATOR_KEY;\n\n const networkEnv = config.network || process.env.HEDERA_NETWORK || 'testnet';\n\n let network: 'mainnet' | 'testnet';\n if (networkEnv === 'mainnet') {\n network = 'mainnet';\n } else if (networkEnv === 'testnet') {\n network = 'testnet';\n } else {\n console.warn(\n `Unsupported network specified: '${networkEnv}'. Defaulting to 'testnet'.`\n );\n network = 'testnet';\n }\n\n if (!operatorId || !operatorPrivateKey) {\n throw new Error(\n 'Operator ID and private key must be provided either through options or environment variables.'\n );\n }\n\n const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n const logger = Logger.getInstance({\n level: config.logLevel || 'info',\n silent: shouldSilence,\n });\n\n const stateManager =\n options?.stateManager ||\n new OpenConvaiState({\n defaultEnvFilePath: ENV_FILE_PATH,\n defaultPrefix: 'TODD',\n });\n logger.info('State manager initialized');\n\n // Create HederaAgentKit\n const signer = new ServerSigner(operatorId, operatorPrivateKey, network);\n const hederaKit = new HederaAgentKit(signer);\n await hederaKit.initialize();\n logger.info(`HederaAgentKit initialized for ${operatorId} on ${network}`);\n\n // Create HCS10Builder\n const hcs10Builder = new HCS10Builder(hederaKit, stateManager, {\n useEncryption: config.useEncryption,\n registryUrl: config.registryUrl,\n logLevel: config.logLevel,\n });\n\n let monitoringHederaKit: HederaAgentKit | undefined;\n let monitoringHcs10Builder: HCS10Builder | undefined;\n\n if (options?.monitoringClient) {\n const monitoringSigner = new ServerSigner(operatorId, operatorPrivateKey, network);\n monitoringHederaKit = new HederaAgentKit(monitoringSigner);\n await monitoringHederaKit.initialize();\n monitoringHcs10Builder = new HCS10Builder(monitoringHederaKit, stateManager, {\n useEncryption: config.useEncryption,\n registryUrl: config.registryUrl,\n logLevel: 'error',\n });\n logger.info('Monitoring client initialized');\n }\n\n const tools: Partial<HCS10Tools> = {};\n\n // Always create RegisterAgentTool\n tools.registerAgentTool = new RegisterAgentTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n\n if (options?.createAllTools) {\n tools.findRegistrationsTool = new FindRegistrationsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.retrieveProfileTool = new RetrieveProfileTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.initiateConnectionTool = new InitiateConnectionTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.listConnectionsTool = new ListConnectionsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.sendMessageToConnectionTool = new SendMessageToConnectionTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.checkMessagesTool = new CheckMessagesTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.connectionMonitorTool = new ConnectionMonitorTool({\n hederaKit: monitoringHederaKit || hederaKit,\n hcs10Builder: monitoringHcs10Builder || hcs10Builder,\n logger: undefined,\n });\n tools.manageConnectionRequestsTool = new ManageConnectionRequestsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.acceptConnectionRequestTool = new AcceptConnectionRequestTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.listUnapprovedConnectionRequestsTool =\n new ListUnapprovedConnectionRequestsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n\n logger.info('All tools initialized');\n }\n\n return {\n hederaKit,\n hcs10Builder,\n monitoringHederaKit,\n monitoringHcs10Builder,\n tools,\n stateManager,\n };\n};"],"names":["BaseHCS10TransactionTool","BaseHederaTransactionTool","constructor","params","super","this","namespace","hcs10Builder","getServiceBuilder","BaseHCS10QueryTool","BaseHederaQueryTool","_NaturalLanguageMapper","parseCapabilities","text","AIAgentCapability","TEXT_GENERATION","normalizedText","toLowerCase","capabilities","Set","term","caps","Object","entries","CAPABILITY_MAPPINGS","includes","forEach","cap","add","size","Array","from","parseTagsOrCapabilities","input","isArray","every","item","getCapabilityName","capability","IMAGE_GENERATION","AUDIO_GENERATION","VIDEO_GENERATION","CODE_GENERATION","LANGUAGE_TRANSLATION","SUMMARIZATION_EXTRACTION","KNOWLEDGE_RETRIEVAL","DATA_INTEGRATION","MARKET_INTELLIGENCE","TRANSACTION_ANALYTICS","SMART_CONTRACT_AUDIT","GOVERNANCE_FACILITATION","SECURITY_MONITORING","COMPLIANCE_ANALYSIS","FRAUD_DETECTION","MULTI_AGENT_COORDINATION","API_INTEGRATION","WORKFLOW_AUTOMATION","ai","chat","conversation","image","picture","visual","photo","audio","sound","voice","speech","video","movie","animation","code","programming","development","coding","translate","translation","language","summarize","summary","extract","extraction","knowledge","search","retrieve","lookup","data","etl","market","trading","finance","financial","analytics","analysis","analyze","transactions","audit","contract","governance","voting","dao","security","monitoring","threat","compliance","regulatory","regulation","fraud","detection","anomaly","coordination","orchestration","api","integration","webhook","workflow","automation","process","NaturalLanguageMapper","RegisterAgentZodSchema","z","object","name","string","min","max","describe","description","optional","alias","transform","val","Date","now","toString","Math","random","type","enum","model","union","array","nativeEnum","length","tags","creator","socials","record","properties","unknown","profilePicture","url","path","filename","existingProfilePictureTopicId","initialBalance","number","positive","userAccountId","hbarFee","tokenFees","amount","tokenId","exemptAccountIds","setAsCurrent","boolean","persistence","prefix","RegisterAgentTool","specificInputSchema","neverScheduleThisTool","requiresMultipleTransactions","callBuilderMethod","builder","specificArgs","bio","randomSuffix","profilePicObj","registerAgent","_call","args","runManager","result","shouldSetAsCurrent","parsed","JSON","parse","rawResult","_handleRegistrationResult","state","accountId","metadata","e","createdResources","accountResource","find","r","startsWith","split","inboundTopicId","outboundTopicId","profileTopicId","privateKey","registeredAgent","stateManager","getStateManager","setCurrentAgent","persistAgentData","toUpperCase","replace","catch","SendMessageToConnectionZodSchema","targetIdentifier","connectionId","agentId","message","disableMonitoring","default","SendMessageToConnectionTool","Error","connectionsManager","getConnectionsManager","currentAgent","getCurrentAgent","fetchConnectionData","error","console","debug","match","connections","listConnections","connectionIndex","parseInt","establishedConnections","filter","conn","status","isPending","needsConfirmation","selectedConnection","connectionTopicId","sendMessageToConnection","establishedConnection","targetAccountId","InitiateConnectionZodSchema","disableMonitor","memo","InitiateConnectionTool","initiateConnection","ListConnectionsZodSchema","includeDetails","showPending","ListConnectionsTool","executeQuery","execute","success","raw","formattedOutput","CheckMessagesZodSchema","fetchLatest","lastMessagesCount","int","CheckMessagesTool","checkMessages","FindRegistrationsZodSchema","FindRegistrationsTool","findRegistrations","ConnectionMonitorZodSchema","acceptAll","hbarFees","collectorAccount","monitorDurationSeconds","defaultCollectorAccount","ConnectionMonitorTool","monitorConnections","ManageConnectionRequestsZodSchema","action","requestKey","ManageConnectionRequestsTool","manageConnectionRequests","AcceptConnectionRequestZodSchema","AcceptConnectionRequestTool","acceptConnection","RetrieveProfileZodSchema","disableCache","RetrieveProfileTool","retrieveProfile","profileDetails","rawProfile","ListUnapprovedConnectionRequestsZodSchema","ListUnapprovedConnectionRequestsTool","listUnapprovedConnectionRequests","BaseHCS2TransactionTool","hcs2Builder","BaseHCS2QueryTool","createRegistrySchema","registryType","HCS2RegistryType","ttl","adminKey","submitKey","registerEntrySchema","registryTopicId","regex","targetTopicId","updateEntrySchema","uid","deleteEntrySchema","migrateRegistrySchema","queryRegistrySchema","topicId","limit","order","skip","BaseInscriberTransactionTool","inscriberBuilder","BaseInscriberQueryTool","inscribeFromUrlSchema","mode","chunkSize","waitForConfirmation","apiKey","inscribeFromFileSchema","filePath","timeoutMs","inscribeFromBufferSchema","base64Data","fileName","mimeType","inscribeHashinalSchema","attributes","trait_type","value","jsonFileURL","retrieveInscriptionSchema","transactionId","ENV_FILE_PATH","join","cwd","OpenConvaiState","options","connectionMessageTimestamps","defaultEnvFilePath","defaultPrefix","shouldSilence","disableLogging","env","DISABLE_LOGGING","logger","Logger","module","silent","baseClient","initializeConnectionsManager","ConnectionsManager","logLevel","agent","clearAll","addActiveConnection","connection","sdkConnection","targetAgentName","targetInboundTopicId","convertConnectionStatus","created","lastActivity","profileInfo","connectionRequestId","processed","updateOrAddConnection","initializeTimestampIfNeeded","getAllConnections","map","convertToActiveConnection","getConnectionByIdentifier","identifier","numericIndex","isNaN","byTopicId","getConnectionByTopicId","byAccountId","getConnectionByAccountId","getLastTimestamp","updateTimestamp","timestampNanos","convertToStateStatus","envFilePath","updates","async","variables","envContent","fs","existsSync","readFileSync","updatedLines","key","lineIndex","findIndex","line","push","writeFileSync","updateEnvFile","NOT_INITIALIZED_ERROR","HCS10Builder","BaseServiceBuilder","hederaKit","useEncryption","guardedRegistryBaseUrl","registryUrl","network","client","operatorId","signer","getAccountId","operatorPrivateKey","getOperatorPrivateKey","toStringRaw","sdkLogger","SDKLogger","level","standardClient","HCS10Client","getOperatorId","operator","getClient","operatorAccountId","getNetwork","getAccountAndSigner","getInboundTopicId","info","profileResponse","getAgentProfile","topicInfo","inboundTopic","detailedMessage","String","submitConnectionRequest","handleConnectionRequest","requestingAccountId","feeConfig","sendMessage","stringify","messageResponse","sequenceNumber","topicSequenceNumber","toNumber","receipt","getMessages","mappedMessages","messages","sdkMessage","timestamp","getTime","sequence_number","p","sort","a","b","getMessageStream","getMessageContent","inscriptionIdOrData","getStandardClient","loadProfilePicture","response","axios","get","responseType","buffer","globalThis","Buffer","urlPathname","URL","pathname","basename","warn","createAndRegisterAgent","AgentBuilder","setName","setBio","setCapabilities","StandardAIAgentCapability","setType","setModel","setNetwork","setInboundTopicType","StandardInboundTopicType","PUBLIC","setAlias","setCreator","FEE_BASED","setFeeConfig","setExistingProfilePicture","pfpBuffer","pfpFileName","byteLength","setProfilePicture","platform","handle","addSocial","addProperty","hasFees","Boolean","clearNotes","operationalMode","profilePictureData","registrationData","feeConfigBuilder","FeeConfigBuilder","collectorAccountId","addNote","effectiveExemptIds","id","addHbarFee","executeResult","scheduleId","agentMetadata","targetProfile","connectionRequestSent","monitoringEnabled","request","getPendingRequests","getConnectionsNeedingConfirmation","uniqueRequestKey","inboundRequestId","confirmationResult","profileError","newConnection","markConnectionRequestProcessed","feeConfigured","sendHCS10Message","parts","test","accountIdWithPrefix","index","availableIds","c","i","errorMsg","messageResult","reply","monitorResponses","attempts","operator_id","Promise","resolve","setTimeout","startPassiveConnectionMonitoring","endTime","connectionRequestsFound","acceptedConnections","processedRequestIds","connectionRequests","msg","op","has","fee","addTokenFee","pendingRequests","allRequests","requests","toISOString","viewRequest","rejectRequest","originTopicId","rejectedRequest","unapprovedRequests","requestId","fromAccountId","m","req","count","getEnhancedConnections","activeConnections","pendingConnections","output","formatConnection","trim","activeCount","pendingCount","needsConfirmationCount","display_name","substring","toLocaleString","connectionManager","lastProcessedTimestamp","allMessages","messagesToProcess","latestTimestampNanos","isFetchingLatest","slice","reduce","maxTs","outputString","processedMessages","content","displayContent","registrations","formattedRegistrations","reg","registration","profile","outboundTopic","social","keys","notes","HbarPricePlugin","BasePlugin","arguments","version","author","tools","initialize","context","initializeTools","HederaGetHbarPriceTool","config","getTools","HCS2Builder","getHCS2Client","hcs2Client","operatorKey","HCS2Client","createRegistry","registerEntry","updateEntry","deleteEntry","migrateRegistry","getRegistry","submitMessage","payload","getTopicInfo","close","InscriberBuilder","getInscriptionSDK","inscribe","clientConfig","inscribeWithSigner","retrieveInscription","inscriptionSDK","_runManager","errorMessage","StandardSDKClient","waitForConnectionConfirmation","maxAttempts","delayMs","agentChannels","getOutboundTopicId","setClient","validateOperator","isValid","initializeWithValidation","validationResult","log","waitMaxAttempts","waitIntervalMs","timeoutPromise","_","reject","race","confirmed","inscription","topic_id","cdnUrl","fileContent","stats","stat","isFile","toFixed","readFile","getMimeType","extname","urlObj","protocol","host","controller","AbortController","timeoutId","abort","fetch","method","signal","clearTimeout","ok","statusText","contentLength","headers","contentType","fetchError","registry","totalEntries","entry","sequence","payer","operation","t_id","inscriptionId","holderId","chunks","createdAt","completedAt","completed","fileUrl","fileSize","HEDERA_OPERATOR_ID","HEDERA_OPERATOR_KEY","networkEnv","HEDERA_NETWORK","getInstance","ServerSigner","HederaAgentKit","monitoringHederaKit","monitoringHcs10Builder","monitoringClient","monitoringSigner","registerAgentTool","createAllTools","findRegistrationsTool","retrieveProfileTool","initiateConnectionTool","listConnectionsTool","sendMessageToConnectionTool","checkMessagesTool","connectionMonitorTool","manageConnectionRequestsTool","acceptConnectionRequestTool","listUnapprovedConnectionRequestsTool"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.cjs","sources":["../../src/tools/hcs10/base-hcs10-tools.ts","../../src/tools/hcs10/natural-language-mapper.ts","../../src/tools/hcs10/RegisterAgentTool.ts","../../src/tools/hcs10/SendMessageToConnectionTool.ts","../../src/tools/hcs10/InitiateConnectionTool.ts","../../src/tools/hcs10/ListConnectionsTool.ts","../../src/tools/hcs10/CheckMessagesTool.ts","../../src/tools/hcs10/FindRegistrationsTool.ts","../../src/tools/hcs10/ConnectionMonitorTool.ts","../../src/tools/hcs10/ManageConnectionRequestsTool.ts","../../src/tools/hcs10/AcceptConnectionRequestTool.ts","../../src/tools/hcs10/RetrieveProfileTool.ts","../../src/tools/hcs10/ListUnapprovedConnectionRequestsTool.ts","../../src/tools/hcs2/base-hcs2-tools.ts","../../src/tools/hcs2/CreateRegistryTool.ts","../../src/tools/hcs2/RegisterEntryTool.ts","../../src/tools/hcs2/UpdateEntryTool.ts","../../src/tools/hcs2/DeleteEntryTool.ts","../../src/tools/hcs2/MigrateRegistryTool.ts","../../src/tools/hcs2/QueryRegistryTool.ts","../../src/tools/hcs6/base-hcs6-tools.ts","../../src/tools/hcs6/CreateDynamicRegistryTool.ts","../../src/tools/hcs6/RegisterDynamicHashinalTool.ts","../../src/tools/hcs6/UpdateDynamicHashinalTool.ts","../../src/tools/hcs6/QueryDynamicRegistryTool.ts","../../src/tools/inscriber/base-inscriber-tools.ts","../../src/tools/inscriber/InscribeFromUrlTool.ts","../../src/tools/inscriber/InscribeFromFileTool.ts","../../src/tools/inscriber/InscribeFromBufferTool.ts","../../src/tools/inscriber/InscribeHashinalTool.ts","../../src/tools/inscriber/RetrieveInscriptionTool.ts","../../src/utils/state-tools.ts","../../src/state/open-convai-state.ts","../../src/builders/hcs10/hcs10-builder.ts","../../src/plugins/hedera/HbarPricePlugin.ts","../../src/builders/hcs2/hcs2-builder.ts","../../src/builders/hcs6/hcs6-builder.ts","../../src/builders/inscriber/inscriber-builder.ts","../../src/hcs10/HCS10Client.ts","../../src/init/init.ts"],"sourcesContent":["import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport {\n HCS10TransactionToolParams,\n HCS10QueryToolParams,\n} from './hcs10-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for HCS10 transaction tools\n */\nexport abstract class BaseHCS10TransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected hcs10Builder: HCS10Builder;\n namespace = 'hcs10' as const;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.hcs10Builder = params.hcs10Builder;\n }\n\n /**\n * Override to return the HCS10Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs10Builder;\n }\n}\n\n/**\n * Base class for HCS10 query tools\n */\nexport abstract class BaseHCS10QueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected hcs10Builder: HCS10Builder;\n namespace = 'hcs10' as const;\n\n constructor(params: HCS10QueryToolParams) {\n super(params);\n this.hcs10Builder = params.hcs10Builder;\n }\n\n /**\n * Override to return the HCS10Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs10Builder;\n }\n}\n","import { AIAgentCapability } from '@hashgraphonline/standards-sdk';\n\n/**\n * Maps natural language terms to AIAgentCapability enum values\n */\nexport class NaturalLanguageMapper {\n private static readonly CAPABILITY_MAPPINGS: Record<string, AIAgentCapability[]> = {\n // Common terms\n 'ai': [AIAgentCapability.TEXT_GENERATION],\n 'artificial intelligence': [AIAgentCapability.TEXT_GENERATION],\n 'chat': [AIAgentCapability.TEXT_GENERATION],\n 'conversation': [AIAgentCapability.TEXT_GENERATION],\n 'text': [AIAgentCapability.TEXT_GENERATION],\n 'text generation': [AIAgentCapability.TEXT_GENERATION],\n \n // Image\n 'image': [AIAgentCapability.IMAGE_GENERATION],\n 'picture': [AIAgentCapability.IMAGE_GENERATION],\n 'visual': [AIAgentCapability.IMAGE_GENERATION],\n 'photo': [AIAgentCapability.IMAGE_GENERATION],\n \n // Audio\n 'audio': [AIAgentCapability.AUDIO_GENERATION],\n 'sound': [AIAgentCapability.AUDIO_GENERATION],\n 'voice': [AIAgentCapability.AUDIO_GENERATION],\n 'speech': [AIAgentCapability.AUDIO_GENERATION],\n \n // Video\n 'video': [AIAgentCapability.VIDEO_GENERATION],\n 'movie': [AIAgentCapability.VIDEO_GENERATION],\n 'animation': [AIAgentCapability.VIDEO_GENERATION],\n \n // Code\n 'code': [AIAgentCapability.CODE_GENERATION],\n 'programming': [AIAgentCapability.CODE_GENERATION],\n 'development': [AIAgentCapability.CODE_GENERATION],\n 'coding': [AIAgentCapability.CODE_GENERATION],\n \n // Translation\n 'translate': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'translation': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'language': [AIAgentCapability.LANGUAGE_TRANSLATION],\n \n // Summarization\n 'summarize': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'summary': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extract': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extraction': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n \n // Knowledge\n 'knowledge': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'search': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'retrieve': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'lookup': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n \n // Data\n 'data': [AIAgentCapability.DATA_INTEGRATION],\n 'data processing': [AIAgentCapability.DATA_INTEGRATION],\n 'data integration': [AIAgentCapability.DATA_INTEGRATION],\n 'etl': [AIAgentCapability.DATA_INTEGRATION],\n \n // Market\n 'market': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'trading': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'finance': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'financial': [AIAgentCapability.MARKET_INTELLIGENCE],\n \n // Analytics\n 'analytics': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analysis': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analyze': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'transactions': [AIAgentCapability.TRANSACTION_ANALYTICS],\n \n // Smart Contract\n 'audit': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'smart contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n \n // Governance\n 'governance': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'voting': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'dao': [AIAgentCapability.GOVERNANCE_FACILITATION],\n \n // Security\n 'security': [AIAgentCapability.SECURITY_MONITORING],\n 'monitoring': [AIAgentCapability.SECURITY_MONITORING],\n 'threat': [AIAgentCapability.SECURITY_MONITORING],\n \n // Compliance\n 'compliance': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulatory': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulation': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n \n // Fraud\n 'fraud': [AIAgentCapability.FRAUD_DETECTION],\n 'detection': [AIAgentCapability.FRAUD_DETECTION],\n 'anomaly': [AIAgentCapability.FRAUD_DETECTION],\n \n // Multi-agent\n 'coordination': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'multi-agent': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'orchestration': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n \n // API\n 'api': [AIAgentCapability.API_INTEGRATION],\n 'integration': [AIAgentCapability.API_INTEGRATION],\n 'webhook': [AIAgentCapability.API_INTEGRATION],\n \n // Workflow\n 'workflow': [AIAgentCapability.WORKFLOW_AUTOMATION],\n 'automation': [AIAgentCapability.WORKFLOW_AUTOMATION],\n 'process': [AIAgentCapability.WORKFLOW_AUTOMATION],\n };\n\n /**\n * Parse natural language text and extract capability values\n */\n static parseCapabilities(text: string): AIAgentCapability[] {\n if (!text) return [AIAgentCapability.TEXT_GENERATION];\n \n const normalizedText = text.toLowerCase();\n const capabilities = new Set<AIAgentCapability>();\n \n // Check for exact matches first\n for (const [term, caps] of Object.entries(this.CAPABILITY_MAPPINGS)) {\n if (normalizedText.includes(term)) {\n caps.forEach(cap => capabilities.add(cap));\n }\n }\n \n // Default to TEXT_GENERATION if no capabilities found\n if (capabilities.size === 0) {\n capabilities.add(AIAgentCapability.TEXT_GENERATION);\n }\n \n return Array.from(capabilities);\n }\n\n /**\n * Parse tags/capabilities from various input formats\n */\n static parseTagsOrCapabilities(input: any): AIAgentCapability[] {\n // If already an array of numbers, return as is\n if (Array.isArray(input) && input.every(item => typeof item === 'number')) {\n return input;\n }\n \n // If array of strings, parse each\n if (Array.isArray(input) && input.every(item => typeof item === 'string')) {\n const capabilities = new Set<AIAgentCapability>();\n input.forEach(term => {\n this.parseCapabilities(term).forEach(cap => capabilities.add(cap));\n });\n return Array.from(capabilities);\n }\n \n // If single string, parse it\n if (typeof input === 'string') {\n return this.parseCapabilities(input);\n }\n \n // Default\n return [AIAgentCapability.TEXT_GENERATION];\n }\n\n /**\n * Convert capability enum to human-readable name\n */\n static getCapabilityName(capability: AIAgentCapability): string {\n const names: Record<AIAgentCapability, string> = {\n [AIAgentCapability.TEXT_GENERATION]: 'Text Generation',\n [AIAgentCapability.IMAGE_GENERATION]: 'Image Generation',\n [AIAgentCapability.AUDIO_GENERATION]: 'Audio Generation',\n [AIAgentCapability.VIDEO_GENERATION]: 'Video Generation',\n [AIAgentCapability.CODE_GENERATION]: 'Code Generation',\n [AIAgentCapability.LANGUAGE_TRANSLATION]: 'Language Translation',\n [AIAgentCapability.SUMMARIZATION_EXTRACTION]: 'Summarization & Extraction',\n [AIAgentCapability.KNOWLEDGE_RETRIEVAL]: 'Knowledge Retrieval',\n [AIAgentCapability.DATA_INTEGRATION]: 'Data Integration',\n [AIAgentCapability.MARKET_INTELLIGENCE]: 'Market Intelligence',\n [AIAgentCapability.TRANSACTION_ANALYTICS]: 'Transaction Analytics',\n [AIAgentCapability.SMART_CONTRACT_AUDIT]: 'Smart Contract Audit',\n [AIAgentCapability.GOVERNANCE_FACILITATION]: 'Governance Facilitation',\n [AIAgentCapability.SECURITY_MONITORING]: 'Security Monitoring',\n [AIAgentCapability.COMPLIANCE_ANALYSIS]: 'Compliance Analysis',\n [AIAgentCapability.FRAUD_DETECTION]: 'Fraud Detection',\n [AIAgentCapability.MULTI_AGENT_COORDINATION]: 'Multi-Agent Coordination',\n [AIAgentCapability.API_INTEGRATION]: 'API Integration',\n [AIAgentCapability.WORKFLOW_AUTOMATION]: 'Workflow Automation',\n };\n \n return names[capability] || 'Unknown Capability';\n }\n}","import { AIAgentCapability } from '@hashgraphonline/standards-sdk';\nimport { z } from 'zod';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport {\n HCS10Builder,\n RegisterAgentParams,\n} from '../../builders/hcs10/hcs10-builder';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { RegisteredAgent } from '../../state/state-types';\nimport { NaturalLanguageMapper } from './natural-language-mapper';\n\nconst RegisterAgentZodSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(50)\n .describe('A unique name for the agent (1-50 characters)'),\n description: z\n .string()\n .max(500)\n .optional()\n .describe('Optional bio description for the agent (max 500 characters)'),\n alias: z\n .string()\n .optional()\n .transform((val) => {\n if (!val || val.toLowerCase().includes('random')) {\n const timestamp = Date.now().toString(36);\n const randomChars = Math.random().toString(36);\n return `bot${timestamp}${randomChars}`;\n }\n return val;\n })\n .describe(\n 'Optional custom username/alias for the agent. Use \"random\" to generate a unique alias'\n ),\n type: z\n .enum(['autonomous', 'manual'])\n .optional()\n .describe('Agent type (default: autonomous)'),\n model: z\n .string()\n .optional()\n .describe('AI model identifier (default: agent-model-2024)'),\n capabilities: z\n .union([\n z.array(z.nativeEnum(AIAgentCapability)),\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'string') {\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n }\n return val as AIAgentCapability[];\n })\n .describe('Agent capabilities - can be capability names (e.g. \"ai\", \"data processing\"), capability enum values, or array of either. Common values: \"ai\"/\"text\" (TEXT_GENERATION), \"data\" (DATA_INTEGRATION), \"analytics\" (TRANSACTION_ANALYTICS)'),\n tags: z\n .union([\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n })\n .describe('Tags for the agent (alternative to capabilities) - e.g. \"ai\", \"data\", \"analytics\". Will be converted to appropriate capabilities.'),\n creator: z.string().optional().describe('Creator attribution for the agent'),\n socials: z\n .record(\n z.enum([\n 'twitter',\n 'github',\n 'discord',\n 'telegram',\n 'linkedin',\n 'youtube',\n 'website',\n 'x',\n ] as const),\n z.string()\n )\n .optional()\n .describe(\n 'Social media links (e.g., {\"twitter\": \"@handle\", \"discord\": \"username\"})'\n ),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Custom metadata properties for the agent'),\n profilePicture: z\n .union([\n z.string().describe('URL or local file path to profile picture'),\n z.object({\n url: z.string().optional(),\n path: z.string().optional(),\n filename: z.string().optional(),\n }),\n ])\n .optional()\n .describe(\n 'Optional profile picture as URL, file path, or object with url/path/filename'\n ),\n existingProfilePictureTopicId: z\n .string()\n .optional()\n .describe(\n 'Topic ID of an existing profile picture to reuse (e.g., 0.0.12345)'\n ),\n initialBalance: z\n .number()\n .positive()\n .optional()\n .describe(\n 'Optional initial HBAR balance for the new agent account (will create new account if provided)'\n ),\n userAccountId: z\n .string()\n .optional()\n .describe(\n 'Optional account ID (e.g., 0.0.12345) to use as the agent account instead of creating a new one'\n ),\n hbarFee: z\n .number()\n .positive()\n .optional()\n .describe(\n 'Optional HBAR fee amount to charge per message on the inbound topic'\n ),\n tokenFees: z\n .array(\n z.object({\n amount: z.number().positive(),\n tokenId: z.string(),\n })\n )\n .optional()\n .describe('Optional token fees to charge per message'),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe('Optional account IDs to exempt from fees'),\n setAsCurrent: z\n .boolean()\n .optional()\n .describe('Whether to set as current agent (default: true)'),\n persistence: z\n .object({\n prefix: z.string().optional(),\n })\n .optional()\n .describe('Optional persistence configuration'),\n});\n\nexport class RegisterAgentTool extends BaseHCS10TransactionTool<\n typeof RegisterAgentZodSchema\n> {\n name = 'register_agent';\n description =\n 'Creates and registers the AI agent on the Hedera network. Returns JSON string with agent details (accountId, privateKey, topics) on success. Supports natural language for capabilities/tags like \"ai\", \"data processing\", \"analytics\". Note: This tool requires multiple transactions and cannot be used in returnBytes mode. If alias is set to \"random\" or contains \"random\", a unique alias will be generated.';\n specificInputSchema = RegisterAgentZodSchema;\n private specificArgs: z.infer<typeof RegisterAgentZodSchema> | undefined;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof RegisterAgentZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n this.specificArgs = specificArgs;\n const params: RegisterAgentParams = {\n name: specificArgs.name,\n };\n\n if (specificArgs.description !== undefined) {\n params.bio = specificArgs.description;\n }\n if (specificArgs.alias !== undefined) {\n params.alias = specificArgs.alias;\n } else {\n const randomSuffix = Date.now().toString(36);\n params.alias = `${specificArgs.name}${randomSuffix}`;\n }\n if (specificArgs.type !== undefined) {\n params.type = specificArgs.type;\n }\n if (specificArgs.model !== undefined) {\n params.model = specificArgs.model;\n }\n // Handle both capabilities and tags (tags takes precedence if both provided)\n if (specificArgs.tags !== undefined) {\n params.capabilities = specificArgs.tags as AIAgentCapability[];\n } else if (specificArgs.capabilities !== undefined) {\n params.capabilities = specificArgs.capabilities as AIAgentCapability[];\n }\n if (specificArgs.creator !== undefined) {\n params.creator = specificArgs.creator;\n }\n if (specificArgs.socials !== undefined) {\n params.socials = specificArgs.socials;\n }\n if (specificArgs.properties !== undefined) {\n params.properties = specificArgs.properties;\n }\n if (specificArgs.profilePicture !== undefined) {\n if (typeof specificArgs.profilePicture === 'string') {\n params.profilePicture = specificArgs.profilePicture;\n } else {\n const profilePicObj: {\n url?: string;\n path?: string;\n filename?: string;\n } = {};\n if (specificArgs.profilePicture.url !== undefined) {\n profilePicObj.url = specificArgs.profilePicture.url;\n }\n if (specificArgs.profilePicture.path !== undefined) {\n profilePicObj.path = specificArgs.profilePicture.path;\n }\n if (specificArgs.profilePicture.filename !== undefined) {\n profilePicObj.filename = specificArgs.profilePicture.filename;\n }\n params.profilePicture = profilePicObj;\n }\n }\n if (specificArgs.existingProfilePictureTopicId !== undefined) {\n params.existingProfilePictureTopicId =\n specificArgs.existingProfilePictureTopicId;\n }\n if (specificArgs.userAccountId !== undefined) {\n params.userAccountId = specificArgs.userAccountId;\n }\n if (specificArgs.hbarFee !== undefined) {\n params.hbarFee = specificArgs.hbarFee;\n }\n if (specificArgs.tokenFees !== undefined) {\n params.tokenFees = specificArgs.tokenFees;\n }\n if (specificArgs.exemptAccountIds !== undefined) {\n params.exemptAccountIds = specificArgs.exemptAccountIds;\n }\n if (specificArgs.initialBalance !== undefined) {\n params.initialBalance = specificArgs.initialBalance;\n }\n\n await hcs10Builder.registerAgent(params);\n }\n\n /**\n * Override _call to intercept the result and save agent to state if needed\n */\n protected override async _call(\n args: z.infer<ReturnType<this['schema']>>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n const result = await super._call(args, runManager);\n\n const shouldSetAsCurrent = this.specificArgs?.setAsCurrent !== false;\n\n if (this.specificArgs && shouldSetAsCurrent) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.rawResult) {\n this._handleRegistrationResult(parsed.rawResult);\n } else if (parsed.state || parsed.accountId || parsed.metadata) {\n this._handleRegistrationResult(parsed);\n }\n } catch (e) {}\n }\n\n return result;\n }\n\n /**\n * Extract agent data from registration result and save to state\n */\n private _handleRegistrationResult(rawResult: any): void {\n let accountId = rawResult.accountId || rawResult.metadata?.accountId;\n\n if (!accountId && rawResult.state?.createdResources) {\n const accountResource = rawResult.state.createdResources.find(\n (r: string) => r.startsWith('account:')\n );\n if (accountResource) {\n accountId = accountResource.split(':')[1];\n }\n }\n\n const inboundTopicId =\n rawResult.inboundTopicId ||\n rawResult.metadata?.inboundTopicId ||\n rawResult.state?.inboundTopicId;\n\n const outboundTopicId =\n rawResult.outboundTopicId ||\n rawResult.metadata?.outboundTopicId ||\n rawResult.state?.outboundTopicId;\n\n const profileTopicId =\n rawResult.profileTopicId ||\n rawResult.metadata?.profileTopicId ||\n rawResult.state?.profileTopicId;\n\n const privateKey = rawResult.privateKey || rawResult.metadata?.privateKey;\n\n if (accountId && inboundTopicId && outboundTopicId && this.specificArgs) {\n const registeredAgent: RegisteredAgent = {\n name: this.specificArgs.name,\n accountId,\n inboundTopicId,\n outboundTopicId,\n profileTopicId,\n privateKey,\n };\n\n const hcs10Builder = this.getServiceBuilder() as HCS10Builder;\n const stateManager = hcs10Builder.getStateManager();\n if (stateManager) {\n stateManager.setCurrentAgent(registeredAgent);\n\n if (stateManager.persistAgentData) {\n const prefix =\n this.specificArgs.persistence?.prefix ||\n this.specificArgs.name.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n stateManager\n .persistAgentData(registeredAgent, {\n type: 'env-file',\n prefix: prefix,\n })\n .catch(() => {});\n }\n }\n }\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst SendMessageToConnectionZodSchema = z.object({\n targetIdentifier: z\n .string()\n .optional()\n .describe(\n \"The request key (e.g., 'req-1:0.0.6155171@0.0.6154875'), account ID (e.g., 0.0.12345) of the target agent, OR the connection number (e.g., '1', '2') from the 'list_connections' tool. Request key is most deterministic.\"\n ),\n connectionId: z\n .string()\n .optional()\n .describe(\n \"The connection number (e.g., '1', '2') from the 'list_connections' tool.\"\n ),\n agentId: z\n .string()\n .optional()\n .describe('The account ID (e.g., 0.0.12345) of the target agent.'),\n message: z.string().describe('The text message content to send.'),\n disableMonitoring: z.boolean().optional().default(false),\n});\n\n/**\n * A tool to send a message to an agent over an established HCS-10 connection.\n */\nexport class SendMessageToConnectionTool extends BaseHCS10TransactionTool<\n typeof SendMessageToConnectionZodSchema\n> {\n name = 'send_message_to_connection';\n description =\n \"Use this to send a message to an agent you already have an active connection with. Provide the target agent's account ID (e.g., 0.0.12345) and your message. If no active connection exists, this will fail - use initiate_connection instead to create a new connection first.\";\n specificInputSchema = SendMessageToConnectionZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.requiresMultipleTransactions = true;\n this.neverScheduleThisTool = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof SendMessageToConnectionZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n\n const targetIdentifier =\n specificArgs.targetIdentifier ||\n specificArgs.agentId ||\n specificArgs.connectionId;\n\n if (!targetIdentifier) {\n throw new Error(\n 'Either targetIdentifier, connectionId, or agentId must be provided'\n );\n }\n\n const stateManager = hcs10Builder.getStateManager();\n if (stateManager) {\n const connectionsManager = stateManager.getConnectionsManager();\n if (connectionsManager) {\n try {\n const currentAgent = stateManager.getCurrentAgent();\n if (currentAgent && currentAgent.accountId) {\n await connectionsManager.fetchConnectionData(\n currentAgent.accountId\n );\n }\n } catch (error) {\n console.debug('Could not refresh connections:', error);\n }\n }\n\n if (targetIdentifier.match(/^\\d+$/)) {\n const connections = stateManager.listConnections();\n const connectionIndex = parseInt(targetIdentifier) - 1; // Connection numbers are 1-based\n\n const establishedConnections = connections.filter(\n (conn) =>\n conn.status === 'established' &&\n !conn.isPending &&\n !conn.needsConfirmation\n );\n\n if (\n connectionIndex >= 0 &&\n connectionIndex < establishedConnections.length\n ) {\n const selectedConnection = establishedConnections[connectionIndex];\n if (selectedConnection && selectedConnection.connectionTopicId) {\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: selectedConnection.connectionTopicId,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n return;\n }\n }\n }\n\n if (targetIdentifier.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n const connections = stateManager.listConnections();\n const establishedConnection = connections.find(\n (conn) =>\n (conn.targetAccountId === targetIdentifier ||\n conn.targetAccountId === `0.0.${targetIdentifier}`) &&\n conn.status === 'established' &&\n !conn.isPending &&\n !conn.needsConfirmation\n );\n\n if (establishedConnection && establishedConnection.connectionTopicId) {\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: establishedConnection.connectionTopicId,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n return;\n }\n }\n }\n\n await hcs10Builder.sendMessageToConnection({\n targetIdentifier: targetIdentifier,\n message: specificArgs.message,\n disableMonitoring: specificArgs.disableMonitoring,\n });\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst InitiateConnectionZodSchema = z.object({\n targetAccountId: z\n .string()\n .describe(\n 'The Hedera account ID (e.g., 0.0.12345) of the agent you want to connect with.'\n ),\n disableMonitor: z\n .boolean()\n .optional()\n .describe(\n 'If true, does not wait for connection confirmation. Returns immediately after sending the request.'\n ),\n memo: z\n .string()\n .optional()\n .describe(\n 'Optional memo to include with the connection request (e.g., \"Hello from Alice\"). If not provided, defaults to \"true\" or \"false\" based on monitoring preference.'\n ),\n});\n\n/**\n * A tool to actively START a NEW HCS-10 connection TO a target agent.\n * Requires the target agent's account ID.\n * It retrieves their profile, sends a connection request, and optionally waits for confirmation.\n * Use this tool ONLY to actively INITIATE an OUTGOING connection.\n */\nexport class InitiateConnectionTool extends BaseHCS10TransactionTool<\n typeof InitiateConnectionZodSchema\n> {\n name = 'initiate_connection';\n description =\n 'ONLY use this to START a BRAND NEW connection to an agent you have NEVER connected to before. If you already have an active connection to this agent, use send_message_to_connection instead. This creates a new connection request and waits for acceptance.';\n specificInputSchema = InitiateConnectionZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof InitiateConnectionZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n const params: {\n targetAccountId: string;\n disableMonitor?: boolean;\n memo?: string;\n } = {\n targetAccountId: specificArgs.targetAccountId,\n };\n if (specificArgs.disableMonitor !== undefined) {\n params.disableMonitor = specificArgs.disableMonitor;\n }\n if (specificArgs.memo !== undefined) {\n params.memo = specificArgs.memo;\n }\n await hcs10Builder.initiateConnection(params);\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\n/**\n * A tool to list currently active HCS-10 connections stored in the state manager.\n * Enhanced to show more details similar to moonscape's implementation.\n */\nconst ListConnectionsZodSchema = z.object({\n includeDetails: z\n .boolean()\n .optional()\n .describe(\n 'Whether to include detailed information about each connection'\n ),\n showPending: z\n .boolean()\n .optional()\n .describe('Whether to include pending connection requests'),\n});\n\nexport class ListConnectionsTool extends BaseHCS10QueryTool<\n typeof ListConnectionsZodSchema\n> {\n name = 'list_connections';\n description =\n 'Lists all active HCS-10 connections. Use this FIRST before sending messages to check if you already have an active connection to a target agent. Shows connection details and agent information for each active connection.';\n specificInputSchema = ListConnectionsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n args: z.infer<typeof ListConnectionsZodSchema>\n ): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { includeDetails?: boolean; showPending?: boolean } = {};\n if (args.includeDetails !== undefined) {\n params.includeDetails = args.includeDetails;\n }\n if (args.showPending !== undefined) {\n params.showPending = args.showPending;\n }\n await hcs10Builder.listConnections(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as { formattedOutput?: string; message?: string };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Connections listed'\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\n/**\n * A tool to check for new messages on an active HCS-10 connection topic,\n * or optionally fetch the latest messages regardless of timestamp.\n */\nconst CheckMessagesZodSchema = z.object({\n targetIdentifier: z\n .string()\n .describe(\n \"The account ID (e.g., 0.0.12345) of the target agent OR the connection number (e.g., '1', '2') from the 'list_connections' tool to check messages for.\"\n ),\n fetchLatest: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Set to true to fetch the latest messages even if they have been seen before, ignoring the last checked timestamp. Defaults to false (fetching only new messages).'\n ),\n lastMessagesCount: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'When fetchLatest is true, specifies how many of the most recent messages to retrieve. Defaults to 1.'\n ),\n});\n\nexport class CheckMessagesTool extends BaseHCS10QueryTool<\n typeof CheckMessagesZodSchema\n> {\n name = 'check_messages';\n description = `Checks for and retrieves messages from an active connection.\nIdentify the target agent using their account ID (e.g., 0.0.12345) or the connection number shown in 'list_connections'.\nBy default, it only retrieves messages newer than the last check.\nUse 'fetchLatest: true' to get the most recent messages regardless of when they arrived.\nUse 'lastMessagesCount' to specify how many latest messages to retrieve (default 1 when fetchLatest is true).`;\n specificInputSchema = CheckMessagesZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n targetIdentifier,\n fetchLatest,\n lastMessagesCount,\n }: z.infer<typeof CheckMessagesZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n await hcs10Builder.checkMessages({\n targetIdentifier,\n fetchLatest,\n lastMessagesCount: lastMessagesCount || 1,\n });\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n formattedOutput?: string;\n message?: string;\n };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Messages checked',\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { AIAgentCapability } from '@hashgraphonline/standards-sdk';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nimport { NaturalLanguageMapper } from './natural-language-mapper';\n\n/**\n * A tool to search for registered HCS-10 agents using the configured registry.\n */\nconst FindRegistrationsZodSchema = z.object({\n accountId: z\n .string()\n .optional()\n .describe(\n 'Optional: Filter registrations by a specific Hedera account ID (e.g., 0.0.12345).'\n ),\n tags: z\n .union([\n z.array(z.nativeEnum(AIAgentCapability)),\n z.array(z.string()),\n z.string(),\n ])\n .optional()\n .transform((val) => {\n if (!val) return undefined;\n if (typeof val === 'string') {\n return NaturalLanguageMapper.parseCapabilities(val);\n }\n if (Array.isArray(val) && val.length > 0 && typeof val[0] === 'string') {\n return NaturalLanguageMapper.parseTagsOrCapabilities(val);\n }\n return val as AIAgentCapability[];\n })\n .describe(\n 'Optional: Filter by capabilities/tags like \"ai\", \"data\", \"analytics\". Can be natural language terms or capability numbers.'\n ),\n});\n\nexport class FindRegistrationsTool extends BaseHCS10QueryTool<\n typeof FindRegistrationsZodSchema\n> {\n name = 'find_registrations';\n description =\n 'Searches the configured agent registry for HCS-10 agents. You can filter by account ID or tags/capabilities using natural language like \"ai\", \"data processing\", \"analytics\". Returns basic registration info.';\n specificInputSchema = FindRegistrationsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n accountId,\n tags,\n }: z.infer<typeof FindRegistrationsZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { accountId?: string; tags?: number[] } = {};\n if (accountId) {\n params.accountId = accountId;\n }\n if (tags) {\n params.tags = tags as number[];\n }\n await hcs10Builder.findRegistrations(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n formattedOutput?: string;\n message?: string;\n };\n return {\n success: true,\n data: raw.formattedOutput || raw.message || 'Registrations searched',\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst ConnectionMonitorZodSchema = z.object({\n acceptAll: z\n .boolean()\n .optional()\n .describe(\n 'Whether to automatically accept all incoming connection requests. Default is false.'\n ),\n targetAccountId: z\n .string()\n .optional()\n .describe(\n 'If provided, only accept connection requests from this specific account ID.'\n ),\n hbarFees: z\n .array(\n z.object({\n amount: z.number(),\n collectorAccount: z.string().optional(),\n })\n )\n .optional()\n .describe(\n 'Array of HBAR fee amounts to charge per message (with optional collector accounts).'\n ),\n tokenFees: z\n .array(\n z.object({\n amount: z.number(),\n tokenId: z.string(),\n collectorAccount: z.string().optional(),\n })\n )\n .optional()\n .describe(\n 'Array of token fee amounts and IDs to charge per message (with optional collector accounts).'\n ),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe(\n 'Array of account IDs to exempt from ALL fees set in this request.'\n ),\n monitorDurationSeconds: z\n .number()\n .optional()\n .describe(\n 'How long to monitor for incoming requests in seconds. Default is 120.'\n ),\n defaultCollectorAccount: z\n .string()\n .optional()\n .describe(\n 'Default account to collect fees if not specified at the fee level. Defaults to the agent account.'\n ),\n});\n\n/**\n * A tool for monitoring incoming connection requests and accepting them with optional fee settings.\n */\nexport class ConnectionMonitorTool extends BaseHCS10TransactionTool<\n typeof ConnectionMonitorZodSchema\n> {\n name = 'monitor_connections';\n description =\n 'Monitors for incoming connection requests and accepts them with optional fee settings. Use this to watch for connection requests and accept them, optionally setting HBAR or token fees on the connection. Note: When acceptAll=true, this tool requires multiple transactions and cannot be used in returnBytes mode.';\n specificInputSchema = ConnectionMonitorZodSchema;\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof ConnectionMonitorZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n await hcs10Builder.monitorConnections({\n ...(specificArgs.acceptAll !== undefined && {\n acceptAll: specificArgs.acceptAll,\n }),\n ...(specificArgs.targetAccountId !== undefined && {\n targetAccountId: specificArgs.targetAccountId,\n }),\n ...(specificArgs.monitorDurationSeconds !== undefined && {\n monitorDurationSeconds: specificArgs.monitorDurationSeconds,\n }),\n hbarFees: (specificArgs.hbarFees || []) as Array<{\n amount: number;\n collectorAccount?: string;\n }>,\n tokenFees: (specificArgs.tokenFees || []) as Array<{\n amount: number;\n tokenId: string;\n collectorAccount?: string;\n }>,\n ...(specificArgs.exemptAccountIds !== undefined && {\n exemptAccountIds: specificArgs.exemptAccountIds,\n }),\n ...(specificArgs.defaultCollectorAccount !== undefined && {\n defaultCollectorAccount: specificArgs.defaultCollectorAccount,\n }),\n });\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\n\nconst ManageConnectionRequestsZodSchema = z.object({\n action: z\n .enum(['list', 'view', 'reject'])\n .describe(\n 'The action to perform: list all requests, view details of a specific request, or reject a request'\n ),\n requestKey: z\n .string()\n .optional()\n .describe(\n 'The unique request key to view or reject (required for view and reject actions)'\n ),\n});\n\n/**\n * A tool for managing incoming connection requests in a LangChain-compatible way.\n * This tool allows an agent to list, view details of, and reject incoming connection requests.\n */\nexport class ManageConnectionRequestsTool extends BaseHCS10QueryTool<\n typeof ManageConnectionRequestsZodSchema\n> {\n name = 'manage_connection_requests';\n description =\n 'Manage incoming connection requests. List pending requests, view details about requesting agents, and reject connection requests. Use the separate \"accept_connection_request\" tool to accept.';\n specificInputSchema = ManageConnectionRequestsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n action,\n requestKey,\n }: z.infer<typeof ManageConnectionRequestsZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { action: 'list' | 'view' | 'reject'; requestKey?: string } =\n { action };\n if (requestKey !== undefined) {\n params.requestKey = requestKey;\n }\n await hcs10Builder.manageConnectionRequests(params);\n const result = await hcs10Builder.execute();\n return 'rawResult' in result ? result.rawResult : result;\n }\n}\n","import { z } from 'zod';\nimport { BaseHCS10TransactionTool } from './base-hcs10-tools';\nimport { HCS10Builder } from '../../builders/hcs10/hcs10-builder';\nimport { HCS10TransactionToolParams } from './hcs10-tool-params';\nimport { BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst AcceptConnectionRequestZodSchema = z.object({\n requestKey: z\n .string()\n .describe(\n 'The unique request key of the specific request to accept. Use the \"manage_connection_requests\" tool with action=\"list\" first to get valid keys.'\n ),\n hbarFee: z\n .number()\n .optional()\n .describe(\n 'Optional HBAR fee amount to charge the connecting agent per message on the new connection topic.'\n ),\n exemptAccountIds: z\n .array(z.string())\n .optional()\n .describe(\n 'Optional list of account IDs to exempt from any configured fees on the new connection topic.'\n ),\n});\n\n/**\n * Tool for accepting incoming HCS-10 connection requests\n */\nexport class AcceptConnectionRequestTool extends BaseHCS10TransactionTool<\n typeof AcceptConnectionRequestZodSchema\n> {\n name = 'accept_connection_request';\n description =\n 'Accepts a pending HCS-10 connection request from another agent. Use list_unapproved_connection_requests to see pending requests.';\n specificInputSchema = AcceptConnectionRequestZodSchema;\n\n constructor(params: HCS10TransactionToolParams) {\n super(params);\n this.neverScheduleThisTool = true;\n this.requiresMultipleTransactions = true;\n }\n\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof AcceptConnectionRequestZodSchema>\n ): Promise<void> {\n const hcs10Builder = builder as HCS10Builder;\n\n await hcs10Builder.acceptConnection({\n requestKey: specificArgs.requestKey,\n hbarFee: specificArgs.hbarFee,\n exemptAccountIds: specificArgs.exemptAccountIds,\n });\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nconst RetrieveProfileZodSchema = z.object({\n accountId: z\n .string()\n .describe(\n 'The Hedera account ID of the agent whose profile you want to retrieve (e.g., 0.0.12345).'\n ),\n disableCache: z\n .boolean()\n .optional()\n .describe(\n 'Optional: Force refresh from the network instead of using cache.'\n ),\n});\n\n/**\n * Tool to retrieve detailed profile information for a specific HCS-10 agent\n */\nexport class RetrieveProfileTool extends BaseHCS10QueryTool<\n typeof RetrieveProfileZodSchema\n> {\n name = 'retrieve_profile';\n description =\n 'Gets the detailed profile information for a specific HCS-10 agent by their account ID. Returns name, bio, capabilities, topics, and other metadata.';\n specificInputSchema = RetrieveProfileZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery({\n accountId,\n disableCache,\n }: z.infer<typeof RetrieveProfileZodSchema>): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n const params: { accountId: string; disableCache?: boolean } = {\n accountId,\n };\n if (disableCache !== undefined) {\n params.disableCache = disableCache;\n }\n await hcs10Builder.retrieveProfile(params);\n\n const result = await hcs10Builder.execute();\n\n if (result.success && 'rawResult' in result && result.rawResult) {\n const raw = result.rawResult as {\n profileDetails?: string;\n rawProfile?: unknown;\n };\n return {\n success: true,\n data: raw.profileDetails || 'Profile retrieved',\n rawProfile: raw.rawProfile,\n };\n }\n\n return result;\n }\n}","import { z } from 'zod';\nimport { BaseHCS10QueryTool } from './base-hcs10-tools';\nimport { HCS10QueryToolParams } from './hcs10-tool-params';\nconst ListUnapprovedConnectionRequestsZodSchema = z.object({});\n\n/**\n * Lists all connection requests that are not fully established\n */\nexport class ListUnapprovedConnectionRequestsTool extends BaseHCS10QueryTool<\n typeof ListUnapprovedConnectionRequestsZodSchema\n> {\n name = 'list_unapproved_connection_requests';\n description =\n 'Lists all connection requests that are not fully established, including incoming requests needing approval and outgoing requests waiting for confirmation.';\n specificInputSchema = ListUnapprovedConnectionRequestsZodSchema;\n constructor(params: HCS10QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(): Promise<unknown> {\n const hcs10Builder = this.hcs10Builder;\n await hcs10Builder.listUnapprovedConnectionRequests();\n const result = await hcs10Builder.execute();\n return 'rawResult' in result ? result.rawResult : result;\n }\n}","import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { HCS2Builder } from '../../builders/hcs2/hcs2-builder';\nimport {\n HCS2TransactionToolParams,\n HCS2QueryToolParams,\n} from './hcs2-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for HCS2 transaction tools\n */\nexport abstract class BaseHCS2TransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected hcs2Builder: HCS2Builder;\n namespace = 'hcs2' as const;\n\n constructor(params: HCS2TransactionToolParams) {\n super(params);\n this.hcs2Builder = params.hcs2Builder;\n }\n\n /**\n * Override to return the HCS2Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs2Builder;\n }\n}\n\n/**\n * Base class for HCS2 query tools\n */\nexport abstract class BaseHCS2QueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected hcs2Builder: HCS2Builder;\n namespace = 'hcs2' as const;\n\n constructor(params: HCS2QueryToolParams) {\n super(params);\n this.hcs2Builder = params.hcs2Builder;\n }\n\n /**\n * Override to return the HCS2Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs2Builder;\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { HCS2RegistryType } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for creating an HCS-2 registry\n */\nconst createRegistrySchema = z.object({\n registryType: z\n .nativeEnum(HCS2RegistryType)\n .optional()\n .describe('Registry type: 0 for indexed, 1 for non-indexed (default: 0)'),\n ttl: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Time to live in seconds (default: 86400)'),\n adminKey: z\n .union([z.string(), z.boolean()])\n .optional()\n .describe('Admin key: public key string or true to use operator key'),\n submitKey: z\n .union([z.string(), z.boolean()])\n .optional()\n .describe('Submit key: public key string or true to use operator key'),\n});\n\n/**\n * Tool for creating HCS-2 registries\n */\nexport class CreateRegistryTool extends BaseHCS2QueryTool<typeof createRegistrySchema> {\n name = 'createHCS2Registry';\n description = 'Create a new HCS-2 registry topic for storing decentralized data';\n\n get specificInputSchema() {\n return createRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof createRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.createRegistry({\n registryType: params.registryType,\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to create registry');\n }\n\n return `Successfully created HCS-2 registry!\\n\\nTopic ID: ${result.topicId}\\nRegistry Type: ${params.registryType === 1 ? 'Non-Indexed' : 'Indexed'}\\nTTL: ${params.ttl || 86400} seconds\\n\\nYou can now register entries to this registry using the topic ID.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to create HCS-2 registry';\n throw new Error(`Registry creation failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for registering an entry in HCS-2\n */\nconst registerEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (e.g., 0.0.123456)'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The target topic ID to register (e.g., 0.0.123456)'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI (HIP-412 format)'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n/**\n * Tool for registering entries in HCS-2 registries\n */\nexport class RegisterEntryTool extends BaseHCS2QueryTool<typeof registerEntrySchema> {\n name = 'registerHCS2Entry';\n description = 'Register a new entry in an HCS-2 registry';\n\n get specificInputSchema() {\n return registerEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof registerEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.registerEntry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to register entry');\n }\n\n return `Successfully registered entry in HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nTarget Topic ID: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been added to the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to register entry';\n throw new Error(`Entry registration failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for updating an entry in HCS-2\n */\nconst updateEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (must be indexed)'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The new topic ID to point to'),\n uid: z\n .string()\n .describe('The unique ID of the entry to update'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI (HIP-412 format)'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for updating entries in HCS-2 registries\n */\nexport class UpdateEntryTool extends BaseHCS2QueryTool<typeof updateEntrySchema> {\n name = 'updateHCS2Entry';\n description = 'Update an existing entry in an indexed HCS-2 registry';\n\n get specificInputSchema() {\n return updateEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof updateEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.updateEntry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n uid: params.uid,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to update entry');\n }\n\n return `Successfully updated entry in HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nUID: ${params.uid}\\nNew Target Topic ID: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been updated in the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to update entry';\n throw new Error(`Entry update failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for deleting an entry from HCS-2\n */\nconst deleteEntrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID (must be indexed)'),\n uid: z\n .string()\n .describe('The unique ID of the entry to delete'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for deleting entries from HCS-2 registries\n */\nexport class DeleteEntryTool extends BaseHCS2QueryTool<typeof deleteEntrySchema> {\n name = 'deleteHCS2Entry';\n description = 'Delete an entry from an indexed HCS-2 registry';\n\n get specificInputSchema() {\n return deleteEntrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof deleteEntrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.deleteEntry(\n params.registryTopicId,\n {\n uid: params.uid,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to delete entry');\n }\n\n return `Successfully deleted entry from HCS-2 registry!\\n\\nRegistry Topic: ${params.registryTopicId}\\nUID: ${params.uid}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe entry has been removed from the registry.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to delete entry';\n throw new Error(`Entry deletion failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for migrating an HCS-2 registry\n */\nconst migrateRegistrySchema = z.object({\n registryTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The current HCS-2 registry topic ID'),\n targetTopicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The new topic ID to migrate to'),\n metadata: z\n .string()\n .optional()\n .describe('Optional metadata URI for migration details'),\n memo: z\n .string()\n .max(500)\n .optional()\n .describe('Optional memo (max 500 characters)'),\n});\n\n\n/**\n * Tool for migrating HCS-2 registries\n */\nexport class MigrateRegistryTool extends BaseHCS2QueryTool<typeof migrateRegistrySchema> {\n name = 'migrateHCS2Registry';\n description = 'Migrate an HCS-2 registry to a new topic';\n\n get specificInputSchema() {\n return migrateRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof migrateRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n try {\n const result = await this.hcs2Builder.migrateRegistry(\n params.registryTopicId,\n {\n targetTopicId: params.targetTopicId,\n metadata: params.metadata,\n memo: params.memo,\n }\n );\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to migrate registry');\n }\n\n return `Successfully migrated HCS-2 registry!\\n\\nFrom Registry Topic: ${params.registryTopicId}\\nTo Target Topic: ${params.targetTopicId}${params.metadata ? `\\nMetadata: ${params.metadata}` : ''}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe registry has been migrated to the new topic.`;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to migrate registry';\n throw new Error(`Registry migration failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for querying HCS-2 registry\n */\nconst queryRegistrySchema = z.object({\n topicId: z\n .string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/)\n .describe('The HCS-2 registry topic ID to query'),\n limit: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Maximum number of entries to return'),\n order: z\n .enum(['asc', 'desc'])\n .optional()\n .describe('Order of results (ascending or descending)'),\n skip: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Number of entries to skip'),\n});\n\n\n/**\n * Tool for querying HCS-2 registries\n */\nexport class QueryRegistryTool extends BaseHCS2QueryTool<typeof queryRegistrySchema> {\n name = 'queryHCS2Registry';\n description = 'Query entries from an HCS-2 registry';\n\n get specificInputSchema() {\n return queryRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof queryRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const registry = await this.hcs2Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n return {\n topicId: registry.topicId,\n registryType: registry.registryType === 0 ? 'indexed' : 'non-indexed',\n ttl: registry.ttl,\n totalEntries: registry.entries.length,\n entries: registry.entries.map(entry => ({\n sequence: entry.sequence,\n timestamp: entry.timestamp,\n payer: entry.payer,\n operation: entry.message.op,\n targetTopicId: entry.message.t_id,\n uid: entry.message.uid,\n metadata: entry.message.metadata,\n memo: entry.message.m,\n })),\n };\n }\n}","import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { HCS6Builder } from '../../builders/hcs6/hcs6-builder';\nimport {\n HCS6TransactionToolParams,\n HCS6QueryToolParams,\n} from './hcs6-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for HCS6 transaction tools\n */\nexport abstract class BaseHCS6TransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected hcs6Builder: HCS6Builder;\n namespace = 'hcs6' as const;\n\n constructor(params: HCS6TransactionToolParams) {\n super(params);\n this.hcs6Builder = params.hcs6Builder;\n }\n\n /**\n * Override to return the HCS6Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs6Builder;\n }\n}\n\n/**\n * Base class for HCS6 query tools\n */\nexport abstract class BaseHCS6QueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected hcs6Builder: HCS6Builder;\n namespace = 'hcs6' as const;\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n this.hcs6Builder = params.hcs6Builder;\n }\n\n /**\n * Override to return the HCS6Builder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.hcs6Builder;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6TransactionTool } from './base-hcs6-tools';\nimport { HCS6TransactionToolParams } from './hcs6-tool-params';\nimport type { TransactionResponse } from 'hedera-agent-kit';\n\n/**\n * Schema for creating a dynamic hashinal registry\n */\nconst CreateDynamicRegistrySchema = z.object({\n ttl: z.number()\n .min(3600)\n .default(86400)\n .describe('Time-to-live in seconds (minimum 3600 seconds/1 hour)'),\n adminKey: z.union([z.boolean(), z.string()])\n .optional()\n .describe('Admin key for the registry topic. Can be boolean (use operator key) or a public key string'),\n submitKey: z.union([z.boolean(), z.string()])\n .optional()\n .describe('Submit key for the registry topic. Can be boolean (use operator key) or a public key string'),\n});\n\nexport type CreateDynamicRegistryInput = z.infer<typeof CreateDynamicRegistrySchema>;\n\n/**\n * Tool for creating HCS-6 dynamic registries\n */\nexport class CreateDynamicRegistryTool extends BaseHCS6TransactionTool<typeof CreateDynamicRegistrySchema> {\n name = 'createDynamicRegistry';\n description = 'Create a new HCS-6 dynamic registry for managing evolving content';\n schema = CreateDynamicRegistrySchema;\n\n constructor(params: HCS6TransactionToolParams) {\n super(params);\n }\n\n protected async _call(\n params: CreateDynamicRegistryInput\n ): Promise<TransactionResponse> {\n try {\n const result = await this.hcs6Builder.createRegistry({\n ttl: params.ttl,\n adminKey: params.adminKey,\n submitKey: params.submitKey,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to create dynamic registry');\n }\n\n return {\n status: 'success',\n data: {\n topicId: result.topicId,\n transactionId: result.transactionId,\n ttl: params.ttl,\n memo: `hcs-6:1:${params.ttl}`,\n },\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS6TransactionTool } from './base-hcs6-tools';\nimport { HCS6TransactionToolParams } from './hcs6-tool-params';\nimport type { TransactionResponse } from 'hedera-agent-kit';\n\n/**\n * Schema for registering a dynamic hashinal\n */\nconst RegisterDynamicHashinalSchema = z.object({\n metadata: z.record(z.unknown())\n .describe('Metadata object for the hashinal (e.g., name, description, attributes)'),\n data: z.object({\n base64: z.string().optional().describe('Base64 encoded data for the hashinal'),\n url: z.string().optional().describe('URL to fetch data from'),\n mimeType: z.string().optional().describe('MIME type of the data'),\n }).optional()\n .describe('Data to inscribe with the hashinal'),\n memo: z.string()\n .optional()\n .describe('Optional memo for the registration'),\n ttl: z.number()\n .min(3600)\n .default(86400)\n .describe('Time-to-live in seconds for the inscription'),\n registryTopicId: z.string()\n .optional()\n .describe('Registry topic ID to use. If not provided, a new registry will be created'),\n submitKey: z.string()\n .optional()\n .describe('Submit key for the registry (required if registry has a submit key)'),\n});\n\nexport type RegisterDynamicHashinalInput = z.infer<typeof RegisterDynamicHashinalSchema>;\n\n/**\n * Tool for registering (creating) dynamic hashinals\n */\nexport class RegisterDynamicHashinalTool extends BaseHCS6TransactionTool<typeof RegisterDynamicHashinalSchema> {\n name = 'registerDynamicHashinal';\n description = 'Create and register a new dynamic hashinal that can be updated over time';\n schema = RegisterDynamicHashinalSchema;\n\n constructor(params: HCS6TransactionToolParams) {\n super(params);\n }\n\n protected async _call(\n params: RegisterDynamicHashinalInput\n ): Promise<TransactionResponse> {\n try {\n const result = await this.hcs6Builder.register({\n metadata: params.metadata,\n data: params.data,\n memo: params.memo,\n ttl: params.ttl,\n registryTopicId: params.registryTopicId,\n submitKey: params.submitKey,\n });\n\n if (!result.success || !result.registryTopicId || !result.inscriptionTopicId) {\n throw new Error(result.error || 'Failed to register dynamic hashinal');\n }\n\n return {\n status: 'success',\n data: {\n registryTopicId: result.registryTopicId,\n inscriptionTopicId: result.inscriptionTopicId,\n transactionId: result.transactionId,\n },\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS6TransactionTool } from './base-hcs6-tools';\nimport { HCS6TransactionToolParams } from './hcs6-tool-params';\nimport type { TransactionResponse } from 'hedera-agent-kit';\n\n/**\n * Schema for updating a dynamic hashinal\n */\nconst UpdateDynamicHashinalSchema = z.object({\n registryTopicId: z.string()\n .describe('The registry topic ID that tracks this dynamic hashinal'),\n metadata: z.record(z.unknown())\n .describe('Updated metadata object for the hashinal'),\n data: z.object({\n base64: z.string().optional().describe('Base64 encoded data for the updated hashinal'),\n url: z.string().optional().describe('URL to fetch updated data from'),\n mimeType: z.string().optional().describe('MIME type of the data'),\n }).optional()\n .describe('Updated data to inscribe'),\n memo: z.string()\n .optional()\n .describe('Optional memo for the update (e.g., \"Level up\", \"Version 2.0\")'),\n submitKey: z.string()\n .describe('Submit key for the registry (required to update)'),\n});\n\nexport type UpdateDynamicHashinalInput = z.infer<typeof UpdateDynamicHashinalSchema>;\n\n/**\n * Tool for updating dynamic hashinals\n */\nexport class UpdateDynamicHashinalTool extends BaseHCS6TransactionTool<typeof UpdateDynamicHashinalSchema> {\n name = 'updateDynamicHashinal';\n description = 'Update an existing dynamic hashinal with new content while maintaining the same registry';\n schema = UpdateDynamicHashinalSchema;\n\n constructor(params: HCS6TransactionToolParams) {\n super(params);\n }\n\n protected async _call(\n params: UpdateDynamicHashinalInput\n ): Promise<TransactionResponse> {\n try {\n // Use the register method with the existing registry ID\n const result = await this.hcs6Builder.register({\n metadata: params.metadata,\n data: params.data,\n memo: params.memo,\n registryTopicId: params.registryTopicId,\n submitKey: params.submitKey,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to update dynamic hashinal');\n }\n\n return {\n status: 'success',\n data: {\n registryTopicId: result.registryTopicId,\n newInscriptionTopicId: result.inscriptionTopicId,\n transactionId: result.transactionId,\n updateMemo: params.memo,\n },\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport type { TransactionResponse } from 'hedera-agent-kit';\n\n/**\n * Schema for querying a dynamic registry\n */\nconst QueryDynamicRegistrySchema = z.object({\n topicId: z.string()\n .describe('The registry topic ID to query'),\n limit: z.number()\n .optional()\n .default(100)\n .describe('Maximum number of entries to retrieve'),\n order: z.enum(['asc', 'desc'])\n .optional()\n .default('desc')\n .describe('Order of entries (desc shows latest first)'),\n skip: z.number()\n .optional()\n .describe('Number of entries to skip'),\n});\n\nexport type QueryDynamicRegistryInput = z.infer<typeof QueryDynamicRegistrySchema>;\n\n/**\n * Tool for querying HCS-6 dynamic registries\n */\nexport class QueryDynamicRegistryTool extends BaseHCS6QueryTool<typeof QueryDynamicRegistrySchema> {\n name = 'queryDynamicRegistry';\n description = 'Query a dynamic registry to get the current state of a dynamic hashinal';\n schema = QueryDynamicRegistrySchema;\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async _call(\n params: QueryDynamicRegistryInput\n ): Promise<TransactionResponse> {\n try {\n const registry = await this.hcs6Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n return {\n status: 'success',\n data: {\n topicId: registry.topicId,\n registryType: 'NON_INDEXED',\n ttl: registry.ttl,\n latestEntry: registry.latestEntry ? {\n topicId: registry.latestEntry.message.t_id,\n timestamp: registry.latestEntry.timestamp,\n memo: registry.latestEntry.message.m,\n sequence: registry.latestEntry.sequence,\n payer: registry.latestEntry.payer,\n } : null,\n totalEntries: registry.entries.length,\n },\n };\n } catch (error) {\n return {\n status: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}","import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { InscriberBuilder } from '../../builders/inscriber/inscriber-builder';\nimport {\n InscriberTransactionToolParams,\n InscriberQueryToolParams,\n} from './inscriber-tool-params';\nimport { z } from 'zod';\n\n/**\n * Base class for Inscriber transaction tools\n */\nexport abstract class BaseInscriberTransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberTransactionToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n}\n\n/**\n * Base class for Inscriber query tools\n */\nexport abstract class BaseInscriberQueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberQueryToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing from URL\n */\nconst inscribeFromUrlSchema = z.object({\n url: z.string().url().describe('The URL of the content to inscribe'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing content from URL\n */\nexport class InscribeFromUrlTool extends BaseInscriberQueryTool<typeof inscribeFromUrlSchema> {\n name = 'inscribeFromUrl';\n description = 'Inscribe content ONLY from URLs that point directly to downloadable files (PDF, image, JSON, ZIP, etc). This tool will FAIL for web pages, news sites, or social media. Examples of VALID URLs: https://example.com/document.pdf, https://cdn.example.com/image.jpg, https://api.example.com/data.json. For web page articles or any content you retrieve via MCP tools, you MUST use inscribeFromBuffer instead after retrieving the content.';\n\n get specificInputSchema() {\n return inscribeFromUrlSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromUrlSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromUrlTool.executeQuery called with URL: ${params.url}`);\n \n if (!params.url || params.url.trim() === '') {\n throw new Error('URL cannot be empty. Please provide a valid URL.');\n }\n\n try {\n const urlObj = new URL(params.url);\n if (!urlObj.protocol || !urlObj.host) {\n throw new Error('Invalid URL format. Please provide a complete URL with protocol (http/https).');\n }\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n throw new Error('Only HTTP and HTTPS URLs are supported for inscription.');\n }\n } catch (error) {\n throw new Error(`Invalid URL: ${params.url}. Please provide a valid URL.`);\n }\n\n console.log(`[InscribeFromUrlTool] Validating URL content before inscription...`);\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n \n try {\n // First try HEAD request\n const headResponse = await fetch(params.url, {\n method: 'HEAD',\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n if (!headResponse.ok) {\n throw new Error(`URL returned error status ${headResponse.status}: ${headResponse.statusText}. Cannot inscribe content from inaccessible URLs.`);\n }\n\n const contentType = headResponse.headers.get('content-type') || '';\n const contentLength = headResponse.headers.get('content-length');\n \n // Check if content type indicates HTML/web page\n const webPageContentTypes = [\n 'text/html',\n 'application/xhtml+xml',\n 'text/xml'\n ];\n \n if (webPageContentTypes.some(type => contentType.toLowerCase().includes(type))) {\n throw new Error(`URL returns HTML/web page content (Content-Type: ${contentType}). This tool only works with direct file URLs (PDFs, images, JSON, etc.). For web page content, first retrieve the content using the appropriate MCP tool or web scraper, then use inscribeFromBuffer to inscribe it.`);\n }\n \n if (contentLength && parseInt(contentLength) === 0) {\n throw new Error('URL returns empty content (Content-Length: 0). Cannot inscribe empty content.');\n }\n\n if (contentLength && parseInt(contentLength) < 10) {\n throw new Error(`URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`);\n }\n \n // If HEAD doesn't provide content-type, do a partial GET to check\n if (!contentType || contentType === 'application/octet-stream') {\n console.log(`[InscribeFromUrlTool] Content-Type unclear, fetching first 1KB to verify...`);\n \n const getController = new AbortController();\n const getTimeoutId = setTimeout(() => getController.abort(), 5000);\n \n try {\n const getResponse = await fetch(params.url, {\n signal: getController.signal,\n headers: {\n 'Range': 'bytes=0-1023' // Get first 1KB\n }\n });\n \n clearTimeout(getTimeoutId);\n \n if (getResponse.ok || getResponse.status === 206) { // 206 is partial content\n const buffer = await getResponse.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n const text = new TextDecoder('utf-8', { fatal: false }).decode(bytes.slice(0, 512));\n \n // Check if it looks like HTML\n if (text.toLowerCase().includes('<!doctype html') || \n text.toLowerCase().includes('<html') ||\n text.match(/<meta\\s+[^>]*>/i) ||\n text.match(/<title>/i)) {\n throw new Error(`URL returns HTML content. This tool only works with direct file URLs. For web page content, first retrieve it using the appropriate tool, then use inscribeFromBuffer.`);\n }\n }\n } catch (getError) {\n clearTimeout(getTimeoutId);\n if (getError instanceof Error && getError.message.includes('HTML content')) {\n throw getError;\n }\n // If partial GET fails, continue anyway\n console.log(`[InscribeFromUrlTool] Could not perform partial GET validation: ${getError instanceof Error ? getError.message : 'Unknown error'}`);\n }\n }\n\n console.log(`[InscribeFromUrlTool] URL validation passed. Content-Type: ${contentType}, Content-Length: ${contentLength || 'unknown'}`);\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n console.log(`[InscribeFromUrlTool] Warning: URL validation timed out after 10 seconds. Proceeding with inscription attempt.`);\n } else if (error.message.includes('URL returned error') || error.message.includes('empty content') || error.message.includes('too small') || error.message.includes('HTML')) {\n throw error;\n } else {\n console.log(`[InscribeFromUrlTool] Warning: Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`);\n }\n }\n }\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Inscription timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise\n ]) as any;\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe from URL';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * Schema for inscribing from file\n */\nconst inscribeFromFileSchema = z.object({\n filePath: z.string().min(1, 'File path cannot be empty').describe('The file path of the content to inscribe. Must point to a valid, non-empty file.'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds for inscription (default: no timeout)'),\n apiKey: z.string().optional().describe('API key for inscription service'),\n});\n\n/**\n * Tool for inscribing content from file\n */\nexport class InscribeFromFileTool extends BaseInscriberQueryTool<\n typeof inscribeFromFileSchema\n> {\n name = 'inscribeFromFile';\n description =\n 'Inscribe content from a local file to the Hedera network using a file path. IMPORTANT: Only use this tool when you have a valid file path to actual content. The file must exist and contain meaningful data (minimum 10 bytes). For files accessed through MCP filesystem tools, consider reading the file content first and using inscribeFromBuffer instead.';\n\n get specificInputSchema(): typeof inscribeFromFileSchema {\n return inscribeFromFileSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromFileSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromFileTool.executeQuery called with: ${params.filePath}`);\n \n // File validation\n let fileContent: Buffer;\n try {\n console.log(`[DEBUG] Checking file: ${params.filePath}`);\n console.log(`[DEBUG] Current working directory: ${process.cwd()}`);\n\n const stats = await fs.stat(params.filePath);\n if (!stats.isFile()) {\n throw new Error(`Path \"${params.filePath}\" is not a file`);\n }\n\n console.log(`[DEBUG] File size: ${stats.size} bytes`);\n\n if (stats.size === 0) {\n throw new Error(\n `File \"${params.filePath}\" is empty (0 bytes). Cannot inscribe empty files.`\n );\n }\n\n if (stats.size < 10) {\n throw new Error(\n `File \"${params.filePath}\" is too small (${stats.size} bytes). Files must contain at least 10 bytes of meaningful content.`\n );\n }\n\n if (stats.size > 100 * 1024 * 1024) {\n console.log(`[InscribeFromFileTool] WARNING: Large file detected (${(stats.size / (1024 * 1024)).toFixed(2)} MB)`);\n }\n\n this.logger?.info('Reading file content...');\n fileContent = await fs.readFile(params.filePath);\n this.logger?.info(`Read ${fileContent.length} bytes from file`);\n\n if (!fileContent || fileContent.length === 0) {\n throw new Error(\n `File \"${params.filePath}\" has no content after reading. Cannot inscribe empty files.`\n );\n }\n\n if (fileContent.length < 10) {\n throw new Error(\n `File \"${params.filePath}\" content is too small (${fileContent.length} bytes). Files must contain at least 10 bytes of meaningful content.`\n );\n }\n\n const fileName = path.basename(params.filePath);\n const mimeType = this.getMimeType(fileName);\n if (mimeType.startsWith('text/') || mimeType === 'application/json') {\n const textContent = fileContent.toString('utf8', 0, Math.min(fileContent.length, 1000));\n if (textContent.trim() === '') {\n throw new Error(\n `File \"${params.filePath}\" contains only whitespace or empty content. Cannot inscribe meaningless data.`\n );\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('ENOENT')) {\n throw new Error(`File not found: \"${params.filePath}\"`);\n }\n throw error;\n }\n throw new Error(`Failed to read file: ${error}`);\n }\n\n const base64Data = fileContent.toString('base64');\n this.logger?.info(`Converted to base64: ${base64Data.length} characters`);\n\n const fileName = path.basename(params.filePath);\n const mimeType = this.getMimeType(fileName);\n this.logger?.info(`File: ${fileName}, MIME type: ${mimeType}`);\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n };\n\n try {\n let result: any;\n \n if (params.timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${params.timeoutMs}ms`)),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n );\n }\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId\n ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}`\n : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n result.result.transactionId\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to inscribe from file';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n private getMimeType(fileName: string): string {\n const ext = path.extname(fileName).toLowerCase();\n const mimeTypes: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.json': 'application/json',\n '.txt': 'text/plain',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.ts': 'application/typescript',\n '.mp4': 'video/mp4',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.zip': 'application/zip',\n };\n return mimeTypes[ext] || 'application/octet-stream';\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing from buffer\n */\nconst inscribeFromBufferSchema = z.object({\n base64Data: z.string().min(1, 'Base64 data cannot be empty').describe('Base64 encoded content to inscribe. Must contain valid, non-empty content (minimum 10 bytes after decoding).'),\n fileName: z.string().min(1, 'File name cannot be empty').describe('Name for the inscribed content. Required for all inscriptions.'),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content'),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds for inscription (default: no timeout)'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing content from buffer\n */\nexport class InscribeFromBufferTool extends BaseInscriberQueryTool<typeof inscribeFromBufferSchema> {\n name = 'inscribeFromBuffer';\n description = 'Inscribe content that you already have retrieved or generated. ALWAYS use this tool for: web page articles (after using MCP tools), API responses, text data, or any content from MCP tools. Steps: 1) Retrieve content using appropriate tool, 2) Convert to base64, 3) Use this tool. NEVER use inscribeFromUrl for web pages - that tool is ONLY for direct file downloads like PDFs or images.';\n\n get specificInputSchema() {\n return inscribeFromBufferSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n console.log(`[DEBUG] InscribeFromBufferTool.executeQuery called`);\n console.log(`[DEBUG] Buffer tool received base64Data length: ${params.base64Data?.length || 0}`);\n console.log(`[DEBUG] Buffer tool fileName: ${params.fileName}`);\n console.log(`[DEBUG] Buffer tool mimeType: ${params.mimeType}`);\n \n if (!params.base64Data || params.base64Data.trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: No data provided`);\n throw new Error('No data provided. Cannot inscribe empty content. Please provide valid base64 encoded data.');\n }\n\n if (!params.fileName || params.fileName.trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: No fileName provided`);\n throw new Error('No fileName provided. A valid fileName is required for inscription.');\n }\n\n let buffer: Buffer;\n try {\n buffer = Buffer.from(params.base64Data, 'base64');\n } catch (error) {\n console.log(`[InscribeFromBufferTool] ERROR: Invalid base64 data`);\n throw new Error('Invalid base64 data provided. Please ensure the data is properly base64 encoded.');\n }\n \n console.log(`[InscribeFromBufferTool] Buffer length after conversion: ${buffer.length}`);\n \n if (buffer.length === 0) {\n console.log(`[InscribeFromBufferTool] ERROR: Buffer is empty after conversion`);\n throw new Error('Buffer is empty after base64 conversion. The provided data appears to be invalid or empty.');\n }\n\n if (buffer.length < 10) {\n console.log(`[InscribeFromBufferTool] WARNING: Buffer is very small (${buffer.length} bytes)`);\n console.log(`[InscribeFromBufferTool] Buffer content preview: ${buffer.toString('utf8', 0, Math.min(buffer.length, 50))}`);\n throw new Error(`Buffer content is too small (${buffer.length} bytes). This may indicate empty or invalid content. Please verify the source data contains actual content.`);\n }\n\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(params.base64Data);\n if (!isValidBase64) {\n console.log(`[InscribeFromBufferTool] ERROR: Invalid base64 format`);\n throw new Error('Invalid base64 format. The data does not appear to be properly base64 encoded.');\n }\n\n if (buffer.toString('utf8', 0, Math.min(buffer.length, 100)).trim() === '') {\n console.log(`[InscribeFromBufferTool] ERROR: Buffer contains only whitespace or empty content`);\n throw new Error('Buffer contains only whitespace or empty content. Cannot inscribe meaningless data.');\n }\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n let result: any;\n \n if (params.timeoutMs) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${params.timeoutMs}ms`)),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer,\n fileName: params.fileName,\n mimeType: params.mimeType,\n },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n {\n type: 'buffer',\n buffer,\n fileName: params.fileName,\n mimeType: params.mimeType,\n },\n options\n );\n }\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe inscription is now available.`;\n } else {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe from buffer';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = z.object({\n url: z.string().url().describe('The URL of the content to inscribe as Hashinal NFT'),\n name: z.string().describe('Name of the Hashinal NFT'),\n creator: z.string().describe('Creator account ID or name'),\n description: z.string().describe('Description of the Hashinal NFT'),\n type: z.string().describe('Type of NFT (e.g., \"image\", \"video\", \"audio\")'),\n attributes: z\n .array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n .optional()\n .describe('NFT attributes'),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Additional properties'),\n jsonFileURL: z\n .string()\n .url()\n .optional()\n .describe('URL to JSON metadata file'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the NFT'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool extends BaseInscriberQueryTool<typeof inscribeHashinalSchema> {\n name = 'inscribeHashinal';\n description = 'Inscribe content as a Hashinal NFT on the Hedera network';\n\n get specificInputSchema() {\n return inscribeHashinalSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const metadata = {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n properties: params.properties,\n };\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata,\n jsonFileURL: params.jsonFileURL,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.waitForConfirmation ?? true,\n waitMaxAttempts: 10,\n waitIntervalMs: 3000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n };\n\n try {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Inscription timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise\n ]) as any;\n\n if (result.confirmed) {\n const topicId = result.inscription?.topic_id || result.result.topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;\n return `Successfully inscribed and confirmed Hashinal NFT on the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\nTopic ID: ${topicId || 'N/A'}${cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''}\\n\\nThe Hashinal NFT is now available.`;\n } else {\n return `Successfully submitted Hashinal NFT inscription to the Hedera network!\\n\\nTransaction ID: ${result.result.transactionId}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for retrieving inscription\n */\nconst retrieveInscriptionSchema = z.object({\n transactionId: z\n .string()\n .describe('The transaction ID of the inscription to retrieve'),\n apiKey: z\n .string()\n .optional()\n .describe('API key for inscription service'),\n});\n\n\n/**\n * Tool for retrieving inscriptions\n */\nexport class RetrieveInscriptionTool extends BaseInscriberQueryTool<typeof retrieveInscriptionSchema> {\n name = 'retrieveInscription';\n description = 'Retrieve details of an existing inscription from the Hedera network';\n\n get specificInputSchema() {\n return retrieveInscriptionSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof retrieveInscriptionSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const result = await this.inscriberBuilder.retrieveInscription(\n params.transactionId,\n {\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet',\n }\n );\n\n return {\n inscriptionId: (result as any).inscriptionId,\n transactionId: result.transactionId,\n topicId: (result as any).topic_id,\n status: result.status,\n holderId: (result as any).holderId,\n metadata: result.metadata,\n tags: (result as any).tags,\n mode: result.mode,\n chunks: (result as any).chunks,\n createdAt: (result as any).createdAt,\n completedAt: (result as any).completed || (result as any).completedAt,\n fileUrl: result.fileUrl,\n mimeType: (result as any).mimeType,\n fileSize: (result as any).fileSize,\n };\n }\n}","import {\n HCS10Client,\n AgentBuilder,\n Logger,\n} from '@hashgraphonline/standards-sdk';\nimport fs from 'fs';\nimport path from 'path';\nimport { ensureAgentHasEnoughHbar } from './ensure-agent-has-hbar';\n\nexport const ENV_FILE_PATH = path.join(process.cwd(), '.env');\n\nexport interface AgentData {\n accountId: string;\n operatorId: string;\n inboundTopicId: string;\n outboundTopicId: string;\n client: HCS10Client;\n}\n\nexport interface RegistrationProgressData {\n registered: boolean;\n accountId?: string;\n privateKey?: string;\n publicKey?: string;\n inboundTopicId?: string;\n outboundTopicId?: string;\n}\n\nexport async function getAgentFromEnv(\n logger: Logger,\n baseClient: HCS10Client,\n agentName: string,\n envPrefix: string\n): Promise<AgentData | null> {\n const accountIdEnvVar = `${envPrefix}_ACCOUNT_ID`;\n const privateKeyEnvVar = `${envPrefix}_PRIVATE_KEY`;\n const inboundTopicIdEnvVar = `${envPrefix}_INBOUND_TOPIC_ID`;\n const outboundTopicIdEnvVar = `${envPrefix}_OUTBOUND_TOPIC_ID`;\n\n const accountId = process.env[accountIdEnvVar];\n const privateKey = process.env[privateKeyEnvVar];\n const inboundTopicId = process.env[inboundTopicIdEnvVar];\n const outboundTopicId = process.env[outboundTopicIdEnvVar];\n\n if (!accountId || !privateKey || !inboundTopicId || !outboundTopicId) {\n logger.info(`${agentName} agent not found in environment variables`);\n return null;\n }\n\n logger.info(`${agentName} agent found in environment variables`);\n logger.info(`${agentName} account ID: ${accountId}`);\n logger.info(`${agentName} inbound topic ID: ${inboundTopicId}`);\n logger.info(`${agentName} outbound topic ID: ${outboundTopicId}`);\n\n const client = new HCS10Client({\n network: 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n guardedRegistryBaseUrl: process.env.REGISTRY_URL,\n prettyPrint: true,\n logLevel: 'debug',\n });\n\n await ensureAgentHasEnoughHbar(logger, baseClient, accountId, agentName);\n\n return {\n accountId,\n operatorId: `${inboundTopicId}@${accountId}`,\n inboundTopicId,\n outboundTopicId,\n client,\n };\n}\n\nexport async function createAgent(\n logger: Logger,\n baseClient: HCS10Client,\n agentName: string,\n agentBuilder: AgentBuilder,\n envPrefix: string\n): Promise<AgentData | null> {\n try {\n logger.info(`Creating ${agentName} agent...`);\n\n const result = await baseClient.createAndRegisterAgent(agentBuilder);\n\n if (!result.metadata) {\n logger.error(`${agentName} agent creation failed`);\n return null;\n }\n\n logger.info(`${agentName} agent created successfully`);\n logger.info(`${agentName} account ID: ${result.metadata.accountId}`);\n logger.info(`${agentName} private key: ${result.metadata.privateKey}`);\n logger.info(\n `${agentName} inbound topic ID: ${result.metadata.inboundTopicId}`\n );\n logger.info(\n `${agentName} outbound topic ID: ${result.metadata.outboundTopicId}`\n );\n\n const envVars = {\n [`${envPrefix}_ACCOUNT_ID`]: result.metadata.accountId,\n [`${envPrefix}_PRIVATE_KEY`]: result.metadata.privateKey,\n [`${envPrefix}_INBOUND_TOPIC_ID`]: result.metadata.inboundTopicId,\n [`${envPrefix}_OUTBOUND_TOPIC_ID`]: result.metadata.outboundTopicId,\n };\n\n await updateEnvFile(ENV_FILE_PATH, envVars);\n\n const client = new HCS10Client({\n network: 'testnet',\n operatorId: result.metadata.accountId,\n operatorPrivateKey: result.metadata.privateKey,\n guardedRegistryBaseUrl: process.env.REGISTRY_URL,\n prettyPrint: true,\n logLevel: 'debug',\n });\n\n return {\n accountId: result.metadata.accountId,\n operatorId: `${result.metadata.inboundTopicId}@${result.metadata.accountId}`,\n inboundTopicId: result.metadata.inboundTopicId,\n outboundTopicId: result.metadata.outboundTopicId,\n client,\n };\n } catch (error) {\n console.log('error', error, baseClient);\n logger.error(`Error creating ${agentName} agent:`, error);\n return null;\n }\n}\n\nexport async function updateEnvFile(\n envFilePath: string,\n variables: Record<string, string>\n): Promise<void> {\n let envContent = '';\n\n if (fs.existsSync(envFilePath)) {\n envContent = fs.readFileSync(envFilePath, 'utf8');\n }\n\n const envLines = envContent.split('\\n');\n const updatedLines = [...envLines];\n\n for (const [key, value] of Object.entries(variables)) {\n const lineIndex = updatedLines.findIndex((line) =>\n line.startsWith(`${key}=`)\n );\n\n if (lineIndex !== -1) {\n updatedLines[lineIndex] = `${key}=${value}`;\n } else {\n updatedLines.push(`${key}=${value}`);\n }\n }\n\n fs.writeFileSync(envFilePath, updatedLines.join('\\n'));\n}\n","import { updateEnvFile } from '../utils/state-tools';\nimport {\n RegisteredAgent,\n ActiveConnection,\n IStateManager,\n AgentPersistenceOptions,\n EnvFilePersistenceOptions,\n ConnectionStatus,\n} from './state-types';\nimport {\n ConnectionsManager,\n HCS10BaseClient,\n Connection,\n Logger,\n IConnectionsManager,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Implementation of the IStateManager interface for the OpenConvai system.\n * Manages agent state and connection information with thread safety and\n * proper timestamp tracking.\n */\nexport class OpenConvaiState implements IStateManager {\n private currentAgent: RegisteredAgent | null = null;\n private connectionMessageTimestamps: Record<string, number> = {};\n private defaultEnvFilePath?: string;\n private defaultPrefix: string;\n private connectionsManager: IConnectionsManager | null = null;\n private logger: Logger;\n\n /**\n * Creates a new OpenConvaiState instance\n * @param options - Options for environment variable persistence\n */\n constructor(options?: {\n defaultEnvFilePath?: string;\n defaultPrefix?: string;\n baseClient?: HCS10BaseClient;\n disableLogging?: boolean;\n }) {\n this.defaultEnvFilePath = options?.defaultEnvFilePath;\n this.defaultPrefix = options?.defaultPrefix ?? 'TODD';\n const shouldSilence = options?.disableLogging || process.env.DISABLE_LOGGING === 'true';\n this.logger = new Logger({ module: 'OpenConvaiState', silent: shouldSilence });\n\n // Initialize ConnectionsManager immediately if baseClient is provided\n if (options?.baseClient) {\n this.initializeConnectionsManager(options.baseClient);\n }\n }\n\n /**\n * Initializes the ConnectionsManager\n * @param baseClient - HCS10BaseClient instance to use\n */\n initializeConnectionsManager(\n baseClient: HCS10BaseClient\n ): IConnectionsManager {\n if (!this.connectionsManager) {\n this.logger.debug('Initializing ConnectionsManager');\n this.connectionsManager = new ConnectionsManager({\n baseClient,\n logLevel: 'error',\n });\n } else {\n this.logger.debug('ConnectionsManager already initialized');\n }\n return this.connectionsManager;\n }\n\n /**\n * Gets the ConnectionsManager instance\n * @returns The ConnectionsManager instance, or null if not initialized\n */\n getConnectionsManager(): IConnectionsManager | null {\n return this.connectionsManager;\n }\n\n /**\n * Sets the current active agent and clears any previous connection data.\n * This should be called when switching between agents.\n */\n setCurrentAgent(agent: RegisteredAgent | null): void {\n this.currentAgent = agent;\n this.connectionMessageTimestamps = {};\n\n // Clear connections manager when changing agents\n if (this.connectionsManager) {\n this.connectionsManager.clearAll();\n }\n }\n\n /**\n * Returns the currently active agent or null if none is set.\n */\n getCurrentAgent(): RegisteredAgent | null {\n return this.currentAgent;\n }\n\n /**\n * Adds a new connection to the active connections list.\n * Ensures no duplicates are added based on connectionTopicId.\n * Initializes timestamp tracking for the connection.\n */\n addActiveConnection(connection: ActiveConnection): void {\n if (!this.connectionsManager) {\n this.logger.error(\n 'ConnectionsManager not initialized. Call initializeConnectionsManager before adding connections.'\n );\n throw new Error(\n 'ConnectionsManager not initialized. Call initializeConnectionsManager before adding connections.'\n );\n }\n\n // Convert from ActiveConnection to Connection\n const sdkConnection: Connection = {\n connectionTopicId: connection.connectionTopicId,\n targetAccountId: connection.targetAccountId,\n targetAgentName: connection.targetAgentName,\n targetInboundTopicId: connection.targetInboundTopicId,\n status: this.convertConnectionStatus(connection.status || 'established'),\n isPending: connection.isPending || false,\n needsConfirmation: connection.needsConfirmation || false,\n created: connection.created || new Date(),\n lastActivity: connection.lastActivity,\n profileInfo: connection.profileInfo,\n connectionRequestId: connection.connectionRequestId,\n processed: true,\n };\n\n // Add to ConnectionsManager\n this.connectionsManager.updateOrAddConnection(sdkConnection);\n\n // Initialize timestamp tracking\n this.initializeTimestampIfNeeded(connection.connectionTopicId);\n }\n\n /**\n * Updates an existing connection or adds it if not found.\n * Preserves existing properties when updating by merging objects.\n */\n updateOrAddConnection(connection: ActiveConnection): void {\n this.addActiveConnection(connection);\n }\n\n /**\n * Returns a copy of all active connections.\n */\n listConnections(): ActiveConnection[] {\n if (!this.connectionsManager) {\n this.logger.debug(\n 'ConnectionsManager not initialized, returning empty connections list'\n );\n return [];\n }\n\n // Convert SDK Connections to ActiveConnection\n return this.connectionsManager\n .getAllConnections()\n .map((conn) => this.convertToActiveConnection(conn));\n }\n\n /**\n * Finds a connection by its identifier, which can be:\n * - A 1-based index as displayed in the connection list\n * - A target account ID string\n * - A connection topic ID string\n */\n getConnectionByIdentifier(identifier: string): ActiveConnection | undefined {\n if (!this.connectionsManager) {\n return undefined;\n }\n\n const connections = this.listConnections();\n\n // Check if it's a 1-based index\n const numericIndex = parseInt(identifier) - 1;\n if (\n !isNaN(numericIndex) &&\n numericIndex >= 0 &&\n numericIndex < connections.length\n ) {\n return connections[numericIndex];\n }\n\n // Check if it's a topic ID\n const byTopicId =\n this.connectionsManager.getConnectionByTopicId(identifier);\n if (byTopicId) {\n return this.convertToActiveConnection(byTopicId);\n }\n\n // Check if it's an account ID\n const byAccountId =\n this.connectionsManager.getConnectionByAccountId(identifier);\n if (byAccountId) {\n return this.convertToActiveConnection(byAccountId);\n }\n\n return undefined;\n }\n\n /**\n * Gets the last processed message timestamp for a connection.\n * Returns 0 if no timestamp has been recorded.\n */\n getLastTimestamp(connectionTopicId: string): number {\n return this.connectionMessageTimestamps[connectionTopicId] || 0;\n }\n\n /**\n * Updates the last processed message timestamp for a connection,\n * but only if the new timestamp is more recent than the existing one.\n */\n updateTimestamp(connectionTopicId: string, timestampNanos: number): void {\n // Initialize if this is first update and skip the comparison logic\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n return;\n }\n\n // Otherwise, only update if newer\n const currentTimestamp =\n this.connectionMessageTimestamps[connectionTopicId];\n if (timestampNanos > currentTimestamp) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n }\n }\n\n /**\n * Helper method to initialize timestamp tracking for a connection\n * if it doesn't already exist.\n */\n private initializeTimestampIfNeeded(connectionTopicId: string): void {\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] =\n Date.now() * 1_000_000;\n }\n }\n\n /**\n * Converts ConnectionStatus to SDK status format\n */\n private convertConnectionStatus(\n status: string\n ): 'pending' | 'established' | 'needs_confirmation' | 'closed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'established':\n return 'established';\n case 'needs confirmation':\n return 'needs_confirmation';\n default:\n return 'established';\n }\n }\n\n /**\n * Converts SDK Connection to ActiveConnection\n */\n private convertToActiveConnection(conn: Connection): ActiveConnection {\n return {\n targetAccountId: conn.targetAccountId,\n targetAgentName: conn.targetAgentName || `Agent ${conn.targetAccountId}`,\n targetInboundTopicId: conn.targetInboundTopicId || '',\n connectionTopicId: conn.connectionTopicId,\n status: this.convertToStateStatus(conn.status),\n created: conn.created,\n lastActivity: conn.lastActivity,\n isPending: conn.isPending,\n needsConfirmation: conn.needsConfirmation,\n profileInfo: conn.profileInfo,\n connectionRequestId: conn.connectionRequestId,\n };\n }\n\n /**\n * Converts SDK status to state status format\n */\n private convertToStateStatus(status: string): ConnectionStatus {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'established':\n return 'established';\n case 'needs_confirmation':\n return 'needs confirmation';\n case 'closed':\n return 'established'; // Mapping closed to established for compatibility\n default:\n return 'unknown';\n }\n }\n\n /**\n * Persists agent data to environment variables\n * @param agent - The agent data to persist\n * @param options - Environment file persistence options\n */\n async persistAgentData(\n agent: RegisteredAgent,\n options?: AgentPersistenceOptions\n ): Promise<void> {\n if (options?.type && options.type !== 'env-file') {\n throw new Error(\n `Unsupported persistence type: ${options.type}. Only 'env-file' is supported.`\n );\n }\n\n const envFilePath =\n (options as EnvFilePersistenceOptions)?.envFilePath ||\n this.defaultEnvFilePath ||\n process.env.ENV_FILE_PATH ||\n '.env';\n\n if (!envFilePath) {\n throw new Error(\n 'Environment file path could not be determined for agent data persistence'\n );\n }\n\n const prefix =\n (options as EnvFilePersistenceOptions)?.prefix || this.defaultPrefix;\n\n if (!agent.accountId || !agent.inboundTopicId || !agent.outboundTopicId) {\n throw new Error('Agent data incomplete, cannot persist to environment');\n }\n\n const updates: Record<string, string> = {\n [`${prefix}_ACCOUNT_ID`]: agent.accountId,\n [`${prefix}_INBOUND_TOPIC_ID`]: agent.inboundTopicId,\n [`${prefix}_OUTBOUND_TOPIC_ID`]: agent.outboundTopicId,\n };\n\n if (agent.privateKey) {\n updates[`${prefix}_PRIVATE_KEY`] = agent.privateKey;\n }\n\n if (agent.profileTopicId) {\n updates[`${prefix}_PROFILE_TOPIC_ID`] = agent.profileTopicId;\n }\n\n await updateEnvFile(envFilePath, updates);\n }\n}\n","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport { PrivateKey, TransactionReceipt } from '@hashgraph/sdk';\nimport { ActiveConnection, IStateManager } from '../../state/state-types';\nimport { ExecuteResult } from '../types';\nimport {\n FeeConfigBuilderInterface,\n FeeConfigBuilder,\n HCS10Client,\n AgentBuilder,\n InboundTopicType as StandardInboundTopicType,\n AIAgentCapability as StandardAIAgentCapability,\n AgentRegistrationResult,\n ProfileResponse as SDKProfileResponse,\n HCSMessage,\n LogLevel,\n Logger as SDKLogger,\n SocialPlatform,\n HandleConnectionRequestResponse,\n Connection,\n} from '@hashgraphonline/standards-sdk';\nimport fs from 'fs';\nimport path from 'path';\nimport axios from 'axios';\n\nconst NOT_INITIALIZED_ERROR = 'ConnectionsManager not initialized';\n\n/**\n * Internal agent data for registration\n */\ninterface AgentRegistrationData {\n name: string;\n bio?: string;\n alias?: string;\n type?: 'autonomous' | 'manual';\n model?: string;\n capabilities?: number[];\n creator?: string;\n socials?: Record<string, string>;\n properties?: Record<string, unknown>;\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n existingProfilePictureTopicId?: string;\n feeConfig?: FeeConfigBuilderInterface;\n}\n\n/**\n * Message response with timestamp\n */\nexport interface HCSMessageWithTimestamp extends Omit<HCSMessage, 'op'> {\n timestamp: number;\n data?: string;\n sequence_number: number;\n op?: HCSMessage['op'] | string;\n operator_id?: string;\n created?: Date;\n m?: string;\n}\n\n/**\n * Network type for HCS-10\n */\nexport type StandardNetworkType = 'mainnet' | 'testnet';\n\n/**\n * Parameters for agent registration\n */\nexport interface RegisterAgentParams {\n name: string;\n bio?: string;\n alias?: string;\n type?: 'autonomous' | 'manual';\n model?: string;\n capabilities?: number[];\n creator?: string;\n socials?: Record<string, string>;\n properties?: Record<string, unknown>;\n profilePicture?:\n | string\n | {\n url?: string;\n path?: string;\n filename?: string;\n };\n existingProfilePictureTopicId?: string;\n initialBalance?: number;\n userAccountId?: string;\n hbarFee?: number;\n tokenFees?: Array<{\n amount: number;\n tokenId: string;\n }>;\n exemptAccountIds?: string[];\n}\n\n/**\n * Parameters for initiating a connection\n */\nexport interface InitiateConnectionParams {\n targetAccountId: string;\n disableMonitor?: boolean;\n memo?: string;\n}\n\n/**\n * Parameters for accepting a connection request\n */\nexport interface AcceptConnectionParams {\n requestKey: string;\n hbarFee?: number | undefined;\n exemptAccountIds?: string[] | undefined;\n}\n\n/**\n * Parameters for sending a message\n */\nexport interface SendMessageParams {\n topicId: string;\n message: string;\n disableMonitoring?: boolean;\n}\n\n/**\n * Parameters for sending a message to a connected account\n */\nexport interface SendMessageToConnectionParams {\n targetIdentifier: string;\n message: string;\n disableMonitoring?: boolean;\n}\n\n/**\n * HCS10Builder facilitates HCS-10 protocol operations for agent communication\n * This builder incorporates all HCS10Client functionality directly\n */\nexport class HCS10Builder extends BaseServiceBuilder {\n private standardClient: HCS10Client;\n private stateManager: IStateManager | undefined;\n private executeResult?: ExecuteResult & { rawResult?: unknown };\n private useEncryption: boolean;\n private guardedRegistryBaseUrl: string;\n private network: StandardNetworkType;\n private sdkLogger: SDKLogger;\n\n constructor(\n hederaKit: HederaAgentKit,\n stateManager?: IStateManager,\n options?: {\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: LogLevel;\n }\n ) {\n super(hederaKit);\n this.stateManager = stateManager;\n this.useEncryption = options?.useEncryption || false;\n this.guardedRegistryBaseUrl = options?.registryUrl || '';\n\n const network = this.hederaKit.client.network;\n this.network = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n this.sdkLogger = new SDKLogger({\n module: 'HCS10Builder',\n level: options?.logLevel || 'info',\n });\n\n this.standardClient = new HCS10Client({\n network: this.network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\n guardedRegistryBaseUrl: this.guardedRegistryBaseUrl,\n logLevel: options?.logLevel || 'info',\n });\n\n if (this.stateManager) {\n this.stateManager.initializeConnectionsManager(this.standardClient);\n }\n }\n\n /**\n * Get the operator account ID\n */\n public getOperatorId(): string {\n const operator = this.standardClient.getClient().operatorAccountId;\n if (!operator) {\n throw new Error('Operator Account ID not configured in standard client.');\n }\n return operator.toString();\n }\n\n /**\n * Get the network type\n */\n public getNetwork(): StandardNetworkType {\n return this.network;\n }\n\n /**\n * Get state manager instance\n */\n public getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n /**\n * Get account and signer information\n */\n public getAccountAndSigner(): { accountId: string; signer: PrivateKey } {\n const result = this.standardClient.getAccountAndSigner();\n return {\n accountId: result.accountId,\n signer: result.signer as unknown as PrivateKey,\n };\n }\n\n /**\n * Get the inbound topic ID for the current operator\n */\n public async getInboundTopicId(): Promise<string> {\n try {\n const operatorId = this.getOperatorId();\n this.logger.info(\n `[HCS10Builder] Retrieving profile for operator ${operatorId} to find inbound topic...`\n );\n const profileResponse = await this.getAgentProfile(operatorId);\n if (profileResponse.success && profileResponse.topicInfo?.inboundTopic) {\n this.logger.info(\n `[HCS10Builder] Found inbound topic for operator ${operatorId}: ${profileResponse.topicInfo.inboundTopic}`\n );\n return profileResponse.topicInfo.inboundTopic;\n } else {\n throw new Error(\n `Could not retrieve inbound topic from profile for ${operatorId}. Profile success: ${profileResponse.success}, Error: ${profileResponse.error}`\n );\n }\n } catch (error) {\n this.logger.error(\n `[HCS10Builder] Error fetching operator's inbound topic ID (${this.getOperatorId()}):`,\n error\n );\n const operatorId = this.getOperatorId();\n let detailedMessage = `Failed to get inbound topic ID for operator ${operatorId}.`;\n if (\n error instanceof Error &&\n error.message.includes('does not have a valid HCS-11 memo')\n ) {\n detailedMessage += ` The account profile may not exist or is invalid. Please ensure this operator account (${operatorId}) is registered as an HCS-10 agent. You might need to register it first (e.g., using the 'register_agent' tool or SDK function).`;\n } else if (error instanceof Error) {\n detailedMessage += ` Reason: ${error.message}`;\n } else {\n detailedMessage += ` Unexpected error: ${String(error)}`;\n }\n throw new Error(detailedMessage);\n }\n }\n\n /**\n * Get agent profile\n */\n public async getAgentProfile(accountId: string): Promise<SDKProfileResponse> {\n try {\n return await this.standardClient.retrieveProfile(accountId);\n } catch (error) {\n this.logger.error(\n `[HCS10Builder] Error retrieving agent profile for account ${accountId}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Submit connection request\n */\n public async submitConnectionRequest(\n inboundTopicId: string,\n memo: string\n ): Promise<TransactionReceipt> {\n return this.standardClient.submitConnectionRequest(\n inboundTopicId,\n memo\n ) as Promise<TransactionReceipt>;\n }\n\n /**\n * Handle connection request\n */\n public async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionRequestId: number,\n feeConfig?: FeeConfigBuilderInterface\n ): Promise<HandleConnectionRequestResponse> {\n try {\n const result = await this.standardClient.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n\n if (\n result &&\n result.connectionTopicId &&\n typeof result.connectionTopicId === 'object' &&\n 'toString' in result.connectionTopicId\n ) {\n result.connectionTopicId = (\n result.connectionTopicId as { toString(): string }\n ).toString();\n }\n\n return result;\n } catch (error) {\n this.logger.error(\n `Error handling connection request #${connectionRequestId} for topic ${inboundTopicId}:`,\n error\n );\n throw new Error(\n `Failed to handle connection request: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Send message to a topic\n */\n public async sendMessage(\n topicId: string,\n data: string,\n memo?: string\n ): Promise<{\n sequenceNumber: number | undefined;\n receipt: TransactionReceipt;\n transactionId: string | undefined;\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to sendMessage: ${JSON.stringify(topicId)}`\n );\n }\n\n try {\n const messageResponse = await this.standardClient.sendMessage(\n topicId,\n data,\n memo,\n undefined\n );\n return {\n sequenceNumber: messageResponse.topicSequenceNumber?.toNumber(),\n receipt: messageResponse as unknown as TransactionReceipt,\n transactionId:\n 'transactionId' in messageResponse\n ? (\n messageResponse as { transactionId?: { toString(): string } }\n ).transactionId?.toString()\n : undefined,\n };\n } catch (error) {\n this.logger.error(`Error sending message to topic ${topicId}:`, error);\n throw new Error(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Get messages from a topic\n */\n public async getMessages(topicId: string): Promise<{\n messages: HCSMessageWithTimestamp[];\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to getMessages: ${JSON.stringify(topicId)}`\n );\n }\n\n try {\n const result = await this.standardClient.getMessages(topicId);\n\n const mappedMessages: HCSMessageWithTimestamp[] = result.messages.map(\n (sdkMessage) => {\n const timestamp = sdkMessage?.created?.getTime() || 0;\n\n return {\n ...sdkMessage,\n timestamp: timestamp,\n data: sdkMessage.data || '',\n sequence_number: sdkMessage.sequence_number,\n p: 'hcs-10' as const,\n } as HCSMessageWithTimestamp;\n }\n );\n mappedMessages.sort(\n (a: { timestamp: number }, b: { timestamp: number }) =>\n a.timestamp - b.timestamp\n );\n return { messages: mappedMessages };\n } catch (error) {\n this.logger.error(`Error getting messages from topic ${topicId}:`, error);\n return { messages: [] };\n }\n }\n\n /**\n * Get message stream from a topic\n */\n public async getMessageStream(topicId: string): Promise<{\n messages: HCSMessage[];\n }> {\n if (topicId && typeof topicId === 'object' && 'toString' in topicId) {\n topicId = (topicId as unknown as { toString: () => string })?.toString();\n }\n\n if (!topicId || typeof topicId !== 'string') {\n throw new Error(\n `Invalid topic ID provided to getMessageStream: ${JSON.stringify(\n topicId\n )}`\n );\n }\n\n return this.standardClient.getMessageStream(topicId) as Promise<{\n messages: HCSMessage[];\n }>;\n }\n\n /**\n * Get message content\n */\n public async getMessageContent(inscriptionIdOrData: string): Promise<string> {\n try {\n const content = await this.standardClient.getMessageContent(\n inscriptionIdOrData\n );\n return content as string;\n } catch (error) {\n this.logger.error(\n `Error retrieving message content for: ${inscriptionIdOrData}`,\n error\n );\n throw new Error(\n `Failed to retrieve message content: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Get the standard client instance (for compatibility)\n */\n public getStandardClient(): HCS10Client {\n return this.standardClient;\n }\n\n /**\n * Load profile picture from URL or file path\n */\n private async loadProfilePicture(\n profilePicture: string | { url?: string; path?: string; filename?: string }\n ): Promise<{ buffer: Buffer; filename: string } | null> {\n try {\n if (!profilePicture) {\n return null;\n }\n\n if (typeof profilePicture === 'string') {\n const isUrl =\n profilePicture.startsWith('http://') ||\n profilePicture.startsWith('https://');\n\n if (isUrl) {\n this.logger.info(\n `Loading profile picture from URL: ${profilePicture}`\n );\n const response = await axios.get(profilePicture, {\n responseType: 'arraybuffer',\n });\n const buffer = Buffer.from(response.data);\n const urlPathname = new URL(profilePicture).pathname;\n const filename = path.basename(urlPathname) || 'profile.png';\n return { buffer, filename };\n } else {\n if (!fs.existsSync(profilePicture)) {\n this.logger.warn(\n `Profile picture file not found: ${profilePicture}`\n );\n return null;\n }\n this.logger.info(\n `Loading profile picture from file: ${profilePicture}`\n );\n const buffer = fs.readFileSync(profilePicture);\n const filename = path.basename(profilePicture);\n return { buffer, filename };\n }\n } else if (profilePicture.url) {\n this.logger.info(\n `Loading profile picture from URL: ${profilePicture.url}`\n );\n const response = await axios.get(profilePicture.url, {\n responseType: 'arraybuffer',\n });\n const buffer = Buffer.from(response.data);\n const filename = profilePicture.filename || 'profile.png';\n return { buffer, filename };\n } else if (profilePicture.path) {\n if (!fs.existsSync(profilePicture.path)) {\n this.logger.warn(\n `Profile picture file not found: ${profilePicture.path}`\n );\n return null;\n }\n this.logger.info(\n `Loading profile picture from file: ${profilePicture.path}`\n );\n const buffer = fs.readFileSync(profilePicture.path);\n const filename =\n profilePicture.filename || path.basename(profilePicture.path);\n return { buffer, filename };\n }\n\n return null;\n } catch (error) {\n this.logger.error('Failed to load profile picture:', error);\n return null;\n }\n }\n\n /**\n * Create and register an agent\n */\n private async createAndRegisterAgent(\n data: AgentRegistrationData\n ): Promise<AgentRegistrationResult> {\n const builder = new AgentBuilder()\n .setName(data.name)\n .setBio(data.bio || '')\n .setCapabilities(\n data.capabilities || [StandardAIAgentCapability.TEXT_GENERATION]\n )\n .setType(data.type || 'autonomous')\n .setModel(data.model || 'agent-model-2024')\n .setNetwork(this.getNetwork())\n .setInboundTopicType(StandardInboundTopicType.PUBLIC);\n\n if (data.alias) {\n builder.setAlias(data.alias);\n }\n\n if (data.creator) {\n builder.setCreator(data.creator);\n }\n\n if (data?.feeConfig) {\n builder.setInboundTopicType(StandardInboundTopicType.FEE_BASED);\n builder.setFeeConfig(data.feeConfig);\n }\n\n if (data.existingProfilePictureTopicId) {\n builder.setExistingProfilePicture(data.existingProfilePictureTopicId);\n } else if (data.pfpBuffer && data.pfpFileName) {\n if (data.pfpBuffer.byteLength === 0) {\n this.logger.warn(\n 'Provided PFP buffer is empty. Skipping profile picture.'\n );\n } else {\n this.logger.info(\n `Setting profile picture: ${data.pfpFileName} (${data.pfpBuffer.byteLength} bytes)`\n );\n builder.setProfilePicture(data.pfpBuffer, data.pfpFileName);\n }\n } else {\n this.logger.warn(\n 'Profile picture not provided. Agent creation might fail if required by the underlying SDK builder.'\n );\n }\n\n if (data.socials) {\n Object.entries(data.socials).forEach(([platform, handle]) => {\n builder.addSocial(platform as SocialPlatform, handle);\n });\n }\n\n if (data.properties) {\n Object.entries(data.properties).forEach(([key, value]) => {\n builder.addProperty(key, value);\n });\n }\n\n try {\n const hasFees = Boolean(data?.feeConfig);\n const result = await this.standardClient.createAndRegisterAgent(builder, {\n initialBalance: hasFees ? 50 : 10,\n });\n return result;\n } catch (error) {\n this.logger.error('Error during agent creation/registration:', error);\n throw new Error(\n `Failed to create/register agent: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Register a new HCS-10 agent\n * Note: This performs multiple transactions and requires directExecution mode\n */\n public async registerAgent(params: RegisterAgentParams): Promise<this> {\n this.clearNotes();\n\n if (this.hederaKit.operationalMode === 'returnBytes') {\n throw new Error(\n 'Agent registration requires multiple transactions and cannot be performed in returnBytes mode. ' +\n 'Please use autonomous mode.'\n );\n }\n\n try {\n let profilePictureData: { buffer: Buffer; filename: string } | null =\n null;\n if (params.profilePicture) {\n profilePictureData = await this.loadProfilePicture(\n params.profilePicture\n );\n }\n\n const registrationData: AgentRegistrationData = {\n name: params.name,\n ...(params.bio !== undefined && { bio: params.bio }),\n ...(params.alias !== undefined && { alias: params.alias }),\n ...(params.type !== undefined && { type: params.type }),\n ...(params.model !== undefined && { model: params.model }),\n ...(params.capabilities !== undefined && {\n capabilities: params.capabilities,\n }),\n ...(params.creator !== undefined && { creator: params.creator }),\n ...(params.socials !== undefined && { socials: params.socials }),\n ...(params.properties !== undefined && {\n properties: params.properties,\n }),\n ...(params.existingProfilePictureTopicId !== undefined && {\n existingProfilePictureTopicId: params.existingProfilePictureTopicId,\n }),\n ...(profilePictureData?.buffer !== undefined && {\n pfpBuffer: profilePictureData.buffer,\n }),\n ...(profilePictureData?.filename !== undefined && {\n pfpFileName: profilePictureData.filename,\n }),\n };\n\n if (params.hbarFee && params.hbarFee > 0) {\n const feeConfigBuilder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n const { accountId: collectorAccountId } = this.getAccountAndSigner();\n if (!collectorAccountId) {\n throw new Error('Could not determine account ID for fee collection.');\n }\n this.addNote(\n `Setting the operator account (${collectorAccountId}) as the fee collector since no specific collector was provided.`\n );\n\n const effectiveExemptIds =\n params.exemptAccountIds?.filter(\n (id: string) => id !== collectorAccountId && id.startsWith('0.0')\n ) || [];\n\n registrationData.feeConfig = feeConfigBuilder.addHbarFee(\n params.hbarFee,\n collectorAccountId,\n effectiveExemptIds\n );\n }\n\n const result = await this.createAndRegisterAgent(registrationData);\n\n this.executeResult = {\n success: true,\n transactionId: result.transactionId,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n ...result,\n name: params.name,\n accountId:\n result?.metadata?.accountId ||\n result.state?.agentMetadata?.accountId,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to register agent:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Initiate a connection to another agent\n */\n public async initiateConnection(\n params: InitiateConnectionParams\n ): Promise<this> {\n this.clearNotes();\n\n try {\n const targetProfile = await this.getAgentProfile(params.targetAccountId);\n\n if (!targetProfile.success || !targetProfile.topicInfo?.inboundTopic) {\n throw new Error(\n `Could not retrieve inbound topic for target account ${params.targetAccountId}`\n );\n }\n\n const targetInboundTopicId = targetProfile.topicInfo.inboundTopic;\n let memo: string;\n if (params.memo !== undefined) {\n memo = params.memo;\n } else {\n memo = params.disableMonitor ? 'false' : 'true';\n this.addNote(\n `No custom memo was provided. Using default memo '${memo}' based on monitoring preference.`\n );\n }\n if (!params.disableMonitor) {\n this.addNote(\n `Monitoring will be enabled for this connection request as disableMonitor was not specified.`\n );\n }\n\n const result = await this.submitConnectionRequest(\n targetInboundTopicId,\n memo\n );\n\n this.executeResult = {\n success: true,\n transactionId:\n 'transactionId' in result\n ? (\n result as { transactionId?: { toString(): string } }\n ).transactionId?.toString()\n : undefined,\n receipt: result,\n scheduleId: undefined,\n rawResult: {\n targetAccountId: params.targetAccountId,\n targetInboundTopicId,\n connectionRequestSent: true,\n monitoringEnabled: !params.disableMonitor,\n ...result,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to initiate connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Accept a connection request\n * Note: This performs multiple transactions and requires directExecution mode\n */\n public async acceptConnection(params: AcceptConnectionParams): Promise<this> {\n this.clearNotes();\n\n if (this.hederaKit.operationalMode === 'returnBytes') {\n throw new Error(\n 'Accepting connections requires multiple transactions and cannot be performed in returnBytes mode. ' +\n 'Please use autonomous mode.'\n );\n }\n\n try {\n const currentAgent = this.stateManager?.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot accept connection request. No agent is currently active. Please register or select an agent first.'\n );\n }\n\n const connectionsManager = this.stateManager?.getConnectionsManager();\n if (!connectionsManager) {\n throw new Error(NOT_INITIALIZED_ERROR);\n }\n\n await connectionsManager.fetchConnectionData(currentAgent.accountId);\n\n const allRequests = [\n ...connectionsManager.getPendingRequests(),\n ...connectionsManager.getConnectionsNeedingConfirmation(),\n ];\n\n const request = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n\n if (!request) {\n throw new Error(\n `Request with key ${params.requestKey} not found or no longer pending.`\n );\n }\n\n if (!request.needsConfirmation || !request.inboundRequestId) {\n throw new Error(\n `Request with key ${params.requestKey} is not an inbound request that can be accepted.`\n );\n }\n\n const targetAccountId = request.targetAccountId;\n const inboundRequestId = request.inboundRequestId;\n\n let feeConfig: FeeConfigBuilderInterface | undefined;\n\n if (params.hbarFee && params.hbarFee > 0) {\n const feeConfigBuilder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n const { accountId: collectorAccountId } = this.getAccountAndSigner();\n if (!collectorAccountId) {\n throw new Error('Could not determine account ID for fee collection.');\n }\n this.addNote(\n `Setting the operator account (${collectorAccountId}) as the fee collector since no specific collector was provided.`\n );\n\n const effectiveExemptIds =\n params.exemptAccountIds?.filter(\n (id: string) => id !== collectorAccountId && id.startsWith('0.0')\n ) || [];\n\n feeConfig = feeConfigBuilder.addHbarFee(\n params.hbarFee,\n collectorAccountId,\n effectiveExemptIds\n );\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n const confirmationResult = await this.handleConnectionRequest(\n inboundTopicId,\n targetAccountId,\n inboundRequestId,\n feeConfig\n );\n\n let connectionTopicId = confirmationResult?.connectionTopicId;\n\n if (\n connectionTopicId &&\n typeof connectionTopicId === 'object' &&\n 'toString' in connectionTopicId\n ) {\n connectionTopicId = (\n connectionTopicId as unknown as { toString: () => string }\n )?.toString();\n }\n\n if (!connectionTopicId || typeof connectionTopicId !== 'string') {\n throw new Error(\n `Failed to create connection topic. Got: ${JSON.stringify(\n connectionTopicId\n )}`\n );\n }\n\n if (this.stateManager) {\n const targetAgentName =\n request.targetAgentName || `Agent ${targetAccountId}`;\n if (!request.targetAgentName) {\n this.addNote(\n `No agent name was provided in the connection request, using default name 'Agent ${targetAccountId}'.`\n );\n }\n\n let targetInboundTopicId = request.targetInboundTopicId || '';\n if (!targetInboundTopicId) {\n try {\n const targetProfile = await this.getAgentProfile(targetAccountId);\n if (\n targetProfile.success &&\n targetProfile.topicInfo?.inboundTopic\n ) {\n targetInboundTopicId = targetProfile.topicInfo.inboundTopic;\n }\n } catch (profileError) {\n this.logger.warn(\n `Could not fetch profile for ${targetAccountId}:`,\n profileError\n );\n }\n }\n\n const newConnection = {\n connectionId: `conn-${Date.now()}`,\n targetAccountId: targetAccountId,\n targetAgentName: targetAgentName,\n targetInboundTopicId: targetInboundTopicId,\n connectionTopicId: connectionTopicId,\n status: 'established' as const,\n created: new Date(),\n };\n this.stateManager.addActiveConnection(newConnection);\n\n connectionsManager.markConnectionRequestProcessed(\n request.targetInboundTopicId || '',\n inboundRequestId\n );\n }\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n targetAccountId,\n connectionTopicId,\n feeConfigured: !!params.hbarFee,\n hbarFee: params.hbarFee || 0,\n confirmationResult,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to accept connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Send a message using HCS (for operations that need direct topic access)\n */\n public async sendHCS10Message(params: SendMessageParams): Promise<this> {\n this.clearNotes();\n\n try {\n const result = await this.sendMessage(params.topicId, params.message);\n\n this.executeResult = {\n success: true,\n transactionId: result.transactionId,\n receipt: result.receipt,\n scheduleId: undefined,\n rawResult: result,\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n this.addNote(`Message sent to topic ${params.topicId}.`);\n } catch (error) {\n this.logger.error('Failed to send message:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Send a message to a connected account with optional response monitoring\n */\n public async sendMessageToConnection(\n params: SendMessageToConnectionParams\n ): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required to send messages to connections'\n );\n }\n\n try {\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot send message. No agent is currently active. Please register or select an agent first.'\n );\n }\n\n let connection: ActiveConnection | undefined;\n\n const identifier = params.targetIdentifier;\n\n if (identifier.includes('@')) {\n const parts = identifier.split('@');\n if (parts.length === 2) {\n const accountId = parts[1];\n connection = this.stateManager.getConnectionByIdentifier(accountId);\n\n if (!connection) {\n this.addNote(\n `Could not find connection using request key '${identifier}', extracted account ID '${accountId}'.`\n );\n }\n }\n }\n\n if (!connection) {\n connection = this.stateManager.getConnectionByIdentifier(identifier);\n }\n\n if (\n !connection &&\n !identifier.startsWith('0.0.') &&\n /^\\d+$/.test(identifier)\n ) {\n const accountIdWithPrefix = `0.0.${identifier}`;\n connection =\n this.stateManager.getConnectionByIdentifier(accountIdWithPrefix);\n if (connection) {\n this.addNote(\n `Found connection using account ID with prefix: ${accountIdWithPrefix}`\n );\n }\n }\n\n if (!connection && /^[1-9]\\d*$/.test(identifier)) {\n const connections = this.stateManager.listConnections();\n const index = parseInt(identifier) - 1;\n if (index >= 0 && index < connections.length) {\n connection = connections[index];\n if (connection) {\n this.addNote(\n `Found connection by index ${identifier}: ${connection.targetAccountId}`\n );\n }\n }\n }\n\n if (!connection) {\n const connections = this.stateManager.listConnections();\n const availableIds = connections.map(\n (c, i) =>\n `${i + 1}. ${c.targetAccountId} (Topic: ${c.connectionTopicId})`\n );\n\n let errorMsg = `Connection not found for identifier: \"${identifier}\"\\n`;\n errorMsg += `Available connections:\\n${\n availableIds.join('\\n') || 'No active connections'\n }`;\n errorMsg += `\\n\\nYou can use:\\n`;\n errorMsg += `- Connection number (e.g., \"1\", \"2\")\\n`;\n errorMsg += `- Account ID (e.g., \"0.0.6412936\")\\n`;\n errorMsg += `- Connection topic ID\\n`;\n errorMsg += `Use 'list_connections' to see all active connections.`;\n\n throw new Error(errorMsg);\n }\n\n let connectionTopicId = connection.connectionTopicId;\n if (\n connectionTopicId &&\n typeof connectionTopicId === 'object' &&\n 'toString' in connectionTopicId\n ) {\n connectionTopicId = (\n connectionTopicId as unknown as { toString: () => string }\n )?.toString();\n }\n\n if (!connectionTopicId || typeof connectionTopicId !== 'string') {\n throw new Error(\n `Invalid connection topic ID for ${\n connection.targetAccountId\n }: ${JSON.stringify(\n connectionTopicId\n )} (type: ${typeof connectionTopicId})`\n );\n }\n\n const targetAgentName = connection.targetAgentName;\n\n const operatorId = `${currentAgent.inboundTopicId}@${currentAgent.accountId}`;\n\n const messageResult = await this.sendMessage(\n connectionTopicId,\n params.message,\n `Agent message from ${currentAgent.name}`\n );\n\n if (!messageResult.sequenceNumber) {\n throw new Error('Failed to send message');\n }\n\n let reply: string | null = null;\n if (!params.disableMonitoring) {\n reply = await this.monitorResponses(\n connectionTopicId,\n operatorId,\n messageResult.sequenceNumber\n );\n } else {\n this.addNote(\n `Message sent successfully. Response monitoring was disabled.`\n );\n }\n\n this.executeResult = {\n success: true,\n transactionId: messageResult.transactionId,\n receipt: messageResult.receipt,\n scheduleId: undefined,\n rawResult: {\n targetAgentName,\n targetAccountId: connection.targetAccountId,\n connectionTopicId,\n sequenceNumber: messageResult.sequenceNumber,\n reply,\n monitoringEnabled: !params.disableMonitoring,\n message: params.message,\n messageResult,\n },\n };\n } catch (error) {\n this.logger.error('Failed to send message to connection:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * Monitor responses on a topic after sending a message\n */\n private async monitorResponses(\n topicId: string,\n operatorId: string,\n sequenceNumber: number\n ): Promise<string | null> {\n const maxAttempts = 30;\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n const messages = await this.getMessageStream(topicId);\n\n for (const message of messages.messages) {\n if (\n message.sequence_number < sequenceNumber ||\n message.operator_id === operatorId\n ) {\n continue;\n }\n const content = await this.getMessageContent(message.data || '');\n return content;\n }\n } catch (error) {\n this.logger.error(`Error monitoring responses: ${error}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 4000));\n attempts++;\n }\n return null;\n }\n\n /**\n * Start passive monitoring for incoming connection requests\n * This method monitors continuously in the background\n */\n public async startPassiveConnectionMonitoring(): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required for passive monitoring');\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n this.logger.info(\n `Starting passive connection monitoring on topic ${inboundTopicId}...`\n );\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n inboundTopicId,\n message: `Started monitoring inbound topic ${inboundTopicId} for connection requests in the background.`,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n return this;\n }\n\n /**\n * Monitor for incoming connection requests\n */\n public async monitorConnections(params: {\n acceptAll?: boolean;\n targetAccountId?: string;\n monitorDurationSeconds?: number;\n hbarFees?: Array<{ amount: number; collectorAccount?: string }>;\n tokenFees?: Array<{\n amount: number;\n tokenId: string;\n collectorAccount?: string;\n }>;\n exemptAccountIds?: string[];\n defaultCollectorAccount?: string;\n }): Promise<this> {\n this.clearNotes();\n\n const {\n acceptAll = false,\n targetAccountId,\n monitorDurationSeconds = 120,\n hbarFees = [],\n tokenFees = [],\n exemptAccountIds = [],\n defaultCollectorAccount,\n } = params;\n\n if (!this.stateManager) {\n throw new Error('StateManager is required for connection monitoring');\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot monitor for connections. No agent is currently active.'\n );\n }\n\n const inboundTopicId = await this.getInboundTopicId();\n const endTime = Date.now() + monitorDurationSeconds * 1000;\n const pollIntervalMs = 3000;\n let connectionRequestsFound = 0;\n let acceptedConnections = 0;\n const processedRequestIds = new Set<number>();\n\n while (Date.now() < endTime) {\n try {\n const messagesResult = await this.getMessages(inboundTopicId);\n const connectionRequests = messagesResult.messages.filter(\n (msg) =>\n msg.op === 'connection_request' &&\n typeof msg.sequence_number === 'number'\n );\n\n for (const request of connectionRequests) {\n const connectionRequestId = request.sequence_number;\n if (\n !connectionRequestId ||\n processedRequestIds.has(connectionRequestId)\n ) {\n continue;\n }\n\n const requestingAccountId = request.operator_id?.split('@')[1];\n if (!requestingAccountId) {\n continue;\n }\n\n connectionRequestsFound++;\n\n if (targetAccountId && requestingAccountId !== targetAccountId) {\n this.logger.info(\n `Skipping request from ${requestingAccountId} (not target account)`\n );\n continue;\n }\n\n if (acceptAll || targetAccountId === requestingAccountId) {\n this.logger.info(\n `Accepting connection request from ${requestingAccountId}`\n );\n\n let feeConfig;\n if (hbarFees.length > 0 || tokenFees.length > 0) {\n const builder = new FeeConfigBuilder({\n network: this.network,\n logger: this.sdkLogger,\n });\n\n for (const fee of hbarFees) {\n const collectorAccount =\n fee.collectorAccount ||\n defaultCollectorAccount ||\n this.getOperatorId();\n builder.addHbarFee(\n fee.amount,\n collectorAccount,\n exemptAccountIds\n );\n }\n\n for (const fee of tokenFees) {\n const collectorAccount =\n fee.collectorAccount ||\n defaultCollectorAccount ||\n this.getOperatorId();\n builder.addTokenFee(\n fee.amount,\n fee.tokenId,\n collectorAccount,\n undefined,\n exemptAccountIds\n );\n }\n\n feeConfig = builder;\n }\n\n await this.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n\n processedRequestIds.add(connectionRequestId);\n acceptedConnections++;\n }\n }\n } catch (error) {\n this.logger.error('Error during connection monitoring:', error);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n connectionRequestsFound,\n acceptedConnections,\n monitorDurationSeconds,\n processedRequestIds: Array.from(processedRequestIds),\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n this.addNote(\n `Monitoring completed. Found ${connectionRequestsFound} requests, accepted ${acceptedConnections}.`\n );\n\n return this;\n }\n\n /**\n * Manage connection requests (list, view, or reject)\n */\n public async manageConnectionRequests(params: {\n action: 'list' | 'view' | 'reject';\n requestKey?: string;\n }): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required for managing connection requests'\n );\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot manage connection requests. No agent is currently active.'\n );\n }\n\n const connectionsManager = this.stateManager.getConnectionsManager();\n if (!connectionsManager) {\n throw new Error(NOT_INITIALIZED_ERROR);\n }\n\n try {\n const { accountId } = this.getAccountAndSigner();\n await connectionsManager.fetchConnectionData(accountId);\n\n const pendingRequests = connectionsManager.getPendingRequests();\n const needsConfirmation =\n connectionsManager.getConnectionsNeedingConfirmation();\n const allRequests = [...pendingRequests, ...needsConfirmation];\n\n switch (params.action) {\n case 'list':\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n requests: allRequests.map((request, index) => ({\n index: index + 1,\n type: request.needsConfirmation ? 'incoming' : 'outgoing',\n requestKey:\n request.uniqueRequestKey ||\n `${\n request.connectionRequestId ||\n request.inboundRequestId ||\n 'unknown'\n }`,\n targetAccountId: request.targetAccountId,\n targetAgentName:\n request.targetAgentName || `Agent ${request.targetAccountId}`,\n created: request.created.toISOString(),\n memo: request.memo,\n bio: request.profileInfo?.bio,\n })),\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n\n case 'view': {\n if (!params.requestKey) {\n throw new Error('Request key is required for viewing a request');\n }\n const viewRequest = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n if (!viewRequest) {\n throw new Error(`Request with key ${params.requestKey} not found`);\n }\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n request: {\n type: viewRequest.needsConfirmation ? 'incoming' : 'outgoing',\n requestKey:\n viewRequest.uniqueRequestKey ||\n `${\n viewRequest.connectionRequestId ||\n viewRequest.inboundRequestId ||\n 'unknown'\n }`,\n targetAccountId: viewRequest.targetAccountId,\n targetAgentName:\n viewRequest.targetAgentName ||\n `Agent ${viewRequest.targetAccountId}`,\n created: viewRequest.created.toISOString(),\n memo: viewRequest.memo,\n profileInfo: viewRequest.profileInfo,\n },\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n }\n\n case 'reject': {\n if (!params.requestKey) {\n throw new Error('Request key is required for rejecting a request');\n }\n const rejectRequest = allRequests.find(\n (r) =>\n r.uniqueRequestKey === params.requestKey ||\n r.connectionRequestId?.toString() === params.requestKey ||\n r.inboundRequestId?.toString() === params.requestKey\n );\n if (!rejectRequest) {\n throw new Error(`Request with key ${params.requestKey} not found`);\n }\n if (rejectRequest.inboundRequestId) {\n connectionsManager.markConnectionRequestProcessed(\n rejectRequest.targetInboundTopicId || '',\n rejectRequest.inboundRequestId\n );\n } else if (rejectRequest.connectionRequestId) {\n connectionsManager.markConnectionRequestProcessed(\n rejectRequest.originTopicId || '',\n rejectRequest.connectionRequestId\n );\n }\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n rejectedRequest: {\n requestKey: params.requestKey,\n targetAccountId: rejectRequest.targetAccountId,\n targetAgentName:\n rejectRequest.targetAgentName ||\n `Agent ${rejectRequest.targetAccountId}`,\n },\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n break;\n }\n }\n } catch (error) {\n this.logger.error('Failed to manage connection requests:', error);\n throw error;\n }\n\n return this;\n }\n\n /**\n * List unapproved connection requests\n */\n public async listUnapprovedConnectionRequests(): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error(\n 'StateManager is required for listing connection requests'\n );\n }\n\n const currentAgent = this.stateManager.getCurrentAgent();\n if (!currentAgent) {\n throw new Error(\n 'Cannot list connection requests. No agent is currently active.'\n );\n }\n\n try {\n const inboundTopicId = await this.getInboundTopicId();\n const messages = await this.getMessages(inboundTopicId);\n\n const unapprovedRequests = messages.messages\n .filter(\n (msg): msg is HCSMessageWithTimestamp & { op: string } =>\n msg.op === 'connection_request'\n )\n .map((msg) => ({\n requestId: msg.sequence_number,\n fromAccountId: msg.operator_id?.split('@')[1] || 'unknown',\n timestamp: msg.timestamp || new Date(msg?.created || '').getTime(),\n memo: msg.m || '',\n data: msg.data,\n }))\n .filter(\n (req): req is typeof req & { fromAccountId: string } =>\n req.fromAccountId !== 'unknown'\n );\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: {\n requests: unapprovedRequests,\n count: unapprovedRequests.length,\n },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n if (unapprovedRequests.length === 0) {\n this.addNote('No unapproved connection requests found.');\n } else {\n this.addNote(\n `Found ${unapprovedRequests.length} unapproved connection request(s).`\n );\n }\n } catch (error) {\n this.logger.error(\n 'Failed to list unapproved connection requests:',\n error\n );\n throw error;\n }\n\n return this;\n }\n\n /**\n * List connections with enhanced details\n */\n public async listConnections(\n params: {\n includeDetails?: boolean;\n showPending?: boolean;\n } = {}\n ): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required to list connections');\n }\n\n const includeDetails = params.includeDetails ?? true;\n const showPending = params.showPending ?? true;\n\n try {\n const connections = await this.getEnhancedConnections();\n\n if (connections.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n connections: [],\n message: 'There are currently no active connections.',\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const activeConnections = connections.filter(\n (c): c is Connection => (c as Connection).status === 'established'\n );\n const pendingConnections = connections.filter(\n (c): c is Connection => (c as Connection).isPending\n );\n const needsConfirmation = connections.filter(\n (c): c is Connection => (c as Connection).needsConfirmation\n );\n\n let output = '';\n\n if (activeConnections.length > 0) {\n output += `🟢 Active Connections (${activeConnections.length}):\\n`;\n activeConnections.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n output += '\\n';\n }\n\n if (showPending && needsConfirmation.length > 0) {\n output += `🟠 Connections Needing Confirmation (${needsConfirmation.length}):\\n`;\n needsConfirmation.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n output += '\\n';\n }\n\n if (showPending && pendingConnections.length > 0) {\n output += `⚪ Pending Connection Requests (${pendingConnections.length}):\\n`;\n pendingConnections.forEach((conn, index) => {\n output += this.formatConnection(conn, index, includeDetails);\n });\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n connections,\n formattedOutput: output.trim(),\n activeCount: activeConnections.length,\n pendingCount: pendingConnections.length,\n needsConfirmationCount: needsConfirmation.length,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Failed to list connections:', error);\n this.executeResult = {\n success: false,\n error: `Failed to list connections: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n private formatConnection(\n conn: unknown,\n index: number,\n includeDetails: boolean\n ): string {\n const connection = conn as {\n profileInfo?: { display_name?: string; bio?: string };\n targetAgentName?: string;\n targetAccountId?: string;\n isPending?: boolean;\n connectionTopicId?: string;\n status?: string;\n created?: Date;\n lastActivity?: Date;\n };\n\n let output = `${index + 1}. ${\n connection.profileInfo?.display_name ||\n connection.targetAgentName ||\n 'Unknown Agent'\n } (${connection.targetAccountId})\\n`;\n const displayTopicId = connection.isPending\n ? '(Pending Request)'\n : connection.connectionTopicId;\n output += ` Topic: ${displayTopicId}\\n`;\n const statusText = connection.status || 'unknown';\n output += ` Status: ${statusText}\\n`;\n\n if (includeDetails) {\n if (connection.profileInfo?.bio) {\n output += ` Bio: ${connection.profileInfo.bio.substring(0, 100)}${\n connection.profileInfo.bio.length > 100 ? '...' : ''\n }\\n`;\n }\n\n if (connection.created) {\n const createdLabel = connection.isPending\n ? 'Request sent'\n : 'Connection established';\n output += ` ${createdLabel}: ${connection.created.toLocaleString()}\\n`;\n }\n\n if (connection.lastActivity) {\n output += ` Last activity: ${connection.lastActivity.toLocaleString()}\\n`;\n }\n }\n\n return output;\n }\n\n private async getEnhancedConnections(): Promise<unknown[]> {\n try {\n const { accountId } = this.getAccountAndSigner();\n if (!accountId) {\n return this.stateManager!.listConnections();\n }\n\n const connectionManager = this.stateManager!.getConnectionsManager();\n if (!connectionManager) {\n this.logger.error(NOT_INITIALIZED_ERROR);\n return this.stateManager!.listConnections();\n }\n\n const connections = await connectionManager.fetchConnectionData(\n accountId\n );\n\n for (const connection of connections) {\n this.stateManager!.addActiveConnection(\n connection as unknown as ActiveConnection\n );\n }\n\n return connections;\n } catch (error) {\n this.logger.error('Failed to get enhanced connections:', error);\n return this.stateManager!.listConnections();\n }\n }\n\n /**\n * Check messages on a connection\n */\n public async checkMessages(params: {\n targetIdentifier: string;\n fetchLatest?: boolean;\n lastMessagesCount?: number;\n }): Promise<this> {\n this.clearNotes();\n\n if (!this.stateManager) {\n throw new Error('StateManager is required to check messages');\n }\n\n const connection = this.stateManager.getConnectionByIdentifier(\n params.targetIdentifier\n );\n\n if (!connection) {\n this.executeResult = {\n success: false,\n error: `Could not find an active connection matching identifier \"${params.targetIdentifier}\". Use 'list_connections' to see active connections.`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const connectionTopicId = connection.connectionTopicId || '';\n\n if (!connectionTopicId || !connectionTopicId.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n this.logger.error(\n `Invalid connection topic ID format: ${connectionTopicId}`\n );\n this.executeResult = {\n success: false,\n error: `Invalid connection topic ID format: ${connectionTopicId}. Expected format: 0.0.XXXXX`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const targetAgentName = connection.targetAgentName;\n const lastProcessedTimestamp =\n this.stateManager.getLastTimestamp(connectionTopicId);\n\n this.logger.info(\n `Checking messages for connection with ${targetAgentName} (${connection.targetAccountId}) on topic ${connectionTopicId} (fetchLatest: ${params.fetchLatest}, lastCount: ${params.lastMessagesCount}, since: ${lastProcessedTimestamp})`\n );\n\n try {\n const result = await this.getMessages(connectionTopicId);\n const allMessages = result.messages;\n\n if (!allMessages || allMessages.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n messages: [],\n message: `No messages found on connection topic ${connectionTopicId}.`,\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n let messagesToProcess: HCSMessageWithTimestamp[] = [];\n let latestTimestampNanos = lastProcessedTimestamp;\n const isFetchingLatest = params.fetchLatest === true;\n\n if (isFetchingLatest) {\n this.logger.info('Fetching latest messages regardless of timestamp.');\n const count = params.lastMessagesCount ?? 1;\n messagesToProcess = allMessages.slice(-count);\n } else {\n this.logger.info(\n `Filtering for messages newer than ${lastProcessedTimestamp}`\n );\n messagesToProcess = allMessages.filter(\n (msg: HCSMessageWithTimestamp) => {\n const msgTimestampNanos = msg.timestamp * 1_000_000;\n return msgTimestampNanos > lastProcessedTimestamp;\n }\n );\n\n if (messagesToProcess.length > 0) {\n latestTimestampNanos = messagesToProcess.reduce(\n (maxTs, msg) => Math.max(maxTs, msg.timestamp * 1_000_000),\n lastProcessedTimestamp\n );\n }\n }\n\n if (messagesToProcess.length === 0) {\n const message = isFetchingLatest\n ? `Could not retrieve the latest message(s). No messages found on topic ${connectionTopicId}.`\n : `No new messages found for connection with ${targetAgentName} since last check.`;\n\n this.executeResult = {\n success: true,\n rawResult: {\n messages: [],\n message,\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n this.logger.info(`Processing ${messagesToProcess.length} message(s).`);\n\n let outputString = isFetchingLatest\n ? `Latest message(s) from ${targetAgentName}:\\n`\n : `New messages from ${targetAgentName}:\\n`;\n\n const processedMessages: Array<{\n timestamp: number;\n sequenceNumber: number;\n content: string | undefined;\n raw: HCSMessageWithTimestamp;\n }> = [];\n\n for (const msg of messagesToProcess) {\n let content = msg.data;\n try {\n if (typeof content === 'string' && content.startsWith('hcs://')) {\n this.logger.debug(`Resolving inscribed message: ${content}`);\n content = await this.getMessageContent(content);\n this.logger.debug(`Resolved content length: ${content?.length}`);\n }\n\n let displayContent = content;\n try {\n const parsed = JSON.parse(content || '{}');\n if (\n parsed.p === 'hcs-10' &&\n parsed.op === 'message' &&\n parsed.data\n ) {\n const senderOpId = parsed.operator_id || 'unknown_sender';\n displayContent = `[${senderOpId}]: ${parsed.data}`;\n } else {\n displayContent = content;\n }\n } catch {\n displayContent = content;\n }\n\n const messageDate = new Date(msg.timestamp);\n outputString += `\\n[${messageDate.toLocaleString()}] (Seq: ${\n msg.sequence_number\n })\\n${displayContent}\\n`;\n\n processedMessages.push({\n timestamp: msg.timestamp,\n sequenceNumber: msg.sequence_number,\n content: displayContent,\n raw: msg,\n });\n } catch (error) {\n const errorMsg = `Error processing message (Seq: ${\n msg.sequence_number\n }): ${error instanceof Error ? error.message : String(error)}`;\n this.logger.error(errorMsg);\n outputString += `\\n[Error processing message Seq: ${msg.sequence_number}]\\n`;\n }\n }\n\n if (!isFetchingLatest && latestTimestampNanos > lastProcessedTimestamp) {\n this.logger.debug(\n `Updating timestamp for topic ${connectionTopicId} to ${latestTimestampNanos}`\n );\n this.stateManager.updateTimestamp(\n connectionTopicId,\n latestTimestampNanos\n );\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n messages: processedMessages,\n formattedOutput: outputString.trim(),\n targetAgentName,\n connectionTopicId,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error(\n `Failed to check messages for topic ${connectionTopicId}: ${error}`\n );\n this.executeResult = {\n success: false,\n error: `Error checking messages for ${targetAgentName}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Find registrations using the configured registry\n */\n public async findRegistrations(params: {\n accountId?: string;\n tags?: number[];\n }): Promise<this> {\n this.clearNotes();\n\n try {\n const options: {\n network: StandardNetworkType;\n accountId?: string;\n tags?: number[];\n } = {\n network: this.network,\n };\n\n if (params.accountId) {\n options.accountId = params.accountId;\n }\n\n if (params.tags && params.tags.length > 0) {\n options.tags = params.tags;\n }\n\n const result = await this.standardClient.findRegistrations(options);\n\n if (!result.success || result.error) {\n this.executeResult = {\n success: false,\n error: `Error finding registrations: ${\n result.error || 'Unknown error'\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n if (!result.registrations || result.registrations.length === 0) {\n this.executeResult = {\n success: true,\n rawResult: {\n registrations: [],\n message: 'No registrations found matching the criteria.',\n },\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const formattedRegistrations = result.registrations\n .map((reg: unknown): string => {\n const registration = reg as {\n agent?: { name?: string; capabilities?: string[] };\n accountId?: string;\n };\n const agentName = registration.agent?.name || 'Unknown Agent';\n const accountId = registration.accountId || 'Unknown Account';\n const capabilities =\n registration.agent?.capabilities?.join(', ') || 'None';\n\n return `Agent: ${agentName} (${accountId}), Capabilities: ${capabilities}`;\n })\n .join('\\\\n');\n\n this.executeResult = {\n success: true,\n rawResult: {\n registrations: result.registrations,\n formattedOutput: `Found ${result.registrations.length} registration(s):\\\\n${formattedRegistrations}`,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error('Error during FindRegistrations execution:', error);\n this.executeResult = {\n success: false,\n error: `Failed to search registrations: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Retrieve detailed profile information for an agent\n */\n public async retrieveProfile(params: {\n accountId: string;\n disableCache?: boolean;\n }): Promise<this> {\n this.clearNotes();\n\n try {\n const profileResponse = await this.standardClient.retrieveProfile(\n params.accountId,\n params.disableCache || false\n );\n\n if (!profileResponse.success) {\n this.executeResult = {\n success: false,\n error: `Failed to retrieve profile: ${\n profileResponse.error || 'Unknown error'\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n return this;\n }\n\n const profile = profileResponse.profile;\n const topicInfo = profileResponse.topicInfo;\n\n let profileDetails = `Profile for ${params.accountId}:\\n`;\n profileDetails += `Name: ${profile.name || 'Unknown'}\\n`;\n profileDetails += `Bio: ${profile.bio || 'No bio provided'}\\n`;\n profileDetails += `Type: ${profile.type || 'Unknown'}\\n`;\n profileDetails += `Model: ${profile.model || 'Unknown'}\\n`;\n\n if (profile.capabilities && profile.capabilities.length > 0) {\n profileDetails += `Capabilities: ${profile.capabilities.join(', ')}\\n`;\n } else {\n profileDetails += `Capabilities: None listed\\n`;\n }\n\n if (topicInfo) {\n profileDetails += `Inbound Topic: ${\n topicInfo.inboundTopic || 'Unknown'\n }\\n`;\n profileDetails += `Outbound Topic: ${\n topicInfo.outboundTopic || 'Unknown'\n }\\n`;\n profileDetails += `Profile Topic: ${\n topicInfo.profileTopicId || 'Unknown'\n }\\n`;\n }\n\n if (profile.social && Object.keys(profile.social).length > 0) {\n profileDetails += `Social: ${Object.entries(profile.social)\n .map(\n ([platform, handle]: [string, unknown]): string =>\n `${platform}: ${handle}`\n )\n .join(', ')}\\n`;\n }\n\n if (profile.properties && Object.keys(profile.properties).length > 0) {\n profileDetails += `Properties: ${JSON.stringify(profile.properties)}\\n`;\n }\n\n this.executeResult = {\n success: true,\n rawResult: {\n profileDetails,\n rawProfile: profileResponse,\n },\n } as ExecuteResult & { rawResult?: unknown };\n } catch (error) {\n this.logger.error(\n `Unexpected error retrieving profile for ${params.accountId}:`,\n error\n );\n this.executeResult = {\n success: false,\n error: `Unexpected error retrieving profile for ${params.accountId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n } as ExecuteResult & { rawResult?: unknown };\n }\n\n return this;\n }\n\n /**\n * Override execute to return stored HCS10 operation results\n */\n public override async execute(): Promise<ExecuteResult> {\n if (this.executeResult) {\n return {\n success: this.executeResult.success,\n transactionId: this.executeResult.transactionId,\n receipt: this.executeResult.receipt,\n scheduleId: this.executeResult.scheduleId,\n error: this.executeResult.error,\n rawResult: this.executeResult.rawResult,\n notes: this.notes,\n } as ExecuteResult & { rawResult?: unknown; notes?: string[] };\n }\n\n return {\n success: false,\n error: 'No operation result available. Call a builder method first.',\n };\n }\n}\n","// Re-export the HBAR price tool from hedera-agent-kit\nexport { HederaGetHbarPriceTool as GetHbarPriceTool } from 'hedera-agent-kit';\n\nimport { BasePlugin, GenericPluginContext, HederaTool, HederaAgentKit } from 'hedera-agent-kit';\nimport { HederaGetHbarPriceTool } from 'hedera-agent-kit';\n\n/**\n * Plugin to provide tools related to Hedera network information, like HBAR price.\n * Uses the built-in HederaGetHbarPriceTool from hedera-agent-kit.\n */\nexport class HbarPricePlugin extends BasePlugin<GenericPluginContext> {\n id = 'hedera-hbar-price';\n name = 'Hedera HBAR Price Plugin';\n description = 'Provides tools to interact with Hedera network data, specifically HBAR price.';\n version = '1.0.0';\n author = 'Hashgraph Online';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n this.initializeTools();\n }\n\n private initializeTools(): void {\n this.tools = [\n new HederaGetHbarPriceTool({\n hederaKit: this.context.config.hederaKit as HederaAgentKit,\n logger: this.context.logger\n })\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n}","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n HCS2Client,\n SDKHCS2ClientConfig,\n CreateRegistryOptions,\n RegisterEntryOptions,\n UpdateEntryOptions,\n DeleteEntryOptions,\n MigrateTopicOptions,\n QueryRegistryOptions,\n TopicRegistrationResponse,\n RegistryOperationResponse,\n TopicRegistry,\n NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Builder for HCS-2 operations that delegates to HCS2Client\n */\nexport class HCS2Builder extends BaseServiceBuilder {\n protected hcs2Client?: HCS2Client;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Get or create HCS-2 client\n */\n protected async getHCS2Client(): Promise<HCS2Client> {\n if (!this.hcs2Client) {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const config: SDKHCS2ClientConfig = {\n network: networkType,\n operatorId: operatorId,\n operatorKey: operatorPrivateKey,\n };\n\n this.hcs2Client = new HCS2Client(config);\n }\n return this.hcs2Client;\n }\n\n /**\n * Create a new HCS-2 registry\n * Note: This executes the transaction directly via HCS2Client\n */\n async createRegistry(\n options: CreateRegistryOptions = {}\n ): Promise<TopicRegistrationResponse> {\n const client = await this.getHCS2Client();\n return await client.createRegistry(options);\n }\n\n /**\n * Register a new entry in an HCS-2 registry\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.registerEntry(registryTopicId, options);\n }\n\n /**\n * Update an existing entry in an HCS-2 registry\n */\n async updateEntry(\n registryTopicId: string,\n options: UpdateEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.updateEntry(registryTopicId, options);\n }\n\n /**\n * Delete an entry from an HCS-2 registry\n */\n async deleteEntry(\n registryTopicId: string,\n options: DeleteEntryOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.deleteEntry(registryTopicId, options);\n }\n\n /**\n * Migrate an HCS-2 registry to a new topic\n */\n async migrateRegistry(\n registryTopicId: string,\n options: MigrateTopicOptions\n ): Promise<RegistryOperationResponse> {\n const client = await this.getHCS2Client();\n return await client.migrateRegistry(registryTopicId, options);\n }\n\n /**\n * Query entries from an HCS-2 registry\n */\n async getRegistry(\n topicId: string,\n options: QueryRegistryOptions = {}\n ): Promise<TopicRegistry> {\n const client = await this.getHCS2Client();\n return await client.getRegistry(topicId, options);\n }\n\n /**\n * Submit a raw message to an HCS-2 topic\n */\n async submitMessage(\n topicId: string,\n payload: any\n ): Promise<any> {\n const client = await this.getHCS2Client();\n return await client.submitMessage(topicId, payload);\n }\n\n /**\n * Get topic info from mirror node\n */\n async getTopicInfo(topicId: string): Promise<any> {\n const client = await this.getHCS2Client();\n return await client.getTopicInfo(topicId);\n }\n\n /**\n * Close the HCS-2 client\n */\n async close(): Promise<void> {\n if (this.hcs2Client) {\n this.hcs2Client.close();\n this.hcs2Client = undefined;\n }\n }\n}","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n HCS6Client,\n SDKHCS6ClientConfig,\n HCS6CreateRegistryOptions,\n HCS6RegisterEntryOptions,\n HCS6QueryRegistryOptions,\n HCS6RegisterOptions,\n HCS6CreateHashinalOptions,\n HCS6TopicRegistrationResponse,\n HCS6RegistryOperationResponse,\n HCS6TopicRegistry,\n HCS6CreateHashinalResponse,\n NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Builder for HCS-6 operations that delegates to HCS6Client\n */\nexport class HCS6Builder extends BaseServiceBuilder {\n protected hcs6Client?: HCS6Client;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Get or create HCS-6 client\n */\n protected async getHCS6Client(): Promise<HCS6Client> {\n if (!this.hcs6Client) {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const config: SDKHCS6ClientConfig = {\n network: networkType,\n operatorId: operatorId,\n operatorKey: operatorPrivateKey,\n };\n\n this.hcs6Client = new HCS6Client(config);\n }\n return this.hcs6Client;\n }\n\n /**\n * Create a new HCS-6 dynamic registry\n * Note: This executes the transaction directly via HCS6Client\n */\n async createRegistry(\n options: HCS6CreateRegistryOptions = {}\n ): Promise<HCS6TopicRegistrationResponse> {\n const client = await this.getHCS6Client();\n return await client.createRegistry(options);\n }\n\n /**\n * Register a new dynamic hashinal entry in an HCS-6 registry\n */\n async registerEntry(\n registryTopicId: string,\n options: HCS6RegisterEntryOptions\n ): Promise<HCS6RegistryOperationResponse> {\n const client = await this.getHCS6Client();\n return await client.registerEntry(registryTopicId, options);\n }\n\n /**\n * Query entries from an HCS-6 registry\n */\n async getRegistry(\n topicId: string,\n options: HCS6QueryRegistryOptions = {}\n ): Promise<HCS6TopicRegistry> {\n const client = await this.getHCS6Client();\n return await client.getRegistry(topicId, options);\n }\n\n /**\n * Create a complete dynamic hashinal with inscription and registry\n */\n async createHashinal(\n options: HCS6CreateHashinalOptions\n ): Promise<HCS6CreateHashinalResponse> {\n const client = await this.getHCS6Client();\n return await client.createHashinal(options);\n }\n\n /**\n * Register a dynamic hashinal with combined inscription and registry creation\n * This is the main method for creating and updating dynamic hashinals\n */\n async register(\n options: HCS6RegisterOptions\n ): Promise<HCS6CreateHashinalResponse> {\n const client = await this.getHCS6Client();\n return await client.register(options);\n }\n\n /**\n * Submit a raw message to an HCS-6 topic\n */\n async submitMessage(\n topicId: string,\n payload: any\n ): Promise<any> {\n const client = await this.getHCS6Client();\n return await client.submitMessage(topicId, payload);\n }\n\n /**\n * Get topic info from mirror node\n */\n async getTopicInfo(topicId: string): Promise<any> {\n const client = await this.getHCS6Client();\n return await client.getTopicInfo(topicId);\n }\n\n /**\n * Close the HCS-6 client\n */\n async close(): Promise<void> {\n if (this.hcs6Client) {\n this.hcs6Client.close();\n this.hcs6Client = undefined;\n }\n }\n}","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n inscribe,\n inscribeWithSigner,\n retrieveInscription,\n InscriptionInput,\n InscriptionOptions,\n InscriptionResponse,\n RetrievedInscriptionResult,\n HederaClientConfig,\n NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * Type definition for DAppSigner since we don't have the actual package\n */\ninterface DAppSigner {\n getAccountId(): { toString(): string };\n}\n\n/**\n * Type definition for InscriptionSDK since we don't have the actual package\n */\ninterface InscriptionSDK {\n inscribeAndExecute(request: any, config: any): Promise<any>;\n inscribe(request: any, signer: any): Promise<any>;\n waitForInscription(txId: string, maxAttempts: number, intervalMs: number, checkCompletion: boolean, progressCallback?: Function): Promise<any>;\n}\n\n/**\n * Builder for Inscription operations\n */\nexport class InscriberBuilder extends BaseServiceBuilder {\n protected inscriptionSDK?: InscriptionSDK;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Get or create Inscription SDK - temporarily returns null since we don't have the actual SDK\n */\n protected async getInscriptionSDK(\n options: InscriptionOptions\n ): Promise<InscriptionSDK | null> {\n return null;\n }\n\n /**\n * Inscribe content using server-side authentication\n */\n async inscribe(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const clientConfig: HederaClientConfig = {\n accountId: operatorId,\n privateKey: operatorPrivateKey,\n network: networkType,\n };\n\n return await inscribe(input, clientConfig, options);\n }\n\n /**\n * Inscribe content using a DApp signer\n */\n async inscribeWithSigner(\n input: InscriptionInput,\n signer: DAppSigner,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n return await inscribeWithSigner(input, signer as any, options);\n }\n\n /**\n * Retrieve an existing inscription\n */\n async retrieveInscription(\n transactionId: string,\n options: InscriptionOptions\n ): Promise<RetrievedInscriptionResult> {\n const operatorId = this.hederaKit.signer.getAccountId().toString();\n const operatorPrivateKey = this.hederaKit.signer?.getOperatorPrivateKey()\n ? this.hederaKit.signer.getOperatorPrivateKey().toStringRaw()\n : '';\n\n return await retrieveInscription(transactionId, {\n ...options,\n accountId: operatorId,\n privateKey: operatorPrivateKey,\n });\n }\n\n /**\n * Close the inscription SDK\n */\n async close(): Promise<void> {\n this.inscriptionSDK = undefined;\n }\n}","import { TransactionReceipt, PrivateKey } from '@hashgraph/sdk';\nimport {\n HCS10Client as StandardSDKClient,\n AgentBuilder,\n InboundTopicType as StandardInboundTopicType,\n AIAgentCapability as StandardAIAgentCapability,\n AgentRegistrationResult,\n WaitForConnectionConfirmationResponse,\n ProfileResponse as SDKProfileResponse,\n HCSMessage,\n LogLevel,\n Logger,\n FeeConfigBuilderInterface,\n SocialPlatform,\n} from '@hashgraphonline/standards-sdk';\nimport { AgentMetadata, AgentChannels } from './types';\nimport { encryptMessage } from '../utils/Encryption';\nimport { IStateManager } from '../state/state-types';\n\n// Keep type alias as they were removed accidentally\ntype StandardHandleConnectionRequest = InstanceType<\n typeof StandardSDKClient\n>['handleConnectionRequest'];\ntype HandleConnectionRequestResponse = Awaited<\n ReturnType<StandardHandleConnectionRequest>\n>;\nexport type StandardNetworkType = 'mainnet' | 'testnet';\n\nexport interface ClientValidationOptions {\n accountId: string;\n privateKey: string;\n network?: StandardNetworkType;\n stateManager?: IStateManager;\n}\n\nexport interface HCSMessageWithTimestamp extends HCSMessage {\n timestamp: number;\n data?: string;\n sequence_number: number;\n}\n\nexport interface ExtendedAgentMetadata extends AgentMetadata {\n pfpBuffer?: Buffer;\n pfpFileName?: string;\n feeConfig?: FeeConfigBuilderInterface;\n}\n\n/**\n * HCS10Client wraps the HCS-10 functionalities using the @hashgraphonline/standards-sdk.\n * - Creates and registers agents using the standard SDK flow.\n * - Manages agent communication channels (handled by standard SDK).\n * - Sends messages on Hedera topics (currently manual, potential for standard SDK integration).\n */\nexport class HCS10Client {\n public standardClient: StandardSDKClient;\n private useEncryption: boolean;\n public agentChannels?: AgentChannels;\n public guardedRegistryBaseUrl: string;\n public logger: Logger;\n\n constructor(\n operatorId: string,\n operatorPrivateKey: string,\n network: StandardNetworkType,\n options?: {\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: LogLevel;\n }\n ) {\n this.standardClient = new StandardSDKClient({\n network: network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\n guardedRegistryBaseUrl: options?.registryUrl,\n logLevel: options?.logLevel,\n });\n this.guardedRegistryBaseUrl = options?.registryUrl || '';\n this.useEncryption = options?.useEncryption || false;\n const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n this.logger = new Logger({\n level: options?.logLevel || 'info',\n silent: shouldSilence,\n });\n }\n\n public getOperatorId(): string {\n const operator = this.standardClient.getClient().operatorAccountId;\n if (!operator) {\n throw new Error('Operator Account ID not configured in standard client.');\n }\n return operator.toString();\n }\n\n public getNetwork(): StandardNetworkType {\n return this.standardClient.getNetwork() as StandardNetworkType;\n }\n\n public async handleConnectionRequest(\n inboundTopicId: string,\n requestingAccountId: string,\n connectionRequestId: number,\n feeConfig?: FeeConfigBuilderInterface\n ): Promise<HandleConnectionRequestResponse> {\n try {\n const result = await this.standardClient.handleConnectionRequest(\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig\n );\n return result;\n } catch (error) {\n this.logger.error(\n `Error handling connection request #${connectionRequestId} for topic ${inboundTopicId}:`,\n error\n );\n throw new Error(\n `Failed to handle connection request: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves the profile for a given account ID using the standard SDK.\n */\n public async getAgentProfile(accountId: string): Promise<SDKProfileResponse> {\n return this.standardClient.retrieveProfile(accountId);\n }\n\n /**\n * Exposes the standard SDK's submitConnectionRequest method.\n */\n public async submitConnectionRequest(\n inboundTopicId: string,\n memo: string\n ): Promise<TransactionReceipt> {\n return this.standardClient.submitConnectionRequest(\n inboundTopicId,\n memo\n ) as Promise<TransactionReceipt>;\n }\n\n /**\n * Exposes the standard SDK's waitForConnectionConfirmation method.\n */\n public async waitForConnectionConfirmation(\n outboundTopicId: string,\n connectionRequestId: number,\n maxAttempts = 60,\n delayMs = 2000\n ): Promise<WaitForConnectionConfirmationResponse> {\n return this.standardClient.waitForConnectionConfirmation(\n outboundTopicId,\n connectionRequestId,\n maxAttempts,\n delayMs\n );\n }\n\n /**\n * Creates and registers an agent using the standard SDK's HCS10Client.\n * This handles account creation, key generation, topic setup, and registration.\n *\n * When metadata includes fee configuration:\n * 1. The properties.feeConfig will be passed to the AgentBuilder\n * 2. The properties.inboundTopicType will be set to FEE_BASED\n * 3. The SDK's createAndRegisterAgent will apply the fees to the agent's inbound topic\n *\n * @param metadata - The agent's metadata, potentially including pfpBuffer, pfpFileName,\n * and fee configuration in properties.feeConfig\n * @returns The registration result from the standard SDK, containing accountId, keys, topics etc.\n */\n public async createAndRegisterAgent(\n metadata: ExtendedAgentMetadata\n ): Promise<AgentRegistrationResult> {\n const builder = new AgentBuilder()\n .setName(metadata.name)\n .setBio(metadata.description || '')\n .setCapabilities(\n metadata.capabilities\n ? metadata.capabilities\n : [StandardAIAgentCapability.TEXT_GENERATION]\n )\n .setType((metadata.type || 'autonomous') as 'autonomous' | 'manual')\n .setModel(metadata.model || 'agent-model-2024')\n .setNetwork(this.getNetwork())\n .setInboundTopicType(StandardInboundTopicType.PUBLIC);\n\n if (metadata?.feeConfig) {\n builder.setInboundTopicType(StandardInboundTopicType.FEE_BASED);\n builder.setFeeConfig(metadata.feeConfig);\n }\n\n if (metadata.pfpBuffer && metadata.pfpFileName) {\n if (metadata.pfpBuffer.byteLength === 0) {\n this.logger.warn(\n 'Provided PFP buffer is empty. Skipping profile picture.'\n );\n } else {\n this.logger.info(\n `Setting profile picture: ${metadata.pfpFileName} (${metadata.pfpBuffer.byteLength} bytes)`\n );\n builder.setProfilePicture(metadata.pfpBuffer, metadata.pfpFileName);\n }\n } else {\n this.logger.warn(\n 'Profile picture not provided in metadata. Agent creation might fail if required by the underlying SDK builder.'\n );\n }\n\n if (metadata.social) {\n Object.entries(metadata.social).forEach(([platform, handle]) => {\n builder.addSocial(platform as SocialPlatform, handle);\n });\n }\n\n if (metadata.properties) {\n Object.entries(metadata.properties).forEach(([key, value]) => {\n builder.addProperty(key, value);\n });\n }\n\n try {\n const hasFees = Boolean(metadata?.feeConfig);\n const result = await this.standardClient.createAndRegisterAgent(builder, {\n initialBalance: hasFees ? 50 : undefined,\n });\n if (\n result?.metadata?.inboundTopicId &&\n result?.metadata?.outboundTopicId\n ) {\n this.agentChannels = {\n inboundTopicId: result.metadata.inboundTopicId,\n outboundTopicId: result.metadata.outboundTopicId,\n };\n }\n return result;\n } catch (error) {\n this.logger.error('Error during agent creation/registration:', error);\n throw new Error(\n `Failed to create/register agent: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Sends a structured HCS-10 message to the specified topic using the standard SDK client.\n * Handles potential inscription for large messages.\n *\n * @param topicId - The target topic ID (likely a connection topic).\n * @param operatorId - The operator ID string (e.g., \"inboundTopic@accountId\").\n * @param data - The actual message content/data.\n * @param memo - Optional memo for the message.\n * @param submitKey - Optional private key for topics requiring specific submit keys.\n * @returns A confirmation status string from the transaction receipt.\n */\n public async sendMessage(\n topicId: string,\n data: string,\n memo?: string,\n submitKey?: PrivateKey\n ): Promise<number | undefined> {\n if (this.useEncryption) {\n data = encryptMessage(data);\n }\n\n try {\n const messageResponse = await this.standardClient.sendMessage(\n topicId,\n data,\n memo,\n submitKey\n );\n return messageResponse.topicSequenceNumber?.toNumber();\n } catch (error) {\n this.logger.error(`Error sending message to topic ${topicId}:`, error);\n throw new Error(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves messages from a topic using the standard SDK client.\n *\n * @param topicId - The topic ID to get messages from.\n * @returns Messages from the topic, mapped to the expected format.\n */\n public async getMessages(topicId: string): Promise<{\n messages: HCSMessageWithTimestamp[];\n }> {\n try {\n const result = await this.standardClient.getMessages(topicId);\n\n const mappedMessages = result.messages.map((sdkMessage) => {\n const timestamp = sdkMessage?.created?.getTime() || 0;\n\n return {\n ...sdkMessage,\n timestamp: timestamp,\n data: sdkMessage.data,\n sequence_number: sdkMessage.sequence_number,\n };\n });\n mappedMessages.sort(\n (a: { timestamp: number }, b: { timestamp: number }) =>\n a.timestamp - b.timestamp\n );\n return { messages: mappedMessages as HCSMessageWithTimestamp[] };\n } catch (error) {\n this.logger.error(`Error getting messages from topic ${topicId}:`, error);\n return { messages: [] };\n }\n }\n\n public async getMessageStream(topicId: string): Promise<{\n messages: HCSMessage[];\n }> {\n const result = this.standardClient.getMessageStream(topicId);\n return result as Promise<{ messages: HCSMessage[] }>;\n }\n\n /**\n * Retrieves content from an inscribed message using the standard SDK client.\n * @param inscriptionIdOrData - The inscription ID (hcs://...) or potentially raw data string.\n * @returns The resolved message content.\n */\n public async getMessageContent(inscriptionIdOrData: string): Promise<string> {\n try {\n const content = await this.standardClient.getMessageContent(\n inscriptionIdOrData\n );\n return content as string;\n } catch (error) {\n this.logger.error(\n `Error retrieving message content for: ${inscriptionIdOrData}`,\n error\n );\n throw new Error(\n `Failed to retrieve message content: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Retrieves the inbound topic ID associated with the current operator.\n * This typically involves fetching the operator's own HCS-10 profile.\n * @returns A promise that resolves to the operator's inbound topic ID.\n * @throws {Error} If the operator ID cannot be determined or the profile/topic cannot be retrieved.\n */\n public async getInboundTopicId(): Promise<string> {\n try {\n const operatorId = this.getOperatorId();\n this.logger.info(\n `[HCS10Client] Retrieving profile for operator ${operatorId} to find inbound topic...`\n );\n const profileResponse = await this.getAgentProfile(operatorId);\n if (profileResponse.success && profileResponse.topicInfo?.inboundTopic) {\n this.logger.info(\n `[HCS10Client] Found inbound topic for operator ${operatorId}: ${profileResponse.topicInfo.inboundTopic}`\n );\n return profileResponse.topicInfo.inboundTopic;\n } else {\n throw new Error(\n `Could not retrieve inbound topic from profile for ${operatorId}. Profile success: ${profileResponse.success}, Error: ${profileResponse.error}`\n );\n }\n } catch (error) {\n this.logger.error(\n `[HCS10Client] Error fetching operator's inbound topic ID (${this.getOperatorId()}):`,\n error\n );\n const operatorId = this.getOperatorId();\n let detailedMessage = `Failed to get inbound topic ID for operator ${operatorId}.`;\n if (\n error instanceof Error &&\n error.message.includes('does not have a valid HCS-11 memo')\n ) {\n detailedMessage += ` The account profile may not exist or is invalid. Please ensure this operator account (${operatorId}) is registered as an HCS-10 agent. You might need to register it first (e.g., using the 'register_agent' tool or SDK function).`;\n } else if (error instanceof Error) {\n detailedMessage += ` Reason: ${error.message}`;\n } else {\n detailedMessage += ` Unexpected error: ${String(error)}`;\n }\n throw new Error(detailedMessage);\n }\n }\n\n /**\n * Retrieves the configured operator account ID and private key.\n * Required by tools needing to identify the current agent instance.\n */\n public getAccountAndSigner(): { accountId: string; signer: PrivateKey } {\n const result = this.standardClient.getAccountAndSigner();\n return {\n accountId: result.accountId,\n signer: result.signer as unknown as PrivateKey,\n };\n }\n\n /**\n * Retrieves the outbound topic ID for the current operator.\n * Fetches the operator's profile if necessary.\n * @returns The outbound topic ID string.\n * @throws If the outbound topic cannot be determined.\n */\n public async getOutboundTopicId(): Promise<string> {\n const operatorId = this.getOperatorId();\n const profile = await this.getAgentProfile(operatorId);\n if (profile.success && profile.topicInfo?.outboundTopic) {\n return profile.topicInfo.outboundTopic;\n } else {\n throw new Error(\n `Could not retrieve outbound topic from profile for ${operatorId}. Profile success: ${profile.success}, Error: ${profile.error}`\n );\n }\n }\n\n public setClient(accountId: string, privateKey: string): StandardSDKClient {\n this.standardClient = new StandardSDKClient({\n network: this.getNetwork(),\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n guardedRegistryBaseUrl: this.guardedRegistryBaseUrl,\n });\n return this.standardClient;\n }\n\n /**\n * Validates that the operator account exists and has proper access for agent operations\n */\n private async validateOperator(options: ClientValidationOptions): Promise<{\n isValid: boolean;\n operator?: { accountId: string };\n error?: string;\n }> {\n try {\n // Set up client with provided operator details\n this.setClient(options.accountId, options.privateKey);\n\n // Check if we can retrieve the operator ID\n const operatorId = this.getOperatorId();\n\n // If we got this far, basic validation passed\n return {\n isValid: true,\n operator: { accountId: operatorId },\n };\n } catch (error) {\n this.logger.error(`Validation error: ${error}`);\n return {\n isValid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async initializeWithValidation(options: ClientValidationOptions): Promise<{\n isValid: boolean;\n operator?: { accountId: string };\n error?: string;\n }> {\n const validationResult = await this.validateOperator(options);\n\n if (validationResult.isValid) {\n // If we have access to the state manager, initialize its connections manager\n if (options.stateManager) {\n options.stateManager.initializeConnectionsManager(this.standardClient);\n }\n }\n\n return validationResult;\n }\n}\n","import { HederaAgentKit, ServerSigner } from 'hedera-agent-kit';\nimport { HCS10Builder } from '../builders/hcs10/hcs10-builder';\nimport { RegisterAgentTool } from '../tools/hcs10/RegisterAgentTool';\nimport { FindRegistrationsTool } from '../tools/hcs10/FindRegistrationsTool';\nimport { InitiateConnectionTool } from '../tools/hcs10/InitiateConnectionTool';\nimport { ListConnectionsTool } from '../tools/hcs10/ListConnectionsTool';\nimport { SendMessageToConnectionTool } from '../tools/hcs10/SendMessageToConnectionTool';\nimport { CheckMessagesTool } from '../tools/hcs10/CheckMessagesTool';\nimport { ConnectionMonitorTool } from '../tools/hcs10/ConnectionMonitorTool';\nimport { ManageConnectionRequestsTool } from '../tools/hcs10/ManageConnectionRequestsTool';\nimport { AcceptConnectionRequestTool } from '../tools/hcs10/AcceptConnectionRequestTool';\nimport { RetrieveProfileTool } from '../tools/hcs10/RetrieveProfileTool';\nimport { ListUnapprovedConnectionRequestsTool } from '../tools/hcs10/ListUnapprovedConnectionRequestsTool';\nimport { IStateManager } from '../state/state-types';\nimport { OpenConvaiState } from '../state/open-convai-state';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { ENV_FILE_PATH } from '../utils/state-tools';\n\nexport interface HCS10ClientConfig {\n operatorId?: string;\n operatorKey?: string;\n network?: 'mainnet' | 'testnet';\n useEncryption?: boolean;\n registryUrl?: string;\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n}\n\nexport interface HCS10InitializationOptions {\n clientConfig?: HCS10ClientConfig;\n stateManager?: IStateManager;\n createAllTools?: boolean;\n monitoringClient?: boolean;\n}\n\n/**\n * Tool collection containing all available tools from the standards-agent-kit\n */\nexport interface HCS10Tools {\n registerAgentTool: RegisterAgentTool;\n findRegistrationsTool: FindRegistrationsTool;\n retrieveProfileTool: RetrieveProfileTool;\n initiateConnectionTool: InitiateConnectionTool;\n listConnectionsTool: ListConnectionsTool;\n sendMessageToConnectionTool: SendMessageToConnectionTool;\n checkMessagesTool: CheckMessagesTool;\n connectionMonitorTool: ConnectionMonitorTool;\n manageConnectionRequestsTool: ManageConnectionRequestsTool;\n acceptConnectionRequestTool: AcceptConnectionRequestTool;\n listUnapprovedConnectionRequestsTool: ListUnapprovedConnectionRequestsTool;\n}\n\n/**\n * Initializes the HCS10 client and returns pre-registered LangChain tools.\n *\n * @param options - Initialization options\n * @returns Object containing hederaKit, hcs10Builder and requested tools\n */\nexport const initializeStandardsAgentKit = async (\n options?: HCS10InitializationOptions\n): Promise<{\n hederaKit: HederaAgentKit;\n hcs10Builder: HCS10Builder;\n monitoringHederaKit?: HederaAgentKit;\n monitoringHcs10Builder?: HCS10Builder;\n tools: Partial<HCS10Tools>;\n stateManager: IStateManager;\n}> => {\n const config = options?.clientConfig || {};\n\n const operatorId = config.operatorId || process.env.HEDERA_OPERATOR_ID;\n const operatorPrivateKey =\n config.operatorKey || process.env.HEDERA_OPERATOR_KEY;\n\n const networkEnv = config.network || process.env.HEDERA_NETWORK || 'testnet';\n\n let network: 'mainnet' | 'testnet';\n if (networkEnv === 'mainnet') {\n network = 'mainnet';\n } else if (networkEnv === 'testnet') {\n network = 'testnet';\n } else {\n console.warn(\n `Unsupported network specified: '${networkEnv}'. Defaulting to 'testnet'.`\n );\n network = 'testnet';\n }\n\n if (!operatorId || !operatorPrivateKey) {\n throw new Error(\n 'Operator ID and private key must be provided either through options or environment variables.'\n );\n }\n\n const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n const logger = Logger.getInstance({\n level: config.logLevel || 'info',\n silent: shouldSilence,\n });\n\n const stateManager =\n options?.stateManager ||\n new OpenConvaiState({\n defaultEnvFilePath: ENV_FILE_PATH,\n defaultPrefix: 'TODD',\n });\n logger.info('State manager initialized');\n\n // Create HederaAgentKit\n const signer = new ServerSigner(operatorId, operatorPrivateKey, network);\n const hederaKit = new HederaAgentKit(signer);\n await hederaKit.initialize();\n logger.info(`HederaAgentKit initialized for ${operatorId} on ${network}`);\n\n // Create HCS10Builder\n const hcs10Builder = new HCS10Builder(hederaKit, stateManager, {\n useEncryption: config.useEncryption,\n registryUrl: config.registryUrl,\n logLevel: config.logLevel,\n });\n\n let monitoringHederaKit: HederaAgentKit | undefined;\n let monitoringHcs10Builder: HCS10Builder | undefined;\n\n if (options?.monitoringClient) {\n const monitoringSigner = new ServerSigner(operatorId, operatorPrivateKey, network);\n monitoringHederaKit = new HederaAgentKit(monitoringSigner);\n await monitoringHederaKit.initialize();\n monitoringHcs10Builder = new HCS10Builder(monitoringHederaKit, stateManager, {\n useEncryption: config.useEncryption,\n registryUrl: config.registryUrl,\n logLevel: 'error',\n });\n logger.info('Monitoring client initialized');\n }\n\n const tools: Partial<HCS10Tools> = {};\n\n // Always create RegisterAgentTool\n tools.registerAgentTool = new RegisterAgentTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n\n if (options?.createAllTools) {\n tools.findRegistrationsTool = new FindRegistrationsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.retrieveProfileTool = new RetrieveProfileTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.initiateConnectionTool = new InitiateConnectionTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.listConnectionsTool = new ListConnectionsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.sendMessageToConnectionTool = new SendMessageToConnectionTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.checkMessagesTool = new CheckMessagesTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.connectionMonitorTool = new ConnectionMonitorTool({\n hederaKit: monitoringHederaKit || hederaKit,\n hcs10Builder: monitoringHcs10Builder || hcs10Builder,\n logger: undefined,\n });\n tools.manageConnectionRequestsTool = new ManageConnectionRequestsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.acceptConnectionRequestTool = new AcceptConnectionRequestTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n tools.listUnapprovedConnectionRequestsTool =\n new ListUnapprovedConnectionRequestsTool({\n hederaKit,\n hcs10Builder,\n logger: undefined,\n });\n\n logger.info('All tools initialized');\n }\n\n return {\n hederaKit,\n hcs10Builder,\n monitoringHederaKit,\n monitoringHcs10Builder,\n tools,\n stateManager,\n };\n};"],"names":["BaseHCS10TransactionTool","BaseHederaTransactionTool","constructor","params","super","this","namespace","hcs10Builder","getServiceBuilder","BaseHCS10QueryTool","BaseHederaQueryTool","_NaturalLanguageMapper","parseCapabilities","text","AIAgentCapability","TEXT_GENERATION","normalizedText","toLowerCase","capabilities","Set","term","caps","Object","entries","CAPABILITY_MAPPINGS","includes","forEach","cap","add","size","Array","from","parseTagsOrCapabilities","input","isArray","every","item","getCapabilityName","capability","IMAGE_GENERATION","AUDIO_GENERATION","VIDEO_GENERATION","CODE_GENERATION","LANGUAGE_TRANSLATION","SUMMARIZATION_EXTRACTION","KNOWLEDGE_RETRIEVAL","DATA_INTEGRATION","MARKET_INTELLIGENCE","TRANSACTION_ANALYTICS","SMART_CONTRACT_AUDIT","GOVERNANCE_FACILITATION","SECURITY_MONITORING","COMPLIANCE_ANALYSIS","FRAUD_DETECTION","MULTI_AGENT_COORDINATION","API_INTEGRATION","WORKFLOW_AUTOMATION","ai","chat","conversation","image","picture","visual","photo","audio","sound","voice","speech","video","movie","animation","code","programming","development","coding","translate","translation","language","summarize","summary","extract","extraction","knowledge","search","retrieve","lookup","data","etl","market","trading","finance","financial","analytics","analysis","analyze","transactions","audit","contract","governance","voting","dao","security","monitoring","threat","compliance","regulatory","regulation","fraud","detection","anomaly","coordination","orchestration","api","integration","webhook","workflow","automation","process","NaturalLanguageMapper","RegisterAgentZodSchema","z","object","name","string","min","max","describe","description","optional","alias","transform","val","Date","now","toString","Math","random","type","enum","model","union","array","nativeEnum","length","tags","creator","socials","record","properties","unknown","profilePicture","url","path","filename","existingProfilePictureTopicId","initialBalance","number","positive","userAccountId","hbarFee","tokenFees","amount","tokenId","exemptAccountIds","setAsCurrent","boolean","persistence","prefix","RegisterAgentTool","specificInputSchema","neverScheduleThisTool","requiresMultipleTransactions","callBuilderMethod","builder","specificArgs","bio","randomSuffix","profilePicObj","registerAgent","_call","args","runManager","result","shouldSetAsCurrent","parsed","JSON","parse","rawResult","_handleRegistrationResult","state","accountId","metadata","e","createdResources","accountResource","find","r","startsWith","split","inboundTopicId","outboundTopicId","profileTopicId","privateKey","registeredAgent","stateManager","getStateManager","setCurrentAgent","persistAgentData","toUpperCase","replace","catch","SendMessageToConnectionZodSchema","targetIdentifier","connectionId","agentId","message","disableMonitoring","default","SendMessageToConnectionTool","Error","connectionsManager","getConnectionsManager","currentAgent","getCurrentAgent","fetchConnectionData","error","console","debug","match","connections","listConnections","connectionIndex","parseInt","establishedConnections","filter","conn","status","isPending","needsConfirmation","selectedConnection","connectionTopicId","sendMessageToConnection","establishedConnection","targetAccountId","InitiateConnectionZodSchema","disableMonitor","memo","InitiateConnectionTool","initiateConnection","ListConnectionsZodSchema","includeDetails","showPending","ListConnectionsTool","executeQuery","execute","success","raw","formattedOutput","CheckMessagesZodSchema","fetchLatest","lastMessagesCount","int","CheckMessagesTool","checkMessages","FindRegistrationsZodSchema","FindRegistrationsTool","findRegistrations","ConnectionMonitorZodSchema","acceptAll","hbarFees","collectorAccount","monitorDurationSeconds","defaultCollectorAccount","ConnectionMonitorTool","monitorConnections","ManageConnectionRequestsZodSchema","action","requestKey","ManageConnectionRequestsTool","manageConnectionRequests","AcceptConnectionRequestZodSchema","AcceptConnectionRequestTool","acceptConnection","RetrieveProfileZodSchema","disableCache","RetrieveProfileTool","retrieveProfile","profileDetails","rawProfile","ListUnapprovedConnectionRequestsZodSchema","ListUnapprovedConnectionRequestsTool","listUnapprovedConnectionRequests","BaseHCS2TransactionTool","hcs2Builder","BaseHCS2QueryTool","createRegistrySchema","registryType","HCS2RegistryType","ttl","adminKey","submitKey","registerEntrySchema","registryTopicId","regex","targetTopicId","updateEntrySchema","uid","deleteEntrySchema","migrateRegistrySchema","queryRegistrySchema","topicId","limit","order","skip","BaseHCS6TransactionTool","hcs6Builder","BaseHCS6QueryTool","CreateDynamicRegistrySchema","RegisterDynamicHashinalSchema","base64","mimeType","UpdateDynamicHashinalSchema","QueryDynamicRegistrySchema","BaseInscriberTransactionTool","inscriberBuilder","BaseInscriberQueryTool","inscribeFromUrlSchema","mode","chunkSize","waitForConfirmation","apiKey","inscribeFromFileSchema","filePath","timeoutMs","inscribeFromBufferSchema","base64Data","fileName","inscribeHashinalSchema","attributes","trait_type","value","jsonFileURL","retrieveInscriptionSchema","transactionId","ENV_FILE_PATH","join","cwd","OpenConvaiState","options","connectionMessageTimestamps","defaultEnvFilePath","defaultPrefix","shouldSilence","disableLogging","env","DISABLE_LOGGING","logger","Logger","module","silent","baseClient","initializeConnectionsManager","ConnectionsManager","logLevel","agent","clearAll","addActiveConnection","connection","sdkConnection","targetAgentName","targetInboundTopicId","convertConnectionStatus","created","lastActivity","profileInfo","connectionRequestId","processed","updateOrAddConnection","initializeTimestampIfNeeded","getAllConnections","map","convertToActiveConnection","getConnectionByIdentifier","identifier","numericIndex","isNaN","byTopicId","getConnectionByTopicId","byAccountId","getConnectionByAccountId","getLastTimestamp","updateTimestamp","timestampNanos","convertToStateStatus","envFilePath","updates","async","variables","envContent","fs","existsSync","readFileSync","updatedLines","key","lineIndex","findIndex","line","push","writeFileSync","updateEnvFile","NOT_INITIALIZED_ERROR","HCS10Builder","BaseServiceBuilder","hederaKit","useEncryption","guardedRegistryBaseUrl","registryUrl","network","client","operatorId","signer","getAccountId","operatorPrivateKey","getOperatorPrivateKey","toStringRaw","sdkLogger","SDKLogger","level","standardClient","HCS10Client","getOperatorId","operator","getClient","operatorAccountId","getNetwork","getAccountAndSigner","getInboundTopicId","info","profileResponse","getAgentProfile","topicInfo","inboundTopic","detailedMessage","String","submitConnectionRequest","handleConnectionRequest","requestingAccountId","feeConfig","sendMessage","stringify","messageResponse","sequenceNumber","topicSequenceNumber","toNumber","receipt","getMessages","mappedMessages","messages","sdkMessage","timestamp","getTime","sequence_number","p","sort","a","b","getMessageStream","getMessageContent","inscriptionIdOrData","getStandardClient","loadProfilePicture","response","axios","get","responseType","buffer","globalThis","Buffer","urlPathname","URL","pathname","basename","warn","createAndRegisterAgent","AgentBuilder","setName","setBio","setCapabilities","StandardAIAgentCapability","setType","setModel","setNetwork","setInboundTopicType","StandardInboundTopicType","PUBLIC","setAlias","setCreator","FEE_BASED","setFeeConfig","setExistingProfilePicture","pfpBuffer","pfpFileName","byteLength","setProfilePicture","platform","handle","addSocial","addProperty","hasFees","Boolean","clearNotes","operationalMode","profilePictureData","registrationData","feeConfigBuilder","FeeConfigBuilder","collectorAccountId","addNote","effectiveExemptIds","id","addHbarFee","executeResult","scheduleId","agentMetadata","targetProfile","connectionRequestSent","monitoringEnabled","request","getPendingRequests","getConnectionsNeedingConfirmation","uniqueRequestKey","inboundRequestId","confirmationResult","profileError","newConnection","markConnectionRequestProcessed","feeConfigured","sendHCS10Message","parts","test","accountIdWithPrefix","index","availableIds","c","i","errorMsg","messageResult","reply","monitorResponses","attempts","operator_id","Promise","resolve","setTimeout","startPassiveConnectionMonitoring","endTime","connectionRequestsFound","acceptedConnections","processedRequestIds","connectionRequests","msg","op","has","fee","addTokenFee","pendingRequests","allRequests","requests","toISOString","viewRequest","rejectRequest","originTopicId","rejectedRequest","unapprovedRequests","requestId","fromAccountId","m","req","count","getEnhancedConnections","activeConnections","pendingConnections","output","formatConnection","trim","activeCount","pendingCount","needsConfirmationCount","display_name","substring","toLocaleString","connectionManager","lastProcessedTimestamp","allMessages","messagesToProcess","latestTimestampNanos","isFetchingLatest","slice","reduce","maxTs","outputString","processedMessages","content","displayContent","registrations","formattedRegistrations","reg","registration","profile","outboundTopic","social","keys","notes","HbarPricePlugin","BasePlugin","arguments","version","author","tools","initialize","context","initializeTools","HederaGetHbarPriceTool","config","getTools","HCS2Builder","getHCS2Client","hcs2Client","operatorKey","HCS2Client","createRegistry","registerEntry","updateEntry","deleteEntry","migrateRegistry","getRegistry","submitMessage","payload","getTopicInfo","close","HCS6Builder","getHCS6Client","hcs6Client","HCS6Client","createHashinal","register","InscriberBuilder","getInscriptionSDK","inscribe","clientConfig","inscribeWithSigner","retrieveInscription","inscriptionSDK","schema","_runManager","errorMessage","StandardSDKClient","waitForConnectionConfirmation","maxAttempts","delayMs","agentChannels","getOutboundTopicId","setClient","validateOperator","isValid","initializeWithValidation","validationResult","log","waitMaxAttempts","waitIntervalMs","timeoutPromise","_","reject","race","confirmed","inscription","topic_id","cdnUrl","fileContent","stats","stat","isFile","toFixed","readFile","getMimeType","extname","urlObj","protocol","host","controller","AbortController","timeoutId","abort","headResponse","fetch","method","signal","clearTimeout","ok","statusText","contentType","headers","contentLength","some","getController","getTimeoutId","getResponse","Range","arrayBuffer","bytes","Uint8Array","TextDecoder","fatal","decode","getError","fetchError","registry","latestEntry","t_id","sequence","payer","totalEntries","entry","operation","inscriptionTopicId","inscriptionId","holderId","chunks","createdAt","completedAt","completed","fileUrl","fileSize","newInscriptionTopicId","updateMemo","HEDERA_OPERATOR_ID","HEDERA_OPERATOR_KEY","networkEnv","HEDERA_NETWORK","getInstance","ServerSigner","HederaAgentKit","monitoringHederaKit","monitoringHcs10Builder","monitoringClient","monitoringSigner","registerAgentTool","createAllTools","findRegistrationsTool","retrieveProfileTool","initiateConnectionTool","listConnectionsTool","sendMessageToConnectionTool","checkMessagesTool","connectionMonitorTool","manageConnectionRequestsTool","acceptConnectionRequestTool","listUnapprovedConnectionRequestsTool"],"mappings":"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"}
|