@hashgraphonline/conversational-agent 0.0.3 → 0.1.1

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 (78) hide show
  1. package/README.md +79 -0
  2. package/dist/cjs/agent-factory.d.ts +5 -0
  3. package/dist/cjs/base-agent.d.ts +95 -0
  4. package/dist/cjs/conversational-agent.d.ts +62 -5
  5. package/dist/cjs/index.cjs +1 -1
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.ts +8 -0
  8. package/dist/cjs/langchain-agent.d.ts +22 -0
  9. package/dist/cjs/mcp/MCPClientManager.d.ts +40 -0
  10. package/dist/cjs/mcp/adapters/langchain.d.ts +8 -0
  11. package/dist/cjs/mcp/helpers.d.ts +45 -0
  12. package/dist/cjs/mcp/types.d.ts +27 -0
  13. package/dist/cjs/plugins/hbar-transfer/AccountBuilder.d.ts +13 -0
  14. package/dist/cjs/plugins/hbar-transfer/HbarTransferPlugin.d.ts +15 -0
  15. package/dist/cjs/plugins/hbar-transfer/TransferHbarTool.d.ts +61 -0
  16. package/dist/cjs/plugins/hbar-transfer/index.d.ts +1 -0
  17. package/dist/cjs/plugins/hbar-transfer/types.d.ts +10 -0
  18. package/dist/cjs/plugins/index.d.ts +1 -0
  19. package/dist/cjs/providers.d.ts +48 -0
  20. package/dist/esm/index.js +18 -3
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/index10.js +22 -0
  23. package/dist/esm/index10.js.map +1 -0
  24. package/dist/esm/index11.js +104 -0
  25. package/dist/esm/index11.js.map +1 -0
  26. package/dist/esm/index12.js +36 -0
  27. package/dist/esm/index12.js.map +1 -0
  28. package/dist/esm/index13.js +16 -0
  29. package/dist/esm/index13.js.map +1 -0
  30. package/dist/esm/index14.js +127 -0
  31. package/dist/esm/index14.js.map +1 -0
  32. package/dist/esm/index15.js +132 -0
  33. package/dist/esm/index15.js.map +1 -0
  34. package/dist/esm/index16.js +95 -0
  35. package/dist/esm/index16.js.map +1 -0
  36. package/dist/esm/index5.js +42 -202
  37. package/dist/esm/index5.js.map +1 -1
  38. package/dist/esm/index6.js +295 -13
  39. package/dist/esm/index6.js.map +1 -1
  40. package/dist/esm/index7.js +87 -0
  41. package/dist/esm/index7.js.map +1 -0
  42. package/dist/esm/index8.js +255 -0
  43. package/dist/esm/index8.js.map +1 -0
  44. package/dist/esm/index9.js +18 -0
  45. package/dist/esm/index9.js.map +1 -0
  46. package/dist/types/agent-factory.d.ts +5 -0
  47. package/dist/types/base-agent.d.ts +95 -0
  48. package/dist/types/conversational-agent.d.ts +62 -5
  49. package/dist/types/index.d.ts +8 -0
  50. package/dist/types/langchain-agent.d.ts +22 -0
  51. package/dist/types/mcp/MCPClientManager.d.ts +40 -0
  52. package/dist/types/mcp/adapters/langchain.d.ts +8 -0
  53. package/dist/types/mcp/helpers.d.ts +45 -0
  54. package/dist/types/mcp/types.d.ts +27 -0
  55. package/dist/types/plugins/hbar-transfer/AccountBuilder.d.ts +13 -0
  56. package/dist/types/plugins/hbar-transfer/HbarTransferPlugin.d.ts +15 -0
  57. package/dist/types/plugins/hbar-transfer/TransferHbarTool.d.ts +61 -0
  58. package/dist/types/plugins/hbar-transfer/index.d.ts +1 -0
  59. package/dist/types/plugins/hbar-transfer/types.d.ts +10 -0
  60. package/dist/types/plugins/index.d.ts +1 -0
  61. package/dist/types/providers.d.ts +48 -0
  62. package/package.json +12 -6
  63. package/src/agent-factory.ts +21 -0
  64. package/src/base-agent.ts +222 -0
  65. package/src/conversational-agent.ts +204 -102
  66. package/src/index.ts +24 -0
  67. package/src/langchain-agent.ts +333 -0
  68. package/src/mcp/MCPClientManager.ts +148 -0
  69. package/src/mcp/adapters/langchain.ts +185 -0
  70. package/src/mcp/helpers.ts +122 -0
  71. package/src/mcp/types.ts +29 -0
  72. package/src/plugins/hbar-transfer/AccountBuilder.ts +154 -0
  73. package/src/plugins/hbar-transfer/HbarTransferPlugin.ts +66 -0
  74. package/src/plugins/hbar-transfer/TransferHbarTool.ts +49 -0
  75. package/src/plugins/hbar-transfer/index.ts +1 -0
  76. package/src/plugins/hbar-transfer/types.ts +11 -0
  77. package/src/plugins/index.ts +2 -1
  78. package/src/providers.ts +82 -0
