@hashgraphonline/conversational-agent 0.2.104 → 0.2.105

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 (179) hide show
  1. package/README.md +64 -27
  2. package/cli/dist/CLIApp.d.ts +3 -1
  3. package/cli/dist/CLIApp.d.ts.map +1 -0
  4. package/cli/dist/CLIApp.js +6 -5
  5. package/cli/dist/CLIApp.js.map +1 -0
  6. package/cli/dist/app.d.ts +3 -1
  7. package/cli/dist/app.d.ts.map +1 -0
  8. package/cli/dist/app.js +2 -1
  9. package/cli/dist/app.js.map +1 -0
  10. package/cli/dist/cli.d.ts +1 -0
  11. package/cli/dist/cli.d.ts.map +1 -0
  12. package/cli/dist/cli.js +39 -3
  13. package/cli/dist/cli.js.map +1 -0
  14. package/cli/dist/components/ChatScreen.d.ts +9 -3
  15. package/cli/dist/components/ChatScreen.d.ts.map +1 -0
  16. package/cli/dist/components/ChatScreen.js +4 -3
  17. package/cli/dist/components/ChatScreen.js.map +1 -0
  18. package/cli/dist/components/LoadingScreen.d.ts +1 -0
  19. package/cli/dist/components/LoadingScreen.d.ts.map +1 -0
  20. package/cli/dist/components/LoadingScreen.js +2 -1
  21. package/cli/dist/components/LoadingScreen.js.map +1 -0
  22. package/cli/dist/components/MCPConfigScreen.d.ts +2 -2
  23. package/cli/dist/components/MCPConfigScreen.d.ts.map +1 -0
  24. package/cli/dist/components/MCPConfigScreen.js +77 -59
  25. package/cli/dist/components/MCPConfigScreen.js.map +1 -0
  26. package/cli/dist/components/ScreenRouter.d.ts +1 -0
  27. package/cli/dist/components/ScreenRouter.d.ts.map +1 -0
  28. package/cli/dist/components/ScreenRouter.js +6 -5
  29. package/cli/dist/components/ScreenRouter.js.map +1 -0
  30. package/cli/dist/components/SetupScreen.d.ts +1 -0
  31. package/cli/dist/components/SetupScreen.d.ts.map +1 -0
  32. package/cli/dist/components/SetupScreen.js +28 -26
  33. package/cli/dist/components/SetupScreen.js.map +1 -0
  34. package/cli/dist/components/StatusBadge.d.ts +4 -1
  35. package/cli/dist/components/StatusBadge.d.ts.map +1 -0
  36. package/cli/dist/components/StatusBadge.js +18 -22
  37. package/cli/dist/components/StatusBadge.js.map +1 -0
  38. package/cli/dist/components/TerminalWindow.d.ts +1 -0
  39. package/cli/dist/components/TerminalWindow.d.ts.map +1 -0
  40. package/cli/dist/components/TerminalWindow.js +2 -7
  41. package/cli/dist/components/TerminalWindow.js.map +1 -0
  42. package/cli/dist/components/WelcomeScreen.d.ts +1 -0
  43. package/cli/dist/components/WelcomeScreen.d.ts.map +1 -0
  44. package/cli/dist/components/WelcomeScreen.js +15 -15
  45. package/cli/dist/components/WelcomeScreen.js.map +1 -0
  46. package/cli/dist/headless-runner.d.ts +17 -0
  47. package/cli/dist/headless-runner.d.ts.map +1 -0
  48. package/cli/dist/headless-runner.js +128 -0
  49. package/cli/dist/headless-runner.js.map +1 -0
  50. package/cli/dist/hooks/useInitializeAgent.d.ts +4 -4
  51. package/cli/dist/hooks/useInitializeAgent.d.ts.map +1 -0
  52. package/cli/dist/hooks/useInitializeAgent.js +1 -0
  53. package/cli/dist/hooks/useInitializeAgent.js.map +1 -0
  54. package/cli/dist/hooks/useStableState.d.ts +2 -2
  55. package/cli/dist/hooks/useStableState.d.ts.map +1 -0
  56. package/cli/dist/hooks/useStableState.js +1 -0
  57. package/cli/dist/hooks/useStableState.js.map +1 -0
  58. package/cli/dist/managers/AgentManager.d.ts +3 -2
  59. package/cli/dist/managers/AgentManager.d.ts.map +1 -0
  60. package/cli/dist/managers/AgentManager.js +8 -6
  61. package/cli/dist/managers/AgentManager.js.map +1 -0
  62. package/cli/dist/managers/ConfigManager.d.ts +3 -2
  63. package/cli/dist/managers/ConfigManager.d.ts.map +1 -0
  64. package/cli/dist/managers/ConfigManager.js +23 -8
  65. package/cli/dist/managers/ConfigManager.js.map +1 -0
  66. package/cli/dist/types.d.ts +22 -1
  67. package/cli/dist/types.d.ts.map +1 -0
  68. package/cli/dist/types.js +15 -0
  69. package/cli/dist/types.js.map +1 -0
  70. package/dist/cjs/config/system-message.d.ts +1 -1
  71. package/dist/cjs/conversational-agent.d.ts +30 -2
  72. package/dist/cjs/core/tool-registry.d.ts +29 -0
  73. package/dist/cjs/forms/field-guidance-registry.d.ts +33 -0
  74. package/dist/cjs/index.cjs +1 -1
  75. package/dist/cjs/index.cjs.map +1 -1
  76. package/dist/cjs/index.d.ts +1 -0
  77. package/dist/cjs/mcp/types.d.ts +14 -3
  78. package/dist/cjs/plugins/index.d.ts +1 -0
  79. package/dist/cjs/plugins/inscribe/InscribePlugin.d.ts +1 -0
  80. package/dist/cjs/plugins/web-browser/WebBrowserPlugin.d.ts +14 -0
  81. package/dist/cjs/runtime/wallet-bridge.d.ts +26 -0
  82. package/dist/cjs/services/attachment-processor.d.ts +1 -2
  83. package/dist/cjs/services/content-store-manager.d.ts +1 -1
  84. package/dist/cjs/services/formatters/types.d.ts +3 -1
  85. package/dist/cjs/services/index.d.ts +1 -1
  86. package/dist/cjs/signers/browser-signer.d.ts +32 -0
  87. package/dist/esm/index.js +3 -0
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/index10.js +13 -5
  90. package/dist/esm/index10.js.map +1 -1
  91. package/dist/esm/index13.js +157 -179
  92. package/dist/esm/index13.js.map +1 -1
  93. package/dist/esm/index15.js +9 -4
  94. package/dist/esm/index15.js.map +1 -1
  95. package/dist/esm/index18.js.map +1 -1
  96. package/dist/esm/index2.js +25 -27
  97. package/dist/esm/index2.js.map +1 -1
  98. package/dist/esm/index21.js +1 -1
  99. package/dist/esm/index21.js.map +1 -1
  100. package/dist/esm/index23.js +3 -3
  101. package/dist/esm/index24.js.map +1 -1
  102. package/dist/esm/index26.js.map +1 -1
  103. package/dist/esm/index3.js.map +1 -1
  104. package/dist/esm/index30.js.map +1 -1
  105. package/dist/esm/index31.js +6 -3
  106. package/dist/esm/index31.js.map +1 -1
  107. package/dist/esm/index33.js +5 -5
  108. package/dist/esm/index33.js.map +1 -1
  109. package/dist/esm/index36.js +8 -45
  110. package/dist/esm/index36.js.map +1 -1
  111. package/dist/esm/index37.js +41 -102
  112. package/dist/esm/index37.js.map +1 -1
  113. package/dist/esm/index38.js +107 -21
  114. package/dist/esm/index38.js.map +1 -1
  115. package/dist/esm/index39.js +63 -24
  116. package/dist/esm/index39.js.map +1 -1
  117. package/dist/esm/index4.js +43 -0
  118. package/dist/esm/index4.js.map +1 -1
  119. package/dist/esm/index40.js +78 -11
  120. package/dist/esm/index40.js.map +1 -1
  121. package/dist/esm/index41.js +21 -5
  122. package/dist/esm/index41.js.map +1 -1
  123. package/dist/esm/index42.js +5 -255
  124. package/dist/esm/index42.js.map +1 -1
  125. package/dist/esm/index43.js +12 -184
  126. package/dist/esm/index43.js.map +1 -1
  127. package/dist/esm/index44.js +322 -7
  128. package/dist/esm/index44.js.map +1 -1
  129. package/dist/esm/index45.js +174 -82
  130. package/dist/esm/index45.js.map +1 -1
  131. package/dist/esm/index46.js +30 -0
  132. package/dist/esm/index46.js.map +1 -0
  133. package/dist/esm/index47.js +10 -0
  134. package/dist/esm/index47.js.map +1 -0
  135. package/dist/esm/index48.js +98 -0
  136. package/dist/esm/index48.js.map +1 -0
  137. package/dist/esm/index5.js +2 -2
  138. package/dist/esm/index6.js +189 -29
  139. package/dist/esm/index6.js.map +1 -1
  140. package/dist/types/config/system-message.d.ts +1 -1
  141. package/dist/types/conversational-agent.d.ts +30 -2
  142. package/dist/types/core/tool-registry.d.ts +29 -0
  143. package/dist/types/forms/field-guidance-registry.d.ts +33 -0
  144. package/dist/types/index.d.ts +1 -0
  145. package/dist/types/mcp/types.d.ts +14 -3
  146. package/dist/types/plugins/index.d.ts +1 -0
  147. package/dist/types/plugins/inscribe/InscribePlugin.d.ts +1 -0
  148. package/dist/types/plugins/web-browser/WebBrowserPlugin.d.ts +14 -0
  149. package/dist/types/runtime/wallet-bridge.d.ts +26 -0
  150. package/dist/types/services/attachment-processor.d.ts +1 -2
  151. package/dist/types/services/content-store-manager.d.ts +1 -1
  152. package/dist/types/services/formatters/types.d.ts +3 -1
  153. package/dist/types/services/index.d.ts +1 -1
  154. package/dist/types/signers/browser-signer.d.ts +32 -0
  155. package/package.json +16 -11
  156. package/src/config/system-message.ts +3 -3
  157. package/src/conversational-agent.ts +318 -45
  158. package/src/core/tool-registry.ts +85 -0
  159. package/src/forms/field-guidance-registry.ts +213 -188
  160. package/src/forms/form-generator.ts +28 -12
  161. package/src/index.ts +1 -0
  162. package/src/langchain/form-aware-agent-executor.ts +6 -6
  163. package/src/langchain/langchain-agent.ts +1 -1
  164. package/src/mcp/mcp-client-manager.ts +12 -5
  165. package/src/mcp/types.ts +15 -3
  166. package/src/memory/content-storage.ts +19 -6
  167. package/src/memory/smart-memory-manager.ts +0 -1
  168. package/src/plugins/hbar/AccountBuilder.ts +16 -16
  169. package/src/plugins/hcs-10/HCS10Plugin.ts +38 -38
  170. package/src/plugins/hcs-2/HCS2Plugin.ts +2 -2
  171. package/src/plugins/index.ts +2 -1
  172. package/src/plugins/inscribe/InscribePlugin.ts +46 -2
  173. package/src/plugins/web-browser/WebBrowserPlugin.ts +128 -0
  174. package/src/runtime/wallet-bridge.ts +46 -0
  175. package/src/services/attachment-processor.ts +1 -1
  176. package/src/services/content-store-manager.ts +1 -1
  177. package/src/services/formatters/types.ts +3 -1
  178. package/src/services/index.ts +1 -1
  179. package/src/signers/browser-signer.ts +111 -0
