@hashgraphonline/conversational-agent 0.1.204 → 0.1.206
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.
- package/dist/cjs/base-agent.d.ts +6 -0
- package/dist/cjs/context/ReferenceContextManager.d.ts +84 -0
- package/dist/cjs/context/ReferenceResponseProcessor.d.ts +76 -0
- package/dist/cjs/conversational-agent.d.ts +34 -0
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/langchain-agent.d.ts +1 -0
- package/dist/cjs/mcp/ContentProcessor.d.ts +37 -0
- package/dist/cjs/mcp/MCPClientManager.d.ts +19 -1
- package/dist/cjs/memory/ContentStorage.d.ts +205 -0
- package/dist/cjs/memory/MemoryWindow.d.ts +114 -0
- package/dist/cjs/memory/ReferenceIdGenerator.d.ts +45 -0
- package/dist/cjs/memory/SmartMemoryManager.d.ts +201 -0
- package/dist/cjs/memory/TokenCounter.d.ts +61 -0
- package/dist/cjs/memory/index.d.ts +7 -0
- package/dist/cjs/plugins/hbar-transfer/TransferHbarTool.d.ts +18 -0
- package/dist/cjs/services/ContentStoreManager.d.ts +54 -0
- package/dist/cjs/types/content-reference.d.ts +213 -0
- package/dist/cjs/types/index.d.ts +4 -0
- package/dist/esm/index12.js +15 -2
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index14.js +119 -95
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +159 -114
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +122 -81
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +236 -0
- package/dist/esm/index17.js.map +1 -0
- package/dist/esm/index18.js +95 -0
- package/dist/esm/index18.js.map +1 -0
- package/dist/esm/index19.js +663 -0
- package/dist/esm/index19.js.map +1 -0
- package/dist/esm/index2.js +3 -1
- package/dist/esm/index2.js.map +1 -1
- package/dist/esm/index20.js +233 -0
- package/dist/esm/index20.js.map +1 -0
- package/dist/esm/index21.js +182 -0
- package/dist/esm/index21.js.map +1 -0
- package/dist/esm/index22.js +126 -0
- package/dist/esm/index22.js.map +1 -0
- package/dist/esm/index23.js +68 -0
- package/dist/esm/index23.js.map +1 -0
- package/dist/esm/index24.js +38 -0
- package/dist/esm/index24.js.map +1 -0
- package/dist/esm/index6.js +143 -84
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index7.js.map +1 -1
- package/dist/esm/index8.js +69 -5
- package/dist/esm/index8.js.map +1 -1
- package/dist/types/base-agent.d.ts +6 -0
- package/dist/types/context/ReferenceContextManager.d.ts +84 -0
- package/dist/types/context/ReferenceResponseProcessor.d.ts +76 -0
- package/dist/types/conversational-agent.d.ts +34 -0
- package/dist/types/langchain-agent.d.ts +1 -0
- package/dist/types/mcp/ContentProcessor.d.ts +37 -0
- package/dist/types/mcp/MCPClientManager.d.ts +19 -1
- package/dist/types/memory/ContentStorage.d.ts +205 -0
- package/dist/types/memory/MemoryWindow.d.ts +114 -0
- package/dist/types/memory/ReferenceIdGenerator.d.ts +45 -0
- package/dist/types/memory/SmartMemoryManager.d.ts +201 -0
- package/dist/types/memory/TokenCounter.d.ts +61 -0
- package/dist/types/memory/index.d.ts +7 -0
- package/dist/types/plugins/hbar-transfer/TransferHbarTool.d.ts +18 -0
- package/dist/types/services/ContentStoreManager.d.ts +54 -0
- package/dist/types/types/content-reference.d.ts +213 -0
- package/dist/types/types/index.d.ts +4 -0
- package/package.json +30 -26
- package/src/base-agent.ts +6 -0
- package/src/context/ReferenceContextManager.ts +345 -0
- package/src/context/ReferenceResponseProcessor.ts +296 -0
- package/src/conversational-agent.ts +166 -92
- package/src/langchain-agent.ts +89 -2
- package/src/mcp/ContentProcessor.ts +317 -0
- package/src/mcp/MCPClientManager.ts +61 -1
- package/src/mcp/adapters/langchain.ts +9 -4
- package/src/memory/ContentStorage.ts +954 -0
- package/src/memory/MemoryWindow.ts +247 -0
- package/src/memory/ReferenceIdGenerator.ts +84 -0
- package/src/memory/SmartMemoryManager.ts +323 -0
- package/src/memory/TokenCounter.ts +152 -0
- package/src/memory/index.ts +8 -0
- package/src/plugins/hbar-transfer/TransferHbarTool.ts +19 -1
- package/src/plugins/hcs-10/HCS10Plugin.ts +5 -4
- package/src/services/ContentStoreManager.ts +199 -0
- package/src/types/content-reference.ts +281 -0
- package/src/types/index.ts +6 -0
package/dist/esm/index16.js
CHANGED
|
@@ -1,95 +1,136 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { DynamicStructuredTool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
function convertMCPToolToLangChain(tool, mcpManager, serverConfig) {
|
|
4
|
+
const zodSchema = jsonSchemaToZod(tool.inputSchema);
|
|
5
|
+
const sanitizedName = `${tool.serverName}_${tool.name}`.replace(
|
|
6
|
+
/[^a-zA-Z0-9_]/g,
|
|
7
|
+
"_"
|
|
8
|
+
);
|
|
9
|
+
let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;
|
|
10
|
+
if (serverConfig?.toolDescriptions?.[tool.name]) {
|
|
11
|
+
description = `${description}
|
|
12
|
+
|
|
13
|
+
${serverConfig.toolDescriptions[tool.name]}`;
|
|
7
14
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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()
|
|
15
|
+
if (serverConfig?.additionalContext) {
|
|
16
|
+
description = `${description}
|
|
17
|
+
|
|
18
|
+
Context: ${serverConfig.additionalContext}`;
|
|
19
|
+
}
|
|
20
|
+
return new DynamicStructuredTool({
|
|
21
|
+
name: sanitizedName,
|
|
22
|
+
description,
|
|
23
|
+
schema: zodSchema,
|
|
24
|
+
func: async (input) => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await mcpManager.executeTool(
|
|
27
|
+
tool.serverName,
|
|
28
|
+
tool.name,
|
|
29
|
+
input
|
|
37
30
|
);
|
|
38
|
-
|
|
31
|
+
let responseText = "";
|
|
32
|
+
if (typeof result === "string") {
|
|
33
|
+
responseText = result;
|
|
34
|
+
} else if (result && typeof result === "object" && "content" in result) {
|
|
35
|
+
const content = result.content;
|
|
36
|
+
if (Array.isArray(content)) {
|
|
37
|
+
const textParts = content.filter(
|
|
38
|
+
(item) => typeof item === "object" && item !== null && "type" in item && item.type === "text" && "text" in item
|
|
39
|
+
).map((item) => item.text);
|
|
40
|
+
responseText = textParts.join("\n");
|
|
41
|
+
} else {
|
|
42
|
+
responseText = JSON.stringify(content);
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
responseText = JSON.stringify(result);
|
|
46
|
+
}
|
|
47
|
+
return responseText;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
50
|
+
return `Error executing MCP tool ${tool.name}: ${errorMessage}`;
|
|
39
51
|
}
|
|
40
52
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function jsonSchemaToZod(schema) {
|
|
56
|
+
if (!schema || typeof schema !== "object") {
|
|
57
|
+
return z.object({});
|
|
58
|
+
}
|
|
59
|
+
const schemaObj = schema;
|
|
60
|
+
if (schemaObj.type && schemaObj.type !== "object") {
|
|
61
|
+
return convertType(schemaObj);
|
|
62
|
+
}
|
|
63
|
+
if (!schemaObj.properties || typeof schemaObj.properties !== "object") {
|
|
64
|
+
return z.object({});
|
|
65
|
+
}
|
|
66
|
+
const shape = {};
|
|
67
|
+
for (const [key, value] of Object.entries(schemaObj.properties)) {
|
|
68
|
+
let zodType = convertType(value);
|
|
69
|
+
const isRequired = Array.isArray(schemaObj.required) && schemaObj.required.includes(key);
|
|
70
|
+
if (!isRequired) {
|
|
71
|
+
zodType = zodType.optional();
|
|
72
|
+
}
|
|
73
|
+
shape[key] = zodType;
|
|
74
|
+
}
|
|
75
|
+
return z.object(shape);
|
|
76
|
+
}
|
|
77
|
+
function convertType(schema) {
|
|
78
|
+
if (!schema || typeof schema !== "object" || !("type" in schema)) {
|
|
79
|
+
return z.unknown();
|
|
80
|
+
}
|
|
81
|
+
const schemaObj = schema;
|
|
82
|
+
let zodType;
|
|
83
|
+
switch (schemaObj.type) {
|
|
84
|
+
case "string":
|
|
85
|
+
zodType = z.string();
|
|
86
|
+
if (schemaObj.enum && Array.isArray(schemaObj.enum)) {
|
|
87
|
+
zodType = z.enum(schemaObj.enum);
|
|
61
88
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
}
|
|
89
|
+
break;
|
|
90
|
+
case "number":
|
|
91
|
+
zodType = z.number();
|
|
92
|
+
if ("minimum" in schemaObj && typeof schemaObj.minimum === "number") {
|
|
93
|
+
zodType = zodType.min(schemaObj.minimum);
|
|
76
94
|
}
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
if ("maximum" in schemaObj && typeof schemaObj.maximum === "number") {
|
|
96
|
+
zodType = zodType.max(schemaObj.maximum);
|
|
79
97
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
break;
|
|
99
|
+
case "integer":
|
|
100
|
+
zodType = z.number().int();
|
|
101
|
+
if ("minimum" in schemaObj && typeof schemaObj.minimum === "number") {
|
|
102
|
+
zodType = zodType.min(schemaObj.minimum);
|
|
103
|
+
}
|
|
104
|
+
if ("maximum" in schemaObj && typeof schemaObj.maximum === "number") {
|
|
105
|
+
zodType = zodType.max(schemaObj.maximum);
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case "boolean":
|
|
109
|
+
zodType = z.boolean();
|
|
110
|
+
break;
|
|
111
|
+
case "array":
|
|
112
|
+
if (schemaObj.items) {
|
|
113
|
+
zodType = z.array(convertType(schemaObj.items));
|
|
84
114
|
} else {
|
|
85
|
-
|
|
115
|
+
zodType = z.array(z.unknown());
|
|
86
116
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
117
|
+
break;
|
|
118
|
+
case "object":
|
|
119
|
+
if ("properties" in schemaObj) {
|
|
120
|
+
zodType = jsonSchemaToZod(schemaObj);
|
|
121
|
+
} else {
|
|
122
|
+
zodType = z.object({}).passthrough();
|
|
123
|
+
}
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
zodType = z.unknown();
|
|
127
|
+
}
|
|
128
|
+
if ("description" in schemaObj && typeof schemaObj.description === "string") {
|
|
129
|
+
zodType = zodType.describe(schemaObj.description);
|
|
90
130
|
}
|
|
131
|
+
return zodType;
|
|
91
132
|
}
|
|
92
133
|
export {
|
|
93
|
-
|
|
134
|
+
convertMCPToolToLangChain
|
|
94
135
|
};
|
|
95
136
|
//# sourceMappingURL=index16.js.map
|
package/dist/esm/index16.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index16.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"index16.js","sources":["../../src/mcp/adapters/langchain.ts"],"sourcesContent":["import { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { MCPToolInfo, MCPServerConfig } from '../types';\nimport type { MCPClientManager } from '../MCPClientManager';\n\n/**\n * Convert an MCP tool to a LangChain DynamicStructuredTool\n */\nexport function convertMCPToolToLangChain(\n tool: MCPToolInfo,\n mcpManager: MCPClientManager,\n serverConfig?: MCPServerConfig\n): DynamicStructuredTool {\n const zodSchema = jsonSchemaToZod(tool.inputSchema);\n\n const sanitizedName = `${tool.serverName}_${tool.name}`.replace(\n /[^a-zA-Z0-9_]/g,\n '_'\n );\n\n let description = tool.description || `MCP tool ${tool.name} from ${tool.serverName}`;\n \n if (serverConfig?.toolDescriptions?.[tool.name]) {\n description = `${description}\\n\\n${serverConfig.toolDescriptions[tool.name]}`;\n }\n \n if (serverConfig?.additionalContext) {\n description = `${description}\\n\\nContext: ${serverConfig.additionalContext}`;\n }\n\n return new DynamicStructuredTool({\n name: sanitizedName,\n description,\n schema: zodSchema,\n func: async (input) => {\n try {\n const result = await mcpManager.executeTool(\n tool.serverName,\n tool.name,\n input\n );\n\n let responseText = '';\n \n if (typeof result === 'string') {\n responseText = result;\n } else if (\n result &&\n typeof result === 'object' &&\n 'content' in result\n ) {\n const content = (result as { content: unknown }).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (item): item is { type: string; text: string } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text' &&\n 'text' in item\n )\n .map((item) => item.text);\n responseText = textParts.join('\\n');\n } else {\n responseText = JSON.stringify(content);\n }\n } else {\n responseText = JSON.stringify(result);\n }\n\n return responseText;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n return `Error executing MCP tool ${tool.name}: ${errorMessage}`;\n }\n },\n });\n}\n\n/**\n * Convert JSON Schema to Zod schema\n * This is a simplified converter that handles common cases\n */\nfunction jsonSchemaToZod(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object') {\n return z.object({});\n }\n\n const schemaObj = schema as Record<string, unknown>;\n\n if (schemaObj.type && schemaObj.type !== 'object') {\n return convertType(schemaObj);\n }\n\n if (!schemaObj.properties || typeof schemaObj.properties !== 'object') {\n return z.object({});\n }\n\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(schemaObj.properties)) {\n let zodType = convertType(value);\n\n const isRequired =\n Array.isArray(schemaObj.required) && schemaObj.required.includes(key);\n if (!isRequired) {\n zodType = zodType.optional();\n }\n\n shape[key] = zodType;\n }\n\n return z.object(shape);\n}\n\n/**\n * Convert a single JSON Schema type to Zod\n */\nfunction convertType(schema: unknown): z.ZodTypeAny {\n if (!schema || typeof schema !== 'object' || !('type' in schema)) {\n return z.unknown();\n }\n\n const schemaObj = schema as {\n type: string;\n enum?: unknown[];\n items?: unknown;\n };\n let zodType: z.ZodTypeAny;\n\n switch (schemaObj.type) {\n case 'string':\n zodType = z.string();\n if (schemaObj.enum && Array.isArray(schemaObj.enum)) {\n zodType = z.enum(schemaObj.enum as [string, ...string[]]);\n }\n break;\n\n case 'number':\n zodType = z.number();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'integer':\n zodType = z.number().int();\n if ('minimum' in schemaObj && typeof schemaObj.minimum === 'number') {\n zodType = (zodType as z.ZodNumber).min(schemaObj.minimum);\n }\n if ('maximum' in schemaObj && typeof schemaObj.maximum === 'number') {\n zodType = (zodType as z.ZodNumber).max(schemaObj.maximum);\n }\n break;\n\n case 'boolean':\n zodType = z.boolean();\n break;\n\n case 'array':\n if (schemaObj.items) {\n zodType = z.array(convertType(schemaObj.items));\n } else {\n zodType = z.array(z.unknown());\n }\n break;\n\n case 'object':\n if ('properties' in schemaObj) {\n zodType = jsonSchemaToZod(schemaObj);\n } else {\n zodType = z.object({}).passthrough();\n }\n break;\n\n default:\n zodType = z.unknown();\n }\n\n if ('description' in schemaObj && typeof schemaObj.description === 'string') {\n zodType = zodType.describe(schemaObj.description);\n }\n\n return zodType;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { MemoryWindow } from "./index21.js";
|
|
2
|
+
import { ContentStorage } from "./index19.js";
|
|
3
|
+
import { TokenCounter } from "./index22.js";
|
|
4
|
+
const _SmartMemoryManager = class _SmartMemoryManager {
|
|
5
|
+
constructor(config = {}) {
|
|
6
|
+
this.config = { ..._SmartMemoryManager.DEFAULT_CONFIG, ...config };
|
|
7
|
+
this.tokenCounter = new TokenCounter(this.config.modelName);
|
|
8
|
+
this.contentStorage = new ContentStorage(this.config.storageLimit);
|
|
9
|
+
this.memoryWindow = new MemoryWindow(
|
|
10
|
+
this.config.maxTokens,
|
|
11
|
+
this.config.reserveTokens,
|
|
12
|
+
this.tokenCounter
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add a message to the active memory window
|
|
17
|
+
* Automatically handles pruning and storage of displaced messages
|
|
18
|
+
* @param message - Message to add
|
|
19
|
+
*/
|
|
20
|
+
addMessage(message) {
|
|
21
|
+
const result = this.memoryWindow.addMessage(message);
|
|
22
|
+
if (result.prunedMessages.length > 0) {
|
|
23
|
+
this.contentStorage.storeMessages(result.prunedMessages);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get all active messages from the memory window
|
|
28
|
+
* @returns Array of active messages in chronological order
|
|
29
|
+
*/
|
|
30
|
+
getMessages() {
|
|
31
|
+
return this.memoryWindow.getMessages();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Clear active memory window
|
|
35
|
+
* @param clearStorage - Whether to also clear the content storage (default: false)
|
|
36
|
+
*/
|
|
37
|
+
clear(clearStorage = false) {
|
|
38
|
+
this.memoryWindow.clear();
|
|
39
|
+
if (clearStorage) {
|
|
40
|
+
this.contentStorage.clear();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Set the system prompt for the memory window
|
|
45
|
+
* @param systemPrompt - System prompt text
|
|
46
|
+
*/
|
|
47
|
+
setSystemPrompt(systemPrompt) {
|
|
48
|
+
this.memoryWindow.setSystemPrompt(systemPrompt);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the current system prompt
|
|
52
|
+
* @returns Current system prompt text
|
|
53
|
+
*/
|
|
54
|
+
getSystemPrompt() {
|
|
55
|
+
return this.memoryWindow.getSystemPrompt();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Search through stored message history
|
|
59
|
+
* @param query - Search term or pattern
|
|
60
|
+
* @param options - Search configuration
|
|
61
|
+
* @returns Array of matching messages from history
|
|
62
|
+
*/
|
|
63
|
+
searchHistory(query, options = {}) {
|
|
64
|
+
return this.contentStorage.searchMessages(query, options);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get recent messages from storage history
|
|
68
|
+
* @param count - Number of recent messages to retrieve
|
|
69
|
+
* @returns Array of recent messages from storage
|
|
70
|
+
*/
|
|
71
|
+
getRecentHistory(count) {
|
|
72
|
+
return this.contentStorage.getRecentMessages(count);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a message can be added without exceeding limits
|
|
76
|
+
* @param message - Message to test
|
|
77
|
+
* @returns True if message can be added
|
|
78
|
+
*/
|
|
79
|
+
canAddMessage(message) {
|
|
80
|
+
return this.memoryWindow.canAddMessage(message);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get statistics about the active memory window
|
|
84
|
+
* @returns Memory usage statistics
|
|
85
|
+
*/
|
|
86
|
+
getMemoryStats() {
|
|
87
|
+
const windowStats = this.memoryWindow.getStats();
|
|
88
|
+
return {
|
|
89
|
+
totalActiveMessages: windowStats.totalMessages,
|
|
90
|
+
currentTokenCount: windowStats.currentTokens,
|
|
91
|
+
maxTokens: windowStats.maxTokens,
|
|
92
|
+
remainingCapacity: windowStats.remainingCapacity,
|
|
93
|
+
systemPromptTokens: windowStats.systemPromptTokens,
|
|
94
|
+
usagePercentage: windowStats.usagePercentage
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get statistics about the content storage
|
|
99
|
+
* @returns Storage usage statistics
|
|
100
|
+
*/
|
|
101
|
+
getStorageStats() {
|
|
102
|
+
return this.contentStorage.getStorageStats();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get combined statistics for both active memory and storage
|
|
106
|
+
* @returns Combined memory and storage statistics
|
|
107
|
+
*/
|
|
108
|
+
getOverallStats() {
|
|
109
|
+
const memoryStats = this.getMemoryStats();
|
|
110
|
+
const storageStats = this.getStorageStats();
|
|
111
|
+
return {
|
|
112
|
+
activeMemory: memoryStats,
|
|
113
|
+
storage: storageStats,
|
|
114
|
+
totalMessagesManaged: memoryStats.totalActiveMessages + storageStats.totalMessages,
|
|
115
|
+
activeMemoryUtilization: memoryStats.usagePercentage,
|
|
116
|
+
storageUtilization: storageStats.usagePercentage
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Update the configuration and apply changes
|
|
121
|
+
* @param newConfig - New configuration options
|
|
122
|
+
*/
|
|
123
|
+
updateConfig(newConfig) {
|
|
124
|
+
this.config = { ...this.config, ...newConfig };
|
|
125
|
+
if (newConfig.maxTokens !== void 0 || newConfig.reserveTokens !== void 0) {
|
|
126
|
+
this.memoryWindow.updateLimits(
|
|
127
|
+
this.config.maxTokens,
|
|
128
|
+
this.config.reserveTokens
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
if (newConfig.storageLimit !== void 0) {
|
|
132
|
+
this.contentStorage.updateStorageLimit(this.config.storageLimit);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get current configuration
|
|
137
|
+
* @returns Current configuration settings
|
|
138
|
+
*/
|
|
139
|
+
getConfig() {
|
|
140
|
+
return { ...this.config };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get messages from storage within a time range
|
|
144
|
+
* @param startTime - Start of time range
|
|
145
|
+
* @param endTime - End of time range
|
|
146
|
+
* @returns Messages within the specified time range
|
|
147
|
+
*/
|
|
148
|
+
getHistoryFromTimeRange(startTime, endTime) {
|
|
149
|
+
return this.contentStorage.getMessagesFromTimeRange(startTime, endTime);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get messages from storage by message type
|
|
153
|
+
* @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)
|
|
154
|
+
* @param limit - Maximum number of messages to return
|
|
155
|
+
* @returns Messages of the specified type
|
|
156
|
+
*/
|
|
157
|
+
getHistoryByType(messageType, limit) {
|
|
158
|
+
return this.contentStorage.getMessagesByType(messageType, limit);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get recent messages from storage within the last N minutes
|
|
162
|
+
* @param minutes - Number of minutes to look back
|
|
163
|
+
* @returns Messages from the last N minutes
|
|
164
|
+
*/
|
|
165
|
+
getRecentHistoryByTime(minutes) {
|
|
166
|
+
return this.contentStorage.getRecentMessagesByTime(minutes);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Export the current state for persistence or analysis
|
|
170
|
+
* @returns Serializable representation of memory state
|
|
171
|
+
*/
|
|
172
|
+
exportState() {
|
|
173
|
+
return {
|
|
174
|
+
config: this.config,
|
|
175
|
+
activeMessages: this.memoryWindow.getMessages().map((msg) => ({
|
|
176
|
+
content: msg.content,
|
|
177
|
+
type: msg._getType()
|
|
178
|
+
})),
|
|
179
|
+
systemPrompt: this.memoryWindow.getSystemPrompt(),
|
|
180
|
+
memoryStats: this.getMemoryStats(),
|
|
181
|
+
storageStats: this.getStorageStats(),
|
|
182
|
+
storedMessages: this.contentStorage.exportMessages()
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get a summary of conversation context for external use
|
|
187
|
+
* Useful for providing context to other systems or for logging
|
|
188
|
+
* @param includeStoredContext - Whether to include recent stored messages
|
|
189
|
+
* @returns Context summary object
|
|
190
|
+
*/
|
|
191
|
+
getContextSummary(includeStoredContext = false) {
|
|
192
|
+
const activeMessages = this.getMessages();
|
|
193
|
+
const summary = {
|
|
194
|
+
activeMessageCount: activeMessages.length,
|
|
195
|
+
systemPrompt: this.getSystemPrompt(),
|
|
196
|
+
recentMessages: activeMessages.slice(-5),
|
|
197
|
+
// Last 5 active messages
|
|
198
|
+
memoryUtilization: this.getMemoryStats().usagePercentage,
|
|
199
|
+
hasStoredHistory: this.getStorageStats().totalMessages > 0
|
|
200
|
+
};
|
|
201
|
+
if (includeStoredContext) {
|
|
202
|
+
return {
|
|
203
|
+
...summary,
|
|
204
|
+
recentStoredMessages: this.getRecentHistory(10),
|
|
205
|
+
// Last 10 stored messages
|
|
206
|
+
storageStats: this.getStorageStats()
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return summary;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Perform maintenance operations
|
|
213
|
+
* Optimizes storage and cleans up resources
|
|
214
|
+
*/
|
|
215
|
+
performMaintenance() {
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Clean up resources and dispose of components
|
|
219
|
+
*/
|
|
220
|
+
dispose() {
|
|
221
|
+
this.memoryWindow.dispose();
|
|
222
|
+
this.contentStorage.dispose();
|
|
223
|
+
this.tokenCounter.dispose();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
_SmartMemoryManager.DEFAULT_CONFIG = {
|
|
227
|
+
maxTokens: 8e3,
|
|
228
|
+
reserveTokens: 1e3,
|
|
229
|
+
modelName: "gpt-4o",
|
|
230
|
+
storageLimit: 1e3
|
|
231
|
+
};
|
|
232
|
+
let SmartMemoryManager = _SmartMemoryManager;
|
|
233
|
+
export {
|
|
234
|
+
SmartMemoryManager
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=index17.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index17.js","sources":["../../src/memory/SmartMemoryManager.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { MemoryWindow } from './MemoryWindow';\nimport { ContentStorage } from './ContentStorage';\nimport { TokenCounter } from './TokenCounter';\n\n/**\n * Configuration for SmartMemoryManager\n */\nexport interface SmartMemoryConfig {\n /** Maximum tokens for active memory window */\n maxTokens?: number;\n /** Reserve tokens for response generation */\n reserveTokens?: number;\n /** Model name for token counting */\n modelName?: string;\n /** Maximum messages to store in content storage */\n storageLimit?: number;\n}\n\n/**\n * Search options for history search\n */\nexport interface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Memory statistics for active memory window\n */\nexport interface MemoryStats {\n /** Total active messages in memory window */\n totalActiveMessages: number;\n /** Current token count including system prompt */\n currentTokenCount: number;\n /** Maximum token capacity */\n maxTokens: number;\n /** Remaining token capacity */\n remainingCapacity: number;\n /** System prompt token count */\n systemPromptTokens: number;\n /** Memory usage percentage */\n usagePercentage: number;\n}\n\n/**\n * Smart memory manager that combines active memory window with long-term storage\n * Provides context-aware memory management with automatic pruning and searchable history\n */\nexport class SmartMemoryManager {\n private memoryWindow: MemoryWindow;\n private contentStorage: ContentStorage;\n private tokenCounter: TokenCounter;\n private config: Required<SmartMemoryConfig>;\n\n // Default configuration values\n private static readonly DEFAULT_CONFIG: Required<SmartMemoryConfig> = {\n maxTokens: 8000,\n reserveTokens: 1000,\n modelName: 'gpt-4o',\n storageLimit: 1000\n };\n\n constructor(config: SmartMemoryConfig = {}) {\n this.config = { ...SmartMemoryManager.DEFAULT_CONFIG, ...config };\n \n // Initialize components\n this.tokenCounter = new TokenCounter(this.config.modelName as any);\n this.contentStorage = new ContentStorage(this.config.storageLimit);\n this.memoryWindow = new MemoryWindow(\n this.config.maxTokens,\n this.config.reserveTokens,\n this.tokenCounter\n );\n }\n\n /**\n * Add a message to the active memory window\n * Automatically handles pruning and storage of displaced messages\n * @param message - Message to add\n */\n addMessage(message: BaseMessage): void {\n const result = this.memoryWindow.addMessage(message);\n \n // Store any pruned messages in content storage\n if (result.prunedMessages.length > 0) {\n this.contentStorage.storeMessages(result.prunedMessages);\n }\n }\n\n /**\n * Get all active messages from the memory window\n * @returns Array of active messages in chronological order\n */\n getMessages(): BaseMessage[] {\n return this.memoryWindow.getMessages();\n }\n\n /**\n * Clear active memory window\n * @param clearStorage - Whether to also clear the content storage (default: false)\n */\n clear(clearStorage: boolean = false): void {\n this.memoryWindow.clear();\n \n if (clearStorage) {\n this.contentStorage.clear();\n }\n }\n\n /**\n * Set the system prompt for the memory window\n * @param systemPrompt - System prompt text\n */\n setSystemPrompt(systemPrompt: string): void {\n this.memoryWindow.setSystemPrompt(systemPrompt);\n }\n\n /**\n * Get the current system prompt\n * @returns Current system prompt text\n */\n getSystemPrompt(): string {\n return this.memoryWindow.getSystemPrompt();\n }\n\n /**\n * Search through stored message history\n * @param query - Search term or pattern\n * @param options - Search configuration\n * @returns Array of matching messages from history\n */\n searchHistory(query: string, options: SearchOptions = {}): BaseMessage[] {\n return this.contentStorage.searchMessages(query, options);\n }\n\n /**\n * Get recent messages from storage history\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages from storage\n */\n getRecentHistory(count: number): BaseMessage[] {\n return this.contentStorage.getRecentMessages(count);\n }\n\n /**\n * Check if a message can be added without exceeding limits\n * @param message - Message to test\n * @returns True if message can be added\n */\n canAddMessage(message: BaseMessage): boolean {\n return this.memoryWindow.canAddMessage(message);\n }\n\n /**\n * Get statistics about the active memory window\n * @returns Memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n const windowStats = this.memoryWindow.getStats();\n \n return {\n totalActiveMessages: windowStats.totalMessages,\n currentTokenCount: windowStats.currentTokens,\n maxTokens: windowStats.maxTokens,\n remainingCapacity: windowStats.remainingCapacity,\n systemPromptTokens: windowStats.systemPromptTokens,\n usagePercentage: windowStats.usagePercentage\n };\n }\n\n /**\n * Get statistics about the content storage\n * @returns Storage usage statistics\n */\n getStorageStats() {\n return this.contentStorage.getStorageStats();\n }\n\n /**\n * Get combined statistics for both active memory and storage\n * @returns Combined memory and storage statistics\n */\n getOverallStats() {\n const memoryStats = this.getMemoryStats();\n const storageStats = this.getStorageStats();\n \n return {\n activeMemory: memoryStats,\n storage: storageStats,\n totalMessagesManaged: memoryStats.totalActiveMessages + storageStats.totalMessages,\n activeMemoryUtilization: memoryStats.usagePercentage,\n storageUtilization: storageStats.usagePercentage\n };\n }\n\n /**\n * Update the configuration and apply changes\n * @param newConfig - New configuration options\n */\n updateConfig(newConfig: Partial<SmartMemoryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n \n // Update components with new configuration\n if (newConfig.maxTokens !== undefined || newConfig.reserveTokens !== undefined) {\n this.memoryWindow.updateLimits(\n this.config.maxTokens,\n this.config.reserveTokens\n );\n }\n \n if (newConfig.storageLimit !== undefined) {\n this.contentStorage.updateStorageLimit(this.config.storageLimit);\n }\n \n // Note: Model name changes would require recreating the token counter\n // This is not implemented to avoid disrupting ongoing operations\n }\n\n /**\n * Get current configuration\n * @returns Current configuration settings\n */\n getConfig(): Required<SmartMemoryConfig> {\n return { ...this.config };\n }\n\n /**\n * Get messages from storage within a time range\n * @param startTime - Start of time range\n * @param endTime - End of time range\n * @returns Messages within the specified time range\n */\n getHistoryFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n return this.contentStorage.getMessagesFromTimeRange(startTime, endTime);\n }\n\n /**\n * Get messages from storage by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Messages of the specified type\n */\n getHistoryByType(messageType: string, limit?: number): BaseMessage[] {\n return this.contentStorage.getMessagesByType(messageType, limit);\n }\n\n /**\n * Get recent messages from storage within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Messages from the last N minutes\n */\n getRecentHistoryByTime(minutes: number): BaseMessage[] {\n return this.contentStorage.getRecentMessagesByTime(minutes);\n }\n\n /**\n * Export the current state for persistence or analysis\n * @returns Serializable representation of memory state\n */\n exportState() {\n return {\n config: this.config,\n activeMessages: this.memoryWindow.getMessages().map(msg => ({\n content: msg.content,\n type: msg._getType()\n })),\n systemPrompt: this.memoryWindow.getSystemPrompt(),\n memoryStats: this.getMemoryStats(),\n storageStats: this.getStorageStats(),\n storedMessages: this.contentStorage.exportMessages()\n };\n }\n\n /**\n * Get a summary of conversation context for external use\n * Useful for providing context to other systems or for logging\n * @param includeStoredContext - Whether to include recent stored messages\n * @returns Context summary object\n */\n getContextSummary(includeStoredContext: boolean = false) {\n const activeMessages = this.getMessages();\n const summary = {\n activeMessageCount: activeMessages.length,\n systemPrompt: this.getSystemPrompt(),\n recentMessages: activeMessages.slice(-5), // Last 5 active messages\n memoryUtilization: this.getMemoryStats().usagePercentage,\n hasStoredHistory: this.getStorageStats().totalMessages > 0\n };\n\n if (includeStoredContext) {\n return {\n ...summary,\n recentStoredMessages: this.getRecentHistory(10), // Last 10 stored messages\n storageStats: this.getStorageStats()\n };\n }\n\n return summary;\n }\n\n /**\n * Perform maintenance operations\n * Optimizes storage and cleans up resources\n */\n performMaintenance(): void {\n // No specific maintenance needed currently\n // This method is reserved for future optimizations\n }\n\n /**\n * Clean up resources and dispose of components\n */\n dispose(): void {\n this.memoryWindow.dispose();\n this.contentStorage.dispose();\n this.tokenCounter.dispose();\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -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=index18.js.map
|