@hashgraphonline/standards-agent-kit 0.2.136 → 0.2.138

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 (211) hide show
  1. package/README.md +3 -4
  2. package/dist/cjs/builders/hcs10/hcs10-builder.d.ts +1 -0
  3. package/dist/cjs/builders/hcs2/hcs2-builder.d.ts +8 -7
  4. package/dist/cjs/builders/hcs6/hcs6-builder.d.ts +5 -4
  5. package/dist/cjs/builders/inscriber/inscriber-builder.d.ts +32 -1
  6. package/dist/cjs/index.d.ts +4 -0
  7. package/dist/cjs/signing/bytes-registry.d.ts +17 -0
  8. package/dist/cjs/signing/signer-provider.d.ts +45 -0
  9. package/dist/cjs/standards-agent-kit.cjs +1 -1
  10. package/dist/cjs/standards-agent-kit.cjs.map +1 -1
  11. package/dist/cjs/tools/hcs10/InitiateConnectionTool.d.ts +4 -4
  12. package/dist/cjs/tools/hcs2/CreateRegistryTool.d.ts +2 -2
  13. package/dist/cjs/tools/hcs2/DeleteEntryTool.d.ts +2 -2
  14. package/dist/cjs/tools/hcs2/UpdateEntryTool.d.ts +2 -2
  15. package/dist/cjs/tools/hcs6/RegisterDynamicHashinalTool.d.ts +10 -10
  16. package/dist/cjs/tools/hcs6/UpdateDynamicHashinalTool.d.ts +8 -8
  17. package/dist/cjs/tools/inscriber/InscribeFromBufferTool.d.ts +5 -4
  18. package/dist/cjs/tools/inscriber/InscribeFromFileTool.d.ts +2 -2
  19. package/dist/cjs/tools/inscriber/InscribeFromUrlTool.d.ts +4 -4
  20. package/dist/cjs/tools/inscriber/InscribeHashinalTool.d.ts +3 -3
  21. package/dist/cjs/types/inscription-response.d.ts +8 -0
  22. package/dist/cjs/types/tx-results.d.ts +15 -0
  23. package/dist/cjs/utils/CodedError.d.ts +4 -0
  24. package/dist/cjs/utils/inscription-utils.d.ts +21 -0
  25. package/dist/cjs/validation/hip412-schemas.d.ts +2 -2
  26. package/dist/es/builders/hcs10/hcs10-builder.d.ts +1 -0
  27. package/dist/es/builders/hcs2/hcs2-builder.d.ts +8 -7
  28. package/dist/es/builders/hcs6/hcs6-builder.d.ts +5 -4
  29. package/dist/es/builders/inscriber/inscriber-builder.d.ts +32 -1
  30. package/dist/es/index.d.ts +4 -0
  31. package/dist/es/signing/bytes-registry.d.ts +17 -0
  32. package/dist/es/signing/signer-provider.d.ts +45 -0
  33. package/dist/es/standards-agent-kit.es.js +46 -42
  34. package/dist/es/standards-agent-kit.es.js.map +1 -1
  35. package/dist/es/standards-agent-kit.es10.js +24 -83
  36. package/dist/es/standards-agent-kit.es10.js.map +1 -1
  37. package/dist/es/standards-agent-kit.es11.js +224 -20
  38. package/dist/es/standards-agent-kit.es11.js.map +1 -1
  39. package/dist/es/standards-agent-kit.es12.js +78 -27
  40. package/dist/es/standards-agent-kit.es12.js.map +1 -1
  41. package/dist/es/standards-agent-kit.es13.js +26 -36
  42. package/dist/es/standards-agent-kit.es13.js.map +1 -1
  43. package/dist/es/standards-agent-kit.es14.js +17 -39
  44. package/dist/es/standards-agent-kit.es14.js.map +1 -1
  45. package/dist/es/standards-agent-kit.es15.js +36 -58
  46. package/dist/es/standards-agent-kit.es15.js.map +1 -1
  47. package/dist/es/standards-agent-kit.es16.js +45 -18
  48. package/dist/es/standards-agent-kit.es16.js.map +1 -1
  49. package/dist/es/standards-agent-kit.es17.js +53 -16
  50. package/dist/es/standards-agent-kit.es17.js.map +1 -1
  51. package/dist/es/standards-agent-kit.es18.js +18 -28
  52. package/dist/es/standards-agent-kit.es18.js.map +1 -1
  53. package/dist/es/standards-agent-kit.es19.js +26 -12
  54. package/dist/es/standards-agent-kit.es19.js.map +1 -1
  55. package/dist/es/standards-agent-kit.es20.js +38 -136
  56. package/dist/es/standards-agent-kit.es20.js.map +1 -1
  57. package/dist/es/standards-agent-kit.es21.js +13 -24
  58. package/dist/es/standards-agent-kit.es21.js.map +1 -1
  59. package/dist/es/standards-agent-kit.es22.js +136 -39
  60. package/dist/es/standards-agent-kit.es22.js.map +1 -1
  61. package/dist/es/standards-agent-kit.es23.js +25 -41
  62. package/dist/es/standards-agent-kit.es23.js.map +1 -1
  63. package/dist/es/standards-agent-kit.es24.js +49 -31
  64. package/dist/es/standards-agent-kit.es24.js.map +1 -1
  65. package/dist/es/standards-agent-kit.es25.js +34 -18
  66. package/dist/es/standards-agent-kit.es25.js.map +1 -1
  67. package/dist/es/standards-agent-kit.es26.js +35 -19
  68. package/dist/es/standards-agent-kit.es26.js.map +1 -1
  69. package/dist/es/standards-agent-kit.es27.js +45 -32
  70. package/dist/es/standards-agent-kit.es27.js.map +1 -1
  71. package/dist/es/standards-agent-kit.es28.js +54 -25
  72. package/dist/es/standards-agent-kit.es28.js.map +1 -1
  73. package/dist/es/standards-agent-kit.es29.js +35 -23
  74. package/dist/es/standards-agent-kit.es29.js.map +1 -1
  75. package/dist/es/standards-agent-kit.es3.js +41 -1545
  76. package/dist/es/standards-agent-kit.es3.js.map +1 -1
  77. package/dist/es/standards-agent-kit.es30.js +23 -39
  78. package/dist/es/standards-agent-kit.es30.js.map +1 -1
  79. package/dist/es/standards-agent-kit.es31.js +30 -28
  80. package/dist/es/standards-agent-kit.es31.js.map +1 -1
  81. package/dist/es/standards-agent-kit.es32.js +45 -32
  82. package/dist/es/standards-agent-kit.es32.js.map +1 -1
  83. package/dist/es/standards-agent-kit.es33.js +50 -89
  84. package/dist/es/standards-agent-kit.es33.js.map +1 -1
  85. package/dist/es/standards-agent-kit.es34.js +35 -228
  86. package/dist/es/standards-agent-kit.es34.js.map +1 -1
  87. package/dist/es/standards-agent-kit.es35.js +87 -212
  88. package/dist/es/standards-agent-kit.es35.js.map +1 -1
  89. package/dist/es/standards-agent-kit.es36.js +188 -128
  90. package/dist/es/standards-agent-kit.es36.js.map +1 -1
  91. package/dist/es/standards-agent-kit.es37.js +167 -561
  92. package/dist/es/standards-agent-kit.es37.js.map +1 -1
  93. package/dist/es/standards-agent-kit.es38.js +236 -31
  94. package/dist/es/standards-agent-kit.es38.js.map +1 -1
  95. package/dist/es/standards-agent-kit.es39.js +483 -206
  96. package/dist/es/standards-agent-kit.es39.js.map +1 -1
  97. package/dist/es/standards-agent-kit.es4.js +359 -81
  98. package/dist/es/standards-agent-kit.es4.js.map +1 -1
  99. package/dist/es/standards-agent-kit.es40.js +39 -135
  100. package/dist/es/standards-agent-kit.es40.js.map +1 -1
  101. package/dist/es/standards-agent-kit.es41.js +244 -28
  102. package/dist/es/standards-agent-kit.es41.js.map +1 -1
  103. package/dist/es/standards-agent-kit.es42.js +132 -418
  104. package/dist/es/standards-agent-kit.es42.js.map +1 -1
  105. package/dist/es/standards-agent-kit.es43.js +28 -184
  106. package/dist/es/standards-agent-kit.es43.js.map +1 -1
  107. package/dist/es/standards-agent-kit.es44.js +423 -3
  108. package/dist/es/standards-agent-kit.es44.js.map +1 -1
  109. package/dist/es/standards-agent-kit.es45.js +185 -24
  110. package/dist/es/standards-agent-kit.es45.js.map +1 -1
  111. package/dist/es/standards-agent-kit.es46.js +3 -3
  112. package/dist/es/standards-agent-kit.es46.js.map +1 -1
  113. package/dist/es/standards-agent-kit.es47.js +21 -50
  114. package/dist/es/standards-agent-kit.es47.js.map +1 -1
  115. package/dist/es/standards-agent-kit.es48.js +8 -3
  116. package/dist/es/standards-agent-kit.es48.js.map +1 -1
  117. package/dist/es/standards-agent-kit.es49.js +3 -39
  118. package/dist/es/standards-agent-kit.es49.js.map +1 -1
  119. package/dist/es/standards-agent-kit.es5.js +1747 -73
  120. package/dist/es/standards-agent-kit.es5.js.map +1 -1
  121. package/dist/es/standards-agent-kit.es50.js +18 -16
  122. package/dist/es/standards-agent-kit.es50.js.map +1 -1
  123. package/dist/es/standards-agent-kit.es51.js +49 -49
  124. package/dist/es/standards-agent-kit.es51.js.map +1 -1
  125. package/dist/es/standards-agent-kit.es52.js +6 -0
  126. package/dist/es/standards-agent-kit.es52.js.map +1 -0
  127. package/dist/es/standards-agent-kit.es53.js +43 -0
  128. package/dist/es/standards-agent-kit.es53.js.map +1 -0
  129. package/dist/es/standards-agent-kit.es54.js +22 -0
  130. package/dist/es/standards-agent-kit.es54.js.map +1 -0
  131. package/dist/es/standards-agent-kit.es55.js +77 -0
  132. package/dist/es/standards-agent-kit.es55.js.map +1 -0
  133. package/dist/es/standards-agent-kit.es56.js +7 -0
  134. package/dist/es/standards-agent-kit.es56.js.map +1 -0
  135. package/dist/es/standards-agent-kit.es6.js +347 -32
  136. package/dist/es/standards-agent-kit.es6.js.map +1 -1
  137. package/dist/es/standards-agent-kit.es7.js +142 -293
  138. package/dist/es/standards-agent-kit.es7.js.map +1 -1
  139. package/dist/es/standards-agent-kit.es8.js +201 -21
  140. package/dist/es/standards-agent-kit.es8.js.map +1 -1
  141. package/dist/es/standards-agent-kit.es9.js +301 -213
  142. package/dist/es/standards-agent-kit.es9.js.map +1 -1
  143. package/dist/es/tools/hcs10/InitiateConnectionTool.d.ts +4 -4
  144. package/dist/es/tools/hcs2/CreateRegistryTool.d.ts +2 -2
  145. package/dist/es/tools/hcs2/DeleteEntryTool.d.ts +2 -2
  146. package/dist/es/tools/hcs2/UpdateEntryTool.d.ts +2 -2
  147. package/dist/es/tools/hcs6/RegisterDynamicHashinalTool.d.ts +10 -10
  148. package/dist/es/tools/hcs6/UpdateDynamicHashinalTool.d.ts +8 -8
  149. package/dist/es/tools/inscriber/InscribeFromBufferTool.d.ts +5 -4
  150. package/dist/es/tools/inscriber/InscribeFromFileTool.d.ts +2 -2
  151. package/dist/es/tools/inscriber/InscribeFromUrlTool.d.ts +4 -4
  152. package/dist/es/tools/inscriber/InscribeHashinalTool.d.ts +3 -3
  153. package/dist/es/types/inscription-response.d.ts +8 -0
  154. package/dist/es/types/tx-results.d.ts +15 -0
  155. package/dist/es/utils/CodedError.d.ts +4 -0
  156. package/dist/es/utils/inscription-utils.d.ts +21 -0
  157. package/dist/es/validation/hip412-schemas.d.ts +2 -2
  158. package/dist/umd/builders/hcs10/hcs10-builder.d.ts +1 -0
  159. package/dist/umd/builders/hcs2/hcs2-builder.d.ts +8 -7
  160. package/dist/umd/builders/hcs6/hcs6-builder.d.ts +5 -4
  161. package/dist/umd/builders/inscriber/inscriber-builder.d.ts +32 -1
  162. package/dist/umd/index.d.ts +4 -0
  163. package/dist/umd/signing/bytes-registry.d.ts +17 -0
  164. package/dist/umd/signing/signer-provider.d.ts +45 -0
  165. package/dist/umd/standards-agent-kit.umd.js +1 -1
  166. package/dist/umd/standards-agent-kit.umd.js.map +1 -1
  167. package/dist/umd/tools/hcs10/InitiateConnectionTool.d.ts +4 -4
  168. package/dist/umd/tools/hcs2/CreateRegistryTool.d.ts +2 -2
  169. package/dist/umd/tools/hcs2/DeleteEntryTool.d.ts +2 -2
  170. package/dist/umd/tools/hcs2/UpdateEntryTool.d.ts +2 -2
  171. package/dist/umd/tools/hcs6/RegisterDynamicHashinalTool.d.ts +10 -10
  172. package/dist/umd/tools/hcs6/UpdateDynamicHashinalTool.d.ts +8 -8
  173. package/dist/umd/tools/inscriber/InscribeFromBufferTool.d.ts +5 -4
  174. package/dist/umd/tools/inscriber/InscribeFromFileTool.d.ts +2 -2
  175. package/dist/umd/tools/inscriber/InscribeFromUrlTool.d.ts +4 -4
  176. package/dist/umd/tools/inscriber/InscribeHashinalTool.d.ts +3 -3
  177. package/dist/umd/types/inscription-response.d.ts +8 -0
  178. package/dist/umd/types/tx-results.d.ts +15 -0
  179. package/dist/umd/utils/CodedError.d.ts +4 -0
  180. package/dist/umd/utils/inscription-utils.d.ts +21 -0
  181. package/dist/umd/validation/hip412-schemas.d.ts +2 -2
  182. package/package.json +10 -5
  183. package/src/builders/hcs10/hcs10-builder.ts +239 -6
  184. package/src/builders/hcs2/hcs2-builder.ts +302 -9
  185. package/src/builders/hcs6/hcs6-builder.ts +79 -4
  186. package/src/builders/inscriber/inscriber-builder.ts +235 -2
  187. package/src/hcs10/HCS10Client.ts +1 -1
  188. package/src/index.ts +5 -1
  189. package/src/lib/zod-render/schema-extension.ts +0 -1
  190. package/src/signing/bytes-registry.ts +501 -0
  191. package/src/signing/signer-provider.ts +120 -0
  192. package/src/tools/hcs2/CreateRegistryTool.ts +30 -5
  193. package/src/tools/hcs2/DeleteEntryTool.ts +16 -2
  194. package/src/tools/hcs2/MigrateRegistryTool.ts +16 -2
  195. package/src/tools/hcs2/QueryRegistryTool.ts +11 -2
  196. package/src/tools/hcs2/RegisterEntryTool.ts +17 -3
  197. package/src/tools/hcs2/UpdateEntryTool.ts +16 -2
  198. package/src/tools/hcs6/CreateDynamicRegistryTool.ts +17 -3
  199. package/src/tools/hcs6/RegisterDynamicHashinalTool.ts +17 -3
  200. package/src/tools/hcs6/UpdateDynamicHashinalTool.ts +17 -3
  201. package/src/tools/inscriber/InscribeFromBufferTool.ts +126 -21
  202. package/src/tools/inscriber/InscribeFromFileTool.ts +10 -13
  203. package/src/tools/inscriber/InscribeFromUrlTool.ts +15 -11
  204. package/src/tools/inscriber/InscribeHashinalTool.ts +40 -168
  205. package/src/tools/inscriber/RetrieveInscriptionTool.ts +15 -16
  206. package/src/types/inscription-response.ts +27 -0
  207. package/src/types/tx-results.ts +18 -0
  208. package/src/utils/CodedError.ts +8 -0
  209. package/src/utils/Encryption.ts +0 -2
  210. package/src/utils/ensure-agent-has-hbar.ts +4 -5
  211. package/src/utils/inscription-utils.ts +53 -0