@@ -1,6 +1,7 @@
1
1
  import { ServerSigner, getAllHederaCorePlugins } from "hedera-agent-kit";
2
2
  import { Logger } from "@hashgraphonline/standards-sdk";
3
3
  import { createAgent } from "./index8.js";
4
+ import { BrowserSigner } from "./index39.js";
4
5
  import { LangChainProvider } from "./index9.js";
5
6
  import { ChatOpenAI } from "@langchain/openai";
6
7
  import { ChatAnthropic } from "@langchain/anthropic";
@@ -8,9 +9,11 @@ import { SystemMessage, HumanMessage, AIMessage } from "@langchain/core/messages
8
9
  import { HCS10Plugin } from "./index2.js";
9
10
  import { HCS2Plugin } from "./index3.js";
10
11
  import { InscribePlugin } from "./index4.js";
12
+ import { getWalletBridgeProvider } from "./index36.js";
13
+ import { OpenConvaiState, InscriberBuilder, SignerProviderRegistry } from "@hashgraphonline/standards-agent-kit";
11
14
  import { HbarPlugin } from "./index5.js";
12
- import { OpenConvaiState } from "@hashgraphonline/standards-agent-kit";
13
- import { getSystemMessage } from "./index38.js";
15
+ import { WebBrowserPlugin } from "./index40.js";
16
+ import { getSystemMessage } from "./index41.js";
14
17
  import { ContentStoreManager } from "./index24.js";
15
18
  import { SmartMemoryManager } from "./index18.js";
16
19
  import "./index19.js";
@@ -23,6 +26,9 @@ import { FormatConverterRegistry } from "./index25.js";
23
26
  import { TopicIdToHrlConverter } from "./index27.js";
24
27
  import { StringNormalizationConverter } from "./index28.js";
25
28
  const DEFAULT_MODEL_NAME = "gpt-4o";
29
+ const DEFAULT_OPENAI_MODEL = "gpt-4o-mini";
30
+ const DEFAULT_OPENROUTER_MODEL = "openai/gpt-4o-mini";
31
+ const DEFAULT_CLAUDE_MODEL = "claude-3-7-sonnet-latest";
26
32
  const DEFAULT_TEMPERATURE = 0.1;
27
33
  const DEFAULT_NETWORK = "testnet";
28
34
  const DEFAULT_OPERATIONAL_MODE = "autonomous";
