@hashgraphonline/standards-agent-kit 0.2.153 → 0.2.155
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/standards-agent-kit.cjs +1 -1
- package/dist/cjs/standards-agent-kit.cjs.map +1 -1
- package/dist/es/standards-agent-kit.es24.js +1 -1
- package/dist/es/standards-agent-kit.es25.js +1 -1
- package/dist/es/standards-agent-kit.es26.js +1 -1
- package/dist/es/standards-agent-kit.es27.js +1 -1
- package/dist/es/standards-agent-kit.es28.js +1 -1
- package/dist/es/standards-agent-kit.es31.js +1 -1
- package/dist/es/standards-agent-kit.es32.js +1 -1
- package/dist/es/standards-agent-kit.es33.js +1 -1
- package/dist/es/standards-agent-kit.es36.js +1 -1
- package/dist/es/standards-agent-kit.es37.js +1 -1
- package/dist/es/standards-agent-kit.es38.js +3 -3
- package/dist/es/standards-agent-kit.es39.js +6 -6
- package/dist/es/standards-agent-kit.es39.js.map +1 -1
- package/dist/es/standards-agent-kit.es50.js +20 -3
- package/dist/es/standards-agent-kit.es50.js.map +1 -1
- package/dist/es/standards-agent-kit.es51.js +50 -17
- package/dist/es/standards-agent-kit.es51.js.map +1 -1
- package/dist/es/standards-agent-kit.es52.js +3 -54
- package/dist/es/standards-agent-kit.es52.js.map +1 -1
- package/dist/es/standards-agent-kit.es53.js +39 -2
- package/dist/es/standards-agent-kit.es53.js.map +1 -1
- package/dist/es/standards-agent-kit.es54.js +17 -38
- package/dist/es/standards-agent-kit.es54.js.map +1 -1
- package/dist/es/standards-agent-kit.es55.js +71 -16
- package/dist/es/standards-agent-kit.es55.js.map +1 -1
- package/dist/es/standards-agent-kit.es56.js +3 -73
- package/dist/es/standards-agent-kit.es56.js.map +1 -1
- package/dist/es/standards-agent-kit.es8.js +55 -21
- package/dist/es/standards-agent-kit.es8.js.map +1 -1
- package/dist/umd/standards-agent-kit.umd.js +1 -1
- package/dist/umd/standards-agent-kit.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/builders/inscriber/inscriber-builder.ts +61 -25
- package/src/tools/inscriber/InscribeHashinalTool.ts +2 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS2QueryTool } from "./standards-agent-kit.es23.js";
|
|
3
3
|
import { HCS2RegistryType } from "@hashgraphonline/standards-sdk";
|
|
4
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
4
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
5
5
|
const createRegistrySchema = z.object({
|
|
6
6
|
registryType: z.nativeEnum(HCS2RegistryType).optional().describe("Registry type: 0 for indexed, 1 for non-indexed (default: 0)"),
|
|
7
7
|
ttl: z.number().int().positive().optional().describe("Time to live in seconds (default: 86400)"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS2QueryTool } from "./standards-agent-kit.es23.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const registerEntrySchema = z.object({
|
|
5
5
|
registryTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The HCS-2 registry topic ID (e.g., 0.0.123456)"),
|
|
6
6
|
targetTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The target topic ID to register (e.g., 0.0.123456)"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS2QueryTool } from "./standards-agent-kit.es23.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const updateEntrySchema = z.object({
|
|
5
5
|
registryTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The HCS-2 registry topic ID (must be indexed)"),
|
|
6
6
|
targetTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The new topic ID to point to"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS2QueryTool } from "./standards-agent-kit.es23.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const deleteEntrySchema = z.object({
|
|
5
5
|
registryTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The HCS-2 registry topic ID (must be indexed)"),
|
|
6
6
|
uid: z.string().describe("The unique ID of the entry to delete"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS2QueryTool } from "./standards-agent-kit.es23.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const migrateRegistrySchema = z.object({
|
|
5
5
|
registryTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The current HCS-2 registry topic ID"),
|
|
6
6
|
targetTopicId: z.string().regex(/^\d+\.\d+\.\d+$/).describe("The new topic ID to migrate to"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS6QueryTool } from "./standards-agent-kit.es30.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const CreateDynamicRegistrySchema = z.object({
|
|
5
5
|
ttl: z.number().min(3600).default(86400).describe("Time-to-live in seconds (minimum 3600 seconds/1 hour)"),
|
|
6
6
|
submitKey: z.union([z.boolean(), z.string()]).optional().describe("Submit key for the registry topic. Can be boolean (use operator key) or a public key string")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS6QueryTool } from "./standards-agent-kit.es30.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const RegisterDynamicHashinalSchema = z.object({
|
|
5
5
|
metadata: z.record(z.unknown()).describe("Metadata object for the hashinal (e.g., name, description, attributes)"),
|
|
6
6
|
data: z.object({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseHCS6QueryTool } from "./standards-agent-kit.es30.js";
|
|
3
|
-
import { isWalletBytesResponse } from "./standards-agent-kit.
|
|
3
|
+
import { isWalletBytesResponse } from "./standards-agent-kit.es56.js";
|
|
4
4
|
const UpdateDynamicHashinalSchema = z.object({
|
|
5
5
|
registryTopicId: z.string().describe("The registry topic ID that tracks this dynamic hashinal"),
|
|
6
6
|
metadata: z.record(z.unknown()).describe("Updated metadata object for the hashinal"),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseInscriberQueryTool } from "./standards-agent-kit.es35.js";
|
|
3
3
|
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
4
|
-
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.
|
|
4
|
+
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.es50.js";
|
|
5
5
|
const logger = new Logger({ module: "InscribeFromUrlTool" });
|
|
6
6
|
const inscribeFromUrlSchema = z.object({
|
|
7
7
|
url: z.string().url().describe(
|
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { BaseInscriberQueryTool } from "./standards-agent-kit.es35.js";
|
|
3
3
|
import * as fs from "fs/promises";
|
|
4
4
|
import * as path from "path";
|
|
5
|
-
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.
|
|
5
|
+
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.es50.js";
|
|
6
6
|
const inscribeFromFileSchema = z.object({
|
|
7
7
|
filePath: z.string().min(1, "File path cannot be empty").describe(
|
|
8
8
|
"The file path of the content to inscribe. Must point to a valid, non-empty file."
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseInscriberQueryTool } from "./standards-agent-kit.es35.js";
|
|
3
|
-
import { resolveContent } from "./standards-agent-kit.
|
|
4
|
-
import { contentRefSchema } from "./standards-agent-kit.
|
|
3
|
+
import { resolveContent } from "./standards-agent-kit.es51.js";
|
|
4
|
+
import { contentRefSchema } from "./standards-agent-kit.es52.js";
|
|
5
5
|
import { loadConfig } from "./standards-agent-kit.es2.js";
|
|
6
|
-
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.
|
|
6
|
+
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.es50.js";
|
|
7
7
|
const inscribeFromBufferSchema = z.object({
|
|
8
8
|
base64Data: z.union([z.string(), contentRefSchema]).describe(
|
|
9
9
|
"Content to inscribe as base64 data, plain text, or content reference"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BaseInscriberQueryTool } from "./standards-agent-kit.es35.js";
|
|
3
3
|
import { Logger, ContentResolverRegistry } from "@hashgraphonline/standards-sdk";
|
|
4
|
-
import { validateHIP412Metadata } from "./standards-agent-kit.
|
|
5
|
-
import { contentRefSchema } from "./standards-agent-kit.
|
|
6
|
-
import { generateDefaultMetadata } from "./standards-agent-kit.
|
|
4
|
+
import { validateHIP412Metadata } from "./standards-agent-kit.es53.js";
|
|
5
|
+
import { contentRefSchema } from "./standards-agent-kit.es52.js";
|
|
6
|
+
import { generateDefaultMetadata } from "./standards-agent-kit.es54.js";
|
|
7
7
|
import { extendZodSchema, renderConfigs } from "./standards-agent-kit.es44.js";
|
|
8
|
-
import { createInscriptionError, createInscriptionQuote, createInscriptionSuccess, createInscriptionPending } from "./standards-agent-kit.
|
|
9
|
-
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.
|
|
8
|
+
import { createInscriptionError, createInscriptionQuote, createInscriptionSuccess, createInscriptionPending } from "./standards-agent-kit.es55.js";
|
|
9
|
+
import { extractTopicIds, buildInscriptionLinks } from "./standards-agent-kit.es50.js";
|
|
10
10
|
const HASHLINK_BLOCK_CONFIG = {
|
|
11
11
|
testnet: {
|
|
12
12
|
blockId: "0.0.6617393",
|
|
@@ -70,7 +70,7 @@ const inscribeHashinalSchema = extendZodSchema(
|
|
|
70
70
|
),
|
|
71
71
|
tags: z.array(z.string()).optional().describe("Tags to categorize the NFT"),
|
|
72
72
|
chunkSize: z.number().int().positive().optional().describe("Chunk size for large files"),
|
|
73
|
-
waitForConfirmation: z.boolean().optional().describe("Whether to wait for inscription confirmation"),
|
|
73
|
+
waitForConfirmation: z.boolean().optional().describe("Whether to wait for inscription confirmation").default(true),
|
|
74
74
|
timeoutMs: z.number().int().positive().optional().describe(
|
|
75
75
|
"Timeout in milliseconds for inscription (default: no timeout - waits until completion)"
|
|
76
76
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es39.js","sources":["../../src/tools/inscriber/InscribeHashinalTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n InscriptionResult,\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 createInscriptionPending,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\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 */\nfunction getHashLinkBlockId(network: 'mainnet' | 'testnet'): {\n blockId: string;\n hashLink: string;\n template: string;\n} {\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/**\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 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 .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe('Collectible traits and characteristics.'),\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 })\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.inscribeAuto\n ? this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = this.inscriberBuilder.inscribeAuto\n ? await this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const ids = extractTopicIds(result.inscription, result.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const fileStandard = params.fileStandard || '1';\n const { hrl, topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n fileStandard\n );\n\n const txId =\n result?.inscription?.tx_id ||\n (result?.result as InscriptionResult)?.transactionId ||\n 'unknown';\n const successResponse = createInscriptionSuccess({\n hrl: hrl || 'hcs://1/unknown',\n topicId: topicId || 'unknown',\n standard: fileStandard === '6' ? 'Dynamic' : 'Static',\n cdnUrl,\n transactionId: txId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: Array.isArray(params.attributes)\n ? params.attributes\n : [],\n },\n });\n\n if (params.withHashLinkBlocks !== false) {\n try {\n const block = await this.createHashLinkBlock(successResponse);\n successResponse.hashLinkBlock = block;\n } catch (e) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn('Failed to create HashLink block', e);\n }\n }\n\n return successResponse;\n } else if (!result.quote && !result.confirmed) {\n const txId =\n (result.result as InscriptionResult)?.transactionId ||\n result?.inscription?.transactionId ||\n 'unknown';\n return createInscriptionPending({\n transactionId: txId,\n details:\n 'Successfully submitted Hashinal inscription. Waiting for network confirmation...',\n });\n } else {\n return createInscriptionError({\n code: 'UNEXPECTED_RESULT',\n details: 'Received an unexpected inscription result state',\n suggestions: ['Try again or verify network status'],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\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 * const id = block.blockId; // '0.0.6617393'\n * const link = 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 * const mainnetId = 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.es39.js","sources":["../../src/tools/inscriber/InscribeHashinalTool.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BaseInscriberQueryTool } from './base-inscriber-tools';\nimport {\n InscriptionOptions,\n InscriptionInput,\n ContentResolverRegistry,\n Logger,\n InscriptionResult,\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 createInscriptionPending,\n InscriptionResponse,\n} from '../../types/inscription-response';\nimport { FormValidatable } from '../../interfaces/FormValidatable';\nimport {\n extractTopicIds,\n buildInscriptionLinks,\n} from '../../utils/inscription-utils';\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 */\nfunction getHashLinkBlockId(network: 'mainnet' | 'testnet'): {\n blockId: string;\n hashLink: string;\n template: string;\n} {\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/**\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 .default(true),\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 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 .describe('Trait value (e.g., \"Epic\", \"Blue\", 85)'),\n })\n )\n )\n .withRender(renderConfigs.array('NFT Attributes', 'Attribute'))\n .optional()\n .describe('Collectible traits and characteristics.'),\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 })\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.inscribeAuto\n ? this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : this.inscriberBuilder.inscribe(inscriptionData, options),\n timeoutPromise,\n ]);\n } else {\n result = this.inscriberBuilder.inscribeAuto\n ? await this.inscriberBuilder.inscribeAuto(inscriptionData, options)\n : await this.inscriberBuilder.inscribe(inscriptionData, options);\n }\n\n if (result.confirmed && !result.quote) {\n const ids = extractTopicIds(result.inscription, result.result);\n const network = (options.network || 'testnet') as 'mainnet' | 'testnet';\n const fileStandard = params.fileStandard || '1';\n const { hrl, topicId, cdnUrl } = buildInscriptionLinks(\n ids,\n network,\n fileStandard\n );\n\n const txId =\n result?.inscription?.tx_id ||\n (result?.result as InscriptionResult)?.transactionId ||\n 'unknown';\n const successResponse = createInscriptionSuccess({\n hrl: hrl || 'hcs://1/unknown',\n topicId: topicId || 'unknown',\n standard: fileStandard === '6' ? 'Dynamic' : 'Static',\n cdnUrl,\n transactionId: txId,\n metadata: {\n name: params.name,\n creator: params.creator,\n description: params.description,\n type: params.type,\n attributes: Array.isArray(params.attributes)\n ? params.attributes\n : [],\n },\n });\n\n if (params.withHashLinkBlocks !== false) {\n try {\n const block = await this.createHashLinkBlock(successResponse);\n successResponse.hashLinkBlock = block;\n } catch (e) {\n const logger = new Logger({ module: 'InscribeHashinalTool' });\n logger.warn('Failed to create HashLink block', e);\n }\n }\n\n return successResponse;\n } else if (!result.quote && !result.confirmed) {\n const txId =\n (result.result as InscriptionResult)?.transactionId ||\n result?.inscription?.transactionId ||\n 'unknown';\n return createInscriptionPending({\n transactionId: txId,\n details:\n 'Successfully submitted Hashinal inscription. Waiting for network confirmation...',\n });\n } else {\n return createInscriptionError({\n code: 'UNEXPECTED_RESULT',\n details: 'Received an unexpected inscription result state',\n suggestions: ['Try again or verify network status'],\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to inscribe Hashinal NFT';\n throw new Error(`Inscription failed: ${errorMessage}`);\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 * const id = block.blockId; // '0.0.6617393'\n * const link = 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 * const mainnetId = 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":";;;;;;;;;AAiCA,MAAM,wBAAwB;AAAA,EAC5B,SAAS;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EAAA;AAAA,EAEZ,SAAS;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EAAA;AAEd;AASA,SAAS,mBAAmB,SAI1B;AACA,QAAM,SACJ,YAAY,YACR,sBAAsB,UACtB,sBAAsB;AAC5B,MAAI,CAAC,UAAU,OAAO,YAAY,WAAW;AAC3C,WAAO,sBAAsB;AAAA,EAC/B;AACA,SAAO;AACT;AAKA,MAAM,yBAAyB;AAAA,EAC7B,EAAE,OAAO;AAAA,IACP,KAAK,EACF,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,YAAY,iBACT,SAAA,EACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,YAAY,EACT,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,UAAU,EACP,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,UAAU,EACP,OAAA,EACA,SAAA,EACA,SAAS,4DAA4D;AAAA,IACxE,MAAM,EACH,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,SAAS,EACN,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,aAAa,EACV,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,MAAM,EACH,SACA,WACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,YAAY;AAAA,MACV,EAAE;AAAA,QACA,EAAE,OAAO;AAAA,UACP,YAAY,EAAE,OAAA;AAAA,UACd,OAAO,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC;AAAA,QAAA,CACxC;AAAA,MAAA;AAAA,IACH,EAEC,WAAW,cAAc,MAAM,kBAAkB,WAAW,CAAC,EAC7D,SAAA,EACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,YAAY,EACT,OAAO,EAAE,QAAA,CAAS,EAClB,SAAA,EACA,SAAS,uBAAuB;AAAA,IACnC,aAAa,EACV,SACA,MACA,SAAA,EACA,SAAS,2BAA2B;AAAA,IACvC,cAAc,EACX,KAAK,CAAC,KAAK,GAAG,CAAC,EACf,SAAA,EACA,QAAQ,GAAG,EACX;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,MAAM,EAAE,MAAM,EAAE,OAAA,CAAQ,EAAE,SAAA,EAAW,SAAS,4BAA4B;AAAA,IAC1E,WAAW,EACR,OAAA,EACA,IAAA,EACA,SAAA,EACA,SAAA,EACA,SAAS,4BAA4B;AAAA,IACxC,qBAAqB,EAClB,QAAA,EACA,SAAA,EACA,SAAS,8CAA8C,EACvD,QAAQ,IAAI;AAAA,IACf,WAAW,EACR,SACA,MACA,SAAA,EACA,SAAA,EACA;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,WAAW,EACR,QAAA,EACA,WACA,QAAQ,KAAK,EACb;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,oBAAoB,EACjB,QAAA,EACA,WACA,QAAQ,IAAI,EACZ;AAAA,MACC;AAAA,IAAA;AAAA,IAEJ,YAAY,EACT,QAAA,EACA,WACA,QAAQ,IAAI,EACZ;AAAA,MACC;AAAA,IAAA;AAAA,EACF,CACH;AACH,EAAE,WAAW;AAAA,EACX,WAAW;AAAA,EACX,IAAI;AAAA,IACF,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAEjB,CAAC;AAKM,MAAM,6BACH,uBAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA;AAIL,SAAA,OAAO;AACP,SAAA,cACE;AAAA,EAAA;AAAA,EAEF,iCAAyD;AACvD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEA,IAAI,sBAAkD;AACpD,UAAM,aACH,uBACE,MAAM,UAAU;AACrB,WAAO;AAAA,EACT;AAAA,EAIA,IAAa,SAAqC;AAChD,QAAI,CAAC,KAAK,yBAAyB;AACjC,YAAM,aAAa,KAAK;AACxB,YAAM,mBAAmB;AAOzB,UAAI,CAAC,iBAAiB,eAAe;AACnC,yBAAiB,gBAAgB;AAAA,UAC/B,WAAW;AAAA,UACX,IAAI;AAAA,YACF,OAAO;AAAA,YACP,aAAa;AAAA,UAAA;AAAA,QACf;AAAA,MAEJ;AACA,WAAK,0BAA0B;AAAA,IACjC;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,OAAyB;AAC1C,UAAM,SAAS,IAAI,OAAO,EAAE,QAAQ,wBAAwB;AAC5D,UAAM,WAAW;AAEjB,WAAO,KAAK,8DAA8D;AAAA,MACxE,WAAW,OAAO,KAAK,YAAY,CAAA,CAAE;AAAA,MACrC,YAAY,CAAC,EACX,SAAS,OACT,SAAS,cACT,SAAS;AAAA,MAEX,oBAAoB,gBAAgB;AAAA,MACpC,iBAAiB,SAAS;AAAA,IAAA,CAC3B;AAED,UAAM,mBAAmB,CAAC,EACxB,SAAS,OACT,SAAS,cACT,SAAS;AAGX,QAAI,CAAC,kBAAkB;AACrB,aAAO,KAAK,kDAAkD;AAC9D,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,YAAY,SAAS,eAAe,OAAO;AAC7D,aAAO;AAAA,QACL;AAAA,MAAA;AAEF,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,CAAC,MAA4B;AACpD,UAAI,OAAO,MAAM,UAAU;AACzB,eAAO;AAAA,MACT;AACA,UAAI,EAAE,OAAO,WAAW,GAAG;AACzB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,UAAM,sBACJ,iBAAiB,SAAS,IAAI,KAC9B,iBAAiB,SAAS,WAAW,KACrC,iBAAiB,SAAS,OAAO;AAEnC,QAAI,qBAAqB;AACvB,aAAO;AAAA,QACL;AAAA,MAAA;AAEF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAA4C;AAC1C,UAAM,gBAAgB;AAAA,MACpB,EAAE,OAAO;AAAA,QACP,MAAM,EACH,OAAA,EACA,IAAI,GAAG,kBAAkB,EACzB;AAAA,UACC;AAAA,QAAA;AAAA,QAGJ,aAAa,EACV,OAAA,EACA,IAAI,GAAG,yBAAyB,EAChC;AAAA,UACC;AAAA,QAAA;AAAA,QAGJ,SAAS,EACN,OAAA,EACA,IAAI,GAAG,qBAAqB,EAC5B;AAAA,UACC;AAAA,QAAA;AAAA,QAGJ,YAAY;AAAA,UACV,EAAE;AAAA,YACA,EAAE,OAAO;AAAA,cACP,YAAY,EACT,SACA,SAAS,+CAA+C;AAAA,cAC3D,OAAO,EACJ,MAAM,CAAC,EAAE,UAAU,EAAE,OAAA,CAAQ,CAAC,EAC9B,SAAS,wCAAwC;AAAA,YAAA,CACrD;AAAA,UAAA;AAAA,QACH,EAEC,WAAW,cAAc,MAAM,kBAAkB,WAAW,CAAC,EAC7D,SAAA,EACA,SAAS,yCAAyC;AAAA,QAErD,MAAM,EACH,SACA,WACA;AAAA,UACC;AAAA,QAAA;AAAA,MACF,CACH;AAAA,IAAA,EACD,WAAW;AAAA,MACX,WAAW;AAAA,MACX,IAAI;AAAA,QACF,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IACf,CACD;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,aACd,QACA,aAC8B;AAC9B,QAAI,CAAC,OAAO,OAAO,CAAC,OAAO,cAAc,CAAC,OAAO,YAAY;AAC3D,aAAO,uBAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF,CACD;AAAA,IACH;AAEA,UAAM,kBACJ,KAAK,iBACH,WACF,GAAG,QAAQ,mBAAmB,cAAc;AAE9C,UAAM,cAAc;AAAA,MAClB,GAAG,wBAAwB;AAAA,QACzB,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,aAAa,OAAO;AAAA,QACpB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB;AAAA,MAAA,CACD;AAAA,MACD,YAAY,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAA;AAAA,MACnE,YACG,OAAO,cAAsD,CAAA;AAAA,IAAC;AAGnE,QAAI;AACJ,QAAI;AACF,0BAAoB,uBAAuB,WAAW;AAAA,IACxD,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACvD,aAAO,uBAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,8BAA8B,YAAY;AAAA,QACnD,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF,CACD;AAAA,IACH;AAEA,UAAM,UAA8B;AAAA,MAClC,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MAClB,qBAAqB,OAAO,YACxB,QACA,OAAO,uBAAuB;AAAA,MAClC,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,SAAS,KAAK,iBAAiB,WAAW,EAAE,OAAO,QAChD,SAAA,EACA,SAAS,SAAS,IACjB,YACA;AAAA,MACJ,WAAW,OAAO;AAAA,IAAA;AAGpB,QAAI;AAEJ,QAAI,OAAO,KAAK;AACd,wBAAkB,EAAE,MAAM,OAAO,KAAK,OAAO,IAAA;AAAA,IAC/C,WAAW,OAAO,cAAc,OAAO,YAAY;AACjD,YAAM,YAAY,OAAO,cAAc,OAAO,cAAc;AAC5D,YAAM,EAAE,QAAQ,UAAU,SAAA,IAAa,MAAM,KAAK;AAAA,QAChD;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAGT,wBAAkB;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,UAAU,YAAY,OAAO,YAAY;AAAA,QACzC,UAAU,YAAY,OAAO;AAAA,MAAA;AAAA,IAEjC,OAAO;AACL,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,QAAI,OAAO,WAAW;AACpB,UAAI;AACF,cAAM,QAAQ,MAAM,KAAK;AAAA,UACvB;AAAA,UACA;AAAA,QAAA;AAGF,eAAO,uBAAuB;AAAA,UAC5B,eAAe,MAAM;AAAA,UACrB,YAAY,MAAM;AAAA,UAClB,WAAW,MAAM;AAAA,UACjB,SAAS;AAAA,YACP,MAAM,OAAO;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,MAAM,OAAO;AAAA,UAAA;AAAA,QACf,CACD;AAAA,MACH,SAAS,OAAO;AACd,cAAM,eACJ,iBAAiB,QACb,MAAM,UACN;AACN,eAAO,uBAAuB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS,4BAA4B,YAAY;AAAA,UACjD,aAAa;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IACF;AAEA,QAAI;AACF,UAAI;AAEJ,UAAI,OAAO,WAAW;AACpB,cAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD;AAAA,YACE,MACE;AAAA,cACE,IAAI,MAAM,+BAA+B,OAAO,SAAS,IAAI;AAAA,YAAA;AAAA,YAEjE,OAAO;AAAA,UAAA;AAAA,QAEX,CAAC;AAED,iBAAS,MAAM,QAAQ,KAAK;AAAA,UAC1B,KAAK,iBAAiB,eAClB,KAAK,iBAAiB,aAAa,iBAAiB,OAAO,IAC3D,KAAK,iBAAiB,SAAS,iBAAiB,OAAO;AAAA,UAC3D;AAAA,QAAA,CACD;AAAA,MACH,OAAO;AACL,iBAAS,KAAK,iBAAiB,eAC3B,MAAM,KAAK,iBAAiB,aAAa,iBAAiB,OAAO,IACjE,MAAM,KAAK,iBAAiB,SAAS,iBAAiB,OAAO;AAAA,MACnE;AAEA,UAAI,OAAO,aAAa,CAAC,OAAO,OAAO;AACrC,cAAM,MAAM,gBAAgB,OAAO,aAAa,OAAO,MAAM;AAC7D,cAAM,UAAW,QAAQ,WAAW;AACpC,cAAM,eAAe,OAAO,gBAAgB;AAC5C,cAAM,EAAE,KAAK,SAAS,OAAA,IAAW;AAAA,UAC/B;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,OACJ,QAAQ,aAAa,SACpB,QAAQ,QAA8B,iBACvC;AACF,cAAM,kBAAkB,yBAAyB;AAAA,UAC/C,KAAK,OAAO;AAAA,UACZ,SAAS,WAAW;AAAA,UACpB,UAAU,iBAAiB,MAAM,YAAY;AAAA,UAC7C;AAAA,UACA,eAAe;AAAA,UACf,UAAU;AAAA,YACR,MAAM,OAAO;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,aAAa,OAAO;AAAA,YACpB,MAAM,OAAO;AAAA,YACb,YAAY,MAAM,QAAQ,OAAO,UAAU,IACvC,OAAO,aACP,CAAA;AAAA,UAAC;AAAA,QACP,CACD;AAED,YAAI,OAAO,uBAAuB,OAAO;AACvC,cAAI;AACF,kBAAM,QAAQ,MAAM,KAAK,oBAAoB,eAAe;AAC5D,4BAAgB,gBAAgB;AAAA,UAClC,SAAS,GAAG;AACV,kBAAM,SAAS,IAAI,OAAO,EAAE,QAAQ,wBAAwB;AAC5D,mBAAO,KAAK,mCAAmC,CAAC;AAAA,UAClD;AAAA,QACF;AAEA,eAAO;AAAA,MACT,WAAW,CAAC,OAAO,SAAS,CAAC,OAAO,WAAW;AAC7C,cAAM,OACH,OAAO,QAA8B,iBACtC,QAAQ,aAAa,iBACrB;AACF,eAAO,yBAAyB;AAAA,UAC9B,eAAe;AAAA,UACf,SACE;AAAA,QAAA,CACH;AAAA,MACH,OAAO;AACL,eAAO,uBAAuB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa,CAAC,oCAAoC;AAAA,QAAA,CACnD;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QACb,MAAM,UACN;AACN,YAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6CA,MAAc,oBACZ,UACA,WAMC;AACD,UAAM,gBAAgB,KAAK,iBAAiB,WAAW,EAAE,OAAO,QAC7D,SAAA,EACA,SAAS,SAAS,IACjB,YACA;AAEJ,UAAM,aAAa,SAAS,YAAY,QAAQ,SAAS,SAAS,IAC9D,YACA;AAEJ,QAAI,kBAAkB,YAAY;AAChC,YAAM,SAAS,IAAI,OAAO,EAAE,QAAQ,wBAAwB;AAC5D,aAAO;AAAA,QACL,qCAAqC,aAAa,SAAS,UAAU;AAAA,MAAA;AAAA,IAEzE;AAEA,UAAM,UAAU;AAChB,UAAM,SAAS,mBAAmB,OAAO;AAEzC,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,YAAY;AAAA,QACV,MAAM,SAAS,SAAS,QAAQ;AAAA,QAChC,SAAS,SAAS,SAAS,WAAW;AAAA,QACtC,SAAS,SAAS,YAAY;AAAA,QAC9B,KAAK,SAAS,YAAY;AAAA,QAC1B;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAAA,EAEA,MAAc,eACZ,OACA,kBACA,kBAMC;AACD,UAAM,eAAe,MAAM,KAAA;AAE3B,UAAM,WACJ,KAAK,mBAAA,KAAwB,wBAAwB,YAAA;AAEvD,QAAI,CAAC,UAAU;AACb,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,cAAc,SAAS,mBAAmB,YAAY;AAE5D,QAAI,aAAa;AACf,UAAI;AACF,cAAM,aAAa,MAAM,SAAS,iBAAiB,WAAW;AAE9D,eAAO;AAAA,UACL,QAAQ,WAAW;AAAA,UACnB,UAAU,WAAW,UAAU,YAAY;AAAA,UAC3C,UAAU,WAAW,UAAU,YAAY;AAAA,UAC3C,cAAc;AAAA,QAAA;AAAA,MAElB,SAAS,OAAO;AACd,cAAM,WACJ,iBAAiB,QACb,MAAM,UACN;AACN,cAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,MAC5D;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,oBACN,OACA,kBACA,kBAMA;AACA,UAAM,gBAAgB,yBAAyB,KAAK,KAAK;AAEzD,QAAI,eAAe;AACjB,UAAI;AACF,cAAMA,UAAS,OAAO,KAAK,OAAO,QAAQ;AAC1C,eAAO;AAAA,UACL,QAAAA;AAAAA,UACA,UAAU;AAAA,UACV,UAAU;AAAA,UACV,cAAc;AAAA,QAAA;AAAA,MAElB,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,KAAK,OAAO,MAAM;AACxC,WAAO;AAAA,MACL;AAAA,MACA,UAAU,oBAAoB;AAAA,MAC9B,UAAU;AAAA,MACV,cAAc;AAAA,IAAA;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAA+B;AAC7B,WAAO,CAAC,QAAQ,eAAe,WAAW,YAAY;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,WAAmB,OAAyB;AACvD,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,gBAAgB,MAAM,QAAQ,KAAK,GAAG;AACtD,aAAO,MAAM;AAAA,QACX,CAAC,SACC,CAAC,QACA,OAAO,SAAS,aAAa,CAAC,KAAK,cAAc,CAAC,KAAK;AAAA,MAAA;AAAA,IAE9D;AAEA,WAAO;AAAA,EACT;AACF;"}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
1
|
+
function getStringProp(obj, key) {
|
|
2
|
+
if (!obj || typeof obj !== "object") return void 0;
|
|
3
|
+
const val = obj[key];
|
|
4
|
+
return typeof val === "string" && val.trim() ? val : void 0;
|
|
5
|
+
}
|
|
6
|
+
function extractTopicIds(inscription, result) {
|
|
7
|
+
const jsonTopicId = inscription.jsonTopicId || getStringProp(inscription, "json_topic_id");
|
|
8
|
+
const imageTopicId = getStringProp(inscription, "topic_id") || getStringProp(inscription, "topicId") || getStringProp(result, "topicId") || getStringProp(result, "topic_id");
|
|
9
|
+
return {
|
|
10
|
+
jsonTopicId,
|
|
11
|
+
topicId: imageTopicId
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function buildInscriptionLinks(ids, network, fileStandard = "1") {
|
|
15
|
+
const chosen = ids.jsonTopicId || ids.topicId;
|
|
16
|
+
const hrl = chosen ? `hcs://${fileStandard}/${chosen}` : void 0;
|
|
17
|
+
const cdnUrl = ids.jsonTopicId ? `https://kiloscribe.com/api/inscription-cdn/${ids.jsonTopicId}?network=${network}` : void 0;
|
|
18
|
+
return { hrl, cdnUrl, topicId: chosen };
|
|
3
19
|
}
|
|
4
20
|
export {
|
|
5
|
-
|
|
21
|
+
buildInscriptionLinks,
|
|
22
|
+
extractTopicIds
|
|
6
23
|
};
|
|
7
24
|
//# sourceMappingURL=standards-agent-kit.es50.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es50.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es50.js","sources":["../../src/utils/inscription-utils.ts"],"sourcesContent":["import { RetrievedInscriptionResult } from '@kiloscribe/inscription-sdk';\n\nexport type NetworkType = 'mainnet' | 'testnet';\n\nexport interface TopicIds {\n jsonTopicId?: string;\n topicId?: string;\n}\n\nfunction getStringProp(obj: unknown, key: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const val = (obj as Record<string, unknown>)[key];\n return typeof val === 'string' && val.trim() ? val : undefined;\n}\n\n/**\n * Extract topic ids from an inscription and/or result object without using any.\n * - Prefers jsonTopicId when present (for CDN linking)\n * - Collects topic_id/topicId from either inscription or result\n */\nexport function extractTopicIds(\n inscription: RetrievedInscriptionResult,\n result?: unknown\n): TopicIds {\n const jsonTopicId =\n inscription.jsonTopicId || getStringProp(inscription, 'json_topic_id');\n\n const imageTopicId =\n getStringProp(inscription, 'topic_id') ||\n getStringProp(inscription, 'topicId') ||\n getStringProp(result, 'topicId') ||\n getStringProp(result, 'topic_id');\n\n return {\n jsonTopicId: jsonTopicId,\n topicId: imageTopicId,\n };\n}\n\n/**\n * Build HRL/CDN URLs from extracted topic ids.\n * - HRL prefers jsonTopicId, falls back to topicId\n * - CDN URL only provided when jsonTopicId is present\n */\nexport function buildInscriptionLinks(\n ids: TopicIds,\n network: NetworkType,\n fileStandard: string = '1'\n): { hrl?: string; cdnUrl?: string; topicId?: string } {\n const chosen = ids.jsonTopicId || ids.topicId;\n const hrl = chosen ? `hcs://${fileStandard}/${chosen}` : undefined;\n const cdnUrl = ids.jsonTopicId\n ? `https://kiloscribe.com/api/inscription-cdn/${ids.jsonTopicId}?network=${network}`\n : undefined;\n return { hrl, cdnUrl, topicId: chosen };\n}\n"],"names":[],"mappings":"AASA,SAAS,cAAc,KAAc,KAAiC;AACpE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAO,IAAgC,GAAG;AAChD,SAAO,OAAO,QAAQ,YAAY,IAAI,KAAA,IAAS,MAAM;AACvD;AAOO,SAAS,gBACd,aACA,QACU;AACV,QAAM,cACJ,YAAY,eAAe,cAAc,aAAa,eAAe;AAEvE,QAAM,eACJ,cAAc,aAAa,UAAU,KACrC,cAAc,aAAa,SAAS,KACpC,cAAc,QAAQ,SAAS,KAC/B,cAAc,QAAQ,UAAU;AAElC,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;AAOO,SAAS,sBACd,KACA,SACA,eAAuB,KAC8B;AACrD,QAAM,SAAS,IAAI,eAAe,IAAI;AACtC,QAAM,MAAM,SAAS,SAAS,YAAY,IAAI,MAAM,KAAK;AACzD,QAAM,SAAS,IAAI,cACf,8CAA8C,IAAI,WAAW,YAAY,OAAO,KAChF;AACJ,SAAO,EAAE,KAAK,QAAQ,SAAS,OAAA;AACjC;"}
|
|
@@ -1,24 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
1
|
+
import { ContentResolverRegistry } from "@hashgraphonline/standards-sdk";
|
|
2
|
+
async function resolveContent(input, providedMimeType, providedFileName) {
|
|
3
|
+
const trimmedInput = input.trim();
|
|
4
|
+
const resolver = ContentResolverRegistry.getResolver();
|
|
5
|
+
if (!resolver) {
|
|
6
|
+
return handleDirectContent(
|
|
7
|
+
trimmedInput,
|
|
8
|
+
providedMimeType,
|
|
9
|
+
providedFileName
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
const referenceId = resolver.extractReferenceId(trimmedInput);
|
|
13
|
+
if (referenceId) {
|
|
14
|
+
try {
|
|
15
|
+
const resolution = await resolver.resolveReference(referenceId);
|
|
16
|
+
return {
|
|
17
|
+
buffer: resolution.content,
|
|
18
|
+
mimeType: resolution.metadata?.mimeType || providedMimeType,
|
|
19
|
+
fileName: resolution.metadata?.fileName || providedFileName,
|
|
20
|
+
wasReference: true
|
|
21
|
+
};
|
|
22
|
+
} catch (error) {
|
|
23
|
+
const errorMsg = error instanceof Error ? error.message : "Unknown error resolving reference";
|
|
24
|
+
throw new Error(`Reference resolution failed: ${errorMsg}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return handleDirectContent(trimmedInput, providedMimeType, providedFileName);
|
|
5
28
|
}
|
|
6
|
-
function
|
|
7
|
-
const
|
|
8
|
-
|
|
29
|
+
function handleDirectContent(input, providedMimeType, providedFileName) {
|
|
30
|
+
const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);
|
|
31
|
+
if (isValidBase64) {
|
|
32
|
+
try {
|
|
33
|
+
const buffer2 = Buffer.from(input, "base64");
|
|
34
|
+
return {
|
|
35
|
+
buffer: buffer2,
|
|
36
|
+
mimeType: providedMimeType,
|
|
37
|
+
fileName: providedFileName,
|
|
38
|
+
wasReference: false
|
|
39
|
+
};
|
|
40
|
+
} catch (error) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
"Failed to decode base64 data. Please ensure the data is properly encoded."
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const buffer = Buffer.from(input, "utf8");
|
|
9
47
|
return {
|
|
10
|
-
|
|
11
|
-
|
|
48
|
+
buffer,
|
|
49
|
+
mimeType: providedMimeType || "text/plain",
|
|
50
|
+
fileName: providedFileName,
|
|
51
|
+
wasReference: false
|
|
12
52
|
};
|
|
13
53
|
}
|
|
14
|
-
function buildInscriptionLinks(ids, network, fileStandard = "1") {
|
|
15
|
-
const chosen = ids.jsonTopicId || ids.topicId;
|
|
16
|
-
const hrl = chosen ? `hcs://${fileStandard}/${chosen}` : void 0;
|
|
17
|
-
const cdnUrl = ids.jsonTopicId ? `https://kiloscribe.com/api/inscription-cdn/${ids.jsonTopicId}?network=${network}` : void 0;
|
|
18
|
-
return { hrl, cdnUrl, topicId: chosen };
|
|
19
|
-
}
|
|
20
54
|
export {
|
|
21
|
-
|
|
22
|
-
extractTopicIds
|
|
55
|
+
resolveContent
|
|
23
56
|
};
|
|
24
57
|
//# sourceMappingURL=standards-agent-kit.es51.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es51.js","sources":["../../src/utils/
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es51.js","sources":["../../src/utils/content-resolver.ts"],"sourcesContent":["import { ContentResolverRegistry } from '@hashgraphonline/standards-sdk';\n\nexport interface ContentResolutionResult {\n buffer: Buffer;\n mimeType?: string;\n fileName?: string;\n wasReference?: boolean;\n}\n\n/**\n * Resolves content from various input formats (content-ref, base64, plain text)\n */\nexport async function resolveContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): Promise<ContentResolutionResult> {\n const trimmedInput = input.trim();\n\n const resolver = ContentResolverRegistry.getResolver();\n\n if (!resolver) {\n return 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 handleDirectContent(trimmedInput, providedMimeType, providedFileName);\n}\n\n/**\n * Handles direct content (base64 or plain text)\n */\nfunction handleDirectContent(\n input: string,\n providedMimeType?: string,\n providedFileName?: string\n): ContentResolutionResult {\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"],"names":["buffer"],"mappings":";AAYA,eAAsB,eACpB,OACA,kBACA,kBACkC;AAClC,QAAM,eAAe,MAAM,KAAA;AAE3B,QAAM,WAAW,wBAAwB,YAAA;AAEzC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,cAAc,SAAS,mBAAmB,YAAY;AAE5D,MAAI,aAAa;AACf,QAAI;AACF,YAAM,aAAa,MAAM,SAAS,iBAAiB,WAAW;AAE9D,aAAO;AAAA,QACL,QAAQ,WAAW;AAAA,QACnB,UAAU,WAAW,UAAU,YAAY;AAAA,QAC3C,UAAU,WAAW,UAAU,YAAY;AAAA,QAC3C,cAAc;AAAA,MAAA;AAAA,IAElB,SAAS,OAAO;AACd,YAAM,WACJ,iBAAiB,QACb,MAAM,UACN;AACN,YAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO,oBAAoB,cAAc,kBAAkB,gBAAgB;AAC7E;AAKA,SAAS,oBACP,OACA,kBACA,kBACyB;AACzB,QAAM,gBAAgB,yBAAyB,KAAK,KAAK;AAEzD,MAAI,eAAe;AACjB,QAAI;AACF,YAAMA,UAAS,OAAO,KAAK,OAAO,QAAQ;AAC1C,aAAO;AAAA,QACL,QAAAA;AAAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,MAAA;AAAA,IAElB,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,KAAK,OAAO,MAAM;AACxC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,oBAAoB;AAAA,IAC9B,UAAU;AAAA,IACV,cAAc;AAAA,EAAA;AAElB;"}
|
|
@@ -1,57 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
const trimmedInput = input.trim();
|
|
4
|
-
const resolver = ContentResolverRegistry.getResolver();
|
|
5
|
-
if (!resolver) {
|
|
6
|
-
return handleDirectContent(
|
|
7
|
-
trimmedInput,
|
|
8
|
-
providedMimeType,
|
|
9
|
-
providedFileName
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
const referenceId = resolver.extractReferenceId(trimmedInput);
|
|
13
|
-
if (referenceId) {
|
|
14
|
-
try {
|
|
15
|
-
const resolution = await resolver.resolveReference(referenceId);
|
|
16
|
-
return {
|
|
17
|
-
buffer: resolution.content,
|
|
18
|
-
mimeType: resolution.metadata?.mimeType || providedMimeType,
|
|
19
|
-
fileName: resolution.metadata?.fileName || providedFileName,
|
|
20
|
-
wasReference: true
|
|
21
|
-
};
|
|
22
|
-
} catch (error) {
|
|
23
|
-
const errorMsg = error instanceof Error ? error.message : "Unknown error resolving reference";
|
|
24
|
-
throw new Error(`Reference resolution failed: ${errorMsg}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return handleDirectContent(trimmedInput, providedMimeType, providedFileName);
|
|
28
|
-
}
|
|
29
|
-
function handleDirectContent(input, providedMimeType, providedFileName) {
|
|
30
|
-
const isValidBase64 = /^[A-Za-z0-9+/]*={0,2}$/.test(input);
|
|
31
|
-
if (isValidBase64) {
|
|
32
|
-
try {
|
|
33
|
-
const buffer2 = Buffer.from(input, "base64");
|
|
34
|
-
return {
|
|
35
|
-
buffer: buffer2,
|
|
36
|
-
mimeType: providedMimeType,
|
|
37
|
-
fileName: providedFileName,
|
|
38
|
-
wasReference: false
|
|
39
|
-
};
|
|
40
|
-
} catch (error) {
|
|
41
|
-
throw new Error(
|
|
42
|
-
"Failed to decode base64 data. Please ensure the data is properly encoded."
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const buffer = Buffer.from(input, "utf8");
|
|
47
|
-
return {
|
|
48
|
-
buffer,
|
|
49
|
-
mimeType: providedMimeType || "text/plain",
|
|
50
|
-
fileName: providedFileName,
|
|
51
|
-
wasReference: false
|
|
52
|
-
};
|
|
53
|
-
}
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const contentRefSchema = z.string().regex(/^content-ref:[a-zA-Z0-9_-]+$/, 'Content reference must be in format "content-ref:[alphanumeric-id]"').describe('Content reference in format "content-ref:[id]"');
|
|
54
3
|
export {
|
|
55
|
-
|
|
4
|
+
contentRefSchema
|
|
56
5
|
};
|
|
57
6
|
//# sourceMappingURL=standards-agent-kit.es52.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es52.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es52.js","sources":["../../src/validation/content-ref-schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Validates content reference format\n */\nexport const contentRefSchema = z\n .string()\n .regex(/^content-ref:[a-zA-Z0-9_-]+$/, 'Content reference must be in format \"content-ref:[alphanumeric-id]\"')\n .describe('Content reference in format \"content-ref:[id]\"');\n\n/**\n * Validates content reference or returns error for dumber models\n */\nexport function validateContentRef(input: string): string {\n try {\n return contentRefSchema.parse(input);\n } catch (error) {\n throw new Error(`Invalid content reference format. Expected \"content-ref:[alphanumeric-id]\" but got \"${input}\"`);\n }\n}"],"names":[],"mappings":";AAKO,MAAM,mBAAmB,EAC7B,SACA,MAAM,gCAAgC,qEAAqE,EAC3G,SAAS,gDAAgD;"}
|
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
const
|
|
2
|
+
const hip412FileSchema = z.object({
|
|
3
|
+
uri: z.string().describe("URI of the file"),
|
|
4
|
+
checksum: z.string().optional().describe("SHA-256 checksum of the file"),
|
|
5
|
+
is_default_file: z.boolean().optional().describe("Whether this is the default file"),
|
|
6
|
+
type: z.string().describe("MIME type of the file")
|
|
7
|
+
});
|
|
8
|
+
const hip412AttributeSchema = z.object({
|
|
9
|
+
trait_type: z.string().describe("The trait type"),
|
|
10
|
+
value: z.union([z.string(), z.number()]).describe("The trait value"),
|
|
11
|
+
display_type: z.string().optional().describe("Display type for the attribute")
|
|
12
|
+
});
|
|
13
|
+
const hip412MetadataSchema = z.object({
|
|
14
|
+
name: z.string().describe("Token name (required by HIP-412)"),
|
|
15
|
+
description: z.string().describe("Human readable description (required by HIP-412)"),
|
|
16
|
+
image: z.string().describe("Preview image URI (required by HIP-412)"),
|
|
17
|
+
type: z.string().describe("MIME type (required by HIP-412)"),
|
|
18
|
+
creator: z.string().optional().describe("Creator name or comma-separated names"),
|
|
19
|
+
creatorDID: z.string().optional().describe("Decentralized identifier for creator"),
|
|
20
|
+
checksum: z.string().optional().describe("SHA-256 checksum of the image"),
|
|
21
|
+
format: z.string().optional().default("HIP412@2.0.0").describe("Metadata format version"),
|
|
22
|
+
files: z.array(hip412FileSchema).optional().describe("Array of files for multi-file NFTs"),
|
|
23
|
+
attributes: z.array(hip412AttributeSchema).optional().describe("NFT attributes/traits"),
|
|
24
|
+
properties: z.record(z.unknown()).optional().describe("Additional properties")
|
|
25
|
+
});
|
|
26
|
+
function validateHIP412Metadata(metadata) {
|
|
27
|
+
try {
|
|
28
|
+
return hip412MetadataSchema.parse(metadata);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (error instanceof z.ZodError) {
|
|
31
|
+
const issues = error.errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("; ");
|
|
32
|
+
throw new Error(`HIP-412 metadata validation failed: ${issues}`);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
3
37
|
export {
|
|
4
|
-
|
|
38
|
+
hip412AttributeSchema,
|
|
39
|
+
hip412FileSchema,
|
|
40
|
+
hip412MetadataSchema,
|
|
41
|
+
validateHIP412Metadata
|
|
5
42
|
};
|
|
6
43
|
//# sourceMappingURL=standards-agent-kit.es53.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-agent-kit.es53.js","sources":["../../src/validation/
|
|
1
|
+
{"version":3,"file":"standards-agent-kit.es53.js","sources":["../../src/validation/hip412-schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * HIP-412 file schema for multi-file NFTs\n */\nexport const hip412FileSchema = z.object({\n uri: z.string().describe('URI of the file'),\n checksum: z.string().optional().describe('SHA-256 checksum of the file'),\n is_default_file: z.boolean().optional().describe('Whether this is the default file'),\n type: z.string().describe('MIME type of the file'),\n});\n\n/**\n * HIP-412 attribute schema for NFT traits\n */\nexport const hip412AttributeSchema = z.object({\n trait_type: z.string().describe('The trait type'),\n value: z.union([z.string(), z.number()]).describe('The trait value'),\n display_type: z.string().optional().describe('Display type for the attribute'),\n});\n\n/**\n * HIP-412 compliant metadata schema for Hedera NFTs\n */\nexport const hip412MetadataSchema = z.object({\n name: z.string().describe('Token name (required by HIP-412)'),\n description: z.string().describe('Human readable description (required by HIP-412)'),\n image: z.string().describe('Preview image URI (required by HIP-412)'),\n type: z.string().describe('MIME type (required by HIP-412)'),\n creator: z.string().optional().describe('Creator name or comma-separated names'),\n creatorDID: z.string().optional().describe('Decentralized identifier for creator'),\n checksum: z.string().optional().describe('SHA-256 checksum of the image'),\n format: z.string().optional().default('HIP412@2.0.0').describe('Metadata format version'),\n files: z.array(hip412FileSchema).optional().describe('Array of files for multi-file NFTs'),\n attributes: z.array(hip412AttributeSchema).optional().describe('NFT attributes/traits'),\n properties: z.record(z.unknown()).optional().describe('Additional properties'),\n});\n\n/**\n * Validates metadata against HIP-412 standard\n */\nexport function validateHIP412Metadata(metadata: unknown): z.infer<typeof hip412MetadataSchema> {\n try {\n return hip412MetadataSchema.parse(metadata);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');\n throw new Error(`HIP-412 metadata validation failed: ${issues}`);\n }\n throw error;\n }\n}"],"names":[],"mappings":";AAKO,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EAAE,SAAS,SAAS,iBAAiB;AAAA,EAC1C,UAAU,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,8BAA8B;AAAA,EACvE,iBAAiB,EAAE,QAAA,EAAU,SAAA,EAAW,SAAS,kCAAkC;AAAA,EACnF,MAAM,EAAE,OAAA,EAAS,SAAS,uBAAuB;AACnD,CAAC;AAKM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,YAAY,EAAE,SAAS,SAAS,gBAAgB;AAAA,EAChD,OAAO,EAAE,MAAM,CAAC,EAAE,OAAA,GAAU,EAAE,OAAA,CAAQ,CAAC,EAAE,SAAS,iBAAiB;AAAA,EACnE,cAAc,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,gCAAgC;AAC/E,CAAC;AAKM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,SAAS,SAAS,kCAAkC;AAAA,EAC5D,aAAa,EAAE,SAAS,SAAS,kDAAkD;AAAA,EACnF,OAAO,EAAE,SAAS,SAAS,yCAAyC;AAAA,EACpE,MAAM,EAAE,SAAS,SAAS,iCAAiC;AAAA,EAC3D,SAAS,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,uCAAuC;AAAA,EAC/E,YAAY,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,sCAAsC;AAAA,EACjF,UAAU,EAAE,OAAA,EAAS,SAAA,EAAW,SAAS,+BAA+B;AAAA,EACxE,QAAQ,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,cAAc,EAAE,SAAS,yBAAyB;AAAA,EACxF,OAAO,EAAE,MAAM,gBAAgB,EAAE,SAAA,EAAW,SAAS,oCAAoC;AAAA,EACzF,YAAY,EAAE,MAAM,qBAAqB,EAAE,SAAA,EAAW,SAAS,uBAAuB;AAAA,EACtF,YAAY,EAAE,OAAO,EAAE,QAAA,CAAS,EAAE,WAAW,SAAS,uBAAuB;AAC/E,CAAC;AAKM,SAAS,uBAAuB,UAAyD;AAC9F,MAAI;AACF,WAAO,qBAAqB,MAAM,QAAQ;AAAA,EAC5C,SAAS,OAAO;AACd,QAAI,iBAAiB,EAAE,UAAU;AAC/B,YAAM,SAAS,MAAM,OAAO,IAAI,CAAA,QAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,EAAE,KAAK,IAAI;AACzF,YAAM,IAAI,MAAM,uCAAuC,MAAM,EAAE;AAAA,IACjE;AACA,UAAM;AAAA,EACR;AACF;"}
|