@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.
Files changed (123) hide show
  1. package/dist/cjs/conversational-agent.d.ts +8 -0
  2. package/dist/cjs/core/ToolRegistry.d.ts +130 -0
  3. package/dist/cjs/execution/ExecutionPipeline.d.ts +81 -0
  4. package/dist/cjs/forms/FormEngine.d.ts +121 -0
  5. package/dist/cjs/forms/form-generator.d.ts +39 -2
  6. package/dist/cjs/forms/types.d.ts +21 -2
  7. package/dist/cjs/index.cjs +1 -1
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/index.d.ts +3 -4
  10. package/dist/cjs/langchain/FormAwareAgentExecutor.d.ts +53 -4
  11. package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +43 -6
  12. package/dist/cjs/langchain-agent.d.ts +49 -0
  13. package/dist/cjs/memory/ContentStorage.d.ts +7 -0
  14. package/dist/cjs/memory/SmartMemoryManager.d.ts +1 -0
  15. package/dist/cjs/services/ContentStoreManager.d.ts +11 -1
  16. package/dist/cjs/utils/ResponseFormatter.d.ts +26 -0
  17. package/dist/esm/index.js +2 -6
  18. package/dist/esm/index12.js +1 -1
  19. package/dist/esm/index12.js.map +1 -1
  20. package/dist/esm/index14.js +23 -5
  21. package/dist/esm/index14.js.map +1 -1
  22. package/dist/esm/index15.js +25 -4
  23. package/dist/esm/index15.js.map +1 -1
  24. package/dist/esm/index16.js +4 -2
  25. package/dist/esm/index16.js.map +1 -1
  26. package/dist/esm/index17.js +2 -7
  27. package/dist/esm/index17.js.map +1 -1
  28. package/dist/esm/index18.js +292 -150
  29. package/dist/esm/index18.js.map +1 -1
  30. package/dist/esm/index19.js +158 -65
  31. package/dist/esm/index19.js.map +1 -1
  32. package/dist/esm/index20.js +94 -270
  33. package/dist/esm/index20.js.map +1 -1
  34. package/dist/esm/index21.js +1 -1
  35. package/dist/esm/index23.js +14 -0
  36. package/dist/esm/index23.js.map +1 -1
  37. package/dist/esm/index24.js +508 -12
  38. package/dist/esm/index24.js.map +1 -1
  39. package/dist/esm/index25.js +1 -1
  40. package/dist/esm/index25.js.map +1 -1
  41. package/dist/esm/index26.js +1 -1
  42. package/dist/esm/index26.js.map +1 -1
  43. package/dist/esm/index27.js +189 -128
  44. package/dist/esm/index27.js.map +1 -1
  45. package/dist/esm/index28.js +164 -45
  46. package/dist/esm/index28.js.map +1 -1
  47. package/dist/esm/index29.js +302 -24
  48. package/dist/esm/index29.js.map +1 -1
  49. package/dist/esm/index30.js +144 -80
  50. package/dist/esm/index30.js.map +1 -1
  51. package/dist/esm/index31.js +63 -7
  52. package/dist/esm/index31.js.map +1 -1
  53. package/dist/esm/index32.js +24 -236
  54. package/dist/esm/index32.js.map +1 -1
  55. package/dist/esm/index33.js +95 -0
  56. package/dist/esm/index33.js.map +1 -0
  57. package/dist/esm/index34.js +245 -0
  58. package/dist/esm/index34.js.map +1 -0
  59. package/dist/esm/index5.js.map +1 -1
  60. package/dist/esm/index6.js +61 -22
  61. package/dist/esm/index6.js.map +1 -1
  62. package/dist/esm/index8.js +653 -131
  63. package/dist/esm/index8.js.map +1 -1
  64. package/dist/types/conversational-agent.d.ts +8 -0
  65. package/dist/types/core/ToolRegistry.d.ts +130 -0
  66. package/dist/types/execution/ExecutionPipeline.d.ts +81 -0
  67. package/dist/types/forms/FormEngine.d.ts +121 -0
  68. package/dist/types/forms/form-generator.d.ts +39 -2
  69. package/dist/types/forms/types.d.ts +21 -2
  70. package/dist/types/index.d.ts +3 -4
  71. package/dist/types/langchain/FormAwareAgentExecutor.d.ts +53 -4
  72. package/dist/types/langchain/FormValidatingToolWrapper.d.ts +43 -6
  73. package/dist/types/langchain-agent.d.ts +49 -0
  74. package/dist/types/memory/ContentStorage.d.ts +7 -0
  75. package/dist/types/memory/SmartMemoryManager.d.ts +1 -0
  76. package/dist/types/services/ContentStoreManager.d.ts +11 -1
  77. package/dist/types/utils/ResponseFormatter.d.ts +26 -0
  78. package/package.json +13 -10
  79. package/src/config/system-message.ts +14 -0
  80. package/src/context/ReferenceContextManager.ts +1 -1
  81. package/src/conversational-agent.ts +91 -36
  82. package/src/core/ToolRegistry.ts +358 -0
  83. package/src/execution/ExecutionPipeline.ts +301 -0
  84. package/src/forms/FormEngine.ts +443 -0
  85. package/src/forms/field-type-registry.ts +1 -13
  86. package/src/forms/form-generator.ts +394 -237
  87. package/src/forms/types.ts +20 -3
  88. package/src/index.ts +6 -10
  89. package/src/langchain/FormAwareAgentExecutor.ts +653 -22
  90. package/src/langchain/FormValidatingToolWrapper.ts +216 -93
  91. package/src/langchain-agent.ts +924 -185
  92. package/src/mcp/ContentProcessor.ts +20 -4
  93. package/src/mcp/MCPClientManager.ts +1 -1
  94. package/src/mcp/adapters/langchain.ts +1 -1
  95. package/src/memory/ContentStorage.ts +25 -5
  96. package/src/memory/SmartMemoryManager.ts +27 -4
  97. package/src/memory/TokenCounter.ts +1 -1
  98. package/src/plugins/hbar/HbarPlugin.ts +0 -1
  99. package/src/scripts/test-external-tool-wrapper.ts +3 -12
  100. package/src/scripts/test-hedera-kit-wrapper.ts +6 -22
  101. package/src/scripts/test-inscribe-form-generation.ts +24 -42
  102. package/src/scripts/test-inscribe-wrapper-verification.ts +1 -7
  103. package/src/services/ContentStoreManager.ts +23 -9
  104. package/src/services/EntityResolver.ts +2 -9
  105. package/src/tools/EntityResolverTool.ts +5 -8
  106. package/src/utils/ResponseFormatter.ts +146 -0
  107. package/dist/cjs/examples/external-tool-wrapper-example.d.ts +0 -131
  108. package/dist/cjs/langchain/ContentAwareAgentExecutor.d.ts +0 -14
  109. package/dist/cjs/langchain/external-tool-wrapper.d.ts +0 -179
  110. package/dist/cjs/scripts/test-external-tool-wrapper.d.ts +0 -5
  111. package/dist/cjs/scripts/test-hedera-kit-wrapper.d.ts +0 -36
  112. package/dist/cjs/scripts/test-inscribe-form-generation.d.ts +0 -15
  113. package/dist/cjs/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
  114. package/dist/types/examples/external-tool-wrapper-example.d.ts +0 -131
  115. package/dist/types/langchain/ContentAwareAgentExecutor.d.ts +0 -14
  116. package/dist/types/langchain/external-tool-wrapper.d.ts +0 -179
  117. package/dist/types/scripts/test-external-tool-wrapper.d.ts +0 -5
  118. package/dist/types/scripts/test-hedera-kit-wrapper.d.ts +0 -36
  119. package/dist/types/scripts/test-inscribe-form-generation.d.ts +0 -15
  120. package/dist/types/scripts/test-inscribe-wrapper-verification.d.ts +0 -13
  121. package/src/examples/external-tool-wrapper-example.ts +0 -227
  122. package/src/langchain/ContentAwareAgentExecutor.ts +0 -19
  123. package/src/langchain/external-tool-wrapper.ts +0 -486