@@ -0,0 +1,95 @@
1
+ import { TransferTransaction, AccountId, Hbar } from "@hashgraph/sdk";
2
+ import BigNumber from "bignumber.js";
3
+ import { BaseServiceBuilder } from "hedera-agent-kit";
4
+ class AccountBuilder extends BaseServiceBuilder {
5
+ constructor(hederaKit) {
6
+ super(hederaKit);
7
+ }
8
+ /**
9
+ * Transfers HBAR between accounts with proper decimal handling
10
+ */
11
+ transferHbar(params, isUserInitiated = true) {
12
+ this.clearNotes();
13
+ const transaction = new TransferTransaction();
14
+ if (!params.transfers || params.transfers.length === 0) {
15
+ throw new Error("HbarTransferParams must include at least one transfer.");
16
+ }
17
+ let netZeroInTinybars = new BigNumber(0);
18
+ let userTransferProcessedForScheduling = false;
19
+ if (isUserInitiated && this.kit.userAccountId && this.kit.operationalMode === "provideBytes" && params.transfers.length === 1) {
20
+ const receiverTransfer = params.transfers[0];
21
+ const amountValue = typeof receiverTransfer.amount === "string" || typeof receiverTransfer.amount === "number" ? receiverTransfer.amount : receiverTransfer.amount.toString();
22
+ const amountBigNum = new BigNumber(amountValue);
23
+ if (amountBigNum.isPositive()) {
24
+ const recipientAccountId = typeof receiverTransfer.accountId === "string" ? AccountId.fromString(receiverTransfer.accountId) : receiverTransfer.accountId;
25
+ const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);
26
+ const sdkHbarAmount = Hbar.fromString(roundedAmount);
27
+ this.logger.info(
28
+ `[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${sdkHbarAmount.toString()} from ${this.kit.userAccountId} to ${recipientAccountId.toString()}`
29
+ );
30
+ this.addNote(
31
+ `Configured HBAR transfer from your account (${this.kit.userAccountId}) to ${recipientAccountId.toString()} for ${sdkHbarAmount.toString()}.`
32
+ );
33
+ transaction.addHbarTransfer(recipientAccountId, sdkHbarAmount);
34
+ transaction.addHbarTransfer(
35
+ AccountId.fromString(this.kit.userAccountId),
36
+ sdkHbarAmount.negated()
37
+ );
38
+ userTransferProcessedForScheduling = true;
39
+ }
40
+ }
41
+ if (!userTransferProcessedForScheduling) {
42
+ const processedTransfers = [];
43
+ for (const transferInput of params.transfers) {
44
+ const accountId = typeof transferInput.accountId === "string" ? AccountId.fromString(transferInput.accountId) : transferInput.accountId;
45
+ const amountValue = typeof transferInput.amount === "string" || typeof transferInput.amount === "number" ? transferInput.amount : transferInput.amount.toString();
46
+ const amountBigNum = new BigNumber(amountValue);
47
+ const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);
48
+ this.logger.info(
49
+ `Processing transfer: ${amountValue} HBAR (rounded to ${roundedAmount}) for account ${accountId.toString()}`
50
+ );
51
+ const sdkHbarAmount = Hbar.fromString(roundedAmount);
52
+ processedTransfers.push({
53
+ accountId,
54
+ amount: amountBigNum,
55
+ hbar: sdkHbarAmount
56
+ });
57
+ const tinybarsContribution = sdkHbarAmount.toTinybars();
58
+ netZeroInTinybars = netZeroInTinybars.plus(
59
+ tinybarsContribution.toString()
60
+ );
61
+ }
62
+ if (!netZeroInTinybars.isZero()) {
63
+ this.logger.warn(
64
+ `Transfer sum not zero: ${netZeroInTinybars.toString()} tinybars off. Adjusting last transfer.`
65
+ );
66
+ if (processedTransfers.length > 0) {
67
+ const lastTransfer = processedTransfers[processedTransfers.length - 1];
68
+ const adjustment = netZeroInTinybars.dividedBy(-1e8);
69
+ const adjustedAmount = lastTransfer.amount.plus(adjustment);
70
+ const adjustedRounded = adjustedAmount.toFixed(8, BigNumber.ROUND_DOWN);
71
+ lastTransfer.hbar = Hbar.fromString(adjustedRounded);
72
+ this.logger.info(
73
+ `Adjusted last transfer for ${lastTransfer.accountId.toString()} to ${adjustedRounded} HBAR`
74
+ );
75
+ }
76
+ }
77
+ for (const transfer of processedTransfers) {
78
+ transaction.addHbarTransfer(transfer.accountId, transfer.hbar);
79
+ }
80
+ }
81
+ if (typeof params.memo !== "undefined") {
82
+ if (params.memo === null) {
83
+ this.logger.warn("Received null for memo in transferHbar.");
84
+ } else {
85
+ transaction.setTransactionMemo(params.memo);
86
+ }
87
+ }
88
+ this.setCurrentTransaction(transaction);
89
+ return this;
90
+ }
91
+ }
92
+ export {
93
+ AccountBuilder
94
+ };
95
+ //# sourceMappingURL=index16.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index16.js","sources":["../../src/plugins/hbar-transfer/AccountBuilder.ts"],"sourcesContent":["import {\n AccountId,\n Hbar,\n TransferTransaction,\n} from '@hashgraph/sdk';\nimport BigNumber from 'bignumber.js';\nimport { HederaAgentKit, BaseServiceBuilder } from 'hedera-agent-kit';\nimport { HbarTransferParams } from './types';\n\n/**\n * Custom AccountBuilder that properly handles HBAR decimal conversion\n */\nexport class AccountBuilder extends BaseServiceBuilder {\n constructor(hederaKit: HederaAgentKit) {\n super(hederaKit);\n }\n\n /**\n * Transfers HBAR between accounts with proper decimal handling\n */\n public transferHbar(\n params: HbarTransferParams,\n isUserInitiated: boolean = true\n ): this {\n this.clearNotes();\n const transaction = new TransferTransaction();\n \n if (!params.transfers || params.transfers.length === 0) {\n throw new Error('HbarTransferParams must include at least one transfer.');\n }\n\n let netZeroInTinybars = new BigNumber(0);\n let userTransferProcessedForScheduling = false;\n\n if (\n isUserInitiated &&\n this.kit.userAccountId &&\n (this.kit.operationalMode as string) === 'provideBytes' &&\n params.transfers.length === 1\n ) {\n const receiverTransfer = params.transfers[0];\n const amountValue =\n typeof receiverTransfer.amount === 'string' ||\n typeof receiverTransfer.amount === 'number'\n ? receiverTransfer.amount\n : receiverTransfer.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n\n if (amountBigNum.isPositive()) {\n const recipientAccountId =\n typeof receiverTransfer.accountId === 'string'\n ? AccountId.fromString(receiverTransfer.accountId)\n : receiverTransfer.accountId;\n\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n\n this.logger.info(\n `[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${sdkHbarAmount.toString()} from ${\n this.kit.userAccountId\n } to ${recipientAccountId.toString()}`\n );\n \n this.addNote(\n `Configured HBAR transfer from your account (${\n this.kit.userAccountId\n }) to ${recipientAccountId.toString()} for ${sdkHbarAmount.toString()}.`\n );\n\n transaction.addHbarTransfer(recipientAccountId, sdkHbarAmount);\n transaction.addHbarTransfer(\n AccountId.fromString(this.kit.userAccountId),\n sdkHbarAmount.negated()\n );\n\n userTransferProcessedForScheduling = true;\n }\n }\n\n if (!userTransferProcessedForScheduling) {\n const processedTransfers: Array<{\n accountId: AccountId;\n amount: BigNumber;\n hbar: Hbar;\n }> = [];\n \n for (const transferInput of params.transfers) {\n const accountId =\n typeof transferInput.accountId === 'string'\n ? AccountId.fromString(transferInput.accountId)\n : transferInput.accountId;\n\n const amountValue =\n typeof transferInput.amount === 'string' ||\n typeof transferInput.amount === 'number'\n ? transferInput.amount\n : transferInput.amount.toString();\n\n const amountBigNum = new BigNumber(amountValue);\n const roundedAmount = amountBigNum.toFixed(8, BigNumber.ROUND_DOWN);\n \n this.logger.info(\n `Processing transfer: ${amountValue} HBAR (rounded to ${roundedAmount}) for account ${accountId.toString()}`\n );\n\n const sdkHbarAmount = Hbar.fromString(roundedAmount);\n processedTransfers.push({\n accountId,\n amount: amountBigNum,\n hbar: sdkHbarAmount\n });\n\n const tinybarsContribution = sdkHbarAmount.toTinybars();\n netZeroInTinybars = netZeroInTinybars.plus(\n tinybarsContribution.toString()\n );\n }\n\n if (!netZeroInTinybars.isZero()) {\n this.logger.warn(\n `Transfer sum not zero: ${netZeroInTinybars.toString()} tinybars off. Adjusting last transfer.`\n );\n \n if (processedTransfers.length > 0) {\n const lastTransfer = processedTransfers[processedTransfers.length - 1];\n const adjustment = netZeroInTinybars.dividedBy(-100000000);\n const adjustedAmount = lastTransfer.amount.plus(adjustment);\n const adjustedRounded = adjustedAmount.toFixed(8, BigNumber.ROUND_DOWN);\n lastTransfer.hbar = Hbar.fromString(adjustedRounded);\n \n this.logger.info(\n `Adjusted last transfer for ${lastTransfer.accountId.toString()} to ${adjustedRounded} HBAR`\n );\n }\n }\n \n for (const transfer of processedTransfers) {\n transaction.addHbarTransfer(transfer.accountId, transfer.hbar);\n }\n }\n\n if (typeof params.memo !== 'undefined') {\n if (params.memo === null) {\n this.logger.warn('Received null for memo in transferHbar.');\n } else {\n transaction.setTransactionMemo(params.memo);\n }\n }\n\n this.setCurrentTransaction(transaction);\n return this;\n }\n}"],"names":[],"mappings":"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"}
@@ -1,217 +1,57 @@
1
- import { ServerSigner, getAllHederaCorePlugins, HederaConversationalAgent } from "hedera-agent-kit";
2
- import { HCS10Plugin } from "./index2.js";
3
- import { HCS2Plugin } from "./index3.js";
4
- import { InscribePlugin } from "./index4.js";
5
- import { OpenConvaiState } from "@hashgraphonline/standards-agent-kit";
6
- import { Logger, HederaMirrorNode } from "@hashgraphonline/standards-sdk";
7
- import { PrivateKey } from "@hashgraph/sdk";
8
- import { getSystemMessage } from "./index6.js";
9
- class ConversationalAgent {
10
- constructor(options) {
11
- this.options = options;
12
- this.stateManager = options.stateManager || new OpenConvaiState();
13
- this.hcs10Plugin = new HCS10Plugin();
14
- this.hcs2Plugin = new HCS2Plugin();
15
- this.inscribePlugin = new InscribePlugin();
16
- this.logger = new Logger({ module: "ConversationalAgent" });
17
- }
18
- async initialize() {
19
- const {
20
- accountId,
21
- privateKey,
22
- network = "testnet",
23
- openAIApiKey,
24
- openAIModelName = "gpt-4o",
25
- verbose = false,
26
- operationalMode = "autonomous",
27
- userAccountId,
28
- customSystemMessagePreamble,
29
- customSystemMessagePostamble,
30
- additionalPlugins = [],
31
- scheduleUserTransactionsInBytesMode,
32
- mirrorNodeConfig,
33
- disableLogging
34
- } = this.options;
35
- if (!accountId || !privateKey) {
36
- throw new Error("Account ID and private key are required");
1
+ import { BasePlugin } from "hedera-agent-kit";
2
+ import { TransferHbarTool } from "./index12.js";
3
+ class HbarTransferPlugin extends BasePlugin {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.id = "hbar-transfer";
7
+ this.name = "HBAR Transfer Plugin";
8
+ this.description = "HBAR transfer tool with proper decimal handling for multi-signature transactions";
9
+ this.version = "1.0.0";
10
+ this.author = "Hashgraph Online";
11
+ this.namespace = "account";
12
+ this.tools = [];
13
+ }
14
+ async initialize(context) {
15
+ await super.initialize(context);
16
+ const hederaKit = context.config.hederaKit;
17
+ if (!hederaKit) {
18
+ this.context.logger.warn(
19
+ "HederaKit not found in context. HBAR transfer tools will not be available."
20
+ );
21
+ return;
37
22
  }
38
23
  try {
39
- const mirrorNode = new HederaMirrorNode(network, this.logger);
40
- const accountInfo = await mirrorNode.requestAccount(accountId);
41
- const keyType = accountInfo?.key?._type || "";
42
- let privateKeyInstance;
43
- if (keyType?.toLowerCase()?.includes("ecdsa")) {
44
- privateKeyInstance = PrivateKey.fromStringECDSA(privateKey);
45
- } else {
46
- privateKeyInstance = PrivateKey.fromStringED25519(privateKey);
47
- }
48
- const serverSigner = new ServerSigner(
49
- accountId,
50
- privateKeyInstance,
51
- network
24
+ this.initializeTools();
25
+ this.context.logger.info(
26
+ "HBAR Transfer Plugin initialized successfully"
52
27
  );
53
- const standardPlugins = [
54
- this.hcs10Plugin,
55
- this.hcs2Plugin,
56
- this.inscribePlugin
57
- ];
58
- const corePlugins = getAllHederaCorePlugins();
59
- let allPlugins;
60
- if (this.options.enabledPlugins) {
61
- const enabledSet = new Set(this.options.enabledPlugins);
62
- const filteredPlugins = [...standardPlugins, ...corePlugins].filter(
63
- (plugin) => enabledSet.has(plugin.id)
64
- );
65
- allPlugins = [...filteredPlugins, ...additionalPlugins];
66
- } else {
67
- allPlugins = [...standardPlugins, ...corePlugins, ...additionalPlugins];
68
- }
69
- const agentConfig = {
70
- pluginConfig: {
71
- plugins: allPlugins,
72
- appConfig: {
73
- stateManager: this.stateManager
74
- }
75
- },
76
- openAIApiKey,
77
- openAIModelName,
78
- verbose,
79
- operationalMode,
80
- userAccountId,
81
- customSystemMessagePreamble: customSystemMessagePreamble || getSystemMessage(accountId),
82
- ...customSystemMessagePostamble !== void 0 && {
83
- customSystemMessagePostamble
84
- },
85
- ...scheduleUserTransactionsInBytesMode !== void 0 && {
86
- scheduleUserTransactionsInBytesMode
87
- },
88
- ...mirrorNodeConfig !== void 0 && { mirrorNodeConfig },
89
- ...disableLogging !== void 0 && { disableLogging }
90
- };
91
- this.conversationalAgent = new HederaConversationalAgent(
92
- serverSigner,
93
- agentConfig
94
- );
95
- await this.conversationalAgent.initialize();
96
28
  } catch (error) {
97
- this.logger.error("Failed to initialize ConversationalAgent:", error);
98
- throw error;
99
- }
100
- }
101
- getPlugin() {
102
- return this.hcs10Plugin;
103
- }
104
- getStateManager() {
105
- return this.stateManager;
106
- }
107
- getConversationalAgent() {
108
- if (!this.conversationalAgent) {
109
- throw new Error(
110
- "ConversationalAgent not initialized. Call initialize() first."
29
+ this.context.logger.error(
30
+ "Failed to initialize HBAR Transfer plugin:",
31
+ error
111
32
  );
112
33
  }
113
- return this.conversationalAgent;
114
34
  }
115
- async processMessage(message, chatHistory = []) {
116
- if (!this.conversationalAgent) {
117
- throw new Error(
118
- "ConversationalAgent not initialized. Call initialize() first."
119
- );
35
+ initializeTools() {
36
+ const hederaKit = this.context.config.hederaKit;
37
+ if (!hederaKit) {
38
+ throw new Error("HederaKit not found in context config");
120
39
  }
121
- return this.conversationalAgent.processMessage(message, chatHistory);
122
- }
123
- /**
124
- * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled
125
- */
126
- static withHTS(options) {
127
- return new ConversationalAgent({
128
- ...options,
129
- enabledPlugins: ["hts-token"]
130
- });
131
- }
132
- /**
133
- * Create a ConversationalAgent with only HCS-2 tools enabled
134
- */
135
- static withHCS2(options) {
136
- return new ConversationalAgent({
137
- ...options,
138
- enabledPlugins: ["hcs-2"]
139
- });
140
- }
141
- /**
142
- * Create a ConversationalAgent with only HCS-10 tools enabled
143
- */
144
- static withHCS10(options) {
145
- return new ConversationalAgent({
146
- ...options,
147
- enabledPlugins: ["hcs-10"]
148
- });
149
- }
150
- /**
151
- * Create a ConversationalAgent with only inscription tools enabled
152
- */
153
- static withInscribe(options) {
154
- return new ConversationalAgent({
155
- ...options,
156
- enabledPlugins: ["inscribe"]
157
- });
158
- }
159
- /**
160
- * Create a ConversationalAgent with only account management tools enabled
161
- */
162
- static withAccount(options) {
163
- return new ConversationalAgent({
164
- ...options,
165
- enabledPlugins: ["account"]
166
- });
167
- }
168
- /**
169
- * Create a ConversationalAgent with only file service tools enabled
170
- */
171
- static withFileService(options) {
172
- return new ConversationalAgent({
173
- ...options,
174
- enabledPlugins: ["file-service"]
175
- });
176
- }
177
- /**
178
- * Create a ConversationalAgent with only consensus service tools enabled
179
- */
180
- static withConsensusService(options) {
181
- return new ConversationalAgent({
182
- ...options,
183
- enabledPlugins: ["consensus-service"]
184
- });
185
- }
186
- /**
187
- * Create a ConversationalAgent with only smart contract tools enabled
188
- */
189
- static withSmartContract(options) {
190
- return new ConversationalAgent({
191
- ...options,
192
- enabledPlugins: ["smart-contract"]
193
- });
40
+ this.tools = [
41
+ new TransferHbarTool({
42
+ hederaKit,
43
+ logger: this.context.logger
44
+ })
45
+ ];
194
46
  }
195
- /**
196
- * Create a ConversationalAgent with all HCS standards plugins
197
- */
198
- static withAllStandards(options) {
199
- return new ConversationalAgent({
200
- ...options,
201
- enabledPlugins: ["hcs-10", "hcs-2", "inscribe"]
202
- });
47
+ getTools() {
48
+ return this.tools;
203
49
  }
204
- /**
205
- * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)
206
- */
207
- static minimal(options) {
208
- return new ConversationalAgent({
209
- ...options,
210
- enabledPlugins: []
211
- });
50
+ async shutdown() {
51
+ this.tools = [];
212
52
  }
213
53
  }
214
54
  export {
215
- ConversationalAgent
55
+ HbarTransferPlugin
216
56
  };
217
57
  //# sourceMappingURL=index5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index5.js","sources":["../../src/conversational-agent.ts"],"sourcesContent":["import {\n ServerSigner,\n HederaConversationalAgent,\n getAllHederaCorePlugins,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport type {\n AgentOperationalMode,\n AgentResponse,\n HederaConversationalAgentConfig,\n MirrorNodeConfig,\n} from 'hedera-agent-kit';\nimport { HCS10Plugin } from './plugins/hcs-10/HCS10Plugin';\nimport { HCS2Plugin } from './plugins/hcs-2/HCS2Plugin';\nimport { InscribePlugin } from './plugins/inscribe/InscribePlugin';\nimport { OpenConvaiState } from '@hashgraphonline/standards-agent-kit';\nimport type { IStateManager } from '@hashgraphonline/standards-agent-kit';\nimport {\n Logger,\n HederaMirrorNode,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\nimport { PrivateKey } from '@hashgraph/sdk';\nimport { getSystemMessage } from './config/system-message';\n\nexport interface ConversationalAgentOptions {\n accountId: string;\n privateKey: string;\n network?: NetworkType;\n openAIApiKey: string;\n openAIModelName?: string;\n verbose?: boolean;\n operationalMode?: AgentOperationalMode;\n userAccountId?: string;\n customSystemMessagePreamble?: string;\n customSystemMessagePostamble?: string;\n additionalPlugins?: BasePlugin[];\n stateManager?: IStateManager;\n scheduleUserTransactionsInBytesMode?: boolean;\n mirrorNodeConfig?: MirrorNodeConfig;\n disableLogging?: boolean;\n enabledPlugins?: string[];\n}\n\n/**\n * The ConversationalAgent class is an optional wrapper around the HederaConversationalAgent class,\n * which includes the OpenConvAIPlugin and the OpenConvaiState by default.\n * If you want to use a different plugin or state manager, you can pass them in the options.\n * This class is not required and the plugin can be used directly with the HederaConversationalAgent class.\n *\n * @param options - The options for the ConversationalAgent.\n * @returns A new instance of the ConversationalAgent class.\n */\nexport class ConversationalAgent {\n public conversationalAgent?: HederaConversationalAgent;\n public hcs10Plugin: HCS10Plugin;\n public hcs2Plugin: HCS2Plugin;\n public inscribePlugin: InscribePlugin;\n public stateManager: IStateManager;\n private options: ConversationalAgentOptions;\n private logger: Logger;\n\n constructor(options: ConversationalAgentOptions) {\n this.options = options;\n this.stateManager = options.stateManager || new OpenConvaiState();\n this.hcs10Plugin = new HCS10Plugin();\n this.hcs2Plugin = new HCS2Plugin();\n this.inscribePlugin = new InscribePlugin();\n this.logger = new Logger({ module: 'ConversationalAgent' });\n }\n\n async initialize(): Promise<void> {\n const {\n accountId,\n privateKey,\n network = 'testnet',\n openAIApiKey,\n openAIModelName = 'gpt-4o',\n verbose = false,\n operationalMode = 'autonomous',\n userAccountId,\n customSystemMessagePreamble,\n customSystemMessagePostamble,\n additionalPlugins = [],\n scheduleUserTransactionsInBytesMode,\n mirrorNodeConfig,\n disableLogging,\n } = this.options;\n\n if (!accountId || !privateKey) {\n throw new Error('Account ID and private key are required');\n }\n\n try {\n const mirrorNode = new HederaMirrorNode(network, this.logger);\n const accountInfo = await mirrorNode.requestAccount(accountId);\n const keyType = accountInfo?.key?._type || '';\n\n let privateKeyInstance: PrivateKey;\n if (keyType?.toLowerCase()?.includes('ecdsa')) {\n privateKeyInstance = PrivateKey.fromStringECDSA(privateKey);\n } else {\n privateKeyInstance = PrivateKey.fromStringED25519(privateKey);\n }\n\n const serverSigner = new ServerSigner(\n accountId,\n privateKeyInstance,\n network\n );\n\n const standardPlugins = [\n this.hcs10Plugin,\n this.hcs2Plugin,\n this.inscribePlugin,\n ];\n\n const corePlugins = getAllHederaCorePlugins();\n\n let allPlugins: BasePlugin[];\n\n if (this.options.enabledPlugins) {\n const enabledSet = new Set(this.options.enabledPlugins);\n const filteredPlugins = [...standardPlugins, ...corePlugins].filter(\n (plugin) => enabledSet.has(plugin.id)\n );\n allPlugins = [...filteredPlugins, ...additionalPlugins];\n } else {\n allPlugins = [...standardPlugins, ...corePlugins, ...additionalPlugins];\n }\n\n const agentConfig: HederaConversationalAgentConfig = {\n pluginConfig: {\n plugins: allPlugins,\n appConfig: {\n stateManager: this.stateManager,\n },\n },\n openAIApiKey,\n openAIModelName,\n verbose,\n operationalMode,\n userAccountId,\n customSystemMessagePreamble:\n customSystemMessagePreamble || getSystemMessage(accountId),\n ...(customSystemMessagePostamble !== undefined && {\n customSystemMessagePostamble,\n }),\n ...(scheduleUserTransactionsInBytesMode !== undefined && {\n scheduleUserTransactionsInBytesMode,\n }),\n ...(mirrorNodeConfig !== undefined && { mirrorNodeConfig }),\n ...(disableLogging !== undefined && { disableLogging }),\n };\n\n this.conversationalAgent = new HederaConversationalAgent(\n serverSigner,\n agentConfig\n );\n\n await this.conversationalAgent.initialize();\n } catch (error) {\n this.logger.error('Failed to initialize ConversationalAgent:', error);\n throw error;\n }\n }\n\n getPlugin(): HCS10Plugin {\n return this.hcs10Plugin;\n }\n\n getStateManager(): IStateManager {\n return this.stateManager;\n }\n\n getConversationalAgent(): HederaConversationalAgent {\n if (!this.conversationalAgent) {\n throw new Error(\n 'ConversationalAgent not initialized. Call initialize() first.'\n );\n }\n return this.conversationalAgent;\n }\n\n async processMessage(\n message: string,\n chatHistory: {\n type: 'human' | 'ai';\n content: string;\n }[] = []\n ): Promise<AgentResponse> {\n if (!this.conversationalAgent) {\n throw new Error(\n 'ConversationalAgent not initialized. Call initialize() first.'\n );\n }\n return this.conversationalAgent.processMessage(message, chatHistory);\n }\n\n /**\n * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled\n */\n static withHTS(options: ConversationalAgentOptions): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['hts-token'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only HCS-2 tools enabled\n */\n static withHCS2(options: ConversationalAgentOptions): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['hcs-2'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only HCS-10 tools enabled\n */\n static withHCS10(options: ConversationalAgentOptions): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['hcs-10'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only inscription tools enabled\n */\n static withInscribe(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['inscribe'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only account management tools enabled\n */\n static withAccount(options: ConversationalAgentOptions): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['account'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only file service tools enabled\n */\n static withFileService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['file-service'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only consensus service tools enabled\n */\n static withConsensusService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['consensus-service'],\n });\n }\n\n /**\n * Create a ConversationalAgent with only smart contract tools enabled\n */\n static withSmartContract(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['smart-contract'],\n });\n }\n\n /**\n * Create a ConversationalAgent with all HCS standards plugins\n */\n static withAllStandards(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: ['hcs-10', 'hcs-2', 'inscribe'],\n });\n }\n\n /**\n * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)\n */\n static minimal(options: ConversationalAgentOptions): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: [],\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index5.js","sources":["../../src/plugins/hbar-transfer/HbarTransferPlugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport { TransferHbarTool } from './TransferHbarTool';\n\nexport class HbarTransferPlugin extends BasePlugin {\n id = 'hbar-transfer';\n name = 'HBAR Transfer Plugin';\n description =\n 'HBAR transfer tool with proper decimal handling for multi-signature transactions';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'account';\n\n private tools: HederaTool[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HBAR transfer tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HBAR Transfer Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HBAR Transfer plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n this.tools = [\n new TransferHbarTool({\n hederaKit: hederaKit,\n logger: this.context.logger,\n }),\n ];\n }\n\n override getTools(): HederaTool[] {\n return this.tools;\n }\n\n async shutdown(): Promise<void> {\n this.tools = [];\n }\n}"],"names":[],"mappings":";;AAQO,MAAM,2BAA2B,WAAW;AAAA,EAA5C,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAEZ,SAAQ,QAAsB,CAAA;AAAA,EAAC;AAAA,EAE/B,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,gBAAA;AAEL,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,SAAK,QAAQ;AAAA,MACX,IAAI,iBAAiB;AAAA,QACnB;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,IAAA;AAAA,EAEL;AAAA,EAES,WAAyB;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAA0B;AAC9B,SAAK,QAAQ,CAAA;AAAA,EACf;AACF;"}