@hashgraphonline/conversational-agent 0.1.217 → 0.1.219

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/constants/entity-references.d.ts +18 -0
  3. package/dist/cjs/constants/form-priorities.d.ts +24 -0
  4. package/dist/cjs/constants/index.d.ts +4 -0
  5. package/dist/cjs/constants/messages.d.ts +19 -0
  6. package/dist/cjs/constants/test-constants.d.ts +42 -0
  7. package/dist/cjs/conversational-agent.d.ts +3 -8
  8. package/dist/{types/core/ToolRegistry.d.ts → cjs/core/tool-registry.d.ts} +11 -1
  9. package/dist/{types/execution/ExecutionPipeline.d.ts → cjs/execution/execution-pipeline.d.ts} +3 -3
  10. package/dist/cjs/forms/field-guidance-registry.d.ts +108 -0
  11. package/dist/cjs/forms/form-generator.d.ts +2 -7
  12. package/dist/cjs/forms/index.d.ts +3 -0
  13. package/dist/cjs/forms/types.d.ts +9 -1
  14. package/dist/cjs/index.cjs +1 -1
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/index.d.ts +7 -12
  17. package/dist/cjs/langchain/external-tool-wrapper.d.ts +101 -0
  18. package/dist/{types/langchain/FormAwareAgentExecutor.d.ts → cjs/langchain/form-aware-agent-executor.d.ts} +19 -4
  19. package/dist/cjs/langchain/index.d.ts +3 -0
  20. package/dist/{types → cjs/langchain}/langchain-agent.d.ts +15 -7
  21. package/dist/cjs/mcp/adapters/index.d.ts +1 -0
  22. package/dist/cjs/mcp/adapters/langchain.d.ts +1 -1
  23. package/dist/{types/mcp/ContentProcessor.d.ts → cjs/mcp/content-processor.d.ts} +1 -1
  24. package/dist/cjs/mcp/index.d.ts +5 -0
  25. package/dist/{types/mcp/MCPClientManager.d.ts → cjs/mcp/mcp-client-manager.d.ts} +1 -1
  26. package/dist/cjs/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  27. package/dist/cjs/memory/index.d.ts +5 -7
  28. package/dist/{types/memory/MemoryWindow.d.ts → cjs/memory/memory-window.d.ts} +1 -1
  29. package/dist/{types/memory/SmartMemoryManager.d.ts → cjs/memory/smart-memory-manager.d.ts} +1 -1
  30. package/dist/cjs/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  31. package/dist/cjs/services/context/resolution-context.d.ts +49 -0
  32. package/dist/cjs/services/entity-resolver.d.ts +58 -0
  33. package/dist/cjs/services/formatters/converters/index.d.ts +2 -0
  34. package/dist/cjs/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  35. package/dist/cjs/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  36. package/dist/cjs/services/formatters/format-converter-registry.d.ts +66 -0
  37. package/dist/cjs/services/formatters/index.d.ts +3 -0
  38. package/dist/cjs/services/formatters/types.d.ts +29 -0
  39. package/dist/cjs/services/index.d.ts +3 -0
  40. package/dist/cjs/services/resolution/resolution-pipeline.d.ts +44 -0
  41. package/dist/cjs/tools/index.d.ts +1 -0
  42. package/dist/cjs/utils/index.d.ts +1 -0
  43. package/dist/esm/index.js +40 -13
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/index10.js +669 -13
  46. package/dist/esm/index10.js.map +1 -1
  47. package/dist/esm/index11.js +310 -95
  48. package/dist/esm/index11.js.map +1 -1
  49. package/dist/esm/index12.js +130 -95
  50. package/dist/esm/index12.js.map +1 -1
  51. package/dist/esm/index13.js +262 -153
  52. package/dist/esm/index13.js.map +1 -1
  53. package/dist/esm/index14.js +100 -664
  54. package/dist/esm/index14.js.map +1 -1
  55. package/dist/esm/index15.js +135 -408
  56. package/dist/esm/index15.js.map +1 -1
  57. package/dist/esm/index16.js +240 -122
  58. package/dist/esm/index16.js.map +1 -1
  59. package/dist/esm/index17.js +147 -135
  60. package/dist/esm/index17.js.map +1 -1
  61. package/dist/esm/index18.js +376 -533
  62. package/dist/esm/index18.js.map +1 -1
  63. package/dist/esm/index19.js +87 -214
  64. package/dist/esm/index19.js.map +1 -1
  65. package/dist/esm/index2.js +21 -4
  66. package/dist/esm/index2.js.map +1 -1
  67. package/dist/esm/index20.js +158 -92
  68. package/dist/esm/index20.js.map +1 -1
  69. package/dist/esm/index21.js +717 -44
  70. package/dist/esm/index21.js.map +1 -1
  71. package/dist/esm/index22.js +58 -96
  72. package/dist/esm/index22.js.map +1 -1
  73. package/dist/esm/index23.js +324 -34
  74. package/dist/esm/index23.js.map +1 -1
  75. package/dist/esm/index24.js +125 -712
  76. package/dist/esm/index24.js.map +1 -1
  77. package/dist/esm/index25.js +113 -133
  78. package/dist/esm/index25.js.map +1 -1
  79. package/dist/esm/index26.js +18 -152
  80. package/dist/esm/index26.js.map +1 -1
  81. package/dist/esm/index27.js +14 -210
  82. package/dist/esm/index27.js.map +1 -1
  83. package/dist/esm/index28.js +70 -173
  84. package/dist/esm/index28.js.map +1 -1
  85. package/dist/esm/index29.js +882 -220
  86. package/dist/esm/index29.js.map +1 -1
  87. package/dist/esm/index30.js +218 -126
  88. package/dist/esm/index30.js.map +1 -1
  89. package/dist/esm/index31.js +1258 -44
  90. package/dist/esm/index31.js.map +1 -1
  91. package/dist/esm/index32.js +132 -24
  92. package/dist/esm/index32.js.map +1 -1
  93. package/dist/esm/index33.js +104 -82
  94. package/dist/esm/index33.js.map +1 -1
  95. package/dist/esm/index34.js +43 -239
  96. package/dist/esm/index34.js.map +1 -1
  97. package/dist/esm/index35.js +106 -0
  98. package/dist/esm/index35.js.map +1 -0
  99. package/dist/esm/index36.js +24 -0
  100. package/dist/esm/index36.js.map +1 -0
  101. package/dist/esm/index37.js +8 -0
  102. package/dist/esm/index37.js.map +1 -0
  103. package/dist/esm/index38.js +15 -0
  104. package/dist/esm/index38.js.map +1 -0
  105. package/dist/esm/index39.js +258 -0
  106. package/dist/esm/index39.js.map +1 -0
  107. package/dist/esm/index40.js +187 -0
  108. package/dist/esm/index40.js.map +1 -0
  109. package/dist/esm/index41.js +30 -0
  110. package/dist/esm/index41.js.map +1 -0
  111. package/dist/esm/index42.js +10 -0
  112. package/dist/esm/index42.js.map +1 -0
  113. package/dist/esm/index43.js +95 -0
  114. package/dist/esm/index43.js.map +1 -0
  115. package/dist/esm/index5.js +2 -2
  116. package/dist/esm/index5.js.map +1 -1
  117. package/dist/esm/index6.js +44 -67
  118. package/dist/esm/index6.js.map +1 -1
  119. package/dist/esm/index7.js +9 -0
  120. package/dist/esm/index7.js.map +1 -1
  121. package/dist/esm/index8.js +13 -1095
  122. package/dist/esm/index8.js.map +1 -1
  123. package/dist/esm/index9.js +17 -13
  124. package/dist/esm/index9.js.map +1 -1
  125. package/dist/types/constants/entity-references.d.ts +18 -0
  126. package/dist/types/constants/form-priorities.d.ts +24 -0
  127. package/dist/types/constants/index.d.ts +4 -0
  128. package/dist/types/constants/messages.d.ts +19 -0
  129. package/dist/types/constants/test-constants.d.ts +42 -0
  130. package/dist/types/conversational-agent.d.ts +3 -8
  131. package/dist/{cjs/core/ToolRegistry.d.ts → types/core/tool-registry.d.ts} +11 -1
  132. package/dist/{cjs/execution/ExecutionPipeline.d.ts → types/execution/execution-pipeline.d.ts} +3 -3
  133. package/dist/types/forms/field-guidance-registry.d.ts +108 -0
  134. package/dist/types/forms/form-generator.d.ts +2 -7
  135. package/dist/types/forms/index.d.ts +3 -0
  136. package/dist/types/forms/types.d.ts +9 -1
  137. package/dist/types/index.d.ts +7 -12
  138. package/dist/types/langchain/external-tool-wrapper.d.ts +101 -0
  139. package/dist/{cjs/langchain/FormAwareAgentExecutor.d.ts → types/langchain/form-aware-agent-executor.d.ts} +19 -4
  140. package/dist/types/langchain/index.d.ts +3 -0
  141. package/dist/{cjs → types/langchain}/langchain-agent.d.ts +15 -7
  142. package/dist/types/mcp/adapters/index.d.ts +1 -0
  143. package/dist/types/mcp/adapters/langchain.d.ts +1 -1
  144. package/dist/{cjs/mcp/ContentProcessor.d.ts → types/mcp/content-processor.d.ts} +1 -1
  145. package/dist/types/mcp/index.d.ts +5 -0
  146. package/dist/{cjs/mcp/MCPClientManager.d.ts → types/mcp/mcp-client-manager.d.ts} +1 -1
  147. package/dist/types/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  148. package/dist/types/memory/index.d.ts +5 -7
  149. package/dist/{cjs/memory/MemoryWindow.d.ts → types/memory/memory-window.d.ts} +1 -1
  150. package/dist/{cjs/memory/SmartMemoryManager.d.ts → types/memory/smart-memory-manager.d.ts} +1 -1
  151. package/dist/types/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  152. package/dist/types/services/context/resolution-context.d.ts +49 -0
  153. package/dist/types/services/entity-resolver.d.ts +58 -0
  154. package/dist/types/services/formatters/converters/index.d.ts +2 -0
  155. package/dist/types/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  156. package/dist/types/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  157. package/dist/types/services/formatters/format-converter-registry.d.ts +66 -0
  158. package/dist/types/services/formatters/index.d.ts +3 -0
  159. package/dist/types/services/formatters/types.d.ts +29 -0
  160. package/dist/types/services/index.d.ts +3 -0
  161. package/dist/types/services/resolution/resolution-pipeline.d.ts +44 -0
  162. package/dist/types/tools/index.d.ts +1 -0
  163. package/dist/types/utils/index.d.ts +1 -0
  164. package/package.json +30 -27
  165. package/src/agent-factory.ts +1 -1
  166. package/src/base-agent.ts +9 -0
  167. package/src/config/system-message.ts +2 -15
  168. package/src/constants/entity-references.ts +23 -0
  169. package/src/constants/form-priorities.ts +25 -0
  170. package/src/constants/index.ts +4 -0
  171. package/src/constants/messages.ts +20 -0
  172. package/src/constants/test-constants.ts +49 -0
  173. package/src/conversational-agent.ts +42 -69
  174. package/src/core/{ToolRegistry.ts → tool-registry.ts} +71 -1
  175. package/src/examples/external-tool-wrapper-example.ts +56 -0
  176. package/src/execution/{ExecutionPipeline.ts → execution-pipeline.ts} +3 -3
  177. package/src/forms/field-guidance-registry.ts +415 -0
  178. package/src/forms/field-type-registry.ts +49 -48
  179. package/src/forms/{FormEngine.ts → form-engine.ts} +66 -43
  180. package/src/forms/form-generator.ts +91 -17
  181. package/src/forms/index.ts +4 -1
  182. package/src/forms/types.ts +9 -1
  183. package/src/index.ts +7 -37
  184. package/src/langchain/external-tool-wrapper.ts +90 -0
  185. package/src/langchain/{FormAwareAgentExecutor.ts → form-aware-agent-executor.ts} +615 -231
  186. package/src/langchain/{FormValidatingToolWrapper.ts → form-validating-tool-wrapper.ts} +2 -1
  187. package/src/langchain/index.ts +3 -0
  188. package/src/{langchain-agent.ts → langchain/langchain-agent.ts} +389 -113
  189. package/src/mcp/adapters/index.ts +1 -0
  190. package/src/mcp/adapters/langchain.ts +27 -18
  191. package/src/mcp/{ContentProcessor.ts → content-processor.ts} +71 -47
  192. package/src/mcp/index.ts +5 -0
  193. package/src/mcp/{MCPClientManager.ts → mcp-client-manager.ts} +2 -2
  194. package/src/memory/{ContentStorage.ts → content-storage.ts} +263 -167
  195. package/src/memory/index.ts +5 -8
  196. package/src/memory/{MemoryWindow.ts → memory-window.ts} +47 -24
  197. package/src/memory/{SmartMemoryManager.ts → smart-memory-manager.ts} +49 -22
  198. package/src/plugins/hbar/HbarPlugin.ts +1 -1
  199. package/src/plugins/hcs-10/HCS10Plugin.ts +46 -28
  200. package/src/scripts/test-external-tool-wrapper.ts +6 -6
  201. package/src/scripts/test-inscribe-form-generation.ts +22 -21
  202. package/src/scripts/test-inscribe-wrapper-verification.ts +5 -4
  203. package/src/services/{ContentStoreManager.ts → content-store-manager.ts} +75 -33
  204. package/src/services/context/resolution-context.ts +80 -0
  205. package/src/services/entity-resolver.ts +425 -0
  206. package/src/services/formatters/converters/index.ts +2 -0
  207. package/src/services/formatters/converters/string-normalization-converter.ts +106 -0
  208. package/src/services/formatters/converters/topic-id-to-hrl-converter.ts +25 -0
  209. package/src/services/formatters/format-converter-registry.ts +229 -0
  210. package/src/services/formatters/index.ts +3 -0
  211. package/src/services/formatters/types.ts +31 -0
  212. package/src/services/index.ts +3 -0
  213. package/src/services/resolution/resolution-pipeline.ts +106 -0
  214. package/src/tools/index.ts +1 -0
  215. package/src/types/content-reference.ts +87 -60
  216. package/src/utils/index.ts +1 -0
  217. package/cli/dist/CLIApp.d.ts +0 -9
  218. package/cli/dist/CLIApp.js +0 -127
  219. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  220. package/cli/dist/LocalConversationalAgent.js +0 -58
  221. package/cli/dist/app.d.ts +0 -16
  222. package/cli/dist/app.js +0 -13
  223. package/cli/dist/cli.d.ts +0 -2
  224. package/cli/dist/cli.js +0 -51
  225. package/cli/dist/components/AppContainer.d.ts +0 -16
  226. package/cli/dist/components/AppContainer.js +0 -24
  227. package/cli/dist/components/AppScreens.d.ts +0 -2
  228. package/cli/dist/components/AppScreens.js +0 -259
  229. package/cli/dist/components/ChatScreen.d.ts +0 -15
  230. package/cli/dist/components/ChatScreen.js +0 -39
  231. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  232. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  233. package/cli/dist/components/LoadingScreen.d.ts +0 -2
  234. package/cli/dist/components/LoadingScreen.js +0 -16
  235. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  236. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  237. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  238. package/cli/dist/components/MCPConfigScreen.js +0 -168
  239. package/cli/dist/components/ScreenRouter.d.ts +0 -12
  240. package/cli/dist/components/ScreenRouter.js +0 -22
  241. package/cli/dist/components/SetupScreen.d.ts +0 -15
  242. package/cli/dist/components/SetupScreen.js +0 -65
  243. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  244. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  245. package/cli/dist/components/StatusBadge.d.ts +0 -7
  246. package/cli/dist/components/StatusBadge.js +0 -28
  247. package/cli/dist/components/TerminalWindow.d.ts +0 -8
  248. package/cli/dist/components/TerminalWindow.js +0 -24
  249. package/cli/dist/components/WelcomeScreen.d.ts +0 -11
  250. package/cli/dist/components/WelcomeScreen.js +0 -47
  251. package/cli/dist/context/AppContext.d.ts +0 -68
  252. package/cli/dist/context/AppContext.js +0 -363
  253. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  254. package/cli/dist/hooks/useInitializeAgent.js +0 -28
  255. package/cli/dist/hooks/useStableState.d.ts +0 -38
  256. package/cli/dist/hooks/useStableState.js +0 -68
  257. package/cli/dist/managers/AgentManager.d.ts +0 -57
  258. package/cli/dist/managers/AgentManager.js +0 -119
  259. package/cli/dist/managers/ConfigManager.d.ts +0 -53
  260. package/cli/dist/managers/ConfigManager.js +0 -173
  261. package/cli/dist/types.d.ts +0 -31
  262. package/cli/dist/types.js +0 -19
  263. package/dist/cjs/context/ReferenceContextManager.d.ts +0 -84
  264. package/dist/cjs/context/ReferenceResponseProcessor.d.ts +0 -76
  265. package/dist/cjs/services/EntityResolver.d.ts +0 -26
  266. package/dist/types/context/ReferenceContextManager.d.ts +0 -84
  267. package/dist/types/context/ReferenceResponseProcessor.d.ts +0 -76
  268. package/dist/types/services/EntityResolver.d.ts +0 -26
  269. package/src/context/ReferenceContextManager.ts +0 -350
  270. package/src/context/ReferenceResponseProcessor.ts +0 -295
  271. package/src/scripts/test-hedera-kit-wrapper.ts +0 -265
  272. package/src/services/EntityResolver.ts +0 -128
  273. /package/dist/cjs/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  274. /package/dist/cjs/langchain/{FormValidatingToolWrapper.d.ts → form-validating-tool-wrapper.d.ts} +0 -0
  275. /package/dist/cjs/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  276. /package/dist/cjs/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  277. /package/dist/cjs/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  278. /package/dist/cjs/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  279. /package/dist/types/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  280. /package/dist/types/langchain/{FormValidatingToolWrapper.d.ts → form-validating-tool-wrapper.d.ts} +0 -0
  281. /package/dist/types/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  282. /package/dist/types/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  283. /package/dist/types/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  284. /package/dist/types/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  285. /package/src/memory/{ReferenceIdGenerator.ts → reference-id-generator.ts} +0 -0
  286. /package/src/memory/{TokenCounter.ts → token-counter.ts} +0 -0
  287. /package/src/tools/{EntityResolverTool.ts → entity-resolver-tool.ts} +0 -0
  288. /package/src/utils/{ResponseFormatter.ts → response-formatter.ts} +0 -0