@@ -1,293 +1,117 @@
1
- import { StructuredTool } from "@langchain/core/tools";
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
- * Creates an enhanced schema with render configurations
3
+ * Checks if a parsed response contains HashLink block data for interactive rendering
25
4
  */
26
- createEnhancedSchema(originalSchema, config) {
27
- if (!isZodObjectLike(originalSchema)) {
28
- this.logger.warn("Original schema is not a ZodObject, returning as-is");
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
- * Adds field-level render configurations to the schema
47
- */
48
- addFieldRenderConfigs(schema, fieldConfigs) {
49
- const originalShape = schema._def.shape();
50
- const enhancedShape = {};
51
- for (const [fieldName, fieldSchema] of Object.entries(originalShape)) {
52
- let enhancedFieldSchema = fieldSchema;
53
- if (fieldConfigs[fieldName]) {
54
- enhancedFieldSchema = this.addRenderConfigToField(
55
- fieldSchema,
56
- fieldConfigs[fieldName]
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
- return z.object(enhancedShape);
62
- }
63
- /**
64
- * Adds render configuration to a specific field
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
- * Number input field configuration
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
- * Currency field configuration
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
- * Token ID field configuration
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
- * Private key field configuration
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
- function wrapExternalToolWithRenderConfig(tool, config = {}) {
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
- * Standard configuration for HBAR transfer tools
50
+ * Checks if a parsed response is an inscription response that needs formatting
227
51
  */
228
- hbarTransfer: () => ({
229
- ui: {
230
- label: "Transfer HBAR",
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
- * Standard configuration for token creation tools
242
- */
243
- tokenCreation: () => ({
244
- ui: {
245
- label: "Create Token",
246
- description: "Create a new Hedera token"
247
- },
248
- fieldConfigs: {
249
- treasuryAccountId: renderConfigs.accountId("Treasury Account"),
250
- tokenName: renderConfigs.text("Token Name", "My Token"),
251
- tokenSymbol: renderConfigs.text("Token Symbol", "MTK"),
252
- maxSupply: renderConfigs.number("Max Supply", 1, Number.MAX_SAFE_INTEGER),
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
- * Standard configuration for account creation tools
259
- */
260
- accountCreation: () => ({
261
- ui: {
262
- label: "Create Account",
263
- description: "Create a new Hedera account"
264
- },
265
- fieldConfigs: {
266
- publicKey: renderConfigs.text("Public Key", "ED25519 public key"),
267
- initialBalance: renderConfigs.currency("Initial Balance", "HBAR", 0),
268
- memo: renderConfigs.text("Memo", "Account memo", "Optional account memo")
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
- * Standard configuration for smart contract tools
97
+ * Main formatting method that determines the best response format
273
98
  */
274
- smartContract: () => ({
275
- ui: {
276
- label: "Smart Contract",
277
- description: "Deploy or call smart contract"
278
- },
279
- fieldConfigs: {
280
- contractId: renderConfigs.text("Contract ID", "0.0.123456"),
281
- gas: renderConfigs.number("Gas Limit", 1e3, 1e6),
282
- payableAmount: renderConfigs.currency("Payable Amount", "HBAR", 0)
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
- ExternalToolWrapper,
288
- hederaToolConfigs,
289
- renderConfigs,
290
- wrapExternalToolWithRenderConfig,
291
- wrapExternalTools
115
+ ResponseFormatter
292
116
  };
293
117
  //# sourceMappingURL=index20.js.map
@@ -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;"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { AccountBuilder } from "./index30.js";
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").'),
@@ -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}
@@ -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,wCAS2B,SAAS;AAAA,gGAC+C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM1F,SAAS;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;"}