@hashgraphonline/conversational-agent 0.1.215 ā 0.1.217
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/conversational-agent.d.ts +8 -0
- package/dist/cjs/core/ToolRegistry.d.ts +130 -0
- package/dist/cjs/execution/ExecutionPipeline.d.ts +81 -0
- package/dist/cjs/forms/FormEngine.d.ts +121 -0
- package/dist/cjs/forms/form-generator.d.ts +39 -2
- package/dist/cjs/forms/types.d.ts +21 -2
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +3 -4
- package/dist/cjs/langchain/FormAwareAgentExecutor.d.ts +53 -4
- package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +43 -6
- package/dist/cjs/langchain-agent.d.ts +49 -0
- package/dist/cjs/memory/ContentStorage.d.ts +7 -0
- package/dist/cjs/memory/SmartMemoryManager.d.ts +1 -0
- package/dist/cjs/services/ContentStoreManager.d.ts +11 -1
- package/dist/cjs/utils/ResponseFormatter.d.ts +26 -0
- package/dist/esm/index.js +2 -6
- package/dist/esm/index12.js +1 -1
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index14.js +23 -5
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +25 -4
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +4 -2
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +2 -7
- package/dist/esm/index17.js.map +1 -1
- package/dist/esm/index18.js +292 -150
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index19.js +158 -65
- package/dist/esm/index19.js.map +1 -1
- package/dist/esm/index20.js +94 -270
- package/dist/esm/index20.js.map +1 -1
- package/dist/esm/index21.js +1 -1
- package/dist/esm/index23.js +14 -0
- package/dist/esm/index23.js.map +1 -1
- package/dist/esm/index24.js +508 -12
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index25.js +1 -1
- package/dist/esm/index25.js.map +1 -1
- package/dist/esm/index26.js +1 -1
- package/dist/esm/index26.js.map +1 -1
- package/dist/esm/index27.js +189 -128
- package/dist/esm/index27.js.map +1 -1
- package/dist/esm/index28.js +164 -45
- package/dist/esm/index28.js.map +1 -1
- package/dist/esm/index29.js +302 -24
- package/dist/esm/index29.js.map +1 -1
- package/dist/esm/index30.js +144 -80
- package/dist/esm/index30.js.map +1 -1
- package/dist/esm/index31.js +63 -7
- package/dist/esm/index31.js.map +1 -1
- package/dist/esm/index32.js +24 -236
- package/dist/esm/index32.js.map +1 -1
- package/dist/esm/index33.js +95 -0
- package/dist/esm/index33.js.map +1 -0
- package/dist/esm/index34.js +245 -0
- package/dist/esm/index34.js.map +1 -0
- package/dist/esm/index5.js.map +1 -1
- package/dist/esm/index6.js +61 -22
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index8.js +653 -131
- package/dist/esm/index8.js.map +1 -1
- package/dist/types/conversational-agent.d.ts +8 -0
- package/dist/types/core/ToolRegistry.d.ts +130 -0
- package/dist/types/execution/ExecutionPipeline.d.ts +81 -0
- package/dist/types/forms/FormEngine.d.ts +121 -0
- package/dist/types/forms/form-generator.d.ts +39 -2
- package/dist/types/forms/types.d.ts +21 -2
- package/dist/types/index.d.ts +3 -4
- package/dist/types/langchain/FormAwareAgentExecutor.d.ts +53 -4
- package/dist/types/langchain/FormValidatingToolWrapper.d.ts +43 -6
- package/dist/types/langchain-agent.d.ts +49 -0
- package/dist/types/memory/ContentStorage.d.ts +7 -0
- package/dist/types/memory/SmartMemoryManager.d.ts +1 -0
- package/dist/types/services/ContentStoreManager.d.ts +11 -1
- package/dist/types/utils/ResponseFormatter.d.ts +26 -0
- package/package.json +13 -10
- package/src/config/system-message.ts +14 -0
- package/src/context/ReferenceContextManager.ts +1 -1
- package/src/conversational-agent.ts +91 -36
- package/src/core/ToolRegistry.ts +358 -0
- package/src/execution/ExecutionPipeline.ts +301 -0
- package/src/forms/FormEngine.ts +443 -0
- package/src/forms/field-type-registry.ts +1 -13
- package/src/forms/form-generator.ts +394 -237
- package/src/forms/types.ts +20 -3
- package/src/index.ts +6 -10
- package/src/langchain/FormAwareAgentExecutor.ts +653 -22
- package/src/langchain/FormValidatingToolWrapper.ts +216 -93
- package/src/langchain-agent.ts +924 -185
- package/src/mcp/ContentProcessor.ts +20 -4
- package/src/mcp/MCPClientManager.ts +1 -1
- package/src/mcp/adapters/langchain.ts +1 -1
- package/src/memory/ContentStorage.ts +25 -5
- package/src/memory/SmartMemoryManager.ts +27 -4
- package/src/memory/TokenCounter.ts +1 -1
- package/src/plugins/hbar/HbarPlugin.ts +0 -1
- package/src/scripts/test-external-tool-wrapper.ts +3 -12
- package/src/scripts/test-hedera-kit-wrapper.ts +6 -22
- package/src/scripts/test-inscribe-form-generation.ts +24 -42
- package/src/scripts/test-inscribe-wrapper-verification.ts +1 -7
- package/src/services/ContentStoreManager.ts +23 -9
- package/src/services/EntityResolver.ts +2 -9
- package/src/tools/EntityResolverTool.ts +5 -8
- package/src/utils/ResponseFormatter.ts +146 -0
- package/dist/cjs/examples/external-tool-wrapper-example.d.ts +0 -131
- package/dist/cjs/langchain/ContentAwareAgentExecutor.d.ts +0 -14
- package/dist/cjs/langchain/external-tool-wrapper.d.ts +0 -179
- package/dist/cjs/scripts/test-external-tool-wrapper.d.ts +0 -5
- package/dist/cjs/scripts/test-hedera-kit-wrapper.d.ts +0 -36
- package/dist/cjs/scripts/test-inscribe-form-generation.d.ts +0 -15
- package/dist/cjs/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
- package/dist/types/examples/external-tool-wrapper-example.d.ts +0 -131
- package/dist/types/langchain/ContentAwareAgentExecutor.d.ts +0 -14
- package/dist/types/langchain/external-tool-wrapper.d.ts +0 -179
- package/dist/types/scripts/test-external-tool-wrapper.d.ts +0 -5
- package/dist/types/scripts/test-hedera-kit-wrapper.d.ts +0 -36
- package/dist/types/scripts/test-inscribe-form-generation.d.ts +0 -15
- package/dist/types/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
- package/src/examples/external-tool-wrapper-example.ts +0 -227
- package/src/langchain/ContentAwareAgentExecutor.ts +0 -19
- package/src/langchain/external-tool-wrapper.ts +0 -486
package/dist/esm/index20.js
CHANGED
|
@@ -1,293 +1,117 @@
|
|
|
1
|
-
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
4
|
-
function isZodObjectLike(value) {
|
|
5
|
-
return value !== null && typeof value === "object" && "_def" in value && typeof value._def === "object" && value._def.typeName === "ZodObject" && "shape" in value._def;
|
|
6
|
-
}
|
|
7
|
-
class ExternalToolWrapper extends StructuredTool {
|
|
8
|
-
constructor(originalTool, config = {}) {
|
|
9
|
-
super();
|
|
10
|
-
this.originalTool = originalTool;
|
|
11
|
-
this.wrapperConfig = config;
|
|
12
|
-
this.logger = new Logger({ module: "ExternalToolWrapper" });
|
|
13
|
-
this.name = originalTool.name;
|
|
14
|
-
this.description = config.ui?.description || originalTool.description;
|
|
15
|
-
this.enhancedSchema = this.createEnhancedSchema(originalTool.schema, config);
|
|
16
|
-
this.schema = this.enhancedSchema;
|
|
17
|
-
this.logger.info(`Wrapped external tool: ${this.name}`, {
|
|
18
|
-
hasRenderConfig: !!config.renderConfig,
|
|
19
|
-
fieldConfigCount: Object.keys(config.fieldConfigs || {}).length,
|
|
20
|
-
preserveOriginal: config.preserveOriginalSchema
|
|
21
|
-
});
|
|
22
|
-
}
|
|
1
|
+
class ResponseFormatter {
|
|
23
2
|
/**
|
|
24
|
-
*
|
|
3
|
+
* Checks if a parsed response contains HashLink block data for interactive rendering
|
|
25
4
|
*/
|
|
26
|
-
|
|
27
|
-
if (!
|
|
28
|
-
|
|
29
|
-
return originalSchema;
|
|
30
|
-
}
|
|
31
|
-
try {
|
|
32
|
-
let enhancedSchema = originalSchema;
|
|
33
|
-
if (config.fieldConfigs && Object.keys(config.fieldConfigs).length > 0) {
|
|
34
|
-
enhancedSchema = this.addFieldRenderConfigs(enhancedSchema, config.fieldConfigs);
|
|
35
|
-
}
|
|
36
|
-
if (config.renderConfig) {
|
|
37
|
-
enhancedSchema = this.addToolRenderConfig(enhancedSchema, config.renderConfig);
|
|
38
|
-
}
|
|
39
|
-
return enhancedSchema;
|
|
40
|
-
} catch (error) {
|
|
41
|
-
this.logger.error("Failed to create enhanced schema:", error);
|
|
42
|
-
return originalSchema;
|
|
5
|
+
static isHashLinkResponse(parsed) {
|
|
6
|
+
if (!parsed || typeof parsed !== "object") {
|
|
7
|
+
return false;
|
|
43
8
|
}
|
|
9
|
+
const responseObj = parsed;
|
|
10
|
+
return !!(responseObj.success === true && responseObj.type === "inscription" && responseObj.hashLinkBlock && typeof responseObj.hashLinkBlock === "object");
|
|
44
11
|
}
|
|
45
12
|
/**
|
|
46
|
-
*
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
enhancedShape[fieldName] = enhancedFieldSchema;
|
|
13
|
+
* Formats HashLink block response with simple text confirmation
|
|
14
|
+
* HTML template rendering is handled by HashLinkBlockRenderer component via metadata
|
|
15
|
+
*/
|
|
16
|
+
static formatHashLinkResponse(parsed) {
|
|
17
|
+
const hashLinkBlock = parsed.hashLinkBlock;
|
|
18
|
+
const metadata = parsed.metadata || {};
|
|
19
|
+
const inscription = parsed.inscription || {};
|
|
20
|
+
let message = "ā
Interactive content created successfully!\n\n";
|
|
21
|
+
if (metadata.name) {
|
|
22
|
+
message += `**${metadata.name}**
|
|
23
|
+
`;
|
|
60
24
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
*/
|
|
66
|
-
addRenderConfigToField(fieldSchema, renderConfig) {
|
|
67
|
-
const enhanced = fieldSchema.describe(
|
|
68
|
-
fieldSchema.description || renderConfig.ui?.helpText || ""
|
|
69
|
-
);
|
|
70
|
-
enhanced._renderConfig = renderConfig;
|
|
71
|
-
return enhanced;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Adds tool-level render configuration to the schema
|
|
75
|
-
*/
|
|
76
|
-
addToolRenderConfig(schema, renderConfig) {
|
|
77
|
-
const enhanced = schema.describe(
|
|
78
|
-
schema.description || renderConfig.ui?.helpText || ""
|
|
79
|
-
);
|
|
80
|
-
enhanced._renderConfig = renderConfig;
|
|
81
|
-
return enhanced;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Override _call to delegate to the original tool
|
|
85
|
-
*/
|
|
86
|
-
async _call(input, runManager) {
|
|
87
|
-
this.logger.debug(`Delegating call to original tool: ${this.name}`, { input });
|
|
88
|
-
const tool = this.originalTool;
|
|
89
|
-
return tool._call(input, runManager);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
const renderConfigs = {
|
|
93
|
-
/**
|
|
94
|
-
* Text input field configuration
|
|
95
|
-
*/
|
|
96
|
-
text: (label, placeholder, helpText) => ({
|
|
97
|
-
fieldType: "text",
|
|
98
|
-
ui: {
|
|
99
|
-
label,
|
|
100
|
-
...placeholder && { placeholder },
|
|
101
|
-
...helpText && { helpText }
|
|
25
|
+
if (metadata.description) {
|
|
26
|
+
message += `${metadata.description}
|
|
27
|
+
|
|
28
|
+
`;
|
|
102
29
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
*/
|
|
107
|
-
number: (label, min, max, placeholder) => ({
|
|
108
|
-
fieldType: "number",
|
|
109
|
-
ui: {
|
|
110
|
-
label,
|
|
111
|
-
...placeholder && { placeholder }
|
|
112
|
-
},
|
|
113
|
-
...min !== void 0 || max !== void 0 ? {
|
|
114
|
-
constraints: {
|
|
115
|
-
...min !== void 0 && { min },
|
|
116
|
-
...max !== void 0 && { max }
|
|
117
|
-
}
|
|
118
|
-
} : {}
|
|
119
|
-
}),
|
|
120
|
-
/**
|
|
121
|
-
* Select dropdown field configuration
|
|
122
|
-
*/
|
|
123
|
-
select: (label, options, helpText) => ({
|
|
124
|
-
fieldType: "select",
|
|
125
|
-
ui: {
|
|
126
|
-
label,
|
|
127
|
-
...helpText && { helpText }
|
|
128
|
-
},
|
|
129
|
-
options
|
|
130
|
-
}),
|
|
131
|
-
/**
|
|
132
|
-
* Textarea field configuration
|
|
133
|
-
*/
|
|
134
|
-
textarea: (label, placeholder, maxLength) => ({
|
|
135
|
-
fieldType: "textarea",
|
|
136
|
-
ui: {
|
|
137
|
-
label,
|
|
138
|
-
...placeholder && { placeholder }
|
|
139
|
-
},
|
|
140
|
-
...maxLength !== void 0 ? {
|
|
141
|
-
constraints: {
|
|
142
|
-
maxLength
|
|
143
|
-
}
|
|
144
|
-
} : {}
|
|
145
|
-
}),
|
|
146
|
-
/**
|
|
147
|
-
* Checkbox field configuration
|
|
148
|
-
*/
|
|
149
|
-
checkbox: (label, helpText) => ({
|
|
150
|
-
fieldType: "checkbox",
|
|
151
|
-
ui: {
|
|
152
|
-
label,
|
|
153
|
-
...helpText && { helpText }
|
|
30
|
+
if (inscription.topicId || hashLinkBlock.attributes.topicId) {
|
|
31
|
+
message += `š **Topic ID:** ${inscription.topicId || hashLinkBlock.attributes.topicId}
|
|
32
|
+
`;
|
|
154
33
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
*/
|
|
159
|
-
currency: (label, currency = "HBAR", min, max) => ({
|
|
160
|
-
fieldType: "currency",
|
|
161
|
-
ui: {
|
|
162
|
-
label,
|
|
163
|
-
placeholder: `Amount in ${currency}`
|
|
164
|
-
},
|
|
165
|
-
...min !== void 0 || max !== void 0 ? {
|
|
166
|
-
constraints: {
|
|
167
|
-
...min !== void 0 && { min },
|
|
168
|
-
...max !== void 0 && { max }
|
|
169
|
-
}
|
|
170
|
-
} : {}
|
|
171
|
-
}),
|
|
172
|
-
/**
|
|
173
|
-
* Account ID field configuration
|
|
174
|
-
*/
|
|
175
|
-
accountId: (label = "Account ID") => ({
|
|
176
|
-
fieldType: "text",
|
|
177
|
-
ui: {
|
|
178
|
-
label,
|
|
179
|
-
placeholder: "0.0.123456",
|
|
180
|
-
helpText: "Hedera account ID in format 0.0.accountNum"
|
|
181
|
-
},
|
|
182
|
-
constraints: {
|
|
183
|
-
pattern: "^0\\.0\\.[0-9]+$"
|
|
34
|
+
if (inscription.hrl || hashLinkBlock.attributes.hrl) {
|
|
35
|
+
message += `š **HRL:** ${inscription.hrl || hashLinkBlock.attributes.hrl}
|
|
36
|
+
`;
|
|
184
37
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
*/
|
|
189
|
-
tokenId: (label = "Token ID") => ({
|
|
190
|
-
fieldType: "text",
|
|
191
|
-
ui: {
|
|
192
|
-
label,
|
|
193
|
-
placeholder: "0.0.789012",
|
|
194
|
-
helpText: "Hedera token ID in format 0.0.tokenNum"
|
|
195
|
-
},
|
|
196
|
-
constraints: {
|
|
197
|
-
pattern: "^0\\.0\\.[0-9]+$"
|
|
38
|
+
if (inscription.cdnUrl) {
|
|
39
|
+
message += `š **CDN URL:** ${inscription.cdnUrl}
|
|
40
|
+
`;
|
|
198
41
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
*/
|
|
203
|
-
privateKey: (label = "Private Key") => ({
|
|
204
|
-
fieldType: "text",
|
|
205
|
-
ui: {
|
|
206
|
-
label,
|
|
207
|
-
placeholder: "Enter private key",
|
|
208
|
-
helpText: "DER-encoded private key as hex string"
|
|
209
|
-
},
|
|
210
|
-
constraints: {
|
|
211
|
-
minLength: 64,
|
|
212
|
-
maxLength: 128
|
|
42
|
+
if (metadata.creator) {
|
|
43
|
+
message += `š¤ **Creator:** ${metadata.creator}
|
|
44
|
+
`;
|
|
213
45
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return new ExternalToolWrapper(tool, config);
|
|
218
|
-
}
|
|
219
|
-
function wrapExternalTools(tools) {
|
|
220
|
-
return tools.map(
|
|
221
|
-
({ tool, config = {} }) => wrapExternalToolWithRenderConfig(tool, config)
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
const hederaToolConfigs = {
|
|
46
|
+
message += "\nā” Interactive content will load below";
|
|
47
|
+
return message.trim();
|
|
48
|
+
}
|
|
225
49
|
/**
|
|
226
|
-
*
|
|
50
|
+
* Checks if a parsed response is an inscription response that needs formatting
|
|
227
51
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
description: "Transfer HBAR between accounts"
|
|
232
|
-
},
|
|
233
|
-
fieldConfigs: {
|
|
234
|
-
fromAccountId: renderConfigs.accountId("From Account"),
|
|
235
|
-
toAccountId: renderConfigs.accountId("To Account"),
|
|
236
|
-
amount: renderConfigs.currency("Amount", "HBAR", 1e-8),
|
|
237
|
-
memo: renderConfigs.text("Memo", "Optional memo", "Transaction memo (optional)")
|
|
52
|
+
static isInscriptionResponse(parsed) {
|
|
53
|
+
if (!parsed || typeof parsed !== "object") {
|
|
54
|
+
return false;
|
|
238
55
|
}
|
|
239
|
-
|
|
56
|
+
const responseObj = parsed;
|
|
57
|
+
return !!(responseObj.success === true && responseObj.type === "inscription" && responseObj.inscription && typeof responseObj.inscription === "object");
|
|
58
|
+
}
|
|
240
59
|
/**
|
|
241
|
-
*
|
|
242
|
-
*/
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
decimals: renderConfigs.number("Decimals", 0, 18),
|
|
254
|
-
memo: renderConfigs.textarea("Memo", "Token description")
|
|
60
|
+
* Formats inscription response into user-friendly message
|
|
61
|
+
*/
|
|
62
|
+
static formatInscriptionResponse(parsed) {
|
|
63
|
+
const inscription = parsed.inscription;
|
|
64
|
+
const metadata = parsed.metadata || {};
|
|
65
|
+
const title = parsed.title || "Inscription Complete";
|
|
66
|
+
let message = `ā
${title}
|
|
67
|
+
|
|
68
|
+
`;
|
|
69
|
+
if (metadata.name) {
|
|
70
|
+
message += `**${metadata.name}**
|
|
71
|
+
`;
|
|
255
72
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
73
|
+
if (metadata.description) {
|
|
74
|
+
message += `${metadata.description}
|
|
75
|
+
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
if (inscription.topicId) {
|
|
79
|
+
message += `š **Topic ID:** ${inscription.topicId}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
if (inscription.hrl) {
|
|
83
|
+
message += `š **HRL:** ${inscription.hrl}
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
if (inscription.cdnUrl) {
|
|
87
|
+
message += `š **CDN URL:** ${inscription.cdnUrl}
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
if (metadata.creator) {
|
|
91
|
+
message += `š¤ **Creator:** ${metadata.creator}
|
|
92
|
+
`;
|
|
269
93
|
}
|
|
270
|
-
|
|
94
|
+
return message.trim();
|
|
95
|
+
}
|
|
271
96
|
/**
|
|
272
|
-
*
|
|
97
|
+
* Main formatting method that determines the best response format
|
|
273
98
|
*/
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
99
|
+
static formatResponse(toolOutput) {
|
|
100
|
+
try {
|
|
101
|
+
const parsed = JSON.parse(toolOutput);
|
|
102
|
+
if (ResponseFormatter.isHashLinkResponse(parsed)) {
|
|
103
|
+
return ResponseFormatter.formatHashLinkResponse(parsed);
|
|
104
|
+
}
|
|
105
|
+
if (ResponseFormatter.isInscriptionResponse(parsed)) {
|
|
106
|
+
return ResponseFormatter.formatInscriptionResponse(parsed);
|
|
107
|
+
}
|
|
108
|
+
return toolOutput;
|
|
109
|
+
} catch {
|
|
110
|
+
return toolOutput;
|
|
283
111
|
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
286
114
|
export {
|
|
287
|
-
|
|
288
|
-
hederaToolConfigs,
|
|
289
|
-
renderConfigs,
|
|
290
|
-
wrapExternalToolWithRenderConfig,
|
|
291
|
-
wrapExternalTools
|
|
115
|
+
ResponseFormatter
|
|
292
116
|
};
|
|
293
117
|
//# sourceMappingURL=index20.js.map
|
package/dist/esm/index20.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index20.js","sources":["../../src/langchain/external-tool-wrapper.ts"],"sourcesContent":["import { StructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { RenderConfigSchema } from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Configuration for wrapping external tools with render configs\n */\nexport interface ExternalToolWrapperConfig {\n renderConfig?: RenderConfigSchema;\n fieldConfigs?: Record<string, RenderConfigSchema>;\n ui?: {\n label?: string;\n description?: string;\n };\n preserveOriginalSchema?: boolean;\n}\n\n/**\n * Type guard to check if a value is a ZodObject\n */\nfunction isZodObjectLike(value: unknown): value is z.ZodObject<z.ZodRawShape> {\n return (\n value !== null &&\n typeof value === 'object' &&\n '_def' in value &&\n typeof (value as any)._def === 'object' &&\n (value as any)._def.typeName === 'ZodObject' &&\n 'shape' in (value as any)._def\n );\n}\n\n/**\n * Wrapper class that adds render configs to external tools\n */\nexport class ExternalToolWrapper<\n TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>\n> extends StructuredTool<TSchema> {\n private originalTool: StructuredTool<TSchema>;\n private wrapperConfig: ExternalToolWrapperConfig;\n private logger: Logger;\n private enhancedSchema: TSchema;\n\n name: string;\n description: string;\n schema: TSchema;\n\n constructor(\n originalTool: StructuredTool<TSchema>,\n config: ExternalToolWrapperConfig = {}\n ) {\n super();\n this.originalTool = originalTool;\n this.wrapperConfig = config;\n this.logger = new Logger({ module: 'ExternalToolWrapper' });\n\n this.name = originalTool.name;\n this.description = config.ui?.description || originalTool.description;\n \n // Create enhanced schema with render configs\n this.enhancedSchema = this.createEnhancedSchema(originalTool.schema, config);\n this.schema = this.enhancedSchema;\n\n this.logger.info(`Wrapped external tool: ${this.name}`, {\n hasRenderConfig: !!config.renderConfig,\n fieldConfigCount: Object.keys(config.fieldConfigs || {}).length,\n preserveOriginal: config.preserveOriginalSchema\n });\n }\n\n /**\n * Creates an enhanced schema with render configurations\n */\n private createEnhancedSchema(\n originalSchema: TSchema,\n config: ExternalToolWrapperConfig\n ): TSchema {\n if (!isZodObjectLike(originalSchema)) {\n this.logger.warn('Original schema is not a ZodObject, returning as-is');\n return originalSchema;\n }\n\n try {\n // Start with the original schema\n let enhancedSchema = originalSchema;\n\n // Add field-level render configs\n if (config.fieldConfigs && Object.keys(config.fieldConfigs).length > 0) {\n enhancedSchema = this.addFieldRenderConfigs(enhancedSchema, config.fieldConfigs);\n }\n\n // Add tool-level render config\n if (config.renderConfig) {\n enhancedSchema = this.addToolRenderConfig(enhancedSchema, config.renderConfig);\n }\n\n return enhancedSchema;\n } catch (error) {\n this.logger.error('Failed to create enhanced schema:', error);\n return originalSchema;\n }\n }\n\n /**\n * Adds field-level render configurations to the schema\n */\n private addFieldRenderConfigs(\n schema: TSchema,\n fieldConfigs: Record<string, RenderConfigSchema>\n ): TSchema {\n const originalShape = (schema as any)._def.shape();\n const enhancedShape: Record<string, z.ZodTypeAny> = {};\n\n // Copy all original fields\n for (const [fieldName, fieldSchema] of Object.entries(originalShape)) {\n let enhancedFieldSchema = fieldSchema as z.ZodTypeAny;\n\n // Add render config if provided for this field\n if (fieldConfigs[fieldName]) {\n enhancedFieldSchema = this.addRenderConfigToField(\n fieldSchema as z.ZodTypeAny,\n fieldConfigs[fieldName]\n );\n }\n\n enhancedShape[fieldName] = enhancedFieldSchema;\n }\n\n // Create new ZodObject with enhanced shape\n return z.object(enhancedShape) as TSchema;\n }\n\n /**\n * Adds render configuration to a specific field\n */\n private addRenderConfigToField(\n fieldSchema: z.ZodTypeAny,\n renderConfig: RenderConfigSchema\n ): z.ZodTypeAny {\n // Clone the field schema and add render config\n const enhanced = fieldSchema.describe(\n fieldSchema.description || renderConfig.ui?.helpText || ''\n );\n\n // Attach render config as a custom property\n (enhanced as any)._renderConfig = renderConfig;\n\n return enhanced;\n }\n\n /**\n * Adds tool-level render configuration to the schema\n */\n private addToolRenderConfig(\n schema: TSchema,\n renderConfig: RenderConfigSchema\n ): TSchema {\n // Clone the schema and add tool-level render config\n const enhanced = schema.describe(\n schema.description || renderConfig.ui?.helpText || ''\n );\n\n // Attach render config as a custom property\n (enhanced as any)._renderConfig = renderConfig;\n\n return enhanced;\n }\n\n /**\n * Override _call to delegate to the original tool\n */\n protected async _call(\n input: z.infer<TSchema>,\n runManager?: CallbackManagerForToolRun\n ): Promise<string> {\n this.logger.debug(`Delegating call to original tool: ${this.name}`, { input });\n\n // Delegate to the original tool\n const tool = this.originalTool as any;\n return tool._call(input, runManager) as Promise<string>;\n }\n}\n\n/**\n * Predefined render config helpers for common field types\n */\nexport const renderConfigs = {\n /**\n * Text input field configuration\n */\n text: (label: string, placeholder?: string, helpText?: string): RenderConfigSchema => ({\n fieldType: 'text',\n ui: {\n label,\n ...(placeholder && { placeholder }),\n ...(helpText && { helpText })\n }\n }),\n\n /**\n * Number input field configuration\n */\n number: (\n label: string,\n min?: number,\n max?: number,\n placeholder?: string\n ): RenderConfigSchema => ({\n fieldType: 'number',\n ui: {\n label,\n ...(placeholder && { placeholder })\n },\n ...(min !== undefined || max !== undefined ? {\n constraints: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max })\n }\n } : {})\n }),\n\n /**\n * Select dropdown field configuration\n */\n select: (\n label: string,\n options: Array<{ value: string | number; label: string; disabled?: boolean }>,\n helpText?: string\n ): RenderConfigSchema => ({\n fieldType: 'select',\n ui: {\n label,\n ...(helpText && { helpText })\n },\n options\n }),\n\n /**\n * Textarea field configuration\n */\n textarea: (\n label: string,\n placeholder?: string,\n maxLength?: number\n ): RenderConfigSchema => ({\n fieldType: 'textarea',\n ui: {\n label,\n ...(placeholder && { placeholder })\n },\n ...(maxLength !== undefined ? {\n constraints: {\n maxLength\n }\n } : {})\n }),\n\n /**\n * Checkbox field configuration\n */\n checkbox: (label: string, helpText?: string): RenderConfigSchema => ({\n fieldType: 'checkbox',\n ui: {\n label,\n ...(helpText && { helpText })\n }\n }),\n\n /**\n * Currency field configuration\n */\n currency: (\n label: string,\n currency = 'HBAR',\n min?: number,\n max?: number\n ): RenderConfigSchema => ({\n fieldType: 'currency',\n ui: {\n label,\n placeholder: `Amount in ${currency}`\n },\n ...(min !== undefined || max !== undefined ? {\n constraints: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max })\n }\n } : {})\n }),\n\n /**\n * Account ID field configuration\n */\n accountId: (label: string = 'Account ID'): RenderConfigSchema => ({\n fieldType: 'text',\n ui: {\n label,\n placeholder: '0.0.123456',\n helpText: 'Hedera account ID in format 0.0.accountNum'\n },\n constraints: {\n pattern: '^0\\\\.0\\\\.[0-9]+$'\n }\n }),\n\n /**\n * Token ID field configuration\n */\n tokenId: (label: string = 'Token ID'): RenderConfigSchema => ({\n fieldType: 'text',\n ui: {\n label,\n placeholder: '0.0.789012',\n helpText: 'Hedera token ID in format 0.0.tokenNum'\n },\n constraints: {\n pattern: '^0\\\\.0\\\\.[0-9]+$'\n }\n }),\n\n /**\n * Private key field configuration\n */\n privateKey: (label: string = 'Private Key'): RenderConfigSchema => ({\n fieldType: 'text',\n ui: {\n label,\n placeholder: 'Enter private key',\n helpText: 'DER-encoded private key as hex string'\n },\n constraints: {\n minLength: 64,\n maxLength: 128\n }\n })\n};\n\n/**\n * Wraps an external tool with render configurations\n * \n * @param tool The external StructuredTool to wrap\n * @param config Configuration for render configs and UI\n * @returns Enhanced tool with render configurations\n * \n * @example\n * ```typescript\n * import { SomeHederaTool } from 'hedera-agent-kit';\n * \n * const externalTool = new SomeHederaTool();\n * const wrappedTool = wrapExternalToolWithRenderConfig(externalTool, {\n * renderConfig: {\n * fieldType: 'form',\n * ui: { label: 'Transfer HBAR', description: 'Transfer HBAR between accounts' }\n * },\n * fieldConfigs: {\n * fromAccountId: renderConfigs.accountId('From Account'),\n * toAccountId: renderConfigs.accountId('To Account'),\n * amount: renderConfigs.currency('Amount', 'HBAR', 0.00000001),\n * memo: renderConfigs.text('Memo', 'Optional memo', 'Transaction memo (optional)')\n * }\n * });\n * ```\n */\nexport function wrapExternalToolWithRenderConfig<\n TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>\n>(\n tool: StructuredTool<TSchema>,\n config: ExternalToolWrapperConfig = {}\n): ExternalToolWrapper<TSchema> {\n return new ExternalToolWrapper(tool, config);\n}\n\n/**\n * Batch wrapper for multiple external tools\n * \n * @param tools Array of tools with their configurations\n * @returns Array of wrapped tools\n * \n * @example\n * ```typescript\n * const wrappedTools = wrapExternalTools([\n * {\n * tool: new TransferHbarTool(),\n * config: {\n * fieldConfigs: {\n * fromAccountId: renderConfigs.accountId('From Account'),\n * toAccountId: renderConfigs.accountId('To Account'),\n * amount: renderConfigs.currency('Amount', 'HBAR')\n * }\n * }\n * },\n * {\n * tool: new CreateTokenTool(),\n * config: {\n * fieldConfigs: {\n * treasuryAccountId: renderConfigs.accountId('Treasury Account'),\n * tokenName: renderConfigs.text('Token Name'),\n * tokenSymbol: renderConfigs.text('Token Symbol')\n * }\n * }\n * }\n * ]);\n * ```\n */\nexport function wrapExternalTools<\n TSchema extends z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny>\n>(\n tools: Array<{\n tool: StructuredTool<TSchema>;\n config?: ExternalToolWrapperConfig;\n }>\n): ExternalToolWrapper<TSchema>[] {\n return tools.map(({ tool, config = {} }) =>\n wrapExternalToolWithRenderConfig(tool, config)\n );\n}\n\n/**\n * Configuration preset for common Hedera tools\n */\nexport const hederaToolConfigs = {\n /**\n * Standard configuration for HBAR transfer tools\n */\n hbarTransfer: (): ExternalToolWrapperConfig => ({\n ui: {\n label: 'Transfer HBAR',\n description: 'Transfer HBAR between accounts'\n },\n fieldConfigs: {\n fromAccountId: renderConfigs.accountId('From Account'),\n toAccountId: renderConfigs.accountId('To Account'),\n amount: renderConfigs.currency('Amount', 'HBAR', 0.00000001),\n memo: renderConfigs.text('Memo', 'Optional memo', 'Transaction memo (optional)')\n }\n }),\n\n /**\n * Standard configuration for token creation tools\n */\n tokenCreation: (): ExternalToolWrapperConfig => ({\n ui: {\n label: 'Create Token',\n description: 'Create a new Hedera token'\n },\n fieldConfigs: {\n treasuryAccountId: renderConfigs.accountId('Treasury Account'),\n tokenName: renderConfigs.text('Token Name', 'My Token'),\n tokenSymbol: renderConfigs.text('Token Symbol', 'MTK'),\n maxSupply: renderConfigs.number('Max Supply', 1, Number.MAX_SAFE_INTEGER),\n decimals: renderConfigs.number('Decimals', 0, 18),\n memo: renderConfigs.textarea('Memo', 'Token description')\n }\n }),\n\n /**\n * Standard configuration for account creation tools\n */\n accountCreation: (): ExternalToolWrapperConfig => ({\n ui: {\n label: 'Create Account',\n description: 'Create a new Hedera account'\n },\n fieldConfigs: {\n publicKey: renderConfigs.text('Public Key', 'ED25519 public key'),\n initialBalance: renderConfigs.currency('Initial Balance', 'HBAR', 0),\n memo: renderConfigs.text('Memo', 'Account memo', 'Optional account memo')\n }\n }),\n\n /**\n * Standard configuration for smart contract tools\n */\n smartContract: (): ExternalToolWrapperConfig => ({\n ui: {\n label: 'Smart Contract',\n description: 'Deploy or call smart contract'\n },\n fieldConfigs: {\n contractId: renderConfigs.text('Contract ID', '0.0.123456'),\n gas: renderConfigs.number('Gas Limit', 1000, 1000000),\n payableAmount: renderConfigs.currency('Payable Amount', 'HBAR', 0)\n }\n })\n};"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index20.js","sources":["../../src/utils/ResponseFormatter.ts"],"sourcesContent":["/**\n * HCS-12 HashLink block structure for interactive content rendering\n */\ninterface HCS12BlockResult {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\n/**\n * Utility class for formatting tool responses into user-friendly messages\n */\nexport class ResponseFormatter {\n /**\n * Checks if a parsed response contains HashLink block data for interactive rendering\n */\n static isHashLinkResponse(parsed: unknown): boolean {\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n\n const responseObj = parsed as Record<string, unknown>;\n return !!(\n responseObj.success === true &&\n responseObj.type === 'inscription' &&\n responseObj.hashLinkBlock &&\n typeof responseObj.hashLinkBlock === 'object'\n );\n }\n\n /**\n * Formats HashLink block response with simple text confirmation\n * HTML template rendering is handled by HashLinkBlockRenderer component via metadata\n */\n static formatHashLinkResponse(parsed: Record<string, unknown>): string {\n const hashLinkBlock = parsed.hashLinkBlock as HCS12BlockResult;\n const metadata = parsed.metadata as Record<string, unknown> || {};\n const inscription = parsed.inscription as Record<string, unknown> || {};\n\n let message = 'ā
Interactive content created successfully!\\n\\n';\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n if (inscription.topicId || hashLinkBlock.attributes.topicId) {\n message += `š **Topic ID:** ${inscription.topicId || hashLinkBlock.attributes.topicId}\\n`;\n }\n\n if (inscription.hrl || hashLinkBlock.attributes.hrl) {\n message += `š **HRL:** ${inscription.hrl || hashLinkBlock.attributes.hrl}\\n`;\n }\n\n if (inscription.cdnUrl) {\n message += `š **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `š¤ **Creator:** ${metadata.creator}\\n`;\n }\n\n message += '\\nā” Interactive content will load below';\n\n return message.trim();\n }\n\n /**\n * Checks if a parsed response is an inscription response that needs formatting\n */\n static isInscriptionResponse(parsed: unknown): boolean {\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n\n const responseObj = parsed as Record<string, unknown>;\n return !!(\n responseObj.success === true &&\n responseObj.type === 'inscription' &&\n responseObj.inscription &&\n typeof responseObj.inscription === 'object'\n );\n }\n\n /**\n * Formats inscription response into user-friendly message\n */\n static formatInscriptionResponse(parsed: Record<string, unknown>): string {\n const inscription = parsed.inscription as Record<string, unknown>;\n const metadata = parsed.metadata as Record<string, unknown> || {};\n const title = parsed.title as string || 'Inscription Complete';\n\n let message = `ā
${title}\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n if (inscription.topicId) {\n message += `š **Topic ID:** ${inscription.topicId}\\n`;\n }\n\n if (inscription.hrl) {\n message += `š **HRL:** ${inscription.hrl}\\n`;\n }\n\n if (inscription.cdnUrl) {\n message += `š **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `š¤ **Creator:** ${metadata.creator}\\n`;\n }\n\n return message.trim();\n }\n\n /**\n * Main formatting method that determines the best response format\n */\n static formatResponse(toolOutput: string): string {\n try {\n const parsed = JSON.parse(toolOutput);\n \n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n return ResponseFormatter.formatHashLinkResponse(parsed);\n }\n \n if (ResponseFormatter.isInscriptionResponse(parsed)) {\n return ResponseFormatter.formatInscriptionResponse(parsed);\n }\n \n return toolOutput;\n } catch {\n return toolOutput;\n }\n }\n}"],"names":[],"mappings":"AAaO,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAI7B,OAAO,mBAAmB,QAA0B;AAClD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AACpB,WAAO,CAAC,EACN,YAAY,YAAY,QACxB,YAAY,SAAS,iBACrB,YAAY,iBACZ,OAAO,YAAY,kBAAkB;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,uBAAuB,QAAyC;AACrE,UAAM,gBAAgB,OAAO;AAC7B,UAAM,WAAW,OAAO,YAAuC,CAAA;AAC/D,UAAM,cAAc,OAAO,eAA0C,CAAA;AAErE,QAAI,UAAU;AAEd,QAAI,SAAS,MAAM;AACjB,iBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,IAC/B;AAEA,QAAI,SAAS,aAAa;AACxB,iBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,IACpC;AAEA,QAAI,YAAY,WAAW,cAAc,WAAW,SAAS;AAC3D,iBAAW,oBAAoB,YAAY,WAAW,cAAc,WAAW,OAAO;AAAA;AAAA,IACxF;AAEA,QAAI,YAAY,OAAO,cAAc,WAAW,KAAK;AACnD,iBAAW,eAAe,YAAY,OAAO,cAAc,WAAW,GAAG;AAAA;AAAA,IAC3E;AAEA,QAAI,YAAY,QAAQ;AACtB,iBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,IAClD;AAEA,QAAI,SAAS,SAAS;AACpB,iBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,IAChD;AAEA,eAAW;AAEX,WAAO,QAAQ,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAsB,QAA0B;AACrD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc;AACpB,WAAO,CAAC,EACN,YAAY,YAAY,QACxB,YAAY,SAAS,iBACrB,YAAY,eACZ,OAAO,YAAY,gBAAgB;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,0BAA0B,QAAyC;AACxE,UAAM,cAAc,OAAO;AAC3B,UAAM,WAAW,OAAO,YAAuC,CAAA;AAC/D,UAAM,QAAQ,OAAO,SAAmB;AAExC,QAAI,UAAU,KAAK,KAAK;AAAA;AAAA;AAExB,QAAI,SAAS,MAAM;AACjB,iBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,IAC/B;AAEA,QAAI,SAAS,aAAa;AACxB,iBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,IACpC;AAEA,QAAI,YAAY,SAAS;AACvB,iBAAW,oBAAoB,YAAY,OAAO;AAAA;AAAA,IACpD;AAEA,QAAI,YAAY,KAAK;AACnB,iBAAW,eAAe,YAAY,GAAG;AAAA;AAAA,IAC3C;AAEA,QAAI,YAAY,QAAQ;AACtB,iBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,IAClD;AAEA,QAAI,SAAS,SAAS;AACpB,iBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,IAChD;AAEA,WAAO,QAAQ,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,YAA4B;AAChD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU;AAEpC,UAAI,kBAAkB,mBAAmB,MAAM,GAAG;AAChD,eAAO,kBAAkB,uBAAuB,MAAM;AAAA,MACxD;AAEA,UAAI,kBAAkB,sBAAsB,MAAM,GAAG;AACnD,eAAO,kBAAkB,0BAA0B,MAAM;AAAA,MAC3D;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;"}
|
package/dist/esm/index21.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { AccountBuilder } from "./
|
|
2
|
+
import { AccountBuilder } from "./index33.js";
|
|
3
3
|
import { BaseHederaTransactionTool } from "hedera-agent-kit";
|
|
4
4
|
const HbarTransferInputSchema = z.object({
|
|
5
5
|
accountId: z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),
|
package/dist/esm/index23.js
CHANGED
|
@@ -6,6 +6,20 @@ You have access to tools for:
|
|
|
6
6
|
- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions
|
|
7
7
|
- Hedera Token Service (HTS): creating tokens, transferring tokens, airdropping tokens, and managing token operations
|
|
8
8
|
|
|
9
|
+
*** CRITICAL NFT METADATA RULES ***
|
|
10
|
+
When creating NFT inscriptions (Hashinals), NEVER auto-generate meaningless technical attributes like:
|
|
11
|
+
- "File Type": "image/jpeg" (technical metadata, not valuable to collectors)
|
|
12
|
+
- "Origin": "User Upload" (meaningless for NFT traits)
|
|
13
|
+
- "MIME Type", "Source", "Upload Source", etc. (all technical, not collectible traits)
|
|
14
|
+
|
|
15
|
+
Instead, if the user hasn't provided meaningful NFT attributes, use the form generation system to ask them for proper metadata like:
|
|
16
|
+
- Rarity traits (Common, Rare, Epic, Legendary)
|
|
17
|
+
- Visual attributes (Color, Style, Background, Theme)
|
|
18
|
+
- Collection-specific traits (Power Level, Element, Character Type, etc.)
|
|
19
|
+
- Edition information (Series, Variant, Special Edition)
|
|
20
|
+
|
|
21
|
+
Quality NFT metadata enhances collectibility and value. Technical file information does not.
|
|
22
|
+
|
|
9
23
|
*** IMPORTANT CONTEXT ***
|
|
10
24
|
You are currently operating as agent: ${accountId} on the Hashgraph Online network
|
|
11
25
|
When users ask about "my profile", "my account", "my connections", etc., use this account ID: ${accountId}
|
package/dist/esm/index23.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index23.js","sources":["../../src/config/system-message.ts"],"sourcesContent":["export const getSystemMessage = (\n accountId: string\n): string => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, content inscription, and Hedera Hashgraph operations.\n\nYou have access to tools for:\n- HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages\n- HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents\n- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions\n- Hedera Token Service (HTS): creating tokens, transferring tokens, airdropping tokens, and managing token operations\n\n*** IMPORTANT CONTEXT ***\nYou are currently operating as agent: ${accountId} on the Hashgraph Online network\nWhen users ask about \"my profile\", \"my account\", \"my connections\", etc., use this account ID: ${accountId}\n\n*** CRITICAL ENTITY HANDLING RULES ***\n- When users refer to entities (tokens, topics, accounts) with pronouns like \"it\", \"that\", \"the token/topic\", etc., ALWAYS use the most recently created entity of that type\n- Entity IDs look like \"0.0.XXXXXX\" and are stored in memory after creation\n- NEVER use example or placeholder IDs like \"0.0.123456\" - always use actual created entity IDs\n- Account ID ${accountId} is NOT a token - tokens and accounts are different entities\n\nRemember the connection numbers when listing connections, as users might refer to them.`;\n"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,CAC9B,cACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index23.js","sources":["../../src/config/system-message.ts"],"sourcesContent":["export const getSystemMessage = (\n accountId: string\n): string => `You are a helpful assistant managing Hashgraph Online HCS-10 connections, messages, HCS-2 registries, content inscription, and Hedera Hashgraph operations.\n\nYou have access to tools for:\n- HCS-10: registering agents, finding registered agents, initiating connections, listing active connections, sending messages over connections, and checking for new messages\n- HCS-2: creating registries, registering entries, updating entries, deleting entries, migrating registries, and querying registry contents\n- Inscription: inscribing content from URLs, files, or buffers, creating Hashinal NFTs, and retrieving inscriptions\n- Hedera Token Service (HTS): creating tokens, transferring tokens, airdropping tokens, and managing token operations\n\n*** CRITICAL NFT METADATA RULES ***\nWhen creating NFT inscriptions (Hashinals), NEVER auto-generate meaningless technical attributes like:\n- \"File Type\": \"image/jpeg\" (technical metadata, not valuable to collectors)\n- \"Origin\": \"User Upload\" (meaningless for NFT traits)\n- \"MIME Type\", \"Source\", \"Upload Source\", etc. (all technical, not collectible traits)\n\nInstead, if the user hasn't provided meaningful NFT attributes, use the form generation system to ask them for proper metadata like:\n- Rarity traits (Common, Rare, Epic, Legendary)\n- Visual attributes (Color, Style, Background, Theme)\n- Collection-specific traits (Power Level, Element, Character Type, etc.)\n- Edition information (Series, Variant, Special Edition)\n\nQuality NFT metadata enhances collectibility and value. Technical file information does not.\n\n*** IMPORTANT CONTEXT ***\nYou are currently operating as agent: ${accountId} on the Hashgraph Online network\nWhen users ask about \"my profile\", \"my account\", \"my connections\", etc., use this account ID: ${accountId}\n\n*** CRITICAL ENTITY HANDLING RULES ***\n- When users refer to entities (tokens, topics, accounts) with pronouns like \"it\", \"that\", \"the token/topic\", etc., ALWAYS use the most recently created entity of that type\n- Entity IDs look like \"0.0.XXXXXX\" and are stored in memory after creation\n- NEVER use example or placeholder IDs like \"0.0.123456\" - always use actual created entity IDs\n- Account ID ${accountId} is NOT a token - tokens and accounts are different entities\n\nRemember the connection numbers when listing connections, as users might refer to them.`;\n"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,CAC9B,cACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAuB2B,SAAS;AAAA,gGAC+C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM1F,SAAS;AAAA;AAAA;"}
|