@hashgraphonline/conversational-agent 0.2.216 → 0.2.217

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 (312) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.ts +1 -0
  5. package/dist/cjs/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  6. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  7. package/dist/cjs/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  8. package/dist/cjs/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  9. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  10. package/dist/cjs/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  11. package/dist/cjs/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  12. package/dist/cjs/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  13. package/dist/cjs/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  14. package/dist/cjs/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  15. package/dist/cjs/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  16. package/dist/cjs/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  17. package/dist/cjs/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  18. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  19. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  20. package/dist/cjs/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  21. package/dist/cjs/plugins/community/swarm/config.d.ts +6 -0
  22. package/dist/cjs/plugins/community/swarm/constants.d.ts +8 -0
  23. package/dist/cjs/plugins/community/swarm/index.d.ts +2 -0
  24. package/dist/cjs/plugins/community/swarm/model.d.ts +23 -0
  25. package/dist/cjs/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  26. package/dist/cjs/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  27. package/dist/cjs/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  28. package/dist/cjs/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  29. package/dist/cjs/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  30. package/dist/cjs/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  31. package/dist/cjs/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  32. package/dist/cjs/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  33. package/dist/cjs/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  34. package/dist/cjs/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  35. package/dist/cjs/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  36. package/dist/cjs/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  37. package/dist/cjs/plugins/community/swarm/utils.d.ts +22 -0
  38. package/dist/cjs/plugins/index.d.ts +1 -0
  39. package/dist/esm/index.js +33 -31
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/index10.js +13 -677
  42. package/dist/esm/index10.js.map +1 -1
  43. package/dist/esm/index11.js +601 -234
  44. package/dist/esm/index11.js.map +1 -1
  45. package/dist/esm/index12.js +296 -136
  46. package/dist/esm/index12.js.map +1 -1
  47. package/dist/esm/index13.js +127 -235
  48. package/dist/esm/index13.js.map +1 -1
  49. package/dist/esm/index14.js +247 -84
  50. package/dist/esm/index14.js.map +1 -1
  51. package/dist/esm/index15.js +81 -159
  52. package/dist/esm/index15.js.map +1 -1
  53. package/dist/esm/index16.js +155 -229
  54. package/dist/esm/index16.js.map +1 -1
  55. package/dist/esm/index17.js +238 -140
  56. package/dist/esm/index17.js.map +1 -1
  57. package/dist/esm/index18.js +139 -493
  58. package/dist/esm/index18.js.map +1 -1
  59. package/dist/esm/index19.js +479 -91
  60. package/dist/esm/index19.js.map +1 -1
  61. package/dist/esm/index20.js +88 -147
  62. package/dist/esm/index20.js.map +1 -1
  63. package/dist/esm/index21.js +127 -666
  64. package/dist/esm/index21.js.map +1 -1
  65. package/dist/esm/index22.js +698 -44
  66. package/dist/esm/index22.js.map +1 -1
  67. package/dist/esm/index23.js +45 -304
  68. package/dist/esm/index23.js.map +1 -1
  69. package/dist/esm/index24.js +303 -153
  70. package/dist/esm/index24.js.map +1 -1
  71. package/dist/esm/index25.js +150 -117
  72. package/dist/esm/index25.js.map +1 -1
  73. package/dist/esm/index26.js +154 -18
  74. package/dist/esm/index26.js.map +1 -1
  75. package/dist/esm/index27.js +18 -22
  76. package/dist/esm/index27.js.map +1 -1
  77. package/dist/esm/index28.js +15 -74
  78. package/dist/esm/index28.js.map +1 -1
  79. package/dist/esm/index29.js +70 -295
  80. package/dist/esm/index29.js.map +1 -1
  81. package/dist/esm/index30.js +279 -100
  82. package/dist/esm/index30.js.map +1 -1
  83. package/dist/esm/index31.js +86 -922
  84. package/dist/esm/index31.js.map +1 -1
  85. package/dist/esm/index32.js +904 -189
  86. package/dist/esm/index32.js.map +1 -1
  87. package/dist/esm/index33.js +185 -1169
  88. package/dist/esm/index33.js.map +1 -1
  89. package/dist/esm/index34.js +1218 -112
  90. package/dist/esm/index34.js.map +1 -1
  91. package/dist/esm/index35.js +111 -99
  92. package/dist/esm/index35.js.map +1 -1
  93. package/dist/esm/index36.js +113 -8
  94. package/dist/esm/index36.js.map +1 -1
  95. package/dist/esm/index37.js +8 -45
  96. package/dist/esm/index37.js.map +1 -1
  97. package/dist/esm/index38.js +41 -102
  98. package/dist/esm/index38.js.map +1 -1
  99. package/dist/esm/index39.js +96 -55
  100. package/dist/esm/index39.js.map +1 -1
  101. package/dist/esm/index4.js +1 -1
  102. package/dist/esm/index40.js +58 -71
  103. package/dist/esm/index40.js.map +1 -1
  104. package/dist/esm/index41.js +79 -21
  105. package/dist/esm/index41.js.map +1 -1
  106. package/dist/esm/index42.js +21 -5
  107. package/dist/esm/index42.js.map +1 -1
  108. package/dist/esm/index43.js +4 -11
  109. package/dist/esm/index43.js.map +1 -1
  110. package/dist/esm/index44.js +12 -322
  111. package/dist/esm/index44.js.map +1 -1
  112. package/dist/esm/index45.js +280 -142
  113. package/dist/esm/index45.js.map +1 -1
  114. package/dist/esm/index46.js +181 -24
  115. package/dist/esm/index46.js.map +1 -1
  116. package/dist/esm/index47.js +7 -95
  117. package/dist/esm/index47.js.map +1 -1
  118. package/dist/esm/index48.js +77 -7
  119. package/dist/esm/index48.js.map +1 -1
  120. package/dist/esm/index49.js +75 -0
  121. package/dist/esm/index49.js.map +1 -0
  122. package/dist/esm/index5.js +2 -2
  123. package/dist/esm/index50.js +57 -0
  124. package/dist/esm/index50.js.map +1 -0
  125. package/dist/esm/index51.js +103 -0
  126. package/dist/esm/index51.js.map +1 -0
  127. package/dist/esm/index52.js +79 -0
  128. package/dist/esm/index52.js.map +1 -0
  129. package/dist/esm/index53.js +75 -0
  130. package/dist/esm/index53.js.map +1 -0
  131. package/dist/esm/index54.js +124 -0
  132. package/dist/esm/index54.js.map +1 -0
  133. package/dist/esm/index55.js +58 -0
  134. package/dist/esm/index55.js.map +1 -0
  135. package/dist/esm/index56.js +83 -0
  136. package/dist/esm/index56.js.map +1 -0
  137. package/dist/esm/index57.js +100 -0
  138. package/dist/esm/index57.js.map +1 -0
  139. package/dist/esm/index58.js +118 -0
  140. package/dist/esm/index58.js.map +1 -0
  141. package/dist/esm/index59.js +108 -0
  142. package/dist/esm/index59.js.map +1 -0
  143. package/dist/esm/index6.js +132 -833
  144. package/dist/esm/index6.js.map +1 -1
  145. package/dist/esm/index60.js +30 -0
  146. package/dist/esm/index60.js.map +1 -0
  147. package/dist/esm/index61.js +98 -0
  148. package/dist/esm/index61.js.map +1 -0
  149. package/dist/esm/index62.js +131 -0
  150. package/dist/esm/index62.js.map +1 -0
  151. package/dist/esm/index63.js +19 -0
  152. package/dist/esm/index63.js.map +1 -0
  153. package/dist/esm/index7.js +826 -75
  154. package/dist/esm/index7.js.map +1 -1
  155. package/dist/esm/index8.js +91 -13
  156. package/dist/esm/index8.js.map +1 -1
  157. package/dist/esm/index9.js +13 -17
  158. package/dist/esm/index9.js.map +1 -1
  159. package/dist/types/index.d.ts +1 -0
  160. package/dist/types/plugins/community/swarm/SwarmPlugin.d.ts +17 -0
  161. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.mocks.d.ts +1 -0
  162. package/dist/types/plugins/community/swarm/__tests__/SwarmPlugin.test.d.ts +1 -0
  163. package/dist/types/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.d.ts +1 -0
  164. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.d.ts +1 -0
  165. package/dist/types/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.d.ts +1 -0
  166. package/dist/types/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.d.ts +1 -0
  167. package/dist/types/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.d.ts +1 -0
  168. package/dist/types/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.d.ts +1 -0
  169. package/dist/types/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.d.ts +1 -0
  170. package/dist/types/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.d.ts +1 -0
  171. package/dist/types/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.d.ts +14 -0
  172. package/dist/types/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.d.ts +1 -0
  173. package/dist/types/plugins/community/swarm/__tests__/tools/UploadDataTool.test.d.ts +1 -0
  174. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFileTool.test.d.ts +1 -0
  175. package/dist/types/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.d.ts +1 -0
  176. package/dist/types/plugins/community/swarm/config.d.ts +6 -0
  177. package/dist/types/plugins/community/swarm/constants.d.ts +8 -0
  178. package/dist/types/plugins/community/swarm/index.d.ts +2 -0
  179. package/dist/types/plugins/community/swarm/model.d.ts +23 -0
  180. package/dist/types/plugins/community/swarm/tools/CreatePostageStampTool.d.ts +47 -0
  181. package/dist/types/plugins/community/swarm/tools/DownloadDataTool.d.ts +35 -0
  182. package/dist/types/plugins/community/swarm/tools/DownloadFilesTool.d.ts +41 -0
  183. package/dist/types/plugins/community/swarm/tools/ExtendPostageStampTool.d.ts +47 -0
  184. package/dist/types/plugins/community/swarm/tools/GetPostageStampTool.d.ts +35 -0
  185. package/dist/types/plugins/community/swarm/tools/ListPostageStampsTool.d.ts +53 -0
  186. package/dist/types/plugins/community/swarm/tools/QueryUploadProgressTool.d.ts +35 -0
  187. package/dist/types/plugins/community/swarm/tools/ReadFeedTool.d.ts +41 -0
  188. package/dist/types/plugins/community/swarm/tools/UpdateFeedTool.d.ts +47 -0
  189. package/dist/types/plugins/community/swarm/tools/UploadDataTool.d.ts +47 -0
  190. package/dist/types/plugins/community/swarm/tools/UploadFileTool.d.ts +53 -0
  191. package/dist/types/plugins/community/swarm/tools/UploadFolderTool.d.ts +47 -0
  192. package/dist/types/plugins/community/swarm/utils.d.ts +22 -0
  193. package/dist/types/plugins/index.d.ts +1 -0
  194. package/package.json +36 -26
  195. package/src/index.ts +1 -0
  196. package/src/plugins/community/swarm/README.md +279 -0
  197. package/src/plugins/community/swarm/SwarmPlugin.ts +178 -0
  198. package/src/plugins/community/swarm/__tests__/SwarmPlugin.mocks.ts +105 -0
  199. package/src/plugins/community/swarm/__tests__/SwarmPlugin.test.ts +93 -0
  200. package/src/plugins/community/swarm/__tests__/tools/CreatePostageStampTool.test.ts +152 -0
  201. package/src/plugins/community/swarm/__tests__/tools/DownloadDataTool.test.ts +93 -0
  202. package/src/plugins/community/swarm/__tests__/tools/DownloadFilesTool.test.ts +163 -0
  203. package/src/plugins/community/swarm/__tests__/tools/ExtendPostageStampTool.test.ts +132 -0
  204. package/src/plugins/community/swarm/__tests__/tools/GetPostageStampTool.test.ts +83 -0
  205. package/src/plugins/community/swarm/__tests__/tools/ListPostageStampsTool.test.ts +219 -0
  206. package/src/plugins/community/swarm/__tests__/tools/QueryUploadProgressTool.test.ts +169 -0
  207. package/src/plugins/community/swarm/__tests__/tools/ReadFeedTool.test.ts +133 -0
  208. package/src/plugins/community/swarm/__tests__/tools/SwarmTool.mocks.ts +67 -0
  209. package/src/plugins/community/swarm/__tests__/tools/UpdateFeedTool.test.ts +148 -0
  210. package/src/plugins/community/swarm/__tests__/tools/UploadDataTool.test.ts +125 -0
  211. package/src/plugins/community/swarm/__tests__/tools/UploadFileTool.test.ts +194 -0
  212. package/src/plugins/community/swarm/__tests__/tools/UploadFolderTool.test.ts +118 -0
  213. package/src/plugins/community/swarm/config.ts +6 -0
  214. package/src/plugins/community/swarm/constants.ts +12 -0
  215. package/src/plugins/community/swarm/index.ts +2 -0
  216. package/src/plugins/community/swarm/model.ts +23 -0
  217. package/src/plugins/community/swarm/tools/CreatePostageStampTool.ts +137 -0
  218. package/src/plugins/community/swarm/tools/DownloadDataTool.ts +79 -0
  219. package/src/plugins/community/swarm/tools/DownloadFilesTool.ts +155 -0
  220. package/src/plugins/community/swarm/tools/ExtendPostageStampTool.ts +112 -0
  221. package/src/plugins/community/swarm/tools/GetPostageStampTool.ts +92 -0
  222. package/src/plugins/community/swarm/tools/ListPostageStampsTool.ts +124 -0
  223. package/src/plugins/community/swarm/tools/QueryUploadProgressTool.ts +109 -0
  224. package/src/plugins/community/swarm/tools/ReadFeedTool.ts +110 -0
  225. package/src/plugins/community/swarm/tools/UpdateFeedTool.ts +149 -0
  226. package/src/plugins/community/swarm/tools/UploadDataTool.ts +109 -0
  227. package/src/plugins/community/swarm/tools/UploadFileTool.ts +163 -0
  228. package/src/plugins/community/swarm/tools/UploadFolderTool.ts +150 -0
  229. package/src/plugins/community/swarm/utils.ts +172 -0
  230. package/src/plugins/index.ts +1 -0
  231. package/cli/dist/CLIApp.d.ts +0 -11
  232. package/cli/dist/CLIApp.d.ts.map +0 -1
  233. package/cli/dist/CLIApp.js +0 -128
  234. package/cli/dist/CLIApp.js.map +0 -1
  235. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  236. package/cli/dist/LocalConversationalAgent.js +0 -58
  237. package/cli/dist/app.d.ts +0 -18
  238. package/cli/dist/app.d.ts.map +0 -1
  239. package/cli/dist/app.js +0 -14
  240. package/cli/dist/app.js.map +0 -1
  241. package/cli/dist/cli.d.ts +0 -3
  242. package/cli/dist/cli.d.ts.map +0 -1
  243. package/cli/dist/cli.js +0 -87
  244. package/cli/dist/cli.js.map +0 -1
  245. package/cli/dist/components/AppContainer.d.ts +0 -16
  246. package/cli/dist/components/AppContainer.js +0 -24
  247. package/cli/dist/components/AppScreens.d.ts +0 -2
  248. package/cli/dist/components/AppScreens.js +0 -259
  249. package/cli/dist/components/ChatScreen.d.ts +0 -21
  250. package/cli/dist/components/ChatScreen.d.ts.map +0 -1
  251. package/cli/dist/components/ChatScreen.js +0 -40
  252. package/cli/dist/components/ChatScreen.js.map +0 -1
  253. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  254. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  255. package/cli/dist/components/LoadingScreen.d.ts +0 -3
  256. package/cli/dist/components/LoadingScreen.d.ts.map +0 -1
  257. package/cli/dist/components/LoadingScreen.js +0 -17
  258. package/cli/dist/components/LoadingScreen.js.map +0 -1
  259. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  260. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  261. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  262. package/cli/dist/components/MCPConfigScreen.d.ts.map +0 -1
  263. package/cli/dist/components/MCPConfigScreen.js +0 -186
  264. package/cli/dist/components/MCPConfigScreen.js.map +0 -1
  265. package/cli/dist/components/ScreenRouter.d.ts +0 -13
  266. package/cli/dist/components/ScreenRouter.d.ts.map +0 -1
  267. package/cli/dist/components/ScreenRouter.js +0 -23
  268. package/cli/dist/components/ScreenRouter.js.map +0 -1
  269. package/cli/dist/components/SetupScreen.d.ts +0 -16
  270. package/cli/dist/components/SetupScreen.d.ts.map +0 -1
  271. package/cli/dist/components/SetupScreen.js +0 -67
  272. package/cli/dist/components/SetupScreen.js.map +0 -1
  273. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  274. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  275. package/cli/dist/components/StatusBadge.d.ts +0 -10
  276. package/cli/dist/components/StatusBadge.d.ts.map +0 -1
  277. package/cli/dist/components/StatusBadge.js +0 -24
  278. package/cli/dist/components/StatusBadge.js.map +0 -1
  279. package/cli/dist/components/TerminalWindow.d.ts +0 -9
  280. package/cli/dist/components/TerminalWindow.d.ts.map +0 -1
  281. package/cli/dist/components/TerminalWindow.js +0 -19
  282. package/cli/dist/components/TerminalWindow.js.map +0 -1
  283. package/cli/dist/components/WelcomeScreen.d.ts +0 -12
  284. package/cli/dist/components/WelcomeScreen.d.ts.map +0 -1
  285. package/cli/dist/components/WelcomeScreen.js +0 -47
  286. package/cli/dist/components/WelcomeScreen.js.map +0 -1
  287. package/cli/dist/context/AppContext.d.ts +0 -68
  288. package/cli/dist/context/AppContext.js +0 -363
  289. package/cli/dist/headless-runner.d.ts +0 -17
  290. package/cli/dist/headless-runner.d.ts.map +0 -1
  291. package/cli/dist/headless-runner.js +0 -128
  292. package/cli/dist/headless-runner.js.map +0 -1
  293. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  294. package/cli/dist/hooks/useInitializeAgent.d.ts.map +0 -1
  295. package/cli/dist/hooks/useInitializeAgent.js +0 -29
  296. package/cli/dist/hooks/useInitializeAgent.js.map +0 -1
  297. package/cli/dist/hooks/useStableState.d.ts +0 -38
  298. package/cli/dist/hooks/useStableState.d.ts.map +0 -1
  299. package/cli/dist/hooks/useStableState.js +0 -69
  300. package/cli/dist/hooks/useStableState.js.map +0 -1
  301. package/cli/dist/managers/AgentManager.d.ts +0 -58
  302. package/cli/dist/managers/AgentManager.d.ts.map +0 -1
  303. package/cli/dist/managers/AgentManager.js +0 -121
  304. package/cli/dist/managers/AgentManager.js.map +0 -1
  305. package/cli/dist/managers/ConfigManager.d.ts +0 -54
  306. package/cli/dist/managers/ConfigManager.d.ts.map +0 -1
  307. package/cli/dist/managers/ConfigManager.js +0 -188
  308. package/cli/dist/managers/ConfigManager.js.map +0 -1
  309. package/cli/dist/types.d.ts +0 -52
  310. package/cli/dist/types.d.ts.map +0 -1
  311. package/cli/dist/types.js +0 -34
  312. package/cli/dist/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index36.js","sources":["../../src/runtime/wallet-bridge.ts"],"sourcesContent":["export type WalletNetwork = 'mainnet' | 'testnet';\n\nexport interface WalletStatus {\n connected: boolean;\n accountId?: string;\n network?: WalletNetwork;\n}\n\nexport interface WalletExecutorResult {\n transactionId: string;\n}\n\nexport interface StartInscriptionResult {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface WalletBridgeProvider {\n status: () => Promise<WalletStatus> | WalletStatus;\n executeBytes: (\n base64: string,\n network: WalletNetwork\n ) => Promise<WalletExecutorResult>;\n startInscription?: (\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<StartInscriptionResult>;\n startHCS?: (\n op: string,\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<{ transactionBytes: string }>;\n}\n\nlet providerRef: WalletBridgeProvider | null = null;\n\nexport function setWalletBridgeProvider(provider: WalletBridgeProvider): void {\n providerRef = provider;\n}\n\nexport function getWalletBridgeProvider(): WalletBridgeProvider | null {\n return providerRef;\n}\n"],"names":[],"mappings":"AAqCA,IAAI,cAA2C;AAExC,SAAS,wBAAwB,UAAsC;AAC5E,gBAAc;AAChB;AAEO,SAAS,0BAAuD;AACrE,SAAO;AACT;"}
1
+ {"version":3,"file":"index36.js","sources":["../../src/utils/response-formatter.ts"],"sourcesContent":["/**\n * HCS-12 HashLink block structure for interactive content rendering\n */\ninterface HCS12BlockResult {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\n/**\n * Utility class for formatting tool responses into user-friendly messages\n */\nexport class ResponseFormatter {\n /**\n * Checks if a parsed response contains HashLink block data for interactive rendering\n */\n static isHashLinkResponse(parsed: unknown): boolean {\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n\n const responseObj = parsed as Record<string, unknown>;\n return !!(\n responseObj.success === true &&\n responseObj.type === 'inscription' &&\n responseObj.hashLinkBlock &&\n typeof responseObj.hashLinkBlock === 'object'\n );\n }\n\n /**\n * Formats HashLink block response with simple text confirmation\n * HTML template rendering is handled by HashLinkBlockRenderer component via metadata\n */\n static formatHashLinkResponse(parsed: Record<string, unknown>): string {\n const hashLinkBlock = parsed.hashLinkBlock as HCS12BlockResult;\n const metadata = parsed.metadata as Record<string, unknown> || {};\n const inscription = parsed.inscription as Record<string, unknown> || {};\n\n let message = '✅ Interactive content created successfully!\\n\\n';\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n if (inscription.topicId || hashLinkBlock.attributes.topicId) {\n message += `📍 **Topic ID:** ${inscription.topicId || hashLinkBlock.attributes.topicId}\\n`;\n }\n\n if (inscription.hrl || hashLinkBlock.attributes.hrl) {\n message += `🔗 **HRL:** ${inscription.hrl || hashLinkBlock.attributes.hrl}\\n`;\n }\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n\n message += '\\n⚡ Interactive content will load below';\n\n return message.trim();\n }\n\n /**\n * Checks if a parsed response is an inscription response that needs formatting\n */\n static isInscriptionResponse(parsed: unknown): boolean {\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n\n const responseObj = parsed as Record<string, unknown>;\n return !!(\n responseObj.success === true &&\n responseObj.type === 'inscription' &&\n responseObj.inscription &&\n typeof responseObj.inscription === 'object'\n );\n }\n\n /**\n * Formats inscription response into user-friendly message\n */\n static formatInscriptionResponse(parsed: Record<string, unknown>): string {\n const inscription = parsed.inscription as Record<string, unknown>;\n const metadata = parsed.metadata as Record<string, unknown> || {};\n const title = parsed.title as string || 'Inscription Complete';\n\n let message = `✅ ${title}\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n if (inscription.topicId) {\n message += `📍 **Topic ID:** ${inscription.topicId}\\n`;\n }\n\n if (inscription.hrl) {\n message += `🔗 **HRL:** ${inscription.hrl}\\n`;\n }\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n\n return message.trim();\n }\n\n /**\n * Main formatting method that determines the best response format\n */\n static formatResponse(toolOutput: string): string {\n try {\n const parsed = JSON.parse(toolOutput);\n \n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n return ResponseFormatter.formatHashLinkResponse(parsed);\n }\n \n if (ResponseFormatter.isInscriptionResponse(parsed)) {\n return ResponseFormatter.formatInscriptionResponse(parsed);\n }\n \n return toolOutput;\n } catch {\n return toolOutput;\n }\n }\n}"],"names":[],"mappings":"AAaO,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAI7B,OAAO,mBAAmB,QAA0B;AAClD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AACpB,WAAO,CAAC,EACN,YAAY,YAAY,QACxB,YAAY,SAAS,iBACrB,YAAY,iBACZ,OAAO,YAAY,kBAAkB;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,uBAAuB,QAAyC;AACrE,UAAM,gBAAgB,OAAO;AAC7B,UAAM,WAAW,OAAO,YAAuC,CAAA;AAC/D,UAAM,cAAc,OAAO,eAA0C,CAAA;AAErE,QAAI,UAAU;AAEd,QAAI,SAAS,MAAM;AACjB,iBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,IAC/B;AAEA,QAAI,SAAS,aAAa;AACxB,iBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,IACpC;AAEA,QAAI,YAAY,WAAW,cAAc,WAAW,SAAS;AAC3D,iBAAW,oBAAoB,YAAY,WAAW,cAAc,WAAW,OAAO;AAAA;AAAA,IACxF;AAEA,QAAI,YAAY,OAAO,cAAc,WAAW,KAAK;AACnD,iBAAW,eAAe,YAAY,OAAO,cAAc,WAAW,GAAG;AAAA;AAAA,IAC3E;AAEA,QAAI,YAAY,QAAQ;AACtB,iBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,IAClD;AAEA,QAAI,SAAS,SAAS;AACpB,iBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,IAChD;AAEA,eAAW;AAEX,WAAO,QAAQ,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAsB,QAA0B;AACrD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AACpB,WAAO,CAAC,EACN,YAAY,YAAY,QACxB,YAAY,SAAS,iBACrB,YAAY,eACZ,OAAO,YAAY,gBAAgB;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,0BAA0B,QAAyC;AACxE,UAAM,cAAc,OAAO;AAC3B,UAAM,WAAW,OAAO,YAAuC,CAAA;AAC/D,UAAM,QAAQ,OAAO,SAAmB;AAExC,QAAI,UAAU,KAAK,KAAK;AAAA;AAAA;AAExB,QAAI,SAAS,MAAM;AACjB,iBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,IAC/B;AAEA,QAAI,SAAS,aAAa;AACxB,iBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,IACpC;AAEA,QAAI,YAAY,SAAS;AACvB,iBAAW,oBAAoB,YAAY,OAAO;AAAA;AAAA,IACpD;AAEA,QAAI,YAAY,KAAK;AACnB,iBAAW,eAAe,YAAY,GAAG;AAAA;AAAA,IAC3C;AAEA,QAAI,YAAY,QAAQ;AACtB,iBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,IAClD;AAEA,QAAI,SAAS,SAAS;AACpB,iBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,IAChD;AAEA,WAAO,QAAQ,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,YAA4B;AAChD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,UAAI,kBAAkB,mBAAmB,MAAM,GAAG;AAChD,eAAO,kBAAkB,uBAAuB,MAAM;AAAA,MACxD;AAEA,UAAI,kBAAkB,sBAAsB,MAAM,GAAG;AACnD,eAAO,kBAAkB,0BAA0B,MAAM;AAAA,MAC3D;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;"}
@@ -1,49 +1,12 @@
1
- import { z } from "zod";
2
- import { AccountBuilder } from "./index47.js";
3
- import { BaseHederaTransactionTool } from "hedera-agent-kit";
4
- const HbarTransferInputSchema = z.object({
5
- accountId: z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),
6
- amount: z.union([z.number(), z.string()]).describe(
7
- "HBAR amount in decimal format (e.g., 1 for 1 HBAR, 0.5 for 0.5 HBAR). Positive for credit, negative for debit. DO NOT multiply by 10^8 for tinybars - just use the HBAR amount directly."
8
- )
9
- });
10
- const TransferHbarZodSchemaCore = z.object({
11
- transfers: z.array(HbarTransferInputSchema).min(1).describe(
12
- 'Array of transfers. For simple transfers from your operator account, just include the recipient with positive amount: [{accountId: "0.0.800", amount: 1}]. For complex multi-party transfers, include all parties with negative amounts for senders and positive for receivers.'
13
- ),
14
- memo: z.string().optional().describe("Optional. Memo for the transaction.")
15
- });
16
- class TransferHbarTool extends BaseHederaTransactionTool {
17
- constructor() {
18
- super(...arguments);
19
- this.name = "hedera-account-transfer-hbar-v2";
20
- this.description = 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. For simple transfers from the operator account, just specify the recipient with a positive amount (e.g., [{accountId: "0.0.800", amount: 1}] to send 1 HBAR to 0.0.800). The sender will be automatically added. For multi-party transfers (e.g., "A sends 5 HBAR to C and B sends 3 HBAR to C"), include ALL transfers with their amounts (negative for senders, positive for receivers).';
21
- this.specificInputSchema = TransferHbarZodSchemaCore;
22
- this.namespace = "account";
23
- }
24
- /**
25
- * Creates and returns the service builder for account operations.
26
- *
27
- * @returns BaseServiceBuilder instance configured for account operations
28
- */
29
- getServiceBuilder() {
30
- return new AccountBuilder(this.hederaKit);
31
- }
32
- /**
33
- * Executes the HBAR transfer using the provided builder and arguments.
34
- * Validates that all transfers sum to zero before execution.
35
- *
36
- * @param builder - The service builder instance for executing transactions
37
- * @param specificArgs - The validated transfer parameters including transfers array and optional memo
38
- * @returns Promise that resolves when the transfer is complete
39
- */
40
- async callBuilderMethod(builder, specificArgs) {
41
- await builder.transferHbar(
42
- specificArgs
43
- );
44
- }
1
+ let providerRef = null;
2
+ function setWalletBridgeProvider(provider) {
3
+ providerRef = provider;
4
+ }
5
+ function getWalletBridgeProvider() {
6
+ return providerRef;
45
7
  }
46
8
  export {
47
- TransferHbarTool
9
+ getWalletBridgeProvider,
10
+ setWalletBridgeProvider
48
11
  };
49
12
  //# sourceMappingURL=index37.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index37.js","sources":["../../src/plugins/hbar/TransferHbarTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { HbarTransferParams } from './types';\nimport { AccountBuilder } from './AccountBuilder';\nimport { BaseHederaTransactionTool, BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst HbarTransferInputSchema = z.object({\n accountId: z\n .string()\n .describe('Account ID for the transfer (e.g., \"0.0.xxxx\").'),\n amount: z\n .union([z.number(), z.string()])\n .describe(\n 'HBAR amount in decimal format (e.g., 1 for 1 HBAR, 0.5 for 0.5 HBAR). Positive for credit, negative for debit. DO NOT multiply by 10^8 for tinybars - just use the HBAR amount directly.'\n ),\n});\n\nconst TransferHbarZodSchemaCore = z.object({\n transfers: z\n .array(HbarTransferInputSchema)\n .min(1)\n .describe(\n 'Array of transfers. For simple transfers from your operator account, just include the recipient with positive amount: [{accountId: \"0.0.800\", amount: 1}]. For complex multi-party transfers, include all parties with negative amounts for senders and positive for receivers.'\n ),\n memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\n/**\n * A Hedera transaction tool for transferring HBAR between accounts.\n * Supports single and multi-party transfers with automatic balance validation.\n * Extends BaseHederaTransactionTool to handle HBAR transfer transactions on the Hedera Hashgraph.\n */\nexport class TransferHbarTool extends BaseHederaTransactionTool<\n typeof TransferHbarZodSchemaCore\n> {\n name = 'hedera-account-transfer-hbar-v2';\n description =\n 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. For simple transfers from the operator account, just specify the recipient with a positive amount (e.g., [{accountId: \"0.0.800\", amount: 1}] to send 1 HBAR to 0.0.800). The sender will be automatically added. For multi-party transfers (e.g., \"A sends 5 HBAR to C and B sends 3 HBAR to C\"), include ALL transfers with their amounts (negative for senders, positive for receivers).';\n specificInputSchema = TransferHbarZodSchemaCore;\n namespace = 'account';\n\n\n /**\n * Creates and returns the service builder for account operations.\n * \n * @returns BaseServiceBuilder instance configured for account operations\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return new AccountBuilder(this.hederaKit) as BaseServiceBuilder;\n }\n\n /**\n * Executes the HBAR transfer using the provided builder and arguments.\n * Validates that all transfers sum to zero before execution.\n * \n * @param builder - The service builder instance for executing transactions\n * @param specificArgs - The validated transfer parameters including transfers array and optional memo\n * @returns Promise that resolves when the transfer is complete\n */\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof TransferHbarZodSchemaCore>\n ): Promise<void> {\n await (builder as AccountBuilder).transferHbar(\n specificArgs as unknown as HbarTransferParams\n );\n }\n}"],"names":[],"mappings":";;;AAKA,MAAM,0BAA0B,EAAE,OAAO;AAAA,EACvC,WAAW,EACR,SACA,SAAS,iDAAiD;AAAA,EAC7D,QAAQ,EACL,MAAM,CAAC,EAAE,OAAA,GAAU,EAAE,QAAQ,CAAC,EAC9B;AAAA,IACC;AAAA,EAAA;AAEN,CAAC;AAED,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,WAAW,EACR,MAAM,uBAAuB,EAC7B,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EAAA;AAAA,EAEJ,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,qCAAqC;AAC5E,CAAC;AAOM,MAAM,yBAAyB,0BAEpC;AAAA,EAFK,cAAA;AAAA,UAAA,GAAA,SAAA;AAGL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,sBAAsB;AACtB,SAAA,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,oBAAwC;AAChD,WAAO,IAAI,eAAe,KAAK,SAAS;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,kBACd,SACA,cACe;AACf,UAAO,QAA2B;AAAA,MAChC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"index37.js","sources":["../../src/runtime/wallet-bridge.ts"],"sourcesContent":["export type WalletNetwork = 'mainnet' | 'testnet';\n\nexport interface WalletStatus {\n connected: boolean;\n accountId?: string;\n network?: WalletNetwork;\n}\n\nexport interface WalletExecutorResult {\n transactionId: string;\n}\n\nexport interface StartInscriptionResult {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface WalletBridgeProvider {\n status: () => Promise<WalletStatus> | WalletStatus;\n executeBytes: (\n base64: string,\n network: WalletNetwork\n ) => Promise<WalletExecutorResult>;\n startInscription?: (\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<StartInscriptionResult>;\n startHCS?: (\n op: string,\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<{ transactionBytes: string }>;\n}\n\nlet providerRef: WalletBridgeProvider | null = null;\n\nexport function setWalletBridgeProvider(provider: WalletBridgeProvider): void {\n providerRef = provider;\n}\n\nexport function getWalletBridgeProvider(): WalletBridgeProvider | null {\n return providerRef;\n}\n"],"names":[],"mappings":"AAqCA,IAAI,cAA2C;AAExC,SAAS,wBAAwB,UAAsC;AAC5E,gBAAc;AAChB;AAEO,SAAS,0BAAuD;AACrE,SAAO;AACT;"}
@@ -1,110 +1,49 @@
1
- import { StructuredTool } from "@langchain/core/tools";
2
1
  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" });
2
+ import { AccountBuilder } from "./index61.js";
3
+ import { BaseHederaTransactionTool } from "hedera-agent-kit";
4
+ const HbarTransferInputSchema = z.object({
5
+ accountId: z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),
6
+ amount: z.union([z.number(), z.string()]).describe(
7
+ "HBAR amount in decimal format (e.g., 1 for 1 HBAR, 0.5 for 0.5 HBAR). Positive for credit, negative for debit. DO NOT multiply by 10^8 for tinybars - just use the HBAR amount directly."
8
+ )
9
+ });
10
+ const TransferHbarZodSchemaCore = z.object({
11
+ transfers: z.array(HbarTransferInputSchema).min(1).describe(
12
+ 'Array of transfers. For simple transfers from your operator account, just include the recipient with positive amount: [{accountId: "0.0.800", amount: 1}]. For complex multi-party transfers, include all parties with negative amounts for senders and positive for receivers.'
13
+ ),
14
+ memo: z.string().optional().describe("Optional. Memo for the transaction.")
15
+ });
16
+ class TransferHbarTool extends BaseHederaTransactionTool {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.name = "hedera-account-transfer-hbar-v2";
20
+ this.description = 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. For simple transfers from the operator account, just specify the recipient with a positive amount (e.g., [{accountId: "0.0.800", amount: 1}] to send 1 HBAR to 0.0.800). The sender will be automatically added. For multi-party transfers (e.g., "A sends 5 HBAR to C and B sends 3 HBAR to C"), include ALL transfers with their amounts (negative for senders, positive for receivers).';
21
+ this.specificInputSchema = TransferHbarZodSchemaCore;
22
+ this.namespace = "account";
24
23
  }
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
- }
24
+ /**
25
+ * Creates and returns the service builder for account operations.
26
+ *
27
+ * @returns BaseServiceBuilder instance configured for account operations
28
+ */
29
+ getServiceBuilder() {
30
+ return new AccountBuilder(this.hederaKit);
57
31
  }
58
- convertToSmallestUnits(amount, decimals) {
59
- return Math.floor(amount * Math.pow(10, decimals));
60
- }
61
- async getTokenInfo(tokenId) {
62
- try {
63
- return await this.queryTokenInfo(tokenId);
64
- } catch (error) {
65
- throw error;
66
- }
67
- }
68
- async queryTokenInfo(tokenId) {
69
- try {
70
- this.logger.info("Querying token info using mirror node");
71
- const mirrorNode = this.agentKit.mirrorNode;
72
- if (!mirrorNode) {
73
- this.logger.info(
74
- "MirrorNode not found in agentKit, attempting to access via fetch"
75
- );
76
- const network = this.agentKit.network || "testnet";
77
- const mirrorNodeUrl = network === "mainnet" ? "https://mainnet.mirrornode.hedera.com" : "https://testnet.mirrornode.hedera.com";
78
- const response = await fetch(
79
- `${mirrorNodeUrl}/api/v1/tokens/${tokenId}`
80
- );
81
- if (response.ok) {
82
- const tokenData = await response.json();
83
- const decimals = parseInt(String(tokenData.decimals || "0"));
84
- this.logger.info(
85
- `Token ${tokenId} found with ${decimals} decimals via API`
86
- );
87
- return { ...tokenData, decimals };
88
- }
89
- } else {
90
- const tokenData = await mirrorNode.getTokenInfo(tokenId);
91
- if (tokenData && typeof tokenData.decimals !== "undefined") {
92
- const decimals = parseInt(tokenData.decimals.toString()) || 0;
93
- this.logger.info(`Token ${tokenId} found with ${decimals} decimals`);
94
- return { ...tokenData, decimals };
95
- }
96
- }
97
- throw new Error(`Token data not found or missing decimals field`);
98
- } catch (error) {
99
- this.logger.warn(`Failed to query token info for ${tokenId}:`, error);
100
- this.logger.info(
101
- "Falling back to assumed 0 decimal places (smallest units)"
102
- );
103
- return { decimals: 0 };
104
- }
32
+ /**
33
+ * Executes the HBAR transfer using the provided builder and arguments.
34
+ * Validates that all transfers sum to zero before execution.
35
+ *
36
+ * @param builder - The service builder instance for executing transactions
37
+ * @param specificArgs - The validated transfer parameters including transfers array and optional memo
38
+ * @returns Promise that resolves when the transfer is complete
39
+ */
40
+ async callBuilderMethod(builder, specificArgs) {
41
+ await builder.transferHbar(
42
+ specificArgs
43
+ );
105
44
  }
106
45
  }
107
46
  export {
108
- AirdropToolWrapper
47
+ TransferHbarTool
109
48
  };
110
49
  //# sourceMappingURL=index38.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index38.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 try {\n return await this.queryTokenInfo(tokenId);\n } catch (error) {\n throw error;\n }\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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"}
1
+ {"version":3,"file":"index38.js","sources":["../../src/plugins/hbar/TransferHbarTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { HbarTransferParams } from './types';\nimport { AccountBuilder } from './AccountBuilder';\nimport { BaseHederaTransactionTool, BaseServiceBuilder } from 'hedera-agent-kit';\n\nconst HbarTransferInputSchema = z.object({\n accountId: z\n .string()\n .describe('Account ID for the transfer (e.g., \"0.0.xxxx\").'),\n amount: z\n .union([z.number(), z.string()])\n .describe(\n 'HBAR amount in decimal format (e.g., 1 for 1 HBAR, 0.5 for 0.5 HBAR). Positive for credit, negative for debit. DO NOT multiply by 10^8 for tinybars - just use the HBAR amount directly.'\n ),\n});\n\nconst TransferHbarZodSchemaCore = z.object({\n transfers: z\n .array(HbarTransferInputSchema)\n .min(1)\n .describe(\n 'Array of transfers. For simple transfers from your operator account, just include the recipient with positive amount: [{accountId: \"0.0.800\", amount: 1}]. For complex multi-party transfers, include all parties with negative amounts for senders and positive for receivers.'\n ),\n memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\n/**\n * A Hedera transaction tool for transferring HBAR between accounts.\n * Supports single and multi-party transfers with automatic balance validation.\n * Extends BaseHederaTransactionTool to handle HBAR transfer transactions on the Hedera Hashgraph.\n */\nexport class TransferHbarTool extends BaseHederaTransactionTool<\n typeof TransferHbarZodSchemaCore\n> {\n name = 'hedera-account-transfer-hbar-v2';\n description =\n 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. For simple transfers from the operator account, just specify the recipient with a positive amount (e.g., [{accountId: \"0.0.800\", amount: 1}] to send 1 HBAR to 0.0.800). The sender will be automatically added. For multi-party transfers (e.g., \"A sends 5 HBAR to C and B sends 3 HBAR to C\"), include ALL transfers with their amounts (negative for senders, positive for receivers).';\n specificInputSchema = TransferHbarZodSchemaCore;\n namespace = 'account';\n\n\n /**\n * Creates and returns the service builder for account operations.\n * \n * @returns BaseServiceBuilder instance configured for account operations\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return new AccountBuilder(this.hederaKit) as BaseServiceBuilder;\n }\n\n /**\n * Executes the HBAR transfer using the provided builder and arguments.\n * Validates that all transfers sum to zero before execution.\n * \n * @param builder - The service builder instance for executing transactions\n * @param specificArgs - The validated transfer parameters including transfers array and optional memo\n * @returns Promise that resolves when the transfer is complete\n */\n protected async callBuilderMethod(\n builder: BaseServiceBuilder,\n specificArgs: z.infer<typeof TransferHbarZodSchemaCore>\n ): Promise<void> {\n await (builder as AccountBuilder).transferHbar(\n specificArgs as unknown as HbarTransferParams\n );\n }\n}"],"names":[],"mappings":";;;AAKA,MAAM,0BAA0B,EAAE,OAAO;AAAA,EACvC,WAAW,EACR,SACA,SAAS,iDAAiD;AAAA,EAC7D,QAAQ,EACL,MAAM,CAAC,EAAE,OAAA,GAAU,EAAE,QAAQ,CAAC,EAC9B;AAAA,IACC;AAAA,EAAA;AAEN,CAAC;AAED,MAAM,4BAA4B,EAAE,OAAO;AAAA,EACzC,WAAW,EACR,MAAM,uBAAuB,EAC7B,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EAAA;AAAA,EAEJ,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,qCAAqC;AAC5E,CAAC;AAOM,MAAM,yBAAyB,0BAEpC;AAAA,EAFK,cAAA;AAAA,UAAA,GAAA,SAAA;AAGL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,sBAAsB;AACtB,SAAA,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,oBAAwC;AAChD,WAAO,IAAI,eAAe,KAAK,SAAS;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,kBACd,SACA,cACe;AACf,UAAO,QAA2B;AAAA,MAChC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
@@ -1,69 +1,110 @@
1
- import { AccountId, Client, PrivateKey, TransactionReceipt, PublicKey } from "@hashgraph/sdk";
2
- import { AbstractSigner } from "hedera-agent-kit";
3
- import { HederaMirrorNode, Logger } from "@hashgraphonline/standards-sdk";
4
- class BrowserSigner extends AbstractSigner {
5
- getAccountId() {
6
- return this.account;
7
- }
8
- getNetwork() {
9
- return this.network;
10
- }
11
- constructor(accountId, network, executor) {
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) {
12
6
  super();
13
- this.account = AccountId.fromString(accountId);
14
- this.network = network;
15
- this.client = network === "mainnet" ? Client.forMainnet() : Client.forTestnet();
16
- this.exec = executor ?? null;
17
- this.ephemeralKey = PrivateKey.generateED25519();
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" });
18
24
  }
19
- /**
20
- * Returns an auto-generated ED25519 key for client wiring only.
21
- * Do not use for signing; wallet performs signing in renderer.
22
- */
23
- getOperatorPrivateKey() {
24
- return this.ephemeralKey;
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
+ }
25
57
  }
26
- getClient() {
27
- return this.client;
58
+ convertToSmallestUnits(amount, decimals) {
59
+ return Math.floor(amount * Math.pow(10, decimals));
28
60
  }
29
- async signAndExecuteTransaction(tx) {
30
- if (!this.exec) {
31
- throw new Error("BrowserSigner executor not available");
32
- }
33
- if (!tx.isFrozen()) {
34
- await tx.freezeWith(this.client);
61
+ async getTokenInfo(tokenId) {
62
+ try {
63
+ return await this.queryTokenInfo(tokenId);
64
+ } catch (error) {
65
+ throw error;
35
66
  }
36
- const base64 = Buffer.from(tx.toBytes()).toString("base64");
37
- const { transactionId } = await this.exec(base64, this.network);
38
- const mirror = new HederaMirrorNode(this.network);
39
- const deadline = Date.now() + 6e4;
40
- while (Date.now() < deadline) {
41
- try {
42
- const details = await mirror.getTransaction(transactionId);
43
- if (details && details.result) {
44
- return TransactionReceipt.fromBytes(
45
- Buffer.from(details.result, "base64")
67
+ }
68
+ async queryTokenInfo(tokenId) {
69
+ try {
70
+ this.logger.info("Querying token info using mirror node");
71
+ const mirrorNode = this.agentKit.mirrorNode;
72
+ if (!mirrorNode) {
73
+ this.logger.info(
74
+ "MirrorNode not found in agentKit, attempting to access via fetch"
75
+ );
76
+ const network = this.agentKit.network || "testnet";
77
+ const mirrorNodeUrl = network === "mainnet" ? "https://mainnet.mirrornode.hedera.com" : "https://testnet.mirrornode.hedera.com";
78
+ const response = await fetch(
79
+ `${mirrorNodeUrl}/api/v1/tokens/${tokenId}`
80
+ );
81
+ if (response.ok) {
82
+ const tokenData = await response.json();
83
+ const decimals = parseInt(String(tokenData.decimals || "0"));
84
+ this.logger.info(
85
+ `Token ${tokenId} found with ${decimals} decimals via API`
46
86
  );
87
+ return { ...tokenData, decimals };
88
+ }
89
+ } else {
90
+ const tokenData = await mirrorNode.getTokenInfo(tokenId);
91
+ if (tokenData && typeof tokenData.decimals !== "undefined") {
92
+ const decimals = parseInt(tokenData.decimals.toString()) || 0;
93
+ this.logger.info(`Token ${tokenId} found with ${decimals} decimals`);
94
+ return { ...tokenData, decimals };
47
95
  }
48
- } catch {
49
96
  }
50
- await new Promise((r) => setTimeout(r, 1200));
97
+ throw new Error(`Token data not found or missing decimals field`);
98
+ } catch (error) {
99
+ this.logger.warn(`Failed to query token info for ${tokenId}:`, error);
100
+ this.logger.info(
101
+ "Falling back to assumed 0 decimal places (smallest units)"
102
+ );
103
+ return { decimals: 0 };
51
104
  }
52
- return TransactionReceipt.fromBytes(Buffer.from(""));
53
- }
54
- async getPublicKey() {
55
- const network = this.network === "mainnet" ? "mainnet" : "testnet";
56
- const mirror = new HederaMirrorNode(
57
- network,
58
- new Logger({ module: "BrowserSigner" })
59
- );
60
- const anyKey = await mirror.getPublicKey(this.account.toString());
61
- const keyStr = typeof anyKey?.toString === "function" ? anyKey.toString() : String(anyKey);
62
- return PublicKey.fromString(keyStr);
63
105
  }
64
106
  }
65
107
  export {
66
- BrowserSigner,
67
- BrowserSigner as default
108
+ AirdropToolWrapper
68
109
  };
69
110
  //# sourceMappingURL=index39.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index39.js","sources":["../../src/signers/browser-signer.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n PrivateKey,\n PublicKey,\n Transaction,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { AbstractSigner } from 'hedera-agent-kit';\nimport {\n HederaMirrorNode,\n Logger,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * BrowserSigner (bytes-only)\n *\n * Minimal signer compatible with HederaAgentKit in bytes/Provide Bytes mode.\n * - Does NOT hold a private key\n * - Cannot execute transactions; only provides identity and network context\n * - getOperatorPrivateKey() throws to signal absence of a local key\n */\nexport class BrowserSigner extends AbstractSigner {\n private readonly account: AccountId;\n private readonly network: 'mainnet' | 'testnet';\n private readonly client: Client;\n private readonly exec: ((\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>) | null;\n private readonly ephemeralKey: PrivateKey;\n\n getAccountId(): AccountId {\n return this.account;\n }\n\n getNetwork(): 'mainnet' | 'testnet' {\n return this.network;\n }\n\n constructor(\n accountId: string,\n network: 'mainnet' | 'testnet',\n executor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ) {\n super();\n this.account = AccountId.fromString(accountId);\n this.network = network;\n this.client =\n network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n this.exec = executor ?? null;\n this.ephemeralKey = PrivateKey.generateED25519();\n }\n\n /**\n * Returns an auto-generated ED25519 key for client wiring only.\n * Do not use for signing; wallet performs signing in renderer.\n */\n getOperatorPrivateKey(): PrivateKey {\n return this.ephemeralKey;\n }\n\n getClient(): Client {\n return this.client;\n }\n\n async signAndExecuteTransaction(\n tx: Transaction\n ): Promise<TransactionReceipt> {\n if (!this.exec) {\n throw new Error('BrowserSigner executor not available');\n }\n if (!tx.isFrozen()) {\n await tx.freezeWith(this.client);\n }\n const base64 = Buffer.from(tx.toBytes()).toString('base64');\n const { transactionId } = await this.exec(base64, this.network);\n const mirror = new HederaMirrorNode(this.network);\n const deadline = Date.now() + 60000;\n while (Date.now() < deadline) {\n try {\n const details = await mirror.getTransaction(transactionId);\n if (details && details.result) {\n return TransactionReceipt.fromBytes(\n Buffer.from(details.result, 'base64')\n );\n }\n } catch {}\n await new Promise((r) => setTimeout(r, 1200));\n }\n return TransactionReceipt.fromBytes(Buffer.from(''));\n }\n\n override async getPublicKey(): Promise<PublicKey> {\n const network: NetworkType =\n this.network === 'mainnet' ? 'mainnet' : 'testnet';\n const mirror = new HederaMirrorNode(\n network,\n new Logger({ module: 'BrowserSigner' })\n );\n const anyKey: any = await mirror.getPublicKey(this.account.toString());\n const keyStr = typeof anyKey?.toString === 'function' ? anyKey.toString() : String(anyKey);\n return PublicKey.fromString(keyStr);\n }\n}\n\nexport default BrowserSigner;\n"],"names":[],"mappings":";;;AAuBO,MAAM,sBAAsB,eAAe;AAAA,EAUhD,eAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YACE,WACA,SACA,UAIA;AACA,UAAA;AACA,SAAK,UAAU,UAAU,WAAW,SAAS;AAC7C,SAAK,UAAU;AACf,SAAK,SACH,YAAY,YAAY,OAAO,WAAA,IAAe,OAAO,WAAA;AACvD,SAAK,OAAO,YAAY;AACxB,SAAK,eAAe,WAAW,gBAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,0BACJ,IAC6B;AAC7B,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,CAAC,GAAG,YAAY;AAClB,YAAM,GAAG,WAAW,KAAK,MAAM;AAAA,IACjC;AACA,UAAM,SAAS,OAAO,KAAK,GAAG,SAAS,EAAE,SAAS,QAAQ;AAC1D,UAAM,EAAE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,KAAK,OAAO;AAC9D,UAAM,SAAS,IAAI,iBAAiB,KAAK,OAAO;AAChD,UAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAO,KAAK,IAAA,IAAQ,UAAU;AAC5B,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,eAAe,aAAa;AACzD,YAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAO,mBAAmB;AAAA,YACxB,OAAO,KAAK,QAAQ,QAAQ,QAAQ;AAAA,UAAA;AAAA,QAExC;AAAA,MACF,QAAQ;AAAA,MAAC;AACT,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAAA,IAC9C;AACA,WAAO,mBAAmB,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,EACrD;AAAA,EAEA,MAAe,eAAmC;AAChD,UAAM,UACJ,KAAK,YAAY,YAAY,YAAY;AAC3C,UAAM,SAAS,IAAI;AAAA,MACjB;AAAA,MACA,IAAI,OAAO,EAAE,QAAQ,iBAAiB;AAAA,IAAA;AAExC,UAAM,SAAc,MAAM,OAAO,aAAa,KAAK,QAAQ,UAAU;AACrE,UAAM,SAAS,OAAO,QAAQ,aAAa,aAAa,OAAO,SAAA,IAAa,OAAO,MAAM;AACzF,WAAO,UAAU,WAAW,MAAM;AAAA,EACpC;AACF;"}
1
+ {"version":3,"file":"index39.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 try {\n return await this.queryTokenInfo(tokenId);\n } catch (error) {\n throw error;\n }\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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"}
@@ -1,6 +1,6 @@
1
1
  import { BasePlugin } from "hedera-agent-kit";
2
2
  import { InscriberBuilder, InscribeFromUrlTool, InscribeFromFileTool, InscribeFromBufferTool, InscribeHashinalTool, RetrieveInscriptionTool } from "@hashgraphonline/standards-agent-kit";
3
- import { fieldGuidanceRegistry } from "./index13.js";
3
+ import { fieldGuidanceRegistry } from "./index14.js";
4
4
  class InscribePlugin extends BasePlugin {
5
5
  constructor() {
6
6
  super(...arguments);