@@ -34,6 +40,7 @@ const _ConversationalAgent = class _ConversationalAgent {
34
40
  this.hcs2Plugin = new HCS2Plugin();
35
41
  this.inscribePlugin = new InscribePlugin();
36
42
  this.hbarPlugin = new HbarPlugin();
43
+ this.webBrowserPlugin = new WebBrowserPlugin();
37
44
  this.logger = new Logger({
38
45
  module: "ConversationalAgent",
39
46
  silent: options.disableLogging || false
@@ -49,7 +56,16 @@ const _ConversationalAgent = class _ConversationalAgent {
49
56
  );
50
57
  this.logger.info("Entity memory initialized");
51
58
  const provider = options.entityMemoryProvider || options.llmProvider || "openai";
52
- const modelName = options.entityMemoryModelName || (provider === "anthropic" ? "claude-3-7-sonnet-latest" : provider === "openrouter" ? "openai/gpt-4o-mini" : "gpt-4o-mini");
59
+ let modelName = options.entityMemoryModelName;
60
+ if (!modelName) {
61
+ if (provider === "anthropic") {
62
+ modelName = DEFAULT_CLAUDE_MODEL;
63
+ } else if (provider === "openrouter") {
64
+ modelName = DEFAULT_OPENROUTER_MODEL;
65
+ } else {
66
+ modelName = DEFAULT_OPENAI_MODEL;
67
+ }
68
+ }
53
69
  let resolverLLM;
54
70
  if (provider === "anthropic") {
55
71
  resolverLLM = new ChatAnthropic({
@@ -99,22 +115,125 @@ const _ConversationalAgent = class _ConversationalAgent {
99
115
  } = this.options;
100
116
  this.validateOptions(accountId, privateKey);
101
117
  try {
102
- const serverSigner = new ServerSigner(
103
- accountId,
104
- privateKey,
105
- network
106
- );
118
+ const opMode = this.options.operationalMode || DEFAULT_OPERATIONAL_MODE;
119
+ const bytesMode = opMode !== "autonomous";
120
+ let signer;
121
+ try {
122
+ const IB = InscriberBuilder;
123
+ if (typeof IB.setPreferWalletOnly === "function") {
124
+ IB.setPreferWalletOnly(false);
125
+ }
126
+ } catch (e) {
127
+ this.logger.warn("Failed to set wallet-only preference", e);
128
+ }
129
+ if (!bytesMode) {
130
+ signer = new ServerSigner(
131
+ accountId,
132
+ privateKey,
133
+ network
134
+ );
135
+ } else {
136
+ const chain = String(network || "testnet") === "mainnet" ? "mainnet" : "testnet";
137
+ const effectiveAccount = this.options.userAccountId || accountId;
138
+ signer = new BrowserSigner(
139
+ effectiveAccount,
140
+ chain,
141
+ this.options.walletExecutor
142
+ );
143
+ }
144
+ this.logger.info("Signer configured", {
145
+ operationalMode: opMode,
146
+ bytesMode,
147
+ signerClass: Object.getPrototypeOf(signer)?.constructor?.name || "unknown"
148
+ });
149
+ try {
150
+ const bridge = getWalletBridgeProvider();
151
+ if (bridge) {
152
+ const IB = InscriberBuilder;
153
+ if (typeof IB.setWalletInfoResolver === "function") {
154
+ IB.setWalletInfoResolver(async () => {
155
+ const status = await bridge.status();
156
+ if (status.connected && status.accountId && status.network) {
157
+ return { accountId: status.accountId, network: status.network };
158
+ }
159
+ return null;
160
+ });
161
+ }
162
+ if (typeof IB.setWalletExecutor === "function") {
163
+ IB.setWalletExecutor(
164
+ async (base64, network2) => {
165
+ return await bridge.executeBytes(base64, network2);
166
+ }
167
+ );
168
+ }
169
+ if (typeof IB.setStartInscriptionDelegate === "function" && bridge.startInscription) {
170
+ IB.setStartInscriptionDelegate(
171
+ async (request, network2) => {
172
+ return await bridge.startInscription(request, network2);
173
+ }
174
+ );
175
+ }
176
+ try {
177
+ const status = await bridge.status();
178
+ const enforceWallet = !!(bytesMode && status.connected);
179
+ SignerProviderRegistry.setWalletInfoResolver(async () => {
180
+ const s = await bridge.status();
181
+ if (s.connected && s.accountId && s.network) {
182
+ return {
183
+ accountId: s.accountId,
184
+ network: s.network
185
+ };
186
+ }
187
+ return null;
188
+ });
189
+ SignerProviderRegistry.setWalletExecutor(
190
+ async (base64, network2) => {
191
+ return await bridge.executeBytes(base64, network2);
192
+ }
193
+ );
194
+ const extended = bridge;
195
+ if (typeof extended?.startHCS === "function") {
196
+ SignerProviderRegistry.setStartHCSDelegate(
197
+ async (op, request, network2) => {
198
+ return await extended.startHCS(
199
+ op,
200
+ request,
201
+ network2
202
+ );
203
+ }
204
+ );
205
+ } else {
206
+ SignerProviderRegistry.setStartHCSDelegate(null);
207
+ }
208
+ SignerProviderRegistry.setPreferWalletOnly(enforceWallet);
209
+ const IB2 = InscriberBuilder;
210
+ if (typeof IB2.setPreferWalletOnly === "function") {
211
+ IB2.setPreferWalletOnly(enforceWallet);
212
+ }
213
+ } catch (sakWireErr) {
214
+ this.logger.warn(
215
+ "Failed to wire SAK SignerProviderRegistry wallet delegates",
216
+ sakWireErr
217
+ );
218
+ }
219
+ }
220
+ } catch (e) {
221
+ this.logger.warn(
222
+ "Failed to register wallet bridge providers",
223
+ e
224
+ );
225
+ }
107
226
  let llm;
108
227
  let providerInfo = { provider: llmProvider };
109
228
  if (llmProvider === "anthropic") {
110
229
  llm = new ChatAnthropic({
111
230
  apiKey: openAIApiKey,
112
- model: openAIModelName || "claude-3-7-sonnet-latest",
231
+ model: openAIModelName || DEFAULT_CLAUDE_MODEL,
113
232
  temperature: DEFAULT_TEMPERATURE
114
233
  });
115
234
  providerInfo = {
116
235
  ...providerInfo,
117
- model: openAIModelName || "claude-3-7-sonnet-latest",
236
+ model: openAIModelName || DEFAULT_CLAUDE_MODEL,
118
237
  keyPresent: !!openAIApiKey
119
238
  };
120
239
  } else if (llmProvider === "openrouter") {
@@ -140,16 +259,16 @@ const _ConversationalAgent = class _ConversationalAgent {
140
259
  keyPresent: !!apiKey
141
260
  };
142
261
  } else {
143
- const modelName = openAIModelName || "gpt-4o-mini";
144
- const isGPT5Model = modelName.toLowerCase().includes("gpt-5") || modelName.toLowerCase().includes("gpt5");
262
+ const modelName2 = openAIModelName || DEFAULT_OPENAI_MODEL;
263
+ const isGPT5Model = modelName2.toLowerCase().includes("gpt-5") || modelName2.toLowerCase().includes("gpt5");
145
264
  llm = new ChatOpenAI({
146
265
  apiKey: openAIApiKey,
147
- model: modelName,
266
+ model: modelName2,
148
267
  ...isGPT5Model ? { temperature: 1 } : { temperature: DEFAULT_TEMPERATURE }
149
268
  });
150
269
  providerInfo = {
151
270
  ...providerInfo,
152
- model: modelName,
271
+ model: modelName2,
153
272
  keyPresent: !!openAIApiKey
154
273
  };
155
274
  }
@@ -157,7 +276,11 @@ const _ConversationalAgent = class _ConversationalAgent {
157
276
  this.logger.info("Preparing plugins...");
158
277
  const allPlugins = this.preparePlugins();
159
278
  this.logger.info("Creating agent config...");
160
- const agentConfig = this.createAgentConfig(serverSigner, llm, allPlugins);
279
+ const agentConfig = this.createAgentConfig(
280
+ signer,
281
+ llm,
282
+ allPlugins
283
+ );
161
284
  this.logger.info("Creating agent...");
162
285
  this.agent = createAgent(agentConfig);
163
286
  this.logger.info("Agent created");
@@ -321,22 +444,27 @@ const _ConversationalAgent = class _ConversationalAgent {
321
444
  * @throws {Error} If required fields are missing
322
445
  */
323
446
  validateOptions(accountId, privateKey) {
324
- if (!accountId || !privateKey) {
325
- throw new Error("Account ID and private key are required");
447
+ const opMode = this.options.operationalMode || DEFAULT_OPERATIONAL_MODE;
448
+ const bytesMode = opMode !== "autonomous";
449
+ if (!accountId) {
450
+ throw new Error("Account ID is required");
451
+ }
452
+ if (!privateKey && !bytesMode) {
453
+ throw new Error("Private key is required in autonomous mode");
326
454
  }
327
455
  if (typeof accountId !== "string") {
328
456
  throw new Error(
329
457
  `Account ID must be a string, received ${typeof accountId}`
330
458
  );
331
459
  }
332
- if (typeof privateKey !== "string") {
460
+ if (!bytesMode && typeof privateKey !== "string") {
333
461
  throw new Error(
334
462
  `Private key must be a string, received ${typeof privateKey}: ${JSON.stringify(
335
463
  privateKey
336
464
  )}`
337
465
  );
338
466
  }
339
- if (privateKey.length < 10) {
467
+ if (!bytesMode && typeof privateKey === "string" && privateKey.length < 10) {
340
468
  throw new Error("Private key appears to be invalid (too short)");
341
469
  }
342
470
  }
@@ -346,32 +474,36 @@ const _ConversationalAgent = class _ConversationalAgent {
346
474
  * @returns Array of plugins to initialize with the agent
347
475
  */
348
476
  preparePlugins() {
349
- const { additionalPlugins = [], enabledPlugins } = this.options;
477
+ const { additionalPlugins = [], enabledPlugins, disabledPlugins } = this.options;
350
478
  const standardPlugins = [
351
479
  this.hcs10Plugin,
352
480
  this.hcs2Plugin,
353
481
  this.inscribePlugin,
354
482
  this.hbarPlugin
355
483
  ];
484
+ standardPlugins.push(this.webBrowserPlugin);
356
485
  const corePlugins = getAllHederaCorePlugins();
486
+ let pluginPool = [...standardPlugins, ...corePlugins];
357
487
  if (enabledPlugins) {
358
488
  const enabledSet = new Set(enabledPlugins);
359
- const filteredPlugins = [...standardPlugins, ...corePlugins].filter(
360
- (plugin) => enabledSet.has(plugin.id)
361
- );
362
- return [...filteredPlugins, ...additionalPlugins];
489
+ pluginPool = pluginPool.filter((plugin) => enabledSet.has(plugin.id));
363
490
  }
364
- return [...standardPlugins, ...corePlugins, ...additionalPlugins];
491
+ if (disabledPlugins && disabledPlugins.length > 0) {
492
+ const disabledSet = new Set(disabledPlugins);
493
+ pluginPool = pluginPool.filter((plugin) => !disabledSet.has(plugin.id));
494
+ }
495
+ const additional = disabledPlugins && disabledPlugins.length > 0 ? additionalPlugins.filter((plugin) => !disabledPlugins.includes(plugin.id)) : additionalPlugins;
496
+ return [...pluginPool, ...additional];
365
497
  }
366
498
  /**
367
499
  * Creates the agent configuration object.
368
500
  *
369
- * @param serverSigner - The server signer instance
501
+ * @param signer - The signer instance
370
502
  * @param llm - The language model instance
371
503
  * @param allPlugins - Array of plugins to use
372
504
  * @returns Configuration object for creating the agent
373
505
  */
374
- createAgentConfig(serverSigner, llm, allPlugins) {
506
+ createAgentConfig(signer, llm, allPlugins) {
375
507
  const {
376
508
  operationalMode = DEFAULT_OPERATIONAL_MODE,
377
509
  userAccountId,
@@ -385,7 +517,7 @@ const _ConversationalAgent = class _ConversationalAgent {
385
517
  } = this.options;
386
518
  return {
387
519
  framework: "langchain",
388
- signer: serverSigner,
520
+ signer,
389
521
  execution: {
390
522
  mode: operationalMode === "autonomous" ? "direct" : "bytes",
391
523
  operationalMode,
@@ -598,7 +730,7 @@ const _ConversationalAgent = class _ConversationalAgent {
598
730
  }
599
731
  if (typeof response === "string") {
600
732
  const match = response.match(
601
- /transaction[\s\w]*ID[\s:"]*([0-9a-fA-F@\.\-]+)/i
733
+ /transaction[\s\w]*ID[\s:"]*([0-9a-fA-F@._-]+)/i
602
734
  );
603
735
  return match ? match[1] : void 0;
604
736
  }
@@ -668,6 +800,34 @@ const _ConversationalAgent = class _ConversationalAgent {
668
800
  this.logger.error("Error during cleanup:", error);
669
801
  }
670
802
  }
803
+ /**
804
+ * Switch operational mode
805
+ */
806
+ switchMode(mode) {
807
+ if (this.agent?.switchMode) {
808
+ this.agent.switchMode(mode || "autonomous");
809
+ }
810
+ }
811
+ /**
812
+ * Get usage statistics
813
+ */
814
+ getUsageStats() {
815
+ return this.agent?.getUsageStats?.() ?? {};
816
+ }
817
+ /**
818
+ * Clear usage statistics
819
+ */
820
+ clearUsageStats() {
821
+ if (this.agent?.clearUsageStats) {
822
+ this.agent.clearUsageStats();
823
+ }
824
+ }
825
+ /**
826
+ * Shutdown the agent
827
+ */
828
+ shutdown() {
829
+ return this.agent?.shutdown?.() ?? Promise.resolve();
830
+ }
671
831
  extractResponseText(response) {
672
832
  if (typeof response === "string") {
673
833
  return response;
@@ -1 +1 @@
1
- {"version":3,"file":"index6.js","sources":["../../src/conversational-agent.ts"],"sourcesContent":["import {\n ServerSigner,\n getAllHederaCorePlugins,\n BasePlugin,\n} from 'hedera-agent-kit';\nimport { Logger, type NetworkType } from '@hashgraphonline/standards-sdk';\nimport { createAgent } from './agent-factory';\nimport { LangChainProvider } from './providers';\nimport type { ChatResponse, ConversationContext } from './base-agent';\nimport { ChatOpenAI } from '@langchain/openai';\nimport OpenAI from 'openai';\nimport { ChatAnthropic } from '@langchain/anthropic';\nimport {\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { AgentOperationalMode, MirrorNodeConfig } 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 { HbarPlugin } from './plugins/hbar/HbarPlugin';\nimport { OpenConvaiState } from '@hashgraphonline/standards-agent-kit';\nimport type { IStateManager } from '@hashgraphonline/standards-agent-kit';\nimport { getSystemMessage } from './config/system-message';\nimport type { MCPServerConfig, MCPConnectionStatus } from './mcp/types';\nimport { ContentStoreManager } from './services/content-store-manager';\nimport { SmartMemoryManager, type SmartMemoryConfig } from './memory';\nimport {\n createEntityTools,\n ResolveEntitiesTool,\n ExtractEntitiesTool,\n} from './tools/entity-resolver-tool';\nimport type { FormSubmission } from './forms/types';\nimport { ParameterService } from './services/parameter-service';\nimport { FormatConverterRegistry } from './services/formatters/format-converter-registry';\nimport { TopicIdToHrlConverter } from './services/formatters/converters/topic-id-to-hrl-converter';\nimport { StringNormalizationConverter } from './services/formatters/converters/string-normalization-converter';\n\nexport type ToolDescriptor = {\n name: string;\n namespace?: string;\n};\n\nexport type ChatHistoryItem = {\n type: 'human' | 'ai' | 'system';\n content: string;\n};\n\nexport type AgentInstance = ReturnType<typeof createAgent>;\n\nexport type MirrorNetwork = 'testnet' | 'mainnet' | 'previewnet';\n\nconst DEFAULT_MODEL_NAME = 'gpt-4o';\nconst DEFAULT_TEMPERATURE = 0.1;\nconst DEFAULT_NETWORK = 'testnet';\nconst DEFAULT_OPERATIONAL_MODE: AgentOperationalMode = 'autonomous';\n\nexport interface ConversationalAgentOptions {\n accountId: string;\n privateKey: string;\n network?: NetworkType;\n openAIApiKey: string;\n openAIModelName?: string;\n llmProvider?: 'openai' | 'anthropic' | 'openrouter';\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 toolFilter?: (tool: { name: string; namespace?: string }) => boolean;\n mcpServers?: MCPServerConfig[];\n\n /** Enable automatic entity memory functionality (default: true) */\n entityMemoryEnabled?: boolean;\n\n /** Configuration for entity memory system */\n entityMemoryConfig?: SmartMemoryConfig;\n\n /**\n * Provider used for entity extraction/resolution tools (defaults to llmProvider or 'openai')\n */\n entityMemoryProvider?: 'openai' | 'anthropic' | 'openrouter';\n\n /**\n * Model name for entity extraction/resolution tools (defaults per provider)\n */\n entityMemoryModelName?: string;\n\n openRouterApiKey?: string;\n openRouterBaseURL?: 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 private static readonly NOT_INITIALIZED_ERROR =\n 'Agent not initialized. Call initialize() first.';\n protected agent?: AgentInstance;\n public hcs10Plugin: HCS10Plugin;\n public hcs2Plugin: HCS2Plugin;\n public inscribePlugin: InscribePlugin;\n public hbarPlugin: HbarPlugin;\n public stateManager: IStateManager;\n private options: ConversationalAgentOptions;\n public logger: Logger;\n public contentStoreManager?: ContentStoreManager;\n public memoryManager?: SmartMemoryManager | undefined;\n private entityTools?: {\n resolveEntities: ResolveEntitiesTool;\n extractEntities: ExtractEntitiesTool;\n };\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.hbarPlugin = new HbarPlugin();\n this.logger = new Logger({\n module: 'ConversationalAgent',\n silent: options.disableLogging || false,\n });\n\n if (this.options.entityMemoryEnabled !== false) {\n if (!options.openAIApiKey) {\n throw new Error(\n 'OpenAI/Anthropic API key is required when entity memory is enabled'\n );\n }\n\n this.memoryManager = new SmartMemoryManager(\n this.options.entityMemoryConfig\n );\n this.logger.info('Entity memory initialized');\n\n const provider = options.entityMemoryProvider || options.llmProvider || 'openai';\n const modelName =\n options.entityMemoryModelName ||\n (provider === 'anthropic'\n ? 'claude-3-7-sonnet-latest'\n : provider === 'openrouter'\n ? 'openai/gpt-4o-mini'\n : 'gpt-4o-mini');\n\n let resolverLLM: ChatOpenAI | ChatAnthropic;\n if (provider === 'anthropic') {\n resolverLLM = new ChatAnthropic({\n apiKey: options.openAIApiKey,\n model: modelName,\n temperature: 0,\n });\n } else if (provider === 'openrouter') {\n const baseURL = options.openRouterBaseURL || 'https://openrouter.ai/api/v1';\n const apiKey = options.openRouterApiKey || options.openAIApiKey;\n resolverLLM = new ChatOpenAI({\n apiKey,\n model: modelName,\n temperature: 0,\n configuration: {\n baseURL,\n defaultHeaders: {\n 'HTTP-Referer': process.env.OPENROUTER_REFERRER || 'https://hashgraphonline.com',\n 'X-Title': process.env.OPENROUTER_TITLE || 'Hashgraph Online Conversational Agent',\n },\n },\n });\n } else {\n resolverLLM = new ChatOpenAI({\n apiKey: options.openAIApiKey,\n model: modelName,\n temperature: 0,\n });\n }\n\n this.entityTools = createEntityTools(resolverLLM);\n this.logger.info('LLM-based entity resolver tools initialized');\n }\n }\n\n /**\n * Initialize the conversational agent with Hedera Hashgraph connection and AI configuration\n * @throws {Error} If account ID or private key is missing\n * @throws {Error} If initialization fails\n */\n async initialize(): Promise<void> {\n const {\n accountId,\n privateKey,\n network = DEFAULT_NETWORK,\n openAIApiKey,\n openAIModelName = DEFAULT_MODEL_NAME,\n llmProvider = 'openai',\n } = this.options;\n\n this.validateOptions(accountId, privateKey);\n\n try {\n const serverSigner = new ServerSigner(\n accountId!,\n privateKey!,\n network as MirrorNetwork\n );\n\n let llm: ChatOpenAI | ChatAnthropic;\n let providerInfo: Record<string, unknown> = { provider: llmProvider };\n if (llmProvider === 'anthropic') {\n llm = new ChatAnthropic({\n apiKey: openAIApiKey,\n model: openAIModelName || 'claude-3-7-sonnet-latest',\n temperature: DEFAULT_TEMPERATURE,\n });\n providerInfo = {\n ...providerInfo,\n model: openAIModelName || 'claude-3-7-sonnet-latest',\n keyPresent: !!openAIApiKey,\n };\n } else if (llmProvider === 'openrouter') {\n const baseURL = this.options.openRouterBaseURL || 'https://openrouter.ai/api/v1';\n const apiKey = this.options.openRouterApiKey || openAIApiKey;\n const modelName = openAIModelName || 'anthropic/claude-3-haiku-20240307';\n llm = new ChatOpenAI({\n apiKey,\n model: modelName,\n temperature: DEFAULT_TEMPERATURE,\n configuration: {\n baseURL,\n defaultHeaders: {\n 'HTTP-Referer': process.env.OPENROUTER_REFERRER || 'https://hashgraphonline.com',\n 'X-Title': process.env.OPENROUTER_TITLE || 'Hashgraph Online Conversational Agent',\n },\n },\n });\n providerInfo = {\n ...providerInfo,\n model: modelName,\n baseURL,\n keyPresent: !!apiKey,\n };\n } else {\n const modelName = openAIModelName || 'gpt-4o-mini';\n const isGPT5Model =\n modelName.toLowerCase().includes('gpt-5') ||\n modelName.toLowerCase().includes('gpt5');\n llm = new ChatOpenAI({\n apiKey: openAIApiKey,\n model: modelName,\n ...(isGPT5Model\n ? { temperature: 1 }\n : { temperature: DEFAULT_TEMPERATURE }),\n });\n providerInfo = {\n ...providerInfo,\n model: modelName,\n keyPresent: !!openAIApiKey,\n };\n }\n\n this.logger.info('AI provider configured', providerInfo);\n\n this.logger.info('Preparing plugins...');\n const allPlugins = this.preparePlugins();\n this.logger.info('Creating agent config...');\n const agentConfig = this.createAgentConfig(serverSigner, llm, allPlugins);\n\n this.logger.info('Creating agent...');\n this.agent = createAgent(agentConfig);\n this.logger.info('Agent created');\n\n this.logger.info('Configuring HCS10 plugin...');\n this.configureHCS10Plugin(allPlugins);\n this.logger.info('HCS10 plugin configured');\n\n this.contentStoreManager = new ContentStoreManager();\n await this.contentStoreManager.initialize();\n this.logger.info(\n 'ContentStoreManager initialized for content reference support'\n );\n\n this.logger.info('About to call agent.boot()');\n this.logger.info('🔥 About to call agent.boot()');\n await this.agent.boot();\n this.logger.info('agent.boot() completed');\n this.logger.info('🔥 agent.boot() completed');\n\n if (this.agent) {\n try {\n const registry = new FormatConverterRegistry();\n registry.register(new TopicIdToHrlConverter());\n registry.register(new StringNormalizationConverter());\n const paramService = new ParameterService(\n registry,\n (this.options.network as unknown as NetworkType) || 'testnet'\n );\n paramService.attachToAgent(this.agent, {\n getEntities: async () =>\n this.memoryManager?.getEntityAssociations() || [],\n });\n this.logger.info(\n 'Parameter preprocessing callback attached (internal)'\n );\n } catch (e) {\n this.logger.warn(\n 'Failed to attach internal parameter preprocessing callback',\n e\n );\n }\n\n const cfg = agentConfig;\n cfg.filtering = cfg.filtering || {};\n const originalPredicate = cfg.filtering.toolPredicate as\n | ((t: ToolDescriptor) => boolean)\n | undefined;\n const userPredicate = this.options.toolFilter;\n cfg.filtering.toolPredicate = (tool: ToolDescriptor): boolean => {\n if (tool && tool.name === 'hedera-account-transfer-hbar') {\n return false;\n }\n if (tool && tool.name === 'hedera-hts-airdrop-token') {\n return false;\n }\n if (originalPredicate && !originalPredicate(tool)) {\n return false;\n }\n if (userPredicate && !userPredicate(tool)) {\n return false;\n }\n return true;\n };\n }\n\n if (this.options.mcpServers && this.options.mcpServers.length > 0) {\n this.connectMCP();\n }\n } catch (error) {\n this.logger.error('Failed to initialize ConversationalAgent:', error);\n throw error;\n }\n }\n\n /**\n * Get the HCS-10 plugin instance\n * @returns {HCS10Plugin} The HCS-10 plugin instance\n */\n getPlugin(): HCS10Plugin {\n return this.hcs10Plugin;\n }\n\n /**\n * Get the state manager instance\n * @returns {IStateManager} The state manager instance\n */\n getStateManager(): IStateManager {\n return this.stateManager;\n }\n\n /**\n * Get the underlying agent instance\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getAgent(): ReturnType<typeof createAgent> {\n if (!this.agent) {\n throw new Error(ConversationalAgent.NOT_INITIALIZED_ERROR);\n }\n return this.agent;\n }\n\n /**\n * Get the conversational agent instance (alias for getAgent)\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getConversationalAgent(): ReturnType<typeof createAgent> {\n return this.getAgent();\n }\n\n /**\n * Process a message through the conversational agent\n * @param {string} message - The message to process\n * @param {Array<{type: 'human' | 'ai'; content: string}>} chatHistory - Previous chat history\n * @returns {Promise<ChatResponse>} The agent's response\n * @throws {Error} If agent is not initialized\n */\n async processMessage(\n message: string,\n chatHistory: ChatHistoryItem[] = []\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n\n try {\n const resolvedMessage = message;\n\n const messages = chatHistory.map((msg) => {\n const content = msg.content;\n if (msg.type === 'system') {\n return new SystemMessage(content);\n }\n return msg.type === 'human'\n ? new HumanMessage(content)\n : new AIMessage(content);\n });\n\n const context: ConversationContext = { messages };\n const response = await this.agent.chat(resolvedMessage, context);\n\n if (\n this.memoryManager &&\n this.options.operationalMode !== 'returnBytes'\n ) {\n await this.extractAndStoreEntities(response, message);\n }\n\n this.logger.info('Message processed successfully');\n return response;\n } catch (error) {\n this.logger.error('Error processing message:', error);\n throw error;\n }\n }\n\n /**\n * Process form submission through the conversational agent\n * @param {FormSubmission} submission - The form submission data\n * @returns {Promise<ChatResponse>} The agent's response after processing the form\n * @throws {Error} If agent is not initialized or doesn't support form processing\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error(ConversationalAgent.NOT_INITIALIZED_ERROR);\n }\n\n try {\n this.logger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters || {}),\n hasContext: !!submission.context,\n });\n const response = await this.agent.processFormSubmission(submission);\n this.logger.info('Form submission processed successfully');\n return response;\n } catch (error) {\n this.logger.error('Error processing form submission:', error);\n throw error;\n }\n }\n\n /**\n * Validates initialization options and throws if required fields are missing.\n *\n * @param accountId - The Hedera account ID\n * @param privateKey - The private key for the account\n * @throws {Error} If required fields are missing\n */\n private validateOptions(accountId?: string, privateKey?: string): void {\n if (!accountId || !privateKey) {\n throw new Error('Account ID and private key are required');\n }\n\n if (typeof accountId !== 'string') {\n throw new Error(\n `Account ID must be a string, received ${typeof accountId}`\n );\n }\n\n if (typeof privateKey !== 'string') {\n throw new Error(\n `Private key must be a string, received ${typeof privateKey}: ${JSON.stringify(\n privateKey\n )}`\n );\n }\n\n if (privateKey.length < 10) {\n throw new Error('Private key appears to be invalid (too short)');\n }\n }\n\n /**\n * Prepares the list of plugins to use based on configuration.\n *\n * @returns Array of plugins to initialize with the agent\n */\n private preparePlugins(): BasePlugin[] {\n const { additionalPlugins = [], enabledPlugins } = this.options;\n\n const standardPlugins = [\n this.hcs10Plugin,\n this.hcs2Plugin,\n this.inscribePlugin,\n this.hbarPlugin,\n ];\n\n const corePlugins = getAllHederaCorePlugins();\n\n if (enabledPlugins) {\n const enabledSet = new Set(enabledPlugins);\n const filteredPlugins = [...standardPlugins, ...corePlugins].filter(\n (plugin) => enabledSet.has(plugin.id)\n );\n return [...filteredPlugins, ...additionalPlugins];\n }\n\n return [...standardPlugins, ...corePlugins, ...additionalPlugins];\n }\n\n /**\n * Creates the agent configuration object.\n *\n * @param serverSigner - The server signer instance\n * @param llm - The language model instance\n * @param allPlugins - Array of plugins to use\n * @returns Configuration object for creating the agent\n */\n private createAgentConfig(\n serverSigner: ServerSigner,\n llm: ChatOpenAI | ChatAnthropic,\n allPlugins: BasePlugin[]\n ): Parameters<typeof createAgent>[0] {\n const {\n operationalMode = DEFAULT_OPERATIONAL_MODE,\n userAccountId,\n scheduleUserTransactionsInBytesMode,\n customSystemMessagePreamble,\n customSystemMessagePostamble,\n verbose = false,\n mirrorNodeConfig,\n disableLogging,\n accountId = '',\n } = this.options;\n\n return {\n framework: 'langchain',\n signer: serverSigner,\n execution: {\n mode: operationalMode === 'autonomous' ? 'direct' : 'bytes',\n operationalMode: operationalMode,\n ...(userAccountId && { userAccountId }),\n ...(scheduleUserTransactionsInBytesMode !== undefined && {\n scheduleUserTransactionsInBytesMode:\n scheduleUserTransactionsInBytesMode,\n scheduleUserTransactions: scheduleUserTransactionsInBytesMode,\n }),\n },\n ai: {\n provider: new LangChainProvider(llm),\n temperature: DEFAULT_TEMPERATURE,\n },\n filtering: {\n toolPredicate: (tool: ToolDescriptor): boolean => {\n if (tool.name === 'hedera-account-transfer-hbar') return false;\n if (this.options.toolFilter && !this.options.toolFilter(tool)) {\n return false;\n }\n return true;\n },\n },\n messaging: {\n systemPreamble:\n customSystemMessagePreamble || getSystemMessage(accountId),\n ...(customSystemMessagePostamble && {\n systemPostamble: customSystemMessagePostamble,\n }),\n conciseMode: true,\n },\n extensions: {\n plugins: allPlugins,\n ...(mirrorNodeConfig && {\n mirrorConfig: mirrorNodeConfig as Record<string, unknown>,\n }),\n },\n ...(this.options.mcpServers && {\n mcp: {\n servers: this.options.mcpServers,\n autoConnect: false,\n },\n }),\n debug: {\n verbose,\n silent: disableLogging ?? false,\n },\n };\n }\n\n /**\n * Configures the HCS-10 plugin with the state manager.\n *\n * @param allPlugins - Array of all plugins\n */\n private configureHCS10Plugin(allPlugins: BasePlugin[]): void {\n const hcs10 = allPlugins.find((p) => p.id === 'hcs-10');\n if (hcs10) {\n (\n hcs10 as BasePlugin & { appConfig?: Record<string, unknown> }\n ).appConfig = {\n stateManager: this.stateManager,\n };\n }\n }\n\n /**\n * Create a ConversationalAgent with specific plugins enabled\n */\n private static withPlugins(\n options: ConversationalAgentOptions,\n plugins: string[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: plugins,\n });\n }\n\n /**\n * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled\n */\n static withHTS(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hts-token']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-2 tools enabled\n */\n static withHCS2(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-2']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-10 tools enabled\n */\n static withHCS10(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10']);\n }\n\n /**\n * Create a ConversationalAgent with only inscription tools enabled\n */\n static withInscribe(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with only account management tools enabled\n */\n static withAccount(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['account']);\n }\n\n /**\n * Create a ConversationalAgent with only file service tools enabled\n */\n static withFileService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['file-service']);\n }\n\n /**\n * Create a ConversationalAgent with only consensus service tools enabled\n */\n static withConsensusService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['consensus-service']);\n }\n\n /**\n * Create a ConversationalAgent with only smart contract tools enabled\n */\n static withSmartContract(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['smart-contract']);\n }\n\n /**\n * Create a ConversationalAgent with all HCS standards plugins\n */\n static withAllStandards(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10', 'hcs-2', 'inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)\n */\n static minimal(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, []);\n }\n\n /**\n * Create a ConversationalAgent with MCP servers configured\n */\n static withMCP(\n options: ConversationalAgentOptions,\n mcpServers: MCPServerConfig[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n mcpServers,\n });\n }\n\n /**\n * Extract and store entities from agent responses\n * @param response - Agent response containing potential entity information\n * @param originalMessage - Original user message for context\n */\n private async extractAndStoreEntities(\n response: unknown,\n originalMessage: string\n ): Promise<void> {\n if (!this.memoryManager || !this.entityTools) {\n return;\n }\n\n try {\n this.logger.info('Starting LLM-based entity extraction');\n\n const responseText = this.extractResponseText(response);\n\n const entitiesJson = await this.entityTools.extractEntities.call({\n response: responseText,\n userMessage: originalMessage,\n });\n\n try {\n const entities = JSON.parse(entitiesJson);\n\n for (const entity of entities) {\n if (\n entity &&\n typeof entity === 'object' &&\n 'name' in entity &&\n 'type' in entity &&\n 'id' in entity\n ) {\n this.logger.info(\n `Storing entity: ${entity.name} (${entity.type}) -> ${entity.id}`\n );\n\n const transactionId = this.extractTransactionId(response);\n const idStr = String(entity.id);\n const isHederaId = /^0\\.0\\.[0-9]+$/.test(idStr);\n if (!isHederaId) {\n this.logger.warn('Skipping non-ID entity from extraction', {\n id: idStr,\n name: String(entity.name),\n type: String(entity.type),\n });\n } else {\n this.memoryManager.storeEntityAssociation(\n idStr,\n String(entity.name),\n String(entity.type),\n transactionId\n );\n }\n }\n }\n\n if (entities.length > 0) {\n this.logger.info(\n `Stored ${entities.length} entities via LLM extraction`\n );\n } else {\n this.logger.info('No entities found in response via LLM extraction');\n }\n } catch (parseError) {\n this.logger.error(\n 'Failed to parse extracted entities JSON:',\n parseError\n );\n throw parseError;\n }\n } catch (error) {\n this.logger.error('Entity extraction failed:', error);\n throw error;\n }\n }\n\n /**\n * Extract transaction ID from response if available\n * @param response - Transaction response\n * @returns Transaction ID or undefined\n */\n private extractTransactionId(response: unknown): string | undefined {\n try {\n if (\n typeof response === 'object' &&\n response &&\n 'transactionId' in response\n ) {\n const responseWithTxId = response as { transactionId?: unknown };\n return typeof responseWithTxId.transactionId === 'string'\n ? responseWithTxId.transactionId\n : undefined;\n }\n if (typeof response === 'string') {\n const match = response.match(\n /transaction[\\s\\w]*ID[\\s:\"]*([0-9a-fA-F@\\.\\-]+)/i\n );\n return match ? match[1] : undefined;\n }\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Connect to MCP servers asynchronously\n * @private\n */\n private connectMCP(): void {\n if (!this.agent || !this.options.mcpServers) {\n return;\n }\n\n this.agent\n .connectMCPServers()\n .catch((e) => {\n this.logger.error('Failed to connect MCP servers:', e);\n })\n .then(() => {\n this.logger.info('MCP servers connected successfully');\n });\n }\n\n /**\n * Get MCP connection status for all servers\n * @returns {Map<string, MCPConnectionStatus>} Connection status map\n */\n getMCPConnectionStatus(): Map<string, MCPConnectionStatus> {\n if (this.agent) {\n return this.agent.getMCPConnectionStatus();\n }\n return new Map();\n }\n\n /**\n * Check if a specific MCP server is connected\n * @param {string} serverName - Name of the server to check\n * @returns {boolean} True if connected, false otherwise\n */\n isMCPServerConnected(serverName: string): boolean {\n if (this.agent) {\n const statusMap = this.agent.getMCPConnectionStatus();\n const status = statusMap.get(serverName);\n return status?.connected ?? false;\n }\n return false;\n }\n\n /**\n * Clean up resources\n */\n async cleanup(): Promise<void> {\n try {\n this.logger.info('Cleaning up ConversationalAgent...');\n\n if (this.memoryManager) {\n try {\n this.memoryManager.dispose();\n this.logger.info('Memory manager cleaned up successfully');\n } catch (error) {\n this.logger.warn('Error cleaning up memory manager:', error);\n }\n this.memoryManager = undefined;\n }\n\n if (this.contentStoreManager) {\n await this.contentStoreManager.dispose();\n this.logger.info('ContentStoreManager cleaned up');\n }\n\n this.logger.info('ConversationalAgent cleanup completed');\n } catch (error) {\n this.logger.error('Error during cleanup:', error);\n }\n }\n\n private extractResponseText(response: unknown): string {\n if (typeof response === 'string') {\n return response;\n }\n\n if (response && typeof response === 'object' && 'output' in response) {\n const responseWithOutput = response as { output: unknown };\n return String(responseWithOutput.output);\n }\n\n return JSON.stringify(response);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index6.js","sources":["../../src/conversational-agent.ts"],"sourcesContent":["import {\n ServerSigner,\n getAllHederaCorePlugins,\n BasePlugin,\n AbstractSigner,\n} from 'hedera-agent-kit';\nimport { Logger, type NetworkType } from '@hashgraphonline/standards-sdk';\nimport { createAgent } from './agent-factory';\nimport BrowserSigner from './signers/browser-signer';\nimport { LangChainProvider } from './providers';\nimport type { ChatResponse, ConversationContext } from './base-agent';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { ChatAnthropic } from '@langchain/anthropic';\nimport {\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { AgentOperationalMode, MirrorNodeConfig } 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 { getWalletBridgeProvider } from './runtime/wallet-bridge';\nimport {\n InscriberBuilder,\n SignerProviderRegistry,\n} from '@hashgraphonline/standards-agent-kit';\nimport { HbarPlugin } from './plugins/hbar/HbarPlugin';\nimport { WebBrowserPlugin } from './plugins/web-browser/WebBrowserPlugin';\nimport { OpenConvaiState } from '@hashgraphonline/standards-agent-kit';\nimport type { IStateManager } from '@hashgraphonline/standards-agent-kit';\nimport { getSystemMessage } from './config/system-message';\nimport type { MCPServerConfig, MCPConnectionStatus } from './mcp/types';\nimport { ContentStoreManager } from './services/content-store-manager';\nimport { SmartMemoryManager, type SmartMemoryConfig } from './memory';\nimport {\n createEntityTools,\n ResolveEntitiesTool,\n ExtractEntitiesTool,\n} from './tools/entity-resolver-tool';\nimport type { FormSubmission } from './forms/types';\nimport { ParameterService } from './services/parameter-service';\nimport { FormatConverterRegistry } from './services/formatters/format-converter-registry';\nimport { TopicIdToHrlConverter } from './services/formatters/converters/topic-id-to-hrl-converter';\nimport { StringNormalizationConverter } from './services/formatters/converters/string-normalization-converter';\n\nexport type ToolDescriptor = {\n name: string;\n namespace?: string;\n};\n\nexport type ChatHistoryItem = {\n type: 'human' | 'ai' | 'system';\n content: string;\n};\n\nexport type AgentInstance = ReturnType<typeof createAgent>;\n\nexport type MirrorNetwork = 'testnet' | 'mainnet' | 'previewnet';\n\nconst DEFAULT_MODEL_NAME = 'gpt-4o';\nconst DEFAULT_OPENAI_MODEL = 'gpt-4o-mini';\nconst DEFAULT_OPENROUTER_MODEL = 'openai/gpt-4o-mini';\nconst DEFAULT_CLAUDE_MODEL = 'claude-3-7-sonnet-latest';\nconst DEFAULT_TEMPERATURE = 0.1;\nconst DEFAULT_NETWORK = 'testnet';\nconst DEFAULT_OPERATIONAL_MODE: AgentOperationalMode = 'autonomous';\n\nexport interface ConversationalAgentOptions {\n accountId: string;\n privateKey: string;\n network?: NetworkType;\n openAIApiKey: string;\n openAIModelName?: string;\n llmProvider?: 'openai' | 'anthropic' | 'openrouter';\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 disabledPlugins?: string[];\n toolFilter?: (tool: { name: string; namespace?: string }) => boolean;\n mcpServers?: MCPServerConfig[];\n walletExecutor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>;\n /** Optional: provide a signer factory to override default signer selection */\n customSignerFactory?: (args: {\n operationalMode: AgentOperationalMode;\n accountId: string;\n network: NetworkType;\n }) => AbstractSigner;\n\n /** Enable automatic entity memory functionality (default: true) */\n entityMemoryEnabled?: boolean;\n\n /** Configuration for entity memory system */\n entityMemoryConfig?: SmartMemoryConfig;\n\n /**\n * Provider used for entity extraction/resolution tools (defaults to llmProvider or 'openai')\n */\n entityMemoryProvider?: 'openai' | 'anthropic' | 'openrouter';\n\n /**\n * Model name for entity extraction/resolution tools (defaults per provider)\n */\n entityMemoryModelName?: string;\n\n openRouterApiKey?: string;\n openRouterBaseURL?: 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 private static readonly NOT_INITIALIZED_ERROR =\n 'Agent not initialized. Call initialize() first.';\n protected agent?: AgentInstance;\n public hcs10Plugin: HCS10Plugin;\n public hcs2Plugin: HCS2Plugin;\n public inscribePlugin: InscribePlugin;\n public hbarPlugin: HbarPlugin;\n public webBrowserPlugin: WebBrowserPlugin;\n public stateManager: IStateManager;\n private options: ConversationalAgentOptions;\n public logger: Logger;\n public contentStoreManager?: ContentStoreManager;\n public memoryManager?: SmartMemoryManager | undefined;\n private entityTools?: {\n resolveEntities: ResolveEntitiesTool;\n extractEntities: ExtractEntitiesTool;\n };\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.hbarPlugin = new HbarPlugin();\n this.webBrowserPlugin = new WebBrowserPlugin();\n this.logger = new Logger({\n module: 'ConversationalAgent',\n silent: options.disableLogging || false,\n });\n\n if (this.options.entityMemoryEnabled !== false) {\n if (!options.openAIApiKey) {\n throw new Error(\n 'OpenAI/Anthropic API key is required when entity memory is enabled'\n );\n }\n\n this.memoryManager = new SmartMemoryManager(\n this.options.entityMemoryConfig\n );\n this.logger.info('Entity memory initialized');\n\n const provider =\n options.entityMemoryProvider || options.llmProvider || 'openai';\n let modelName = options.entityMemoryModelName;\n if (!modelName) {\n if (provider === 'anthropic') {\n modelName = DEFAULT_CLAUDE_MODEL;\n } else if (provider === 'openrouter') {\n modelName = DEFAULT_OPENROUTER_MODEL;\n } else {\n modelName = DEFAULT_OPENAI_MODEL;\n }\n }\n\n let resolverLLM: ChatOpenAI | ChatAnthropic;\n if (provider === 'anthropic') {\n resolverLLM = new ChatAnthropic({\n apiKey: options.openAIApiKey,\n model: modelName,\n temperature: 0,\n });\n } else if (provider === 'openrouter') {\n const baseURL =\n options.openRouterBaseURL || 'https://openrouter.ai/api/v1';\n const apiKey = options.openRouterApiKey || options.openAIApiKey;\n resolverLLM = new ChatOpenAI({\n apiKey,\n model: modelName,\n temperature: 0,\n configuration: {\n baseURL,\n defaultHeaders: {\n 'HTTP-Referer':\n process.env.OPENROUTER_REFERRER ||\n 'https://hashgraphonline.com',\n 'X-Title':\n process.env.OPENROUTER_TITLE ||\n 'Hashgraph Online Conversational Agent',\n },\n },\n });\n } else {\n resolverLLM = new ChatOpenAI({\n apiKey: options.openAIApiKey,\n model: modelName,\n temperature: 0,\n });\n }\n\n this.entityTools = createEntityTools(resolverLLM);\n this.logger.info('LLM-based entity resolver tools initialized');\n }\n }\n\n /**\n * Initialize the conversational agent with Hedera Hashgraph connection and AI configuration\n * @throws {Error} If account ID or private key is missing\n * @throws {Error} If initialization fails\n */\n async initialize(): Promise<void> {\n const {\n accountId,\n privateKey,\n network = DEFAULT_NETWORK,\n openAIApiKey,\n openAIModelName = DEFAULT_MODEL_NAME,\n llmProvider = 'openai',\n } = this.options;\n\n this.validateOptions(accountId, privateKey);\n\n try {\n const opMode = (this.options.operationalMode ||\n DEFAULT_OPERATIONAL_MODE) as string;\n const bytesMode = opMode !== 'autonomous';\n let signer: AbstractSigner;\n\n try {\n type InscriberBuilderWithWalletMethods = typeof InscriberBuilder & {\n setPreferWalletOnly?: (prefer: boolean) => void;\n setWalletInfoResolver?: (\n fn: () => Promise<{ accountId: string; network: string } | null>\n ) => void;\n setWalletExecutor?: (\n fn: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ) => void;\n setStartInscriptionDelegate?: (\n fn: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<unknown>\n ) => void;\n };\n const IB = InscriberBuilder as InscriberBuilderWithWalletMethods;\n if (typeof IB.setPreferWalletOnly === 'function') {\n IB.setPreferWalletOnly(false);\n }\n } catch (e) {\n this.logger.warn('Failed to set wallet-only preference', e as Error);\n }\n if (!bytesMode) {\n signer = new ServerSigner(\n accountId!,\n privateKey!,\n network as MirrorNetwork\n );\n } else {\n const chain: 'mainnet' | 'testnet' =\n String(network || 'testnet') === 'mainnet' ? 'mainnet' : 'testnet';\n const effectiveAccount = (this.options.userAccountId || accountId)!;\n signer = new BrowserSigner(\n effectiveAccount,\n chain,\n this.options.walletExecutor\n );\n }\n\n this.logger.info('Signer configured', {\n operationalMode: opMode,\n bytesMode,\n signerClass:\n Object.getPrototypeOf(signer)?.constructor?.name || 'unknown',\n });\n\n try {\n const bridge = getWalletBridgeProvider();\n if (bridge) {\n type InscriberBuilderWithWalletMethods = typeof InscriberBuilder & {\n setWalletInfoResolver?: (\n fn: () => Promise<{ accountId: string; network: string } | null>\n ) => void;\n setWalletExecutor?: (\n fn: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ) => void;\n setStartInscriptionDelegate?: (\n fn: (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<unknown>\n ) => void;\n };\n const IB = InscriberBuilder as InscriberBuilderWithWalletMethods;\n if (typeof IB.setWalletInfoResolver === 'function') {\n IB.setWalletInfoResolver(async () => {\n const status = await bridge.status();\n if (status.connected && status.accountId && status.network) {\n return { accountId: status.accountId, network: status.network };\n }\n return null;\n });\n }\n if (typeof IB.setWalletExecutor === 'function') {\n IB.setWalletExecutor(\n async (base64: string, network: 'mainnet' | 'testnet') => {\n return await bridge.executeBytes(base64, network);\n }\n );\n }\n if (\n typeof IB.setStartInscriptionDelegate === 'function' &&\n bridge.startInscription\n ) {\n IB.setStartInscriptionDelegate(\n async (\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => {\n return await bridge.startInscription!(request, network);\n }\n );\n }\n\n try {\n type HCSOp =\n | 'submitConnectionRequest'\n | 'handleConnectionRequest'\n | 'sendMessage'\n | 'hcs2.createRegistry'\n | 'hcs2.migrateRegistry'\n | 'hcs2.registerEntry'\n | 'hcs2.updateEntry'\n | 'hcs2.deleteEntry'\n | 'hcs2.submitMessage'\n | 'hcs6.createRegistry'\n | 'hcs6.registerEntry'\n | 'hcs6.submitMessage';\n type WalletBridgeProviderExt = ReturnType<\n typeof getWalletBridgeProvider\n > & {\n startHCS?: (\n op: HCSOp,\n request: Record<string, unknown>,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionBytes: string }>;\n };\n\n const status = await bridge.status();\n const enforceWallet = !!(bytesMode && status.connected);\n\n SignerProviderRegistry.setWalletInfoResolver(async () => {\n const s = await bridge.status();\n if (s.connected && s.accountId && s.network) {\n return {\n accountId: s.accountId,\n network: s.network as 'mainnet' | 'testnet',\n };\n }\n return null;\n });\n\n SignerProviderRegistry.setWalletExecutor(\n async (base64: string, network: 'mainnet' | 'testnet') => {\n return await bridge.executeBytes(base64, network);\n }\n );\n\n const extended = bridge as WalletBridgeProviderExt;\n if (typeof extended?.startHCS === 'function') {\n SignerProviderRegistry.setStartHCSDelegate(\n async (op, request, network) => {\n return await extended.startHCS!(\n op as HCSOp,\n request,\n network\n );\n }\n );\n } else {\n SignerProviderRegistry.setStartHCSDelegate(null);\n }\n\n SignerProviderRegistry.setPreferWalletOnly(enforceWallet);\n\n type InscriberBuilderWithWalletMethods = typeof InscriberBuilder & {\n setPreferWalletOnly?: (prefer: boolean) => void;\n };\n const IB2 = InscriberBuilder as InscriberBuilderWithWalletMethods;\n if (typeof IB2.setPreferWalletOnly === 'function') {\n IB2.setPreferWalletOnly(enforceWallet);\n }\n } catch (sakWireErr) {\n this.logger.warn(\n 'Failed to wire SAK SignerProviderRegistry wallet delegates',\n sakWireErr as Error\n );\n }\n }\n } catch (e) {\n this.logger.warn(\n 'Failed to register wallet bridge providers',\n e as Error\n );\n }\n\n let llm: ChatOpenAI | ChatAnthropic;\n let providerInfo: Record<string, unknown> = { provider: llmProvider };\n if (llmProvider === 'anthropic') {\n llm = new ChatAnthropic({\n apiKey: openAIApiKey,\n model: openAIModelName || DEFAULT_CLAUDE_MODEL,\n temperature: DEFAULT_TEMPERATURE,\n });\n providerInfo = {\n ...providerInfo,\n model: openAIModelName || DEFAULT_CLAUDE_MODEL,\n keyPresent: !!openAIApiKey,\n };\n } else if (llmProvider === 'openrouter') {\n const baseURL =\n this.options.openRouterBaseURL || 'https://openrouter.ai/api/v1';\n const apiKey = this.options.openRouterApiKey || openAIApiKey;\n const modelName =\n openAIModelName || 'anthropic/claude-3-haiku-20240307';\n llm = new ChatOpenAI({\n apiKey,\n model: modelName,\n temperature: DEFAULT_TEMPERATURE,\n configuration: {\n baseURL,\n defaultHeaders: {\n 'HTTP-Referer':\n process.env.OPENROUTER_REFERRER ||\n 'https://hashgraphonline.com',\n 'X-Title':\n process.env.OPENROUTER_TITLE ||\n 'Hashgraph Online Conversational Agent',\n },\n },\n });\n providerInfo = {\n ...providerInfo,\n model: modelName,\n baseURL,\n keyPresent: !!apiKey,\n };\n } else {\n const modelName2 = openAIModelName || DEFAULT_OPENAI_MODEL;\n const isGPT5Model =\n modelName2.toLowerCase().includes('gpt-5') ||\n modelName2.toLowerCase().includes('gpt5');\n llm = new ChatOpenAI({\n apiKey: openAIApiKey,\n model: modelName2,\n ...(isGPT5Model\n ? { temperature: 1 }\n : { temperature: DEFAULT_TEMPERATURE }),\n });\n providerInfo = {\n ...providerInfo,\n model: modelName2,\n keyPresent: !!openAIApiKey,\n };\n }\n\n this.logger.info('AI provider configured', providerInfo);\n\n this.logger.info('Preparing plugins...');\n const allPlugins = this.preparePlugins();\n this.logger.info('Creating agent config...');\n const agentConfig = this.createAgentConfig(\n signer as ServerSigner,\n llm,\n allPlugins\n );\n\n this.logger.info('Creating agent...');\n this.agent = createAgent(agentConfig);\n this.logger.info('Agent created');\n\n this.logger.info('Configuring HCS10 plugin...');\n this.configureHCS10Plugin(allPlugins);\n this.logger.info('HCS10 plugin configured');\n\n this.contentStoreManager = new ContentStoreManager();\n await this.contentStoreManager.initialize();\n this.logger.info(\n 'ContentStoreManager initialized for content reference support'\n );\n\n this.logger.info('About to call agent.boot()');\n this.logger.info('🔥 About to call agent.boot()');\n await this.agent.boot();\n this.logger.info('agent.boot() completed');\n this.logger.info('🔥 agent.boot() completed');\n\n if (this.agent) {\n try {\n const registry = new FormatConverterRegistry();\n registry.register(new TopicIdToHrlConverter());\n registry.register(new StringNormalizationConverter());\n const paramService = new ParameterService(\n registry,\n (this.options.network as unknown as NetworkType) || 'testnet'\n );\n paramService.attachToAgent(this.agent, {\n getEntities: async () =>\n this.memoryManager?.getEntityAssociations() || [],\n });\n this.logger.info(\n 'Parameter preprocessing callback attached (internal)'\n );\n } catch (e) {\n this.logger.warn(\n 'Failed to attach internal parameter preprocessing callback',\n e\n );\n }\n\n const cfg = agentConfig;\n cfg.filtering = cfg.filtering || {};\n const originalPredicate = cfg.filtering.toolPredicate as\n | ((t: ToolDescriptor) => boolean)\n | undefined;\n const userPredicate = this.options.toolFilter;\n cfg.filtering.toolPredicate = (tool: ToolDescriptor): boolean => {\n if (tool && tool.name === 'hedera-account-transfer-hbar') {\n return false;\n }\n if (tool && tool.name === 'hedera-hts-airdrop-token') {\n return false;\n }\n if (originalPredicate && !originalPredicate(tool)) {\n return false;\n }\n if (userPredicate && !userPredicate(tool)) {\n return false;\n }\n return true;\n };\n }\n\n if (this.options.mcpServers && this.options.mcpServers.length > 0) {\n this.connectMCP();\n }\n } catch (error) {\n this.logger.error('Failed to initialize ConversationalAgent:', error);\n throw error;\n }\n }\n\n /**\n * Get the HCS-10 plugin instance\n * @returns {HCS10Plugin} The HCS-10 plugin instance\n */\n getPlugin(): HCS10Plugin {\n return this.hcs10Plugin;\n }\n\n /**\n * Get the state manager instance\n * @returns {IStateManager} The state manager instance\n */\n getStateManager(): IStateManager {\n return this.stateManager;\n }\n\n /**\n * Get the underlying agent instance\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getAgent(): ReturnType<typeof createAgent> {\n if (!this.agent) {\n throw new Error(ConversationalAgent.NOT_INITIALIZED_ERROR);\n }\n return this.agent;\n }\n\n /**\n * Get the conversational agent instance (alias for getAgent)\n * @returns {ReturnType<typeof createAgent>} The agent instance\n * @throws {Error} If agent is not initialized\n */\n getConversationalAgent(): ReturnType<typeof createAgent> {\n return this.getAgent();\n }\n\n /**\n * Process a message through the conversational agent\n * @param {string} message - The message to process\n * @param {Array<{type: 'human' | 'ai'; content: string}>} chatHistory - Previous chat history\n * @returns {Promise<ChatResponse>} The agent's response\n * @throws {Error} If agent is not initialized\n */\n async processMessage(\n message: string,\n chatHistory: ChatHistoryItem[] = []\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error('Agent not initialized. Call initialize() first.');\n }\n\n try {\n const resolvedMessage = message;\n\n const messages = chatHistory.map((msg) => {\n const content = msg.content;\n if (msg.type === 'system') {\n return new SystemMessage(content);\n }\n return msg.type === 'human'\n ? new HumanMessage(content)\n : new AIMessage(content);\n });\n\n const context: ConversationContext = { messages };\n const response = await this.agent.chat(resolvedMessage, context);\n\n if (\n this.memoryManager &&\n this.options.operationalMode !== 'returnBytes'\n ) {\n await this.extractAndStoreEntities(response, message);\n }\n\n this.logger.info('Message processed successfully');\n return response;\n } catch (error) {\n this.logger.error('Error processing message:', error);\n throw error;\n }\n }\n\n /**\n * Process form submission through the conversational agent\n * @param {FormSubmission} submission - The form submission data\n * @returns {Promise<ChatResponse>} The agent's response after processing the form\n * @throws {Error} If agent is not initialized or doesn't support form processing\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<ChatResponse> {\n if (!this.agent) {\n throw new Error(ConversationalAgent.NOT_INITIALIZED_ERROR);\n }\n\n try {\n this.logger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters || {}),\n hasContext: !!submission.context,\n });\n const response = await this.agent.processFormSubmission(submission);\n this.logger.info('Form submission processed successfully');\n return response;\n } catch (error) {\n this.logger.error('Error processing form submission:', error);\n throw error;\n }\n }\n\n /**\n * Validates initialization options and throws if required fields are missing.\n *\n * @param accountId - The Hedera account ID\n * @param privateKey - The private key for the account\n * @throws {Error} If required fields are missing\n */\n private validateOptions(accountId?: string, privateKey?: string): void {\n const opMode = (this.options.operationalMode ||\n DEFAULT_OPERATIONAL_MODE) as string;\n const bytesMode = opMode !== 'autonomous';\n if (!accountId) {\n throw new Error('Account ID is required');\n }\n if (!privateKey && !bytesMode) {\n throw new Error('Private key is required in autonomous mode');\n }\n\n if (typeof accountId !== 'string') {\n throw new Error(\n `Account ID must be a string, received ${typeof accountId}`\n );\n }\n\n if (!bytesMode && typeof privateKey !== 'string') {\n throw new Error(\n `Private key must be a string, received ${typeof privateKey}: ${JSON.stringify(\n privateKey\n )}`\n );\n }\n if (\n !bytesMode &&\n typeof privateKey === 'string' &&\n privateKey.length < 10\n ) {\n throw new Error('Private key appears to be invalid (too short)');\n }\n }\n\n /**\n * Prepares the list of plugins to use based on configuration.\n *\n * @returns Array of plugins to initialize with the agent\n */\n private preparePlugins(): BasePlugin[] {\n const { additionalPlugins = [], enabledPlugins, disabledPlugins } = this.options;\n\n const standardPlugins: BasePlugin[] = [\n this.hcs10Plugin,\n this.hcs2Plugin,\n this.inscribePlugin,\n this.hbarPlugin,\n ];\n standardPlugins.push(this.webBrowserPlugin);\n\n const corePlugins = getAllHederaCorePlugins();\n let pluginPool = [...standardPlugins, ...corePlugins];\n\n if (enabledPlugins) {\n const enabledSet = new Set(enabledPlugins);\n pluginPool = pluginPool.filter((plugin) => enabledSet.has(plugin.id));\n }\n\n if (disabledPlugins && disabledPlugins.length > 0) {\n const disabledSet = new Set(disabledPlugins);\n pluginPool = pluginPool.filter((plugin) => !disabledSet.has(plugin.id));\n }\n\n const additional = disabledPlugins && disabledPlugins.length > 0\n ? additionalPlugins.filter((plugin) => !disabledPlugins.includes(plugin.id))\n : additionalPlugins;\n\n return [...pluginPool, ...additional];\n }\n\n /**\n * Creates the agent configuration object.\n *\n * @param signer - The signer instance\n * @param llm - The language model instance\n * @param allPlugins - Array of plugins to use\n * @returns Configuration object for creating the agent\n */\n private createAgentConfig(\n signer: ServerSigner,\n llm: ChatOpenAI | ChatAnthropic,\n allPlugins: BasePlugin[]\n ): Parameters<typeof createAgent>[0] {\n const {\n operationalMode = DEFAULT_OPERATIONAL_MODE,\n userAccountId,\n scheduleUserTransactionsInBytesMode,\n customSystemMessagePreamble,\n customSystemMessagePostamble,\n verbose = false,\n mirrorNodeConfig,\n disableLogging,\n accountId = '',\n } = this.options;\n\n return {\n framework: 'langchain',\n signer,\n execution: {\n mode: operationalMode === 'autonomous' ? 'direct' : 'bytes',\n operationalMode: operationalMode,\n ...(userAccountId && { userAccountId }),\n ...(scheduleUserTransactionsInBytesMode !== undefined && {\n scheduleUserTransactionsInBytesMode:\n scheduleUserTransactionsInBytesMode,\n scheduleUserTransactions: scheduleUserTransactionsInBytesMode,\n }),\n },\n ai: {\n provider: new LangChainProvider(llm),\n temperature: DEFAULT_TEMPERATURE,\n },\n filtering: {\n toolPredicate: (tool: ToolDescriptor): boolean => {\n if (tool.name === 'hedera-account-transfer-hbar') return false;\n if (this.options.toolFilter && !this.options.toolFilter(tool)) {\n return false;\n }\n return true;\n },\n },\n messaging: {\n systemPreamble:\n customSystemMessagePreamble || getSystemMessage(accountId),\n ...(customSystemMessagePostamble && {\n systemPostamble: customSystemMessagePostamble,\n }),\n conciseMode: true,\n },\n extensions: {\n plugins: allPlugins,\n ...(mirrorNodeConfig && {\n mirrorConfig: mirrorNodeConfig as Record<string, unknown>,\n }),\n },\n ...(this.options.mcpServers && {\n mcp: {\n servers: this.options.mcpServers,\n autoConnect: false,\n },\n }),\n debug: {\n verbose,\n silent: disableLogging ?? false,\n },\n };\n }\n\n /**\n * Configures the HCS-10 plugin with the state manager.\n *\n * @param allPlugins - Array of all plugins\n */\n private configureHCS10Plugin(allPlugins: BasePlugin[]): void {\n const hcs10 = allPlugins.find((p) => p.id === 'hcs-10');\n if (hcs10) {\n (\n hcs10 as BasePlugin & { appConfig?: Record<string, unknown> }\n ).appConfig = {\n stateManager: this.stateManager,\n };\n }\n }\n\n /**\n * Create a ConversationalAgent with specific plugins enabled\n */\n private static withPlugins(\n options: ConversationalAgentOptions,\n plugins: string[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n enabledPlugins: plugins,\n });\n }\n\n /**\n * Create a ConversationalAgent with only HTS (Hedera Token Service) tools enabled\n */\n static withHTS(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hts-token']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-2 tools enabled\n */\n static withHCS2(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-2']);\n }\n\n /**\n * Create a ConversationalAgent with only HCS-10 tools enabled\n */\n static withHCS10(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10']);\n }\n\n /**\n * Create a ConversationalAgent with only inscription tools enabled\n */\n static withInscribe(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with only account management tools enabled\n */\n static withAccount(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, ['account']);\n }\n\n /**\n * Create a ConversationalAgent with only file service tools enabled\n */\n static withFileService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['file-service']);\n }\n\n /**\n * Create a ConversationalAgent with only consensus service tools enabled\n */\n static withConsensusService(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['consensus-service']);\n }\n\n /**\n * Create a ConversationalAgent with only smart contract tools enabled\n */\n static withSmartContract(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['smart-contract']);\n }\n\n /**\n * Create a ConversationalAgent with all HCS standards plugins\n */\n static withAllStandards(\n options: ConversationalAgentOptions\n ): ConversationalAgent {\n return this.withPlugins(options, ['hcs-10', 'hcs-2', 'inscribe']);\n }\n\n /**\n * Create a ConversationalAgent with minimal Hedera tools (no HCS standards)\n */\n static minimal(options: ConversationalAgentOptions): ConversationalAgent {\n return this.withPlugins(options, []);\n }\n\n /**\n * Create a ConversationalAgent with MCP servers configured\n */\n static withMCP(\n options: ConversationalAgentOptions,\n mcpServers: MCPServerConfig[]\n ): ConversationalAgent {\n return new ConversationalAgent({\n ...options,\n mcpServers,\n });\n }\n\n /**\n * Extract and store entities from agent responses\n * @param response - Agent response containing potential entity information\n * @param originalMessage - Original user message for context\n */\n private async extractAndStoreEntities(\n response: unknown,\n originalMessage: string\n ): Promise<void> {\n if (!this.memoryManager || !this.entityTools) {\n return;\n }\n\n try {\n this.logger.info('Starting LLM-based entity extraction');\n\n const responseText = this.extractResponseText(response);\n\n const entitiesJson = await this.entityTools.extractEntities.call({\n response: responseText,\n userMessage: originalMessage,\n });\n\n try {\n const entities = JSON.parse(entitiesJson);\n\n for (const entity of entities) {\n if (\n entity &&\n typeof entity === 'object' &&\n 'name' in entity &&\n 'type' in entity &&\n 'id' in entity\n ) {\n this.logger.info(\n `Storing entity: ${entity.name} (${entity.type}) -> ${entity.id}`\n );\n\n const transactionId = this.extractTransactionId(response);\n const idStr = String(entity.id);\n const isHederaId = /^0\\.0\\.[0-9]+$/.test(idStr);\n if (!isHederaId) {\n this.logger.warn('Skipping non-ID entity from extraction', {\n id: idStr,\n name: String(entity.name),\n type: String(entity.type),\n });\n } else {\n this.memoryManager.storeEntityAssociation(\n idStr,\n String(entity.name),\n String(entity.type),\n transactionId\n );\n }\n }\n }\n\n if (entities.length > 0) {\n this.logger.info(\n `Stored ${entities.length} entities via LLM extraction`\n );\n } else {\n this.logger.info('No entities found in response via LLM extraction');\n }\n } catch (parseError) {\n this.logger.error(\n 'Failed to parse extracted entities JSON:',\n parseError\n );\n throw parseError;\n }\n } catch (error) {\n this.logger.error('Entity extraction failed:', error);\n throw error;\n }\n }\n\n /**\n * Extract transaction ID from response if available\n * @param response - Transaction response\n * @returns Transaction ID or undefined\n */\n private extractTransactionId(response: unknown): string | undefined {\n try {\n if (\n typeof response === 'object' &&\n response &&\n 'transactionId' in response\n ) {\n const responseWithTxId = response as { transactionId?: unknown };\n return typeof responseWithTxId.transactionId === 'string'\n ? responseWithTxId.transactionId\n : undefined;\n }\n if (typeof response === 'string') {\n const match = response.match(\n /transaction[\\s\\w]*ID[\\s:\"]*([0-9a-fA-F@._-]+)/i\n );\n return match ? match[1] : undefined;\n }\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Connect to MCP servers asynchronously\n * @private\n */\n private connectMCP(): void {\n if (!this.agent || !this.options.mcpServers) {\n return;\n }\n\n this.agent\n .connectMCPServers()\n .catch((e) => {\n this.logger.error('Failed to connect MCP servers:', e);\n })\n .then(() => {\n this.logger.info('MCP servers connected successfully');\n });\n }\n\n /**\n * Get MCP connection status for all servers\n * @returns {Map<string, MCPConnectionStatus>} Connection status map\n */\n getMCPConnectionStatus(): Map<string, MCPConnectionStatus> {\n if (this.agent) {\n return this.agent.getMCPConnectionStatus();\n }\n return new Map();\n }\n\n /**\n * Check if a specific MCP server is connected\n * @param {string} serverName - Name of the server to check\n * @returns {boolean} True if connected, false otherwise\n */\n isMCPServerConnected(serverName: string): boolean {\n if (this.agent) {\n const statusMap = this.agent.getMCPConnectionStatus();\n const status = statusMap.get(serverName);\n return status?.connected ?? false;\n }\n return false;\n }\n\n /**\n * Clean up resources\n */\n async cleanup(): Promise<void> {\n try {\n this.logger.info('Cleaning up ConversationalAgent...');\n\n if (this.memoryManager) {\n try {\n this.memoryManager.dispose();\n this.logger.info('Memory manager cleaned up successfully');\n } catch (error) {\n this.logger.warn('Error cleaning up memory manager:', error);\n }\n this.memoryManager = undefined;\n }\n\n if (this.contentStoreManager) {\n await this.contentStoreManager.dispose();\n this.logger.info('ContentStoreManager cleaned up');\n }\n\n this.logger.info('ConversationalAgent cleanup completed');\n } catch (error) {\n this.logger.error('Error during cleanup:', error);\n }\n }\n\n /**\n * Switch operational mode\n */\n switchMode(mode?: AgentOperationalMode): void {\n if (this.agent?.switchMode) {\n this.agent.switchMode(mode || 'autonomous');\n }\n }\n\n /**\n * Get usage statistics\n */\n getUsageStats(): unknown {\n return this.agent?.getUsageStats?.() ?? {};\n }\n\n /**\n * Clear usage statistics\n */\n clearUsageStats(): void {\n if (this.agent?.clearUsageStats) {\n this.agent.clearUsageStats();\n }\n }\n\n /**\n * Shutdown the agent\n */\n shutdown(): Promise<void> {\n return this.agent?.shutdown?.() ?? Promise.resolve();\n }\n\n private extractResponseText(response: unknown): string {\n if (typeof response === 'string') {\n return response;\n }\n\n if (response && typeof response === 'object' && 'output' in response) {\n const responseWithOutput = response as { output: unknown };\n return String(responseWithOutput.output);\n }\n\n return JSON.stringify(response);\n }\n}\n"],"names":["network"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const getSystemMessage: (accountId: string) => string;
1
+ export declare const getSystemMessage: (accountId?: string) => string;