@@ -0,0 +1,106 @@
1
+ import { StructuredTool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import { Logger } from "@hashgraphonline/standards-sdk";
4
+ class AirdropToolWrapper extends StructuredTool {
5
+ constructor(originalTool, agentKit) {
6
+ super();
7
+ this.name = "hedera-hts-airdrop-token";
8
+ this.description = "Airdrops fungible tokens to multiple recipients. Automatically converts human-readable amounts to smallest units based on token decimals.";
9
+ this.schema = z.object({
10
+ tokenId: z.string().describe('The ID of the fungible token to airdrop (e.g., "0.0.yyyy").'),
11
+ recipients: z.array(
12
+ z.object({
13
+ accountId: z.string().describe('Recipient account ID (e.g., "0.0.xxxx").'),
14
+ amount: z.union([z.number(), z.string()]).describe(
15
+ 'Amount in human-readable format (e.g., "10" for 10 tokens).'
16
+ )
17
+ })
18
+ ).min(1).describe("Array of recipient objects, each with accountId and amount."),
19
+ memo: z.string().optional().describe("Optional. Memo for the transaction.")
20
+ });
21
+ this.originalTool = originalTool;
22
+ this.agentKit = agentKit;
23
+ this.logger = new Logger({ module: "AirdropToolWrapper" });
24
+ }
25
+ async _call(input) {
26
+ try {
27
+ this.logger.info(
28
+ `Processing airdrop request for token ${input.tokenId} with ${input.recipients.length} recipients`
29
+ );
30
+ const tokenInfo = await this.getTokenInfo(input.tokenId);
31
+ const decimals = tokenInfo.decimals || 0;
32
+ this.logger.info(`Token ${input.tokenId} has ${decimals} decimal places`);
33
+ const convertedRecipients = input.recipients.map((recipient) => {
34
+ const humanAmount = typeof recipient.amount === "string" ? parseFloat(recipient.amount) : recipient.amount;
35
+ const smallestUnitAmount = this.convertToSmallestUnits(
36
+ humanAmount,
37
+ decimals
38
+ );
39
+ this.logger.info(
40
+ `Converting amount for ${recipient.accountId}: ${humanAmount} tokens → ${smallestUnitAmount} smallest units`
41
+ );
42
+ return {
43
+ ...recipient,
44
+ amount: smallestUnitAmount.toString()
45
+ };
46
+ });
47
+ const convertedInput = {
48
+ ...input,
49
+ recipients: convertedRecipients
50
+ };
51
+ this.logger.info(`Calling original airdrop tool with converted amounts`);
52
+ return await this.originalTool._call(convertedInput);
53
+ } catch (error) {
54
+ this.logger.error("Error in airdrop tool wrapper:", error);
55
+ throw error;
56
+ }
57
+ }
58
+ convertToSmallestUnits(amount, decimals) {
59
+ return Math.floor(amount * Math.pow(10, decimals));
60
+ }
61
+ async getTokenInfo(tokenId) {
62
+ return await this.queryTokenInfo(tokenId);
63
+ }
64
+ async queryTokenInfo(tokenId) {
65
+ try {
66
+ this.logger.info("Querying token info using mirror node");
67
+ const mirrorNode = this.agentKit.mirrorNode;
68
+ if (!mirrorNode) {
69
+ this.logger.info(
70
+ "MirrorNode not found in agentKit, attempting to access via fetch"
71
+ );
72
+ const network = this.agentKit.network || "testnet";
73
+ const mirrorNodeUrl = network === "mainnet" ? "https://mainnet.mirrornode.hedera.com" : "https://testnet.mirrornode.hedera.com";
74
+ const response = await fetch(
75
+ `${mirrorNodeUrl}/api/v1/tokens/${tokenId}`
76
+ );
77
+ if (response.ok) {
78
+ const tokenData = await response.json();
79
+ const decimals = parseInt(String(tokenData.decimals || "0"));
80
+ this.logger.info(
81
+ `Token ${tokenId} found with ${decimals} decimals via API`
82
+ );
83
+ return { ...tokenData, decimals };
84
+ }
85
+ } else {
86
+ const tokenData = await mirrorNode.getTokenInfo(tokenId);
87
+ if (tokenData && typeof tokenData.decimals !== "undefined") {
88
+ const decimals = parseInt(tokenData.decimals.toString()) || 0;
89
+ this.logger.info(`Token ${tokenId} found with ${decimals} decimals`);
90
+ return { ...tokenData, decimals };
91
+ }
92
+ }
93
+ throw new Error(`Token data not found or missing decimals field`);
94
+ } catch (error) {
95
+ this.logger.warn(`Failed to query token info for ${tokenId}:`, error);
96
+ this.logger.info(
97
+ "Falling back to assumed 0 decimal places (smallest units)"
98
+ );
99
+ return { decimals: 0 };
100
+ }
101
+ }
102
+ }
103
+ export {
104
+ AirdropToolWrapper
105
+ };
106
+ //# sourceMappingURL=index35.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index35.js","sources":["../../src/plugins/hbar/AirdropToolWrapper.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { HederaAgentKit } from 'hedera-agent-kit';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\ninterface TokenInfo {\n decimals: number;\n [key: string]: unknown;\n}\n\ninterface ToolWithCall {\n _call(input: unknown): Promise<string>;\n}\n\ninterface AgentKitWithMirrorNode {\n mirrorNode?: {\n getTokenInfo(tokenId: string): Promise<TokenInfo>;\n };\n network: string;\n}\n\nexport class AirdropToolWrapper extends StructuredTool {\n name = 'hedera-hts-airdrop-token';\n description =\n 'Airdrops fungible tokens to multiple recipients. Automatically converts human-readable amounts to smallest units based on token decimals.';\n\n schema = z.object({\n tokenId: z\n .string()\n .describe('The ID of the fungible token to airdrop (e.g., \"0.0.yyyy\").'),\n recipients: z\n .array(\n z.object({\n accountId: z\n .string()\n .describe('Recipient account ID (e.g., \"0.0.xxxx\").'),\n amount: z\n .union([z.number(), z.string()])\n .describe(\n 'Amount in human-readable format (e.g., \"10\" for 10 tokens).'\n ),\n })\n )\n .min(1)\n .describe('Array of recipient objects, each with accountId and amount.'),\n memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n });\n\n private originalTool: StructuredTool & ToolWithCall;\n private agentKit: HederaAgentKit & AgentKitWithMirrorNode;\n private logger: Logger;\n\n constructor(originalTool: StructuredTool, agentKit: unknown) {\n super();\n this.originalTool = originalTool as StructuredTool & ToolWithCall;\n this.agentKit = agentKit as HederaAgentKit & AgentKitWithMirrorNode;\n this.logger = new Logger({ module: 'AirdropToolWrapper' });\n }\n\n async _call(input: z.infer<typeof this.schema>): Promise<string> {\n try {\n this.logger.info(\n `Processing airdrop request for token ${input.tokenId} with ${input.recipients.length} recipients`\n );\n\n const tokenInfo = await this.getTokenInfo(input.tokenId);\n const decimals = tokenInfo.decimals || 0;\n\n this.logger.info(`Token ${input.tokenId} has ${decimals} decimal places`);\n\n const convertedRecipients = input.recipients.map((recipient) => {\n const humanAmount =\n typeof recipient.amount === 'string'\n ? parseFloat(recipient.amount)\n : recipient.amount;\n const smallestUnitAmount = this.convertToSmallestUnits(\n humanAmount,\n decimals\n );\n\n this.logger.info(\n `Converting amount for ${recipient.accountId}: ${humanAmount} tokens → ${smallestUnitAmount} smallest units`\n );\n\n return {\n ...recipient,\n amount: smallestUnitAmount.toString(),\n };\n });\n\n const convertedInput = {\n ...input,\n recipients: convertedRecipients,\n };\n\n this.logger.info(`Calling original airdrop tool with converted amounts`);\n return await this.originalTool._call(convertedInput);\n } catch (error) {\n this.logger.error('Error in airdrop tool wrapper:', error);\n throw error;\n }\n }\n\n private convertToSmallestUnits(amount: number, decimals: number): number {\n return Math.floor(amount * Math.pow(10, decimals));\n }\n\n private async getTokenInfo(tokenId: string): Promise<TokenInfo> {\n return await this.queryTokenInfo(tokenId);\n }\n\n private async queryTokenInfo(tokenId: string): Promise<TokenInfo> {\n try {\n this.logger.info('Querying token info using mirror node');\n const mirrorNode = this.agentKit.mirrorNode;\n if (!mirrorNode) {\n this.logger.info(\n 'MirrorNode not found in agentKit, attempting to access via fetch'\n );\n const network = this.agentKit.network || 'testnet';\n const mirrorNodeUrl =\n network === 'mainnet'\n ? 'https://mainnet.mirrornode.hedera.com'\n : 'https://testnet.mirrornode.hedera.com';\n\n const response = await fetch(\n `${mirrorNodeUrl}/api/v1/tokens/${tokenId}`\n );\n if (response.ok) {\n const tokenData = (await response.json()) as Record<string, unknown>;\n const decimals = parseInt(String(tokenData.decimals || '0'));\n this.logger.info(\n `Token ${tokenId} found with ${decimals} decimals via API`\n );\n return { ...tokenData, decimals };\n }\n } else {\n const tokenData = await mirrorNode.getTokenInfo(tokenId);\n\n if (tokenData && typeof tokenData.decimals !== 'undefined') {\n const decimals = parseInt(tokenData.decimals.toString()) || 0;\n this.logger.info(`Token ${tokenId} found with ${decimals} decimals`);\n return { ...tokenData, decimals };\n }\n }\n\n throw new Error(`Token data not found or missing decimals field`);\n } catch (error) {\n this.logger.warn(`Failed to query token info for ${tokenId}:`, error);\n\n this.logger.info(\n 'Falling back to assumed 0 decimal places (smallest units)'\n );\n return { decimals: 0 };\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ const getSystemMessage = (accountId) => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, content inscription, and Hedera Hashgraph operations.
2
+
3
+ You have access to tools for:
4
+ - HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages
5
+ - HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents
6
+ - Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions
7
+ - Hedera Token Service (HTS): creating tokens, transferring tokens, airdropping tokens, and managing token operations
8
+
9
+
10
+ *** IMPORTANT CONTEXT ***
11
+ You are currently operating as agent: ${accountId} on the Hedera Hashgraph
12
+ When users ask about "my profile", "my account", "my connections", etc., use this account ID: ${accountId}
13
+
14
+ *** CRITICAL ENTITY HANDLING RULES ***
15
+ - When users refer to entities (tokens, topics, accounts) with pronouns like "it", "that", "the token/topic", etc., ALWAYS use the most recently created entity of that type
16
+ - Entity IDs look like "0.0.XXXXXX" and are stored in memory after creation
17
+ - NEVER use example or placeholder IDs like "0.0.123456" - always use actual created entity IDs
18
+ - Account ID ${accountId} is NOT a token - tokens and accounts are different entities
19
+
20
+ Remember the connection numbers when listing connections, as users might refer to them.`;
21
+ export {
22
+ getSystemMessage
23
+ };
24
+ //# sourceMappingURL=index36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index36.js","sources":["../../src/config/system-message.ts"],"sourcesContent":["export const getSystemMessage = (\n accountId: string\n): string => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, content inscription, and Hedera Hashgraph operations.\n\nYou have access to tools for:\n- HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages\n- HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents\n- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions\n- Hedera Token Service (HTS): creating tokens, transferring tokens, airdropping tokens, and managing token operations\n\n\n*** IMPORTANT CONTEXT ***\nYou are currently operating as agent: ${accountId} on the Hedera Hashgraph\nWhen users ask about \"my profile\", \"my account\", \"my connections\", etc., use this account ID: ${accountId}\n\n*** CRITICAL ENTITY HANDLING RULES ***\n- When users refer to entities (tokens, topics, accounts) with pronouns like \"it\", \"that\", \"the token/topic\", etc., ALWAYS use the most recently created entity of that type\n- Entity IDs look like \"0.0.XXXXXX\" and are stored in memory after creation\n- NEVER use example or placeholder IDs like \"0.0.123456\" - always use actual created entity IDs\n- Account ID ${accountId} is NOT a token - tokens and accounts are different entities\n\n Remember the connection numbers when listing connections, as users might refer to them.`;\n"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,CAC9B,cACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAU2B,SAAS;AAAA,gGAC+C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM1F,SAAS;AAAA;AAAA;"}
@@ -0,0 +1,8 @@
1
+ const ERROR_MESSAGES = {
2
+ TOO_MANY_REQUESTS: "Too many requests. Please wait a moment and try again.",
3
+ RATE_LIMITED: "I'm receiving too many requests right now. Please wait a moment and try again."
4
+ };
5
+ export {
6
+ ERROR_MESSAGES
7
+ };
8
+ //# sourceMappingURL=index37.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index37.js","sources":["../../src/constants/messages.ts"],"sourcesContent":["/**\n * Common error messages and user feedback strings\n */\nexport const ERROR_MESSAGES = {\n TOO_MANY_REQUESTS: 'Too many requests. Please wait a moment and try again.',\n RATE_LIMITED: \"I'm receiving too many requests right now. Please wait a moment and try again.\",\n SYSTEM_ERROR: 'System error occurred',\n INVALID_INPUT: 'Invalid input provided',\n NETWORK_ERROR: 'Network error occurred',\n} as const;\n\n/**\n * Common success and status messages\n */\nexport const STATUS_MESSAGES = {\n OPERATION_SUCCESSFUL: 'Operation completed successfully',\n PROCESSING: 'Processing your request...',\n READY: 'Ready to process requests',\n INITIALIZING: 'Initializing...',\n} as const;"],"names":[],"mappings":"AAGO,MAAM,iBAAiB;AAAA,EAC5B,mBAAmB;AAAA,EACnB,cAAc;AAIhB;"}
@@ -0,0 +1,15 @@
1
+ import { EntityFormat } from "./index26.js";
2
+ const ENTITY_PATTERNS = {
3
+ TOPIC_REFERENCE: "the topic",
4
+ TOKEN_REFERENCE: "the token"
5
+ };
6
+ ({
7
+ TOPIC: EntityFormat.TOPIC_ID,
8
+ TOKEN: EntityFormat.TOKEN_ID,
9
+ ACCOUNT: EntityFormat.ACCOUNT_ID,
10
+ CONTRACT: EntityFormat.CONTRACT_ID
11
+ });
12
+ export {
13
+ ENTITY_PATTERNS
14
+ };
15
+ //# sourceMappingURL=index38.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index38.js","sources":["../../src/constants/entity-references.ts"],"sourcesContent":["/**\n * Common entity reference patterns used across the application\n */\nexport const ENTITY_PATTERNS = {\n TOPIC_REFERENCE: 'the topic',\n TOKEN_REFERENCE: 'the token',\n ACCOUNT_REFERENCE: 'the account',\n TRANSACTION_REFERENCE: 'the transaction',\n CONTRACT_REFERENCE: 'the contract',\n} as const;\n\n/**\n * Entity type identifiers\n */\nimport { EntityFormat } from '../services/formatters/types';\n\nexport const ENTITY_TYPES = {\n TOPIC: EntityFormat.TOPIC_ID,\n TOKEN: EntityFormat.TOKEN_ID,\n ACCOUNT: EntityFormat.ACCOUNT_ID,\n TRANSACTION: 'transaction',\n CONTRACT: EntityFormat.CONTRACT_ID,\n} as const;\n"],"names":[],"mappings":";AAGO,MAAM,kBAAkB;AAAA,EAC7B,iBAAiB;AAAA,EACjB,iBAAiB;AAInB;AAAA,CAO4B;AAAA,EAC1B,OAAO,aAAa;AAAA,EACpB,OAAO,aAAa;AAAA,EACpB,SAAS,aAAa;AAAA,EAEtB,UAAU,aAAa;AACzB;"}
@@ -0,0 +1,258 @@
1
+ import { z } from "zod";
2
+ import { Logger } from "@hashgraphonline/standards-sdk";
3
+ import { wrapToolWithFormValidation } from "./index30.js";
4
+ import { FormGenerator } from "./index10.js";
5
+ import { isFormValidatable } from "@hashgraphonline/standards-agent-kit";
6
+ class ToolRegistry {
7
+ constructor(logger) {
8
+ this.tools = /* @__PURE__ */ new Map();
9
+ this.formGenerator = new FormGenerator();
10
+ this.logger = logger || new Logger({ module: "ToolRegistry" });
11
+ }
12
+ /**
13
+ * Register a tool with the registry
14
+ */
15
+ registerTool(tool, options = {}) {
16
+ const capabilities = this.analyzeToolCapabilities(tool);
17
+ const metadata = {
18
+ name: tool.name,
19
+ version: "1.0.0",
20
+ category: options.metadata?.category || "core",
21
+ description: tool.description,
22
+ capabilities,
23
+ dependencies: [],
24
+ schema: tool.schema,
25
+ ...options.metadata
26
+ };
27
+ try {
28
+ if (!metadata.entityResolutionPreferences) {
29
+ const schemaRecord = tool.schema;
30
+ const rawPrefs = schemaRecord && typeof schemaRecord === "object" && schemaRecord["_entityResolutionPreferences"];
31
+ if (rawPrefs && typeof rawPrefs === "object") {
32
+ metadata.entityResolutionPreferences = rawPrefs;
33
+ }
34
+ }
35
+ } catch {
36
+ }
37
+ try {
38
+ const schemaRecord = tool.schema;
39
+ const schemaDef = schemaRecord && schemaRecord._def;
40
+ if (schemaDef?.typeName === "ZodObject") {
41
+ const shape = typeof schemaDef.shape === "function" ? schemaDef.shape?.() || {} : schemaDef.shape || {};
42
+ const metadataField = shape["metadata"];
43
+ const isStringArray = !!metadataField && metadataField._def?.typeName === "ZodArray" && metadataField._def?.type?._def?.typeName === "ZodString";
44
+ if (isStringArray && typeof tool.description === "string") {
45
+ if (!metadata.entityResolutionPreferences) {
46
+ metadata.entityResolutionPreferences = {
47
+ inscription: "hrl"
48
+ };
49
+ }
50
+ const note = " NOTE: When referencing inscriptions or media, provide canonical Hashlink Resource Locators (e.g., hcs://<standard>/<topicId>) rather than external URLs or embedded JSON.";
51
+ if (!tool.description.includes("Hashlink Resource Locators")) {
52
+ tool.description = `${tool.description}${note}`;
53
+ }
54
+ }
55
+ }
56
+ } catch {
57
+ }
58
+ let finalTool = tool;
59
+ let wrapper;
60
+ if (this.shouldWrapTool(tool, capabilities, options)) {
61
+ wrapper = wrapToolWithFormValidation(
62
+ tool,
63
+ this.formGenerator,
64
+ {
65
+ requireAllFields: false,
66
+ skipFields: ["metaOptions"],
67
+ ...options.wrapperConfig
68
+ }
69
+ );
70
+ finalTool = wrapper;
71
+ }
72
+ try {
73
+ if (metadata.entityResolutionPreferences) {
74
+ finalTool["entityResolutionPreferences"] = metadata.entityResolutionPreferences;
75
+ }
76
+ } catch {
77
+ }
78
+ const entry = {
79
+ tool: finalTool,
80
+ metadata,
81
+ wrapper,
82
+ originalTool: tool
83
+ };
84
+ this.tools.set(tool.name, entry);
85
+ }
86
+ /**
87
+ * Get a tool by name
88
+ */
89
+ getTool(name) {
90
+ return this.tools.get(name) || null;
91
+ }
92
+ /**
93
+ * Get tools by capability
94
+ */
95
+ getToolsByCapability(capability, value) {
96
+ const results = [];
97
+ for (const entry of this.tools.values()) {
98
+ if (value !== void 0) {
99
+ if (entry.metadata.capabilities[capability] === value) {
100
+ results.push(entry);
101
+ }
102
+ } else if (entry.metadata.capabilities[capability]) {
103
+ results.push(entry);
104
+ }
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Get tools by query
110
+ */
111
+ getToolsByQuery(query) {
112
+ const results = [];
113
+ for (const entry of this.tools.values()) {
114
+ let matches = true;
115
+ if (query.name && entry.metadata.name !== query.name) {
116
+ matches = false;
117
+ }
118
+ if (query.category && entry.metadata.category !== query.category) {
119
+ matches = false;
120
+ }
121
+ if (query.capabilities) {
122
+ for (const [key, value] of Object.entries(query.capabilities)) {
123
+ if (entry.metadata.capabilities[key] !== value) {
124
+ matches = false;
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ if (matches) {
130
+ results.push(entry);
131
+ }
132
+ }
133
+ return results;
134
+ }
135
+ /**
136
+ * Get all registered tools
137
+ */
138
+ getAllTools() {
139
+ return Array.from(this.tools.values()).map((entry) => entry.tool);
140
+ }
141
+ /**
142
+ * Get all registry entries
143
+ */
144
+ getAllRegistryEntries() {
145
+ return Array.from(this.tools.values());
146
+ }
147
+ /**
148
+ * Get all tool names
149
+ */
150
+ getToolNames() {
151
+ return Array.from(this.tools.keys());
152
+ }
153
+ /**
154
+ * Check if a tool is registered
155
+ */
156
+ hasTool(name) {
157
+ return this.tools.has(name);
158
+ }
159
+ /**
160
+ * Unregister a tool
161
+ */
162
+ unregisterTool(name) {
163
+ return this.tools.delete(name);
164
+ }
165
+ /**
166
+ * Clear all tools
167
+ */
168
+ clear() {
169
+ this.tools.clear();
170
+ }
171
+ /**
172
+ * Analyze tool capabilities
173
+ */
174
+ analyzeToolCapabilities(tool) {
175
+ const implementsFormValidatable = isFormValidatable(tool);
176
+ const hasRenderConfig = this.hasRenderConfig(tool);
177
+ const isZodObjectLike = this.isZodObjectLike(tool.schema);
178
+ const supportsFormValidation = implementsFormValidatable || hasRenderConfig;
179
+ const requiresWrapper = supportsFormValidation && isZodObjectLike;
180
+ let priority = "medium";
181
+ let category = "core";
182
+ if (supportsFormValidation && requiresWrapper) {
183
+ priority = "critical";
184
+ } else if (supportsFormValidation) {
185
+ priority = "high";
186
+ } else if (tool.description?.toLowerCase().includes("query") || tool.description?.toLowerCase().includes("search")) {
187
+ priority = "low";
188
+ }
189
+ const toolAsAny = tool;
190
+ if (tool.constructor.name.includes("MCP") || toolAsAny.isMCPTool) {
191
+ category = "mcp";
192
+ } else if (toolAsAny.isExtension || tool.constructor.name.includes("Extension")) {
193
+ category = "extension";
194
+ }
195
+ return {
196
+ supportsFormValidation,
197
+ requiresWrapper,
198
+ priority,
199
+ category
200
+ };
201
+ }
202
+ /**
203
+ * Check if tool has render configuration
204
+ */
205
+ hasRenderConfig(tool) {
206
+ const schema = tool.schema;
207
+ return !!(schema && schema._renderConfig);
208
+ }
209
+ /**
210
+ * Determine if tool should be wrapped
211
+ */
212
+ shouldWrapTool(tool, capabilities, options) {
213
+ if (options.skipWrapper) {
214
+ return false;
215
+ }
216
+ if (options.forceWrapper) {
217
+ return true;
218
+ }
219
+ return capabilities.requiresWrapper;
220
+ }
221
+ /**
222
+ * Check if schema is ZodObject-like
223
+ */
224
+ isZodObjectLike(schema) {
225
+ if (!schema || typeof schema !== "object") {
226
+ return false;
227
+ }
228
+ const schemaRecord = schema;
229
+ const schemaDef = schemaRecord._def;
230
+ return schema instanceof z.ZodObject || schemaDef?.typeName === "ZodObject" || "shape" in schemaRecord && typeof schemaRecord.shape === "object";
231
+ }
232
+ /**
233
+ * Get statistics about the registry
234
+ */
235
+ getStatistics() {
236
+ const stats = {
237
+ totalTools: this.tools.size,
238
+ wrappedTools: 0,
239
+ unwrappedTools: 0,
240
+ categoryCounts: { core: 0, extension: 0, mcp: 0 },
241
+ priorityCounts: { low: 0, medium: 0, high: 0, critical: 0 }
242
+ };
243
+ for (const entry of this.tools.values()) {
244
+ if (entry.wrapper) {
245
+ stats.wrappedTools++;
246
+ } else {
247
+ stats.unwrappedTools++;
248
+ }
249
+ stats.categoryCounts[entry.metadata.category]++;
250
+ stats.priorityCounts[entry.metadata.capabilities.priority]++;
251
+ }
252
+ return stats;
253
+ }
254
+ }
255
+ export {
256
+ ToolRegistry
257
+ };
258
+ //# sourceMappingURL=index39.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index39.js","sources":["../../src/core/tool-registry.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport {\n FormValidatingToolWrapper,\n wrapToolWithFormValidation,\n} from '../langchain/form-validating-tool-wrapper';\nimport { FormGenerator } from '../forms/form-generator';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Tool capabilities configuration for registry entries\n */\nexport interface ToolCapabilities {\n supportsFormValidation: boolean;\n requiresWrapper: boolean;\n priority: 'low' | 'medium' | 'high' | 'critical';\n category: 'core' | 'extension' | 'mcp';\n}\n\n/**\n * Entity resolution format preferences for tools\n */\nexport interface EntityResolutionPreferences {\n inscription?: 'hrl' | 'topicId' | 'metadata' | 'any';\n token?: 'tokenId' | 'address' | 'symbol' | 'any';\n nft?: 'serialNumber' | 'metadata' | 'hrl' | 'any';\n account?: 'accountId' | 'alias' | 'evmAddress' | 'any';\n}\n\n/**\n * Tool metadata for comprehensive tool information\n */\nexport interface ToolMetadata {\n name: string;\n version: string;\n category: ToolCapabilities['category'];\n description: string;\n capabilities: ToolCapabilities;\n dependencies: string[];\n schema: unknown;\n entityResolutionPreferences?: EntityResolutionPreferences;\n}\n\n/**\n * Registry entry containing tool instance and metadata\n */\nexport interface ToolRegistryEntry {\n tool: StructuredTool;\n metadata: ToolMetadata;\n wrapper?: FormValidatingToolWrapper<z.ZodObject<z.ZodRawShape>> | undefined;\n originalTool: StructuredTool;\n}\n\n/**\n * Options for tool registration\n */\nexport interface ToolRegistrationOptions {\n forceWrapper?: boolean;\n skipWrapper?: boolean;\n wrapperConfig?: {\n requireAllFields?: boolean;\n skipFields?: string[];\n };\n metadata?: Partial<ToolMetadata>;\n}\n\n/**\n * Query interface for finding tools\n */\nexport interface ToolQuery {\n name?: string;\n category?: ToolMetadata['category'];\n capabilities?: Partial<ToolCapabilities>;\n}\n\n/**\n * Centralized tool registry for managing tool lifecycle\n */\nexport class ToolRegistry {\n private tools = new Map<string, ToolRegistryEntry>();\n private formGenerator: FormGenerator;\n private logger: Logger;\n\n constructor(logger?: Logger) {\n this.formGenerator = new FormGenerator();\n this.logger = logger || new Logger({ module: 'ToolRegistry' });\n }\n\n /**\n * Register a tool with the registry\n */\n registerTool(\n tool: StructuredTool,\n options: ToolRegistrationOptions = {}\n ): void {\n const capabilities = this.analyzeToolCapabilities(tool);\n const metadata: ToolMetadata = {\n name: tool.name,\n version: '1.0.0',\n category: options.metadata?.category || 'core',\n description: tool.description,\n capabilities,\n dependencies: [],\n schema: tool.schema,\n ...options.metadata,\n };\n\n try {\n if (!metadata.entityResolutionPreferences) {\n const schemaRecord = tool.schema as unknown as Record<string, unknown>;\n const rawPrefs =\n schemaRecord &&\n typeof schemaRecord === 'object' &&\n (schemaRecord as Record<string, unknown>)[\n '_entityResolutionPreferences'\n ];\n if (rawPrefs && typeof rawPrefs === 'object') {\n metadata.entityResolutionPreferences = rawPrefs as unknown as EntityResolutionPreferences;\n }\n }\n } catch {\n }\n\n try {\n const schemaRecord = tool.schema as unknown as Record<string, unknown>;\n const schemaDef = (schemaRecord && (schemaRecord as Record<string, unknown>)._def) as\n | { typeName?: string; shape?: unknown }\n | undefined;\n if (schemaDef?.typeName === 'ZodObject') {\n const shape: Record<string, unknown> =\n typeof (schemaDef as { shape?: () => Record<string, unknown> }).shape === 'function'\n ? ((schemaDef as { shape: () => Record<string, unknown> }).shape?.() || {})\n : ((schemaDef as { shape?: Record<string, unknown> }).shape || {});\n\n const metadataField = shape['metadata'] as\n | { _def?: { typeName?: string; type?: { _def?: { typeName?: string } } } }\n | undefined;\n const isStringArray =\n !!metadataField &&\n metadataField._def?.typeName === 'ZodArray' &&\n metadataField._def?.type?._def?.typeName === 'ZodString';\n\n if (isStringArray && typeof tool.description === 'string') {\n if (!metadata.entityResolutionPreferences) {\n metadata.entityResolutionPreferences = {\n inscription: 'hrl',\n } as EntityResolutionPreferences;\n }\n const note =\n ' NOTE: When referencing inscriptions or media, provide canonical Hashlink Resource Locators (e.g., hcs://<standard>/<topicId>) rather than external URLs or embedded JSON.';\n if (!tool.description.includes('Hashlink Resource Locators')) {\n (tool as unknown as { description: string }).description = `${tool.description}${note}`;\n }\n }\n }\n } catch {}\n\n let finalTool: StructuredTool = tool;\n let wrapper:\n | FormValidatingToolWrapper<z.ZodObject<z.ZodRawShape>>\n | undefined;\n\n if (this.shouldWrapTool(tool, capabilities, options)) {\n wrapper = wrapToolWithFormValidation(\n tool as StructuredTool<z.ZodObject<z.ZodRawShape>>,\n this.formGenerator,\n {\n requireAllFields: false,\n skipFields: ['metaOptions'],\n ...options.wrapperConfig,\n }\n ) as FormValidatingToolWrapper<z.ZodObject<z.ZodRawShape>>;\n finalTool = wrapper as StructuredTool;\n }\n\n try {\n if (metadata.entityResolutionPreferences) {\n (finalTool as unknown as Record<string, unknown>)[\n 'entityResolutionPreferences'\n ] = metadata.entityResolutionPreferences;\n }\n } catch {\n }\n\n const entry: ToolRegistryEntry = {\n tool: finalTool,\n metadata,\n wrapper,\n originalTool: tool,\n };\n\n this.tools.set(tool.name, entry);\n }\n\n /**\n * Get a tool by name\n */\n getTool(name: string): ToolRegistryEntry | null {\n return this.tools.get(name) || null;\n }\n\n /**\n * Get tools by capability\n */\n getToolsByCapability(\n capability: keyof ToolCapabilities,\n value?: unknown\n ): ToolRegistryEntry[] {\n const results: ToolRegistryEntry[] = [];\n\n for (const entry of this.tools.values()) {\n if (value !== undefined) {\n if (entry.metadata.capabilities[capability] === value) {\n results.push(entry);\n }\n } else if (entry.metadata.capabilities[capability]) {\n results.push(entry);\n }\n }\n\n return results;\n }\n\n /**\n * Get tools by query\n */\n getToolsByQuery(query: ToolQuery): ToolRegistryEntry[] {\n const results: ToolRegistryEntry[] = [];\n\n for (const entry of this.tools.values()) {\n let matches = true;\n\n if (query.name && entry.metadata.name !== query.name) {\n matches = false;\n }\n\n if (query.category && entry.metadata.category !== query.category) {\n matches = false;\n }\n\n if (query.capabilities) {\n for (const [key, value] of Object.entries(query.capabilities)) {\n if (\n entry.metadata.capabilities[key as keyof ToolCapabilities] !== value\n ) {\n matches = false;\n break;\n }\n }\n }\n\n if (matches) {\n results.push(entry);\n }\n }\n\n return results;\n }\n\n /**\n * Get all registered tools\n */\n getAllTools(): StructuredTool[] {\n return Array.from(this.tools.values()).map((entry) => entry.tool);\n }\n\n /**\n * Get all registry entries\n */\n getAllRegistryEntries(): ToolRegistryEntry[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get all tool names\n */\n getToolNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * Check if a tool is registered\n */\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * Clear all tools\n */\n clear(): void {\n this.tools.clear();\n }\n\n /**\n * Analyze tool capabilities\n */\n private analyzeToolCapabilities(tool: StructuredTool): ToolCapabilities {\n const implementsFormValidatable = isFormValidatable(tool);\n const hasRenderConfig = this.hasRenderConfig(tool);\n const isZodObjectLike = this.isZodObjectLike(tool.schema);\n\n const supportsFormValidation = implementsFormValidatable || hasRenderConfig;\n const requiresWrapper = supportsFormValidation && isZodObjectLike;\n\n let priority: ToolCapabilities['priority'] = 'medium';\n let category: ToolCapabilities['category'] = 'core';\n\n if (supportsFormValidation && requiresWrapper) {\n priority = 'critical';\n } else if (supportsFormValidation) {\n priority = 'high';\n } else if (\n tool.description?.toLowerCase().includes('query') ||\n tool.description?.toLowerCase().includes('search')\n ) {\n priority = 'low';\n }\n\n const toolAsAny = tool as unknown as Record<string, unknown>;\n if (tool.constructor.name.includes('MCP') || toolAsAny.isMCPTool) {\n category = 'mcp';\n } else if (\n toolAsAny.isExtension ||\n tool.constructor.name.includes('Extension')\n ) {\n category = 'extension';\n }\n\n return {\n supportsFormValidation,\n requiresWrapper,\n priority,\n category,\n };\n }\n\n /**\n * Check if tool has render configuration\n */\n private hasRenderConfig(tool: StructuredTool): boolean {\n const schema = tool.schema as Record<string, unknown>;\n return !!(schema && schema._renderConfig);\n }\n\n /**\n * Determine if tool should be wrapped\n */\n private shouldWrapTool(\n tool: StructuredTool,\n capabilities: ToolCapabilities,\n options: ToolRegistrationOptions\n ): boolean {\n if (options.skipWrapper) {\n return false;\n }\n\n if (options.forceWrapper) {\n return true;\n }\n\n return capabilities.requiresWrapper;\n }\n\n /**\n * Check if schema is ZodObject-like\n */\n private isZodObjectLike(schema: unknown): boolean {\n if (!schema || typeof schema !== 'object') {\n return false;\n }\n\n const schemaRecord = schema as Record<string, unknown>;\n const schemaDef = schemaRecord._def as Record<string, unknown> | undefined;\n\n return (\n schema instanceof z.ZodObject ||\n schemaDef?.typeName === 'ZodObject' ||\n ('shape' in schemaRecord && typeof schemaRecord.shape === 'object')\n );\n }\n\n /**\n * Get statistics about the registry\n */\n getStatistics(): {\n totalTools: number;\n wrappedTools: number;\n unwrappedTools: number;\n categoryCounts: Record<ToolCapabilities['category'], number>;\n priorityCounts: Record<ToolCapabilities['priority'], number>;\n } {\n const stats = {\n totalTools: this.tools.size,\n wrappedTools: 0,\n unwrappedTools: 0,\n categoryCounts: { core: 0, extension: 0, mcp: 0 } as Record<\n ToolCapabilities['category'],\n number\n >,\n priorityCounts: { low: 0, medium: 0, high: 0, critical: 0 } as Record<\n ToolCapabilities['priority'],\n number\n >,\n };\n\n for (const entry of this.tools.values()) {\n if (entry.wrapper) {\n stats.wrappedTools++;\n } else {\n stats.unwrappedTools++;\n }\n\n stats.categoryCounts[entry.metadata.category]++;\n stats.priorityCounts[entry.metadata.capabilities.priority]++;\n }\n\n return stats;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import { ZodError } from "zod";
2
+ import { Logger } from "@hashgraphonline/standards-sdk";
3
+ class ExecutionPipeline {
4
+ constructor(toolRegistry, formEngine, memory, logger) {
5
+ this.toolRegistry = toolRegistry;
6
+ this.formEngine = formEngine;
7
+ this.memory = memory;
8
+ this.logger = logger || new Logger({ module: "ExecutionPipeline" });
9
+ }
10
+ /**
11
+ * Execute a tool through the pipeline
12
+ */
13
+ async execute(toolName, input, sessionContext) {
14
+ const traceId = `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
15
+ const startTime = Date.now();
16
+ const toolEntry = this.toolRegistry.getTool(toolName);
17
+ if (!toolEntry) {
18
+ throw new Error(`Tool not found in registry: ${toolName}`);
19
+ }
20
+ const context = {
21
+ toolName,
22
+ input,
23
+ session: sessionContext || this.buildDefaultSession(),
24
+ memory: this.memory,
25
+ traceId,
26
+ toolEntry
27
+ };
28
+ try {
29
+ const shouldGenerateForm = await this.checkFormGeneration(context);
30
+ if (shouldGenerateForm.requiresForm && shouldGenerateForm.formMessage) {
31
+ return {
32
+ success: false,
33
+ output: "Form generation required",
34
+ requiresForm: true,
35
+ formMessage: shouldGenerateForm.formMessage,
36
+ traceId,
37
+ executionTime: Date.now() - startTime
38
+ };
39
+ }
40
+ const result = await this.executeToolDirect(context);
41
+ return {
42
+ success: true,
43
+ output: result,
44
+ traceId,
45
+ executionTime: Date.now() - startTime
46
+ };
47
+ } catch (error) {
48
+ return this.handleExecutionError(
49
+ error,
50
+ context,
51
+ traceId,
52
+ Date.now() - startTime
53
+ );
54
+ }
55
+ }
56
+ /**
57
+ * Execute tool with validation
58
+ */
59
+ async executeWithValidation(toolName, input, sessionContext) {
60
+ return this.execute(toolName, input, sessionContext);
61
+ }
62
+ /**
63
+ * Process form submission
64
+ */
65
+ async processFormSubmission(toolName, formId, parameters, sessionContext) {
66
+ const traceId = `form-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
67
+ const startTime = Date.now();
68
+ try {
69
+ const formSubmission = {
70
+ formId,
71
+ toolName,
72
+ parameters,
73
+ timestamp: Date.now()
74
+ };
75
+ const processedInput = await this.formEngine.processSubmission(
76
+ formSubmission
77
+ );
78
+ return this.execute(toolName, processedInput, sessionContext);
79
+ } catch (error) {
80
+ return {
81
+ success: false,
82
+ output: "Form submission processing failed",
83
+ error: error instanceof Error ? error.message : String(error),
84
+ traceId,
85
+ executionTime: Date.now() - startTime
86
+ };
87
+ }
88
+ }
89
+ /**
90
+ * Check if form generation is required
91
+ */
92
+ async checkFormGeneration(context) {
93
+ const inputRecord = context.input;
94
+ if (inputRecord?.__fromForm === true || inputRecord?.renderForm === false) {
95
+ return { requiresForm: false };
96
+ }
97
+ if (!this.formEngine.shouldGenerateForm(context.toolEntry.tool, context.input)) {
98
+ return { requiresForm: false };
99
+ }
100
+ const formMessage = await this.formEngine.generateForm(
101
+ context.toolName,
102
+ context.toolEntry.tool,
103
+ context.input
104
+ );
105
+ if (formMessage) {
106
+ return { requiresForm: true, formMessage };
107
+ }
108
+ return { requiresForm: false };
109
+ }
110
+ /**
111
+ * Execute tool directly
112
+ */
113
+ async executeToolDirect(context) {
114
+ const { toolEntry, input } = context;
115
+ const parameters = input || {};
116
+ const mergedArgs = { ...parameters, renderForm: false };
117
+ if (toolEntry.wrapper) {
118
+ return this.executeWrappedTool(toolEntry, mergedArgs);
119
+ }
120
+ return await toolEntry.tool.call(mergedArgs);
121
+ }
122
+ /**
123
+ * Execute wrapped tool
124
+ */
125
+ async executeWrappedTool(toolEntry, mergedArgs) {
126
+ const wrapper = toolEntry.wrapper;
127
+ if (!wrapper) {
128
+ throw new Error("Tool wrapper not found");
129
+ }
130
+ const wrapperAsAny = wrapper;
131
+ if (wrapperAsAny.executeOriginal) {
132
+ return await wrapperAsAny.executeOriginal(mergedArgs);
133
+ }
134
+ if (wrapperAsAny.originalTool?.call) {
135
+ return await wrapperAsAny.originalTool.call(mergedArgs);
136
+ }
137
+ return await toolEntry.originalTool.call(mergedArgs);
138
+ }
139
+ /**
140
+ * Handle execution error
141
+ */
142
+ handleExecutionError(error, context, traceId, executionTime) {
143
+ const errorMessage = error instanceof Error ? error.message : String(error);
144
+ if (error instanceof ZodError) {
145
+ return {
146
+ success: false,
147
+ output: "Validation error occurred",
148
+ error: errorMessage,
149
+ traceId,
150
+ executionTime
151
+ };
152
+ }
153
+ this.logger.error(`Tool execution failed: ${context.toolName}`, {
154
+ traceId,
155
+ error: errorMessage
156
+ });
157
+ return {
158
+ success: false,
159
+ output: "Tool execution failed",
160
+ error: errorMessage,
161
+ traceId,
162
+ executionTime
163
+ };
164
+ }
165
+ /**
166
+ * Build default session context
167
+ */
168
+ buildDefaultSession() {
169
+ return {
170
+ sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
171
+ timestamp: Date.now()
172
+ };
173
+ }
174
+ /**
175
+ * Get statistics about the pipeline
176
+ */
177
+ getStatistics() {
178
+ return {
179
+ totalMiddleware: 0,
180
+ registeredMiddleware: []
181
+ };
182
+ }
183
+ }
184
+ export {
185
+ ExecutionPipeline
186
+ };
187
+ //# sourceMappingURL=index40.js.map