@hashgraphonline/standards-agent-kit 0.2.153 → 0.2.154

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.
@@ -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/types/tx-results.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/utils/inscription-utils.ts","../../src/tools/inscriber/InscribeFromUrlTool.ts","../../src/tools/inscriber/InscribeFromFileTool.ts","../../src/utils/content-resolver.ts","../../src/validation/content-ref-schemas.ts","../../src/config/ContentReferenceConfig.ts","../../src/tools/inscriber/InscribeFromBufferTool.ts","../../src/validation/hip412-schemas.ts","../../src/utils/metadata-defaults.ts","../../src/lib/zod-render/schema-extension.ts","../../src/types/inscription-response.ts","../../src/tools/inscriber/InscribeHashinalTool.ts","../../src/tools/inscriber/RetrieveInscriptionTool.ts","../../src/utils/state-tools.ts","../../src/state/open-convai-state.ts","../../src/signing/signer-provider.ts","../../src/builders/hcs10/hcs10-builder.ts","../../src/plugins/hedera/HbarPricePlugin.ts","../../src/lib/zod-render/config-extractor.ts","../../src/utils/CodedError.ts","../../src/builders/hcs2/hcs2-builder.ts","../../src/builders/hcs6/hcs6-builder.ts","../../src/builders/inscriber/inscriber-builder.ts","../../src/signing/bytes-registry.ts","../../src/hcs10/HCS10Client.ts","../../src/init/init.ts","../../src/interfaces/FormValidatable.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 * Valid input types for parsing tags or capabilities\n */\ntype ParseInput = string | number[] | string[] | AIAgentCapability[];\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\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': [AIAgentCapability.IMAGE_GENERATION],\n 'picture': [AIAgentCapability.IMAGE_GENERATION],\n 'visual': [AIAgentCapability.IMAGE_GENERATION],\n 'photo': [AIAgentCapability.IMAGE_GENERATION],\n\n 'audio': [AIAgentCapability.AUDIO_GENERATION],\n 'sound': [AIAgentCapability.AUDIO_GENERATION],\n 'voice': [AIAgentCapability.AUDIO_GENERATION],\n 'speech': [AIAgentCapability.AUDIO_GENERATION],\n\n 'video': [AIAgentCapability.VIDEO_GENERATION],\n 'movie': [AIAgentCapability.VIDEO_GENERATION],\n 'animation': [AIAgentCapability.VIDEO_GENERATION],\n\n 'code': [AIAgentCapability.CODE_GENERATION],\n 'programming': [AIAgentCapability.CODE_GENERATION],\n 'development': [AIAgentCapability.CODE_GENERATION],\n 'coding': [AIAgentCapability.CODE_GENERATION],\n\n 'translate': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'translation': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'language': [AIAgentCapability.LANGUAGE_TRANSLATION],\n\n 'summarize': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'summary': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extract': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extraction': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n\n 'knowledge': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'search': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'retrieve': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'lookup': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n\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': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'trading': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'finance': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'financial': [AIAgentCapability.MARKET_INTELLIGENCE],\n\n 'analytics': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analysis': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analyze': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'transactions': [AIAgentCapability.TRANSACTION_ANALYTICS],\n\n 'audit': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'smart contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n\n 'governance': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'voting': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'dao': [AIAgentCapability.GOVERNANCE_FACILITATION],\n\n 'security': [AIAgentCapability.SECURITY_MONITORING],\n 'monitoring': [AIAgentCapability.SECURITY_MONITORING],\n 'threat': [AIAgentCapability.SECURITY_MONITORING],\n\n 'compliance': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulatory': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulation': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n\n 'fraud': [AIAgentCapability.FRAUD_DETECTION],\n 'detection': [AIAgentCapability.FRAUD_DETECTION],\n 'anomaly': [AIAgentCapability.FRAUD_DETECTION],\n\n 'coordination': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'multi-agent': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'orchestration': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n\n 'api': [AIAgentCapability.API_INTEGRATION],\n 'integration': [AIAgentCapability.API_INTEGRATION],\n 'webhook': [AIAgentCapability.API_INTEGRATION],\n\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 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 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: ParseInput): AIAgentCapability[] {\n\n if (Array.isArray(input) && input.every(item => typeof item === 'number')) {\n return input;\n }\n\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 (typeof input === 'string') {\n return this.parseCapabilities(input);\n }\n\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\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';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\nconst logger = new Logger({ module: 'SendMessageToConnectionTool' });\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 logger.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 type { TopicRegistrationResponse, RegistryOperationResponse, HCS6TopicRegistrationResponse, HCS6RegistryOperationResponse, HCS6CreateHashinalResponse } from '@hashgraphonline/standards-sdk';\n\nexport interface WalletBytesResponse {\n success: true;\n transactionBytes: string;\n}\n\nexport function isWalletBytesResponse(value: unknown): value is WalletBytesResponse {\n return !!value && typeof (value as any).transactionBytes === 'string';\n}\n\nexport type TopicRegistrationResult = TopicRegistrationResponse | WalletBytesResponse;\nexport type RegistryOperationResult = RegistryOperationResponse | WalletBytesResponse;\nexport type SubmitMessageResult = { success: true; transactionId?: string } | WalletBytesResponse;\n\nexport type HCS6TopicRegistrationResult = HCS6TopicRegistrationResponse | WalletBytesResponse;\nexport type HCS6RegistryOperationResult = HCS6RegistryOperationResponse | WalletBytesResponse;\nexport type HCS6CreateHashinalResult = HCS6CreateHashinalResponse | WalletBytesResponse;\n","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { HCS2RegistryType } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { isWalletBytesResponse, type TopicRegistrationResult } from '../../types/tx-results';\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 an HCS-2 registry (standard HCS-2). Use when the user asks to create an HCS-2 registry, not a generic HCS topic. Builds a standards-compliant registry topic and returns the result or transaction bytes.'\n\n get specificInputSchema(): typeof createRegistrySchema {\n return createRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof createRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const normalizeKey = (val?: string | boolean): string | boolean | undefined => {\n if (typeof val === 'string') {\n const lc = val.trim().toLowerCase();\n if (lc === 'true') return true;\n if (lc === 'false') return false;\n return val; // assume public key string\n }\n return val;\n };\n\n try {\n const result: TopicRegistrationResult = await this.hcs2Builder.createRegistry({\n registryType: params.registryType,\n ttl: params.ttl,\n adminKey: normalizeKey(params.adminKey),\n submitKey: normalizeKey(params.submitKey),\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to create registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to create your HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Create HCS-2 registry (${params.registryType === 1 ? 'Non-Indexed' : 'Indexed'}; TTL: ${params.ttl || 86400}s)`,\n },\n };\n }\n\n const topicId = (result as any)?.topicId || 'unknown';\n return `Successfully created HCS-2 registry!\\n\\nTopic ID: ${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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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 an entry in an HCS-2 registry (standard HCS-2). Use this to add a target topic to an existing HCS-2 registry.'\n\n get specificInputSchema(): typeof registerEntrySchema {\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to register entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to register the entry in the HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Register HCS-2 entry (registry ${params.registryTopicId} -> target ${params.targetTopicId})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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(): typeof updateEntrySchema {\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to update entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to update the HCS-2 registry entry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Update HCS-2 entry (registry ${params.registryTopicId}, uid ${params.uid} -> ${params.targetTopicId})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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(): typeof deleteEntrySchema {\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: RegistryOperationResult = await this.hcs2Builder.deleteEntry(\n params.registryTopicId,\n {\n uid: params.uid,\n memo: params.memo,\n }\n );\n\n if (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to delete entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to delete the HCS-2 registry entry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Delete HCS-2 entry (registry ${params.registryTopicId}, uid ${params.uid})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to migrate registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to migrate the HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Migrate HCS-2 registry (from ${params.registryTopicId} to ${params.targetTopicId})`,\n },\n };\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 (standard HCS-2). Retrieves indexed or latest entries and returns a structured summary.'\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 const typeVal = (registry as unknown as { registryType: unknown }).registryType;\n const isIndexed =\n typeVal === 0 ||\n typeVal === '0' ||\n String(typeVal).toLowerCase() === 'indexed' ||\n String(typeVal).toLowerCase() === 'index' ||\n String(typeVal).toLowerCase() === 'index_topic' ||\n String(typeVal).toLowerCase() === 'indexed_registry';\n\n return {\n topicId: registry.topicId,\n registryType: isIndexed ? '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 { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for creating a dynamic hashinal registry\n */\nconst CreateDynamicRegistrySchema = z.object({\n ttl: z\n .number()\n .min(3600)\n .default(86400)\n .describe('Time-to-live in seconds (minimum 3600 seconds/1 hour)'),\n submitKey: z\n .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 BaseHCS6QueryTool<typeof CreateDynamicRegistrySchema> {\n name = 'createDynamicRegistry';\n description = 'Create a new HCS-6 dynamic registry for managing evolving content';\n\n get specificInputSchema(): typeof CreateDynamicRegistrySchema {\n return CreateDynamicRegistrySchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: CreateDynamicRegistryInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const result = await this.hcs6Builder.createRegistry({\n ttl: params.ttl,\n submitKey: params.submitKey,\n });\n\n if (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to create dynamic registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to create your HCS-6 dynamic registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Create HCS-6 dynamic registry (TTL: ${params.ttl}s)`,\n },\n };\n }\n\n return `Successfully created HCS-6 dynamic registry!\\n\\nTopic ID: ${(result as any).topicId}\\nTTL: ${params.ttl} seconds\\n\\nYou can now register dynamic hashinals to this registry using the topic ID.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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 BaseHCS6QueryTool<typeof RegisterDynamicHashinalSchema> {\n name = 'registerDynamicHashinal';\n description = 'Create and register a new dynamic hashinal that can be updated over time';\n\n get specificInputSchema() {\n return RegisterDynamicHashinalSchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: RegisterDynamicHashinalInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\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 (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to register dynamic hashinal');\n }\n\n if (isWalletBytesResponse(result as any)) {\n const txBytes = (result as any).transactionBytes as string;\n return {\n message: 'I prepared an unsigned transaction to register a dynamic hashinal. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Register dynamic hashinal${params.memo ? ` (Memo: ${params.memo})` : ''}`,\n },\n };\n }\n\n return `Successfully registered dynamic hashinal!\\n\\nRegistry Topic ID: ${(result as any).registryTopicId}\\nInscription Topic ID: ${(result as any).inscriptionTopicId}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe dynamic hashinal has been created and can be updated using the registry topic ID.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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 BaseHCS6QueryTool<typeof UpdateDynamicHashinalSchema> {\n name = 'updateDynamicHashinal';\n description = 'Update an existing dynamic hashinal with new content while maintaining the same registry';\n\n get specificInputSchema() {\n return UpdateDynamicHashinalSchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: UpdateDynamicHashinalInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n\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 (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to update dynamic hashinal');\n }\n\n if (isWalletBytesResponse(result as any)) {\n const txBytes = (result as any).transactionBytes as string;\n return {\n message: 'I prepared an unsigned transaction to update a dynamic hashinal. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Update dynamic hashinal (registry ${params.registryTopicId})${params.memo ? ` (Memo: ${params.memo})` : ''}`,\n },\n };\n }\n\n return `Successfully updated dynamic hashinal!\\n\\nRegistry Topic ID: ${params.registryTopicId}\\nInscription Topic ID: ${(result as any).inscriptionTopicId}${params.memo ? `\\nUpdate Memo: ${params.memo}` : ''}\\n\\nThe dynamic hashinal has been updated with new content.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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\n get specificInputSchema() {\n return QueryDynamicRegistrySchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: QueryDynamicRegistryInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const registry = await this.hcs6Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n const 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\n return `Successfully queried dynamic registry!\\n\\nRegistry Topic: ${registry.topicId}\\nRegistry Type: NON_INDEXED\\nTTL: ${registry.ttl} seconds\\nTotal Entries: ${registry.entries.length}${latestEntry ? `\\n\\nLatest Entry:\\n- Topic ID: ${latestEntry.topicId}\\n- Timestamp: ${latestEntry.timestamp}\\n- Memo: ${latestEntry.memo || 'N/A'}\\n- Sequence: ${latestEntry.sequence}` : '\\n\\nNo entries found in registry.'}`;\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 type { ContentResolverInterface } from '../../types/content-resolver';\nimport {\n InscriptionInput,\n InscriptionOptions,\n QuoteResult,\n} from '@hashgraphonline/standards-sdk';\nimport { z } from 'zod';\n\n/**\n * Event emitted when an entity is created during inscription\n */\nexport interface EntityCreationEvent {\n entityId: string;\n entityName: string;\n entityType: string;\n transactionId?: string;\n}\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 protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberTransactionToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\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 protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberQueryToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\n }\n}","import { RetrievedInscriptionResult } from '@kiloscribe/inscription-sdk';\n\nexport type NetworkType = 'mainnet' | 'testnet';\n\nexport interface TopicIds {\n jsonTopicId?: string;\n topicId?: string;\n}\n\nfunction getStringProp(obj: unknown, key: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const val = (obj as Record<string, unknown>)[key];\n return typeof val === 'string' && val.trim() ? val : undefined;\n}\n\n/**\n * Extract topic ids from an inscription and/or result object without using any.\n * - Prefers jsonTopicId when present (for CDN linking)\n * - Collects topic_id/topicId from either inscription or result\n */\nexport function extractTopicIds(\n inscription: RetrievedInscriptionResult,\n result?: unknown\n): TopicIds {\n const jsonTopicId =\n inscription.jsonTopicId || getStringProp(inscription, 'json_topic_id');\n\n const imageTopicId =\n getStringProp(inscription, 'topic_id') ||\n getStringProp(inscription, 'topicId') ||\n getStringProp(result, 'topicId') ||\n getStringProp(result, 'topic_id');\n\n return {\n jsonTopicId: jsonTopicId,\n topicId: imageTopicId,\n };\n}\n\n/**\n * Build HRL/CDN URLs from extracted topic ids.\n * - HRL prefers jsonTopicId, falls back to topicId\n * - CDN URL only provided when jsonTopicId is present\n */\nexport function buildInscriptionLinks(\n ids: TopicIds,\n network: NetworkType,\n fileStandard: string = '1'\n): { hrl?: string; cdnUrl?: string; topicId?: string } {\n const chosen = ids.jsonTopicId || ids.topicId;\n const hrl = chosen ? `hcs://${fileStandard}/${chosen}` : undefined;\n const cdnUrl = ids.jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${ids.jsonTopicId}?network=${network}`\n : undefined;\n return { hrl, cdnUrl, topicId: chosen };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions, Logger, InscriptionResponse } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { extractTopicIds, buildInscriptionLinks } from '../../utils/inscription-utils';\n\nconst logger = new Logger({ module: 'InscribeFromUrlTool' });\n\n/**\n * Schema for inscribing from URL\n */\nconst inscribeFromUrlSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'ONLY direct file download URLs with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or when you already have content to inscribe.'\n ),\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(\n 'Timeout in milliseconds for inscription (default: no timeout - waits until completion)'\n ),\n apiKey: z.string().optional().describe('API key for inscription service'),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\n});\n\n/**\n * Tool for inscribing content from URL\n */\nexport class InscribeFromUrlTool extends BaseInscriberQueryTool<\n typeof inscribeFromUrlSchema\n> {\n name = 'inscribeFromUrl';\n description =\n 'ONLY for direct FILE DOWNLOAD URLs ending with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or ANY HTML content - it WILL FAIL. If you have already retrieved content from any source (including MCP tools), you MUST use inscribeFromBuffer instead. This tool downloads files from URLs - it does NOT inscribe content you already have. When asked to \"inscribe it\" after retrieving content, ALWAYS use inscribeFromBuffer with the actual content. Set quoteOnly=true to get cost estimates without executing the inscription.';\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 logger.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(\n 'Invalid URL format. Please provide a complete URL with protocol (http/https).'\n );\n }\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n throw new Error(\n 'Only HTTP and HTTPS URLs are supported for inscription.'\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('Cannot inscribe content from')\n ) {\n throw error;\n }\n throw new Error(\n `Invalid URL: ${params.url}. Please provide a valid URL.`\n );\n }\n\n logger.info('Validating URL content before inscription...');\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\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(\n `URL returned error status ${headResponse.status}: ${headResponse.statusText}. Cannot inscribe content from inaccessible URLs.`\n );\n }\n\n const contentType = headResponse.headers.get('content-type') || '';\n const contentLength = headResponse.headers.get('content-length');\n\n const webPageContentTypes = [\n 'text/html',\n 'application/xhtml+xml',\n 'text/xml',\n ];\n\n if (\n webPageContentTypes.some((type) =>\n contentType.toLowerCase().includes(type)\n )\n ) {\n throw new Error(\n `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\n if (contentLength && parseInt(contentLength) === 0) {\n throw new Error(\n 'URL returns empty content (Content-Length: 0). Cannot inscribe empty content.'\n );\n }\n\n if (contentLength && parseInt(contentLength) < 10) {\n throw new Error(\n `URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`\n );\n }\n\n if (!contentType || contentType === 'application/octet-stream') {\n logger.info('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) {\n\n const buffer = await getResponse.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n const text = new TextDecoder('utf-8', { fatal: false }).decode(\n bytes.slice(0, 512)\n );\n\n if (\n text.toLowerCase().includes('<!doctype html') ||\n text.toLowerCase().includes('<html') ||\n text.match(/<meta\\s+[^>]*>/i) ||\n text.match(/<title>/i)\n ) {\n throw new Error(\n `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 }\n } catch (getError) {\n clearTimeout(getTimeoutId);\n if (\n getError instanceof Error &&\n getError.message.includes('HTML content')\n ) {\n throw getError;\n }\n logger.warn(\n `Could not perform partial GET validation: ${\n getError instanceof Error ? getError.message : 'Unknown error'\n }`\n );\n }\n }\n\n logger.info(\n `URL validation passed. Content-Type: ${contentType}, Content-Length: ${\n contentLength || 'unknown'\n }`\n );\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n logger.warn(\n 'URL validation timed out after 10 seconds. Proceeding with inscription attempt.'\n );\n } else if (\n error.message.includes('URL returned error') ||\n error.message.includes('empty content') ||\n error.message.includes('too small') ||\n error.message.includes('HTML')\n ) {\n throw error;\n } else {\n logger.warn(\n `Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`\n );\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.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n { type: 'url', url: params.url },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n url: params.url,\n },\n message: `Estimated Quote for URL: ${params.url}\\nTotal cost: ${quote.totalCostHbar} HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n );\n }\n\n const typed = result as InscriptionResponse;\n\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n '1'\n );\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else if (!typed.quote && !typed.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`;\n } else {\n return 'Inscription operation completed.';\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to inscribe from URL';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions, InscriptionResponse } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { extractTopicIds, buildInscriptionLinks } from '../../utils/inscription-utils';\n\n/**\n * Schema for inscribing from file\n */\nconst inscribeFromFileSchema = z.object({\n filePath: z\n .string()\n .min(1, 'File path cannot be empty')\n .describe(\n 'The file path of the content to inscribe. Must point to a valid, non-empty file.'\n ),\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 quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\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. Set quoteOnly=true to get cost estimates without executing the inscription.';\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 let fileContent: Buffer;\n try {\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 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 this.logger?.warn(\n `Large file detected (${(\n stats.size /\n (1024 * 1024)\n ).toFixed(2)} MB)`\n );\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(\n 'utf8',\n 0,\n Math.min(fileContent.length, 1000)\n );\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.quoteOnly\n ? false\n : 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 quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n fileName,\n mimeType,\n sizeBytes: fileContent.length,\n filePath: params.filePath,\n },\n message: `Estimated Quote for file: ${fileName} (${(\n fileContent.length / 1024\n ).toFixed(2)} KB)\\nTotal cost: ${\n quote.totalCostHbar\n } HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\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 const inscriptionResult = result as InscriptionResponse;\n if (inscriptionResult.confirmed && !inscriptionResult.quote) {\n const ids = extractTopicIds(inscriptionResult.inscription, inscriptionResult.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (inscriptionResult.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else if (!inscriptionResult.quote && !inscriptionResult.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${(inscriptionResult.result as { transactionId?: string })?.transactionId ?? 'unknown'}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n } else {\n return 'Inscription operation completed.';\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 { ContentResolverRegistry } from '@hashgraphonline/standards-sdk';\n\nexport interface ContentResolutionResult {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n}\n\n/**\n * Resolves content from various input formats (content-ref, base64, plain text)\n */\nexport async function resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): Promise<ContentResolutionResult> {\n const trimmedInput = input.trim();\n\n const resolver = ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return handleDirectContent(trimmedInput, providedMimeType, providedFileName);\n}\n\n/**\n * Handles direct content (base64 or plain text)\n */\nfunction handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): ContentResolutionResult {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n}\n","import { z } from 'zod';\n\n/**\n * Validates content reference format\n */\nexport const contentRefSchema = z\n .string()\n .regex(/^content-ref:[a-zA-Z0-9_-]+$/, 'Content reference must be in format \"content-ref:[alphanumeric-id]\"')\n .describe('Content reference in format \"content-ref:[id]\"');\n\n/**\n * Validates content reference or returns error for dumber models\n */\nexport function validateContentRef(input: string): string {\n try {\n return contentRefSchema.parse(input);\n } catch (error) {\n throw new Error(`Invalid content reference format. Expected \"content-ref:[alphanumeric-id]\" but got \"${input}\"`);\n }\n}","export interface ContentReferenceConfig {\n maxInscriptionSize: number;\n minContentSize: number;\n logLevel: 'debug' | 'info' | 'warn' | 'error';\n enableContentValidation: boolean;\n}\n\nexport const DEFAULT_CONFIG: ContentReferenceConfig = {\n maxInscriptionSize: 50 * 1024, // 50KB\n minContentSize: 10,\n logLevel: 'warn',\n enableContentValidation: true,\n};\n\nexport function loadConfig(): ContentReferenceConfig {\n return {\n maxInscriptionSize: parseInt(\n process.env.REF_MAX_SIZE || DEFAULT_CONFIG.maxInscriptionSize.toString(),\n 10\n ),\n minContentSize: parseInt(\n process.env.REF_MIN_SIZE || DEFAULT_CONFIG.minContentSize.toString(),\n 10\n ),\n logLevel:\n (process.env.REF_LOG_LEVEL as ContentReferenceConfig['logLevel']) ||\n DEFAULT_CONFIG.logLevel,\n enableContentValidation: process.env.REF_ENABLE_VALIDATION !== 'false',\n };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionResponse,\n InscriptionResult,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { resolveContent } from '../../utils/content-resolver';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { loadConfig } from '../../config/ContentReferenceConfig';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\n\nconst inscribeFromBufferSchema = z.object({\n base64Data: z\n .union([z.string(), contentRefSchema])\n .describe(\n 'Content to inscribe as base64 data, plain text, or content reference'\n ),\n fileName: z.string().min(1).describe('Name for the inscribed content'),\n mimeType: z.string().optional().describe('MIME type of the content'),\n metadata: z.record(z.unknown()).optional().describe('Metadata to attach'),\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('Wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds'),\n apiKey: z.string().optional().describe('API key for inscription service'),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe('Return cost quote only'),\n});\n\nexport class InscribeFromBufferTool extends BaseInscriberQueryTool<\n typeof inscribeFromBufferSchema\n> {\n name = 'inscribeFromBuffer';\n description =\n 'Use ONLY for inscribing regular files or content (NOT for NFT/Hashinal inscriptions). When user says \"inscribe it\" after you showed search results or other content WITHOUT mentioning NFT/hashinal, use THIS tool. The base64Data field accepts PLAIN TEXT (not just base64) and content reference IDs in format \"content-ref:[id]\". Pass the EXACT content from your previous response or MCP tool output. DO NOT generate new content or create repetitive text. Content references are automatically resolved to the original content for inscription. Set quoteOnly=true to get cost estimates without executing the inscription. NEVER use this for Hashinal NFTs - always use InscribeHashinalTool instead when user mentions hashinal, NFT, dynamic, or minting.';\n\n private config = loadConfig();\n\n get specificInputSchema() {\n return inscribeFromBufferSchema;\n }\n\n protected override async _call(\n args: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n try {\n const input = typeof args.base64Data === 'string' ? args.base64Data : '';\n const buffer = /^[A-Za-z0-9+/]*={0,2}$/.test(input)\n ? Buffer.from(input, 'base64')\n : Buffer.from(input, 'utf8');\n\n const fileName = args.fileName;\n const mimeType = args.mimeType;\n\n const network = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const options: InscriptionOptions = {\n mode: 'file',\n metadata: args.metadata,\n tags: args.tags,\n chunkSize: args.chunkSize,\n waitForConfirmation: args.quoteOnly ? false : args.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: args.apiKey,\n network,\n quoteOnly: args.quoteOnly,\n };\n\n const result = await this.inscriberBuilder.inscribe(\n { type: 'buffer', buffer, fileName, mimeType },\n options\n );\n\n const typed = result as InscriptionResponse;\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return JSON.stringify({\n success: true,\n data: `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`,\n });\n }\n\n return JSON.stringify({\n success: true,\n data: `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ success: false, error: `Inscription failed: ${errorMessage}` });\n }\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n\n const resolvedContent = await resolveContent(\n params.base64Data,\n params.mimeType,\n params.fileName\n );\n this.logger?.debug(\n `[InscribeFromBufferTool] Resolved content bytes: ${\n resolvedContent.buffer?.length ?? -1\n }`\n );\n\n try {\n this.validateContent(resolvedContent.buffer);\n } catch (validationError) {\n this.logger?.warn(\n `Content validation warning: ${\n validationError instanceof Error\n ? validationError.message\n : String(validationError)\n }`\n );\n }\n\n const buffer = resolvedContent.buffer;\n const resolvedMimeType = resolvedContent.mimeType || params.mimeType;\n const resolvedFileName = resolvedContent.fileName || params.fileName;\n\n const options: InscriptionOptions = {\n mode: 'file',\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n {\n type: 'buffer',\n buffer,\n fileName: resolvedFileName,\n mimeType: resolvedMimeType,\n },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n fileName: resolvedFileName,\n mimeType: resolvedMimeType,\n sizeBytes: buffer.length,\n },\n message: `Estimated Quote for buffer content: ${resolvedFileName} (${(\n buffer.length / 1024\n ).toFixed(2)} KB)\\nTotal cost: ${quote.totalCostHbar} HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n this.logger?.debug(\n `[InscribeFromBufferTool] Calling inscribe with fileName: ${resolvedFileName}, mime: ${resolvedMimeType}`\n );\n const result = await this.executeInscription(\n buffer,\n resolvedFileName,\n resolvedMimeType,\n options,\n params.timeoutMs\n );\n this.logger?.debug(\n `[InscribeFromBufferTool] Inscribe result (confirmed): ${Boolean((result as any)?.confirmed)}`\n );\n return this.formatInscriptionResult(result, options);\n } catch (error) {\n this.logger?.warn(\n `[InscribeFromBufferTool] Error during inscription: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe from buffer';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n private validateInput(\n params: z.infer<typeof inscribeFromBufferSchema>\n ): void {\n if (!params.base64Data || params.base64Data.trim() === '') {\n throw new Error(\n 'No data provided. Cannot inscribe empty content. Please provide valid content, plain text, base64 encoded data, or a content reference ID.'\n );\n }\n\n if (!params.fileName || params.fileName.trim() === '') {\n throw new Error(\n 'No fileName provided. A valid fileName is required for inscription.'\n );\n }\n }\n\n private validateContent(buffer: Buffer): void {\n if (buffer.length === 0) {\n throw new Error(\n 'Buffer is empty after conversion. The provided data appears to be invalid or empty.'\n );\n }\n\n if (buffer.length > this.config.maxInscriptionSize) {\n const maxSizeKB = Math.round(this.config.maxInscriptionSize / 1024);\n const bufferSizeKB = Math.round(buffer.length / 1024);\n throw new Error(\n `Content is too large for inscription (${bufferSizeKB}KB, max ${maxSizeKB}KB). Please summarize or extract key information before inscribing.`\n );\n }\n\n if (buffer.length < this.config.minContentSize) {\n throw new Error(\n `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\n if (\n buffer.toString('utf8', 0, Math.min(buffer.length, 100)).trim() === ''\n ) {\n throw new Error(\n 'Buffer contains only whitespace or empty content. Cannot inscribe meaningless data.'\n );\n }\n\n const contentStr = buffer.toString('utf8');\n const emptyHtmlPattern = /<a\\s+href=[\"'][^\"']+[\"']\\s*>\\s*<\\/a>/i;\n const hasOnlyEmptyLinks =\n emptyHtmlPattern.test(contentStr) &&\n contentStr.replace(/<[^>]+>/g, '').trim().length < 50;\n\n if (hasOnlyEmptyLinks) {\n throw new Error(\n 'Buffer contains empty HTML with only links and no actual content. When inscribing content from external sources, use the actual article text you retrieved, not empty HTML with links.'\n );\n }\n }\n\n private async executeInscription(\n buffer: Buffer,\n fileName: string,\n mimeType: string | undefined,\n options: InscriptionOptions,\n timeoutMs?: number\n ): Promise<Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>> {\n const inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName,\n mimeType,\n };\n\n if (timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${timeoutMs}ms`)),\n timeoutMs\n );\n });\n\n return Promise.race([\n this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n }\n\n return this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n private formatInscriptionResult(\n result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>,\n options: InscriptionOptions\n ): string {\n const typed = result as InscriptionResponse;\n\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n }\n\n if (!typed.quote && !typed.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n\n return 'Inscription operation completed.';\n }\n}\n","import { z } from 'zod';\n\n/**\n * HIP-412 file schema for multi-file NFTs\n */\nexport const hip412FileSchema = z.object({\n uri: z.string().describe('URI of the file'),\n checksum: z.string().optional().describe('SHA-256 checksum of the file'),\n is_default_file: z.boolean().optional().describe('Whether this is the default file'),\n type: z.string().describe('MIME type of the file'),\n});\n\n/**\n * HIP-412 attribute schema for NFT traits\n */\nexport const hip412AttributeSchema = z.object({\n trait_type: z.string().describe('The trait type'),\n value: z.union([z.string(), z.number()]).describe('The trait value'),\n display_type: z.string().optional().describe('Display type for the attribute'),\n});\n\n/**\n * HIP-412 compliant metadata schema for Hedera NFTs\n */\nexport const hip412MetadataSchema = z.object({\n name: z.string().describe('Token name (required by HIP-412)'),\n description: z.string().describe('Human readable description (required by HIP-412)'),\n image: z.string().describe('Preview image URI (required by HIP-412)'),\n type: z.string().describe('MIME type (required by HIP-412)'),\n creator: z.string().optional().describe('Creator name or comma-separated names'),\n creatorDID: z.string().optional().describe('Decentralized identifier for creator'),\n checksum: z.string().optional().describe('SHA-256 checksum of the image'),\n format: z.string().optional().default('HIP412@2.0.0').describe('Metadata format version'),\n files: z.array(hip412FileSchema).optional().describe('Array of files for multi-file NFTs'),\n attributes: z.array(hip412AttributeSchema).optional().describe('NFT attributes/traits'),\n properties: z.record(z.unknown()).optional().describe('Additional properties'),\n});\n\n/**\n * Validates metadata against HIP-412 standard\n */\nexport function validateHIP412Metadata(metadata: unknown): z.infer<typeof hip412MetadataSchema> {\n try {\n return hip412MetadataSchema.parse(metadata);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');\n throw new Error(`HIP-412 metadata validation failed: ${issues}`);\n }\n throw error;\n }\n}","/**\n * Generates default metadata for NFT inscription\n */\nexport function generateDefaultMetadata(params: {\n name?: string;\n creator?: string;\n description?: string;\n type?: string;\n fileName?: string;\n mimeType?: string;\n operatorAccount: string;\n}): {\n name: string;\n creator: string;\n description: string;\n type: string;\n image: string;\n} {\n const defaultName = params.fileName?.replace(/\\.[^/.]+$/, '') || 'Hashinal NFT';\n let defaultType = 'media';\n if (params.mimeType?.startsWith('image/')) {\n defaultType = 'image';\n } else if (params.mimeType?.startsWith('video/')) {\n defaultType = 'video';\n } else if (params.mimeType?.startsWith('audio/')) {\n defaultType = 'audio';\n }\n\n return {\n name: params.name || defaultName,\n creator: params.creator || params.operatorAccount,\n description: params.description || `${defaultType.charAt(0).toUpperCase() + defaultType.slice(1)} NFT inscribed as Hashinal`,\n type: params.type || defaultType,\n image: '',\n };\n}","import { ZodType } from 'zod';\nimport { RenderConfigSchema, EnhancedRenderConfig, ZodSchemaWithRender, FormFieldType, FieldMetadata, SelectOption } from './types';\n\ninterface ExtendedZodSchema {\n description?: string;\n merge?: (other: ZodType<unknown>) => ZodType<unknown>;\n extend?: (extensions: Record<string, ZodType<unknown>>) => ZodType<unknown>;\n pick?: (fields: Record<string, boolean>) => ZodType<unknown>;\n omit?: (fields: Record<string, boolean>) => ZodType<unknown>;\n withRender?: (config: EnhancedRenderConfig | RenderConfigSchema) => ZodSchemaWithRender<unknown>;\n withProgressive?: (priority: 'essential' | 'common' | 'advanced' | 'expert', group?: string) => ZodSchemaWithRender<unknown>;\n withBlock?: (blockId: string) => ZodSchemaWithRender<unknown>;\n}\n\n/**\n * Extends a Zod schema with render configuration capabilities\n */\nexport function extendZodSchema<TSchema>(schema: ZodType<TSchema>): ZodSchemaWithRender<TSchema> {\n const extendedSchema = schema as ZodSchemaWithRender<TSchema>;\n\n extendedSchema.withRender = function(config: EnhancedRenderConfig | RenderConfigSchema): ZodSchemaWithRender<TSchema> {\n const newSchema = Object.create(this);\n const currentConfig = this._renderConfig || {} as EnhancedRenderConfig;\n\n const mergedConfig: EnhancedRenderConfig = {\n ...currentConfig,\n ...config,\n ui: {\n ...(currentConfig.ui || {}),\n ...(config.ui || {})\n }\n };\n\n if (currentConfig.progressive || (config as EnhancedRenderConfig).progressive) {\n mergedConfig.progressive = {\n ...(currentConfig.progressive || {} as NonNullable<EnhancedRenderConfig['progressive']>),\n ...((config as EnhancedRenderConfig).progressive || {} as NonNullable<EnhancedRenderConfig['progressive']>)\n };\n }\n\n if (currentConfig.block || (config as EnhancedRenderConfig).block) {\n mergedConfig.block = {\n ...(currentConfig.block || {} as NonNullable<EnhancedRenderConfig['block']>),\n ...((config as EnhancedRenderConfig).block || {} as NonNullable<EnhancedRenderConfig['block']>)\n };\n }\n\n (newSchema as ZodSchemaWithRender<TSchema>)._renderConfig = mergedConfig;\n (newSchema as ZodSchemaWithRender<TSchema>).withRender = extendedSchema.withRender;\n (newSchema as ZodSchemaWithRender<TSchema>).withProgressive = extendedSchema.withProgressive;\n (newSchema as ZodSchemaWithRender<TSchema>).withBlock = extendedSchema.withBlock;\n return newSchema as ZodSchemaWithRender<TSchema>;\n };\n\n extendedSchema.withProgressive = function(\n priority: 'essential' | 'common' | 'advanced' | 'expert',\n group?: string\n ): ZodSchemaWithRender<TSchema> {\n const currentConfig = this._renderConfig || { fieldType: inferFieldTypeFromSchema(schema) };\n return this.withRender({\n ...currentConfig,\n progressive: {\n priority,\n group\n }\n });\n };\n\n extendedSchema.withBlock = function(blockId: string): ZodSchemaWithRender<TSchema> {\n const currentConfig = this._renderConfig || { fieldType: inferFieldTypeFromSchema(schema) };\n return this.withRender({\n ...currentConfig,\n block: {\n id: blockId,\n type: 'field',\n reusable: true\n }\n });\n };\n\n return extendedSchema;\n}\n\n/**\n * Checks if a schema has render configuration\n */\nexport function hasRenderConfig(schema: unknown): schema is ZodSchemaWithRender {\n return Boolean(schema && typeof (schema as Record<string, unknown>).withRender === 'function');\n}\n\n/**\n * Extracts render configuration from a schema\n */\nexport function getRenderConfig(schema: ZodType<unknown>): EnhancedRenderConfig | undefined {\n if (hasRenderConfig(schema)) {\n return schema._renderConfig;\n }\n return undefined;\n}\n\n/**\n * Infers form field type from Zod schema type with enhanced field detection\n */\nexport function inferFieldTypeFromSchema(schema: ZodType<unknown>): FormFieldType {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n\n switch (typeName) {\n case 'ZodString': {\n const stringChecks = ((schema._def as Record<string, unknown>)?.checks as Array<Record<string, unknown>>) || [];\n for (const check of stringChecks) {\n if (check.kind === 'email') {return 'text';}\n if (check.kind === 'url') {return 'text';}\n }\n return 'text';\n }\n\n case 'ZodNumber':\n case 'ZodBigInt':\n return 'number';\n\n case 'ZodBoolean':\n return 'checkbox';\n\n case 'ZodEnum':\n case 'ZodNativeEnum':\n return 'select';\n\n case 'ZodArray':\n return 'array';\n\n case 'ZodUnion':\n case 'ZodDiscriminatedUnion':\n return 'select';\n\n case 'ZodDate':\n return 'text';\n\n case 'ZodObject':\n return 'object';\n\n case 'ZodOptional':\n case 'ZodDefault': {\n const innerType = (schema._def as Record<string, unknown>)?.innerType as ZodType<unknown>;\n if (innerType) {\n return inferFieldTypeFromSchema(innerType);\n }\n return 'text';\n }\n\n default:\n return 'text';\n }\n}\n\n/**\n * Extracts options from enum, union, or literal schemas\n */\nexport function extractOptionsFromSchema(schema: ZodType<unknown>): SelectOption[] | undefined {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n\n if (typeName === 'ZodEnum') {\n const values = (schema._def as Record<string, unknown>)?.values;\n if (Array.isArray(values)) {\n return values.map((value: string) => ({\n value,\n label: value.charAt(0).toUpperCase() + value.slice(1).replace(/[_-]/g, ' '),\n }));\n }\n }\n\n if (typeName === 'ZodNativeEnum') {\n const enumObject = (schema._def as Record<string, unknown>)?.values as Record<string, unknown>;\n if (enumObject) {\n return Object.entries(enumObject).map(([key, value]) => ({\n value,\n label: key.replace(/[_-]/g, ' '),\n }));\n }\n }\n\n if (typeName === 'ZodUnion') {\n const options: SelectOption[] = [];\n const unionOptions = (schema._def as Record<string, unknown>)?.options as Array<ZodType<unknown>>;\n\n if (Array.isArray(unionOptions)) {\n for (const option of unionOptions) {\n if ((option._def as Record<string, unknown>)?.typeName === 'ZodLiteral') {\n const value = (option._def as Record<string, unknown>)?.value;\n if (value !== undefined) {\n options.push({\n value,\n label: typeof value === 'string'\n ? value.charAt(0).toUpperCase() + value.slice(1)\n : String(value),\n });\n }\n }\n }\n }\n\n return options.length > 0 ? options : undefined;\n }\n\n return undefined;\n}\n\n/**\n * Checks if a schema is optional\n */\nexport function isOptionalSchema(schema: ZodType<unknown>): boolean {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n\n/**\n * Gets the inner schema from optional/default wrappers\n */\nexport function getInnerSchema(schema: ZodType<unknown>): ZodType<unknown> {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n const innerType = (schema._def as Record<string, unknown>)?.innerType as ZodType<unknown>;\n return innerType || schema;\n }\n return schema;\n}\n\n/**\n * Extracts validation constraints from a schema with enhanced support\n */\nexport function extractValidationConstraints(schema: ZodType<unknown>): Record<string, unknown> {\n const innerSchema = getInnerSchema(schema);\n const typeName = (innerSchema._def as Record<string, unknown>)?.typeName;\n const constraints: Record<string, unknown> = {};\n\n if (typeName === 'ZodString') {\n const def = innerSchema._def as Record<string, unknown>;\n const checks = def.checks as Array<Record<string, unknown>>;\n if (checks && Array.isArray(checks)) {\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n constraints.minLength = check.value;\n break;\n case 'max':\n constraints.maxLength = check.value;\n break;\n case 'email':\n constraints.type = 'email';\n break;\n case 'url':\n constraints.type = 'url';\n break;\n case 'regex':\n constraints.pattern = check.regex as string;\n break;\n }\n }\n }\n }\n\n if (typeName === 'ZodNumber') {\n const def = innerSchema._def as Record<string, unknown>;\n const checks = def.checks as Array<Record<string, unknown>>;\n if (checks && Array.isArray(checks)) {\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n constraints.min = check.value;\n break;\n case 'max':\n constraints.max = check.value;\n break;\n case 'int':\n constraints.step = 1;\n break;\n case 'multipleOf':\n constraints.step = check.value;\n break;\n }\n }\n }\n }\n\n if (typeName === 'ZodArray') {\n const def = innerSchema._def as Record<string, unknown>;\n const minLength = def.minLength as Record<string, unknown> | undefined;\n const maxLength = def.maxLength as Record<string, unknown> | undefined;\n if (minLength !== undefined) {\n constraints.minItems = minLength.value;\n }\n if (maxLength !== undefined) {\n constraints.maxItems = maxLength.value;\n }\n }\n\n return constraints;\n}\n\n/**\n * Gets default value from schema with comprehensive type support\n */\nexport function getDefaultValue(schema: ZodType<unknown>): unknown {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodDefault') {\n const defaultValue = (schema._def as Record<string, unknown>)?.defaultValue;\n if (typeof defaultValue === 'function') {\n return (defaultValue as () => unknown)();\n }\n return defaultValue;\n }\n\n const innerSchema = getInnerSchema(schema);\n const innerTypeName = (innerSchema._def as Record<string, unknown>)?.typeName;\n\n switch (innerTypeName) {\n case 'ZodString':\n return '';\n case 'ZodNumber':\n case 'ZodBigInt':\n return 0;\n case 'ZodBoolean':\n return false;\n case 'ZodArray':\n return [];\n case 'ZodObject': {\n const shape = (innerSchema._def as Record<string, unknown>)?.shape as Record<string, ZodType<unknown>>;\n if (shape) {\n const defaultObj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n defaultObj[key] = getDefaultValue(value);\n }\n return defaultObj;\n }\n return {};\n }\n case 'ZodDate':\n return new Date();\n case 'ZodEnum': {\n const values = (innerSchema._def as Record<string, unknown>)?.values as unknown[];\n return Array.isArray(values) && values.length > 0 ? values[0] : undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Extracts field metadata from schema including render configuration\n */\nexport function extractFieldMetadata(schema: ZodType<unknown>): FieldMetadata {\n const innerSchema = getInnerSchema(schema);\n const fieldType = inferFieldTypeFromSchema(schema);\n const required = !isOptionalSchema(schema);\n const optional = isOptionalSchema(schema);\n const defaultValue = getDefaultValue(schema);\n const options = extractOptionsFromSchema(innerSchema);\n const constraints = extractValidationConstraints(schema);\n const description = (schema as ZodType<unknown> & ExtendedZodSchema)?.description;\n\n return {\n type: fieldType,\n required,\n optional,\n default: defaultValue,\n options,\n constraints,\n description,\n validation: {\n minLength: constraints.minLength as number,\n maxLength: constraints.maxLength as number,\n min: constraints.min as number,\n max: constraints.max as number,\n pattern: constraints.pattern ? new RegExp(constraints.pattern as string) : undefined,\n }\n };\n}\n\n\n\n/**\n * Helper function to create common render configurations\n */\nexport const renderConfigs = {\n text: (label: string, placeholder?: string, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'text',\n ui: { label, placeholder, priority },\n progressive: { priority }\n }),\n\n number: (label: string, min?: number, max?: number, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'number',\n ui: { label, priority },\n constraints: { min, max },\n progressive: { priority }\n }),\n\n select: (label: string, options: SelectOption[], priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'select',\n ui: { label, priority },\n options,\n progressive: { priority }\n }),\n\n textarea: (label: string, rows = 3, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'textarea',\n ui: { label, priority },\n props: { rows },\n progressive: { priority }\n }),\n\n currency: (label: string, symbol = 'HBAR', priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'currency',\n ui: { label, priority },\n props: { symbol },\n progressive: { priority }\n }),\n\n array: (label: string, itemLabel?: string, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'advanced'): EnhancedRenderConfig => ({\n fieldType: 'array',\n ui: { label, priority },\n props: { itemLabel },\n progressive: { priority }\n }),\n\n essential: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'essential'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'essential'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'essential'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'essential'),\n },\n\n advanced: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'advanced'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'advanced'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'advanced'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'advanced'),\n array: (label: string, itemLabel?: string) => renderConfigs.array(label, itemLabel, 'advanced'),\n },\n\n expert: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'expert'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'expert'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'expert'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'expert'),\n }\n};\n\n/**\n * Extends Zod prototype to add withRender functionality globally\n */\nexport function installZodRenderExtensions() {\n if (!(ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withRender) {\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withRender = function(config: EnhancedRenderConfig | RenderConfigSchema) {\n return extendZodSchema(this).withRender(config);\n };\n\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withProgressive = function(\n priority: 'essential' | 'common' | 'advanced' | 'expert',\n group?: string\n ) {\n return extendZodSchema(this).withProgressive(priority, group);\n };\n\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withBlock = function(blockId: string) {\n return extendZodSchema(this).withBlock(blockId);\n };\n }\n}\n\n/**\n * Creates a progressive form schema with grouped fields\n */\nexport function createProgressiveSchema<TSchema>(\n baseSchema: ZodType<TSchema>,\n groups: Record<string, { priority: 'essential' | 'common' | 'advanced' | 'expert'; fields: string[] }>\n): ZodSchemaWithRender<TSchema> {\n const extendedSchema = extendZodSchema(baseSchema);\n\n const typeName = (baseSchema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodObject') {\n const shape = (baseSchema._def as Record<string, unknown>)?.shape as Record<string, ZodType<unknown>>;\n if (shape) {\n const enhancedShape: Record<string, ZodType<unknown>> = {};\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n let fieldGroup: string | undefined;\n let fieldPriority: 'essential' | 'common' | 'advanced' | 'expert' = 'common';\n\n for (const [groupName, groupConfig] of Object.entries(groups)) {\n if (groupConfig.fields.includes(fieldName)) {\n fieldGroup = groupName;\n fieldPriority = groupConfig.priority;\n break;\n }\n }\n\n enhancedShape[fieldName] = extendZodSchema(fieldSchema).withProgressive(fieldPriority, fieldGroup);\n }\n\n return extendedSchema;\n }\n }\n\n return extendedSchema;\n}\n\n/**\n * Utility to convert legacy render configs to enhanced configs\n */\nexport function enhanceRenderConfig(config: RenderConfigSchema): EnhancedRenderConfig {\n return {\n ...config,\n progressive: {\n priority: config.ui?.priority || 'common',\n group: config.ui?.group\n }\n };\n}\n\n/**\n * Helper to extract progressive disclosure information from schema\n */\nexport function extractProgressiveInfo(schema: ZodType<unknown>): {\n priority: 'essential' | 'common' | 'advanced' | 'expert';\n group?: string;\n} {\n const renderConfig = getRenderConfig(schema);\n if (renderConfig?.progressive) {\n return {\n priority: renderConfig.progressive.priority,\n group: renderConfig.progressive.group\n };\n }\n\n if (renderConfig?.ui?.priority) {\n return {\n priority: renderConfig.ui.priority,\n group: renderConfig.ui.group\n };\n }\n\n return { priority: 'common' };\n}","/**\n * Structured response interface for inscription tools\n * Provides a consistent, user-friendly format for inscription results\n */\n\nexport interface InscriptionSuccessResponse {\n success: true;\n type: 'inscription';\n title: string;\n message: string;\n inscription: {\n /** The HRL (Hashinal Reference Link) for minting - e.g., \"hcs://1/0.0.123456\" */\n hrl: string;\n /** Topic ID where the inscription was stored */\n topicId: string;\n /** Type of Hashinal - Static (HCS-5) or Dynamic (HCS-6) */\n standard: 'Static' | 'Dynamic';\n /** CDN URL for direct access to the inscribed content */\n cdnUrl?: string;\n /** Transaction ID of the inscription */\n transactionId?: string;\n };\n metadata: {\n /** Name/title of the inscribed content */\n name?: string;\n /** Creator of the content */\n creator?: string;\n /** Description of the content */\n description?: string;\n /** Content type (image, text, etc.) */\n type?: string;\n /** Additional attributes */\n attributes?: Array<{ trait_type: string; value: string | number }>;\n };\n nextSteps: {\n /** Primary action the user should take next */\n primary: string;\n /** Additional context or options */\n context?: string;\n /** Specific metadata value to use for minting */\n mintingMetadata: string;\n };\n /** HashLink block data (only present when withHashLinkBlocks=true) */\n hashLinkBlock?: {\n /** Block topic ID on HCS */\n blockId: string;\n /** HashLink reference to the block */\n hashLink: string;\n /** Template topic ID */\n template: string;\n /** Block attributes for rendering */\n attributes: BlockAttributes;\n };\n}\n\nexport interface InscriptionQuoteResponse {\n success: true;\n type: 'quote';\n title: string;\n message: string;\n quote: {\n /** Total cost in HBAR */\n totalCostHbar: string;\n /** When the quote expires */\n validUntil: string;\n /** Cost breakdown details */\n breakdown?: CostBreakdown;\n };\n content: {\n /** Name of the content to be inscribed */\n name?: string;\n /** Creator of the content */\n creator?: string;\n /** Type of content */\n type?: string;\n };\n}\n\nexport interface InscriptionErrorResponse {\n success: false;\n type: 'error';\n title: string;\n message: string;\n error: {\n /** Error code for programmatic handling */\n code: string;\n /** Detailed error message */\n details: string;\n /** Suggestions for fixing the error */\n suggestions?: string[];\n };\n}\n\nexport type InscriptionResponse =\n | InscriptionSuccessResponse\n | InscriptionQuoteResponse\n | InscriptionErrorResponse;\n\n/**\n * Helper function to create a successful inscription response\n */\nexport function createInscriptionSuccess(params: {\n hrl: string;\n topicId: string;\n standard: 'Static' | 'Dynamic';\n cdnUrl?: string;\n transactionId?: string;\n metadata: {\n name?: string;\n creator?: string;\n description?: string;\n type?: string;\n attributes?: Array<{ trait_type: string; value: string | number }>;\n };\n}): InscriptionSuccessResponse {\n const { hrl, topicId, standard, cdnUrl, transactionId, metadata } = params;\n\n return {\n success: true,\n type: 'inscription',\n title: `${standard} Hashinal Inscription Complete`,\n message: `Successfully inscribed \"${\n metadata.name || 'your content'\n }\" as a ${standard} Hashinal. The content is now ready for NFT minting.`,\n inscription: {\n hrl,\n topicId,\n standard,\n cdnUrl,\n transactionId,\n },\n metadata,\n nextSteps: {\n primary: 'CRITICAL: When minting NFTs, use ONLY the mintingMetadata value as a single string in the metadata array. Do NOT create JSON objects.',\n context:\n 'The metadata parameter for minting should be exactly: [\"' + hrl + '\"] - just the HRL string in an array, nothing else.',\n mintingMetadata: hrl,\n },\n };\n}\n\n/**\n * Block attributes for HashLink rendering\n */\ninterface BlockAttributes {\n /** Display name */\n name?: string;\n /** Description text */\n description?: string;\n /** Image URL */\n image?: string;\n /** Content type */\n contentType?: string;\n /** Size in bytes */\n size?: number;\n /** Custom metadata */\n metadata?: Record<string, string | number | boolean>;\n}\n\n/**\n * Transfer details in cost breakdown\n */\ninterface TransferDetails {\n to: string;\n amount: string;\n description: string;\n}\n\n/**\n * Cost breakdown details for inscription quote\n */\ninterface CostBreakdown {\n transfers: TransferDetails[];\n baseFee?: number;\n sizeFee?: number;\n networkFee?: number;\n serviceFee?: number;\n totalFee?: number;\n currency?: string;\n}\n\n/**\n * Helper function to create a quote response\n */\nexport function createInscriptionQuote(params: {\n totalCostHbar: string;\n validUntil: string;\n breakdown?: CostBreakdown;\n content: {\n name?: string;\n creator?: string;\n type?: string;\n };\n}): InscriptionQuoteResponse {\n const { totalCostHbar, validUntil, breakdown, content } = params;\n\n return {\n success: true,\n type: 'quote',\n title: 'Inscription Cost Quote',\n message: `Estimated cost to inscribe \"${\n content.name || 'your content'\n }\" is ${totalCostHbar} HBAR.`,\n quote: {\n totalCostHbar,\n validUntil,\n breakdown,\n },\n content,\n };\n}\n\n/**\n * Helper function to create an error response\n */\nexport function createInscriptionError(params: {\n code: string;\n details: string;\n suggestions?: string[];\n}): InscriptionErrorResponse {\n const { code, details, suggestions } = params;\n\n return {\n success: false,\n type: 'error',\n title: 'Inscription Failed',\n message: `Unable to complete inscription: ${details}`,\n error: {\n code,\n details,\n suggestions,\n },\n };\n}\n\n/**\n * Helper for pending inscription state (submitted but not yet confirmed)\n */\nexport function createInscriptionPending(params: {\n transactionId: string;\n details?: string;\n suggestions?: string[];\n}): InscriptionErrorResponse {\n const { transactionId, details, suggestions } = params;\n const d = details || `Inscription submitted but not yet confirmed. Transaction ID: ${transactionId}`;\n return {\n success: false,\n type: 'error',\n title: 'Inscription Submitted (Pending)',\n message: d,\n error: {\n code: 'INSCRIPTION_PENDING',\n details: d,\n suggestions: suggestions || [\n 'Wait a few moments for confirmation',\n 'Check the transaction status on a Hedera explorer',\n \"Try the inscription again if it doesn't confirm within 5 minutes\",\n ],\n },\n };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n InscriptionResult,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { validateHIP412Metadata } from '../../validation/hip412-schemas';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { generateDefaultMetadata } from '../../utils/metadata-defaults';\nimport {\n extendZodSchema,\n renderConfigs,\n} from '../../lib/zod-render/schema-extension';\nimport {\n createInscriptionSuccess,\n createInscriptionQuote,\n createInscriptionError,\n createInscriptionPending,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\n\n/**\n * Network-specific Hashinal block configuration for HashLink blocks\n */\nconst HASHLINK_BLOCK_CONFIG = {\n testnet: {\n blockId: '0.0.6617393',\n hashLink: 'hcs://12/0.0.6617393',\n template: '0.0.6617393',\n },\n mainnet: {\n blockId: '0.0.TBD',\n hashLink: 'hcs://12/0.0.TBD',\n template: '0.0.TBD',\n },\n};\n\n/**\n * Gets the appropriate HashLink block configuration for the specified network.\n * Provides graceful fallback to testnet for unknown networks or undeployed mainnet blocks.\n *\n * @param network The network type to get configuration for\n * @returns Network-specific block configuration with blockId, hashLink, and template\n */\nfunction getHashLinkBlockId(network: 'mainnet' | 'testnet'): {\n blockId: string;\n hashLink: string;\n template: string;\n} {\n const config =\n network === 'mainnet'\n ? HASHLINK_BLOCK_CONFIG.mainnet\n : HASHLINK_BLOCK_CONFIG.testnet;\n if (!config || config.blockId === '0.0.TBD') {\n return HASHLINK_BLOCK_CONFIG.testnet;\n }\n return config;\n}\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = extendZodSchema(\n z.object({\n url: z\n .string()\n .optional()\n .describe(\n 'The URL of the content to inscribe as Hashinal NFT (use this OR contentRef)'\n ),\n contentRef: contentRefSchema\n .optional()\n .describe(\n 'Content reference ID in format \"content-ref:[id]\" for already stored content (use this OR url)'\n ),\n base64Data: z\n .string()\n .optional()\n .describe(\n 'Base64 encoded content data (use this if neither url nor contentRef provided)'\n ),\n fileName: z\n .string()\n .optional()\n .describe(\n 'File name for the content (required when using base64Data or contentRef)'\n ),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content (e.g., \"image/png\", \"image/jpeg\")'),\n name: z\n .string()\n .optional()\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n creator: z\n .string()\n .optional()\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n description: z\n .string()\n .optional()\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card\")'\n ),\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe(\n 'Collectible traits and characteristics (e.g., \"Rarity\": \"Epic\", \"Color\": \"Blue\", \"Style\": \"Abstract\")'\n ),\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 fileStandard: z\n .enum(['1', '6'])\n .optional()\n .default('1')\n .describe(\n 'HCS file standard: 1 for static Hashinals (HCS-5), 6 for dynamic Hashinals (HCS-6)'\n ),\n tags: z.array(z.string()).optional().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 timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Timeout in milliseconds for inscription (default: no timeout - waits until completion)'\n ),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\n withHashLinkBlocks: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'If true, creates interactive HashLink blocks for the inscribed content and returns block data alongside the inscription response'\n ),\n renderForm: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'Whether to show a form to collect metadata. Set to false only if user provided complete metadata including name, description, creator, and attributes.'\n ),\n })\n).withRender({\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n});\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool\n extends BaseInscriberQueryTool\n implements FormValidatable\n{\n name = 'inscribeHashinal';\n description =\n 'Tool for inscribing Hashinal NFTs. CRITICAL: When user provides content (url/contentRef/base64Data), call with ONLY the content parameters - DO NOT auto-generate name, description, creator, or attributes. A form will be automatically shown to collect metadata from the user. Only include metadata parameters if the user explicitly provided them in their message.';\n\n getEntityResolutionPreferences(): Record<string, string> {\n return {\n name: 'literal',\n description: 'literal',\n creator: 'literal',\n attributes: 'literal',\n properties: 'literal',\n };\n }\n\n get specificInputSchema(): z.ZodObject<z.ZodRawShape> {\n const baseSchema =\n (inscribeHashinalSchema as z.ZodType & { _def?: { schema?: z.ZodType } })\n ._def?.schema || inscribeHashinalSchema;\n return baseSchema as z.ZodObject<z.ZodRawShape>;\n }\n\n private _schemaWithRenderConfig?: z.ZodObject<z.ZodRawShape>;\n\n override get schema(): z.ZodObject<z.ZodRawShape> {\n if (!this._schemaWithRenderConfig) {\n const baseSchema = this.specificInputSchema;\n const schemaWithRender = baseSchema as z.ZodObject<z.ZodRawShape> & {\n _renderConfig?: {\n fieldType: string;\n ui: { label: string; description: string };\n };\n };\n\n if (!schemaWithRender._renderConfig) {\n schemaWithRender._renderConfig = {\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n };\n }\n this._schemaWithRenderConfig = baseSchema;\n }\n return this._schemaWithRenderConfig;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a form should be generated for the given input\n */\n shouldGenerateForm(input: unknown): boolean {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n const inputObj = input as Record<string, unknown>;\n\n logger.info('InscribeHashinalTool: Checking if form should be generated', {\n inputKeys: Object.keys(inputObj || {}),\n hasContent: !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n ),\n renderFormProvided: 'renderForm' in inputObj,\n renderFormValue: inputObj.renderForm,\n });\n\n const hasContentSource = !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n );\n\n if (!hasContentSource) {\n logger.info('InscribeHashinalTool: No content source provided');\n return false;\n }\n\n if ('renderForm' in inputObj && inputObj.renderForm === false) {\n logger.info(\n 'InscribeHashinalTool: renderForm=false, skipping form generation'\n );\n return false;\n }\n\n const isNonEmptyString = (v: unknown): v is string => {\n if (typeof v !== 'string') {\n return false;\n }\n if (v.trim().length === 0) {\n return false;\n }\n return true;\n };\n\n const hasRequiredMetadata =\n isNonEmptyString(inputObj.name) &&\n isNonEmptyString(inputObj.description) &&\n isNonEmptyString(inputObj.creator);\n\n if (hasRequiredMetadata) {\n logger.info(\n 'InscribeHashinalTool: Required metadata present, skipping form generation'\n );\n return false;\n }\n\n logger.info(\n 'InscribeHashinalTool: Content provided, showing form for metadata collection'\n );\n return true;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns the focused schema for form generation\n */\n getFormSchema(): z.ZodObject<z.ZodRawShape> {\n const focusedSchema = extendZodSchema(\n z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n\n description: z\n .string()\n .min(1, 'Description is required')\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n\n creator: z\n .string()\n .min(1, 'Creator is required')\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z\n .string()\n .describe('Trait name (e.g., \"Rarity\", \"Color\", \"Style\")'),\n value: z\n .union([z.string(), z.number()])\n .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe('Collectible traits and characteristics.'),\n\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card)'\n ),\n })\n ).withRender({\n fieldType: 'object',\n ui: {\n label: 'Complete NFT Metadata',\n description: 'Provide meaningful metadata to create a valuable NFT',\n },\n });\n\n return focusedSchema as unknown as z.ZodObject<z.ZodRawShape>;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<InscriptionResponse> {\n if (!params.url && !params.contentRef && !params.base64Data) {\n return createInscriptionError({\n code: 'MISSING_CONTENT',\n details: 'No content source provided',\n suggestions: [\n 'Provide a URL to content you want to inscribe',\n 'Upload a file and use the content reference',\n 'Provide base64-encoded content data',\n ],\n });\n }\n\n const operatorAccount =\n this.inscriberBuilder[\n 'hederaKit'\n ]?.client?.operatorAccountId?.toString() || '0.0.unknown';\n\n const rawMetadata = {\n ...generateDefaultMetadata({\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n fileName: params.fileName,\n mimeType: params.mimeType,\n operatorAccount,\n }),\n attributes: Array.isArray(params.attributes) ? params.attributes : [],\n properties:\n (params.properties as Record<string, unknown> | undefined) || {},\n };\n\n let validatedMetadata;\n try {\n validatedMetadata = validateHIP412Metadata(rawMetadata);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return createInscriptionError({\n code: 'METADATA_VALIDATION_FAILED',\n details: `Metadata validation error: ${errorMessage}`,\n suggestions: [\n 'Ensure all required metadata fields are provided',\n 'Check that attribute values are valid',\n 'Verify metadata follows HIP-412 standard',\n ],\n });\n }\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata: validatedMetadata,\n jsonFileURL: params.jsonFileURL,\n fileStandard: params.fileStandard,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n let inscriptionData: InscriptionInput;\n\n if (params.url) {\n inscriptionData = { type: 'url', url: params.url };\n } else if (params.contentRef || params.base64Data) {\n const inputData = params.contentRef || params.base64Data || '';\n const { buffer, mimeType, fileName } = await this.resolveContent(\n inputData,\n params.mimeType,\n params.fileName\n );\n\n inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName: fileName || params.fileName || 'hashinal-content',\n mimeType: mimeType || params.mimeType,\n };\n } else {\n throw new Error('No valid input data provided for inscription');\n }\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n inscriptionData,\n options\n );\n\n return createInscriptionQuote({\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n content: {\n name: params.name,\n creator: params.creator,\n type: params.type,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n return createInscriptionError({\n code: 'QUOTE_GENERATION_FAILED',\n details: `Quote generation failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify content is accessible',\n 'Try again in a moment',\n ],\n });\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribeAuto\n ? this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = this.inscriberBuilder.inscribeAuto\n ? await this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const ids = extractTopicIds(result.inscription, result.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const fileStandard = params.fileStandard || '1';\n const { hrl, topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n fileStandard\n );\n\n const txId =\n result?.inscription?.tx_id ||\n (result?.result as InscriptionResult)?.transactionId ||\n 'unknown';\n const successResponse = createInscriptionSuccess({\n hrl: hrl || 'hcs://1/unknown',\n topicId: topicId || 'unknown',\n standard: fileStandard === '6' ? 'Dynamic' : 'Static',\n cdnUrl,\n transactionId: txId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: Array.isArray(params.attributes)\n ? params.attributes\n : [],\n },\n });\n\n if (params.withHashLinkBlocks !== false) {\n try {\n const block = await this.createHashLinkBlock(successResponse);\n successResponse.hashLinkBlock = block;\n } catch (e) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn('Failed to create HashLink block', e);\n }\n }\n\n return successResponse;\n } else if (!result.quote && !result.confirmed) {\n const txId =\n (result.result as InscriptionResult)?.transactionId ||\n result?.inscription?.transactionId ||\n 'unknown';\n return createInscriptionPending({\n transactionId: txId,\n details:\n 'Successfully submitted Hashinal inscription. Waiting for network confirmation...',\n });\n } else {\n return createInscriptionError({\n code: 'UNEXPECTED_RESULT',\n details: 'Received an unexpected inscription result state',\n suggestions: ['Try again or verify network status'],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n /**\n * Creates HashLink block configuration for Hashinal inscriptions.\n * Automatically detects network and selects appropriate block ID configuration.\n * Uses testnet block as fallback for unknown networks or undeployed mainnet blocks.\n *\n * @param response The inscription response containing metadata and network information\n * @param _mimeType Optional MIME type (currently unused, preserved for compatibility)\n * @returns HCS12BlockResult with network-specific block configuration\n *\n * @example\n * ```typescript\n * // Testnet usage (automatic detection from client)\n * const testnetClient = Client.forTestnet();\n * const tool = new InscribeHashinalTool(testnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * const id = block.blockId; // '0.0.6617393'\n * const link = block.hashLink; // 'hcs://12/0.0.6617393'\n *\n * // Mainnet usage (automatic detection from client)\n * const mainnetClient = Client.forMainnet();\n * const tool = new InscribeHashinalTool(mainnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * const mainnetId = block.blockId; // Network-specific mainnet block ID\n *\n * // HashLink Block Response Structure:\n * {\n * blockId: string; // Hedera account ID format (e.g., '0.0.6617393')\n * hashLink: string; // HCS-12 URL format: 'hcs://12/{blockId}'\n * template: string; // Block template reference matching blockId\n * attributes: { // Metadata for client-side processing\n * name: string; // Content display name\n * creator: string; // Creator account ID\n * topicId: string; // HCS topic containing the inscription\n * hrl: string; // Hedera Resource Locator\n * network: string; // Network type: 'testnet' | 'mainnet'\n * }\n * }\n *\n * // Render function usage in HashLink blocks:\n * // The block's JavaScript render function receives this structure\n * // and can access network-specific resources through attributes.network\n * ```\n */\n private async createHashLinkBlock(\n response: ReturnType<typeof createInscriptionSuccess>,\n _mimeType?: string\n ): Promise<{\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n }> {\n const clientNetwork = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const cdnNetwork = response.inscription.cdnUrl?.includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n if (clientNetwork !== cdnNetwork) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn(\n `Network mismatch detected: client=${clientNetwork}, cdn=${cdnNetwork}. Using client network.`\n );\n }\n\n const network = clientNetwork;\n const config = getHashLinkBlockId(network);\n\n return {\n blockId: config.blockId,\n hashLink: config.hashLink,\n template: config.template,\n attributes: {\n name: response.metadata.name || 'Untitled Content',\n creator: response.metadata.creator || '',\n topicId: response.inscription.topicId,\n hrl: response.inscription.hrl,\n network: network,\n },\n };\n }\n\n private async resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): Promise<{\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n }> {\n const trimmedInput = input.trim();\n\n const resolver =\n this.getContentResolver() || ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n private handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n } {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns essential fields that should always be shown in forms\n */\n getEssentialFields(): string[] {\n return ['name', 'description', 'creator', 'attributes'];\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a field value should be considered empty for this tool\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n if (fieldName === 'attributes' && Array.isArray(value)) {\n return value.every(\n (attr) =>\n !attr ||\n (typeof attr === 'object' && (!attr.trait_type || !attr.value))\n );\n }\n\n return false;\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport type { RetrievedInscriptionResult } from '@hashgraphonline/standards-sdk';\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 * Type definition for inscription retrieval result\n */\ninterface InscriptionRetrievalResult {\n inscriptionId?: string;\n transactionId: string;\n topicId?: string;\n status?: string;\n holderId?: string;\n metadata?: unknown;\n tags?: unknown;\n mode?: string;\n chunks?: unknown;\n createdAt?: string;\n completedAt?: string;\n fileUrl?: string;\n mimeType?: string;\n fileSize?: number;\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<InscriptionRetrievalResult> {\n const result: RetrievedInscriptionResult = 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 unknown as { inscriptionId?: string }).inscriptionId,\n transactionId: (result as unknown as { transactionId?: string }).transactionId || 'unknown',\n topicId: (result as unknown as { topic_id?: string; topicId?: string }).topic_id || (result as unknown as { topicId?: string }).topicId,\n status: (result as unknown as { status?: string }).status || 'unknown',\n holderId: (result as unknown as { holderId?: string }).holderId,\n metadata: result.metadata,\n tags: (result as unknown as { tags?: unknown }).tags,\n mode: (result as unknown as { mode?: string }).mode,\n chunks: (result as unknown as { chunks?: unknown }).chunks,\n createdAt: (result as unknown as { createdAt?: string }).createdAt,\n completedAt: (result as unknown as { completed?: string; completedAt?: string }).completed || (result as unknown as { completedAt?: string }).completedAt,\n fileUrl: (result as unknown as { fileUrl?: string }).fileUrl,\n mimeType: (result as unknown as { mimeType?: string }).mimeType,\n fileSize: (result as unknown as { fileSize?: number }).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 logger.error(`Error creating ${agentName} agent:`, error, { baseClient });\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 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 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 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 this.connectionsManager.updateOrAddConnection(sdkConnection);\n\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 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 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 const byTopicId =\n this.connectionsManager.getConnectionByTopicId(identifier);\n if (byTopicId) {\n return this.convertToActiveConnection(byTopicId);\n }\n\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\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n return;\n }\n\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","export type NetworkString = 'mainnet' | 'testnet'\n\nexport interface DAppSigner {\n getAccountId(): { toString(): string }\n [key: string]: unknown\n}\n\nexport type WalletInfo = { accountId: string; network: NetworkString }\n\nexport type WalletInfoResolver = () => Promise<WalletInfo | null> | WalletInfo | null\n\nexport type WalletExecutor = (\n base64: string,\n network: NetworkString\n) => Promise<{ transactionId: string }>\n\nexport type HCSOperation =\n | 'submitConnectionRequest'\n | 'handleConnectionRequest'\n | 'sendMessage'\n | 'hcs2.createRegistry'\n | 'hcs2.migrateRegistry'\n | 'hcs2.registerEntry'\n | 'hcs2.updateEntry'\n | 'hcs2.deleteEntry'\n | 'hcs2.submitMessage'\n | 'hcs6.createRegistry'\n | 'hcs6.registerEntry'\n | 'hcs6.submitMessage'\n\nexport type StartHCSDelegate = (\n op: HCSOperation,\n request: Record<string, unknown>,\n network: NetworkString\n) => Promise<{ transactionBytes: string }>\n\n/**\n * Central registry for browser signer and wallet execution delegates\n */\nexport class SignerProviderRegistry {\n private static _signerProvider: (() => Promise<DAppSigner | null>) | (() => DAppSigner | null) | DAppSigner | null\n private static _walletInfoResolver: WalletInfoResolver | null\n private static _walletExecutor: WalletExecutor | null\n private static _startHCSDelegate: StartHCSDelegate | null\n private static _browserHCSClientFactory: ((network: NetworkString) => unknown) | null\n private static _preferWalletOnly = false\n\n static setSignerProvider(provider: typeof SignerProviderRegistry._signerProvider): void {\n this._signerProvider = provider\n }\n\n static async getSigner(): Promise<DAppSigner | null> {\n const p = this._signerProvider\n if (!p) return null\n try {\n if (typeof p === 'function') {\n const val = (p as () => Promise<DAppSigner | null> | DAppSigner | null)()\n return (val && typeof (val as Promise<unknown>).then === 'function')\n ? await (val as Promise<DAppSigner | null>)\n : (val as DAppSigner | null)\n }\n return p as DAppSigner\n } catch {\n return null\n }\n }\n\n static setWalletInfoResolver(resolver: WalletInfoResolver | null): void {\n this._walletInfoResolver = resolver || null\n }\n\n static async getWalletInfo(): Promise<WalletInfo | null> {\n const r = this._walletInfoResolver\n if (!r) return null\n try {\n const val = r()\n return (val && typeof (val as Promise<unknown>).then === 'function')\n ? await (val as Promise<WalletInfo | null>)\n : (val as WalletInfo | null)\n } catch {\n return null\n }\n }\n\n static setWalletExecutor(executor: WalletExecutor | null): void {\n this._walletExecutor = executor || null\n }\n\n static get walletExecutor(): WalletExecutor | null {\n return this._walletExecutor || null\n }\n\n static setStartHCSDelegate(delegate: StartHCSDelegate | null): void {\n this._startHCSDelegate = delegate || null\n }\n\n static get startHCSDelegate(): StartHCSDelegate | null {\n return this._startHCSDelegate || null\n }\n\n static setPreferWalletOnly(flag: boolean): void {\n this._preferWalletOnly = !!flag\n }\n\n /**\n * Register a factory to construct a BrowserHCSClient-like instance for wallet-driven flows\n */\n static setBrowserHCSClientFactory(factory: ((network: NetworkString) => unknown) | null): void {\n this._browserHCSClientFactory = factory || null\n }\n\n static getBrowserHCSClient(network: NetworkString): unknown | null {\n return this._browserHCSClientFactory ? this._browserHCSClientFactory(network) : null\n }\n\n static get preferWalletOnly(): boolean {\n return this._preferWalletOnly\n }\n}\n\n","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport { PrivateKey, TransactionReceipt } from '@hashgraph/sdk';\nimport { SignerProviderRegistry, type DAppSigner, type NetworkString } from '../../signing/signer-provider';\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 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\n this.stateManager = stateManager;\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 = ((): SDKLogger => {\n try {\n if (typeof SDKLogger === 'function') {\n return new SDKLogger({\n module: 'HCS10Builder',\n level: options?.logLevel || 'info',\n });\n }\n } catch {}\n return {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n trace: () => {},\n setLogLevel: () => {},\n getLevel: () => 'info',\n setSilent: () => {},\n setModule: () => {},\n } as unknown as SDKLogger;\n })();\n\n this.standardClient = new HCS10Client({\n network: this.network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\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 const start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (exec && ByteBuildRegistry.has('submitConnectionRequest')) {\n const built = await ByteBuildRegistry.build('submitConnectionRequest', this.hederaKit, { inboundTopicId, memo });\n if (built && built.transactionBytes) {\n const { transactionId } = await exec(built.transactionBytes, network);\n return ({ transactionId } as unknown) as TransactionReceipt;\n }\n }\n } catch {}\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = { inboundTopicId, memo };\n const { transactionBytes } = await start('submitConnectionRequest', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n return ({ transactionId } as unknown) as TransactionReceipt;\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = {\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig: feeConfig ? 'configured' : undefined,\n };\n const { transactionBytes } = await start('handleConnectionRequest', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n const minimal = {\n success: true,\n transactionId,\n } as unknown as HandleConnectionRequestResponse;\n return minimal;\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 let prevMaxSeq = 0\n try {\n const prev = await this.getMessages(topicId)\n prevMaxSeq = prev.messages.reduce((max, m) => Math.max(max, m.sequence_number || 0), 0)\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (exec && ByteBuildRegistry.has('sendMessage')) {\n const built = await ByteBuildRegistry.build('sendMessage', this.hederaKit, { topicId, data, memo });\n if (built && built.transactionBytes) {\n const { transactionId } = await exec(built.transactionBytes, network);\n const sequenceNumber = await this.pollForNewSequence(topicId, prevMaxSeq);\n return {\n sequenceNumber,\n receipt: ({ transactionId } as unknown) as TransactionReceipt,\n transactionId,\n };\n }\n }\n } catch {}\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = { topicId, data, memo };\n const { transactionBytes } = await start('sendMessage', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n\n const sequenceNumber = await this.pollForNewSequence(topicId, prevMaxSeq);\n return {\n sequenceNumber,\n receipt: ({ transactionId } as unknown) as TransactionReceipt,\n transactionId,\n };\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 private async pollForNewSequence(topicId: string, prevMax: number): Promise<number | undefined> {\n const maxAttempts = 10\n const delayMs = 1000\n for (let i = 0; i < maxAttempts; i++) {\n try {\n const res = await this.getMessages(topicId)\n const maxSeq = res.messages.reduce((m, msg) => Math.max(m, msg.sequence_number || 0), prevMax)\n if (maxSeq > prevMax) return maxSeq\n } catch {}\n await new Promise((r) => setTimeout(r, delayMs))\n }\n return undefined\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 preferWallet = SignerProviderRegistry.preferWalletOnly;\n const browserClient = SignerProviderRegistry.getBrowserHCSClient(this.network as NetworkString) as\n | { create: (builder: unknown, opts?: Record<string, unknown>) => Promise<unknown> }\n | null;\n\n if (browserClient) {\n try {\n const aBuilder = new AgentBuilder()\n .setNetwork(this.network)\n .setName(registrationData.name)\n .setAlias(registrationData.alias || `${registrationData.name}-${Date.now()}`)\n .setBio(registrationData.bio || '')\n .setType(registrationData.type || 'autonomous')\n .setModel(registrationData.model || 'agent-model-2024');\n\n if (registrationData.capabilities?.length) {\n aBuilder.setCapabilities(registrationData.capabilities as unknown as number[]);\n }\n if (registrationData.creator) aBuilder.setCreator(registrationData.creator);\n if (registrationData.existingProfilePictureTopicId) {\n aBuilder.setExistingProfilePicture(registrationData.existingProfilePictureTopicId);\n }\n if (registrationData.socials) {\n Object.entries(registrationData.socials).forEach(([platform, handle]) => {\n if (handle && typeof handle === 'string') {\n aBuilder.addSocial(platform as SocialPlatform, handle);\n }\n });\n }\n if (registrationData.properties) {\n Object.entries(registrationData.properties).forEach(([key, value]) => {\n if (value != null) aBuilder.addProperty(key, value as unknown as string);\n });\n }\n\n const resp = await browserClient.create(aBuilder, {\n progressCallback: (_: unknown) => {},\n updateAccountMemo: true,\n });\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: { result: resp, name: registrationData.name },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n return this;\n } catch (walletErr) {\n if (preferWallet) {\n throw new Error(`wallet_registration_failed: ${walletErr instanceof Error ? walletErr.message : String(walletErr)}`);\n }\n }\n } else if (preferWallet) {\n throw new Error('wallet_unavailable: BrowserHCSClient factory not provided');\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 try {\n const refreshed = await this.stateManager?.getConnectionsManager()?.fetchConnectionData(currentAgent.accountId);\n const established = (refreshed || []).find(\n (c: unknown) => (c as { targetAccountId?: string; status?: string }).targetAccountId === targetAccountId &&\n (c as { status?: string }).status === 'established'\n ) as { connectionTopicId?: string } | undefined;\n if (established?.connectionTopicId) {\n connectionTopicId = established.connectionTopicId;\n }\n } catch (e) {\n this.logger.debug('Could not refresh connections after acceptance to derive topic id:', e);\n }\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 let baseSeq = 0\n try {\n const prev = await this.getMessages(connectionTopicId)\n baseSeq = prev.messages.reduce((max, m) => Math.max(max, m.sequence_number || 0), 0)\n } catch {}\n\n const messageResult = await this.sendMessage(\n connectionTopicId,\n params.message,\n `Agent message from ${currentAgent.name}`\n );\n\n const effectiveSeq = messageResult.sequenceNumber ?? baseSeq\n if (effectiveSeq === 0) {\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 effectiveSeq\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","\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 { ZodType } from 'zod';\n\n/**\n * Type definitions for Zod internal structures\n */\ninterface ZodDef {\n typeName: string;\n type?: ZodType<unknown>;\n}\n\n/**\n * Type definition for Zod object schema with shape property\n */\ninterface ZodObjectSchema {\n _def: ZodDef;\n shape: Record<string, ZodType<unknown>>;\n}\n\n/**\n * Type definition for Zod array schema with element type\n */\ninterface ZodArraySchema {\n _def: ZodDef & {\n type: ZodType<unknown>;\n };\n}\n\n/**\n * Type definition for field config map entries\n */\ninterface FieldConfigMapEntry {\n renderConfig: RenderConfigSchema;\n metadata: FieldMetadata;\n path: string[];\n}\n\n\n/**\n * Type definition for simple field configuration\n */\ninterface SimpleFieldConfig {\n name: string;\n type: FormFieldType;\n label: string;\n required: boolean;\n placeholder?: string;\n options?: Array<{ value: unknown; label: string }>;\n}\nimport {\n RenderConfigSchema,\n ExtractedRenderConfig,\n FieldMetadata,\n FormFieldType\n} from './types';\nimport {\n hasRenderConfig,\n getRenderConfig,\n extractFieldMetadata,\n getInnerSchema\n} from './schema-extension';\n\n/**\n * Extracts render configurations from a Zod schema and all nested schemas\n */\nexport function extractRenderConfigs(schema: ZodType<unknown>): ExtractedRenderConfig {\n const fields: Record<string, RenderConfigSchema> = {};\n const groups: Record<string, string[]> = {};\n const order: string[] = [];\n const metadata: Record<string, FieldMetadata> = {};\n\n extractFromSchema(schema, '', fields, groups, order, metadata);\n\n return {\n fields,\n groups: organizeFieldGroups(groups),\n order: orderFields(order, fields),\n metadata\n };\n}\n\n/**\n * Recursively extracts render configurations from schema and nested schemas\n */\nfunction extractFromSchema(\n schema: ZodType<unknown>,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n const innerSchema = getInnerSchema(schema);\n const typeName = (innerSchema._def as ZodDef)?.typeName;\n\n if (typeName === 'ZodObject') {\n extractFromObjectSchema(innerSchema as unknown as ZodObjectSchema, pathPrefix, fields, groups, order, metadata);\n } else if (typeName === 'ZodArray') {\n extractFromArraySchema(innerSchema as unknown as ZodArraySchema, pathPrefix, fields, groups, order, metadata);\n } else {\n extractFromPrimitiveSchema(schema, pathPrefix, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from ZodObject schemas\n */\nfunction extractFromObjectSchema(\n schema: ZodObjectSchema,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n const shape = schema.shape;\n\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config && pathPrefix) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n }\n }\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const fieldPath = pathPrefix ? `${pathPrefix}.${key}` : key;\n extractFromSchema(fieldSchema as ZodType<unknown>, fieldPath, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from ZodArray schemas\n */\nfunction extractFromArraySchema(\n schema: ZodArraySchema,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n metadata[pathPrefix] = extractFieldMetadata(schema);\n }\n }\n\n const elementSchema = schema._def.type;\n if (elementSchema) {\n const itemPath = `${pathPrefix}[]`;\n extractFromSchema(elementSchema, itemPath, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from primitive schemas\n */\nfunction extractFromPrimitiveSchema(\n schema: ZodType<unknown>,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n }\n }\n\n metadata[pathPrefix] = extractFieldMetadata(schema);\n}\n\n/**\n * Adds a field to a group\n */\nfunction addToGroup(groups: Record<string, string[]>, groupName: string, fieldPath: string): void {\n if (!groups[groupName]) {\n groups[groupName] = [];\n }\n groups[groupName].push(fieldPath);\n}\n\n/**\n * Adds a field to the order array considering explicit order values\n */\nfunction addToOrder(order: string[], fieldPath: string, explicitOrder?: number): void {\n if (explicitOrder !== undefined) {\n order.splice(explicitOrder, 0, fieldPath);\n } else {\n order.push(fieldPath);\n }\n}\n\n/**\n * Organizes field groups with proper ordering\n */\nfunction organizeFieldGroups(groups: Record<string, string[]>): Record<string, string[]> {\n const organized: Record<string, string[]> = {};\n const groupPriority = ['default', 'Keys & Security', 'Token Settings', 'Custom Fees'];\n\n for (const groupName of groupPriority) {\n if (groups[groupName]) {\n organized[groupName] = groups[groupName];\n }\n }\n\n for (const [groupName, fields] of Object.entries(groups)) {\n if (!groupPriority.includes(groupName)) {\n organized[groupName] = fields;\n }\n }\n\n return organized;\n}\n\n/**\n * Orders fields based on explicit order values and logical grouping\n */\nfunction orderFields(order: string[], fields: Record<string, RenderConfigSchema>): string[] {\n const fieldPriority: Record<string, number> = {\n 'tokenName': 1,\n 'tokenSymbol': 2,\n 'maxSupply': 3,\n 'supplyType': 4,\n 'treasuryAccountId': 5,\n 'memo': 6,\n };\n\n return order.sort((a, b) => {\n const aConfig = fields[a];\n const bConfig = fields[b];\n\n if (aConfig?.ui?.order !== undefined && bConfig?.ui?.order !== undefined) {\n return aConfig.ui.order - bConfig.ui.order;\n }\n\n if (aConfig?.ui?.order !== undefined) {\n return -1;\n }\n if (bConfig?.ui?.order !== undefined) {\n return 1;\n }\n\n const aPriority = fieldPriority[a] || 1000;\n const bPriority = fieldPriority[b] || 1000;\n\n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n\n return a.localeCompare(b);\n });\n}\n\n/**\n * Generates field ordering metadata for complex forms\n */\nexport function generateFieldOrdering(schema: ZodType<unknown>): {\n sections: Record<string, { title: string; fields: string[]; order: number }>;\n fieldOrder: string[];\n} {\n const extracted = extractRenderConfigs(schema);\n const sections: Record<string, { title: string; fields: string[]; order: number }> = {};\n\n const sectionOrder: Record<string, number> = {\n 'default': 0,\n 'Basic Information': 1,\n 'Token Settings': 2,\n 'Keys & Security': 3,\n 'Custom Fees': 4,\n 'Advanced Settings': 5\n };\n\n for (const [groupName, fields] of Object.entries(extracted.groups)) {\n const displayName = groupName === 'default' ? 'Basic Information' : groupName;\n sections[displayName] = {\n title: displayName,\n fields,\n order: sectionOrder[displayName] || 10\n };\n }\n\n return {\n sections,\n fieldOrder: extracted.order\n };\n}\n\n/**\n * Creates a field configuration map for form builders\n */\nexport function createFieldConfigMap(schema: ZodType<unknown>): Record<string, FieldConfigMapEntry> {\n const extracted = extractRenderConfigs(schema);\n const configMap: Record<string, FieldConfigMapEntry> = {};\n\n for (const [fieldPath, renderConfig] of Object.entries(extracted.fields)) {\n const metadata = extracted.metadata[fieldPath];\n const path = fieldPath.split('.');\n\n configMap[fieldPath] = {\n renderConfig,\n metadata,\n path\n };\n }\n\n return configMap;\n}\n\n\n\n\n/**\n * Creates a simplified configuration for basic form rendering\n */\nexport function createSimpleConfig(schema: ZodType<unknown>): {\n fields: Array<SimpleFieldConfig>;\n} {\n const extracted = extractRenderConfigs(schema);\n const fields = [];\n\n for (const fieldPath of extracted.order) {\n const renderConfig = extracted.fields[fieldPath];\n const metadata = extracted.metadata[fieldPath];\n\n if (!renderConfig || !metadata) {\n continue;\n }\n\n fields.push({\n name: fieldPath,\n type: metadata.type,\n label: renderConfig.ui?.label || fieldPath,\n required: metadata.required,\n placeholder: renderConfig.ui?.placeholder,\n options: renderConfig.options || metadata.options\n });\n }\n\n return { fields };\n}","export class CodedError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, CodedError.prototype);\n }\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 HederaMirrorNode,\n} from '@hashgraphonline/standards-sdk';\nimport { SignerProviderRegistry, type NetworkString } from '../../signing/signer-provider';\nimport type { TopicRegistrationResult, RegistryOperationResult, SubmitMessageResult } from '../../types/tx-results';\nimport { CodedError } from '../../utils/CodedError';\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().toString()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n let keyTypeHint: 'ed25519' | 'ecdsa' | undefined;\n try {\n const mirror = new HederaMirrorNode(networkType);\n const info = await mirror.requestAccount(operatorId);\n const t = (info as any)?.key?._type as string | undefined;\n if (t) {\n const upper = t.toUpperCase();\n if (upper.includes('ED25519')) keyTypeHint = 'ed25519';\n else if (upper.includes('ECDSA')) keyTypeHint = 'ecdsa';\n }\n } catch {}\n\n const config: SDKHCS2ClientConfig = {\n network: networkType,\n operatorId: operatorId,\n operatorKey: operatorPrivateKey,\n ...(keyTypeHint ? { keyType: keyTypeHint } : {}),\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<TopicRegistrationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { options };\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const { transactionBytes } = await start('hcs2.createRegistry', request, network);\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError('wallet_submit_failed', `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.createRegistry');\n }\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\n const client = await this.getHCS2Client();\n return await client.createRegistry(options);\n }\n /**\n * Register a new entry in an HCS-2 registry\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions\n ): Promise<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.registerEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.registerEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.registerEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.registerEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.updateEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.updateEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.updateEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.updateEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.deleteEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.deleteEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.deleteEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.deleteEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.migrateRegistry')) {\n const built = await ByteBuildRegistry.build('hcs2.migrateRegistry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { registryTopicId, options };\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const { transactionBytes } = await start('hcs2.migrateRegistry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.migrateRegistry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<SubmitMessageResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.submitMessage')) {\n const built = await ByteBuildRegistry.build('hcs2.submitMessage', this.hederaKit, { topicId, payload });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { topicId, payload };\n const { transactionBytes } = await start('hcs2.submitMessage', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.submitMessage');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\n const client = await this.getHCS2Client();\n await client.submitMessage(topicId, payload);\n return { success: true };\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 HederaMirrorNode,\n TopicResponse,\n} from '@hashgraphonline/standards-sdk';\nimport {\n SignerProviderRegistry,\n type NetworkString,\n} from '../../signing/signer-provider';\nimport type {\n HCS6TopicRegistrationResult,\n HCS6RegistryOperationResult,\n HCS6CreateHashinalResult,\n} from '../../types/tx-results';\nimport { CodedError } from '../../utils/CodedError';\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().toString()\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<HCS6TopicRegistrationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { options };\n const { transactionBytes } = await start(\n 'hcs6.createRegistry',\n request,\n network\n );\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.createRegistry'\n );\n }\n }\n\n const client = await this.getHCS6Client();\n const sanitized = { ...options };\n if ('adminKey' in sanitized) {\n delete (sanitized as any).adminKey;\n }\n return await client.createRegistry(sanitized);\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<HCS6RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { registryTopicId, options };\n const { transactionBytes } = await start(\n 'hcs6.registerEntry',\n request,\n network\n );\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.registerEntry'\n );\n }\n }\n\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 const metadata = {\n name: options.metadata?.name || 'Dynamic Hashinal',\n creator:\n options.metadata?.creator ||\n this.hederaKit.signer.getAccountId().toString(),\n description: options.metadata?.description || 'Dynamic hashinal metadata',\n type: options.metadata?.type || 'json',\n ...options.metadata,\n } as Record<string, unknown>;\n\n return await client.createHashinal({\n ...options,\n metadata,\n });\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 const metadata = {\n name: options.metadata?.name || 'Dynamic Hashinal',\n creator:\n options.metadata?.creator ||\n this.hederaKit.signer.getAccountId().toString(),\n description:\n options.metadata?.description || 'Dynamic hashinal registration',\n type: options.metadata?.type || 'json',\n ...options.metadata,\n } as Record<string, unknown>;\n\n return await client.register({\n ...options,\n metadata,\n });\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<HCS6RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { topicId, payload };\n const { transactionBytes } = await start(\n 'hcs6.submitMessage',\n request,\n network\n );\n if (transactionBytes) {\n return {\n success: true,\n transactionBytes,\n } as unknown as HCS6RegistryOperationResult;\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.submitMessage'\n );\n }\n }\n\n const client = await this.getHCS6Client();\n return (await client.submitMessage(\n topicId,\n payload\n )) as unknown as HCS6RegistryOperationResult;\n }\n\n /**\n * Get topic info from mirror node\n */\n async getTopicInfo(topicId: string): Promise<TopicResponse> {\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = new HederaMirrorNode(networkType);\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}\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 getTopicId,\n} from '@hashgraphonline/standards-sdk';\nimport { InscriptionResult, InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport type { AgentOperationalMode } from 'hedera-agent-kit';\n\n/**\n * Type definition for DAppSigner interface compatible with inscription SDK\n */\ninterface DAppSigner {\n getAccountId(): { toString(): string };\n [key: string]: unknown;\n}\n\nexport interface PendingInscriptionResponse {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface CompletedInscriptionResponse {\n confirmed?: boolean;\n result?: InscriptionResult;\n inscription?: RetrievedInscriptionResult;\n jsonTopicId?: string;\n network?: string;\n}\n/**\n * Builder for Inscription operations\n */\nexport class InscriberBuilder extends BaseServiceBuilder {\n protected inscriptionSDK?: InscriptionSDK;\n private static signerProvider?: () =>\n | Promise<DAppSigner | null>\n | DAppSigner\n | null;\n private static walletInfoResolver?: () =>\n | Promise<{ accountId: string; network: 'mainnet' | 'testnet' } | null>\n | { accountId: string; network: 'mainnet' | 'testnet' }\n | null;\n\n private static startInscriptionDelegate?: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<PendingInscriptionResponse | CompletedInscriptionResponse>;\n private static walletExecutor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>;\n /** When true, do not allow server fallback; require a wallet path in Provide Bytes */\n private static preferWalletOnly = false;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n public getOperationalMode(): AgentOperationalMode {\n return this.hederaKit.operationalMode as AgentOperationalMode;\n }\n\n static setSignerProvider(\n provider: () => Promise<DAppSigner | null> | DAppSigner | null\n ): void {\n InscriberBuilder.signerProvider = provider;\n }\n\n static setWalletInfoResolver(\n resolver: () =>\n | Promise<{ accountId: string; network: 'mainnet' | 'testnet' } | null>\n | { accountId: string; network: 'mainnet' | 'testnet' }\n | null\n ): void {\n InscriberBuilder.walletInfoResolver = resolver;\n }\n\n static setStartInscriptionDelegate(\n delegate: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<PendingInscriptionResponse | CompletedInscriptionResponse>\n ): void {\n InscriberBuilder.startInscriptionDelegate = delegate;\n }\n\n static setWalletExecutor(\n executor: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ): void {\n InscriberBuilder.walletExecutor = executor;\n }\n\n /**\n * Control fallback behavior. When true, wallet must be available for execution paths.\n */\n static setPreferWalletOnly(flag: boolean): void {\n InscriberBuilder.preferWalletOnly = !!flag;\n }\n\n async getSigner(): Promise<DAppSigner | null> {\n const provider = InscriberBuilder.signerProvider;\n if (!provider) return null;\n try {\n const maybe = provider();\n return maybe && typeof (maybe as Promise<unknown>).then === 'function'\n ? await (maybe as Promise<DAppSigner | null>)\n : (maybe as DAppSigner | null);\n } catch {\n return null;\n }\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(\n input,\n signer as unknown as Parameters<typeof inscribeWithSigner>[1],\n options\n );\n }\n\n async inscribeAuto(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n const signer = await this.getSigner();\n if (signer) {\n return this.inscribeWithSigner(input, signer, options);\n }\n\n type WalletInfo = { accountId: string; network: 'mainnet' | 'testnet' };\n\n type WalletExecutorResponse = { transactionId: string };\n\n const infoMaybe: WalletInfo | null = InscriberBuilder.walletInfoResolver\n ? await InscriberBuilder.walletInfoResolver()\n : null;\n\n if (InscriberBuilder.preferWalletOnly && !infoMaybe) {\n const err = new Error(\n 'Wallet unavailable: connect a wallet or switch to autonomous mode'\n );\n (err as unknown as { code: string }).code = 'wallet_unavailable';\n throw err;\n }\n\n if (\n infoMaybe &&\n InscriberBuilder.startInscriptionDelegate &&\n InscriberBuilder.walletExecutor\n ) {\n const holderId = infoMaybe.accountId;\n const network: 'mainnet' | 'testnet' = infoMaybe.network;\n\n type InscriptionOptionsExt = InscriptionOptions & {\n fileStandard?: string;\n chunkSize?: number;\n jsonFileURL?: string;\n metadata?: Record<string, unknown> & {\n creator?: string;\n description?: string;\n };\n };\n const ext = options as InscriptionOptionsExt;\n\n const baseRequest: Record<string, unknown> = {\n holderId,\n metadata: ext.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n };\n if (typeof ext.fileStandard !== 'undefined') {\n (baseRequest as { fileStandard?: string }).fileStandard =\n ext.fileStandard;\n }\n if (typeof ext.chunkSize !== 'undefined') {\n (baseRequest as { chunkSize?: number }).chunkSize = ext.chunkSize;\n }\n\n let request: Record<string, unknown> = { ...baseRequest };\n switch (input.type) {\n case 'url':\n request = { ...baseRequest, file: { type: 'url', url: input.url } };\n break;\n case 'file':\n request = {\n ...baseRequest,\n file: { type: 'path', path: input.path },\n };\n break;\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n (request as { metadataObject?: unknown }).metadataObject = ext.metadata;\n (request as { creator?: string }).creator =\n ext.metadata?.creator || holderId;\n (request as { description?: string }).description =\n ext.metadata?.description;\n if (typeof ext.jsonFileURL === 'string' && ext.jsonFileURL.length > 0) {\n (request as { jsonFileURL?: string }).jsonFileURL = ext.jsonFileURL;\n }\n }\n\n const start = await InscriberBuilder.startInscriptionDelegate(\n request,\n network\n );\n\n const completedStart = start as CompletedInscriptionResponse;\n const isCompletedResponse =\n Boolean(completedStart?.inscription) && completedStart?.confirmed;\n\n if (isCompletedResponse) {\n const completed = start as {\n confirmed?: boolean;\n result?: unknown;\n inscription?: unknown;\n };\n this.logger.info(\n 'inscription already completed, short circuiting',\n start\n );\n return {\n quote: false,\n confirmed: completed.confirmed === true,\n result: completed.result as InscriptionResult,\n inscription: completed.inscription,\n } as unknown as InscriptionResponse;\n }\n\n const startResponse = start as {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n };\n\n if (!startResponse || !startResponse.transactionBytes) {\n throw new Error('Failed to start inscription (no transaction bytes)');\n }\n\n const exec: WalletExecutorResponse =\n await InscriberBuilder.walletExecutor(\n startResponse.transactionBytes,\n network\n );\n const transactionId = exec?.transactionId || '';\n\n const shouldWait = options.quoteOnly\n ? false\n : options.waitForConfirmation ?? true;\n if (shouldWait) {\n this.logger.debug('Will be retrieving inscription');\n const maxAttempts =\n (options as { waitMaxAttempts?: number }).waitMaxAttempts ?? 60;\n const intervalMs =\n (options as { waitIntervalMs?: number }).waitIntervalMs ?? 5000;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const retrieved: RetrievedInscriptionResult =\n await this.retrieveInscription(transactionId, options);\n const topicIdFromInscription: string | undefined = getTopicId(\n retrieved as unknown\n );\n const topicId: string | undefined =\n topicIdFromInscription ?? startResponse.topic_id;\n const status: string | undefined = (\n retrieved as { status?: string }\n ).status;\n const isDone = status === 'completed' || !!topicId;\n if (isDone) {\n const resultConfirmed: InscriptionResponse = {\n quote: false,\n confirmed: true,\n result: {\n jobId: startResponse.tx_id || '',\n transactionId,\n topicId,\n },\n inscription: retrieved,\n } as unknown as InscriptionResponse;\n this.logger.debug(\n 'retrieved inscription',\n resultConfirmed,\n retrieved\n );\n return resultConfirmed;\n }\n } catch {}\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n const partial: InscriptionResponse = {\n quote: false,\n confirmed: false,\n result: {\n jobId: startResponse.tx_id || '',\n transactionId,\n status: startResponse.status,\n completed: startResponse.completed,\n },\n inscription: startResponse.topic_id\n ? { topic_id: startResponse.topic_id }\n : undefined,\n } as unknown as InscriptionResponse;\n return partial;\n }\n\n if (InscriberBuilder.preferWalletOnly) {\n const err = new Error(\n 'Wallet unavailable: connect a wallet or switch to autonomous mode'\n );\n (err as unknown as { code: string }).code = 'wallet_unavailable';\n throw err;\n }\n return this.inscribe(input, 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}\n","import type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n AccountId,\n Client,\n TopicCreateTransaction,\n TopicId,\n TopicMessageSubmitTransaction,\n TransactionId,\n} from '@hashgraph/sdk';\nimport {\n buildHcs2CreateRegistryTx,\n buildHcs2RegisterTx,\n buildHcs2UpdateTx,\n buildHcs2DeleteTx,\n buildHcs2MigrateTx,\n HCS2RegistryType,\n buildHcs6CreateRegistryTx,\n buildHcs6RegisterEntryTx,\n buildHcs10SendMessageTx,\n buildHcs10SubmitConnectionRequestTx,\n buildHcs20DeployTx,\n buildHcs20MintTx,\n buildHcs20TransferTx,\n buildHcs20BurnTx,\n buildHcs20RegisterTx,\n buildHcs12CreateRegistryTopicTx,\n buildHcs12SubmitMessageTx,\n buildHcs12RegisterAssemblyTx,\n buildHcs12AddBlockToAssemblyTx,\n buildHcs12AddActionToAssemblyTx,\n buildHcs12UpdateAssemblyTx,\n buildHcs7SubmitMessageTx,\n buildHcs7EvmMessageTx,\n buildHcs7WasmMessageTx,\n} from '@hashgraphonline/standards-sdk';\n\nexport type ByteBuildHandler = (ctx: {\n hederaKit: HederaAgentKit;\n request: Record<string, unknown>;\n}) => Promise<{ transactionBytes: string }>;\n\nclass ByteBuildRegistryImpl {\n private handlers = new Map<string, ByteBuildHandler>();\n\n register(op: string, handler: ByteBuildHandler): void {\n this.handlers.set(op, handler);\n }\n\n has(op: string): boolean {\n return this.handlers.has(op);\n }\n\n async build(\n op: string,\n hederaKit: HederaAgentKit,\n request: Record<string, unknown>\n ): Promise<{ transactionBytes: string } | null> {\n const h = this.handlers.get(op);\n if (!h) return null;\n return await h({ hederaKit, request });\n }\n}\n\nexport const ByteBuildRegistry = new ByteBuildRegistryImpl();\n\nasync function freezeTxToBytes(\n hederaKit: HederaAgentKit,\n tx: any,\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n if (typeof tx.setTransactionId === 'function') {\n tx.setTransactionId(TransactionId.generate(payer));\n }\n if (typeof tx.setAutoRenewAccountId === 'function') {\n try { tx.setAutoRenewAccountId(operatorId); } catch {}\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nasync function buildTopicCreateBytes(\n hederaKit: HederaAgentKit,\n memo: string,\n ttlSeconds?: number\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n\n let tx = new TopicCreateTransaction()\n .setTransactionId(TransactionId.generate(payer))\n .setTopicMemo(memo);\n if (ttlSeconds && Number.isFinite(ttlSeconds)) {\n try {\n tx = tx.setAutoRenewPeriod(ttlSeconds);\n } catch {}\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nasync function buildTopicMessageBytes(\n hederaKit: HederaAgentKit,\n topicId: string,\n message: string | Uint8Array,\n memo?: string\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n const tx = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(topicId))\n .setTransactionId(TransactionId.generate(payer))\n .setMessage(message);\n if (memo && memo.length > 0) {\n tx.setTransactionMemo(memo);\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nByteBuildRegistry.register(\n 'hcs2.createRegistry',\n async ({ hederaKit, request }) => {\n const opts = (request?.options || {}) as {\n registryType?: number;\n ttl?: number;\n adminKey?: string | boolean;\n submitKey?: string | boolean;\n };\n\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: (opts.registryType ?? HCS2RegistryType.INDEXED) as any,\n ttl: opts.ttl ?? 86400,\n adminKey: opts.adminKey as any,\n submitKey: opts.submitKey as any,\n operatorPublicKey,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs2.migrateRegistry',\n async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.migrateRegistry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.migrateRegistry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2MigrateTx({\n registryTopicId,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null;\n}\nfunction getStringProp(\n obj: Record<string, unknown>,\n key: string\n): string | undefined {\n const val = obj[key];\n return typeof val === 'string' ? val : undefined;\n}\nfunction getNumberProp(\n obj: Record<string, unknown>,\n key: string\n): number | undefined {\n const val = obj[key];\n return typeof val === 'number' && Number.isFinite(val) ? val : undefined;\n}\nfunction getObjectProp(\n obj: Record<string, unknown>,\n key: string\n): Record<string, unknown> | undefined {\n const val = obj[key];\n return isRecord(val) ? val : undefined;\n}\n\nByteBuildRegistry.register(\n 'hcs2.submitMessage',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs2.submitMessage: invalid request payload');\n const topicId =\n getStringProp(request, 'topicId') ||\n getStringProp(request, 'registryTopicId') ||\n '';\n if (!topicId) throw new Error('hcs2.submitMessage: topicId is required');\n const payload = request['payload'];\n const message =\n typeof payload === 'string' ? payload : JSON.stringify(payload ?? {});\n return await buildTopicMessageBytes(hederaKit, topicId, message);\n }\n);\n\nByteBuildRegistry.register('hcs2.registerEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.registerEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.registerEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2RegisterTx({\n registryTopicId,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs2.updateEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.updateEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.updateEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const uid = getStringProp(options, 'uid') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2UpdateTx({\n registryTopicId,\n uid,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs2.deleteEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.deleteEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.deleteEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const uid = getStringProp(options, 'uid') || '';\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2DeleteTx({\n registryTopicId,\n uid,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register(\n 'hcs6.createRegistry',\n async ({ hederaKit, request }) => {\n const opts = isRecord(request) ? getObjectProp(request, 'options') : undefined;\n const ttl = opts ? getNumberProp(opts, 'ttl') : undefined;\n\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n\n const tx = buildHcs6CreateRegistryTx({ ttl: ttl ?? 86400, operatorPublicKey });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs6.registerEntry',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs6.registerEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId)\n throw new Error('hcs6.registerEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs6RegisterEntryTx({\n registryTopicId,\n targetTopicId,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs6.submitMessage',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs6.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs6.submitMessage: topicId is required');\n const payload = request['payload'];\n const message =\n typeof payload === 'string' ? payload : JSON.stringify(payload ?? {});\n return await buildTopicMessageBytes(hederaKit, topicId, message);\n }\n);\n\nByteBuildRegistry.register('sendMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('sendMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('sendMessage: topicId is required');\n const dataVal = request['data'];\n const memo = getStringProp(request, 'memo') || '';\n const operatorId = hederaKit.signer.getAccountId().toString();\n const data = typeof dataVal === 'string' ? dataVal : JSON.stringify(dataVal ?? {});\n const tx = buildHcs10SendMessageTx({ connectionTopicId: topicId, operatorId, data, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register(\n 'submitConnectionRequest',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('submitConnectionRequest: invalid request payload');\n const inboundTopicId = getStringProp(request, 'inboundTopicId') || '';\n if (!inboundTopicId)\n throw new Error('submitConnectionRequest: inboundTopicId is required');\n const memo = getStringProp(request, 'memo') || '';\n const operatorId = hederaKit.signer.getAccountId().toString();\n const tx = buildHcs10SubmitConnectionRequestTx({ inboundTopicId, operatorId, memo });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register('hcs20.deploy', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.deploy: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.deploy: topicId is required');\n const name = getStringProp(request, 'name') || '';\n const tick = getStringProp(request, 'tick') || '';\n const max = getStringProp(request, 'max') || '';\n const lim = getStringProp(request, 'lim');\n const metadata = getStringProp(request, 'metadata');\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20DeployTx({ topicId, name, tick, max, lim, metadata, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.mint', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.mint: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.mint: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const to = getStringProp(request, 'to') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20MintTx({ topicId, tick, amt, to, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.transfer', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.transfer: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.transfer: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const from = getStringProp(request, 'from') || '';\n const to = getStringProp(request, 'to') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20TransferTx({ topicId, tick, amt, from, to, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.burn', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.burn: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.burn: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const from = getStringProp(request, 'from') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20BurnTx({ topicId, tick, amt, from, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.register', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.register: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs20.register: registryTopicId is required');\n const topicId = getStringProp(request, 'topicId') || '';\n const name = getStringProp(request, 'name') || '';\n const isPrivateVal = (request as any)['isPrivate'];\n const isPrivate = typeof isPrivateVal === 'boolean' ? isPrivateVal : false;\n const metadata = getStringProp(request, 'metadata');\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20RegisterTx({ registryTopicId, name, topicId, isPrivate, metadata, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.createRegistry', async ({ hederaKit, request }) => {\n const opts = isRecord(request) ? getObjectProp(request, 'options') : undefined;\n const ttlVal = opts ? getNumberProp(opts, 'ttl') : undefined;\n const ttl = (ttlVal ?? 60) as number;\n const registry = (opts && getStringProp(opts, 'registry')) || 'hashlinks';\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n const tx = buildHcs12CreateRegistryTopicTx({ registry: registry as any, ttl, operatorPublicKey });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.submitMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs12.submitMessage: topicId is required');\n const payload = (request as any)['payload'];\n const tx = buildHcs12SubmitMessageTx({ topicId, payload: payload as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.registerAssembly', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.registerAssembly: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.registerAssembly: assemblyTopicId is required');\n const registration = getObjectProp(request, 'registration') || {};\n const tx = buildHcs12RegisterAssemblyTx({ assemblyTopicId, registration: registration as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.addBlock', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.addBlock: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.addBlock: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12AddBlockToAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.addAction', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.addAction: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.addAction: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12AddActionToAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.updateAssembly', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.updateAssembly: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.updateAssembly: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12UpdateAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.submitMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.submitMessage: topicId is required');\n const message = getObjectProp(request, 'message') || {};\n const tx = buildHcs7SubmitMessageTx({ topicId, message: message as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.evm', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.evm: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.evm: topicId is required');\n const config = getObjectProp(request, 'config') || {};\n const tx = buildHcs7EvmMessageTx({ topicId, config: config as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.wasm', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.wasm: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.wasm: topicId is required');\n const config = getObjectProp(request, 'config') || {};\n const tx = buildHcs7WasmMessageTx({ topicId, config: config as any });\n return await freezeTxToBytes(hederaKit, tx);\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\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 as any\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\n this.setClient(options.accountId, options.privateKey);\n\n const operatorId = this.getOperatorId();\n\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\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 const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n const logger = Logger.getInstance({\n level: config.logLevel || 'info',\n silent: shouldSilence,\n });\n\n let network: 'mainnet' | 'testnet';\n if (networkEnv === 'mainnet') {\n network = 'mainnet';\n } else if (networkEnv === 'testnet') {\n network = 'testnet';\n } else {\n logger.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 stateManager =\n options?.stateManager ||\n new OpenConvaiState({\n defaultEnvFilePath: ENV_FILE_PATH,\n defaultPrefix: 'TODD',\n });\n logger.info('State manager initialized');\n\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 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 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};","import { z } from 'zod';\n\n/**\n * Interface for tools that can provide custom form validation logic\n */\nexport interface FormValidatable {\n /**\n * Determines if a form should be generated for the given input\n * @param input The input data to validate\n * @returns true if a form should be generated, false if the tool can execute\n */\n shouldGenerateForm(input: unknown): boolean;\n\n /**\n * Returns the schema to use for form generation\n * This allows tools to provide a focused schema for forms\n * @returns The schema to use for generating forms\n */\n getFormSchema(): z.ZodSchema;\n\n /**\n * Defines which fields are essential for this tool\n * Essential fields are always shown in forms even if marked as optional\n * @returns Array of field names that are essential for user experience\n */\n getEssentialFields(): string[];\n\n /**\n * Determines if a field value should be considered empty\n * Allows tools to define custom empty logic for their specific data types\n * @param fieldName The name of the field\n * @param value The value to check\n * @returns true if the field should be considered empty\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean;\n}\n\n/**\n * Type guard to check if a tool implements FormValidatable\n */\nexport function isFormValidatable(tool: unknown): tool is FormValidatable {\n return (\n tool !== null &&\n typeof tool === 'object' &&\n 'shouldGenerateForm' in tool &&\n 'getFormSchema' in tool &&\n 'getEssentialFields' in tool &&\n 'isFieldEmpty' in tool &&\n typeof (tool as FormValidatable).shouldGenerateForm === 'function' &&\n typeof (tool as FormValidatable).getFormSchema === 'function' &&\n typeof (tool as FormValidatable).getEssentialFields === 'function' &&\n typeof (tool as FormValidatable).isFieldEmpty === 'function'\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","logger","Logger","module","SendMessageToConnectionZodSchema","targetIdentifier","connectionId","agentId","message","disableMonitoring","default","SendMessageToConnectionTool","Error","connectionsManager","getConnectionsManager","currentAgent","getCurrentAgent","fetchConnectionData","error","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","isWalletBytesResponse","value","transactionBytes","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","contentResolver","getContentResolver","setEntityCreationHandler","handler","onEntityCreated","generateInscriptionQuote","options","quoteOptions","quoteOnly","network","client","inscribe","quote","confirmed","BaseInscriberQueryTool","getStringProp","obj","key","trim","extractTopicIds","inscription","jsonTopicId","buildInscriptionLinks","ids","fileStandard","chosen","hrl","cdnUrl","inscribeFromUrlSchema","mode","chunkSize","waitForConfirmation","timeoutMs","apiKey","inscribeFromFileSchema","filePath","handleDirectContent","providedMimeType","providedFileName","test","buffer","globalThis","Buffer","fileName","wasReference","contentRefSchema","DEFAULT_CONFIG","maxInscriptionSize","minContentSize","logLevel","loadConfig","env","REF_MAX_SIZE","REF_MIN_SIZE","REF_LOG_LEVEL","enableContentValidation","REF_ENABLE_VALIDATION","inscribeFromBufferSchema","base64Data","hip412FileSchema","uri","checksum","is_default_file","hip412AttributeSchema","trait_type","display_type","hip412MetadataSchema","creatorDID","format","files","attributes","generateDefaultMetadata","defaultName","defaultType","operatorAccount","charAt","slice","extendZodSchema","schema","extendedSchema","withRender","config","newSchema","create","currentConfig","_renderConfig","mergedConfig","ui","progressive","block","withProgressive","withBlock","priority","group","fieldType","inferFieldTypeFromSchema","blockId","id","reusable","hasRenderConfig","Boolean","getRenderConfig","typeName","_def","stringChecks","checks","check","kind","innerType","extractOptionsFromSchema","values","map","label","enumObject","unionOptions","option","push","String","isOptionalSchema","getInnerSchema","extractValidationConstraints","innerSchema","constraints","minLength","maxLength","pattern","step","def","minItems","maxItems","getDefaultValue","defaultValue","innerTypeName","shape","defaultObj","extractFieldMetadata","required","validation","RegExp","renderConfigs","placeholder","select","textarea","rows","props","currency","symbol","itemLabel","essential","advanced","expert","createInscriptionError","details","suggestions","title","HASHLINK_BLOCK_CONFIG","testnet","hashLink","template","mainnet","inscribeHashinalSchema","contentRef","jsonFileURL","withHashLinkBlocks","renderForm","retrieveInscriptionSchema","transactionId","ENV_FILE_PATH","join","cwd","OpenConvaiState","connectionMessageTimestamps","defaultEnvFilePath","defaultPrefix","shouldSilence","disableLogging","DISABLE_LOGGING","silent","baseClient","initializeConnectionsManager","ConnectionsManager","agent","clearAll","addActiveConnection","connection","sdkConnection","targetAgentName","targetInboundTopicId","convertConnectionStatus","created","lastActivity","profileInfo","connectionRequestId","processed","updateOrAddConnection","initializeTimestampIfNeeded","getAllConnections","convertToActiveConnection","getConnectionByIdentifier","identifier","numericIndex","isNaN","byTopicId","getConnectionByTopicId","byAccountId","getConnectionByAccountId","getLastTimestamp","updateTimestamp","timestampNanos","convertToStateStatus","envFilePath","updates","async","variables","envContent","fs","existsSync","readFileSync","updatedLines","lineIndex","findIndex","line","writeFileSync","updateEnvFile","_SignerProviderRegistry","setSignerProvider","provider","_signerProvider","getSigner","p","then","setWalletInfoResolver","resolver","_walletInfoResolver","getWalletInfo","setWalletExecutor","executor","_walletExecutor","walletExecutor","setStartHCSDelegate","delegate","_startHCSDelegate","startHCSDelegate","setPreferWalletOnly","flag","_preferWalletOnly","setBrowserHCSClientFactory","factory","_browserHCSClientFactory","getBrowserHCSClient","preferWalletOnly","SignerProviderRegistry","NOT_INITIALIZED_ERROR","HCS10Builder","BaseServiceBuilder","hederaKit","operatorId","signer","getAccountId","operatorPrivateKey","getOperatorPrivateKey","toStringRaw","sdkLogger","SDKLogger","level","info","warn","trace","setLogLevel","getLevel","setSilent","setModule","standardClient","HCS10Client","getOperatorId","operator","getClient","operatorAccountId","getNetwork","getAccountAndSigner","getInboundTopicId","profileResponse","getAgentProfile","topicInfo","inboundTopic","detailedMessage","submitConnectionRequest","start","exec","preferWallet","ByteBuildRegistry","Promise","resolve","bytesRegistry","has","built","build","request","err","handleConnectionRequest","requestingAccountId","feeConfig","sendMessage","stringify","prevMaxSeq","getMessages","messages","reduce","m","sequence_number","sequenceNumber","pollForNewSequence","receipt","messageResponse","topicSequenceNumber","toNumber","mappedMessages","sdkMessage","timestamp","getTime","sort","a","b","getMessageStream","getMessageContent","inscriptionIdOrData","getStandardClient","loadProfilePicture","response","axios","get","responseType","urlPathname","URL","pathname","basename","prevMax","i","maxSeq","msg","setTimeout","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","clearNotes","operationalMode","profilePictureData","registrationData","feeConfigBuilder","FeeConfigBuilder","collectorAccountId","addNote","effectiveExemptIds","addHbarFee","browserClient","aBuilder","resp","progressCallback","_","updateAccountMemo","executeResult","scheduleId","walletErr","agentMetadata","targetProfile","connectionRequestSent","monitoringEnabled","getPendingRequests","getConnectionsNeedingConfirmation","uniqueRequestKey","inboundRequestId","confirmationResult","established","c","profileError","newConnection","markConnectionRequestProcessed","feeConfigured","sendHCS10Message","parts","accountIdWithPrefix","index","availableIds","errorMsg","baseSeq","messageResult","effectiveSeq","reply","monitorResponses","attempts","operator_id","startPassiveConnectionMonitoring","endTime","connectionRequestsFound","acceptedConnections","processedRequestIds","connectionRequests","op","fee","addTokenFee","pendingRequests","allRequests","requests","toISOString","viewRequest","rejectRequest","originTopicId","rejectedRequest","unapprovedRequests","requestId","fromAccountId","req","count","getEnhancedConnections","activeConnections","pendingConnections","output","formatConnection","activeCount","pendingCount","needsConfirmationCount","display_name","substring","toLocaleString","connectionManager","lastProcessedTimestamp","allMessages","messagesToProcess","latestTimestampNanos","isFetchingLatest","maxTs","outputString","processedMessages","content","displayContent","registrations","formattedRegistrations","reg","registration","profile","outboundTopic","social","keys","notes","HbarPricePlugin","BasePlugin","arguments","version","author","tools","initialize","context","initializeTools","HederaGetHbarPriceTool","getTools","extractRenderConfigs","fields","groups","extractFromSchema","organizeFieldGroups","orderFields","pathPrefix","addToGroup","addToOrder","fieldSchema","extractFromObjectSchema","elementSchema","extractFromArraySchema","extractFromPrimitiveSchema","groupName","fieldPath","explicitOrder","splice","organized","groupPriority","fieldPriority","tokenName","tokenSymbol","maxSupply","supplyType","treasuryAccountId","aConfig","bConfig","aPriority","bPriority","localeCompare","CodedError","setPrototypeOf","prototype","HCS2Builder","getHCS2Client","hcs2Client","networkType","keyTypeHint","mirror","HederaMirrorNode","requestAccount","t","_type","upper","operatorKey","keyType","HCS2Client","createRegistry","hasPrivateKey","registerEntry","updateEntry","deleteEntry","migrateRegistry","getRegistry","submitMessage","payload","getTopicInfo","close","HCS6Builder","getHCS6Client","hcs6Client","HCS6Client","sanitized","createHashinal","register","_InscriberBuilder","getOperationalMode","signerProvider","walletInfoResolver","setStartInscriptionDelegate","startInscriptionDelegate","maybe","getInscriptionSDK","_options","clientConfig","inscribeWithSigner","inscribeAuto","infoMaybe","holderId","ext","baseRequest","file","metadataObject","completedStart","completed","startResponse","maxAttempts","waitMaxAttempts","intervalMs","waitIntervalMs","attempt","retrieved","retrieveInscription","getTopicId","topic_id","resultConfirmed","jobId","tx_id","inscriptionSDK","InscriberBuilder","handlers","Map","set","h","freezeTxToBytes","tx","Client","forMainnet","forTestnet","payer","AccountId","fromString","setTransactionId","TransactionId","generate","setAutoRenewAccountId","frozen","freezeWith","toBytes","buildTopicMessageBytes","TopicMessageSubmitTransaction","setTopicId","TopicId","setMessage","isRecord","x","getNumberProp","Number","isFinite","getObjectProp","opts","operatorPublicKey","priv","publicKey","buildHcs2CreateRegistryTx","INDEXED","buildHcs2MigrateTx","buildHcs2RegisterTx","buildHcs2UpdateTx","buildHcs2DeleteTx","buildHcs6CreateRegistryTx","buildHcs6RegisterEntryTx","dataVal","buildHcs10SendMessageTx","buildHcs10SubmitConnectionRequestTx","tick","lim","buildHcs20DeployTx","amt","to","buildHcs20MintTx","buildHcs20TransferTx","buildHcs20BurnTx","isPrivateVal","isPrivate","buildHcs20RegisterTx","registry","buildHcs12CreateRegistryTopicTx","buildHcs12SubmitMessageTx","assemblyTopicId","buildHcs12RegisterAssemblyTx","operation","buildHcs12AddBlockToAssemblyTx","buildHcs12AddActionToAssemblyTx","buildHcs12UpdateAssemblyTx","buildHcs7SubmitMessageTx","buildHcs7EvmMessageTx","buildHcs7WasmMessageTx","_runManager","txBytes","pendingApproval","normalizeKey","lc","errorMessage","StandardSDKClient","guardedRegistryBaseUrl","registryUrl","useEncryption","waitForConnectionConfirmation","delayMs","agentChannels","getOutboundTopicId","setClient","validateOperator","isValid","initializeWithValidation","validationResult","typed","resolvedContent","trimmedInput","ContentResolverRegistry","getResolver","referenceId","extractReferenceId","resolution","resolveReference","resolveContent","validateContent","validationError","resolvedMimeType","resolvedFileName","totalCostHbar","validUntil","breakdown","contentInfo","sizeBytes","toFixed","executeInscription","formatInscriptionResult","validateInput","maxSizeKB","round","bufferSizeKB","contentStr","inscriptionData","timeoutPromise","reject","race","fileContent","stats","stat","isFile","readFile","getMimeType","inscriptionResult","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","getEntityResolutionPreferences","_schemaWithRenderConfig","baseSchema","schemaWithRender","shouldGenerateForm","inputObj","inputKeys","hasContent","renderFormProvided","renderFormValue","isNonEmptyString","v","getFormSchema","rawMetadata","validatedMetadata","ZodError","issues","errors","validateHIP412Metadata","inputData","createInscriptionQuote","successResponse","standard","nextSteps","primary","mintingMetadata","createInscriptionSuccess","createHashLinkBlock","hashLinkBlock","d","createInscriptionPending","_mimeType","clientNetwork","cdnNetwork","getHashLinkBlockId","getEssentialFields","isFieldEmpty","fieldName","attr","latestEntry","t_id","sequence","typeVal","isIndexed","totalEntries","entry","inscriptionTopicId","inscriptionId","chunks","createdAt","completedAt","fileUrl","fileSize","extracted","configMap","renderConfig","fieldGroup","groupConfig","sections","sectionOrder","displayName","fieldOrder","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","ZodType","tool"],"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/types/tx-results.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/utils/inscription-utils.ts","../../src/tools/inscriber/InscribeFromUrlTool.ts","../../src/tools/inscriber/InscribeFromFileTool.ts","../../src/utils/content-resolver.ts","../../src/validation/content-ref-schemas.ts","../../src/config/ContentReferenceConfig.ts","../../src/tools/inscriber/InscribeFromBufferTool.ts","../../src/validation/hip412-schemas.ts","../../src/utils/metadata-defaults.ts","../../src/lib/zod-render/schema-extension.ts","../../src/types/inscription-response.ts","../../src/tools/inscriber/InscribeHashinalTool.ts","../../src/tools/inscriber/RetrieveInscriptionTool.ts","../../src/utils/state-tools.ts","../../src/state/open-convai-state.ts","../../src/signing/signer-provider.ts","../../src/builders/hcs10/hcs10-builder.ts","../../src/plugins/hedera/HbarPricePlugin.ts","../../src/lib/zod-render/config-extractor.ts","../../src/utils/CodedError.ts","../../src/builders/hcs2/hcs2-builder.ts","../../src/builders/hcs6/hcs6-builder.ts","../../src/builders/inscriber/inscriber-builder.ts","../../src/signing/bytes-registry.ts","../../src/hcs10/HCS10Client.ts","../../src/init/init.ts","../../src/interfaces/FormValidatable.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 * Valid input types for parsing tags or capabilities\n */\ntype ParseInput = string | number[] | string[] | AIAgentCapability[];\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\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': [AIAgentCapability.IMAGE_GENERATION],\n 'picture': [AIAgentCapability.IMAGE_GENERATION],\n 'visual': [AIAgentCapability.IMAGE_GENERATION],\n 'photo': [AIAgentCapability.IMAGE_GENERATION],\n\n 'audio': [AIAgentCapability.AUDIO_GENERATION],\n 'sound': [AIAgentCapability.AUDIO_GENERATION],\n 'voice': [AIAgentCapability.AUDIO_GENERATION],\n 'speech': [AIAgentCapability.AUDIO_GENERATION],\n\n 'video': [AIAgentCapability.VIDEO_GENERATION],\n 'movie': [AIAgentCapability.VIDEO_GENERATION],\n 'animation': [AIAgentCapability.VIDEO_GENERATION],\n\n 'code': [AIAgentCapability.CODE_GENERATION],\n 'programming': [AIAgentCapability.CODE_GENERATION],\n 'development': [AIAgentCapability.CODE_GENERATION],\n 'coding': [AIAgentCapability.CODE_GENERATION],\n\n 'translate': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'translation': [AIAgentCapability.LANGUAGE_TRANSLATION],\n 'language': [AIAgentCapability.LANGUAGE_TRANSLATION],\n\n 'summarize': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'summary': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extract': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n 'extraction': [AIAgentCapability.SUMMARIZATION_EXTRACTION],\n\n 'knowledge': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'search': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'retrieve': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n 'lookup': [AIAgentCapability.KNOWLEDGE_RETRIEVAL],\n\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': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'trading': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'finance': [AIAgentCapability.MARKET_INTELLIGENCE],\n 'financial': [AIAgentCapability.MARKET_INTELLIGENCE],\n\n 'analytics': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analysis': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'analyze': [AIAgentCapability.TRANSACTION_ANALYTICS],\n 'transactions': [AIAgentCapability.TRANSACTION_ANALYTICS],\n\n 'audit': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n 'smart contract': [AIAgentCapability.SMART_CONTRACT_AUDIT],\n\n 'governance': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'voting': [AIAgentCapability.GOVERNANCE_FACILITATION],\n 'dao': [AIAgentCapability.GOVERNANCE_FACILITATION],\n\n 'security': [AIAgentCapability.SECURITY_MONITORING],\n 'monitoring': [AIAgentCapability.SECURITY_MONITORING],\n 'threat': [AIAgentCapability.SECURITY_MONITORING],\n\n 'compliance': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulatory': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n 'regulation': [AIAgentCapability.COMPLIANCE_ANALYSIS],\n\n 'fraud': [AIAgentCapability.FRAUD_DETECTION],\n 'detection': [AIAgentCapability.FRAUD_DETECTION],\n 'anomaly': [AIAgentCapability.FRAUD_DETECTION],\n\n 'coordination': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'multi-agent': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n 'orchestration': [AIAgentCapability.MULTI_AGENT_COORDINATION],\n\n 'api': [AIAgentCapability.API_INTEGRATION],\n 'integration': [AIAgentCapability.API_INTEGRATION],\n 'webhook': [AIAgentCapability.API_INTEGRATION],\n\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 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 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: ParseInput): AIAgentCapability[] {\n\n if (Array.isArray(input) && input.every(item => typeof item === 'number')) {\n return input;\n }\n\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 (typeof input === 'string') {\n return this.parseCapabilities(input);\n }\n\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\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';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\nconst logger = new Logger({ module: 'SendMessageToConnectionTool' });\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 logger.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 type { TopicRegistrationResponse, RegistryOperationResponse, HCS6TopicRegistrationResponse, HCS6RegistryOperationResponse, HCS6CreateHashinalResponse } from '@hashgraphonline/standards-sdk';\n\nexport interface WalletBytesResponse {\n success: true;\n transactionBytes: string;\n}\n\nexport function isWalletBytesResponse(value: unknown): value is WalletBytesResponse {\n return !!value && typeof (value as any).transactionBytes === 'string';\n}\n\nexport type TopicRegistrationResult = TopicRegistrationResponse | WalletBytesResponse;\nexport type RegistryOperationResult = RegistryOperationResponse | WalletBytesResponse;\nexport type SubmitMessageResult = { success: true; transactionId?: string } | WalletBytesResponse;\n\nexport type HCS6TopicRegistrationResult = HCS6TopicRegistrationResponse | WalletBytesResponse;\nexport type HCS6RegistryOperationResult = HCS6RegistryOperationResponse | WalletBytesResponse;\nexport type HCS6CreateHashinalResult = HCS6CreateHashinalResponse | WalletBytesResponse;\n","import { z } from 'zod';\nimport { BaseHCS2QueryTool } from './base-hcs2-tools';\nimport { HCS2RegistryType } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { isWalletBytesResponse, type TopicRegistrationResult } from '../../types/tx-results';\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 an HCS-2 registry (standard HCS-2). Use when the user asks to create an HCS-2 registry, not a generic HCS topic. Builds a standards-compliant registry topic and returns the result or transaction bytes.'\n\n get specificInputSchema(): typeof createRegistrySchema {\n return createRegistrySchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof createRegistrySchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const normalizeKey = (val?: string | boolean): string | boolean | undefined => {\n if (typeof val === 'string') {\n const lc = val.trim().toLowerCase();\n if (lc === 'true') return true;\n if (lc === 'false') return false;\n return val; // assume public key string\n }\n return val;\n };\n\n try {\n const result: TopicRegistrationResult = await this.hcs2Builder.createRegistry({\n registryType: params.registryType,\n ttl: params.ttl,\n adminKey: normalizeKey(params.adminKey),\n submitKey: normalizeKey(params.submitKey),\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to create registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to create your HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Create HCS-2 registry (${params.registryType === 1 ? 'Non-Indexed' : 'Indexed'}; TTL: ${params.ttl || 86400}s)`,\n },\n };\n }\n\n const topicId = (result as any)?.topicId || 'unknown';\n return `Successfully created HCS-2 registry!\\n\\nTopic ID: ${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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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 an entry in an HCS-2 registry (standard HCS-2). Use this to add a target topic to an existing HCS-2 registry.'\n\n get specificInputSchema(): typeof registerEntrySchema {\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to register entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to register the entry in the HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Register HCS-2 entry (registry ${params.registryTopicId} -> target ${params.targetTopicId})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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(): typeof updateEntrySchema {\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to update entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to update the HCS-2 registry entry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Update HCS-2 entry (registry ${params.registryTopicId}, uid ${params.uid} -> ${params.targetTopicId})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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(): typeof deleteEntrySchema {\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: RegistryOperationResult = await this.hcs2Builder.deleteEntry(\n params.registryTopicId,\n {\n uid: params.uid,\n memo: params.memo,\n }\n );\n\n if (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to delete entry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to delete the HCS-2 registry entry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Delete HCS-2 entry (registry ${params.registryTopicId}, uid ${params.uid})`,\n },\n };\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';\nimport { isWalletBytesResponse, type RegistryOperationResult } from '../../types/tx-results';\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: RegistryOperationResult = 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 (!('success' in result) || !result.success) {\n throw new Error(result.error || 'Failed to migrate registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to migrate the HCS-2 registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Migrate HCS-2 registry (from ${params.registryTopicId} to ${params.targetTopicId})`,\n },\n };\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 (standard HCS-2). Retrieves indexed or latest entries and returns a structured summary.'\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 const typeVal = (registry as unknown as { registryType: unknown }).registryType;\n const isIndexed =\n typeVal === 0 ||\n typeVal === '0' ||\n String(typeVal).toLowerCase() === 'indexed' ||\n String(typeVal).toLowerCase() === 'index' ||\n String(typeVal).toLowerCase() === 'index_topic' ||\n String(typeVal).toLowerCase() === 'indexed_registry';\n\n return {\n topicId: registry.topicId,\n registryType: isIndexed ? '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 { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for creating a dynamic hashinal registry\n */\nconst CreateDynamicRegistrySchema = z.object({\n ttl: z\n .number()\n .min(3600)\n .default(86400)\n .describe('Time-to-live in seconds (minimum 3600 seconds/1 hour)'),\n submitKey: z\n .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 BaseHCS6QueryTool<typeof CreateDynamicRegistrySchema> {\n name = 'createDynamicRegistry';\n description = 'Create a new HCS-6 dynamic registry for managing evolving content';\n\n get specificInputSchema(): typeof CreateDynamicRegistrySchema {\n return CreateDynamicRegistrySchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: CreateDynamicRegistryInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const result = await this.hcs6Builder.createRegistry({\n ttl: params.ttl,\n submitKey: params.submitKey,\n });\n\n if (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to create dynamic registry');\n }\n\n if (isWalletBytesResponse(result)) {\n const txBytes = result.transactionBytes;\n return {\n message: 'I prepared an unsigned transaction to create your HCS-6 dynamic registry. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Create HCS-6 dynamic registry (TTL: ${params.ttl}s)`,\n },\n };\n }\n\n return `Successfully created HCS-6 dynamic registry!\\n\\nTopic ID: ${(result as any).topicId}\\nTTL: ${params.ttl} seconds\\n\\nYou can now register dynamic hashinals to this registry using the topic ID.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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 BaseHCS6QueryTool<typeof RegisterDynamicHashinalSchema> {\n name = 'registerDynamicHashinal';\n description = 'Create and register a new dynamic hashinal that can be updated over time';\n\n get specificInputSchema() {\n return RegisterDynamicHashinalSchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: RegisterDynamicHashinalInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\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 (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to register dynamic hashinal');\n }\n\n if (isWalletBytesResponse(result as any)) {\n const txBytes = (result as any).transactionBytes as string;\n return {\n message: 'I prepared an unsigned transaction to register a dynamic hashinal. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Register dynamic hashinal${params.memo ? ` (Memo: ${params.memo})` : ''}`,\n },\n };\n }\n\n return `Successfully registered dynamic hashinal!\\n\\nRegistry Topic ID: ${(result as any).registryTopicId}\\nInscription Topic ID: ${(result as any).inscriptionTopicId}${params.memo ? `\\nMemo: ${params.memo}` : ''}\\n\\nThe dynamic hashinal has been created and can be updated using the registry topic ID.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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 BaseHCS6QueryTool<typeof UpdateDynamicHashinalSchema> {\n name = 'updateDynamicHashinal';\n description = 'Update an existing dynamic hashinal with new content while maintaining the same registry';\n\n get specificInputSchema() {\n return UpdateDynamicHashinalSchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: UpdateDynamicHashinalInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n\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 (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to update dynamic hashinal');\n }\n\n if (isWalletBytesResponse(result as any)) {\n const txBytes = (result as any).transactionBytes as string;\n return {\n message: 'I prepared an unsigned transaction to update a dynamic hashinal. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Update dynamic hashinal (registry ${params.registryTopicId})${params.memo ? ` (Memo: ${params.memo})` : ''}`,\n },\n };\n }\n\n return `Successfully updated dynamic hashinal!\\n\\nRegistry Topic ID: ${params.registryTopicId}\\nInscription Topic ID: ${(result as any).inscriptionTopicId}${params.memo ? `\\nUpdate Memo: ${params.memo}` : ''}\\n\\nThe dynamic hashinal has been updated with new content.`;\n }\n}","import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\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\n get specificInputSchema() {\n return QueryDynamicRegistrySchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: QueryDynamicRegistryInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const registry = await this.hcs6Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n const 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\n return `Successfully queried dynamic registry!\\n\\nRegistry Topic: ${registry.topicId}\\nRegistry Type: NON_INDEXED\\nTTL: ${registry.ttl} seconds\\nTotal Entries: ${registry.entries.length}${latestEntry ? `\\n\\nLatest Entry:\\n- Topic ID: ${latestEntry.topicId}\\n- Timestamp: ${latestEntry.timestamp}\\n- Memo: ${latestEntry.memo || 'N/A'}\\n- Sequence: ${latestEntry.sequence}` : '\\n\\nNo entries found in registry.'}`;\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 type { ContentResolverInterface } from '../../types/content-resolver';\nimport {\n InscriptionInput,\n InscriptionOptions,\n QuoteResult,\n} from '@hashgraphonline/standards-sdk';\nimport { z } from 'zod';\n\n/**\n * Event emitted when an entity is created during inscription\n */\nexport interface EntityCreationEvent {\n entityId: string;\n entityName: string;\n entityType: string;\n transactionId?: string;\n}\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 protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberTransactionToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\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 protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberQueryToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\n }\n}","import { RetrievedInscriptionResult } from '@kiloscribe/inscription-sdk';\n\nexport type NetworkType = 'mainnet' | 'testnet';\n\nexport interface TopicIds {\n jsonTopicId?: string;\n topicId?: string;\n}\n\nfunction getStringProp(obj: unknown, key: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const val = (obj as Record<string, unknown>)[key];\n return typeof val === 'string' && val.trim() ? val : undefined;\n}\n\n/**\n * Extract topic ids from an inscription and/or result object without using any.\n * - Prefers jsonTopicId when present (for CDN linking)\n * - Collects topic_id/topicId from either inscription or result\n */\nexport function extractTopicIds(\n inscription: RetrievedInscriptionResult,\n result?: unknown\n): TopicIds {\n const jsonTopicId =\n inscription.jsonTopicId || getStringProp(inscription, 'json_topic_id');\n\n const imageTopicId =\n getStringProp(inscription, 'topic_id') ||\n getStringProp(inscription, 'topicId') ||\n getStringProp(result, 'topicId') ||\n getStringProp(result, 'topic_id');\n\n return {\n jsonTopicId: jsonTopicId,\n topicId: imageTopicId,\n };\n}\n\n/**\n * Build HRL/CDN URLs from extracted topic ids.\n * - HRL prefers jsonTopicId, falls back to topicId\n * - CDN URL only provided when jsonTopicId is present\n */\nexport function buildInscriptionLinks(\n ids: TopicIds,\n network: NetworkType,\n fileStandard: string = '1'\n): { hrl?: string; cdnUrl?: string; topicId?: string } {\n const chosen = ids.jsonTopicId || ids.topicId;\n const hrl = chosen ? `hcs://${fileStandard}/${chosen}` : undefined;\n const cdnUrl = ids.jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${ids.jsonTopicId}?network=${network}`\n : undefined;\n return { hrl, cdnUrl, topicId: chosen };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions, Logger, InscriptionResponse } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { extractTopicIds, buildInscriptionLinks } from '../../utils/inscription-utils';\n\nconst logger = new Logger({ module: 'InscribeFromUrlTool' });\n\n/**\n * Schema for inscribing from URL\n */\nconst inscribeFromUrlSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'ONLY direct file download URLs with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or when you already have content to inscribe.'\n ),\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(\n 'Timeout in milliseconds for inscription (default: no timeout - waits until completion)'\n ),\n apiKey: z.string().optional().describe('API key for inscription service'),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\n});\n\n/**\n * Tool for inscribing content from URL\n */\nexport class InscribeFromUrlTool extends BaseInscriberQueryTool<\n typeof inscribeFromUrlSchema\n> {\n name = 'inscribeFromUrl';\n description =\n 'ONLY for direct FILE DOWNLOAD URLs ending with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or ANY HTML content - it WILL FAIL. If you have already retrieved content from any source (including MCP tools), you MUST use inscribeFromBuffer instead. This tool downloads files from URLs - it does NOT inscribe content you already have. When asked to \"inscribe it\" after retrieving content, ALWAYS use inscribeFromBuffer with the actual content. Set quoteOnly=true to get cost estimates without executing the inscription.';\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 logger.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(\n 'Invalid URL format. Please provide a complete URL with protocol (http/https).'\n );\n }\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n throw new Error(\n 'Only HTTP and HTTPS URLs are supported for inscription.'\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('Cannot inscribe content from')\n ) {\n throw error;\n }\n throw new Error(\n `Invalid URL: ${params.url}. Please provide a valid URL.`\n );\n }\n\n logger.info('Validating URL content before inscription...');\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\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(\n `URL returned error status ${headResponse.status}: ${headResponse.statusText}. Cannot inscribe content from inaccessible URLs.`\n );\n }\n\n const contentType = headResponse.headers.get('content-type') || '';\n const contentLength = headResponse.headers.get('content-length');\n\n const webPageContentTypes = [\n 'text/html',\n 'application/xhtml+xml',\n 'text/xml',\n ];\n\n if (\n webPageContentTypes.some((type) =>\n contentType.toLowerCase().includes(type)\n )\n ) {\n throw new Error(\n `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\n if (contentLength && parseInt(contentLength) === 0) {\n throw new Error(\n 'URL returns empty content (Content-Length: 0). Cannot inscribe empty content.'\n );\n }\n\n if (contentLength && parseInt(contentLength) < 10) {\n throw new Error(\n `URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`\n );\n }\n\n if (!contentType || contentType === 'application/octet-stream') {\n logger.info('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) {\n\n const buffer = await getResponse.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n const text = new TextDecoder('utf-8', { fatal: false }).decode(\n bytes.slice(0, 512)\n );\n\n if (\n text.toLowerCase().includes('<!doctype html') ||\n text.toLowerCase().includes('<html') ||\n text.match(/<meta\\s+[^>]*>/i) ||\n text.match(/<title>/i)\n ) {\n throw new Error(\n `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 }\n } catch (getError) {\n clearTimeout(getTimeoutId);\n if (\n getError instanceof Error &&\n getError.message.includes('HTML content')\n ) {\n throw getError;\n }\n logger.warn(\n `Could not perform partial GET validation: ${\n getError instanceof Error ? getError.message : 'Unknown error'\n }`\n );\n }\n }\n\n logger.info(\n `URL validation passed. Content-Type: ${contentType}, Content-Length: ${\n contentLength || 'unknown'\n }`\n );\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n logger.warn(\n 'URL validation timed out after 10 seconds. Proceeding with inscription attempt.'\n );\n } else if (\n error.message.includes('URL returned error') ||\n error.message.includes('empty content') ||\n error.message.includes('too small') ||\n error.message.includes('HTML')\n ) {\n throw error;\n } else {\n logger.warn(\n `Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`\n );\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.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n { type: 'url', url: params.url },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n url: params.url,\n },\n message: `Estimated Quote for URL: ${params.url}\\nTotal cost: ${quote.totalCostHbar} HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n );\n }\n\n const typed = result as InscriptionResponse;\n\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n '1'\n );\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else if (!typed.quote && !typed.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`;\n } else {\n return 'Inscription operation completed.';\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to inscribe from URL';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions, InscriptionResponse } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { extractTopicIds, buildInscriptionLinks } from '../../utils/inscription-utils';\n\n/**\n * Schema for inscribing from file\n */\nconst inscribeFromFileSchema = z.object({\n filePath: z\n .string()\n .min(1, 'File path cannot be empty')\n .describe(\n 'The file path of the content to inscribe. Must point to a valid, non-empty file.'\n ),\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 quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\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. Set quoteOnly=true to get cost estimates without executing the inscription.';\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 let fileContent: Buffer;\n try {\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 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 this.logger?.warn(\n `Large file detected (${(\n stats.size /\n (1024 * 1024)\n ).toFixed(2)} MB)`\n );\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(\n 'utf8',\n 0,\n Math.min(fileContent.length, 1000)\n );\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.quoteOnly\n ? false\n : 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 quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n {\n type: 'buffer',\n buffer: Buffer.from(base64Data, 'base64'),\n fileName,\n mimeType,\n },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n fileName,\n mimeType,\n sizeBytes: fileContent.length,\n filePath: params.filePath,\n },\n message: `Estimated Quote for file: ${fileName} (${(\n fileContent.length / 1024\n ).toFixed(2)} KB)\\nTotal cost: ${\n quote.totalCostHbar\n } HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\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 const inscriptionResult = result as InscriptionResponse;\n if (inscriptionResult.confirmed && !inscriptionResult.quote) {\n const ids = extractTopicIds(inscriptionResult.inscription, inscriptionResult.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (inscriptionResult.result as { transactionId?: string })?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else if (!inscriptionResult.quote && !inscriptionResult.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${(inscriptionResult.result as { transactionId?: string })?.transactionId ?? 'unknown'}\\n\\nThe inscription is processing and will be confirmed shortly.`;\n } else {\n return 'Inscription operation completed.';\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 { ContentResolverRegistry } from '@hashgraphonline/standards-sdk';\n\nexport interface ContentResolutionResult {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n}\n\n/**\n * Resolves content from various input formats (content-ref, base64, plain text)\n */\nexport async function resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): Promise<ContentResolutionResult> {\n const trimmedInput = input.trim();\n\n const resolver = ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return handleDirectContent(trimmedInput, providedMimeType, providedFileName);\n}\n\n/**\n * Handles direct content (base64 or plain text)\n */\nfunction handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): ContentResolutionResult {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n}\n","import { z } from 'zod';\n\n/**\n * Validates content reference format\n */\nexport const contentRefSchema = z\n .string()\n .regex(/^content-ref:[a-zA-Z0-9_-]+$/, 'Content reference must be in format \"content-ref:[alphanumeric-id]\"')\n .describe('Content reference in format \"content-ref:[id]\"');\n\n/**\n * Validates content reference or returns error for dumber models\n */\nexport function validateContentRef(input: string): string {\n try {\n return contentRefSchema.parse(input);\n } catch (error) {\n throw new Error(`Invalid content reference format. Expected \"content-ref:[alphanumeric-id]\" but got \"${input}\"`);\n }\n}","export interface ContentReferenceConfig {\n maxInscriptionSize: number;\n minContentSize: number;\n logLevel: 'debug' | 'info' | 'warn' | 'error';\n enableContentValidation: boolean;\n}\n\nexport const DEFAULT_CONFIG: ContentReferenceConfig = {\n maxInscriptionSize: 50 * 1024, // 50KB\n minContentSize: 10,\n logLevel: 'warn',\n enableContentValidation: true,\n};\n\nexport function loadConfig(): ContentReferenceConfig {\n return {\n maxInscriptionSize: parseInt(\n process.env.REF_MAX_SIZE || DEFAULT_CONFIG.maxInscriptionSize.toString(),\n 10\n ),\n minContentSize: parseInt(\n process.env.REF_MIN_SIZE || DEFAULT_CONFIG.minContentSize.toString(),\n 10\n ),\n logLevel:\n (process.env.REF_LOG_LEVEL as ContentReferenceConfig['logLevel']) ||\n DEFAULT_CONFIG.logLevel,\n enableContentValidation: process.env.REF_ENABLE_VALIDATION !== 'false',\n };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionResponse,\n InscriptionResult,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { resolveContent } from '../../utils/content-resolver';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { loadConfig } from '../../config/ContentReferenceConfig';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\n\nconst inscribeFromBufferSchema = z.object({\n base64Data: z\n .union([z.string(), contentRefSchema])\n .describe(\n 'Content to inscribe as base64 data, plain text, or content reference'\n ),\n fileName: z.string().min(1).describe('Name for the inscribed content'),\n mimeType: z.string().optional().describe('MIME type of the content'),\n metadata: z.record(z.unknown()).optional().describe('Metadata to attach'),\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('Wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Timeout in milliseconds'),\n apiKey: z.string().optional().describe('API key for inscription service'),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe('Return cost quote only'),\n});\n\nexport class InscribeFromBufferTool extends BaseInscriberQueryTool<\n typeof inscribeFromBufferSchema\n> {\n name = 'inscribeFromBuffer';\n description =\n 'Use ONLY for inscribing regular files or content (NOT for NFT/Hashinal inscriptions). When user says \"inscribe it\" after you showed search results or other content WITHOUT mentioning NFT/hashinal, use THIS tool. The base64Data field accepts PLAIN TEXT (not just base64) and content reference IDs in format \"content-ref:[id]\". Pass the EXACT content from your previous response or MCP tool output. DO NOT generate new content or create repetitive text. Content references are automatically resolved to the original content for inscription. Set quoteOnly=true to get cost estimates without executing the inscription. NEVER use this for Hashinal NFTs - always use InscribeHashinalTool instead when user mentions hashinal, NFT, dynamic, or minting.';\n\n private config = loadConfig();\n\n get specificInputSchema() {\n return inscribeFromBufferSchema;\n }\n\n protected override async _call(\n args: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n try {\n const input = typeof args.base64Data === 'string' ? args.base64Data : '';\n const buffer = /^[A-Za-z0-9+/]*={0,2}$/.test(input)\n ? Buffer.from(input, 'base64')\n : Buffer.from(input, 'utf8');\n\n const fileName = args.fileName;\n const mimeType = args.mimeType;\n\n const network = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const options: InscriptionOptions = {\n mode: 'file',\n metadata: args.metadata,\n tags: args.tags,\n chunkSize: args.chunkSize,\n waitForConfirmation: args.quoteOnly ? false : args.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: args.apiKey,\n network,\n quoteOnly: args.quoteOnly,\n };\n\n const result = await this.inscriberBuilder.inscribe(\n { type: 'buffer', buffer, fileName, mimeType },\n options\n );\n\n const typed = result as InscriptionResponse;\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return JSON.stringify({\n success: true,\n data: `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`,\n });\n }\n\n return JSON.stringify({\n success: true,\n data: `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ success: false, error: `Inscription failed: ${errorMessage}` });\n }\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromBufferSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n\n const resolvedContent = await resolveContent(\n params.base64Data,\n params.mimeType,\n params.fileName\n );\n this.logger?.debug(\n `[InscribeFromBufferTool] Resolved content bytes: ${\n resolvedContent.buffer?.length ?? -1\n }`\n );\n\n try {\n this.validateContent(resolvedContent.buffer);\n } catch (validationError) {\n this.logger?.warn(\n `Content validation warning: ${\n validationError instanceof Error\n ? validationError.message\n : String(validationError)\n }`\n );\n }\n\n const buffer = resolvedContent.buffer;\n const resolvedMimeType = resolvedContent.mimeType || params.mimeType;\n const resolvedFileName = resolvedContent.fileName || params.fileName;\n\n const options: InscriptionOptions = {\n mode: 'file',\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n {\n type: 'buffer',\n buffer,\n fileName: resolvedFileName,\n mimeType: resolvedMimeType,\n },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n fileName: resolvedFileName,\n mimeType: resolvedMimeType,\n sizeBytes: buffer.length,\n },\n message: `Estimated Quote for buffer content: ${resolvedFileName} (${(\n buffer.length / 1024\n ).toFixed(2)} KB)\\nTotal cost: ${quote.totalCostHbar} HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n this.logger?.debug(\n `[InscribeFromBufferTool] Calling inscribe with fileName: ${resolvedFileName}, mime: ${resolvedMimeType}`\n );\n const result = await this.executeInscription(\n buffer,\n resolvedFileName,\n resolvedMimeType,\n options,\n params.timeoutMs\n );\n this.logger?.debug(\n `[InscribeFromBufferTool] Inscribe result (confirmed): ${Boolean((result as any)?.confirmed)}`\n );\n return this.formatInscriptionResult(result, options);\n } catch (error) {\n this.logger?.warn(\n `[InscribeFromBufferTool] Error during inscription: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe from buffer';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n private validateInput(\n params: z.infer<typeof inscribeFromBufferSchema>\n ): void {\n if (!params.base64Data || params.base64Data.trim() === '') {\n throw new Error(\n 'No data provided. Cannot inscribe empty content. Please provide valid content, plain text, base64 encoded data, or a content reference ID.'\n );\n }\n\n if (!params.fileName || params.fileName.trim() === '') {\n throw new Error(\n 'No fileName provided. A valid fileName is required for inscription.'\n );\n }\n }\n\n private validateContent(buffer: Buffer): void {\n if (buffer.length === 0) {\n throw new Error(\n 'Buffer is empty after conversion. The provided data appears to be invalid or empty.'\n );\n }\n\n if (buffer.length > this.config.maxInscriptionSize) {\n const maxSizeKB = Math.round(this.config.maxInscriptionSize / 1024);\n const bufferSizeKB = Math.round(buffer.length / 1024);\n throw new Error(\n `Content is too large for inscription (${bufferSizeKB}KB, max ${maxSizeKB}KB). Please summarize or extract key information before inscribing.`\n );\n }\n\n if (buffer.length < this.config.minContentSize) {\n throw new Error(\n `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\n if (\n buffer.toString('utf8', 0, Math.min(buffer.length, 100)).trim() === ''\n ) {\n throw new Error(\n 'Buffer contains only whitespace or empty content. Cannot inscribe meaningless data.'\n );\n }\n\n const contentStr = buffer.toString('utf8');\n const emptyHtmlPattern = /<a\\s+href=[\"'][^\"']+[\"']\\s*>\\s*<\\/a>/i;\n const hasOnlyEmptyLinks =\n emptyHtmlPattern.test(contentStr) &&\n contentStr.replace(/<[^>]+>/g, '').trim().length < 50;\n\n if (hasOnlyEmptyLinks) {\n throw new Error(\n 'Buffer contains empty HTML with only links and no actual content. When inscribing content from external sources, use the actual article text you retrieved, not empty HTML with links.'\n );\n }\n }\n\n private async executeInscription(\n buffer: Buffer,\n fileName: string,\n mimeType: string | undefined,\n options: InscriptionOptions,\n timeoutMs?: number\n ): Promise<Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>> {\n const inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName,\n mimeType,\n };\n\n if (timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Inscription timed out after ${timeoutMs}ms`)),\n timeoutMs\n );\n });\n\n return Promise.race([\n this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n }\n\n return this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n private formatInscriptionResult(\n result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>,\n options: InscriptionOptions\n ): string {\n const typed = result as InscriptionResponse;\n\n if (typed.confirmed && !typed.quote) {\n const ids = extractTopicIds(typed.inscription, typed.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const { topicId, cdnUrl } = buildInscriptionLinks(ids, network, '1');\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n }\n\n if (!typed.quote && !typed.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (typed.result as InscriptionResult)?.transactionId ?? 'unknown'\n }\\n\\nThe inscription is processing and will be confirmed shortly.`;\n }\n\n return 'Inscription operation completed.';\n }\n}\n","import { z } from 'zod';\n\n/**\n * HIP-412 file schema for multi-file NFTs\n */\nexport const hip412FileSchema = z.object({\n uri: z.string().describe('URI of the file'),\n checksum: z.string().optional().describe('SHA-256 checksum of the file'),\n is_default_file: z.boolean().optional().describe('Whether this is the default file'),\n type: z.string().describe('MIME type of the file'),\n});\n\n/**\n * HIP-412 attribute schema for NFT traits\n */\nexport const hip412AttributeSchema = z.object({\n trait_type: z.string().describe('The trait type'),\n value: z.union([z.string(), z.number()]).describe('The trait value'),\n display_type: z.string().optional().describe('Display type for the attribute'),\n});\n\n/**\n * HIP-412 compliant metadata schema for Hedera NFTs\n */\nexport const hip412MetadataSchema = z.object({\n name: z.string().describe('Token name (required by HIP-412)'),\n description: z.string().describe('Human readable description (required by HIP-412)'),\n image: z.string().describe('Preview image URI (required by HIP-412)'),\n type: z.string().describe('MIME type (required by HIP-412)'),\n creator: z.string().optional().describe('Creator name or comma-separated names'),\n creatorDID: z.string().optional().describe('Decentralized identifier for creator'),\n checksum: z.string().optional().describe('SHA-256 checksum of the image'),\n format: z.string().optional().default('HIP412@2.0.0').describe('Metadata format version'),\n files: z.array(hip412FileSchema).optional().describe('Array of files for multi-file NFTs'),\n attributes: z.array(hip412AttributeSchema).optional().describe('NFT attributes/traits'),\n properties: z.record(z.unknown()).optional().describe('Additional properties'),\n});\n\n/**\n * Validates metadata against HIP-412 standard\n */\nexport function validateHIP412Metadata(metadata: unknown): z.infer<typeof hip412MetadataSchema> {\n try {\n return hip412MetadataSchema.parse(metadata);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');\n throw new Error(`HIP-412 metadata validation failed: ${issues}`);\n }\n throw error;\n }\n}","/**\n * Generates default metadata for NFT inscription\n */\nexport function generateDefaultMetadata(params: {\n name?: string;\n creator?: string;\n description?: string;\n type?: string;\n fileName?: string;\n mimeType?: string;\n operatorAccount: string;\n}): {\n name: string;\n creator: string;\n description: string;\n type: string;\n image: string;\n} {\n const defaultName = params.fileName?.replace(/\\.[^/.]+$/, '') || 'Hashinal NFT';\n let defaultType = 'media';\n if (params.mimeType?.startsWith('image/')) {\n defaultType = 'image';\n } else if (params.mimeType?.startsWith('video/')) {\n defaultType = 'video';\n } else if (params.mimeType?.startsWith('audio/')) {\n defaultType = 'audio';\n }\n\n return {\n name: params.name || defaultName,\n creator: params.creator || params.operatorAccount,\n description: params.description || `${defaultType.charAt(0).toUpperCase() + defaultType.slice(1)} NFT inscribed as Hashinal`,\n type: params.type || defaultType,\n image: '',\n };\n}","import { ZodType } from 'zod';\nimport { RenderConfigSchema, EnhancedRenderConfig, ZodSchemaWithRender, FormFieldType, FieldMetadata, SelectOption } from './types';\n\ninterface ExtendedZodSchema {\n description?: string;\n merge?: (other: ZodType<unknown>) => ZodType<unknown>;\n extend?: (extensions: Record<string, ZodType<unknown>>) => ZodType<unknown>;\n pick?: (fields: Record<string, boolean>) => ZodType<unknown>;\n omit?: (fields: Record<string, boolean>) => ZodType<unknown>;\n withRender?: (config: EnhancedRenderConfig | RenderConfigSchema) => ZodSchemaWithRender<unknown>;\n withProgressive?: (priority: 'essential' | 'common' | 'advanced' | 'expert', group?: string) => ZodSchemaWithRender<unknown>;\n withBlock?: (blockId: string) => ZodSchemaWithRender<unknown>;\n}\n\n/**\n * Extends a Zod schema with render configuration capabilities\n */\nexport function extendZodSchema<TSchema>(schema: ZodType<TSchema>): ZodSchemaWithRender<TSchema> {\n const extendedSchema = schema as ZodSchemaWithRender<TSchema>;\n\n extendedSchema.withRender = function(config: EnhancedRenderConfig | RenderConfigSchema): ZodSchemaWithRender<TSchema> {\n const newSchema = Object.create(this);\n const currentConfig = this._renderConfig || {} as EnhancedRenderConfig;\n\n const mergedConfig: EnhancedRenderConfig = {\n ...currentConfig,\n ...config,\n ui: {\n ...(currentConfig.ui || {}),\n ...(config.ui || {})\n }\n };\n\n if (currentConfig.progressive || (config as EnhancedRenderConfig).progressive) {\n mergedConfig.progressive = {\n ...(currentConfig.progressive || {} as NonNullable<EnhancedRenderConfig['progressive']>),\n ...((config as EnhancedRenderConfig).progressive || {} as NonNullable<EnhancedRenderConfig['progressive']>)\n };\n }\n\n if (currentConfig.block || (config as EnhancedRenderConfig).block) {\n mergedConfig.block = {\n ...(currentConfig.block || {} as NonNullable<EnhancedRenderConfig['block']>),\n ...((config as EnhancedRenderConfig).block || {} as NonNullable<EnhancedRenderConfig['block']>)\n };\n }\n\n (newSchema as ZodSchemaWithRender<TSchema>)._renderConfig = mergedConfig;\n (newSchema as ZodSchemaWithRender<TSchema>).withRender = extendedSchema.withRender;\n (newSchema as ZodSchemaWithRender<TSchema>).withProgressive = extendedSchema.withProgressive;\n (newSchema as ZodSchemaWithRender<TSchema>).withBlock = extendedSchema.withBlock;\n return newSchema as ZodSchemaWithRender<TSchema>;\n };\n\n extendedSchema.withProgressive = function(\n priority: 'essential' | 'common' | 'advanced' | 'expert',\n group?: string\n ): ZodSchemaWithRender<TSchema> {\n const currentConfig = this._renderConfig || { fieldType: inferFieldTypeFromSchema(schema) };\n return this.withRender({\n ...currentConfig,\n progressive: {\n priority,\n group\n }\n });\n };\n\n extendedSchema.withBlock = function(blockId: string): ZodSchemaWithRender<TSchema> {\n const currentConfig = this._renderConfig || { fieldType: inferFieldTypeFromSchema(schema) };\n return this.withRender({\n ...currentConfig,\n block: {\n id: blockId,\n type: 'field',\n reusable: true\n }\n });\n };\n\n return extendedSchema;\n}\n\n/**\n * Checks if a schema has render configuration\n */\nexport function hasRenderConfig(schema: unknown): schema is ZodSchemaWithRender {\n return Boolean(schema && typeof (schema as Record<string, unknown>).withRender === 'function');\n}\n\n/**\n * Extracts render configuration from a schema\n */\nexport function getRenderConfig(schema: ZodType<unknown>): EnhancedRenderConfig | undefined {\n if (hasRenderConfig(schema)) {\n return schema._renderConfig;\n }\n return undefined;\n}\n\n/**\n * Infers form field type from Zod schema type with enhanced field detection\n */\nexport function inferFieldTypeFromSchema(schema: ZodType<unknown>): FormFieldType {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n\n switch (typeName) {\n case 'ZodString': {\n const stringChecks = ((schema._def as Record<string, unknown>)?.checks as Array<Record<string, unknown>>) || [];\n for (const check of stringChecks) {\n if (check.kind === 'email') {return 'text';}\n if (check.kind === 'url') {return 'text';}\n }\n return 'text';\n }\n\n case 'ZodNumber':\n case 'ZodBigInt':\n return 'number';\n\n case 'ZodBoolean':\n return 'checkbox';\n\n case 'ZodEnum':\n case 'ZodNativeEnum':\n return 'select';\n\n case 'ZodArray':\n return 'array';\n\n case 'ZodUnion':\n case 'ZodDiscriminatedUnion':\n return 'select';\n\n case 'ZodDate':\n return 'text';\n\n case 'ZodObject':\n return 'object';\n\n case 'ZodOptional':\n case 'ZodDefault': {\n const innerType = (schema._def as Record<string, unknown>)?.innerType as ZodType<unknown>;\n if (innerType) {\n return inferFieldTypeFromSchema(innerType);\n }\n return 'text';\n }\n\n default:\n return 'text';\n }\n}\n\n/**\n * Extracts options from enum, union, or literal schemas\n */\nexport function extractOptionsFromSchema(schema: ZodType<unknown>): SelectOption[] | undefined {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n\n if (typeName === 'ZodEnum') {\n const values = (schema._def as Record<string, unknown>)?.values;\n if (Array.isArray(values)) {\n return values.map((value: string) => ({\n value,\n label: value.charAt(0).toUpperCase() + value.slice(1).replace(/[_-]/g, ' '),\n }));\n }\n }\n\n if (typeName === 'ZodNativeEnum') {\n const enumObject = (schema._def as Record<string, unknown>)?.values as Record<string, unknown>;\n if (enumObject) {\n return Object.entries(enumObject).map(([key, value]) => ({\n value,\n label: key.replace(/[_-]/g, ' '),\n }));\n }\n }\n\n if (typeName === 'ZodUnion') {\n const options: SelectOption[] = [];\n const unionOptions = (schema._def as Record<string, unknown>)?.options as Array<ZodType<unknown>>;\n\n if (Array.isArray(unionOptions)) {\n for (const option of unionOptions) {\n if ((option._def as Record<string, unknown>)?.typeName === 'ZodLiteral') {\n const value = (option._def as Record<string, unknown>)?.value;\n if (value !== undefined) {\n options.push({\n value,\n label: typeof value === 'string'\n ? value.charAt(0).toUpperCase() + value.slice(1)\n : String(value),\n });\n }\n }\n }\n }\n\n return options.length > 0 ? options : undefined;\n }\n\n return undefined;\n}\n\n/**\n * Checks if a schema is optional\n */\nexport function isOptionalSchema(schema: ZodType<unknown>): boolean {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n\n/**\n * Gets the inner schema from optional/default wrappers\n */\nexport function getInnerSchema(schema: ZodType<unknown>): ZodType<unknown> {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n const innerType = (schema._def as Record<string, unknown>)?.innerType as ZodType<unknown>;\n return innerType || schema;\n }\n return schema;\n}\n\n/**\n * Extracts validation constraints from a schema with enhanced support\n */\nexport function extractValidationConstraints(schema: ZodType<unknown>): Record<string, unknown> {\n const innerSchema = getInnerSchema(schema);\n const typeName = (innerSchema._def as Record<string, unknown>)?.typeName;\n const constraints: Record<string, unknown> = {};\n\n if (typeName === 'ZodString') {\n const def = innerSchema._def as Record<string, unknown>;\n const checks = def.checks as Array<Record<string, unknown>>;\n if (checks && Array.isArray(checks)) {\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n constraints.minLength = check.value;\n break;\n case 'max':\n constraints.maxLength = check.value;\n break;\n case 'email':\n constraints.type = 'email';\n break;\n case 'url':\n constraints.type = 'url';\n break;\n case 'regex':\n constraints.pattern = check.regex as string;\n break;\n }\n }\n }\n }\n\n if (typeName === 'ZodNumber') {\n const def = innerSchema._def as Record<string, unknown>;\n const checks = def.checks as Array<Record<string, unknown>>;\n if (checks && Array.isArray(checks)) {\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n constraints.min = check.value;\n break;\n case 'max':\n constraints.max = check.value;\n break;\n case 'int':\n constraints.step = 1;\n break;\n case 'multipleOf':\n constraints.step = check.value;\n break;\n }\n }\n }\n }\n\n if (typeName === 'ZodArray') {\n const def = innerSchema._def as Record<string, unknown>;\n const minLength = def.minLength as Record<string, unknown> | undefined;\n const maxLength = def.maxLength as Record<string, unknown> | undefined;\n if (minLength !== undefined) {\n constraints.minItems = minLength.value;\n }\n if (maxLength !== undefined) {\n constraints.maxItems = maxLength.value;\n }\n }\n\n return constraints;\n}\n\n/**\n * Gets default value from schema with comprehensive type support\n */\nexport function getDefaultValue(schema: ZodType<unknown>): unknown {\n const typeName = (schema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodDefault') {\n const defaultValue = (schema._def as Record<string, unknown>)?.defaultValue;\n if (typeof defaultValue === 'function') {\n return (defaultValue as () => unknown)();\n }\n return defaultValue;\n }\n\n const innerSchema = getInnerSchema(schema);\n const innerTypeName = (innerSchema._def as Record<string, unknown>)?.typeName;\n\n switch (innerTypeName) {\n case 'ZodString':\n return '';\n case 'ZodNumber':\n case 'ZodBigInt':\n return 0;\n case 'ZodBoolean':\n return false;\n case 'ZodArray':\n return [];\n case 'ZodObject': {\n const shape = (innerSchema._def as Record<string, unknown>)?.shape as Record<string, ZodType<unknown>>;\n if (shape) {\n const defaultObj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n defaultObj[key] = getDefaultValue(value);\n }\n return defaultObj;\n }\n return {};\n }\n case 'ZodDate':\n return new Date();\n case 'ZodEnum': {\n const values = (innerSchema._def as Record<string, unknown>)?.values as unknown[];\n return Array.isArray(values) && values.length > 0 ? values[0] : undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Extracts field metadata from schema including render configuration\n */\nexport function extractFieldMetadata(schema: ZodType<unknown>): FieldMetadata {\n const innerSchema = getInnerSchema(schema);\n const fieldType = inferFieldTypeFromSchema(schema);\n const required = !isOptionalSchema(schema);\n const optional = isOptionalSchema(schema);\n const defaultValue = getDefaultValue(schema);\n const options = extractOptionsFromSchema(innerSchema);\n const constraints = extractValidationConstraints(schema);\n const description = (schema as ZodType<unknown> & ExtendedZodSchema)?.description;\n\n return {\n type: fieldType,\n required,\n optional,\n default: defaultValue,\n options,\n constraints,\n description,\n validation: {\n minLength: constraints.minLength as number,\n maxLength: constraints.maxLength as number,\n min: constraints.min as number,\n max: constraints.max as number,\n pattern: constraints.pattern ? new RegExp(constraints.pattern as string) : undefined,\n }\n };\n}\n\n\n\n/**\n * Helper function to create common render configurations\n */\nexport const renderConfigs = {\n text: (label: string, placeholder?: string, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'text',\n ui: { label, placeholder, priority },\n progressive: { priority }\n }),\n\n number: (label: string, min?: number, max?: number, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'number',\n ui: { label, priority },\n constraints: { min, max },\n progressive: { priority }\n }),\n\n select: (label: string, options: SelectOption[], priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'select',\n ui: { label, priority },\n options,\n progressive: { priority }\n }),\n\n textarea: (label: string, rows = 3, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'textarea',\n ui: { label, priority },\n props: { rows },\n progressive: { priority }\n }),\n\n currency: (label: string, symbol = 'HBAR', priority: 'essential' | 'common' | 'advanced' | 'expert' = 'common'): EnhancedRenderConfig => ({\n fieldType: 'currency',\n ui: { label, priority },\n props: { symbol },\n progressive: { priority }\n }),\n\n array: (label: string, itemLabel?: string, priority: 'essential' | 'common' | 'advanced' | 'expert' = 'advanced'): EnhancedRenderConfig => ({\n fieldType: 'array',\n ui: { label, priority },\n props: { itemLabel },\n progressive: { priority }\n }),\n\n essential: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'essential'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'essential'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'essential'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'essential'),\n },\n\n advanced: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'advanced'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'advanced'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'advanced'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'advanced'),\n array: (label: string, itemLabel?: string) => renderConfigs.array(label, itemLabel, 'advanced'),\n },\n\n expert: {\n text: (label: string, placeholder?: string) => renderConfigs.text(label, placeholder, 'expert'),\n number: (label: string, min?: number, max?: number) => renderConfigs.number(label, min, max, 'expert'),\n select: (label: string, options: SelectOption[]) => renderConfigs.select(label, options, 'expert'),\n textarea: (label: string, rows?: number) => renderConfigs.textarea(label, rows, 'expert'),\n }\n};\n\n/**\n * Extends Zod prototype to add withRender functionality globally\n */\nexport function installZodRenderExtensions() {\n if (!(ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withRender) {\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withRender = function(config: EnhancedRenderConfig | RenderConfigSchema) {\n return extendZodSchema(this).withRender(config);\n };\n\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withProgressive = function(\n priority: 'essential' | 'common' | 'advanced' | 'expert',\n group?: string\n ) {\n return extendZodSchema(this).withProgressive(priority, group);\n };\n\n (ZodType.prototype as typeof ZodType.prototype & ExtendedZodSchema).withBlock = function(blockId: string) {\n return extendZodSchema(this).withBlock(blockId);\n };\n }\n}\n\n/**\n * Creates a progressive form schema with grouped fields\n */\nexport function createProgressiveSchema<TSchema>(\n baseSchema: ZodType<TSchema>,\n groups: Record<string, { priority: 'essential' | 'common' | 'advanced' | 'expert'; fields: string[] }>\n): ZodSchemaWithRender<TSchema> {\n const extendedSchema = extendZodSchema(baseSchema);\n\n const typeName = (baseSchema._def as Record<string, unknown>)?.typeName;\n if (typeName === 'ZodObject') {\n const shape = (baseSchema._def as Record<string, unknown>)?.shape as Record<string, ZodType<unknown>>;\n if (shape) {\n const enhancedShape: Record<string, ZodType<unknown>> = {};\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n let fieldGroup: string | undefined;\n let fieldPriority: 'essential' | 'common' | 'advanced' | 'expert' = 'common';\n\n for (const [groupName, groupConfig] of Object.entries(groups)) {\n if (groupConfig.fields.includes(fieldName)) {\n fieldGroup = groupName;\n fieldPriority = groupConfig.priority;\n break;\n }\n }\n\n enhancedShape[fieldName] = extendZodSchema(fieldSchema).withProgressive(fieldPriority, fieldGroup);\n }\n\n return extendedSchema;\n }\n }\n\n return extendedSchema;\n}\n\n/**\n * Utility to convert legacy render configs to enhanced configs\n */\nexport function enhanceRenderConfig(config: RenderConfigSchema): EnhancedRenderConfig {\n return {\n ...config,\n progressive: {\n priority: config.ui?.priority || 'common',\n group: config.ui?.group\n }\n };\n}\n\n/**\n * Helper to extract progressive disclosure information from schema\n */\nexport function extractProgressiveInfo(schema: ZodType<unknown>): {\n priority: 'essential' | 'common' | 'advanced' | 'expert';\n group?: string;\n} {\n const renderConfig = getRenderConfig(schema);\n if (renderConfig?.progressive) {\n return {\n priority: renderConfig.progressive.priority,\n group: renderConfig.progressive.group\n };\n }\n\n if (renderConfig?.ui?.priority) {\n return {\n priority: renderConfig.ui.priority,\n group: renderConfig.ui.group\n };\n }\n\n return { priority: 'common' };\n}","/**\n * Structured response interface for inscription tools\n * Provides a consistent, user-friendly format for inscription results\n */\n\nexport interface InscriptionSuccessResponse {\n success: true;\n type: 'inscription';\n title: string;\n message: string;\n inscription: {\n /** The HRL (Hashinal Reference Link) for minting - e.g., \"hcs://1/0.0.123456\" */\n hrl: string;\n /** Topic ID where the inscription was stored */\n topicId: string;\n /** Type of Hashinal - Static (HCS-5) or Dynamic (HCS-6) */\n standard: 'Static' | 'Dynamic';\n /** CDN URL for direct access to the inscribed content */\n cdnUrl?: string;\n /** Transaction ID of the inscription */\n transactionId?: string;\n };\n metadata: {\n /** Name/title of the inscribed content */\n name?: string;\n /** Creator of the content */\n creator?: string;\n /** Description of the content */\n description?: string;\n /** Content type (image, text, etc.) */\n type?: string;\n /** Additional attributes */\n attributes?: Array<{ trait_type: string; value: string | number }>;\n };\n nextSteps: {\n /** Primary action the user should take next */\n primary: string;\n /** Additional context or options */\n context?: string;\n /** Specific metadata value to use for minting */\n mintingMetadata: string;\n };\n /** HashLink block data (only present when withHashLinkBlocks=true) */\n hashLinkBlock?: {\n /** Block topic ID on HCS */\n blockId: string;\n /** HashLink reference to the block */\n hashLink: string;\n /** Template topic ID */\n template: string;\n /** Block attributes for rendering */\n attributes: BlockAttributes;\n };\n}\n\nexport interface InscriptionQuoteResponse {\n success: true;\n type: 'quote';\n title: string;\n message: string;\n quote: {\n /** Total cost in HBAR */\n totalCostHbar: string;\n /** When the quote expires */\n validUntil: string;\n /** Cost breakdown details */\n breakdown?: CostBreakdown;\n };\n content: {\n /** Name of the content to be inscribed */\n name?: string;\n /** Creator of the content */\n creator?: string;\n /** Type of content */\n type?: string;\n };\n}\n\nexport interface InscriptionErrorResponse {\n success: false;\n type: 'error';\n title: string;\n message: string;\n error: {\n /** Error code for programmatic handling */\n code: string;\n /** Detailed error message */\n details: string;\n /** Suggestions for fixing the error */\n suggestions?: string[];\n };\n}\n\nexport type InscriptionResponse =\n | InscriptionSuccessResponse\n | InscriptionQuoteResponse\n | InscriptionErrorResponse;\n\n/**\n * Helper function to create a successful inscription response\n */\nexport function createInscriptionSuccess(params: {\n hrl: string;\n topicId: string;\n standard: 'Static' | 'Dynamic';\n cdnUrl?: string;\n transactionId?: string;\n metadata: {\n name?: string;\n creator?: string;\n description?: string;\n type?: string;\n attributes?: Array<{ trait_type: string; value: string | number }>;\n };\n}): InscriptionSuccessResponse {\n const { hrl, topicId, standard, cdnUrl, transactionId, metadata } = params;\n\n return {\n success: true,\n type: 'inscription',\n title: `${standard} Hashinal Inscription Complete`,\n message: `Successfully inscribed \"${\n metadata.name || 'your content'\n }\" as a ${standard} Hashinal. The content is now ready for NFT minting.`,\n inscription: {\n hrl,\n topicId,\n standard,\n cdnUrl,\n transactionId,\n },\n metadata,\n nextSteps: {\n primary: 'CRITICAL: When minting NFTs, use ONLY the mintingMetadata value as a single string in the metadata array. Do NOT create JSON objects.',\n context:\n 'The metadata parameter for minting should be exactly: [\"' + hrl + '\"] - just the HRL string in an array, nothing else.',\n mintingMetadata: hrl,\n },\n };\n}\n\n/**\n * Block attributes for HashLink rendering\n */\ninterface BlockAttributes {\n /** Display name */\n name?: string;\n /** Description text */\n description?: string;\n /** Image URL */\n image?: string;\n /** Content type */\n contentType?: string;\n /** Size in bytes */\n size?: number;\n /** Custom metadata */\n metadata?: Record<string, string | number | boolean>;\n}\n\n/**\n * Transfer details in cost breakdown\n */\ninterface TransferDetails {\n to: string;\n amount: string;\n description: string;\n}\n\n/**\n * Cost breakdown details for inscription quote\n */\ninterface CostBreakdown {\n transfers: TransferDetails[];\n baseFee?: number;\n sizeFee?: number;\n networkFee?: number;\n serviceFee?: number;\n totalFee?: number;\n currency?: string;\n}\n\n/**\n * Helper function to create a quote response\n */\nexport function createInscriptionQuote(params: {\n totalCostHbar: string;\n validUntil: string;\n breakdown?: CostBreakdown;\n content: {\n name?: string;\n creator?: string;\n type?: string;\n };\n}): InscriptionQuoteResponse {\n const { totalCostHbar, validUntil, breakdown, content } = params;\n\n return {\n success: true,\n type: 'quote',\n title: 'Inscription Cost Quote',\n message: `Estimated cost to inscribe \"${\n content.name || 'your content'\n }\" is ${totalCostHbar} HBAR.`,\n quote: {\n totalCostHbar,\n validUntil,\n breakdown,\n },\n content,\n };\n}\n\n/**\n * Helper function to create an error response\n */\nexport function createInscriptionError(params: {\n code: string;\n details: string;\n suggestions?: string[];\n}): InscriptionErrorResponse {\n const { code, details, suggestions } = params;\n\n return {\n success: false,\n type: 'error',\n title: 'Inscription Failed',\n message: `Unable to complete inscription: ${details}`,\n error: {\n code,\n details,\n suggestions,\n },\n };\n}\n\n/**\n * Helper for pending inscription state (submitted but not yet confirmed)\n */\nexport function createInscriptionPending(params: {\n transactionId: string;\n details?: string;\n suggestions?: string[];\n}): InscriptionErrorResponse {\n const { transactionId, details, suggestions } = params;\n const d = details || `Inscription submitted but not yet confirmed. Transaction ID: ${transactionId}`;\n return {\n success: false,\n type: 'error',\n title: 'Inscription Submitted (Pending)',\n message: d,\n error: {\n code: 'INSCRIPTION_PENDING',\n details: d,\n suggestions: suggestions || [\n 'Wait a few moments for confirmation',\n 'Check the transaction status on a Hedera explorer',\n \"Try the inscription again if it doesn't confirm within 5 minutes\",\n ],\n },\n };\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n InscriptionResult,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { validateHIP412Metadata } from '../../validation/hip412-schemas';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { generateDefaultMetadata } from '../../utils/metadata-defaults';\nimport {\n extendZodSchema,\n renderConfigs,\n} from '../../lib/zod-render/schema-extension';\nimport {\n createInscriptionSuccess,\n createInscriptionQuote,\n createInscriptionError,\n createInscriptionPending,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\n\n/**\n * Network-specific Hashinal block configuration for HashLink blocks\n */\nconst HASHLINK_BLOCK_CONFIG = {\n testnet: {\n blockId: '0.0.6617393',\n hashLink: 'hcs://12/0.0.6617393',\n template: '0.0.6617393',\n },\n mainnet: {\n blockId: '0.0.TBD',\n hashLink: 'hcs://12/0.0.TBD',\n template: '0.0.TBD',\n },\n};\n\n/**\n * Gets the appropriate HashLink block configuration for the specified network.\n * Provides graceful fallback to testnet for unknown networks or undeployed mainnet blocks.\n *\n * @param network The network type to get configuration for\n * @returns Network-specific block configuration with blockId, hashLink, and template\n */\nfunction getHashLinkBlockId(network: 'mainnet' | 'testnet'): {\n blockId: string;\n hashLink: string;\n template: string;\n} {\n const config =\n network === 'mainnet'\n ? HASHLINK_BLOCK_CONFIG.mainnet\n : HASHLINK_BLOCK_CONFIG.testnet;\n if (!config || config.blockId === '0.0.TBD') {\n return HASHLINK_BLOCK_CONFIG.testnet;\n }\n return config;\n}\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = extendZodSchema(\n z.object({\n url: z\n .string()\n .optional()\n .describe(\n 'The URL of the content to inscribe as Hashinal NFT (use this OR contentRef)'\n ),\n contentRef: contentRefSchema\n .optional()\n .describe(\n 'Content reference ID in format \"content-ref:[id]\" for already stored content (use this OR url)'\n ),\n base64Data: z\n .string()\n .optional()\n .describe(\n 'Base64 encoded content data (use this if neither url nor contentRef provided)'\n ),\n fileName: z\n .string()\n .optional()\n .describe(\n 'File name for the content (required when using base64Data or contentRef)'\n ),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content (e.g., \"image/png\", \"image/jpeg\")'),\n name: z\n .string()\n .optional()\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n creator: z\n .string()\n .optional()\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n description: z\n .string()\n .optional()\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card\")'\n ),\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe(\n 'Collectible traits and characteristics (e.g., \"Rarity\": \"Epic\", \"Color\": \"Blue\", \"Style\": \"Abstract\")'\n ),\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 fileStandard: z\n .enum(['1', '6'])\n .optional()\n .default('1')\n .describe(\n 'HCS file standard: 1 for static Hashinals (HCS-5), 6 for dynamic Hashinals (HCS-6)'\n ),\n tags: z.array(z.string()).optional().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 .default(true),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Timeout in milliseconds for inscription (default: no timeout - waits until completion)'\n ),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\n withHashLinkBlocks: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'If true, creates interactive HashLink blocks for the inscribed content and returns block data alongside the inscription response'\n ),\n renderForm: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'Whether to show a form to collect metadata. Set to false only if user provided complete metadata including name, description, creator, and attributes.'\n ),\n })\n).withRender({\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n});\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool\n extends BaseInscriberQueryTool\n implements FormValidatable\n{\n name = 'inscribeHashinal';\n description =\n 'Tool for inscribing Hashinal NFTs. CRITICAL: When user provides content (url/contentRef/base64Data), call with ONLY the content parameters - DO NOT auto-generate name, description, creator, or attributes. A form will be automatically shown to collect metadata from the user. Only include metadata parameters if the user explicitly provided them in their message.';\n\n getEntityResolutionPreferences(): Record<string, string> {\n return {\n name: 'literal',\n description: 'literal',\n creator: 'literal',\n attributes: 'literal',\n properties: 'literal',\n };\n }\n\n get specificInputSchema(): z.ZodObject<z.ZodRawShape> {\n const baseSchema =\n (inscribeHashinalSchema as z.ZodType & { _def?: { schema?: z.ZodType } })\n ._def?.schema || inscribeHashinalSchema;\n return baseSchema as z.ZodObject<z.ZodRawShape>;\n }\n\n private _schemaWithRenderConfig?: z.ZodObject<z.ZodRawShape>;\n\n override get schema(): z.ZodObject<z.ZodRawShape> {\n if (!this._schemaWithRenderConfig) {\n const baseSchema = this.specificInputSchema;\n const schemaWithRender = baseSchema as z.ZodObject<z.ZodRawShape> & {\n _renderConfig?: {\n fieldType: string;\n ui: { label: string; description: string };\n };\n };\n\n if (!schemaWithRender._renderConfig) {\n schemaWithRender._renderConfig = {\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n };\n }\n this._schemaWithRenderConfig = baseSchema;\n }\n return this._schemaWithRenderConfig;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a form should be generated for the given input\n */\n shouldGenerateForm(input: unknown): boolean {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n const inputObj = input as Record<string, unknown>;\n\n logger.info('InscribeHashinalTool: Checking if form should be generated', {\n inputKeys: Object.keys(inputObj || {}),\n hasContent: !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n ),\n renderFormProvided: 'renderForm' in inputObj,\n renderFormValue: inputObj.renderForm,\n });\n\n const hasContentSource = !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n );\n\n if (!hasContentSource) {\n logger.info('InscribeHashinalTool: No content source provided');\n return false;\n }\n\n if ('renderForm' in inputObj && inputObj.renderForm === false) {\n logger.info(\n 'InscribeHashinalTool: renderForm=false, skipping form generation'\n );\n return false;\n }\n\n const isNonEmptyString = (v: unknown): v is string => {\n if (typeof v !== 'string') {\n return false;\n }\n if (v.trim().length === 0) {\n return false;\n }\n return true;\n };\n\n const hasRequiredMetadata =\n isNonEmptyString(inputObj.name) &&\n isNonEmptyString(inputObj.description) &&\n isNonEmptyString(inputObj.creator);\n\n if (hasRequiredMetadata) {\n logger.info(\n 'InscribeHashinalTool: Required metadata present, skipping form generation'\n );\n return false;\n }\n\n logger.info(\n 'InscribeHashinalTool: Content provided, showing form for metadata collection'\n );\n return true;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns the focused schema for form generation\n */\n getFormSchema(): z.ZodObject<z.ZodRawShape> {\n const focusedSchema = extendZodSchema(\n z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n\n description: z\n .string()\n .min(1, 'Description is required')\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n\n creator: z\n .string()\n .min(1, 'Creator is required')\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z\n .string()\n .describe('Trait name (e.g., \"Rarity\", \"Color\", \"Style\")'),\n value: z\n .union([z.string(), z.number()])\n .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe('Collectible traits and characteristics.'),\n\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card)'\n ),\n })\n ).withRender({\n fieldType: 'object',\n ui: {\n label: 'Complete NFT Metadata',\n description: 'Provide meaningful metadata to create a valuable NFT',\n },\n });\n\n return focusedSchema as unknown as z.ZodObject<z.ZodRawShape>;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<InscriptionResponse> {\n if (!params.url && !params.contentRef && !params.base64Data) {\n return createInscriptionError({\n code: 'MISSING_CONTENT',\n details: 'No content source provided',\n suggestions: [\n 'Provide a URL to content you want to inscribe',\n 'Upload a file and use the content reference',\n 'Provide base64-encoded content data',\n ],\n });\n }\n\n const operatorAccount =\n this.inscriberBuilder[\n 'hederaKit'\n ]?.client?.operatorAccountId?.toString() || '0.0.unknown';\n\n const rawMetadata = {\n ...generateDefaultMetadata({\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n fileName: params.fileName,\n mimeType: params.mimeType,\n operatorAccount,\n }),\n attributes: Array.isArray(params.attributes) ? params.attributes : [],\n properties:\n (params.properties as Record<string, unknown> | undefined) || {},\n };\n\n let validatedMetadata;\n try {\n validatedMetadata = validateHIP412Metadata(rawMetadata);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return createInscriptionError({\n code: 'METADATA_VALIDATION_FAILED',\n details: `Metadata validation error: ${errorMessage}`,\n suggestions: [\n 'Ensure all required metadata fields are provided',\n 'Check that attribute values are valid',\n 'Verify metadata follows HIP-412 standard',\n ],\n });\n }\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata: validatedMetadata,\n jsonFileURL: params.jsonFileURL,\n fileStandard: params.fileStandard,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n let inscriptionData: InscriptionInput;\n\n if (params.url) {\n inscriptionData = { type: 'url', url: params.url };\n } else if (params.contentRef || params.base64Data) {\n const inputData = params.contentRef || params.base64Data || '';\n const { buffer, mimeType, fileName } = await this.resolveContent(\n inputData,\n params.mimeType,\n params.fileName\n );\n\n inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName: fileName || params.fileName || 'hashinal-content',\n mimeType: mimeType || params.mimeType,\n };\n } else {\n throw new Error('No valid input data provided for inscription');\n }\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n inscriptionData,\n options\n );\n\n return createInscriptionQuote({\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n content: {\n name: params.name,\n creator: params.creator,\n type: params.type,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n return createInscriptionError({\n code: 'QUOTE_GENERATION_FAILED',\n details: `Quote generation failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify content is accessible',\n 'Try again in a moment',\n ],\n });\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribeAuto\n ? this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = this.inscriberBuilder.inscribeAuto\n ? await this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const ids = extractTopicIds(result.inscription, result.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const fileStandard = params.fileStandard || '1';\n const { hrl, topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n fileStandard\n );\n\n const txId =\n result?.inscription?.tx_id ||\n (result?.result as InscriptionResult)?.transactionId ||\n 'unknown';\n const successResponse = createInscriptionSuccess({\n hrl: hrl || 'hcs://1/unknown',\n topicId: topicId || 'unknown',\n standard: fileStandard === '6' ? 'Dynamic' : 'Static',\n cdnUrl,\n transactionId: txId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: Array.isArray(params.attributes)\n ? params.attributes\n : [],\n },\n });\n\n if (params.withHashLinkBlocks !== false) {\n try {\n const block = await this.createHashLinkBlock(successResponse);\n successResponse.hashLinkBlock = block;\n } catch (e) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn('Failed to create HashLink block', e);\n }\n }\n\n return successResponse;\n } else if (!result.quote && !result.confirmed) {\n const txId =\n (result.result as InscriptionResult)?.transactionId ||\n result?.inscription?.transactionId ||\n 'unknown';\n return createInscriptionPending({\n transactionId: txId,\n details:\n 'Successfully submitted Hashinal inscription. Waiting for network confirmation...',\n });\n } else {\n return createInscriptionError({\n code: 'UNEXPECTED_RESULT',\n details: 'Received an unexpected inscription result state',\n suggestions: ['Try again or verify network status'],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n\n /**\n * Creates HashLink block configuration for Hashinal inscriptions.\n * Automatically detects network and selects appropriate block ID configuration.\n * Uses testnet block as fallback for unknown networks or undeployed mainnet blocks.\n *\n * @param response The inscription response containing metadata and network information\n * @param _mimeType Optional MIME type (currently unused, preserved for compatibility)\n * @returns HCS12BlockResult with network-specific block configuration\n *\n * @example\n * ```typescript\n * // Testnet usage (automatic detection from client)\n * const testnetClient = Client.forTestnet();\n * const tool = new InscribeHashinalTool(testnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * const id = block.blockId; // '0.0.6617393'\n * const link = block.hashLink; // 'hcs://12/0.0.6617393'\n *\n * // Mainnet usage (automatic detection from client)\n * const mainnetClient = Client.forMainnet();\n * const tool = new InscribeHashinalTool(mainnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * const mainnetId = block.blockId; // Network-specific mainnet block ID\n *\n * // HashLink Block Response Structure:\n * {\n * blockId: string; // Hedera account ID format (e.g., '0.0.6617393')\n * hashLink: string; // HCS-12 URL format: 'hcs://12/{blockId}'\n * template: string; // Block template reference matching blockId\n * attributes: { // Metadata for client-side processing\n * name: string; // Content display name\n * creator: string; // Creator account ID\n * topicId: string; // HCS topic containing the inscription\n * hrl: string; // Hedera Resource Locator\n * network: string; // Network type: 'testnet' | 'mainnet'\n * }\n * }\n *\n * // Render function usage in HashLink blocks:\n * // The block's JavaScript render function receives this structure\n * // and can access network-specific resources through attributes.network\n * ```\n */\n private async createHashLinkBlock(\n response: ReturnType<typeof createInscriptionSuccess>,\n _mimeType?: string\n ): Promise<{\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n }> {\n const clientNetwork = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const cdnNetwork = response.inscription.cdnUrl?.includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n if (clientNetwork !== cdnNetwork) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn(\n `Network mismatch detected: client=${clientNetwork}, cdn=${cdnNetwork}. Using client network.`\n );\n }\n\n const network = clientNetwork;\n const config = getHashLinkBlockId(network);\n\n return {\n blockId: config.blockId,\n hashLink: config.hashLink,\n template: config.template,\n attributes: {\n name: response.metadata.name || 'Untitled Content',\n creator: response.metadata.creator || '',\n topicId: response.inscription.topicId,\n hrl: response.inscription.hrl,\n network: network,\n },\n };\n }\n\n private async resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): Promise<{\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n }> {\n const trimmedInput = input.trim();\n\n const resolver =\n this.getContentResolver() || ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n private handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n } {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns essential fields that should always be shown in forms\n */\n getEssentialFields(): string[] {\n return ['name', 'description', 'creator', 'attributes'];\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a field value should be considered empty for this tool\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n if (fieldName === 'attributes' && Array.isArray(value)) {\n return value.every(\n (attr) =>\n !attr ||\n (typeof attr === 'object' && (!attr.trait_type || !attr.value))\n );\n }\n\n return false;\n }\n}\n","import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport type { RetrievedInscriptionResult } from '@hashgraphonline/standards-sdk';\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 * Type definition for inscription retrieval result\n */\ninterface InscriptionRetrievalResult {\n inscriptionId?: string;\n transactionId: string;\n topicId?: string;\n status?: string;\n holderId?: string;\n metadata?: unknown;\n tags?: unknown;\n mode?: string;\n chunks?: unknown;\n createdAt?: string;\n completedAt?: string;\n fileUrl?: string;\n mimeType?: string;\n fileSize?: number;\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<InscriptionRetrievalResult> {\n const result: RetrievedInscriptionResult = 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 unknown as { inscriptionId?: string }).inscriptionId,\n transactionId: (result as unknown as { transactionId?: string }).transactionId || 'unknown',\n topicId: (result as unknown as { topic_id?: string; topicId?: string }).topic_id || (result as unknown as { topicId?: string }).topicId,\n status: (result as unknown as { status?: string }).status || 'unknown',\n holderId: (result as unknown as { holderId?: string }).holderId,\n metadata: result.metadata,\n tags: (result as unknown as { tags?: unknown }).tags,\n mode: (result as unknown as { mode?: string }).mode,\n chunks: (result as unknown as { chunks?: unknown }).chunks,\n createdAt: (result as unknown as { createdAt?: string }).createdAt,\n completedAt: (result as unknown as { completed?: string; completedAt?: string }).completed || (result as unknown as { completedAt?: string }).completedAt,\n fileUrl: (result as unknown as { fileUrl?: string }).fileUrl,\n mimeType: (result as unknown as { mimeType?: string }).mimeType,\n fileSize: (result as unknown as { fileSize?: number }).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 logger.error(`Error creating ${agentName} agent:`, error, { baseClient });\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 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 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 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 this.connectionsManager.updateOrAddConnection(sdkConnection);\n\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 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 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 const byTopicId =\n this.connectionsManager.getConnectionByTopicId(identifier);\n if (byTopicId) {\n return this.convertToActiveConnection(byTopicId);\n }\n\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\n if (!(connectionTopicId in this.connectionMessageTimestamps)) {\n this.connectionMessageTimestamps[connectionTopicId] = timestampNanos;\n return;\n }\n\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","export type NetworkString = 'mainnet' | 'testnet'\n\nexport interface DAppSigner {\n getAccountId(): { toString(): string }\n [key: string]: unknown\n}\n\nexport type WalletInfo = { accountId: string; network: NetworkString }\n\nexport type WalletInfoResolver = () => Promise<WalletInfo | null> | WalletInfo | null\n\nexport type WalletExecutor = (\n base64: string,\n network: NetworkString\n) => Promise<{ transactionId: string }>\n\nexport type HCSOperation =\n | 'submitConnectionRequest'\n | 'handleConnectionRequest'\n | 'sendMessage'\n | 'hcs2.createRegistry'\n | 'hcs2.migrateRegistry'\n | 'hcs2.registerEntry'\n | 'hcs2.updateEntry'\n | 'hcs2.deleteEntry'\n | 'hcs2.submitMessage'\n | 'hcs6.createRegistry'\n | 'hcs6.registerEntry'\n | 'hcs6.submitMessage'\n\nexport type StartHCSDelegate = (\n op: HCSOperation,\n request: Record<string, unknown>,\n network: NetworkString\n) => Promise<{ transactionBytes: string }>\n\n/**\n * Central registry for browser signer and wallet execution delegates\n */\nexport class SignerProviderRegistry {\n private static _signerProvider: (() => Promise<DAppSigner | null>) | (() => DAppSigner | null) | DAppSigner | null\n private static _walletInfoResolver: WalletInfoResolver | null\n private static _walletExecutor: WalletExecutor | null\n private static _startHCSDelegate: StartHCSDelegate | null\n private static _browserHCSClientFactory: ((network: NetworkString) => unknown) | null\n private static _preferWalletOnly = false\n\n static setSignerProvider(provider: typeof SignerProviderRegistry._signerProvider): void {\n this._signerProvider = provider\n }\n\n static async getSigner(): Promise<DAppSigner | null> {\n const p = this._signerProvider\n if (!p) return null\n try {\n if (typeof p === 'function') {\n const val = (p as () => Promise<DAppSigner | null> | DAppSigner | null)()\n return (val && typeof (val as Promise<unknown>).then === 'function')\n ? await (val as Promise<DAppSigner | null>)\n : (val as DAppSigner | null)\n }\n return p as DAppSigner\n } catch {\n return null\n }\n }\n\n static setWalletInfoResolver(resolver: WalletInfoResolver | null): void {\n this._walletInfoResolver = resolver || null\n }\n\n static async getWalletInfo(): Promise<WalletInfo | null> {\n const r = this._walletInfoResolver\n if (!r) return null\n try {\n const val = r()\n return (val && typeof (val as Promise<unknown>).then === 'function')\n ? await (val as Promise<WalletInfo | null>)\n : (val as WalletInfo | null)\n } catch {\n return null\n }\n }\n\n static setWalletExecutor(executor: WalletExecutor | null): void {\n this._walletExecutor = executor || null\n }\n\n static get walletExecutor(): WalletExecutor | null {\n return this._walletExecutor || null\n }\n\n static setStartHCSDelegate(delegate: StartHCSDelegate | null): void {\n this._startHCSDelegate = delegate || null\n }\n\n static get startHCSDelegate(): StartHCSDelegate | null {\n return this._startHCSDelegate || null\n }\n\n static setPreferWalletOnly(flag: boolean): void {\n this._preferWalletOnly = !!flag\n }\n\n /**\n * Register a factory to construct a BrowserHCSClient-like instance for wallet-driven flows\n */\n static setBrowserHCSClientFactory(factory: ((network: NetworkString) => unknown) | null): void {\n this._browserHCSClientFactory = factory || null\n }\n\n static getBrowserHCSClient(network: NetworkString): unknown | null {\n return this._browserHCSClientFactory ? this._browserHCSClientFactory(network) : null\n }\n\n static get preferWalletOnly(): boolean {\n return this._preferWalletOnly\n }\n}\n\n","import { BaseServiceBuilder } from 'hedera-agent-kit';\nimport type { HederaAgentKit } from 'hedera-agent-kit';\nimport { PrivateKey, TransactionReceipt } from '@hashgraph/sdk';\nimport { SignerProviderRegistry, type DAppSigner, type NetworkString } from '../../signing/signer-provider';\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 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\n this.stateManager = stateManager;\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 = ((): SDKLogger => {\n try {\n if (typeof SDKLogger === 'function') {\n return new SDKLogger({\n module: 'HCS10Builder',\n level: options?.logLevel || 'info',\n });\n }\n } catch {}\n return {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n trace: () => {},\n setLogLevel: () => {},\n getLevel: () => 'info',\n setSilent: () => {},\n setModule: () => {},\n } as unknown as SDKLogger;\n })();\n\n this.standardClient = new HCS10Client({\n network: this.network,\n operatorId: operatorId,\n operatorPrivateKey: operatorPrivateKey,\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 const start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (exec && ByteBuildRegistry.has('submitConnectionRequest')) {\n const built = await ByteBuildRegistry.build('submitConnectionRequest', this.hederaKit, { inboundTopicId, memo });\n if (built && built.transactionBytes) {\n const { transactionId } = await exec(built.transactionBytes, network);\n return ({ transactionId } as unknown) as TransactionReceipt;\n }\n }\n } catch {}\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = { inboundTopicId, memo };\n const { transactionBytes } = await start('submitConnectionRequest', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n return ({ transactionId } as unknown) as TransactionReceipt;\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = {\n inboundTopicId,\n requestingAccountId,\n connectionRequestId,\n feeConfig: feeConfig ? 'configured' : undefined,\n };\n const { transactionBytes } = await start('handleConnectionRequest', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n const minimal = {\n success: true,\n transactionId,\n } as unknown as HandleConnectionRequestResponse;\n return minimal;\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 let prevMaxSeq = 0\n try {\n const prev = await this.getMessages(topicId)\n prevMaxSeq = prev.messages.reduce((max, m) => Math.max(max, m.sequence_number || 0), 0)\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network: NetworkString = this.network;\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (exec && ByteBuildRegistry.has('sendMessage')) {\n const built = await ByteBuildRegistry.build('sendMessage', this.hederaKit, { topicId, data, memo });\n if (built && built.transactionBytes) {\n const { transactionId } = await exec(built.transactionBytes, network);\n const sequenceNumber = await this.pollForNewSequence(topicId, prevMaxSeq);\n return {\n sequenceNumber,\n receipt: ({ transactionId } as unknown) as TransactionReceipt,\n transactionId,\n };\n }\n }\n } catch {}\n\n if (start && exec) {\n try {\n const request: Record<string, unknown> = { topicId, data, memo };\n const { transactionBytes } = await start('sendMessage', request, network);\n const { transactionId } = await exec(transactionBytes, network);\n\n const sequenceNumber = await this.pollForNewSequence(topicId, prevMaxSeq);\n return {\n sequenceNumber,\n receipt: ({ transactionId } as unknown) as TransactionReceipt,\n transactionId,\n };\n } catch (err) {\n if (preferWallet) {\n const e = new Error(`wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n (e as unknown as { code: string }).code = 'wallet_submit_failed';\n throw e;\n }\n }\n } else if (preferWallet) {\n const e = new Error('wallet_unavailable: connect a wallet or configure StartHCSDelegate and WalletExecutor');\n (e as unknown as { code: string }).code = 'wallet_unavailable';\n throw e;\n }\n\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 private async pollForNewSequence(topicId: string, prevMax: number): Promise<number | undefined> {\n const maxAttempts = 10\n const delayMs = 1000\n for (let i = 0; i < maxAttempts; i++) {\n try {\n const res = await this.getMessages(topicId)\n const maxSeq = res.messages.reduce((m, msg) => Math.max(m, msg.sequence_number || 0), prevMax)\n if (maxSeq > prevMax) return maxSeq\n } catch {}\n await new Promise((r) => setTimeout(r, delayMs))\n }\n return undefined\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 preferWallet = SignerProviderRegistry.preferWalletOnly;\n const browserClient = SignerProviderRegistry.getBrowserHCSClient(this.network as NetworkString) as\n | { create: (builder: unknown, opts?: Record<string, unknown>) => Promise<unknown> }\n | null;\n\n if (browserClient) {\n try {\n const aBuilder = new AgentBuilder()\n .setNetwork(this.network)\n .setName(registrationData.name)\n .setAlias(registrationData.alias || `${registrationData.name}-${Date.now()}`)\n .setBio(registrationData.bio || '')\n .setType(registrationData.type || 'autonomous')\n .setModel(registrationData.model || 'agent-model-2024');\n\n if (registrationData.capabilities?.length) {\n aBuilder.setCapabilities(registrationData.capabilities as unknown as number[]);\n }\n if (registrationData.creator) aBuilder.setCreator(registrationData.creator);\n if (registrationData.existingProfilePictureTopicId) {\n aBuilder.setExistingProfilePicture(registrationData.existingProfilePictureTopicId);\n }\n if (registrationData.socials) {\n Object.entries(registrationData.socials).forEach(([platform, handle]) => {\n if (handle && typeof handle === 'string') {\n aBuilder.addSocial(platform as SocialPlatform, handle);\n }\n });\n }\n if (registrationData.properties) {\n Object.entries(registrationData.properties).forEach(([key, value]) => {\n if (value != null) aBuilder.addProperty(key, value as unknown as string);\n });\n }\n\n const resp = await browserClient.create(aBuilder, {\n progressCallback: (_: unknown) => {},\n updateAccountMemo: true,\n });\n\n this.executeResult = {\n success: true,\n transactionId: undefined,\n receipt: undefined,\n scheduleId: undefined,\n rawResult: { result: resp, name: registrationData.name },\n } as unknown as ExecuteResult & { rawResult?: unknown };\n\n return this;\n } catch (walletErr) {\n if (preferWallet) {\n throw new Error(`wallet_registration_failed: ${walletErr instanceof Error ? walletErr.message : String(walletErr)}`);\n }\n }\n } else if (preferWallet) {\n throw new Error('wallet_unavailable: BrowserHCSClient factory not provided');\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 try {\n const refreshed = await this.stateManager?.getConnectionsManager()?.fetchConnectionData(currentAgent.accountId);\n const established = (refreshed || []).find(\n (c: unknown) => (c as { targetAccountId?: string; status?: string }).targetAccountId === targetAccountId &&\n (c as { status?: string }).status === 'established'\n ) as { connectionTopicId?: string } | undefined;\n if (established?.connectionTopicId) {\n connectionTopicId = established.connectionTopicId;\n }\n } catch (e) {\n this.logger.debug('Could not refresh connections after acceptance to derive topic id:', e);\n }\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 let baseSeq = 0\n try {\n const prev = await this.getMessages(connectionTopicId)\n baseSeq = prev.messages.reduce((max, m) => Math.max(max, m.sequence_number || 0), 0)\n } catch {}\n\n const messageResult = await this.sendMessage(\n connectionTopicId,\n params.message,\n `Agent message from ${currentAgent.name}`\n );\n\n const effectiveSeq = messageResult.sequenceNumber ?? baseSeq\n if (effectiveSeq === 0) {\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 effectiveSeq\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","\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 { ZodType } from 'zod';\n\n/**\n * Type definitions for Zod internal structures\n */\ninterface ZodDef {\n typeName: string;\n type?: ZodType<unknown>;\n}\n\n/**\n * Type definition for Zod object schema with shape property\n */\ninterface ZodObjectSchema {\n _def: ZodDef;\n shape: Record<string, ZodType<unknown>>;\n}\n\n/**\n * Type definition for Zod array schema with element type\n */\ninterface ZodArraySchema {\n _def: ZodDef & {\n type: ZodType<unknown>;\n };\n}\n\n/**\n * Type definition for field config map entries\n */\ninterface FieldConfigMapEntry {\n renderConfig: RenderConfigSchema;\n metadata: FieldMetadata;\n path: string[];\n}\n\n\n/**\n * Type definition for simple field configuration\n */\ninterface SimpleFieldConfig {\n name: string;\n type: FormFieldType;\n label: string;\n required: boolean;\n placeholder?: string;\n options?: Array<{ value: unknown; label: string }>;\n}\nimport {\n RenderConfigSchema,\n ExtractedRenderConfig,\n FieldMetadata,\n FormFieldType\n} from './types';\nimport {\n hasRenderConfig,\n getRenderConfig,\n extractFieldMetadata,\n getInnerSchema\n} from './schema-extension';\n\n/**\n * Extracts render configurations from a Zod schema and all nested schemas\n */\nexport function extractRenderConfigs(schema: ZodType<unknown>): ExtractedRenderConfig {\n const fields: Record<string, RenderConfigSchema> = {};\n const groups: Record<string, string[]> = {};\n const order: string[] = [];\n const metadata: Record<string, FieldMetadata> = {};\n\n extractFromSchema(schema, '', fields, groups, order, metadata);\n\n return {\n fields,\n groups: organizeFieldGroups(groups),\n order: orderFields(order, fields),\n metadata\n };\n}\n\n/**\n * Recursively extracts render configurations from schema and nested schemas\n */\nfunction extractFromSchema(\n schema: ZodType<unknown>,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n const innerSchema = getInnerSchema(schema);\n const typeName = (innerSchema._def as ZodDef)?.typeName;\n\n if (typeName === 'ZodObject') {\n extractFromObjectSchema(innerSchema as unknown as ZodObjectSchema, pathPrefix, fields, groups, order, metadata);\n } else if (typeName === 'ZodArray') {\n extractFromArraySchema(innerSchema as unknown as ZodArraySchema, pathPrefix, fields, groups, order, metadata);\n } else {\n extractFromPrimitiveSchema(schema, pathPrefix, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from ZodObject schemas\n */\nfunction extractFromObjectSchema(\n schema: ZodObjectSchema,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n const shape = schema.shape;\n\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config && pathPrefix) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n }\n }\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const fieldPath = pathPrefix ? `${pathPrefix}.${key}` : key;\n extractFromSchema(fieldSchema as ZodType<unknown>, fieldPath, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from ZodArray schemas\n */\nfunction extractFromArraySchema(\n schema: ZodArraySchema,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n metadata[pathPrefix] = extractFieldMetadata(schema);\n }\n }\n\n const elementSchema = schema._def.type;\n if (elementSchema) {\n const itemPath = `${pathPrefix}[]`;\n extractFromSchema(elementSchema, itemPath, fields, groups, order, metadata);\n }\n}\n\n/**\n * Extracts configurations from primitive schemas\n */\nfunction extractFromPrimitiveSchema(\n schema: ZodType<unknown>,\n pathPrefix: string,\n fields: Record<string, RenderConfigSchema>,\n groups: Record<string, string[]>,\n order: string[],\n metadata: Record<string, FieldMetadata>\n): void {\n if (hasRenderConfig(schema)) {\n const config = getRenderConfig(schema);\n if (config) {\n fields[pathPrefix] = config;\n addToGroup(groups, config.ui?.group || 'default', pathPrefix);\n addToOrder(order, pathPrefix, config.ui?.order);\n }\n }\n\n metadata[pathPrefix] = extractFieldMetadata(schema);\n}\n\n/**\n * Adds a field to a group\n */\nfunction addToGroup(groups: Record<string, string[]>, groupName: string, fieldPath: string): void {\n if (!groups[groupName]) {\n groups[groupName] = [];\n }\n groups[groupName].push(fieldPath);\n}\n\n/**\n * Adds a field to the order array considering explicit order values\n */\nfunction addToOrder(order: string[], fieldPath: string, explicitOrder?: number): void {\n if (explicitOrder !== undefined) {\n order.splice(explicitOrder, 0, fieldPath);\n } else {\n order.push(fieldPath);\n }\n}\n\n/**\n * Organizes field groups with proper ordering\n */\nfunction organizeFieldGroups(groups: Record<string, string[]>): Record<string, string[]> {\n const organized: Record<string, string[]> = {};\n const groupPriority = ['default', 'Keys & Security', 'Token Settings', 'Custom Fees'];\n\n for (const groupName of groupPriority) {\n if (groups[groupName]) {\n organized[groupName] = groups[groupName];\n }\n }\n\n for (const [groupName, fields] of Object.entries(groups)) {\n if (!groupPriority.includes(groupName)) {\n organized[groupName] = fields;\n }\n }\n\n return organized;\n}\n\n/**\n * Orders fields based on explicit order values and logical grouping\n */\nfunction orderFields(order: string[], fields: Record<string, RenderConfigSchema>): string[] {\n const fieldPriority: Record<string, number> = {\n 'tokenName': 1,\n 'tokenSymbol': 2,\n 'maxSupply': 3,\n 'supplyType': 4,\n 'treasuryAccountId': 5,\n 'memo': 6,\n };\n\n return order.sort((a, b) => {\n const aConfig = fields[a];\n const bConfig = fields[b];\n\n if (aConfig?.ui?.order !== undefined && bConfig?.ui?.order !== undefined) {\n return aConfig.ui.order - bConfig.ui.order;\n }\n\n if (aConfig?.ui?.order !== undefined) {\n return -1;\n }\n if (bConfig?.ui?.order !== undefined) {\n return 1;\n }\n\n const aPriority = fieldPriority[a] || 1000;\n const bPriority = fieldPriority[b] || 1000;\n\n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n\n return a.localeCompare(b);\n });\n}\n\n/**\n * Generates field ordering metadata for complex forms\n */\nexport function generateFieldOrdering(schema: ZodType<unknown>): {\n sections: Record<string, { title: string; fields: string[]; order: number }>;\n fieldOrder: string[];\n} {\n const extracted = extractRenderConfigs(schema);\n const sections: Record<string, { title: string; fields: string[]; order: number }> = {};\n\n const sectionOrder: Record<string, number> = {\n 'default': 0,\n 'Basic Information': 1,\n 'Token Settings': 2,\n 'Keys & Security': 3,\n 'Custom Fees': 4,\n 'Advanced Settings': 5\n };\n\n for (const [groupName, fields] of Object.entries(extracted.groups)) {\n const displayName = groupName === 'default' ? 'Basic Information' : groupName;\n sections[displayName] = {\n title: displayName,\n fields,\n order: sectionOrder[displayName] || 10\n };\n }\n\n return {\n sections,\n fieldOrder: extracted.order\n };\n}\n\n/**\n * Creates a field configuration map for form builders\n */\nexport function createFieldConfigMap(schema: ZodType<unknown>): Record<string, FieldConfigMapEntry> {\n const extracted = extractRenderConfigs(schema);\n const configMap: Record<string, FieldConfigMapEntry> = {};\n\n for (const [fieldPath, renderConfig] of Object.entries(extracted.fields)) {\n const metadata = extracted.metadata[fieldPath];\n const path = fieldPath.split('.');\n\n configMap[fieldPath] = {\n renderConfig,\n metadata,\n path\n };\n }\n\n return configMap;\n}\n\n\n\n\n/**\n * Creates a simplified configuration for basic form rendering\n */\nexport function createSimpleConfig(schema: ZodType<unknown>): {\n fields: Array<SimpleFieldConfig>;\n} {\n const extracted = extractRenderConfigs(schema);\n const fields = [];\n\n for (const fieldPath of extracted.order) {\n const renderConfig = extracted.fields[fieldPath];\n const metadata = extracted.metadata[fieldPath];\n\n if (!renderConfig || !metadata) {\n continue;\n }\n\n fields.push({\n name: fieldPath,\n type: metadata.type,\n label: renderConfig.ui?.label || fieldPath,\n required: metadata.required,\n placeholder: renderConfig.ui?.placeholder,\n options: renderConfig.options || metadata.options\n });\n }\n\n return { fields };\n}","export class CodedError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, CodedError.prototype);\n }\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 HederaMirrorNode,\n} from '@hashgraphonline/standards-sdk';\nimport { SignerProviderRegistry, type NetworkString } from '../../signing/signer-provider';\nimport type { TopicRegistrationResult, RegistryOperationResult, SubmitMessageResult } from '../../types/tx-results';\nimport { CodedError } from '../../utils/CodedError';\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().toString()\n : '';\n\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n let keyTypeHint: 'ed25519' | 'ecdsa' | undefined;\n try {\n const mirror = new HederaMirrorNode(networkType);\n const info = await mirror.requestAccount(operatorId);\n const t = (info as any)?.key?._type as string | undefined;\n if (t) {\n const upper = t.toUpperCase();\n if (upper.includes('ED25519')) keyTypeHint = 'ed25519';\n else if (upper.includes('ECDSA')) keyTypeHint = 'ecdsa';\n }\n } catch {}\n\n const config: SDKHCS2ClientConfig = {\n network: networkType,\n operatorId: operatorId,\n operatorKey: operatorPrivateKey,\n ...(keyTypeHint ? { keyType: keyTypeHint } : {}),\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<TopicRegistrationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { options };\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const { transactionBytes } = await start('hcs2.createRegistry', request, network);\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError('wallet_submit_failed', `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.createRegistry');\n }\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\n const client = await this.getHCS2Client();\n return await client.createRegistry(options);\n }\n /**\n * Register a new entry in an HCS-2 registry\n */\n async registerEntry(\n registryTopicId: string,\n options: RegisterEntryOptions\n ): Promise<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.registerEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.registerEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.registerEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.registerEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.updateEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.updateEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.updateEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.updateEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.deleteEntry')) {\n const built = await ByteBuildRegistry.build('hcs2.deleteEntry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = {\n registryTopicId,\n options,\n };\n const { transactionBytes } = await start('hcs2.deleteEntry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.deleteEntry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.migrateRegistry')) {\n const built = await ByteBuildRegistry.build('hcs2.migrateRegistry', this.hederaKit, { registryTopicId, options });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { registryTopicId, options };\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const { transactionBytes } = await start('hcs2.migrateRegistry', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.migrateRegistry');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\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<SubmitMessageResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (this.hederaKit.client.network.toString().includes('mainnet') ? 'mainnet' : 'testnet') as NetworkString;\n const hasPrivateKey = !!(this.hederaKit?.signer?.getOperatorPrivateKey && this.hederaKit.signer.getOperatorPrivateKey());\n\n try {\n const { ByteBuildRegistry } = await import('../../signing/bytes-registry');\n if (ByteBuildRegistry.has('hcs2.submitMessage')) {\n const built = await ByteBuildRegistry.build('hcs2.submitMessage', this.hederaKit, { topicId, payload });\n if (built && built.transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes: built.transactionBytes };\n }\n }\n }\n } catch {}\n\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { topicId, payload };\n const { transactionBytes } = await start('hcs2.submitMessage', request, network);\n if (transactionBytes) {\n if (exec) {\n return { success: true, transactionBytes };\n }\n if (!hasPrivateKey) {\n return { success: true, transactionBytes };\n }\n }\n } catch (err) {\n if (preferWallet) {\n const msg = `wallet_submit_failed: ${err instanceof Error ? err.message : String(err)}`;\n throw new CodedError('wallet_submit_failed', msg);\n }\n }\n }\n\n if (preferWallet) {\n throw new CodedError('wallet_unavailable', 'WalletExecutor not configured for hcs2.submitMessage');\n }\n\n if (!hasPrivateKey) {\n throw new CodedError('wallet_unavailable', 'No wallet executor and no operator private key available for server execution');\n }\n const client = await this.getHCS2Client();\n await client.submitMessage(topicId, payload);\n return { success: true };\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 HederaMirrorNode,\n TopicResponse,\n} from '@hashgraphonline/standards-sdk';\nimport {\n SignerProviderRegistry,\n type NetworkString,\n} from '../../signing/signer-provider';\nimport type {\n HCS6TopicRegistrationResult,\n HCS6RegistryOperationResult,\n HCS6CreateHashinalResult,\n} from '../../types/tx-results';\nimport { CodedError } from '../../utils/CodedError';\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().toString()\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<HCS6TopicRegistrationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { options };\n const { transactionBytes } = await start(\n 'hcs6.createRegistry',\n request,\n network\n );\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.createRegistry'\n );\n }\n }\n\n const client = await this.getHCS6Client();\n const sanitized = { ...options };\n if ('adminKey' in sanitized) {\n delete (sanitized as any).adminKey;\n }\n return await client.createRegistry(sanitized);\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<HCS6RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { registryTopicId, options };\n const { transactionBytes } = await start(\n 'hcs6.registerEntry',\n request,\n network\n );\n if (transactionBytes) {\n return { success: true, transactionBytes };\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.registerEntry'\n );\n }\n }\n\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 const metadata = {\n name: options.metadata?.name || 'Dynamic Hashinal',\n creator:\n options.metadata?.creator ||\n this.hederaKit.signer.getAccountId().toString(),\n description: options.metadata?.description || 'Dynamic hashinal metadata',\n type: options.metadata?.type || 'json',\n ...options.metadata,\n } as Record<string, unknown>;\n\n return await client.createHashinal({\n ...options,\n metadata,\n });\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 const metadata = {\n name: options.metadata?.name || 'Dynamic Hashinal',\n creator:\n options.metadata?.creator ||\n this.hederaKit.signer.getAccountId().toString(),\n description:\n options.metadata?.description || 'Dynamic hashinal registration',\n type: options.metadata?.type || 'json',\n ...options.metadata,\n } as Record<string, unknown>;\n\n return await client.register({\n ...options,\n metadata,\n });\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<HCS6RegistryOperationResult> {\n const exec = SignerProviderRegistry.walletExecutor;\n const preferWallet = SignerProviderRegistry.preferWalletOnly;\n const network = (\n this.hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet'\n ) as NetworkString;\n\n if (exec) {\n const start = SignerProviderRegistry.startHCSDelegate;\n if (start) {\n try {\n const request: Record<string, unknown> = { topicId, payload };\n const { transactionBytes } = await start(\n 'hcs6.submitMessage',\n request,\n network\n );\n if (transactionBytes) {\n return {\n success: true,\n transactionBytes,\n } as unknown as HCS6RegistryOperationResult;\n }\n } catch (err) {\n if (preferWallet) {\n throw new CodedError(\n 'wallet_submit_failed',\n `wallet_submit_failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n if (preferWallet) {\n throw new CodedError(\n 'wallet_unavailable',\n 'WalletExecutor not configured for hcs6.submitMessage'\n );\n }\n }\n\n const client = await this.getHCS6Client();\n return (await client.submitMessage(\n topicId,\n payload\n )) as unknown as HCS6RegistryOperationResult;\n }\n\n /**\n * Get topic info from mirror node\n */\n async getTopicInfo(topicId: string): Promise<TopicResponse> {\n const network = this.hederaKit.client.network;\n const networkType: NetworkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = new HederaMirrorNode(networkType);\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}\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 getTopicId,\n} from '@hashgraphonline/standards-sdk';\nimport { InscriptionResult, InscriptionSDK } from '@kiloscribe/inscription-sdk';\nimport type { AgentOperationalMode } from 'hedera-agent-kit';\n\n/**\n * Type definition for DAppSigner interface compatible with inscription SDK\n */\ninterface DAppSigner {\n getAccountId(): { toString(): string };\n [key: string]: unknown;\n}\n\nexport interface PendingInscriptionResponse {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface CompletedInscriptionResponse {\n confirmed?: boolean;\n result?: InscriptionResult;\n inscription?: RetrievedInscriptionResult;\n jsonTopicId?: string;\n network?: string;\n}\n/**\n * Builder for Inscription operations\n */\nexport class InscriberBuilder extends BaseServiceBuilder {\n protected inscriptionSDK?: InscriptionSDK;\n private static signerProvider?: () =>\n | Promise<DAppSigner | null>\n | DAppSigner\n | null;\n private static walletInfoResolver?: () =>\n | Promise<{ accountId: string; network: 'mainnet' | 'testnet' } | null>\n | { accountId: string; network: 'mainnet' | 'testnet' }\n | null;\n\n private static startInscriptionDelegate?: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<PendingInscriptionResponse | CompletedInscriptionResponse>;\n private static walletExecutor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>;\n /** When true, do not allow server fallback; require a wallet path in Provide Bytes */\n private static preferWalletOnly = false;\n\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n public getOperationalMode(): AgentOperationalMode {\n return this.hederaKit.operationalMode as AgentOperationalMode;\n }\n\n static setSignerProvider(\n provider: () => Promise<DAppSigner | null> | DAppSigner | null\n ): void {\n InscriberBuilder.signerProvider = provider;\n }\n\n static setWalletInfoResolver(\n resolver: () =>\n | Promise<{ accountId: string; network: 'mainnet' | 'testnet' } | null>\n | { accountId: string; network: 'mainnet' | 'testnet' }\n | null\n ): void {\n InscriberBuilder.walletInfoResolver = resolver;\n }\n\n static setStartInscriptionDelegate(\n delegate: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<PendingInscriptionResponse | CompletedInscriptionResponse>\n ): void {\n InscriberBuilder.startInscriptionDelegate = delegate;\n }\n\n static setWalletExecutor(\n executor: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ): void {\n InscriberBuilder.walletExecutor = executor;\n }\n\n /**\n * Control fallback behavior. When true, wallet must be available for execution paths.\n */\n static setPreferWalletOnly(flag: boolean): void {\n InscriberBuilder.preferWalletOnly = !!flag;\n }\n\n async getSigner(): Promise<DAppSigner | null> {\n const provider = InscriberBuilder.signerProvider;\n if (!provider) return null;\n try {\n const maybe = provider();\n return maybe && typeof (maybe as Promise<unknown>).then === 'function'\n ? await (maybe as Promise<DAppSigner | null>)\n : (maybe as DAppSigner | null);\n } catch {\n return null;\n }\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(\n input,\n signer as unknown as Parameters<typeof inscribeWithSigner>[1],\n options\n );\n }\n\n async inscribeAuto(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<InscriptionResponse> {\n const signer = await this.getSigner();\n if (signer) {\n return this.inscribeWithSigner(input, signer, options);\n }\n\n type WalletInfo = { accountId: string; network: 'mainnet' | 'testnet' };\n\n type WalletExecutorResponse = { transactionId: string };\n\n const infoMaybe: WalletInfo | null = InscriberBuilder.walletInfoResolver\n ? await InscriberBuilder.walletInfoResolver()\n : null;\n\n if (InscriberBuilder.preferWalletOnly && !infoMaybe) {\n const err = new Error(\n 'Wallet unavailable: connect a wallet or switch to autonomous mode'\n );\n (err as unknown as { code: string }).code = 'wallet_unavailable';\n throw err;\n }\n\n if (\n infoMaybe &&\n InscriberBuilder.startInscriptionDelegate &&\n InscriberBuilder.walletExecutor\n ) {\n const holderId = infoMaybe.accountId;\n const network: 'mainnet' | 'testnet' = infoMaybe.network;\n\n type InscriptionOptionsExt = InscriptionOptions & {\n fileStandard?: string;\n chunkSize?: number;\n jsonFileURL?: string;\n metadata?: Record<string, unknown> & {\n creator?: string;\n description?: string;\n };\n };\n const ext = options as InscriptionOptionsExt;\n\n const baseRequest: Record<string, unknown> = {\n holderId,\n metadata: ext.metadata || {},\n tags: options.tags || [],\n mode: options.mode || 'file',\n };\n if (typeof ext.fileStandard !== 'undefined') {\n (baseRequest as { fileStandard?: string }).fileStandard =\n ext.fileStandard;\n }\n if (typeof ext.chunkSize !== 'undefined') {\n (baseRequest as { chunkSize?: number }).chunkSize = ext.chunkSize;\n }\n\n let request: Record<string, unknown> = { ...baseRequest };\n switch (input.type) {\n case 'url':\n request = { ...baseRequest, file: { type: 'url', url: input.url } };\n break;\n case 'file':\n request = {\n ...baseRequest,\n file: { type: 'path', path: input.path },\n };\n break;\n case 'buffer':\n request = {\n ...baseRequest,\n file: {\n type: 'base64',\n base64: Buffer.from(input.buffer).toString('base64'),\n fileName: input.fileName,\n mimeType: input.mimeType,\n },\n };\n break;\n }\n\n if (options.mode === 'hashinal') {\n (request as { metadataObject?: unknown }).metadataObject = ext.metadata;\n (request as { creator?: string }).creator =\n ext.metadata?.creator || holderId;\n (request as { description?: string }).description =\n ext.metadata?.description;\n if (typeof ext.jsonFileURL === 'string' && ext.jsonFileURL.length > 0) {\n (request as { jsonFileURL?: string }).jsonFileURL = ext.jsonFileURL;\n }\n }\n\n const start = await InscriberBuilder.startInscriptionDelegate(\n request,\n network\n );\n\n const completedStart = start as CompletedInscriptionResponse;\n const isCompletedResponse =\n Boolean(completedStart?.inscription) && completedStart?.confirmed;\n\n if (isCompletedResponse) {\n const completed = start as {\n confirmed?: boolean;\n result?: unknown;\n inscription?: unknown;\n };\n this.logger.info(\n 'inscription already completed, short circuiting',\n start\n );\n return {\n quote: false,\n confirmed: completed.confirmed === true,\n result: completed.result as InscriptionResult,\n inscription: completed.inscription,\n } as unknown as InscriptionResponse;\n }\n\n const startResponse = start as {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n };\n\n if (!startResponse || !startResponse.transactionBytes) {\n throw new Error('Failed to start inscription (no transaction bytes)');\n }\n\n const exec: WalletExecutorResponse =\n await InscriberBuilder.walletExecutor(\n startResponse.transactionBytes,\n network\n );\n const transactionId = exec?.transactionId || '';\n\n const shouldWait = options.quoteOnly\n ? false\n : options.waitForConfirmation ?? true;\n if (shouldWait) {\n this.logger.debug('Will be retrieving inscription');\n const maxAttempts =\n (options as { waitMaxAttempts?: number }).waitMaxAttempts ?? 60;\n const intervalMs =\n (options as { waitIntervalMs?: number }).waitIntervalMs ?? 5000;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const retrieved: RetrievedInscriptionResult =\n await this.retrieveInscription(transactionId, options);\n const topicIdFromInscription: string | undefined = getTopicId(\n retrieved as unknown\n );\n const topicId: string | undefined =\n topicIdFromInscription ?? startResponse.topic_id;\n const status: string | undefined = (\n retrieved as { status?: string }\n ).status;\n const isDone = status === 'completed' || !!topicId;\n if (isDone) {\n const resultConfirmed: InscriptionResponse = {\n quote: false,\n confirmed: true,\n result: {\n jobId: startResponse.tx_id || '',\n transactionId,\n topicId,\n },\n inscription: retrieved,\n } as unknown as InscriptionResponse;\n this.logger.debug(\n 'retrieved inscription',\n resultConfirmed,\n retrieved\n );\n return resultConfirmed;\n }\n } catch {}\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n const partial: InscriptionResponse = {\n quote: false,\n confirmed: false,\n result: {\n jobId: startResponse.tx_id || '',\n transactionId,\n status: startResponse.status,\n completed: startResponse.completed,\n },\n inscription: startResponse.topic_id\n ? { topic_id: startResponse.topic_id }\n : undefined,\n } as unknown as InscriptionResponse;\n return partial;\n }\n\n if (InscriberBuilder.preferWalletOnly) {\n const err = new Error(\n 'Wallet unavailable: connect a wallet or switch to autonomous mode'\n );\n (err as unknown as { code: string }).code = 'wallet_unavailable';\n throw err;\n }\n return this.inscribe(input, 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}\n","import type { HederaAgentKit } from 'hedera-agent-kit';\nimport {\n AccountId,\n Client,\n TopicCreateTransaction,\n TopicId,\n TopicMessageSubmitTransaction,\n TransactionId,\n} from '@hashgraph/sdk';\nimport {\n buildHcs2CreateRegistryTx,\n buildHcs2RegisterTx,\n buildHcs2UpdateTx,\n buildHcs2DeleteTx,\n buildHcs2MigrateTx,\n HCS2RegistryType,\n buildHcs6CreateRegistryTx,\n buildHcs6RegisterEntryTx,\n buildHcs10SendMessageTx,\n buildHcs10SubmitConnectionRequestTx,\n buildHcs20DeployTx,\n buildHcs20MintTx,\n buildHcs20TransferTx,\n buildHcs20BurnTx,\n buildHcs20RegisterTx,\n buildHcs12CreateRegistryTopicTx,\n buildHcs12SubmitMessageTx,\n buildHcs12RegisterAssemblyTx,\n buildHcs12AddBlockToAssemblyTx,\n buildHcs12AddActionToAssemblyTx,\n buildHcs12UpdateAssemblyTx,\n buildHcs7SubmitMessageTx,\n buildHcs7EvmMessageTx,\n buildHcs7WasmMessageTx,\n} from '@hashgraphonline/standards-sdk';\n\nexport type ByteBuildHandler = (ctx: {\n hederaKit: HederaAgentKit;\n request: Record<string, unknown>;\n}) => Promise<{ transactionBytes: string }>;\n\nclass ByteBuildRegistryImpl {\n private handlers = new Map<string, ByteBuildHandler>();\n\n register(op: string, handler: ByteBuildHandler): void {\n this.handlers.set(op, handler);\n }\n\n has(op: string): boolean {\n return this.handlers.has(op);\n }\n\n async build(\n op: string,\n hederaKit: HederaAgentKit,\n request: Record<string, unknown>\n ): Promise<{ transactionBytes: string } | null> {\n const h = this.handlers.get(op);\n if (!h) return null;\n return await h({ hederaKit, request });\n }\n}\n\nexport const ByteBuildRegistry = new ByteBuildRegistryImpl();\n\nasync function freezeTxToBytes(\n hederaKit: HederaAgentKit,\n tx: any,\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n if (typeof tx.setTransactionId === 'function') {\n tx.setTransactionId(TransactionId.generate(payer));\n }\n if (typeof tx.setAutoRenewAccountId === 'function') {\n try { tx.setAutoRenewAccountId(operatorId); } catch {}\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nasync function buildTopicCreateBytes(\n hederaKit: HederaAgentKit,\n memo: string,\n ttlSeconds?: number\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n\n let tx = new TopicCreateTransaction()\n .setTransactionId(TransactionId.generate(payer))\n .setTopicMemo(memo);\n if (ttlSeconds && Number.isFinite(ttlSeconds)) {\n try {\n tx = tx.setAutoRenewPeriod(ttlSeconds);\n } catch {}\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nasync function buildTopicMessageBytes(\n hederaKit: HederaAgentKit,\n topicId: string,\n message: string | Uint8Array,\n memo?: string\n): Promise<{ transactionBytes: string }> {\n const network = hederaKit.client.network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n const client = network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n const operatorId = hederaKit.signer.getAccountId().toString();\n const payer = AccountId.fromString(operatorId);\n const tx = new TopicMessageSubmitTransaction()\n .setTopicId(TopicId.fromString(topicId))\n .setTransactionId(TransactionId.generate(payer))\n .setMessage(message);\n if (memo && memo.length > 0) {\n tx.setTransactionMemo(memo);\n }\n const frozen = await tx.freezeWith(client);\n return { transactionBytes: Buffer.from(frozen.toBytes()).toString('base64') };\n}\n\nByteBuildRegistry.register(\n 'hcs2.createRegistry',\n async ({ hederaKit, request }) => {\n const opts = (request?.options || {}) as {\n registryType?: number;\n ttl?: number;\n adminKey?: string | boolean;\n submitKey?: string | boolean;\n };\n\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n\n const tx = buildHcs2CreateRegistryTx({\n registryType: (opts.registryType ?? HCS2RegistryType.INDEXED) as any,\n ttl: opts.ttl ?? 86400,\n adminKey: opts.adminKey as any,\n submitKey: opts.submitKey as any,\n operatorPublicKey,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs2.migrateRegistry',\n async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.migrateRegistry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.migrateRegistry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2MigrateTx({\n registryTopicId,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null;\n}\nfunction getStringProp(\n obj: Record<string, unknown>,\n key: string\n): string | undefined {\n const val = obj[key];\n return typeof val === 'string' ? val : undefined;\n}\nfunction getNumberProp(\n obj: Record<string, unknown>,\n key: string\n): number | undefined {\n const val = obj[key];\n return typeof val === 'number' && Number.isFinite(val) ? val : undefined;\n}\nfunction getObjectProp(\n obj: Record<string, unknown>,\n key: string\n): Record<string, unknown> | undefined {\n const val = obj[key];\n return isRecord(val) ? val : undefined;\n}\n\nByteBuildRegistry.register(\n 'hcs2.submitMessage',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs2.submitMessage: invalid request payload');\n const topicId =\n getStringProp(request, 'topicId') ||\n getStringProp(request, 'registryTopicId') ||\n '';\n if (!topicId) throw new Error('hcs2.submitMessage: topicId is required');\n const payload = request['payload'];\n const message =\n typeof payload === 'string' ? payload : JSON.stringify(payload ?? {});\n return await buildTopicMessageBytes(hederaKit, topicId, message);\n }\n);\n\nByteBuildRegistry.register('hcs2.registerEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.registerEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.registerEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2RegisterTx({\n registryTopicId,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs2.updateEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.updateEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.updateEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const uid = getStringProp(options, 'uid') || '';\n const metadata = getStringProp(options, 'metadata');\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2UpdateTx({\n registryTopicId,\n uid,\n targetTopicId,\n metadata,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs2.deleteEntry', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs2.deleteEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs2.deleteEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const uid = getStringProp(options, 'uid') || '';\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs2DeleteTx({\n registryTopicId,\n uid,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register(\n 'hcs6.createRegistry',\n async ({ hederaKit, request }) => {\n const opts = isRecord(request) ? getObjectProp(request, 'options') : undefined;\n const ttl = opts ? getNumberProp(opts, 'ttl') : undefined;\n\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n\n const tx = buildHcs6CreateRegistryTx({ ttl: ttl ?? 86400, operatorPublicKey });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs6.registerEntry',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs6.registerEntry: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId)\n throw new Error('hcs6.registerEntry: registryTopicId is required');\n const options = getObjectProp(request, 'options') || {};\n const targetTopicId = getStringProp(options, 'targetTopicId') || '';\n const memo = getStringProp(options, 'memo');\n const tx = buildHcs6RegisterEntryTx({\n registryTopicId,\n targetTopicId,\n memo,\n });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register(\n 'hcs6.submitMessage',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('hcs6.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs6.submitMessage: topicId is required');\n const payload = request['payload'];\n const message =\n typeof payload === 'string' ? payload : JSON.stringify(payload ?? {});\n return await buildTopicMessageBytes(hederaKit, topicId, message);\n }\n);\n\nByteBuildRegistry.register('sendMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('sendMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('sendMessage: topicId is required');\n const dataVal = request['data'];\n const memo = getStringProp(request, 'memo') || '';\n const operatorId = hederaKit.signer.getAccountId().toString();\n const data = typeof dataVal === 'string' ? dataVal : JSON.stringify(dataVal ?? {});\n const tx = buildHcs10SendMessageTx({ connectionTopicId: topicId, operatorId, data, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register(\n 'submitConnectionRequest',\n async ({ hederaKit, request }) => {\n if (!isRecord(request))\n throw new Error('submitConnectionRequest: invalid request payload');\n const inboundTopicId = getStringProp(request, 'inboundTopicId') || '';\n if (!inboundTopicId)\n throw new Error('submitConnectionRequest: inboundTopicId is required');\n const memo = getStringProp(request, 'memo') || '';\n const operatorId = hederaKit.signer.getAccountId().toString();\n const tx = buildHcs10SubmitConnectionRequestTx({ inboundTopicId, operatorId, memo });\n return await freezeTxToBytes(hederaKit, tx);\n }\n);\n\nByteBuildRegistry.register('hcs20.deploy', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.deploy: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.deploy: topicId is required');\n const name = getStringProp(request, 'name') || '';\n const tick = getStringProp(request, 'tick') || '';\n const max = getStringProp(request, 'max') || '';\n const lim = getStringProp(request, 'lim');\n const metadata = getStringProp(request, 'metadata');\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20DeployTx({ topicId, name, tick, max, lim, metadata, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.mint', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.mint: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.mint: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const to = getStringProp(request, 'to') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20MintTx({ topicId, tick, amt, to, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.transfer', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.transfer: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.transfer: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const from = getStringProp(request, 'from') || '';\n const to = getStringProp(request, 'to') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20TransferTx({ topicId, tick, amt, from, to, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.burn', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.burn: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs20.burn: topicId is required');\n const tick = getStringProp(request, 'tick') || '';\n const amt = getStringProp(request, 'amt') || '';\n const from = getStringProp(request, 'from') || '';\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20BurnTx({ topicId, tick, amt, from, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs20.register', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs20.register: invalid request payload');\n const registryTopicId = getStringProp(request, 'registryTopicId') || '';\n if (!registryTopicId) throw new Error('hcs20.register: registryTopicId is required');\n const topicId = getStringProp(request, 'topicId') || '';\n const name = getStringProp(request, 'name') || '';\n const isPrivateVal = (request as any)['isPrivate'];\n const isPrivate = typeof isPrivateVal === 'boolean' ? isPrivateVal : false;\n const metadata = getStringProp(request, 'metadata');\n const memo = getStringProp(request, 'memo');\n const tx = buildHcs20RegisterTx({ registryTopicId, name, topicId, isPrivate, metadata, memo });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.createRegistry', async ({ hederaKit, request }) => {\n const opts = isRecord(request) ? getObjectProp(request, 'options') : undefined;\n const ttlVal = opts ? getNumberProp(opts, 'ttl') : undefined;\n const ttl = (ttlVal ?? 60) as number;\n const registry = (opts && getStringProp(opts, 'registry')) || 'hashlinks';\n let operatorPublicKey: any | undefined;\n try {\n const priv = (hederaKit as any)?.signer?.getOperatorPrivateKey?.();\n operatorPublicKey = priv?.publicKey;\n } catch {}\n const tx = buildHcs12CreateRegistryTopicTx({ registry: registry as any, ttl, operatorPublicKey });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.submitMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs12.submitMessage: topicId is required');\n const payload = (request as any)['payload'];\n const tx = buildHcs12SubmitMessageTx({ topicId, payload: payload as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.registerAssembly', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.registerAssembly: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.registerAssembly: assemblyTopicId is required');\n const registration = getObjectProp(request, 'registration') || {};\n const tx = buildHcs12RegisterAssemblyTx({ assemblyTopicId, registration: registration as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.addBlock', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.addBlock: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.addBlock: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12AddBlockToAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.addAction', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.addAction: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.addAction: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12AddActionToAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs12.updateAssembly', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs12.updateAssembly: invalid request payload');\n const assemblyTopicId = getStringProp(request, 'assemblyTopicId') || '';\n if (!assemblyTopicId) throw new Error('hcs12.updateAssembly: assemblyTopicId is required');\n const operation = getObjectProp(request, 'operation') || {};\n const tx = buildHcs12UpdateAssemblyTx({ assemblyTopicId, operation: operation as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.submitMessage', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.submitMessage: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.submitMessage: topicId is required');\n const message = getObjectProp(request, 'message') || {};\n const tx = buildHcs7SubmitMessageTx({ topicId, message: message as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.evm', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.evm: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.evm: topicId is required');\n const config = getObjectProp(request, 'config') || {};\n const tx = buildHcs7EvmMessageTx({ topicId, config: config as any });\n return await freezeTxToBytes(hederaKit, tx);\n});\n\nByteBuildRegistry.register('hcs7.wasm', async ({ hederaKit, request }) => {\n if (!isRecord(request)) throw new Error('hcs7.wasm: invalid request payload');\n const topicId = getStringProp(request, 'topicId') || '';\n if (!topicId) throw new Error('hcs7.wasm: topicId is required');\n const config = getObjectProp(request, 'config') || {};\n const tx = buildHcs7WasmMessageTx({ topicId, config: config as any });\n return await freezeTxToBytes(hederaKit, tx);\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\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 as any\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\n this.setClient(options.accountId, options.privateKey);\n\n const operatorId = this.getOperatorId();\n\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\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 const shouldSilence = process.env.DISABLE_LOGGING === 'true';\n const logger = Logger.getInstance({\n level: config.logLevel || 'info',\n silent: shouldSilence,\n });\n\n let network: 'mainnet' | 'testnet';\n if (networkEnv === 'mainnet') {\n network = 'mainnet';\n } else if (networkEnv === 'testnet') {\n network = 'testnet';\n } else {\n logger.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 stateManager =\n options?.stateManager ||\n new OpenConvaiState({\n defaultEnvFilePath: ENV_FILE_PATH,\n defaultPrefix: 'TODD',\n });\n logger.info('State manager initialized');\n\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 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 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};","import { z } from 'zod';\n\n/**\n * Interface for tools that can provide custom form validation logic\n */\nexport interface FormValidatable {\n /**\n * Determines if a form should be generated for the given input\n * @param input The input data to validate\n * @returns true if a form should be generated, false if the tool can execute\n */\n shouldGenerateForm(input: unknown): boolean;\n\n /**\n * Returns the schema to use for form generation\n * This allows tools to provide a focused schema for forms\n * @returns The schema to use for generating forms\n */\n getFormSchema(): z.ZodSchema;\n\n /**\n * Defines which fields are essential for this tool\n * Essential fields are always shown in forms even if marked as optional\n * @returns Array of field names that are essential for user experience\n */\n getEssentialFields(): string[];\n\n /**\n * Determines if a field value should be considered empty\n * Allows tools to define custom empty logic for their specific data types\n * @param fieldName The name of the field\n * @param value The value to check\n * @returns true if the field should be considered empty\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean;\n}\n\n/**\n * Type guard to check if a tool implements FormValidatable\n */\nexport function isFormValidatable(tool: unknown): tool is FormValidatable {\n return (\n tool !== null &&\n typeof tool === 'object' &&\n 'shouldGenerateForm' in tool &&\n 'getFormSchema' in tool &&\n 'getEssentialFields' in tool &&\n 'isFieldEmpty' in tool &&\n typeof (tool as FormValidatable).shouldGenerateForm === 'function' &&\n typeof (tool as FormValidatable).getFormSchema === 'function' &&\n typeof (tool as FormValidatable).getEssentialFields === 'function' &&\n typeof (tool as FormValidatable).isFieldEmpty === 'function'\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","logger","Logger","module","SendMessageToConnectionZodSchema","targetIdentifier","connectionId","agentId","message","disableMonitoring","default","SendMessageToConnectionTool","Error","connectionsManager","getConnectionsManager","currentAgent","getCurrentAgent","fetchConnectionData","error","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","isWalletBytesResponse","value","transactionBytes","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","contentResolver","getContentResolver","setEntityCreationHandler","handler","onEntityCreated","generateInscriptionQuote","options","quoteOptions","quoteOnly","network","client","inscribe","quote","confirmed","BaseInscriberQueryTool","getStringProp","obj","key","trim","extractTopicIds","inscription","jsonTopicId","buildInscriptionLinks","ids","fileStandard","chosen","hrl","cdnUrl","inscribeFromUrlSchema","mode","chunkSize","waitForConfirmation","timeoutMs","apiKey","inscribeFromFileSchema","filePath","handleDirectContent","providedMimeType","providedFileName","test","buffer","globalThis","Buffer","fileName","wasReference","contentRefSchema","DEFAULT_CONFIG","maxInscriptionSize","minContentSize","logLevel","loadConfig","env","REF_MAX_SIZE","REF_MIN_SIZE","REF_LOG_LEVEL","enableContentValidation","REF_ENABLE_VALIDATION","inscribeFromBufferSchema","base64Data","hip412FileSchema","uri","checksum","is_default_file","hip412AttributeSchema","trait_type","display_type","hip412MetadataSchema","creatorDID","format","files","attributes","generateDefaultMetadata","defaultName","defaultType","operatorAccount","charAt","slice","extendZodSchema","schema","extendedSchema","withRender","config","newSchema","create","currentConfig","_renderConfig","mergedConfig","ui","progressive","block","withProgressive","withBlock","priority","group","fieldType","inferFieldTypeFromSchema","blockId","id","reusable","hasRenderConfig","Boolean","getRenderConfig","typeName","_def","stringChecks","checks","check","kind","innerType","extractOptionsFromSchema","values","map","label","enumObject","unionOptions","option","push","String","isOptionalSchema","getInnerSchema","extractValidationConstraints","innerSchema","constraints","minLength","maxLength","pattern","step","def","minItems","maxItems","getDefaultValue","defaultValue","innerTypeName","shape","defaultObj","extractFieldMetadata","required","validation","RegExp","renderConfigs","placeholder","select","textarea","rows","props","currency","symbol","itemLabel","essential","advanced","expert","createInscriptionError","details","suggestions","title","HASHLINK_BLOCK_CONFIG","testnet","hashLink","template","mainnet","inscribeHashinalSchema","contentRef","jsonFileURL","withHashLinkBlocks","renderForm","retrieveInscriptionSchema","transactionId","ENV_FILE_PATH","join","cwd","OpenConvaiState","connectionMessageTimestamps","defaultEnvFilePath","defaultPrefix","shouldSilence","disableLogging","DISABLE_LOGGING","silent","baseClient","initializeConnectionsManager","ConnectionsManager","agent","clearAll","addActiveConnection","connection","sdkConnection","targetAgentName","targetInboundTopicId","convertConnectionStatus","created","lastActivity","profileInfo","connectionRequestId","processed","updateOrAddConnection","initializeTimestampIfNeeded","getAllConnections","convertToActiveConnection","getConnectionByIdentifier","identifier","numericIndex","isNaN","byTopicId","getConnectionByTopicId","byAccountId","getConnectionByAccountId","getLastTimestamp","updateTimestamp","timestampNanos","convertToStateStatus","envFilePath","updates","async","variables","envContent","fs","existsSync","readFileSync","updatedLines","lineIndex","findIndex","line","writeFileSync","updateEnvFile","_SignerProviderRegistry","setSignerProvider","provider","_signerProvider","getSigner","p","then","setWalletInfoResolver","resolver","_walletInfoResolver","getWalletInfo","setWalletExecutor","executor","_walletExecutor","walletExecutor","setStartHCSDelegate","delegate","_startHCSDelegate","startHCSDelegate","setPreferWalletOnly","flag","_preferWalletOnly","setBrowserHCSClientFactory","factory","_browserHCSClientFactory","getBrowserHCSClient","preferWalletOnly","SignerProviderRegistry","NOT_INITIALIZED_ERROR","HCS10Builder","BaseServiceBuilder","hederaKit","operatorId","signer","getAccountId","operatorPrivateKey","getOperatorPrivateKey","toStringRaw","sdkLogger","SDKLogger","level","info","warn","trace","setLogLevel","getLevel","setSilent","setModule","standardClient","HCS10Client","getOperatorId","operator","getClient","operatorAccountId","getNetwork","getAccountAndSigner","getInboundTopicId","profileResponse","getAgentProfile","topicInfo","inboundTopic","detailedMessage","submitConnectionRequest","start","exec","preferWallet","ByteBuildRegistry","Promise","resolve","bytesRegistry","has","built","build","request","err","handleConnectionRequest","requestingAccountId","feeConfig","sendMessage","stringify","prevMaxSeq","getMessages","messages","reduce","m","sequence_number","sequenceNumber","pollForNewSequence","receipt","messageResponse","topicSequenceNumber","toNumber","mappedMessages","sdkMessage","timestamp","getTime","sort","a","b","getMessageStream","getMessageContent","inscriptionIdOrData","getStandardClient","loadProfilePicture","response","axios","get","responseType","urlPathname","URL","pathname","basename","prevMax","i","maxSeq","msg","setTimeout","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","clearNotes","operationalMode","profilePictureData","registrationData","feeConfigBuilder","FeeConfigBuilder","collectorAccountId","addNote","effectiveExemptIds","addHbarFee","browserClient","aBuilder","resp","progressCallback","_","updateAccountMemo","executeResult","scheduleId","walletErr","agentMetadata","targetProfile","connectionRequestSent","monitoringEnabled","getPendingRequests","getConnectionsNeedingConfirmation","uniqueRequestKey","inboundRequestId","confirmationResult","established","c","profileError","newConnection","markConnectionRequestProcessed","feeConfigured","sendHCS10Message","parts","accountIdWithPrefix","index","availableIds","errorMsg","baseSeq","messageResult","effectiveSeq","reply","monitorResponses","attempts","operator_id","startPassiveConnectionMonitoring","endTime","connectionRequestsFound","acceptedConnections","processedRequestIds","connectionRequests","op","fee","addTokenFee","pendingRequests","allRequests","requests","toISOString","viewRequest","rejectRequest","originTopicId","rejectedRequest","unapprovedRequests","requestId","fromAccountId","req","count","getEnhancedConnections","activeConnections","pendingConnections","output","formatConnection","activeCount","pendingCount","needsConfirmationCount","display_name","substring","toLocaleString","connectionManager","lastProcessedTimestamp","allMessages","messagesToProcess","latestTimestampNanos","isFetchingLatest","maxTs","outputString","processedMessages","content","displayContent","registrations","formattedRegistrations","reg","registration","profile","outboundTopic","social","keys","notes","HbarPricePlugin","BasePlugin","arguments","version","author","tools","initialize","context","initializeTools","HederaGetHbarPriceTool","getTools","extractRenderConfigs","fields","groups","extractFromSchema","organizeFieldGroups","orderFields","pathPrefix","addToGroup","addToOrder","fieldSchema","extractFromObjectSchema","elementSchema","extractFromArraySchema","extractFromPrimitiveSchema","groupName","fieldPath","explicitOrder","splice","organized","groupPriority","fieldPriority","tokenName","tokenSymbol","maxSupply","supplyType","treasuryAccountId","aConfig","bConfig","aPriority","bPriority","localeCompare","CodedError","setPrototypeOf","prototype","HCS2Builder","getHCS2Client","hcs2Client","networkType","keyTypeHint","mirror","HederaMirrorNode","requestAccount","t","_type","upper","operatorKey","keyType","HCS2Client","createRegistry","hasPrivateKey","registerEntry","updateEntry","deleteEntry","migrateRegistry","getRegistry","submitMessage","payload","getTopicInfo","close","HCS6Builder","getHCS6Client","hcs6Client","HCS6Client","sanitized","createHashinal","register","_InscriberBuilder","getOperationalMode","signerProvider","walletInfoResolver","setStartInscriptionDelegate","startInscriptionDelegate","maybe","getInscriptionSDK","_options","clientConfig","inscribeWithSigner","inscribeAuto","infoMaybe","holderId","ext","baseRequest","file","metadataObject","completedStart","completed","startResponse","maxAttempts","waitMaxAttempts","intervalMs","waitIntervalMs","attempt","retrieved","retrieveInscription","getTopicId","topic_id","resultConfirmed","jobId","tx_id","inscriptionSDK","InscriberBuilder","handlers","Map","set","h","freezeTxToBytes","tx","Client","forMainnet","forTestnet","payer","AccountId","fromString","setTransactionId","TransactionId","generate","setAutoRenewAccountId","frozen","freezeWith","toBytes","buildTopicMessageBytes","TopicMessageSubmitTransaction","setTopicId","TopicId","setMessage","isRecord","x","getNumberProp","Number","isFinite","getObjectProp","opts","operatorPublicKey","priv","publicKey","buildHcs2CreateRegistryTx","INDEXED","buildHcs2MigrateTx","buildHcs2RegisterTx","buildHcs2UpdateTx","buildHcs2DeleteTx","buildHcs6CreateRegistryTx","buildHcs6RegisterEntryTx","dataVal","buildHcs10SendMessageTx","buildHcs10SubmitConnectionRequestTx","tick","lim","buildHcs20DeployTx","amt","to","buildHcs20MintTx","buildHcs20TransferTx","buildHcs20BurnTx","isPrivateVal","isPrivate","buildHcs20RegisterTx","registry","buildHcs12CreateRegistryTopicTx","buildHcs12SubmitMessageTx","assemblyTopicId","buildHcs12RegisterAssemblyTx","operation","buildHcs12AddBlockToAssemblyTx","buildHcs12AddActionToAssemblyTx","buildHcs12UpdateAssemblyTx","buildHcs7SubmitMessageTx","buildHcs7EvmMessageTx","buildHcs7WasmMessageTx","_runManager","txBytes","pendingApproval","normalizeKey","lc","errorMessage","StandardSDKClient","guardedRegistryBaseUrl","registryUrl","useEncryption","waitForConnectionConfirmation","delayMs","agentChannels","getOutboundTopicId","setClient","validateOperator","isValid","initializeWithValidation","validationResult","typed","resolvedContent","trimmedInput","ContentResolverRegistry","getResolver","referenceId","extractReferenceId","resolution","resolveReference","resolveContent","validateContent","validationError","resolvedMimeType","resolvedFileName","totalCostHbar","validUntil","breakdown","contentInfo","sizeBytes","toFixed","executeInscription","formatInscriptionResult","validateInput","maxSizeKB","round","bufferSizeKB","contentStr","inscriptionData","timeoutPromise","reject","race","fileContent","stats","stat","isFile","readFile","getMimeType","inscriptionResult","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","getEntityResolutionPreferences","_schemaWithRenderConfig","baseSchema","schemaWithRender","shouldGenerateForm","inputObj","inputKeys","hasContent","renderFormProvided","renderFormValue","isNonEmptyString","v","getFormSchema","rawMetadata","validatedMetadata","ZodError","issues","errors","validateHIP412Metadata","inputData","createInscriptionQuote","successResponse","standard","nextSteps","primary","mintingMetadata","createInscriptionSuccess","createHashLinkBlock","hashLinkBlock","d","createInscriptionPending","_mimeType","clientNetwork","cdnNetwork","getHashLinkBlockId","getEssentialFields","isFieldEmpty","fieldName","attr","latestEntry","t_id","sequence","typeVal","isIndexed","totalEntries","entry","inscriptionTopicId","inscriptionId","chunks","createdAt","completedAt","fileUrl","fileSize","extracted","configMap","renderConfig","fieldGroup","groupConfig","sections","sectionOrder","displayName","fieldOrder","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","ZodType","tool"],"mappings":"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"}