@hashgraphonline/standards-agent-kit 0.2.135 → 0.2.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/interfaces/FormValidatable.d.ts +4 -13
- package/dist/cjs/standards-agent-kit.cjs +1 -1
- package/dist/cjs/standards-agent-kit.cjs.map +1 -1
- package/dist/cjs/tools/inscriber/InscribeHashinalTool.d.ts +0 -8
- package/dist/es/interfaces/FormValidatable.d.ts +4 -13
- package/dist/es/standards-agent-kit.es37.js +2 -20
- package/dist/es/standards-agent-kit.es37.js.map +1 -1
- package/dist/es/standards-agent-kit.es44.js +1 -1
- package/dist/es/standards-agent-kit.es44.js.map +1 -1
- package/dist/es/tools/inscriber/InscribeHashinalTool.d.ts +0 -8
- package/dist/umd/interfaces/FormValidatable.d.ts +4 -13
- package/dist/umd/standards-agent-kit.umd.js +1 -1
- package/dist/umd/standards-agent-kit.umd.js.map +1 -1
- package/dist/umd/tools/inscriber/InscribeHashinalTool.d.ts +0 -8
- package/package.json +1 -1
- package/src/interfaces/FormValidatable.ts +9 -12
- package/src/tools/inscriber/InscribeHashinalTool.ts +2 -31
|
@@ -51,14 +51,6 @@ export declare class InscribeHashinalTool extends BaseInscriberQueryTool impleme
|
|
|
51
51
|
* Returns the focused schema for form generation
|
|
52
52
|
*/
|
|
53
53
|
getFormSchema(): z.ZodObject<z.ZodRawShape>;
|
|
54
|
-
/**
|
|
55
|
-
* Implementation of FormValidatable interface
|
|
56
|
-
* Validates metadata quality and provides detailed feedback
|
|
57
|
-
*/
|
|
58
|
-
validateMetadataQuality(input: unknown): {
|
|
59
|
-
needsForm: boolean;
|
|
60
|
-
reason: string;
|
|
61
|
-
};
|
|
62
54
|
protected executeQuery(params: z.infer<typeof inscribeHashinalSchema>, _runManager?: CallbackManagerForToolRun): Promise<InscriptionResponse>;
|
|
63
55
|
/**
|
|
64
56
|
* Creates HashLink block configuration for Hashinal inscriptions.
|
|
@@ -16,28 +16,19 @@ export interface FormValidatable {
|
|
|
16
16
|
*/
|
|
17
17
|
getFormSchema(): z.ZodSchema;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param input The input data to analyze
|
|
21
|
-
* @returns Object indicating if form is needed and the reason
|
|
22
|
-
*/
|
|
23
|
-
validateMetadataQuality?(input: unknown): {
|
|
24
|
-
needsForm: boolean;
|
|
25
|
-
reason: string;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Optional method to define which fields are essential for this tool
|
|
19
|
+
* Defines which fields are essential for this tool
|
|
29
20
|
* Essential fields are always shown in forms even if marked as optional
|
|
30
21
|
* @returns Array of field names that are essential for user experience
|
|
31
22
|
*/
|
|
32
|
-
getEssentialFields
|
|
23
|
+
getEssentialFields(): string[];
|
|
33
24
|
/**
|
|
34
|
-
*
|
|
25
|
+
* Determines if a field value should be considered empty
|
|
35
26
|
* Allows tools to define custom empty logic for their specific data types
|
|
36
27
|
* @param fieldName The name of the field
|
|
37
28
|
* @param value The value to check
|
|
38
29
|
* @returns true if the field should be considered empty
|
|
39
30
|
*/
|
|
40
|
-
isFieldEmpty
|
|
31
|
+
isFieldEmpty(fieldName: string, value: unknown): boolean;
|
|
41
32
|
}
|
|
42
33
|
/**
|
|
43
34
|
* Type guard to check if a tool implements FormValidatable
|
|
@@ -209,24 +209,6 @@ class InscribeHashinalTool extends BaseInscriberQueryTool {
|
|
|
209
209
|
});
|
|
210
210
|
return focusedSchema;
|
|
211
211
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Implementation of FormValidatable interface
|
|
214
|
-
* Validates metadata quality and provides detailed feedback
|
|
215
|
-
*/
|
|
216
|
-
validateMetadataQuality(input) {
|
|
217
|
-
const inputObj = input;
|
|
218
|
-
const hasRequiredMetadata = !!(inputObj.name && inputObj.description && inputObj.creator);
|
|
219
|
-
if (!hasRequiredMetadata) {
|
|
220
|
-
return {
|
|
221
|
-
needsForm: true,
|
|
222
|
-
reason: "Missing essential metadata (name, description, creator) for NFT creation"
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
return {
|
|
226
|
-
needsForm: false,
|
|
227
|
-
reason: "All required metadata fields present"
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
212
|
async executeQuery(params, _runManager) {
|
|
231
213
|
if (!params.url && !params.contentRef && !params.base64Data) {
|
|
232
214
|
return createInscriptionError({
|
|
@@ -382,7 +364,7 @@ class InscribeHashinalTool extends BaseInscriberQueryTool {
|
|
|
382
364
|
this.onEntityCreated?.({
|
|
383
365
|
entityId: jsonTopicId || imageTopicId || "unknown",
|
|
384
366
|
entityName: params.name || "Unnamed Inscription",
|
|
385
|
-
entityType: "
|
|
367
|
+
entityType: "topicId",
|
|
386
368
|
transactionId: result.result?.transactionId
|
|
387
369
|
});
|
|
388
370
|
if (params.withHashLinkBlocks) {
|
|
@@ -427,7 +409,7 @@ class InscribeHashinalTool extends BaseInscriberQueryTool {
|
|
|
427
409
|
this.onEntityCreated?.({
|
|
428
410
|
entityId: jsonTopicId || imageTopicId || "unknown",
|
|
429
411
|
entityName: params.name || "Unnamed Inscription",
|
|
430
|
-
entityType: "
|
|
412
|
+
entityType: "topicId",
|
|
431
413
|
transactionId: result.result?.transactionId
|
|
432
414
|
});
|
|
433
415
|
if (params.withHashLinkBlocks) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es37.js","sources":["../../src/tools/inscriber/InscribeHashinalTool.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { validateHIP412Metadata } from '../../validation/hip412-schemas';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { generateDefaultMetadata } from '../../utils/metadata-defaults';\nimport {\n extendZodSchema,\n renderConfigs,\n} from '../../lib/zod-render/schema-extension';\nimport {\n createInscriptionSuccess,\n createInscriptionQuote,\n createInscriptionError,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\n\n/**\n * Network-specific Hashinal block configuration for HashLink blocks\n */\nconst HASHLINK_BLOCK_CONFIG = {\n testnet: {\n blockId: '0.0.6617393',\n hashLink: 'hcs://12/0.0.6617393',\n template: '0.0.6617393',\n },\n mainnet: {\n blockId: '0.0.TBD',\n hashLink: 'hcs://12/0.0.TBD',\n template: '0.0.TBD',\n },\n};\n\n/**\n * Gets the appropriate HashLink block configuration for the specified network.\n * Provides graceful fallback to testnet for unknown networks or undeployed mainnet blocks.\n *\n * @param network The network type to get configuration for\n * @returns Network-specific block configuration with blockId, hashLink, and template\n */\n// @ts-ignore - keep untyped to satisfy mixed parser while using runtime narrowing\nfunction getHashLinkBlockId(network) {\n const config =\n network === 'mainnet'\n ? HASHLINK_BLOCK_CONFIG.mainnet\n : HASHLINK_BLOCK_CONFIG.testnet;\n if (!config || config.blockId === '0.0.TBD') {\n return HASHLINK_BLOCK_CONFIG.testnet;\n }\n return config;\n}\n\n// Note: Using inline return type annotations to avoid parser issues with interface declarations\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = extendZodSchema(\n z.object({\n url: z\n .string()\n .optional()\n .describe(\n 'The URL of the content to inscribe as Hashinal NFT (use this OR contentRef)'\n ),\n contentRef: contentRefSchema\n .optional()\n .describe(\n 'Content reference ID in format \"content-ref:[id]\" for already stored content (use this OR url)'\n ),\n base64Data: z\n .string()\n .optional()\n .describe(\n 'Base64 encoded content data (use this if neither url nor contentRef provided)'\n ),\n fileName: z\n .string()\n .optional()\n .describe(\n 'File name for the content (required when using base64Data or contentRef)'\n ),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content (e.g., \"image/png\", \"image/jpeg\")'),\n name: z\n .string()\n .optional()\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n creator: z\n .string()\n .optional()\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n description: z\n .string()\n .optional()\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card\")'\n ),\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe(\n 'Collectible traits and characteristics (e.g., \"Rarity\": \"Epic\", \"Color\": \"Blue\", \"Style\": \"Abstract\")'\n ),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Additional properties'),\n jsonFileURL: z\n .string()\n .url()\n .optional()\n .describe('URL to JSON metadata file'),\n fileStandard: z\n .enum(['1', '6'])\n .optional()\n .default('1')\n .describe(\n 'HCS file standard: 1 for static Hashinals (HCS-5), 6 for dynamic Hashinals (HCS-6)'\n ),\n tags: z.array(z.string()).optional().describe('Tags to categorize the NFT'),\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 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 withHashLinkBlocks: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'If true, creates interactive HashLink blocks for the inscribed content and returns block data alongside the inscription response'\n ),\n renderForm: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'Whether to show a form to collect metadata. Set to false only if user provided complete metadata including name, description, creator, and attributes.'\n ),\n })\n).withRender({\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n});\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool\n extends BaseInscriberQueryTool\n implements FormValidatable\n{\n name = 'inscribeHashinal';\n description =\n 'Tool for inscribing Hashinal NFTs. CRITICAL: When user provides content (url/contentRef/base64Data), call with ONLY the content parameters - DO NOT auto-generate name, description, creator, or attributes. A form will be automatically shown to collect metadata from the user. Only include metadata parameters if the user explicitly provided them in their message.';\n\n // Declare entity resolution preferences to preserve user-specified literal fields\n getEntityResolutionPreferences(): Record<string, string> {\n return {\n name: 'literal',\n description: 'literal',\n creator: 'literal',\n attributes: 'literal',\n properties: 'literal',\n };\n }\n\n get specificInputSchema(): z.ZodObject<z.ZodRawShape> {\n const baseSchema =\n (inscribeHashinalSchema as z.ZodType & { _def?: { schema?: z.ZodType } })\n ._def?.schema || inscribeHashinalSchema;\n return baseSchema as z.ZodObject<z.ZodRawShape>;\n }\n\n private _schemaWithRenderConfig?: z.ZodObject<z.ZodRawShape>;\n\n override get schema(): z.ZodObject<z.ZodRawShape> {\n if (!this._schemaWithRenderConfig) {\n const baseSchema = this.specificInputSchema;\n const schemaWithRender = baseSchema as z.ZodObject<z.ZodRawShape> & {\n _renderConfig?: {\n fieldType: string;\n ui: { label: string; description: string };\n };\n };\n\n if (!schemaWithRender._renderConfig) {\n schemaWithRender._renderConfig = {\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n };\n }\n this._schemaWithRenderConfig = baseSchema;\n }\n return this._schemaWithRenderConfig;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a form should be generated for the given input\n */\n shouldGenerateForm(input: unknown): boolean {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n const inputObj = input as Record<string, unknown>;\n\n logger.info('InscribeHashinalTool: Checking if form should be generated', {\n inputKeys: Object.keys(inputObj || {}),\n hasContent: !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n ),\n renderFormProvided: 'renderForm' in inputObj,\n renderFormValue: inputObj.renderForm,\n });\n\n const hasContentSource = !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n );\n\n if (!hasContentSource) {\n logger.info('InscribeHashinalTool: No content source provided');\n return false;\n }\n\n if ('renderForm' in inputObj && inputObj.renderForm === false) {\n logger.info(\n 'InscribeHashinalTool: renderForm=false, skipping form generation'\n );\n return false;\n }\n\n const isNonEmptyString = (v: unknown): v is string => {\n if (typeof v !== 'string') {\n return false;\n }\n if (v.trim().length === 0) {\n return false;\n }\n return true;\n };\n\n const hasRequiredMetadata =\n isNonEmptyString(inputObj.name) &&\n isNonEmptyString(inputObj.description) &&\n isNonEmptyString(inputObj.creator);\n\n if (hasRequiredMetadata) {\n logger.info(\n 'InscribeHashinalTool: Required metadata present, skipping form generation'\n );\n return false;\n }\n\n logger.info(\n 'InscribeHashinalTool: Content provided, showing form for metadata collection'\n );\n return true;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns the focused schema for form generation\n */\n getFormSchema(): z.ZodObject<z.ZodRawShape> {\n const focusedSchema = extendZodSchema(\n z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n\n description: z\n .string()\n .min(1, 'Description is required')\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n\n creator: z\n .string()\n .min(1, 'Creator is required')\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z\n .string()\n .describe('Trait name (e.g., \"Rarity\", \"Color\", \"Style\")'),\n value: z\n .union([z.string(), z.number()])\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe('Collectible traits and characteristics.'),\n\n type: z\n .string()\n .optional()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card)'\n ),\n })\n ).withRender({\n fieldType: 'object',\n ui: {\n label: 'Complete NFT Metadata',\n description: 'Provide meaningful metadata to create a valuable NFT',\n },\n });\n\n return focusedSchema as unknown as z.ZodObject<z.ZodRawShape>;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Validates metadata quality and provides detailed feedback\n */\n validateMetadataQuality(input: unknown): {\n needsForm: boolean;\n reason: string;\n } {\n const inputObj = input as Record<string, unknown>;\n const hasRequiredMetadata = !!(\n inputObj.name &&\n inputObj.description &&\n inputObj.creator\n );\n\n if (!hasRequiredMetadata) {\n return {\n needsForm: true,\n reason:\n 'Missing essential metadata (name, description, creator) for NFT creation',\n };\n }\n\n return {\n needsForm: false,\n reason: 'All required metadata fields present',\n };\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<InscriptionResponse> {\n if (!params.url && !params.contentRef && !params.base64Data) {\n return createInscriptionError({\n code: 'MISSING_CONTENT',\n details: 'No content source provided',\n suggestions: [\n 'Provide a URL to content you want to inscribe',\n 'Upload a file and use the content reference',\n 'Provide base64-encoded content data',\n ],\n });\n }\n\n const operatorAccount =\n this.inscriberBuilder[\n 'hederaKit'\n ]?.client?.operatorAccountId?.toString() || '0.0.unknown';\n\n const rawMetadata = {\n ...generateDefaultMetadata({\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n fileName: params.fileName,\n mimeType: params.mimeType,\n operatorAccount,\n }),\n attributes: Array.isArray(params.attributes) ? params.attributes : [],\n properties:\n (params.properties as Record<string, unknown> | undefined) || {},\n };\n\n let validatedMetadata;\n try {\n validatedMetadata = validateHIP412Metadata(rawMetadata);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return createInscriptionError({\n code: 'METADATA_VALIDATION_FAILED',\n details: `Metadata validation error: ${errorMessage}`,\n suggestions: [\n 'Ensure all required metadata fields are provided',\n 'Check that attribute values are valid',\n 'Verify metadata follows HIP-412 standard',\n ],\n });\n }\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata: validatedMetadata,\n jsonFileURL: params.jsonFileURL,\n fileStandard: params.fileStandard,\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 network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n let inscriptionData: InscriptionInput;\n\n if (params.url) {\n inscriptionData = { type: 'url', url: params.url };\n } else if (params.contentRef || params.base64Data) {\n const inputData = params.contentRef || params.base64Data || '';\n const { buffer, mimeType, fileName } = await this.resolveContent(\n inputData,\n params.mimeType,\n params.fileName\n );\n\n inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName: fileName || params.fileName || 'hashinal-content',\n mimeType: mimeType || params.mimeType,\n };\n } else {\n throw new Error('No valid input data provided for inscription');\n }\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n inscriptionData,\n options\n );\n\n return createInscriptionQuote({\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n content: {\n name: params.name,\n creator: params.creator,\n type: params.type,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n return createInscriptionError({\n code: 'QUOTE_GENERATION_FAILED',\n details: `Quote generation failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify content is accessible',\n 'Try again in a moment',\n ],\n });\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(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const imageTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.topic_id;\n const jsonTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.jsonTopicId;\n const network = options.network || 'testnet';\n\n const cdnUrl = jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${jsonTopicId}?network=${network}`\n : null;\n\n const fileStandard = params.fileStandard || '1';\n const hrl = jsonTopicId ? `hcs://${fileStandard}/${jsonTopicId}` : null;\n const standardType = fileStandard === '6' ? 'Dynamic' : 'Static';\n\n if (!hrl) {\n return createInscriptionError({\n code: 'MISSING_TOPIC_ID',\n details: 'Inscription completed but topic ID is missing',\n suggestions: [\n 'Try the inscription again',\n 'Contact support if the issue persists',\n ],\n });\n }\n\n const inscriptionResponse = createInscriptionSuccess({\n hrl,\n topicId: jsonTopicId || imageTopicId || 'unknown',\n standard: standardType as 'Static' | 'Dynamic',\n cdnUrl: cdnUrl || undefined,\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n },\n });\n\n this.onEntityCreated?.({\n entityId: jsonTopicId || imageTopicId || 'unknown',\n entityName: params.name || 'Unnamed Inscription',\n entityType: 'topic',\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n });\n\n if (params.withHashLinkBlocks) {\n try {\n const blockData = await this.createHashLinkBlock(\n inscriptionResponse,\n inscriptionData.type === 'buffer'\n ? inscriptionData.mimeType\n : undefined\n );\n\n inscriptionResponse.hashLinkBlock = blockData;\n } catch (blockError) {\n // Log error but don't fail the inscription\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.error('Failed to create HashLink block', {\n error: blockError,\n });\n }\n }\n\n return inscriptionResponse;\n } else if (!result.quote && !result.confirmed) {\n const imageTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.topic_id;\n const jsonTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.jsonTopicId;\n\n if (jsonTopicId || imageTopicId) {\n const network = options.network || 'testnet';\n const cdnUrl = jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${jsonTopicId}?network=${network}`\n : null;\n\n const fileStandard = params.fileStandard || '1';\n const hrl = jsonTopicId\n ? `hcs://${fileStandard}/${jsonTopicId}`\n : null;\n const standardType = fileStandard === '6' ? 'Dynamic' : 'Static';\n\n if (hrl) {\n const inscriptionResponse = createInscriptionSuccess({\n hrl,\n topicId: jsonTopicId || imageTopicId || 'unknown',\n standard: standardType as 'Static' | 'Dynamic',\n cdnUrl: cdnUrl || undefined,\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n },\n });\n\n this.onEntityCreated?.({\n entityId: jsonTopicId || imageTopicId || 'unknown',\n entityName: params.name || 'Unnamed Inscription',\n entityType: 'topic',\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n });\n\n if (params.withHashLinkBlocks) {\n try {\n const blockData = await this.createHashLinkBlock(\n inscriptionResponse,\n inscriptionData.type === 'buffer'\n ? inscriptionData.mimeType\n : undefined\n );\n\n inscriptionResponse.hashLinkBlock = blockData;\n } catch (blockError) {\n // Log error but don't fail the inscription\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.error('Failed to create HashLink block', {\n error: blockError,\n });\n }\n }\n\n return inscriptionResponse;\n }\n }\n\n const transactionId =\n (result.result as { transactionId?: string })?.transactionId ||\n 'unknown';\n return createInscriptionError({\n code: 'INSCRIPTION_PENDING',\n details: `Inscription submitted but not yet confirmed. Transaction ID: ${transactionId}`,\n suggestions: [\n 'Wait a few moments for confirmation',\n 'Check the transaction status on a Hedera explorer',\n \"Try the inscription again if it doesn't confirm within 5 minutes\",\n ],\n });\n } else {\n return createInscriptionError({\n code: 'UNKNOWN_STATE',\n details: 'Inscription completed but result state is unclear',\n suggestions: [\n 'Check if the inscription was successful manually',\n 'Try the inscription again',\n ],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n return createInscriptionError({\n code: 'INSCRIPTION_FAILED',\n details: `Inscription failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify you have sufficient HBAR balance',\n 'Ensure content is accessible and valid',\n 'Try again in a moment',\n ],\n });\n }\n }\n\n /**\n * Creates HashLink block configuration for Hashinal inscriptions.\n * Automatically detects network and selects appropriate block ID configuration.\n * Uses testnet block as fallback for unknown networks or undeployed mainnet blocks.\n *\n * @param response The inscription response containing metadata and network information\n * @param _mimeType Optional MIME type (currently unused, preserved for compatibility)\n * @returns HCS12BlockResult with network-specific block configuration\n *\n * @example\n * ```typescript\n * // Testnet usage (automatic detection from client)\n * const testnetClient = Client.forTestnet();\n * const tool = new InscribeHashinalTool(testnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * console.log(block.blockId); // '0.0.6617393'\n * console.log(block.hashLink); // 'hcs://12/0.0.6617393'\n *\n * // Mainnet usage (automatic detection from client)\n * const mainnetClient = Client.forMainnet();\n * const tool = new InscribeHashinalTool(mainnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * console.log(block.blockId); // Network-specific mainnet block ID\n *\n * // HashLink Block Response Structure:\n * {\n * blockId: string; // Hedera account ID format (e.g., '0.0.6617393')\n * hashLink: string; // HCS-12 URL format: 'hcs://12/{blockId}'\n * template: string; // Block template reference matching blockId\n * attributes: { // Metadata for client-side processing\n * name: string; // Content display name\n * creator: string; // Creator account ID\n * topicId: string; // HCS topic containing the inscription\n * hrl: string; // Hedera Resource Locator\n * network: string; // Network type: 'testnet' | 'mainnet'\n * }\n * }\n *\n * // Render function usage in HashLink blocks:\n * // The block's JavaScript render function receives this structure\n * // and can access network-specific resources through attributes.network\n * ```\n */\n private async createHashLinkBlock(\n response: ReturnType<typeof createInscriptionSuccess>,\n _mimeType?: string\n ): Promise<{\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n }> {\n const clientNetwork = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const cdnNetwork = response.inscription.cdnUrl?.includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n if (clientNetwork !== cdnNetwork) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn(\n `Network mismatch detected: client=${clientNetwork}, cdn=${cdnNetwork}. Using client network.`\n );\n }\n\n const network = clientNetwork;\n const config = getHashLinkBlockId(network);\n\n return {\n blockId: config.blockId,\n hashLink: config.hashLink,\n template: config.template,\n attributes: {\n name: response.metadata.name || 'Untitled Content',\n creator: response.metadata.creator || '',\n topicId: response.inscription.topicId,\n hrl: response.inscription.hrl,\n network: network,\n },\n };\n }\n\n private async resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): Promise<{\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n }> {\n const trimmedInput = input.trim();\n\n const resolver =\n this.getContentResolver() || ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n private handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n } {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns essential fields that should always be shown in forms\n */\n getEssentialFields(): string[] {\n return ['name', 'description', 'creator', 'attributes'];\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a field value should be considered empty for this tool\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n if (fieldName === 'attributes' && Array.isArray(value)) {\n return value.every(\n (attr) =>\n !attr ||\n (typeof attr === 'object' && (!attr.trait_type || !attr.value))\n );\n }\n\n return false;\n }\n}\n"],"names":["buffer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es37.js","sources":["../../src/tools/inscriber/InscribeHashinalTool.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n} from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { validateHIP412Metadata } from '../../validation/hip412-schemas';\nimport { contentRefSchema } from '../../validation/content-ref-schemas';\nimport { generateDefaultMetadata } from '../../utils/metadata-defaults';\nimport {\n extendZodSchema,\n renderConfigs,\n} from '../../lib/zod-render/schema-extension';\nimport {\n createInscriptionSuccess,\n createInscriptionQuote,\n createInscriptionError,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\n\n/**\n * Network-specific Hashinal block configuration for HashLink blocks\n */\nconst HASHLINK_BLOCK_CONFIG = {\n testnet: {\n blockId: '0.0.6617393',\n hashLink: 'hcs://12/0.0.6617393',\n template: '0.0.6617393',\n },\n mainnet: {\n blockId: '0.0.TBD',\n hashLink: 'hcs://12/0.0.TBD',\n template: '0.0.TBD',\n },\n};\n\n/**\n * Gets the appropriate HashLink block configuration for the specified network.\n * Provides graceful fallback to testnet for unknown networks or undeployed mainnet blocks.\n *\n * @param network The network type to get configuration for\n * @returns Network-specific block configuration with blockId, hashLink, and template\n */\n// @ts-ignore - keep untyped to satisfy mixed parser while using runtime narrowing\nfunction getHashLinkBlockId(network) {\n const config =\n network === 'mainnet'\n ? HASHLINK_BLOCK_CONFIG.mainnet\n : HASHLINK_BLOCK_CONFIG.testnet;\n if (!config || config.blockId === '0.0.TBD') {\n return HASHLINK_BLOCK_CONFIG.testnet;\n }\n return config;\n}\n\n// Note: Using inline return type annotations to avoid parser issues with interface declarations\n\n/**\n * Schema for inscribing Hashinal NFT\n */\nconst inscribeHashinalSchema = extendZodSchema(\n z.object({\n url: z\n .string()\n .optional()\n .describe(\n 'The URL of the content to inscribe as Hashinal NFT (use this OR contentRef)'\n ),\n contentRef: contentRefSchema\n .optional()\n .describe(\n 'Content reference ID in format \"content-ref:[id]\" for already stored content (use this OR url)'\n ),\n base64Data: z\n .string()\n .optional()\n .describe(\n 'Base64 encoded content data (use this if neither url nor contentRef provided)'\n ),\n fileName: z\n .string()\n .optional()\n .describe(\n 'File name for the content (required when using base64Data or contentRef)'\n ),\n mimeType: z\n .string()\n .optional()\n .describe('MIME type of the content (e.g., \"image/png\", \"image/jpeg\")'),\n name: z\n .string()\n .optional()\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n creator: z\n .string()\n .optional()\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n description: z\n .string()\n .optional()\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n type: z\n .string()\n .optional()\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card\")'\n ),\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z.string(),\n value: z.union([z.string(), z.number()]),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe(\n 'Collectible traits and characteristics (e.g., \"Rarity\": \"Epic\", \"Color\": \"Blue\", \"Style\": \"Abstract\")'\n ),\n properties: z\n .record(z.unknown())\n .optional()\n .describe('Additional properties'),\n jsonFileURL: z\n .string()\n .url()\n .optional()\n .describe('URL to JSON metadata file'),\n fileStandard: z\n .enum(['1', '6'])\n .optional()\n .default('1')\n .describe(\n 'HCS file standard: 1 for static Hashinals (HCS-5), 6 for dynamic Hashinals (HCS-6)'\n ),\n tags: z.array(z.string()).optional().describe('Tags to categorize the NFT'),\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 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 withHashLinkBlocks: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'If true, creates interactive HashLink blocks for the inscribed content and returns block data alongside the inscription response'\n ),\n renderForm: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n 'Whether to show a form to collect metadata. Set to false only if user provided complete metadata including name, description, creator, and attributes.'\n ),\n })\n).withRender({\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n});\n\n/**\n * Tool for inscribing Hashinal NFTs\n */\nexport class InscribeHashinalTool\n extends BaseInscriberQueryTool\n implements FormValidatable\n{\n name = 'inscribeHashinal';\n description =\n 'Tool for inscribing Hashinal NFTs. CRITICAL: When user provides content (url/contentRef/base64Data), call with ONLY the content parameters - DO NOT auto-generate name, description, creator, or attributes. A form will be automatically shown to collect metadata from the user. Only include metadata parameters if the user explicitly provided them in their message.';\n\n // Declare entity resolution preferences to preserve user-specified literal fields\n getEntityResolutionPreferences(): Record<string, string> {\n return {\n name: 'literal',\n description: 'literal',\n creator: 'literal',\n attributes: 'literal',\n properties: 'literal',\n };\n }\n\n get specificInputSchema(): z.ZodObject<z.ZodRawShape> {\n const baseSchema =\n (inscribeHashinalSchema as z.ZodType & { _def?: { schema?: z.ZodType } })\n ._def?.schema || inscribeHashinalSchema;\n return baseSchema as z.ZodObject<z.ZodRawShape>;\n }\n\n private _schemaWithRenderConfig?: z.ZodObject<z.ZodRawShape>;\n\n override get schema(): z.ZodObject<z.ZodRawShape> {\n if (!this._schemaWithRenderConfig) {\n const baseSchema = this.specificInputSchema;\n const schemaWithRender = baseSchema as z.ZodObject<z.ZodRawShape> & {\n _renderConfig?: {\n fieldType: string;\n ui: { label: string; description: string };\n };\n };\n\n if (!schemaWithRender._renderConfig) {\n schemaWithRender._renderConfig = {\n fieldType: 'object',\n ui: {\n label: 'Inscribe Hashinal NFT',\n description: 'Create a Hashinal inscription for NFT minting',\n },\n };\n }\n this._schemaWithRenderConfig = baseSchema;\n }\n return this._schemaWithRenderConfig;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a form should be generated for the given input\n */\n shouldGenerateForm(input: unknown): boolean {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n const inputObj = input as Record<string, unknown>;\n\n logger.info('InscribeHashinalTool: Checking if form should be generated', {\n inputKeys: Object.keys(inputObj || {}),\n hasContent: !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n ),\n renderFormProvided: 'renderForm' in inputObj,\n renderFormValue: inputObj.renderForm,\n });\n\n const hasContentSource = !!(\n inputObj.url ||\n inputObj.contentRef ||\n inputObj.base64Data\n );\n\n if (!hasContentSource) {\n logger.info('InscribeHashinalTool: No content source provided');\n return false;\n }\n\n if ('renderForm' in inputObj && inputObj.renderForm === false) {\n logger.info(\n 'InscribeHashinalTool: renderForm=false, skipping form generation'\n );\n return false;\n }\n\n const isNonEmptyString = (v: unknown): v is string => {\n if (typeof v !== 'string') {\n return false;\n }\n if (v.trim().length === 0) {\n return false;\n }\n return true;\n };\n\n const hasRequiredMetadata =\n isNonEmptyString(inputObj.name) &&\n isNonEmptyString(inputObj.description) &&\n isNonEmptyString(inputObj.creator);\n\n if (hasRequiredMetadata) {\n logger.info(\n 'InscribeHashinalTool: Required metadata present, skipping form generation'\n );\n return false;\n }\n\n logger.info(\n 'InscribeHashinalTool: Content provided, showing form for metadata collection'\n );\n return true;\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns the focused schema for form generation\n */\n getFormSchema(): z.ZodObject<z.ZodRawShape> {\n const focusedSchema = extendZodSchema(\n z.object({\n name: z\n .string()\n .min(1, 'Name is required')\n .describe(\n 'Display name for the NFT (e.g., \"Sunset Landscape #42\", \"Digital Abstract Art\")'\n ),\n\n description: z\n .string()\n .min(1, 'Description is required')\n .describe(\n 'Meaningful description of the artwork, story, or concept behind this NFT'\n ),\n\n creator: z\n .string()\n .min(1, 'Creator is required')\n .describe(\n 'Creator account ID, artist name, or brand (e.g., \"0.0.123456\", \"ArtistName\", \"StudioBrand\")'\n ),\n\n attributes: extendZodSchema(\n z.array(\n z.object({\n trait_type: z\n .string()\n .describe('Trait name (e.g., \"Rarity\", \"Color\", \"Style\")'),\n value: z\n .union([z.string(), z.number()])\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe('Collectible traits and characteristics.'),\n\n type: z\n .string()\n .optional()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .describe(\n 'Category or genre of the NFT (e.g., \"Digital Art\", \"Photography\", \"Collectible Card)'\n ),\n })\n ).withRender({\n fieldType: 'object',\n ui: {\n label: 'Complete NFT Metadata',\n description: 'Provide meaningful metadata to create a valuable NFT',\n },\n });\n\n return focusedSchema as unknown as z.ZodObject<z.ZodRawShape>;\n }\n\n protected async executeQuery(\n params: z.infer<typeof inscribeHashinalSchema>,\n _runManager?: CallbackManagerForToolRun\n ): Promise<InscriptionResponse> {\n if (!params.url && !params.contentRef && !params.base64Data) {\n return createInscriptionError({\n code: 'MISSING_CONTENT',\n details: 'No content source provided',\n suggestions: [\n 'Provide a URL to content you want to inscribe',\n 'Upload a file and use the content reference',\n 'Provide base64-encoded content data',\n ],\n });\n }\n\n const operatorAccount =\n this.inscriberBuilder[\n 'hederaKit'\n ]?.client?.operatorAccountId?.toString() || '0.0.unknown';\n\n const rawMetadata = {\n ...generateDefaultMetadata({\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n fileName: params.fileName,\n mimeType: params.mimeType,\n operatorAccount,\n }),\n attributes: Array.isArray(params.attributes) ? params.attributes : [],\n properties:\n (params.properties as Record<string, unknown> | undefined) || {},\n };\n\n let validatedMetadata;\n try {\n validatedMetadata = validateHIP412Metadata(rawMetadata);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return createInscriptionError({\n code: 'METADATA_VALIDATION_FAILED',\n details: `Metadata validation error: ${errorMessage}`,\n suggestions: [\n 'Ensure all required metadata fields are provided',\n 'Check that attribute values are valid',\n 'Verify metadata follows HIP-412 standard',\n ],\n });\n }\n\n const options: InscriptionOptions = {\n mode: 'hashinal',\n metadata: validatedMetadata,\n jsonFileURL: params.jsonFileURL,\n fileStandard: params.fileStandard,\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 network: this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet',\n quoteOnly: params.quoteOnly,\n };\n\n let inscriptionData: InscriptionInput;\n\n if (params.url) {\n inscriptionData = { type: 'url', url: params.url };\n } else if (params.contentRef || params.base64Data) {\n const inputData = params.contentRef || params.base64Data || '';\n const { buffer, mimeType, fileName } = await this.resolveContent(\n inputData,\n params.mimeType,\n params.fileName\n );\n\n inscriptionData = {\n type: 'buffer' as const,\n buffer,\n fileName: fileName || params.fileName || 'hashinal-content',\n mimeType: mimeType || params.mimeType,\n };\n } else {\n throw new Error('No valid input data provided for inscription');\n }\n\n if (params.quoteOnly) {\n try {\n const quote = await this.generateInscriptionQuote(\n inscriptionData,\n options\n );\n\n return createInscriptionQuote({\n totalCostHbar: quote.totalCostHbar,\n validUntil: quote.validUntil,\n breakdown: quote.breakdown,\n content: {\n name: params.name,\n creator: params.creator,\n type: params.type,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to generate inscription quote';\n return createInscriptionError({\n code: 'QUOTE_GENERATION_FAILED',\n details: `Quote generation failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify content is accessible',\n 'Try again in a moment',\n ],\n });\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(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const imageTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.topic_id;\n const jsonTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.jsonTopicId;\n const network = options.network || 'testnet';\n\n const cdnUrl = jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${jsonTopicId}?network=${network}`\n : null;\n\n const fileStandard = params.fileStandard || '1';\n const hrl = jsonTopicId ? `hcs://${fileStandard}/${jsonTopicId}` : null;\n const standardType = fileStandard === '6' ? 'Dynamic' : 'Static';\n\n if (!hrl) {\n return createInscriptionError({\n code: 'MISSING_TOPIC_ID',\n details: 'Inscription completed but topic ID is missing',\n suggestions: [\n 'Try the inscription again',\n 'Contact support if the issue persists',\n ],\n });\n }\n\n const inscriptionResponse = createInscriptionSuccess({\n hrl,\n topicId: jsonTopicId || imageTopicId || 'unknown',\n standard: standardType as 'Static' | 'Dynamic',\n cdnUrl: cdnUrl || undefined,\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n },\n });\n\n this.onEntityCreated?.({\n entityId: jsonTopicId || imageTopicId || 'unknown',\n entityName: params.name || 'Unnamed Inscription',\n entityType: 'topicId',\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n });\n\n if (params.withHashLinkBlocks) {\n try {\n const blockData = await this.createHashLinkBlock(\n inscriptionResponse,\n inscriptionData.type === 'buffer'\n ? inscriptionData.mimeType\n : undefined\n );\n\n inscriptionResponse.hashLinkBlock = blockData;\n } catch (blockError) {\n // Log error but don't fail the inscription\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.error('Failed to create HashLink block', {\n error: blockError,\n });\n }\n }\n\n return inscriptionResponse;\n } else if (!result.quote && !result.confirmed) {\n const imageTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.topic_id;\n const jsonTopicId = (\n result.inscription as { topic_id?: string; jsonTopicId?: string }\n )?.jsonTopicId;\n\n if (jsonTopicId || imageTopicId) {\n const network = options.network || 'testnet';\n const cdnUrl = jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${jsonTopicId}?network=${network}`\n : null;\n\n const fileStandard = params.fileStandard || '1';\n const hrl = jsonTopicId\n ? `hcs://${fileStandard}/${jsonTopicId}`\n : null;\n const standardType = fileStandard === '6' ? 'Dynamic' : 'Static';\n\n if (hrl) {\n const inscriptionResponse = createInscriptionSuccess({\n hrl,\n topicId: jsonTopicId || imageTopicId || 'unknown',\n standard: standardType as 'Static' | 'Dynamic',\n cdnUrl: cdnUrl || undefined,\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: params.attributes,\n },\n });\n\n this.onEntityCreated?.({\n entityId: jsonTopicId || imageTopicId || 'unknown',\n entityName: params.name || 'Unnamed Inscription',\n entityType: 'topicId',\n transactionId: (result.result as { transactionId?: string })\n ?.transactionId,\n });\n\n if (params.withHashLinkBlocks) {\n try {\n const blockData = await this.createHashLinkBlock(\n inscriptionResponse,\n inscriptionData.type === 'buffer'\n ? inscriptionData.mimeType\n : undefined\n );\n\n inscriptionResponse.hashLinkBlock = blockData;\n } catch (blockError) {\n // Log error but don't fail the inscription\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.error('Failed to create HashLink block', {\n error: blockError,\n });\n }\n }\n\n return inscriptionResponse;\n }\n }\n\n const transactionId =\n (result.result as { transactionId?: string })?.transactionId ||\n 'unknown';\n return createInscriptionError({\n code: 'INSCRIPTION_PENDING',\n details: `Inscription submitted but not yet confirmed. Transaction ID: ${transactionId}`,\n suggestions: [\n 'Wait a few moments for confirmation',\n 'Check the transaction status on a Hedera explorer',\n \"Try the inscription again if it doesn't confirm within 5 minutes\",\n ],\n });\n } else {\n return createInscriptionError({\n code: 'UNKNOWN_STATE',\n details: 'Inscription completed but result state is unclear',\n suggestions: [\n 'Check if the inscription was successful manually',\n 'Try the inscription again',\n ],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n return createInscriptionError({\n code: 'INSCRIPTION_FAILED',\n details: `Inscription failed: ${errorMessage}`,\n suggestions: [\n 'Check network connectivity',\n 'Verify you have sufficient HBAR balance',\n 'Ensure content is accessible and valid',\n 'Try again in a moment',\n ],\n });\n }\n }\n\n /**\n * Creates HashLink block configuration for Hashinal inscriptions.\n * Automatically detects network and selects appropriate block ID configuration.\n * Uses testnet block as fallback for unknown networks or undeployed mainnet blocks.\n *\n * @param response The inscription response containing metadata and network information\n * @param _mimeType Optional MIME type (currently unused, preserved for compatibility)\n * @returns HCS12BlockResult with network-specific block configuration\n *\n * @example\n * ```typescript\n * // Testnet usage (automatic detection from client)\n * const testnetClient = Client.forTestnet();\n * const tool = new InscribeHashinalTool(testnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * console.log(block.blockId); // '0.0.6617393'\n * console.log(block.hashLink); // 'hcs://12/0.0.6617393'\n *\n * // Mainnet usage (automatic detection from client)\n * const mainnetClient = Client.forMainnet();\n * const tool = new InscribeHashinalTool(mainnetClient);\n * const block = await tool.createHashLinkBlock(inscriptionResponse);\n * console.log(block.blockId); // Network-specific mainnet block ID\n *\n * // HashLink Block Response Structure:\n * {\n * blockId: string; // Hedera account ID format (e.g., '0.0.6617393')\n * hashLink: string; // HCS-12 URL format: 'hcs://12/{blockId}'\n * template: string; // Block template reference matching blockId\n * attributes: { // Metadata for client-side processing\n * name: string; // Content display name\n * creator: string; // Creator account ID\n * topicId: string; // HCS topic containing the inscription\n * hrl: string; // Hedera Resource Locator\n * network: string; // Network type: 'testnet' | 'mainnet'\n * }\n * }\n *\n * // Render function usage in HashLink blocks:\n * // The block's JavaScript render function receives this structure\n * // and can access network-specific resources through attributes.network\n * ```\n */\n private async createHashLinkBlock(\n response: ReturnType<typeof createInscriptionSuccess>,\n _mimeType?: string\n ): Promise<{\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n }> {\n const clientNetwork = this.inscriberBuilder['hederaKit'].client.network\n .toString()\n .includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n const cdnNetwork = response.inscription.cdnUrl?.includes('mainnet')\n ? 'mainnet'\n : 'testnet';\n\n if (clientNetwork !== cdnNetwork) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn(\n `Network mismatch detected: client=${clientNetwork}, cdn=${cdnNetwork}. Using client network.`\n );\n }\n\n const network = clientNetwork;\n const config = getHashLinkBlockId(network);\n\n return {\n blockId: config.blockId,\n hashLink: config.hashLink,\n template: config.template,\n attributes: {\n name: response.metadata.name || 'Untitled Content',\n creator: response.metadata.creator || '',\n topicId: response.inscription.topicId,\n hrl: response.inscription.hrl,\n network: network,\n },\n };\n }\n\n private async resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): Promise<{\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n }> {\n const trimmedInput = input.trim();\n\n const resolver =\n this.getContentResolver() || ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n const referenceId = resolver.extractReferenceId(trimmedInput);\n\n if (referenceId) {\n try {\n const resolution = await resolver.resolveReference(referenceId);\n\n return {\n buffer: resolution.content,\n mimeType: resolution.metadata?.mimeType || providedMimeType,\n fileName: resolution.metadata?.fileName || providedFileName,\n wasReference: true,\n };\n } catch (error) {\n const errorMsg =\n error instanceof Error\n ? error.message\n : 'Unknown error resolving reference';\n throw new Error(`Reference resolution failed: ${errorMsg}`);\n }\n }\n\n return this.handleDirectContent(\n trimmedInput,\n providedMimeType,\n providedFileName\n );\n }\n\n private handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n ): {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n } {\n const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);\n\n if (isValidBase64) {\n try {\n const buffer = Buffer.from(input, 'base64');\n return {\n buffer,\n mimeType: providedMimeType,\n fileName: providedFileName,\n wasReference: false,\n };\n } catch (error) {\n throw new Error(\n 'Failed to decode base64 data. Please ensure the data is properly encoded.'\n );\n }\n }\n\n const buffer = Buffer.from(input, 'utf8');\n return {\n buffer,\n mimeType: providedMimeType || 'text/plain',\n fileName: providedFileName,\n wasReference: false,\n };\n }\n\n /**\n * Implementation of FormValidatable interface\n * Returns essential fields that should always be shown in forms\n */\n getEssentialFields(): string[] {\n return ['name', 'description', 'creator', 'attributes'];\n }\n\n /**\n * Implementation of FormValidatable interface\n * Determines if a field value should be considered empty for this tool\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean {\n if (value === undefined || value === null || value === '') {\n return true;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n\n if (fieldName === 'attributes' && Array.isArray(value)) {\n return value.every(\n (attr) =>\n !attr ||\n (typeof attr === 'object' && (!attr.trait_type || !attr.value))\n );\n }\n\n return false;\n }\n}\n"],"names":["buffer"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function isFormValidatable(tool) {
|
|
2
|
-
return tool !== null && typeof tool === "object" && "shouldGenerateForm" in tool && "getFormSchema" in tool && typeof tool.shouldGenerateForm === "function" && typeof tool.getFormSchema === "function";
|
|
2
|
+
return tool !== null && typeof tool === "object" && "shouldGenerateForm" in tool && "getFormSchema" in tool && "getEssentialFields" in tool && "isFieldEmpty" in tool && typeof tool.shouldGenerateForm === "function" && typeof tool.getFormSchema === "function" && typeof tool.getEssentialFields === "function" && typeof tool.isFieldEmpty === "function";
|
|
3
3
|
}
|
|
4
4
|
export {
|
|
5
5
|
isFormValidatable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es44.js","sources":["../../src/interfaces/FormValidatable.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Interface for tools that can provide custom form validation logic\n */\nexport interface FormValidatable {\n /**\n * Determines if a form should be generated for the given input\n * @param input The input data to validate\n * @returns true if a form should be generated, false if the tool can execute\n */\n shouldGenerateForm(input: unknown): boolean;\n\n /**\n * Returns the schema to use for form generation\n * This allows tools to provide a focused schema for forms\n * @returns The schema to use for generating forms\n */\n getFormSchema(): z.ZodSchema;\n\n /**\n *
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es44.js","sources":["../../src/interfaces/FormValidatable.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Interface for tools that can provide custom form validation logic\n */\nexport interface FormValidatable {\n /**\n * Determines if a form should be generated for the given input\n * @param input The input data to validate\n * @returns true if a form should be generated, false if the tool can execute\n */\n shouldGenerateForm(input: unknown): boolean;\n\n /**\n * Returns the schema to use for form generation\n * This allows tools to provide a focused schema for forms\n * @returns The schema to use for generating forms\n */\n getFormSchema(): z.ZodSchema;\n\n /**\n * Defines which fields are essential for this tool\n * Essential fields are always shown in forms even if marked as optional\n * @returns Array of field names that are essential for user experience\n */\n getEssentialFields(): string[];\n\n /**\n * Determines if a field value should be considered empty\n * Allows tools to define custom empty logic for their specific data types\n * @param fieldName The name of the field\n * @param value The value to check\n * @returns true if the field should be considered empty\n */\n isFieldEmpty(fieldName: string, value: unknown): boolean;\n}\n\n/**\n * Type guard to check if a tool implements FormValidatable\n */\nexport function isFormValidatable(tool: unknown): tool is FormValidatable {\n return (\n tool !== null &&\n typeof tool === 'object' &&\n 'shouldGenerateForm' in tool &&\n 'getFormSchema' in tool &&\n 'getEssentialFields' in tool &&\n 'isFieldEmpty' in tool &&\n typeof (tool as FormValidatable).shouldGenerateForm === 'function' &&\n typeof (tool as FormValidatable).getFormSchema === 'function' &&\n typeof (tool as FormValidatable).getEssentialFields === 'function' &&\n typeof (tool as FormValidatable).isFieldEmpty === 'function'\n );\n}"],"names":[],"mappings":"AAwCO,SAAS,kBAAkB,MAAwC;AACxE,SACE,SAAS,QACT,OAAO,SAAS,YAChB,wBAAwB,QACxB,mBAAmB,QACnB,wBAAwB,QACxB,kBAAkB,QAClB,OAAQ,KAAyB,uBAAuB,cACxD,OAAQ,KAAyB,kBAAkB,cACnD,OAAQ,KAAyB,uBAAuB,cACxD,OAAQ,KAAyB,iBAAiB;AAEtD;"}
|
|
@@ -51,14 +51,6 @@ export declare class InscribeHashinalTool extends BaseInscriberQueryTool impleme
|
|
|
51
51
|
* Returns the focused schema for form generation
|
|
52
52
|
*/
|
|
53
53
|
getFormSchema(): z.ZodObject<z.ZodRawShape>;
|
|
54
|
-
/**
|
|
55
|
-
* Implementation of FormValidatable interface
|
|
56
|
-
* Validates metadata quality and provides detailed feedback
|
|
57
|
-
*/
|
|
58
|
-
validateMetadataQuality(input: unknown): {
|
|
59
|
-
needsForm: boolean;
|
|
60
|
-
reason: string;
|
|
61
|
-
};
|
|
62
54
|
protected executeQuery(params: z.infer<typeof inscribeHashinalSchema>, _runManager?: CallbackManagerForToolRun): Promise<InscriptionResponse>;
|
|
63
55
|
/**
|
|
64
56
|
* Creates HashLink block configuration for Hashinal inscriptions.
|
|
@@ -16,28 +16,19 @@ export interface FormValidatable {
|
|
|
16
16
|
*/
|
|
17
17
|
getFormSchema(): z.ZodSchema;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param input The input data to analyze
|
|
21
|
-
* @returns Object indicating if form is needed and the reason
|
|
22
|
-
*/
|
|
23
|
-
validateMetadataQuality?(input: unknown): {
|
|
24
|
-
needsForm: boolean;
|
|
25
|
-
reason: string;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Optional method to define which fields are essential for this tool
|
|
19
|
+
* Defines which fields are essential for this tool
|
|
29
20
|
* Essential fields are always shown in forms even if marked as optional
|
|
30
21
|
* @returns Array of field names that are essential for user experience
|
|
31
22
|
*/
|
|
32
|
-
getEssentialFields
|
|
23
|
+
getEssentialFields(): string[];
|
|
33
24
|
/**
|
|
34
|
-
*
|
|
25
|
+
* Determines if a field value should be considered empty
|
|
35
26
|
* Allows tools to define custom empty logic for their specific data types
|
|
36
27
|
* @param fieldName The name of the field
|
|
37
28
|
* @param value The value to check
|
|
38
29
|
* @returns true if the field should be considered empty
|
|
39
30
|
*/
|
|
40
|
-
isFieldEmpty
|
|
31
|
+
isFieldEmpty(fieldName: string, value: unknown): boolean;
|
|
41
32
|
}
|
|
42
33
|
/**
|
|
43
34
|
* Type guard to check if a tool implements FormValidatable
|