@@ -1,98 +1,59 @@
1
- import { BaseHederaTransactionTool, BaseHederaQueryTool } from "hedera-agent-kit";
2
- class BaseInscriberTransactionTool extends BaseHederaTransactionTool {
1
+ import { z } from "zod";
2
+ import { BaseHCS6QueryTool } from "./standards-agent-kit.es30.js";
3
+ import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
4
+ const UpdateDynamicHashinalSchema = z.object({
5
+ registryTopicId: z.string().describe("The registry topic ID that tracks this dynamic hashinal"),
6
+ metadata: z.record(z.unknown()).describe("Updated metadata object for the hashinal"),
7
+ data: z.object({
8
+ base64: z.string().optional().describe("Base64 encoded data for the updated hashinal"),
9
+ url: z.string().optional().describe("URL to fetch updated data from"),
10
+ mimeType: z.string().optional().describe("MIME type of the data")
11
+ }).optional().describe("Updated data to inscribe"),
12
+ memo: z.string().optional().describe('Optional memo for the update (e.g., "Level up", "Version 2.0")'),
13
+ submitKey: z.string().describe("Submit key for the registry (required to update)")
14
+ });
15
+ class UpdateDynamicHashinalTool extends BaseHCS6QueryTool {
3
16
  constructor(params) {
4
17
  super(params);
5
- this.namespace = "inscriber";
6
- this.inscriberBuilder = params.inscriberBuilder;
7
- this.contentResolver = params.contentResolver || null;
8
- }
9
- /**
10
- * Override to return the InscriberBuilder
11
- */
12
- getServiceBuilder() {
13
- return this.inscriberBuilder;
14
- }
15
- /**
16
- * Get content resolver with fallback to registry
17
- */
18
- getContentResolver() {
19
- return this.contentResolver;
20
- }
21
- /**
22
- * Set entity creation handler for automatic entity storage
23
- */
24
- setEntityCreationHandler(handler) {
25
- this.onEntityCreated = handler;
26
- }
27
- /**
28
- * Generate a quote for an inscription without executing it
29
- * @param input - The inscription input data
30
- * @param options - Inscription options
31
- * @returns Promise containing the quote result
32
- */
33
- async generateInscriptionQuote(input, options) {
34
- const network = this.inscriberBuilder["hederaKit"].client.network;
35
- const networkType = network.toString().includes("mainnet") ? "mainnet" : "testnet";
36
- const quoteOptions = {
37
- ...options,
38
- quoteOnly: true,
39
- network: networkType
40
- };
41
- const result = await this.inscriberBuilder.inscribe(input, quoteOptions);
42
- if (!result.quote || result.confirmed) {
43
- throw new Error("Failed to generate quote - unexpected response type");
18
+ this.name = "updateDynamicHashinal";
19
+ this.description = "Update an existing dynamic hashinal with new content while maintaining the same registry";
20
+ }
21
+ get specificInputSchema() {
22
+ return UpdateDynamicHashinalSchema;
23
+ }
24
+ async executeQuery(params, _runManager) {
25
+ const result = await this.hcs6Builder.register({
26
+ metadata: params.metadata,
27
+ data: params.data,
28
+ memo: params.memo,
29
+ registryTopicId: params.registryTopicId,
30
+ submitKey: params.submitKey
31
+ });
32
+ if (!("success" in result) || !result.success) {
33
+ throw new Error(result.error || "Failed to update dynamic hashinal");
44
34
  }
45
- return result.result;
46
- }
47
- }
48
- class BaseInscriberQueryTool extends BaseHederaQueryTool {
49
- constructor(params) {
50
- super(params);
51
- this.namespace = "inscriber";
52
- this.inscriberBuilder = params.inscriberBuilder;
53
- this.contentResolver = params.contentResolver || null;
54
- }
55
- /**
56
- * Override to return the InscriberBuilder
57
- */
58
- getServiceBuilder() {
59
- return this.inscriberBuilder;
60
- }
61
- /**
62
- * Get content resolver with fallback to registry
63
- */
64
- getContentResolver() {
65
- return this.contentResolver;
66
- }
67
- /**
68
- * Set entity creation handler for automatic entity storage
69
- */
70
- setEntityCreationHandler(handler) {
71
- this.onEntityCreated = handler;
72
- }
73
- /**
74
- * Generate a quote for an inscription without executing it
75
- * @param input - The inscription input data
76
- * @param options - Inscription options
77
- * @returns Promise containing the quote result
78
- */
79
- async generateInscriptionQuote(input, options) {
80
- const network = this.inscriberBuilder["hederaKit"].client.network;
81
- const networkType = network.toString().includes("mainnet") ? "mainnet" : "testnet";
82
- const quoteOptions = {
83
- ...options,
84
- quoteOnly: true,
85
- network: networkType
86
- };
87
- const result = await this.inscriberBuilder.inscribe(input, quoteOptions);
88
- if (!result.quote || result.confirmed) {
89
- throw new Error("Failed to generate quote - unexpected response type");
35
+ if (isWalletBytesResponse(result)) {
36
+ const txBytes = result.transactionBytes;
37
+ return {
38
+ message: "I prepared an unsigned transaction to update a dynamic hashinal. Please review and approve to submit.",
39
+ transactionBytes: txBytes,
40
+ metadata: {
41
+ transactionBytes: txBytes,
42
+ pendingApproval: true,
43
+ description: `Update dynamic hashinal (registry ${params.registryTopicId})${params.memo ? ` (Memo: ${params.memo})` : ""}`
44
+ }
45
+ };
90
46
  }
91
- return result.result;
47
+ return `Successfully updated dynamic hashinal!
48
+
49
+ Registry Topic ID: ${params.registryTopicId}
50
+ Inscription Topic ID: ${result.inscriptionTopicId}${params.memo ? `
51
+ Update Memo: ${params.memo}` : ""}
52
+
53
+ The dynamic hashinal has been updated with new content.`;
92
54
  }
93
55
  }
94
56
  export {
95
- BaseInscriberQueryTool,
96
- BaseInscriberTransactionTool
57
+ UpdateDynamicHashinalTool
97
58
  };
98
59
  //# sourceMappingURL=standards-agent-kit.es33.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-agent-kit.es33.js","sources":["../../src/tools/inscriber/base-inscriber-tools.ts"],"sourcesContent":["import {\n BaseHederaTransactionTool,\n BaseHederaQueryTool,\n BaseServiceBuilder,\n} from 'hedera-agent-kit';\nimport { InscriberBuilder } from '../../builders/inscriber/inscriber-builder';\nimport {\n InscriberTransactionToolParams,\n InscriberQueryToolParams,\n} from './inscriber-tool-params';\nimport type { ContentResolverInterface } from '../../types/content-resolver';\nimport {\n InscriptionInput,\n InscriptionOptions,\n QuoteResult,\n} from '@hashgraphonline/standards-sdk';\nimport { z } from 'zod';\n\n/**\n * Event emitted when an entity is created during inscription\n */\nexport interface EntityCreationEvent {\n entityId: string;\n entityName: string;\n entityType: string;\n transactionId?: string;\n}\n\n/**\n * Base class for Inscriber transaction tools\n */\nexport abstract class BaseInscriberTransactionTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaTransactionTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberTransactionToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\n }\n}\n\n/**\n * Base class for Inscriber query tools\n */\nexport abstract class BaseInscriberQueryTool<\n T extends z.ZodObject<\n z.ZodRawShape,\n z.UnknownKeysParam,\n z.ZodTypeAny\n > = z.ZodObject<z.ZodRawShape>\n> extends BaseHederaQueryTool<T> {\n protected inscriberBuilder: InscriberBuilder;\n protected contentResolver: ContentResolverInterface | null;\n protected onEntityCreated?: (event: EntityCreationEvent) => void;\n namespace = 'inscriber' as const;\n\n constructor(params: InscriberQueryToolParams) {\n super(params);\n this.inscriberBuilder = params.inscriberBuilder;\n this.contentResolver = params.contentResolver || null;\n }\n\n /**\n * Override to return the InscriberBuilder\n */\n protected getServiceBuilder(): BaseServiceBuilder {\n return this.inscriberBuilder;\n }\n\n /**\n * Get content resolver with fallback to registry\n */\n protected getContentResolver(): ContentResolverInterface | null {\n return this.contentResolver;\n }\n\n /**\n * Set entity creation handler for automatic entity storage\n */\n setEntityCreationHandler(handler: (event: EntityCreationEvent) => void): void {\n this.onEntityCreated = handler;\n }\n\n /**\n * Generate a quote for an inscription without executing it\n * @param input - The inscription input data\n * @param options - Inscription options\n * @returns Promise containing the quote result\n */\n protected async generateInscriptionQuote(\n input: InscriptionInput,\n options: InscriptionOptions\n ): Promise<QuoteResult> {\n const network = this.inscriberBuilder['hederaKit'].client.network;\n const networkType = network.toString().includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const quoteOptions = {\n ...options,\n quoteOnly: true,\n network: networkType as 'mainnet' | 'testnet',\n };\n\n const result = await this.inscriberBuilder.inscribe(input, quoteOptions);\n\n if (!result.quote || result.confirmed) {\n throw new Error('Failed to generate quote - unexpected response type');\n }\n\n return result.result as QuoteResult;\n }\n}"],"names":[],"mappings":";AA+BO,MAAe,qCAMZ,0BAA6B;AAAA,EAMrC,YAAY,QAAwC;AAClD,UAAM,MAAM;AAHd,SAAA,YAAY;AAIV,SAAK,mBAAmB,OAAO;AAC/B,SAAK,kBAAkB,OAAO,mBAAmB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKU,oBAAwC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKU,qBAAsD;AAC9D,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,SAAqD;AAC5E,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,yBACd,OACA,SACsB;AACtB,UAAM,UAAU,KAAK,iBAAiB,WAAW,EAAE,OAAO;AAC1D,UAAM,cAAc,QAAQ,SAAA,EAAW,SAAS,SAAS,IACrD,YACA;AAEJ,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,SAAS;AAAA,IAAA;AAGX,UAAM,SAAS,MAAM,KAAK,iBAAiB,SAAS,OAAO,YAAY;AAEvE,QAAI,CAAC,OAAO,SAAS,OAAO,WAAW;AACrC,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,WAAO,OAAO;AAAA,EAChB;AACF;AAKO,MAAe,+BAMZ,oBAAuB;AAAA,EAM/B,YAAY,QAAkC;AAC5C,UAAM,MAAM;AAHd,SAAA,YAAY;AAIV,SAAK,mBAAmB,OAAO;AAC/B,SAAK,kBAAkB,OAAO,mBAAmB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKU,oBAAwC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKU,qBAAsD;AAC9D,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,SAAqD;AAC5E,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,yBACd,OACA,SACsB;AACtB,UAAM,UAAU,KAAK,iBAAiB,WAAW,EAAE,OAAO;AAC1D,UAAM,cAAc,QAAQ,SAAA,EAAW,SAAS,SAAS,IACrD,YACA;AAEJ,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,SAAS;AAAA,IAAA;AAGX,UAAM,SAAS,MAAM,KAAK,iBAAiB,SAAS,OAAO,YAAY;AAEvE,QAAI,CAAC,OAAO,SAAS,OAAO,WAAW;AACrC,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,WAAO,OAAO;AAAA,EAChB;AACF;"}
1
+ {"version":3,"file":"standards-agent-kit.es33.js","sources":["../../src/tools/hcs6/UpdateDynamicHashinalTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { isWalletBytesResponse } from '../../types/tx-results';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for updating a dynamic hashinal\n */\nconst UpdateDynamicHashinalSchema = z.object({\n registryTopicId: z.string()\n .describe('The registry topic ID that tracks this dynamic hashinal'),\n metadata: z.record(z.unknown())\n .describe('Updated metadata object for the hashinal'),\n data: z.object({\n base64: z.string().optional().describe('Base64 encoded data for the updated hashinal'),\n url: z.string().optional().describe('URL to fetch updated data from'),\n mimeType: z.string().optional().describe('MIME type of the data'),\n }).optional()\n .describe('Updated data to inscribe'),\n memo: z.string()\n .optional()\n .describe('Optional memo for the update (e.g., \"Level up\", \"Version 2.0\")'),\n submitKey: z.string()\n .describe('Submit key for the registry (required to update)'),\n});\n\nexport type UpdateDynamicHashinalInput = z.infer<typeof UpdateDynamicHashinalSchema>;\n\n/**\n * Tool for updating dynamic hashinals\n */\nexport class UpdateDynamicHashinalTool extends BaseHCS6QueryTool<typeof UpdateDynamicHashinalSchema> {\n name = 'updateDynamicHashinal';\n description = 'Update an existing dynamic hashinal with new content while maintaining the same registry';\n\n get specificInputSchema() {\n return UpdateDynamicHashinalSchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: UpdateDynamicHashinalInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n\n const result = await this.hcs6Builder.register({\n metadata: params.metadata,\n data: params.data,\n memo: params.memo,\n registryTopicId: params.registryTopicId,\n submitKey: params.submitKey,\n });\n\n if (!('success' in result) || !result.success) {\n throw new Error((result as any).error || 'Failed to update dynamic hashinal');\n }\n\n if (isWalletBytesResponse(result as any)) {\n const txBytes = (result as any).transactionBytes as string;\n return {\n message: 'I prepared an unsigned transaction to update a dynamic hashinal. Please review and approve to submit.',\n transactionBytes: txBytes,\n metadata: {\n transactionBytes: txBytes,\n pendingApproval: true,\n description: `Update dynamic hashinal (registry ${params.registryTopicId})${params.memo ? ` (Memo: ${params.memo})` : ''}`,\n },\n };\n }\n\n return `Successfully updated dynamic hashinal!\\n\\nRegistry Topic ID: ${params.registryTopicId}\\nInscription Topic ID: ${(result as any).inscriptionTopicId}${params.memo ? `\\nUpdate Memo: ${params.memo}` : ''}\\n\\nThe dynamic hashinal has been updated with new content.`;\n }\n}"],"names":[],"mappings":";;;AASA,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC3C,iBAAiB,EAAE,SAChB,SAAS,yDAAyD;AAAA,EACrE,UAAU,EAAE,OAAO,EAAE,SAAS,EAC3B,SAAS,0CAA0C;AAAA,EACtD,MAAM,EAAE,OAAO;AAAA,IACb,QAAQ,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,8CAA8C;AAAA,IACrF,KAAK,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,gCAAgC;AAAA,IACpE,UAAU,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,uBAAuB;AAAA,EAAA,CACjE,EAAE,SAAA,EACA,SAAS,0BAA0B;AAAA,EACtC,MAAM,EAAE,OAAA,EACL,SAAA,EACA,SAAS,gEAAgE;AAAA,EAC5E,WAAW,EAAE,OAAA,EACV,SAAS,kDAAkD;AAChE,CAAC;AAOM,MAAM,kCAAkC,kBAAsD;AAAA,EAQnG,YAAY,QAA6B;AACvC,UAAM,MAAM;AARd,SAAA,OAAO;AACP,SAAA,cAAc;AAAA,EAQd;AAAA,EANA,IAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAAA,EAMA,MAAgB,aACd,QACA,aACkB;AAElB,UAAM,SAAS,MAAM,KAAK,YAAY,SAAS;AAAA,MAC7C,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,iBAAiB,OAAO;AAAA,MACxB,WAAW,OAAO;AAAA,IAAA,CACnB;AAED,QAAI,EAAE,aAAa,WAAW,CAAC,OAAO,SAAS;AAC7C,YAAM,IAAI,MAAO,OAAe,SAAS,mCAAmC;AAAA,IAC9E;AAEA,QAAI,sBAAsB,MAAa,GAAG;AACxC,YAAM,UAAW,OAAe;AAChC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,UAAU;AAAA,UACR,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,UACjB,aAAa,qCAAqC,OAAO,eAAe,IAAI,OAAO,OAAO,WAAW,OAAO,IAAI,MAAM,EAAE;AAAA,QAAA;AAAA,MAC1H;AAAA,IAEJ;AAEA,WAAO;AAAA;AAAA,qBAAgE,OAAO,eAAe;AAAA,wBAA4B,OAAe,kBAAkB,GAAG,OAAO,OAAO;AAAA,eAAkB,OAAO,IAAI,KAAK,EAAE;AAAA;AAAA;AAAA,EACjN;AACF;"}
@@ -1,241 +1,48 @@
1
1
  import { z } from "zod";
2
- import { BaseInscriberQueryTool } from "./standards-agent-kit.es33.js";
3
- import { Logger } from "@hashgraphonline/standards-sdk";
4
- const logger = new Logger({ module: "InscribeFromUrlTool" });
5
- const inscribeFromUrlSchema = z.object({
6
- url: z.string().url().describe(
7
- "ONLY direct file download URLs with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or when you already have content to inscribe."
8
- ),
9
- mode: z.enum(["file", "hashinal"]).optional().describe("Inscription mode: file or hashinal NFT"),
10
- metadata: z.record(z.unknown()).optional().describe("Metadata to attach to the inscription"),
11
- tags: z.array(z.string()).optional().describe("Tags to categorize the inscription"),
12
- chunkSize: z.number().int().positive().optional().describe("Chunk size for large files"),
13
- waitForConfirmation: z.boolean().optional().describe("Whether to wait for inscription confirmation"),
14
- timeoutMs: z.number().int().positive().optional().describe(
15
- "Timeout in milliseconds for inscription (default: no timeout - waits until completion)"
16
- ),
17
- apiKey: z.string().optional().describe("API key for inscription service"),
18
- quoteOnly: z.boolean().optional().default(false).describe(
19
- "If true, returns a cost quote instead of executing the inscription"
20
- )
2
+ import { BaseHCS6QueryTool } from "./standards-agent-kit.es30.js";
3
+ const QueryDynamicRegistrySchema = z.object({
4
+ topicId: z.string().describe("The registry topic ID to query"),
5
+ limit: z.number().optional().default(100).describe("Maximum number of entries to retrieve"),
6
+ order: z.enum(["asc", "desc"]).optional().default("desc").describe("Order of entries (desc shows latest first)"),
7
+ skip: z.number().optional().describe("Number of entries to skip")
21
8
  });
22
- class InscribeFromUrlTool extends BaseInscriberQueryTool {
23
- constructor() {
24
- super(...arguments);
25
- this.name = "inscribeFromUrl";
26
- this.description = 'ONLY for direct FILE DOWNLOAD URLs ending with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or ANY HTML content - it WILL FAIL. If you have already retrieved content from any source (including MCP tools), you MUST use inscribeFromBuffer instead. This tool downloads files from URLs - it does NOT inscribe content you already have. When asked to "inscribe it" after retrieving content, ALWAYS use inscribeFromBuffer with the actual content. Set quoteOnly=true to get cost estimates without executing the inscription.';
9
+ class QueryDynamicRegistryTool extends BaseHCS6QueryTool {
10
+ constructor(params) {
11
+ super(params);
12
+ this.name = "queryDynamicRegistry";
13
+ this.description = "Query a dynamic registry to get the current state of a dynamic hashinal";
27
14
  }
28
15
  get specificInputSchema() {
29
- return inscribeFromUrlSchema;
16
+ return QueryDynamicRegistrySchema;
30
17
  }
31
18
  async executeQuery(params, _runManager) {
32
- logger.debug(`InscribeFromUrlTool.executeQuery called with URL: ${params.url}`);
33
- if (!params.url || params.url.trim() === "") {
34
- throw new Error("URL cannot be empty. Please provide a valid URL.");
35
- }
36
- try {
37
- const urlObj = new URL(params.url);
38
- if (!urlObj.protocol || !urlObj.host) {
39
- throw new Error(
40
- "Invalid URL format. Please provide a complete URL with protocol (http/https)."
41
- );
42
- }
43
- if (!["http:", "https:"].includes(urlObj.protocol)) {
44
- throw new Error(
45
- "Only HTTP and HTTPS URLs are supported for inscription."
46
- );
47
- }
48
- } catch (error) {
49
- if (error instanceof Error && error.message.includes("Cannot inscribe content from")) {
50
- throw error;
51
- }
52
- throw new Error(
53
- `Invalid URL: ${params.url}. Please provide a valid URL.`
54
- );
55
- }
56
- logger.info("Validating URL content before inscription...");
57
- try {
58
- const controller = new AbortController();
59
- const timeoutId = setTimeout(() => controller.abort(), 1e4);
60
- try {
61
- const headResponse = await fetch(params.url, {
62
- method: "HEAD",
63
- signal: controller.signal
64
- });
65
- clearTimeout(timeoutId);
66
- if (!headResponse.ok) {
67
- throw new Error(
68
- `URL returned error status ${headResponse.status}: ${headResponse.statusText}. Cannot inscribe content from inaccessible URLs.`
69
- );
70
- }
71
- const contentType = headResponse.headers.get("content-type") || "";
72
- const contentLength = headResponse.headers.get("content-length");
73
- const webPageContentTypes = [
74
- "text/html",
75
- "application/xhtml+xml",
76
- "text/xml"
77
- ];
78
- if (webPageContentTypes.some(
79
- (type) => contentType.toLowerCase().includes(type)
80
- )) {
81
- throw new Error(
82
- `URL returns HTML/web page content (Content-Type: ${contentType}). This tool only works with direct file URLs (PDFs, images, JSON, etc.). For web page content, first retrieve the content using the appropriate MCP tool or web scraper, then use inscribeFromBuffer to inscribe it.`
83
- );
84
- }
85
- if (contentLength && parseInt(contentLength) === 0) {
86
- throw new Error(
87
- "URL returns empty content (Content-Length: 0). Cannot inscribe empty content."
88
- );
89
- }
90
- if (contentLength && parseInt(contentLength) < 10) {
91
- throw new Error(
92
- `URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`
93
- );
94
- }
95
- if (!contentType || contentType === "application/octet-stream") {
96
- logger.info("Content-Type unclear, fetching first 1KB to verify...");
97
- const getController = new AbortController();
98
- const getTimeoutId = setTimeout(() => getController.abort(), 5e3);
99
- try {
100
- const getResponse = await fetch(params.url, {
101
- signal: getController.signal,
102
- headers: {
103
- Range: "bytes=0-1023"
104
- // Get first 1KB
105
- }
106
- });
107
- clearTimeout(getTimeoutId);
108
- if (getResponse.ok || getResponse.status === 206) {
109
- const buffer = await getResponse.arrayBuffer();
110
- const bytes = new Uint8Array(buffer);
111
- const text = new TextDecoder("utf-8", { fatal: false }).decode(
112
- bytes.slice(0, 512)
113
- );
114
- if (text.toLowerCase().includes("<!doctype html") || text.toLowerCase().includes("<html") || text.match(/<meta\s+[^>]*>/i) || text.match(/<title>/i)) {
115
- throw new Error(
116
- `URL returns HTML content. This tool only works with direct file URLs. For web page content, first retrieve it using the appropriate tool, then use inscribeFromBuffer.`
117
- );
118
- }
119
- }
120
- } catch (getError) {
121
- clearTimeout(getTimeoutId);
122
- if (getError instanceof Error && getError.message.includes("HTML content")) {
123
- throw getError;
124
- }
125
- logger.warn(
126
- `Could not perform partial GET validation: ${getError instanceof Error ? getError.message : "Unknown error"}`
127
- );
128
- }
129
- }
130
- logger.info(
131
- `URL validation passed. Content-Type: ${contentType}, Content-Length: ${contentLength || "unknown"}`
132
- );
133
- } catch (fetchError) {
134
- clearTimeout(timeoutId);
135
- throw fetchError;
136
- }
137
- } catch (error) {
138
- if (error instanceof Error) {
139
- if (error.name === "AbortError") {
140
- logger.warn(
141
- "URL validation timed out after 10 seconds. Proceeding with inscription attempt."
142
- );
143
- } else if (error.message.includes("URL returned error") || error.message.includes("empty content") || error.message.includes("too small") || error.message.includes("HTML")) {
144
- throw error;
145
- } else {
146
- logger.warn(
147
- `Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`
148
- );
149
- }
150
- }
151
- }
152
- const options = {
153
- mode: params.mode,
154
- metadata: params.metadata,
155
- tags: params.tags,
156
- chunkSize: params.chunkSize,
157
- waitForConfirmation: params.quoteOnly ? false : params.waitForConfirmation ?? true,
158
- waitMaxAttempts: 60,
159
- waitIntervalMs: 5e3,
160
- apiKey: params.apiKey,
161
- network: this.inscriberBuilder["hederaKit"].client.network.toString().includes("mainnet") ? "mainnet" : "testnet",
162
- quoteOnly: params.quoteOnly
163
- };
164
- if (params.quoteOnly) {
165
- try {
166
- const quote = await this.generateInscriptionQuote(
167
- { type: "url", url: params.url },
168
- options
169
- );
170
- return {
171
- success: true,
172
- quote: {
173
- totalCostHbar: quote.totalCostHbar,
174
- validUntil: quote.validUntil,
175
- breakdown: quote.breakdown
176
- },
177
- contentInfo: {
178
- url: params.url
179
- },
180
- message: `Estimated Quote for URL: ${params.url}
181
- Total cost: ${quote.totalCostHbar} HBAR`
182
- };
183
- } catch (error) {
184
- const errorMessage = error instanceof Error ? error.message : "Failed to generate inscription quote";
185
- throw new Error(`Quote generation failed: ${errorMessage}`);
186
- }
187
- }
188
- try {
189
- let result;
190
- if (params.timeoutMs) {
191
- const timeoutPromise = new Promise((_, reject) => {
192
- setTimeout(
193
- () => reject(
194
- new Error(`Inscription timed out after ${params.timeoutMs}ms`)
195
- ),
196
- params.timeoutMs
197
- );
198
- });
199
- result = await Promise.race([
200
- this.inscriberBuilder.inscribe(
201
- { type: "url", url: params.url },
202
- options
203
- ),
204
- timeoutPromise
205
- ]);
206
- } else {
207
- result = await this.inscriberBuilder.inscribe(
208
- { type: "url", url: params.url },
209
- options
210
- );
211
- }
212
- if (result.confirmed && !result.quote) {
213
- const topicId = result.inscription?.topic_id || result.result.topicId;
214
- const network = options.network || "testnet";
215
- const cdnUrl = topicId ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}` : null;
216
- return `Successfully inscribed and confirmed content on the Hedera network!
19
+ const registry = await this.hcs6Builder.getRegistry(params.topicId, {
20
+ limit: params.limit,
21
+ order: params.order,
22
+ skip: params.skip
23
+ });
24
+ const latestEntry = registry.latestEntry ? {
25
+ topicId: registry.latestEntry.message.t_id,
26
+ timestamp: registry.latestEntry.timestamp,
27
+ memo: registry.latestEntry.message.m,
28
+ sequence: registry.latestEntry.sequence,
29
+ payer: registry.latestEntry.payer
30
+ } : null;
31
+ return `Successfully queried dynamic registry!
217
32
 
218
- Transaction ID: ${result.result.transactionId}
219
- Topic ID: ${topicId || "N/A"}${cdnUrl ? `
220
- View inscription: ${cdnUrl}` : ""}
33
+ Registry Topic: ${registry.topicId}
34
+ Registry Type: NON_INDEXED
35
+ TTL: ${registry.ttl} seconds
36
+ Total Entries: ${registry.entries.length}${latestEntry ? `
221
37
 
222
- The inscription is now available.`;
223
- } else if (!result.quote && !result.confirmed) {
224
- return `Successfully submitted inscription to the Hedera network!
225
-
226
- Transaction ID: ${result.result.transactionId}
227
-
228
- The inscription is processing and will be confirmed shortly.`;
229
- } else {
230
- return "Inscription operation completed.";
231
- }
232
- } catch (error) {
233
- const errorMessage = error instanceof Error ? error.message : "Failed to inscribe from URL";
234
- throw new Error(`Inscription failed: ${errorMessage}`);
235
- }
38
+ Latest Entry:
39
+ - Topic ID: ${latestEntry.topicId}
40
+ - Timestamp: ${latestEntry.timestamp}
41
+ - Memo: ${latestEntry.memo || "N/A"}
42
+ - Sequence: ${latestEntry.sequence}` : "\n\nNo entries found in registry."}`;
236
43
  }
237
44
  }
238
45
  export {
239
- InscribeFromUrlTool
46
+ QueryDynamicRegistryTool
240
47
  };
241
48
  //# sourceMappingURL=standards-agent-kit.es34.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-agent-kit.es34.js","sources":["../../src/tools/inscriber/InscribeFromUrlTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport { InscriptionOptions, Logger } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\nconst logger = new Logger({ module: 'InscribeFromUrlTool' });\n\n/**\n * Schema for inscribing from URL\n */\nconst inscribeFromUrlSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'ONLY direct file download URLs with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or when you already have content to inscribe.'\n ),\n mode: z\n .enum(['file', 'hashinal'])\n .optional()\n .describe('Inscription mode: file or hashinal NFT'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Metadata to attach to the inscription'),\n tags: z\n .array(z.string())\n .optional()\n .describe('Tags to categorize the inscription'),\n chunkSize: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Chunk size for large files'),\n waitForConfirmation: z\n .boolean()\n .optional()\n .describe('Whether to wait for inscription confirmation'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Timeout in milliseconds for inscription (default: no timeout - waits until completion)'\n ),\n apiKey: z.string().optional().describe('API key for inscription service'),\n quoteOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'If true, returns a cost quote instead of executing the inscription'\n ),\n});\n\n/**\n * Tool for inscribing content from URL\n */\nexport class InscribeFromUrlTool extends BaseInscriberQueryTool<\n typeof inscribeFromUrlSchema\n> {\n name = 'inscribeFromUrl';\n description =\n 'ONLY for direct FILE DOWNLOAD URLs ending with file extensions (.pdf, .jpg, .png, .json, .zip). NEVER use for web pages, articles, or ANY HTML content - it WILL FAIL. If you have already retrieved content from any source (including MCP tools), you MUST use inscribeFromBuffer instead. This tool downloads files from URLs - it does NOT inscribe content you already have. When asked to \"inscribe it\" after retrieving content, ALWAYS use inscribeFromBuffer with the actual content. Set quoteOnly=true to get cost estimates without executing the inscription.';\n\n get specificInputSchema() {\n return inscribeFromUrlSchema;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeFromUrlSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n logger.debug(`InscribeFromUrlTool.executeQuery called with URL: ${params.url}`);\n\n if (!params.url || params.url.trim() === '') {\n throw new Error('URL cannot be empty. Please provide a valid URL.');\n }\n\n try {\n const urlObj = new URL(params.url);\n if (!urlObj.protocol || !urlObj.host) {\n throw new Error(\n 'Invalid URL format. Please provide a complete URL with protocol (http/https).'\n );\n }\n if (!['http:', 'https:'].includes(urlObj.protocol)) {\n throw new Error(\n 'Only HTTP and HTTPS URLs are supported for inscription.'\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('Cannot inscribe content from')\n ) {\n throw error;\n }\n throw new Error(\n `Invalid URL: ${params.url}. Please provide a valid URL.`\n );\n }\n\n logger.info('Validating URL content before inscription...');\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n const headResponse = await fetch(params.url, {\n method: 'HEAD',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!headResponse.ok) {\n throw new Error(\n `URL returned error status ${headResponse.status}: ${headResponse.statusText}. Cannot inscribe content from inaccessible URLs.`\n );\n }\n\n const contentType = headResponse.headers.get('content-type') || '';\n const contentLength = headResponse.headers.get('content-length');\n\n const webPageContentTypes = [\n 'text/html',\n 'application/xhtml+xml',\n 'text/xml',\n ];\n\n if (\n webPageContentTypes.some((type) =>\n contentType.toLowerCase().includes(type)\n )\n ) {\n throw new Error(\n `URL returns HTML/web page content (Content-Type: ${contentType}). This tool only works with direct file URLs (PDFs, images, JSON, etc.). For web page content, first retrieve the content using the appropriate MCP tool or web scraper, then use inscribeFromBuffer to inscribe it.`\n );\n }\n\n if (contentLength && parseInt(contentLength) === 0) {\n throw new Error(\n 'URL returns empty content (Content-Length: 0). Cannot inscribe empty content.'\n );\n }\n\n if (contentLength && parseInt(contentLength) < 10) {\n throw new Error(\n `URL content is too small (${contentLength} bytes). Content must be at least 10 bytes.`\n );\n }\n\n if (!contentType || contentType === 'application/octet-stream') {\n logger.info('Content-Type unclear, fetching first 1KB to verify...');\n\n const getController = new AbortController();\n const getTimeoutId = setTimeout(() => getController.abort(), 5000);\n\n try {\n const getResponse = await fetch(params.url, {\n signal: getController.signal,\n headers: {\n Range: 'bytes=0-1023', // Get first 1KB\n },\n });\n\n clearTimeout(getTimeoutId);\n\n if (getResponse.ok || getResponse.status === 206) {\n\n const buffer = await getResponse.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n const text = new TextDecoder('utf-8', { fatal: false }).decode(\n bytes.slice(0, 512)\n );\n\n if (\n text.toLowerCase().includes('<!doctype html') ||\n text.toLowerCase().includes('<html') ||\n text.match(/<meta\\s+[^>]*>/i) ||\n text.match(/<title>/i)\n ) {\n throw new Error(\n `URL returns HTML content. This tool only works with direct file URLs. For web page content, first retrieve it using the appropriate tool, then use inscribeFromBuffer.`\n );\n }\n }\n } catch (getError) {\n clearTimeout(getTimeoutId);\n if (\n getError instanceof Error &&\n getError.message.includes('HTML content')\n ) {\n throw getError;\n }\n logger.warn(\n `Could not perform partial GET validation: ${\n getError instanceof Error ? getError.message : 'Unknown error'\n }`\n );\n }\n }\n\n logger.info(\n `URL validation passed. Content-Type: ${contentType}, Content-Length: ${\n contentLength || 'unknown'\n }`\n );\n } catch (fetchError) {\n clearTimeout(timeoutId);\n throw fetchError;\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n logger.warn(\n 'URL validation timed out after 10 seconds. Proceeding with inscription attempt.'\n );\n } else if (\n error.message.includes('URL returned error') ||\n error.message.includes('empty content') ||\n error.message.includes('too small') ||\n error.message.includes('HTML')\n ) {\n throw error;\n } else {\n logger.warn(\n `Could not validate URL with HEAD request: ${error.message}. Proceeding with inscription attempt.`\n );\n }\n }\n }\n\n const options: InscriptionOptions = {\n mode: params.mode,\n metadata: params.metadata,\n tags: params.tags,\n chunkSize: params.chunkSize,\n waitForConfirmation: params.quoteOnly\n ? false\n : params.waitForConfirmation ?? true,\n waitMaxAttempts: 60,\n waitIntervalMs: 5000,\n apiKey: params.apiKey,\n network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n { type: 'url', url: params.url },\n options\n );\n\n return {\n success: true,\n quote: {\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n },\n contentInfo: {\n url: params.url,\n },\n message: `Estimated Quote for URL: ${params.url}\\nTotal cost: ${quote.totalCostHbar} HBAR`,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n throw new Error(`Quote generation failed: ${errorMessage}`);\n }\n }\n\n try {\n let result: Awaited<ReturnType<typeof this.inscriberBuilder.inscribe>>;\n\n if (params.timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(`Inscription timed out after ${params.timeoutMs}ms`)\n ),\n params.timeoutMs\n );\n });\n\n result = await Promise.race([\n this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n ),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(\n { type: 'url', url: params.url },\n options\n );\n }\n\n if (result.confirmed && !result.quote) {\n const topicId =\n result.inscription?.topic_id || (result.result as any).topicId;\n const network = options.network || 'testnet';\n const cdnUrl = topicId\n ? `https://kiloscribe.com/api/inscription-cdn/${topicId}?network=${network}`\n : null;\n return `Successfully inscribed and confirmed content on the Hedera network!\\n\\nTransaction ID: ${\n (result.result as any).transactionId\n }\\nTopic ID: ${topicId || 'N/A'}${\n cdnUrl ? `\\nView inscription: ${cdnUrl}` : ''\n }\\n\\nThe inscription is now available.`;\n } else if (!result.quote && !result.confirmed) {\n return `Successfully submitted inscription to the Hedera network!\\n\\nTransaction ID: ${\n (result.result as any).transactionId\n }\\n\\nThe inscription is processing and will be confirmed shortly.`;\n } else {\n return 'Inscription operation completed.';\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to inscribe from URL';\n throw new Error(`Inscription failed: ${errorMessage}`);\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-agent-kit.es34.js","sources":["../../src/tools/hcs6/QueryDynamicRegistryTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseHCS6QueryTool } from './base-hcs6-tools';\nimport { HCS6QueryToolParams } from './hcs6-tool-params';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\n\n/**\n * Schema for querying a dynamic registry\n */\nconst QueryDynamicRegistrySchema = z.object({\n topicId: z.string()\n .describe('The registry topic ID to query'),\n limit: z.number()\n .optional()\n .default(100)\n .describe('Maximum number of entries to retrieve'),\n order: z.enum(['asc', 'desc'])\n .optional()\n .default('desc')\n .describe('Order of entries (desc shows latest first)'),\n skip: z.number()\n .optional()\n .describe('Number of entries to skip'),\n});\n\nexport type QueryDynamicRegistryInput = z.infer<typeof QueryDynamicRegistrySchema>;\n\n/**\n * Tool for querying HCS-6 dynamic registries\n */\nexport class QueryDynamicRegistryTool extends BaseHCS6QueryTool<typeof QueryDynamicRegistrySchema> {\n name = 'queryDynamicRegistry';\n description = 'Query a dynamic registry to get the current state of a dynamic hashinal';\n\n get specificInputSchema() {\n return QueryDynamicRegistrySchema;\n }\n\n constructor(params: HCS6QueryToolParams) {\n super(params);\n }\n\n protected async executeQuery(\n params: QueryDynamicRegistryInput,\n _runManager?: CallbackManagerForToolRun\n ): Promise<unknown> {\n const registry = await this.hcs6Builder.getRegistry(params.topicId, {\n limit: params.limit,\n order: params.order,\n skip: params.skip,\n });\n\n const latestEntry = registry.latestEntry ? {\n topicId: registry.latestEntry.message.t_id,\n timestamp: registry.latestEntry.timestamp,\n memo: registry.latestEntry.message.m,\n sequence: registry.latestEntry.sequence,\n payer: registry.latestEntry.payer,\n } : null;\n\n return `Successfully queried dynamic registry!\\n\\nRegistry Topic: ${registry.topicId}\\nRegistry Type: NON_INDEXED\\nTTL: ${registry.ttl} seconds\\nTotal Entries: ${registry.entries.length}${latestEntry ? `\\n\\nLatest Entry:\\n- Topic ID: ${latestEntry.topicId}\\n- Timestamp: ${latestEntry.timestamp}\\n- Memo: ${latestEntry.memo || 'N/A'}\\n- Sequence: ${latestEntry.sequence}` : '\\n\\nNo entries found in registry.'}`;\n }\n}"],"names":[],"mappings":";;AAQA,MAAM,6BAA6B,EAAE,OAAO;AAAA,EAC1C,SAAS,EAAE,SACR,SAAS,gCAAgC;AAAA,EAC5C,OAAO,EAAE,OAAA,EACN,SAAA,EACA,QAAQ,GAAG,EACX,SAAS,uCAAuC;AAAA,EACnD,OAAO,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAC1B,SAAA,EACA,QAAQ,MAAM,EACd,SAAS,4CAA4C;AAAA,EACxD,MAAM,EAAE,OAAA,EACL,SAAA,EACA,SAAS,2BAA2B;AACzC,CAAC;AAOM,MAAM,iCAAiC,kBAAqD;AAAA,EAQjG,YAAY,QAA6B;AACvC,UAAM,MAAM;AARd,SAAA,OAAO;AACP,SAAA,cAAc;AAAA,EAQd;AAAA,EANA,IAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAAA,EAMA,MAAgB,aACd,QACA,aACkB;AAClB,UAAM,WAAW,MAAM,KAAK,YAAY,YAAY,OAAO,SAAS;AAAA,MAClE,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,IAAA,CACd;AAED,UAAM,cAAc,SAAS,cAAc;AAAA,MACzC,SAAS,SAAS,YAAY,QAAQ;AAAA,MACtC,WAAW,SAAS,YAAY;AAAA,MAChC,MAAM,SAAS,YAAY,QAAQ;AAAA,MACnC,UAAU,SAAS,YAAY;AAAA,MAC/B,OAAO,SAAS,YAAY;AAAA,IAAA,IAC1B;AAEJ,WAAO;AAAA;AAAA,kBAA6D,SAAS,OAAO;AAAA;AAAA,OAAsC,SAAS,GAAG;AAAA,iBAA4B,SAAS,QAAQ,MAAM,GAAG,cAAc;AAAA;AAAA;AAAA,cAAkC,YAAY,OAAO;AAAA,eAAkB,YAAY,SAAS;AAAA,UAAa,YAAY,QAAQ,KAAK;AAAA,cAAiB,YAAY,QAAQ,KAAK,mCAAmC;AAAA,EAC3Z;AACF;"}