@hashgraphonline/conversational-agent 0.2.207 → 0.2.209

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.
@@ -4,7 +4,7 @@ import { Logger } from "@hashgraphonline/standards-sdk";
4
4
  import { fieldTypeRegistry } from "./index12.js";
5
5
  import { fieldGuidanceRegistry } from "./index13.js";
6
6
  import "./index42.js";
7
- import { FIELD_PRIORITIES } from "./index46.js";
7
+ import { FIELD_PRIORITIES } from "./index47.js";
8
8
  function isZodObjectSchema(schema) {
9
9
  return typeof schema === "object" && schema !== null && "shape" in schema;
10
10
  }
@@ -1,5 +1,5 @@
1
1
  import { ReferenceIdGenerator } from "./index22.js";
2
- import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index47.js";
2
+ import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index46.js";
3
3
  const _ContentStorage = class _ContentStorage {
4
4
  constructor(maxStorage = _ContentStorage.DEFAULT_MAX_STORAGE, referenceConfig) {
5
5
  this.messages = [];
@@ -674,9 +674,11 @@ class FormAwareAgentExecutor extends AgentExecutor {
674
674
  this.formLogger.info(
675
675
  "🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata"
676
676
  );
677
+ const parsedRecord = parsed;
677
678
  responseMetadata = {
678
679
  ...responseMetadata,
679
- hashLinkBlock: parsed.hashLinkBlock
680
+ hashLinkBlock: parsedRecord.hashLinkBlock,
681
+ ...parsedRecord
680
682
  };
681
683
  formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);
682
684
  this.formLogger.info(
@@ -690,7 +692,8 @@ class FormAwareAgentExecutor extends AgentExecutor {
690
692
  formattedOutput = ResponseFormatter.formatResponse(toolOutput);
691
693
  responseMetadata = {
692
694
  ...responseMetadata,
693
- hashLinkBlock: parsed.hashLinkBlock
695
+ hashLinkBlock: parsed.hashLinkBlock,
696
+ ...parsed
694
697
  };
695
698
  }
696
699
  } else {
@@ -888,7 +891,7 @@ Please fill out the form below to continue.`;
888
891
  let hashLinkBlock;
889
892
  if (toolResponse.hashLinkBlock) {
890
893
  hashLinkBlock = toolResponse.hashLinkBlock;
891
- } else if (toolResponse.success && toolResponse.inscription && toolResponse.hashLinkBlock) {
894
+ } else if (toolResponse.success && toolResponse.hashLinkBlock) {
892
895
  hashLinkBlock = toolResponse.hashLinkBlock;
893
896
  }
894
897
  if (!hashLinkBlock) {
@@ -1 +1 @@
1
- {"version":3,"file":"index31.js","sources":["../../src/langchain/form-aware-agent-executor.ts"],"sourcesContent":["import { AgentExecutor } from 'langchain/agents';\nimport { ZodError, z } from 'zod';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage, FormSubmission } from '../forms/types';\nimport { FormEngine } from '../forms/form-engine';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { AgentAction, AgentFinish, AgentStep } from 'langchain/agents';\nimport type { ToolInterface } from '@langchain/core/tools';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\nimport type { ChainValues } from '@langchain/core/utils/types';\nimport type { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport { ResponseFormatter } from '../utils/response-formatter';\n\ntype BasicFieldType = 'text' | 'number' | 'select' | 'checkbox' | 'textarea';\n\nconst globalPendingForms: Map<string, PendingFormData> = new Map();\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface HashLinkResponse {\n hasHashLinkBlocks: boolean;\n hashLinkBlock?: HashLinkBlock;\n message: string;\n}\n\ninterface ToolWithOriginal {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n}\n\ninterface ActionWithToolInput {\n toolInput?: Record<string, unknown>;\n}\n\ninterface ZodSchemaDefinition {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, z.ZodTypeAny>) | Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n defaultValue?: unknown;\n };\n}\n\ninterface ToolWrapper {\n executeOriginal?: (args: Record<string, unknown>) => Promise<string>;\n getOriginalTool?: () => {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n originalTool?: {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface CallableTool {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface ToolWithSchema {\n schema?: Record<string, unknown>;\n}\n\ninterface PendingFormData {\n toolName: string;\n originalInput: unknown;\n originalToolInput?: unknown;\n schema: unknown;\n toolRef?: ToolInterface | undefined;\n originalToolRef?: ToolWithOriginal['originalTool'];\n}\n\ninterface ToolResponse {\n requiresForm?: boolean;\n formMessage?: {\n id: string;\n [key: string]: unknown;\n };\n message?: string;\n hashLinkBlock?: HashLinkBlock;\n success?: boolean;\n inscription?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\ninterface IntermediateStepData {\n action?: {\n tool?: string;\n [key: string]: unknown;\n };\n observation?: unknown;\n}\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface ResponseMetadataWithHashLink {\n hashLinkBlock?: HashLinkBlock;\n [key: string]: unknown;\n}\n\n/**\n * Parameter preprocessing callback interface\n */\nexport interface ParameterPreprocessingCallback {\n (toolName: string, parameters: Record<string, unknown>): Promise<\n Record<string, unknown>\n >;\n}\n\n/**\n * Agent executor that intercepts Zod validation errors and generates forms,\n * and processes HashLink block responses for rich UI rendering\n */\nexport class FormAwareAgentExecutor extends AgentExecutor {\n private formGenerator: FormGenerator;\n private formEngine: FormEngine;\n private formLogger: Logger;\n private pendingForms: Map<string, PendingFormData> = new Map();\n private parameterPreprocessingCallback:\n | ParameterPreprocessingCallback\n | undefined;\n\n /**\n * Type guard to check if a Zod type is a ZodObject\n */\n private isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n }\n\n /**\n * Type guard to check if metadata has hashLinkBlock\n */\n private hasHashLinkBlock(\n metadata: unknown\n ): metadata is ResponseMetadataWithHashLink & {\n hashLinkBlock: HashLinkBlock;\n } {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hashLinkBlock' in metadata &&\n typeof (metadata as Record<string, unknown>).hashLinkBlock === 'object' &&\n (metadata as Record<string, unknown>).hashLinkBlock !== null\n );\n }\n\n constructor(...args: ConstructorParameters<typeof AgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formEngine = new FormEngine(\n new Logger({ module: 'FormAwareAgentExecutor.FormEngine' })\n );\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\n this.parameterPreprocessingCallback = undefined;\n }\n\n /**\n * Set parameter preprocessing callback\n */\n setParameterPreprocessingCallback(\n callback: ParameterPreprocessingCallback | undefined\n ): void {\n this.parameterPreprocessingCallback = callback;\n }\n\n /**\n * BULLETPROOF TOOL INTERCEPTION\n * Override the single-step execution to intercept tool calls BEFORE LangChain processes them\n */\n override async _takeNextStep(\n nameToolMap: Record<string, ToolInterface>,\n inputs: ChainValues,\n intermediateSteps: AgentStep[],\n runManager?: CallbackManagerForChainRun,\n config?: RunnableConfig\n ): Promise<AgentFinish | AgentStep[]> {\n this.formLogger.info('🛡️ BULLETPROOF INTERCEPTION: _takeNextStep called', {\n availableTools: Object.keys(nameToolMap),\n inputKeys: Object.keys(inputs),\n });\n\n const result = await this.agent.plan(\n intermediateSteps,\n inputs,\n runManager?.getChild()\n );\n\n if ('returnValues' in result) {\n this.formLogger.info('Agent returned finish action, passing through');\n return result;\n }\n\n const action = result as AgentAction;\n const toolName = action.tool;\n const toolInput = action.toolInput;\n\n this.formLogger.info(`🎯 INTERCEPTING TOOL CALL: ${toolName}`, {\n toolInput,\n hasInNameToolMap: toolName in nameToolMap,\n toolInputKeys: Object.keys(toolInput || {}),\n });\n\n const tool =\n nameToolMap[toolName] || this.tools.find((t) => t.name === toolName);\n\n if (!tool) {\n this.formLogger.error(`Tool ${toolName} not found in registry`);\n throw new Error(`Tool \"${toolName}\" not found`);\n }\n\n let shouldGenerateForm = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🔍 Tool ${toolName} implements FormValidatable, checking shouldGenerateForm()`,\n {\n toolInput,\n }\n );\n\n try {\n shouldGenerateForm = tool.shouldGenerateForm(toolInput);\n this.formLogger.info(\n `FormValidatable.shouldGenerateForm() result: ${shouldGenerateForm}`,\n {\n toolName,\n toolInput,\n }\n );\n } catch (error) {\n this.formLogger.error(\n `Error calling shouldGenerateForm() on ${toolName}:`,\n error\n );\n shouldGenerateForm = false;\n }\n }\n\n if (shouldGenerateForm) {\n this.formLogger.info(`🚨 FORM GENERATION TRIGGERED for ${toolName}`);\n\n try {\n let schemaToUse: z.ZodSchema;\n let isFocusedSchema = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🎯 Tool ${toolName} is FormValidatable, attempting to get focused schema`\n );\n try {\n const focusedSchema = tool.getFormSchema();\n if (focusedSchema) {\n schemaToUse = focusedSchema;\n isFocusedSchema = true;\n this.formLogger.info(\n `✅ Successfully obtained focused schema for ${toolName}`\n );\n } else {\n this.formLogger.warn(\n `getFormSchema() returned null/undefined for ${toolName}, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } catch (error) {\n this.formLogger.error(\n `Failed to get focused schema from ${toolName}:`,\n error\n );\n this.formLogger.info(\n `Falling back to default schema for ${toolName}`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } else {\n this.formLogger.info(\n `Tool ${toolName} is not FormValidatable, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n\n let schemaFieldCount = 'unknown';\n try {\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape;\n if (shape && typeof shape === 'object') {\n schemaFieldCount = Object.keys(shape).length.toString();\n }\n }\n } catch {}\n\n this.formLogger.info(\n `📋 Generating form with ${\n isFocusedSchema ? 'FOCUSED' : 'DEFAULT'\n } schema`,\n {\n toolName,\n schemaType: schemaToUse?.constructor?.name,\n estimatedFieldCount: schemaFieldCount,\n isFocusedSchema,\n }\n );\n\n let missingFields: Set<string> | undefined;\n\n if (isFocusedSchema) {\n this.formLogger.info(\n `⭐ Using focused schema - letting FormGenerator determine fields from schema`\n );\n missingFields = undefined;\n } else {\n missingFields = new Set<string>();\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape || {};\n for (const fieldName of Object.keys(shape)) {\n const value = (toolInput || {})[fieldName];\n\n const isEmpty =\n isFormValidatable(tool) && tool.isFieldEmpty\n ? tool.isFieldEmpty(fieldName, value)\n : value === undefined ||\n value === '' ||\n value === null ||\n (Array.isArray(value) && value.length === 0);\n\n const isRequired = this.isFieldRequired(schemaToUse, fieldName);\n\n const isEssential =\n isFormValidatable(tool) && tool.getEssentialFields\n ? tool.getEssentialFields().includes(fieldName)\n : false;\n\n this.formLogger.info(`🔍 Field analysis: ${fieldName}`, {\n value: value,\n isEmpty: isEmpty,\n isRequired: isRequired,\n isEssential: isEssential,\n willAddToMissingFields: isEmpty && (isRequired || isEssential),\n });\n\n if (isEmpty && (isRequired || isEssential)) {\n missingFields.add(fieldName);\n }\n }\n }\n\n this.formLogger.info(`📋 Missing fields analysis complete`, {\n totalFields: this.isZodObject(schemaToUse)\n ? Object.keys(schemaToUse.shape).length\n : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schemaToUse,\n toolInput,\n {\n toolName: toolName,\n toolDescription: tool.description,\n },\n missingFields\n );\n\n if (this.isZodObject(schemaToUse)) {\n try {\n const { jsonSchema, uiSchema } =\n this.formGenerator.generateJsonSchemaForm(\n schemaToUse,\n toolInput as Record<string, unknown> | undefined,\n missingFields\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.formLogger.warn(\n 'Failed to generate JSON Schema for RJSF:',\n error\n );\n }\n }\n\n formMessage.partialInput = toolInput;\n\n const formData: PendingFormData = {\n toolName: toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: schemaToUse,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n };\n this.pendingForms.set(formMessage.id, formData);\n globalPendingForms.set(formMessage.id, formData);\n\n this.formLogger.info(`✅ FORM INTERCEPT SUCCESS for ${toolName}`);\n\n const formResult = {\n requiresForm: true,\n formMessage,\n };\n\n return [\n {\n action: action,\n observation: JSON.stringify(formResult),\n },\n ];\n } catch (error) {\n this.formLogger.error(`Form generation failed for ${toolName}:`, error);\n }\n }\n\n this.formLogger.info(\n `⚪ Passing through to normal tool execution for ${toolName}`\n );\n\n if (this.parameterPreprocessingCallback && toolInput) {\n this.formLogger.info(\n `🔄 Applying parameter preprocessing for ${toolName}`\n );\n try {\n const preprocessedInput = await this.parameterPreprocessingCallback(\n toolName,\n toolInput as Record<string, unknown>\n );\n\n if (\n preprocessedInput &&\n typeof preprocessedInput === 'object' &&\n '__requestForm' in (preprocessedInput as Record<string, unknown>)\n ) {\n const rf = (preprocessedInput as Record<string, unknown>)\n .__requestForm as {\n id?: string;\n title?: string;\n description?: string;\n fields?: Array<{\n name: string;\n label: string;\n type: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n }>;\n submitLabel?: string;\n };\n\n const formId =\n rf.id ||\n `form_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const formMessage = {\n type: 'form',\n id: formId,\n originalPrompt: 'Parameter validation required',\n toolName,\n formConfig: {\n title: rf.title || 'Complete required parameters',\n description:\n rf.description ||\n 'One or more parameters require confirmation. Please review and submit.',\n submitLabel: rf.submitLabel || 'Continue',\n fields: (rf.fields || []).map((f) => {\n const allowedTypes: BasicFieldType[] = [\n 'text',\n 'number',\n 'select',\n 'checkbox',\n 'textarea',\n ];\n const resolvedType: BasicFieldType = allowedTypes.includes(\n f.type as BasicFieldType\n )\n ? (f.type as BasicFieldType)\n : 'text';\n\n return {\n name: f.name,\n label: f.label,\n type: resolvedType,\n required: f.required ?? true,\n options: f.options,\n };\n }),\n },\n };\n\n const resolvedSchema = isFormValidatable(tool)\n ? (() => {\n try {\n const s = tool.getFormSchema();\n return s || tool.schema;\n } catch {\n return tool.schema;\n }\n })()\n : tool.schema;\n\n this.pendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n });\n globalPendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n });\n\n return [\n {\n action,\n observation: JSON.stringify({ requiresForm: true, formMessage }),\n },\n ];\n }\n\n if (JSON.stringify(preprocessedInput) !== JSON.stringify(toolInput)) {\n this.formLogger.info(`📝 Parameters preprocessed for ${toolName}:`, {\n original: Object.keys(toolInput as Record<string, unknown>),\n preprocessed: Object.keys(preprocessedInput),\n hasChanges: true,\n });\n\n try {\n (action as ActionWithToolInput).toolInput = preprocessedInput;\n } catch {}\n } else {\n this.formLogger.debug(`No parameter changes needed for ${toolName}`);\n }\n } catch (preprocessError) {\n this.formLogger.warn(\n `Parameter preprocessing failed for ${toolName}, using original parameters:`,\n preprocessError\n );\n }\n }\n\n return super._takeNextStep(\n nameToolMap,\n inputs,\n intermediateSteps,\n runManager,\n config\n );\n }\n\n /**\n * Helper to determine if a field is required in the schema\n */\n private isFieldRequired(schema: unknown, fieldPath: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const obj = schema as ZodSchemaDefinition;\n const def = obj._def;\n if (!def || def.typeName !== 'ZodObject') {\n return false;\n }\n const rawShape: unknown =\n typeof def.shape === 'function' ? def.shape() : def.shape;\n if (!rawShape || typeof rawShape !== 'object') {\n return false;\n }\n const shape = rawShape as Record<string, z.ZodTypeAny>;\n const fieldSchema = shape[fieldPath];\n if (!fieldSchema) {\n return false;\n }\n const unwrapOptional = (s: z.ZodTypeAny): z.ZodTypeAny => {\n const inner = (s as ZodSchemaDefinition)._def;\n if (inner && inner.typeName === 'ZodOptional' && inner.innerType) {\n return inner.innerType;\n }\n return s;\n };\n const unwrapped = unwrapOptional(fieldSchema);\n const fdef = (unwrapped as ZodSchemaDefinition)._def;\n if (!fdef) {\n return true;\n }\n if (fdef.typeName === 'ZodOptional' || fdef.typeName === 'ZodDefault') {\n return false;\n }\n if (fdef.defaultValue !== undefined) {\n return false;\n }\n return true;\n } catch (error) {\n this.formLogger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n return false;\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(\n inputs: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n try {\n const result = await super._call(inputs);\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n for (const step of result.intermediateSteps) {\n if (step.observation) {\n try {\n const parsed: ToolResponse =\n typeof step.observation === 'string'\n ? JSON.parse(step.observation)\n : (step.observation as ToolResponse);\n\n if (parsed.requiresForm && parsed.formMessage) {\n this.formLogger.info('Tool requested form generation', {\n toolName: step.action?.tool,\n hasForm: true,\n });\n\n const actionToolName =\n (step as IntermediateStepData).action?.tool || 'unknown';\n const toolInstance = this.tools.find(\n (t) => t.name === actionToolName\n ) as ToolInterface | undefined;\n const originalToolCandidate =\n (toolInstance as ToolWithOriginal) || {};\n const pf: PendingFormData = {\n toolName: actionToolName,\n originalInput: inputs,\n originalToolInput: (step as IntermediateStepData).action\n ?.toolInput as Record<string, unknown> | undefined,\n schema: null,\n toolRef: toolInstance,\n originalToolRef: originalToolCandidate?.originalTool,\n };\n this.pendingForms.set(parsed.formMessage.id, pf);\n globalPendingForms.set(parsed.formMessage.id, pf);\n\n return {\n ...result,\n requiresForm: true,\n formMessage: parsed.formMessage,\n output:\n parsed.message || 'Please complete the form to continue.',\n };\n }\n\n if (\n parsed.hashLinkBlock ||\n (parsed.success && parsed.inscription && parsed.hashLinkBlock)\n ) {\n this.formLogger.info('Tool returned HashLink blocks', {\n toolName: (step as IntermediateStepData).action?.tool,\n hasHashLink: true,\n blockId: parsed.hashLinkBlock?.blockId,\n });\n\n const hashLinkResponse = this.processHashLinkResponse(parsed);\n\n return {\n ...result,\n hasHashLinkBlocks: true,\n hashLinkBlock: hashLinkResponse.hashLinkBlock,\n output: hashLinkResponse.message,\n };\n }\n } catch {}\n }\n }\n }\n\n return result;\n } catch (error) {\n if (error instanceof ZodError) {\n this.formLogger.info('Intercepted ZodError during agent execution');\n return this.handleValidationError(error, inputs, []);\n }\n throw error;\n }\n }\n\n /**\n * Handles Zod validation errors by generating forms\n */\n private async handleValidationError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): Promise<Record<string, unknown>> {\n this.formLogger.info('Zod validation error detected, generating form', {\n errorIssues: error.issues.length,\n inputKeys: Object.keys(inputs),\n });\n\n let toolInfo = this.extractToolInfoFromError(\n error,\n inputs,\n intermediateSteps\n );\n\n if (!toolInfo) {\n this.formLogger.warn(\n 'Could not extract tool info from validation error, trying fallback detection'\n );\n const fallbackTool = this.detectToolFromErrorContext(error);\n if (!fallbackTool) {\n this.formLogger.error(\n 'No tool detected for form generation, rethrowing error'\n );\n throw error;\n }\n toolInfo = fallbackTool;\n }\n\n this.formLogger.info('Generating form for tool:', {\n toolName: toolInfo.toolName,\n hasSchema: !!toolInfo.schema,\n });\n\n const formMessage = this.formGenerator.generateFormFromError(\n error,\n toolInfo.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n toolInfo.toolName,\n (inputs.input as string) || ''\n );\n\n this.pendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n globalPendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n return {\n output: this.formatFormResponse(formMessage),\n formMessage,\n requiresForm: true,\n intermediateSteps: intermediateSteps || [],\n };\n }\n\n /**\n * Get a copy of pending forms for preservation during executor recreation\n */\n getPendingForms(): Map<string, PendingFormData> {\n return new Map(this.pendingForms);\n }\n\n /**\n * Restore pending forms from a previous executor instance\n */\n restorePendingForms(forms: Map<string, PendingFormData>): void {\n for (const [formId, formData] of forms) {\n this.pendingForms.set(formId, formData);\n }\n }\n\n /**\n * Processes form submission and continues tool execution\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<Record<string, unknown>> {\n this.formLogger.info(\n '🚀 FormAwareAgentExecutor.processFormSubmission called!',\n {\n submissionFormId: submission.formId,\n submissionToolName: submission.toolName,\n }\n );\n if (!submission) {\n throw new Error('Form submission is null or undefined');\n }\n\n if (!submission.formId) {\n throw new Error('Form submission missing formId');\n }\n\n if (\n !submission.parameters ||\n submission.parameters === null ||\n typeof submission.parameters !== 'object' ||\n Array.isArray(submission.parameters)\n ) {\n throw new Error(\n `Form submission parameters are invalid: ${typeof submission.parameters}, isNull: ${\n submission.parameters === null\n }, isArray: ${Array.isArray(\n submission.parameters\n )}, parameters: ${JSON.stringify(submission.parameters)}`\n );\n }\n\n this.formLogger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters),\n parametersType: typeof submission.parameters,\n parametersIsNull: submission.parameters === null,\n parametersIsUndefined: submission.parameters === undefined,\n hasContext: !!submission.context,\n });\n\n let pendingForm = this.pendingForms.get(submission.formId);\n\n if (!pendingForm) {\n pendingForm = globalPendingForms.get(submission.formId);\n if (!pendingForm) {\n throw new Error(`No pending form found for ID: ${submission.formId}`);\n }\n }\n\n this.pendingForms.delete(submission.formId);\n globalPendingForms.delete(submission.formId);\n\n const tool =\n pendingForm.toolRef ||\n this.tools.find((t) => t.name === pendingForm.toolName);\n if (!tool) {\n throw new Error(\n `Tool not found for form submission: ${pendingForm.toolName}`\n );\n }\n\n let baseToolInput: Record<string, unknown> = {};\n try {\n if (\n pendingForm.originalToolInput &&\n typeof pendingForm.originalToolInput === 'object'\n ) {\n baseToolInput = {\n ...(pendingForm.originalToolInput as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract base tool input, using empty object:',\n error\n );\n baseToolInput = {};\n }\n\n let submissionData: Record<string, unknown> = {};\n try {\n if (submission.parameters && typeof submission.parameters === 'object') {\n submissionData = {\n ...(submission.parameters as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract submission parameters, using empty object:',\n error\n );\n submissionData = {};\n }\n\n const mergedToolInput: Record<string, unknown> = {};\n try {\n Object.keys(baseToolInput).forEach((key) => {\n const value = baseToolInput[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n Object.keys(submissionData).forEach((key) => {\n const value = submissionData[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n mergedToolInput.renderForm = false;\n mergedToolInput.__fromForm = true;\n\n this.formLogger.info('Successfully merged tool input:', {\n baseKeys: Object.keys(baseToolInput),\n submissionKeys: Object.keys(submissionData),\n mergedKeys: Object.keys(mergedToolInput),\n });\n } catch (error) {\n this.formLogger.error('Failed to merge tool input data:', error);\n throw new Error(\n `Failed to merge tool input data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n try {\n const maybeWrapper = tool as ToolWrapper;\n let toolOutput: string;\n if (typeof maybeWrapper.executeOriginal === 'function') {\n toolOutput = await maybeWrapper.executeOriginal(mergedToolInput);\n } else if (typeof maybeWrapper.getOriginalTool === 'function') {\n const ot = maybeWrapper.getOriginalTool();\n const otCall = ot as CallableTool;\n if (ot && typeof otCall._call === 'function') {\n toolOutput = await otCall._call(mergedToolInput);\n } else if (ot && typeof otCall.call === 'function') {\n toolOutput = await otCall.call(mergedToolInput);\n } else {\n const tcall = tool as CallableTool;\n if (typeof tcall.call === 'function') {\n toolOutput = await tcall.call(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n }\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool._call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool._call(mergedToolInput);\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool.call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool.call(mergedToolInput);\n } else if (typeof (tool as CallableTool).call === 'function') {\n toolOutput = await (tool as CallableTool).call!(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n\n let responseMetadata: Record<string, unknown> = {};\n let formattedOutput: string;\n\n try {\n const parsed = JSON.parse(toolOutput);\n this.formLogger.info(\n '✅ METADATA EXTRACTION: Successfully parsed JSON',\n {\n jsonKeys: Object.keys(parsed),\n hasHashLinkBlock: !!(parsed as Record<string, unknown>)\n .hashLinkBlock,\n }\n );\n\n if (parsed && typeof parsed === 'object') {\n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n this.formLogger.info(\n '🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata'\n );\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n\n formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);\n\n this.formLogger.info(\n '🔗 METADATA PRESERVED: HashLink metadata extracted for component rendering',\n {\n blockId: this.hasHashLinkBlock(responseMetadata)\n ? responseMetadata.hashLinkBlock.blockId\n : undefined,\n hasTemplate: this.hasHashLinkBlock(responseMetadata)\n ? !!responseMetadata.hashLinkBlock.template\n : false,\n }\n );\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n };\n }\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n } catch (error) {\n this.formLogger.warn(\n '❌ METADATA EXTRACTION: Tool output is not JSON',\n {\n error: error instanceof Error ? error.message : 'unknown error',\n outputSample:\n typeof toolOutput === 'string'\n ? toolOutput.substring(0, 200)\n : 'not-string',\n }\n );\n\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n\n return {\n output: formattedOutput,\n formCompleted: true,\n originalFormId: submission.formId,\n intermediateSteps: [],\n metadata: responseMetadata,\n rawToolOutput: toolOutput,\n toolName: pendingForm.toolName,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n return this.handleValidationError(error, mergedToolInput, []);\n }\n throw error;\n }\n }\n\n /**\n * Extracts tool information from the execution context\n */\n private extractToolInfoFromError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): { toolName: string; schema: unknown } | null {\n try {\n if (intermediateSteps.length > 0) {\n const lastStep = intermediateSteps[intermediateSteps.length - 1];\n if (lastStep.action && lastStep.action.tool) {\n const tool = this.tools.find((t) => t.name === lastStep.action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info(\n 'Found tool from intermediate steps:',\n lastStep.action.tool\n );\n return {\n toolName: lastStep.action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const inputSteps = (inputs.intermediateSteps as unknown[]) || [];\n if (inputSteps.length > 0) {\n const lastStep = inputSteps[inputSteps.length - 1];\n let action: AgentAction;\n\n if (Array.isArray(lastStep) && lastStep.length > 0) {\n action = lastStep[0] as AgentAction;\n } else if ((lastStep as Record<string, unknown>).action) {\n action = (lastStep as Record<string, unknown>).action as AgentAction;\n } else {\n action = lastStep as AgentAction;\n }\n\n if (action && action.tool) {\n const tool = this.tools.find((t) => t.name === action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info('Found tool from input steps:', action.tool);\n return {\n toolName: action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const toolFromContext = this.findToolFromContext(inputs);\n if (toolFromContext) {\n this.formLogger.info(\n 'Found tool from context:',\n toolFromContext.toolName\n );\n return toolFromContext;\n }\n\n return null;\n } catch (err) {\n this.formLogger.error('Error extracting tool info:', err);\n return null;\n }\n }\n\n /**\n * Attempts to find tool from execution context\n */\n private findToolFromContext(inputs: Record<string, unknown>): {\n toolName: string;\n schema: unknown;\n } | null {\n const inputText = (inputs.input as string) || '';\n\n for (const tool of this.tools) {\n const keywords = this.extractToolKeywords(tool.name);\n\n if (\n keywords.some((keyword) =>\n inputText.toLowerCase().includes(keyword.toLowerCase())\n )\n ) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Additional fallback to detect tool from error context\n */\n private detectToolFromErrorContext(\n error: ZodError\n ): { toolName: string; schema: unknown } | null {\n const errorPaths = error.issues.map((issue) => issue.path.join('.'));\n\n for (const tool of this.tools) {\n if ('schema' in tool) {\n const toolSchema = (tool as ToolWithSchema).schema;\n if (this.schemaMatchesErrorPaths(toolSchema, errorPaths)) {\n this.formLogger.info(\n 'Detected tool from error path analysis:',\n tool.name\n );\n return {\n toolName: tool.name,\n schema: toolSchema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Checks if a schema structure matches error paths\n */\n private schemaMatchesErrorPaths(\n schema: unknown,\n errorPaths: string[]\n ): boolean {\n const schemaRecord = schema as Record<string, unknown>;\n if (!schemaRecord || !schemaRecord._def) return false;\n\n try {\n const def = schemaRecord._def as Record<string, unknown>;\n if (def.typeName === 'ZodObject') {\n const shape = def.shape as Record<string, unknown>;\n const schemaKeys = Object.keys(shape || {});\n return errorPaths.some((path) => {\n const topLevelKey = path.split('.')[0];\n return schemaKeys.includes(topLevelKey);\n });\n }\n } catch (err) {\n this.formLogger.debug('Error analyzing schema structure:', err);\n }\n\n return false;\n }\n\n /**\n * Extracts keywords from tool name for matching\n */\n private extractToolKeywords(toolName: string): string[] {\n const words = toolName\n .replace(/([A-Z])/g, ' $1')\n .toLowerCase()\n .split(/[\\s_-]+/)\n .filter((w) => w.length > 2);\n\n return [...words, toolName.toLowerCase()];\n }\n\n /**\n * Formats the form message for display\n */\n private formatFormResponse(formMessage: FormMessage): string {\n const fieldCount = formMessage.formConfig.fields.length;\n const fieldList = formMessage.formConfig.fields\n .slice(0, 3)\n .map((f) => `• ${f.label}`)\n .join('\\n');\n\n return `I need some additional information to complete your request.\n\n${formMessage.formConfig.description}\n\nRequired fields:\n${fieldList}${fieldCount > 3 ? `\\n... and ${fieldCount - 3} more` : ''}\n\nPlease fill out the form below to continue.`;\n }\n\n /**\n * Check if there are pending forms\n */\n hasPendingForms(): boolean {\n return this.pendingForms.size > 0;\n }\n\n /**\n * Get information about pending forms\n */\n getPendingFormsInfo(): Array<{ formId: string; toolName: string }> {\n return Array.from(this.pendingForms.entries()).map(([formId, info]) => ({\n formId,\n toolName: info.toolName,\n }));\n }\n\n /**\n * Processes HashLink block responses from tools\n */\n private processHashLinkResponse(\n toolResponse: ToolResponse\n ): HashLinkResponse {\n try {\n let hashLinkBlock: HashLinkBlock | undefined;\n\n if (toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n } else if (\n toolResponse.success &&\n toolResponse.inscription &&\n toolResponse.hashLinkBlock\n ) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n }\n\n if (!hashLinkBlock) {\n throw new Error('HashLink block data not found in response');\n }\n\n if (\n !hashLinkBlock.blockId ||\n !hashLinkBlock.hashLink ||\n !hashLinkBlock.attributes\n ) {\n throw new Error(\n 'Invalid HashLink block structure - missing required fields'\n );\n }\n\n let message = 'Content processed successfully!';\n\n if (toolResponse.success && toolResponse.inscription) {\n const inscription = toolResponse.inscription;\n const metadata = toolResponse.metadata || {};\n\n message = `✅ ${inscription.standard} Hashinal inscription completed!\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n message += `📍 **Topic ID:** ${inscription.topicId}\\n`;\n message += `🔗 **HRL:** ${inscription.hrl}\\n`;\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n }\n\n this.formLogger.info('Processed HashLink response', {\n blockId: hashLinkBlock.blockId,\n hashLink: hashLinkBlock.hashLink,\n hasTemplate: !!hashLinkBlock.template,\n attributeCount: Object.keys(hashLinkBlock.attributes || {}).length,\n });\n\n return {\n hasHashLinkBlocks: true,\n hashLinkBlock,\n message,\n };\n } catch (error) {\n this.formLogger.error('Error processing HashLink response:', error);\n\n return {\n hasHashLinkBlocks: false,\n message: 'Content processed, but interactive display is not available.',\n };\n }\n }\n\n /**\n * Get FormEngine statistics for debugging\n */\n getFormEngineStatistics(): {\n strategies: string[];\n middleware: string[];\n } {\n return {\n strategies: this.formEngine.getRegisteredStrategies(),\n middleware: this.formEngine.getRegisteredMiddleware(),\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;AAgBA,MAAM,yCAAuD,IAAA;AA+GtD,MAAM,+BAA+B,cAAc;AAAA,EAiCxD,eAAe,MAAmD;AAChE,UAAM,GAAG,IAAI;AA9Bf,SAAQ,mCAAiD,IAAA;AA+BvD,SAAK,gBAAgB,IAAI,cAAA;AACzB,SAAK,aAAa,IAAI;AAAA,MACpB,IAAI,OAAO,EAAE,QAAQ,qCAAqC;AAAA,IAAA;AAE5D,SAAK,aAAa,IAAI,OAAO,EAAE,QAAQ,0BAA0B;AACjE,SAAK,iCAAiC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EA7BQ,YAAY,QAAuD;AACzE,WAAO,kBAAkB,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,UAGA;AACA,WACE,OAAO,aAAa,YACpB,aAAa,QACb,mBAAmB,YACnB,OAAQ,SAAqC,kBAAkB,YAC9D,SAAqC,kBAAkB;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA,EAeA,kCACE,UACM;AACN,SAAK,iCAAiC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,cACb,aACA,QACA,mBACA,YACA,QACoC;AACpC,SAAK,WAAW,KAAK,sDAAsD;AAAA,MACzE,gBAAgB,OAAO,KAAK,WAAW;AAAA,MACvC,WAAW,OAAO,KAAK,MAAM;AAAA,IAAA,CAC9B;AAED,UAAM,SAAS,MAAM,KAAK,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,YAAY,SAAA;AAAA,IAAS;AAGvB,QAAI,kBAAkB,QAAQ;AAC5B,WAAK,WAAW,KAAK,+CAA+C;AACpE,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO;AAEzB,SAAK,WAAW,KAAK,8BAA8B,QAAQ,IAAI;AAAA,MAC7D;AAAA,MACA,kBAAkB,YAAY;AAAA,MAC9B,eAAe,OAAO,KAAK,aAAa,CAAA,CAAE;AAAA,IAAA,CAC3C;AAED,UAAM,OACJ,YAAY,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAErE,QAAI,CAAC,MAAM;AACT,WAAK,WAAW,MAAM,QAAQ,QAAQ,wBAAwB;AAC9D,YAAM,IAAI,MAAM,SAAS,QAAQ,aAAa;AAAA,IAChD;AAEA,QAAI,qBAAqB;AAEzB,QAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAK,WAAW;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB;AAAA,UACE;AAAA,QAAA;AAAA,MACF;AAGF,UAAI;AACF,6BAAqB,KAAK,mBAAmB,SAAS;AACtD,aAAK,WAAW;AAAA,UACd,gDAAgD,kBAAkB;AAAA,UAClE;AAAA,YACE;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ,SAAS,OAAO;AACd,aAAK,WAAW;AAAA,UACd,yCAAyC,QAAQ;AAAA,UACjD;AAAA,QAAA;AAEF,6BAAqB;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,oBAAoB;AACtB,WAAK,WAAW,KAAK,oCAAoC,QAAQ,EAAE;AAEnE,UAAI;AACF,YAAI;AACJ,YAAI,kBAAkB;AAEtB,YAAI,kBAAkB,IAAI,GAAG;AAC3B,eAAK,WAAW;AAAA,YACd,WAAW,QAAQ;AAAA,UAAA;AAErB,cAAI;AACF,kBAAM,gBAAgB,KAAK,cAAA;AAC3B,gBAAI,eAAe;AACjB,4BAAc;AACd,gCAAkB;AAClB,mBAAK,WAAW;AAAA,gBACd,8CAA8C,QAAQ;AAAA,cAAA;AAAA,YAE1D,OAAO;AACL,mBAAK,WAAW;AAAA,gBACd,+CAA+C,QAAQ;AAAA,cAAA;AAEzD,4BAAc,KAAK;AACnB,gCAAkB;AAAA,YACpB;AAAA,UACF,SAAS,OAAO;AACd,iBAAK,WAAW;AAAA,cACd,qCAAqC,QAAQ;AAAA,cAC7C;AAAA,YAAA;AAEF,iBAAK,WAAW;AAAA,cACd,sCAAsC,QAAQ;AAAA,YAAA;AAEhD,0BAAc,KAAK;AACnB,8BAAkB;AAAA,UACpB;AAAA,QACF,OAAO;AACL,eAAK,WAAW;AAAA,YACd,QAAQ,QAAQ;AAAA,UAAA;AAElB,wBAAc,KAAK;AACnB,4BAAkB;AAAA,QACpB;AAEA,YAAI,mBAAmB;AACvB,YAAI;AACF,cAAI,KAAK,YAAY,WAAW,GAAG;AACjC,kBAAM,YAAY;AAClB,kBAAM,QAAQ,UAAU;AACxB,gBAAI,SAAS,OAAO,UAAU,UAAU;AACtC,iCAAmB,OAAO,KAAK,KAAK,EAAE,OAAO,SAAA;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAC;AAET,aAAK,WAAW;AAAA,UACd,2BACE,kBAAkB,YAAY,SAChC;AAAA,UACA;AAAA,YACE;AAAA,YACA,YAAY,aAAa,aAAa;AAAA,YACtC,qBAAqB;AAAA,YACrB;AAAA,UAAA;AAAA,QACF;AAGF,YAAI;AAEJ,YAAI,iBAAiB;AACnB,eAAK,WAAW;AAAA,YACd;AAAA,UAAA;AAEF,0BAAgB;AAAA,QAClB,OAAO;AACL,8CAAoB,IAAA;AACpB,cAAI,KAAK,YAAY,WAAW,GAAG;AACjC,kBAAM,YAAY;AAClB,kBAAM,QAAQ,UAAU,SAAS,CAAA;AACjC,uBAAW,aAAa,OAAO,KAAK,KAAK,GAAG;AAC1C,oBAAM,SAAS,aAAa,CAAA,GAAI,SAAS;AAEzC,oBAAM,UACJ,kBAAkB,IAAI,KAAK,KAAK,eAC5B,KAAK,aAAa,WAAW,KAAK,IAClC,UAAU,UACV,UAAU,MACV,UAAU,QACT,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAEhD,oBAAM,aAAa,KAAK,gBAAgB,aAAa,SAAS;AAE9D,oBAAM,cACJ,kBAAkB,IAAI,KAAK,KAAK,qBAC5B,KAAK,mBAAA,EAAqB,SAAS,SAAS,IAC5C;AAEN,mBAAK,WAAW,KAAK,sBAAsB,SAAS,IAAI;AAAA,gBACtD;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,wBAAwB,YAAY,cAAc;AAAA,cAAA,CACnD;AAED,kBAAI,YAAY,cAAc,cAAc;AAC1C,8BAAc,IAAI,SAAS;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAEA,eAAK,WAAW,KAAK,uCAAuC;AAAA,YAC1D,aAAa,KAAK,YAAY,WAAW,IACrC,OAAO,KAAK,YAAY,KAAK,EAAE,SAC/B;AAAA,YACJ,oBAAoB,cAAc;AAAA,YAClC,eAAe,MAAM,KAAK,aAAa;AAAA,UAAA,CACxC;AAAA,QACH;AAEA,cAAM,cAAc,MAAM,KAAK,cAAc;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,YACE;AAAA,YACA,iBAAiB,KAAK;AAAA,UAAA;AAAA,UAExB;AAAA,QAAA;AAGF,YAAI,KAAK,YAAY,WAAW,GAAG;AACjC,cAAI;AACF,kBAAM,EAAE,YAAY,SAAA,IAClB,KAAK,cAAc;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEJ,wBAAY,aAAa;AACzB,wBAAY,WAAW;AAAA,UACzB,SAAS,OAAO;AACd,iBAAK,WAAW;AAAA,cACd;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAEA,oBAAY,eAAe;AAE3B,cAAM,WAA4B;AAAA,UAChC;AAAA,UACA,eAAe;AAAA,UACf,mBAAmB;AAAA,UACnB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,iBAAkB,KAA0B;AAAA,QAAA;AAE9C,aAAK,aAAa,IAAI,YAAY,IAAI,QAAQ;AAC9C,2BAAmB,IAAI,YAAY,IAAI,QAAQ;AAE/C,aAAK,WAAW,KAAK,gCAAgC,QAAQ,EAAE;AAE/D,cAAM,aAAa;AAAA,UACjB,cAAc;AAAA,UACd;AAAA,QAAA;AAGF,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA,aAAa,KAAK,UAAU,UAAU;AAAA,UAAA;AAAA,QACxC;AAAA,MAEJ,SAAS,OAAO;AACd,aAAK,WAAW,MAAM,8BAA8B,QAAQ,KAAK,KAAK;AAAA,MACxE;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,MACd,kDAAkD,QAAQ;AAAA,IAAA;AAG5D,QAAI,KAAK,kCAAkC,WAAW;AACpD,WAAK,WAAW;AAAA,QACd,2CAA2C,QAAQ;AAAA,MAAA;AAErD,UAAI;AACF,cAAM,oBAAoB,MAAM,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,QAAA;AAGF,YACE,qBACA,OAAO,sBAAsB,YAC7B,mBAAoB,mBACpB;AACA,gBAAM,KAAM,kBACT;AAcH,gBAAM,SACJ,GAAG,MACH,QAAQ,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3D,gBAAM,cAAc;AAAA,YAClB,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,gBAAgB;AAAA,YAChB;AAAA,YACA,YAAY;AAAA,cACV,OAAO,GAAG,SAAS;AAAA,cACnB,aACE,GAAG,eACH;AAAA,cACF,aAAa,GAAG,eAAe;AAAA,cAC/B,SAAS,GAAG,UAAU,CAAA,GAAI,IAAI,CAAC,MAAM;AACnC,sBAAM,eAAiC;AAAA,kBACrC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAEF,sBAAM,eAA+B,aAAa;AAAA,kBAChD,EAAE;AAAA,gBAAA,IAEC,EAAE,OACH;AAEJ,uBAAO;AAAA,kBACL,MAAM,EAAE;AAAA,kBACR,OAAO,EAAE;AAAA,kBACT,MAAM;AAAA,kBACN,UAAU,EAAE,YAAY;AAAA,kBACxB,SAAS,EAAE;AAAA,gBAAA;AAAA,cAEf,CAAC;AAAA,YAAA;AAAA,UACH;AAGF,gBAAM,iBAAiB,kBAAkB,IAAI,KACxC,MAAM;AACL,gBAAI;AACF,oBAAM,IAAI,KAAK,cAAA;AACf,qBAAO,KAAK,KAAK;AAAA,YACnB,QAAQ;AACN,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,GAAA,IACA,KAAK;AAET,eAAK,aAAa,IAAI,QAAQ;AAAA,YAC5B;AAAA,YACA,eAAe;AAAA,YACf,mBAAmB;AAAA,YACnB,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,iBAAkB,KAA0B;AAAA,UAAA,CAC7C;AACD,6BAAmB,IAAI,QAAQ;AAAA,YAC7B;AAAA,YACA,eAAe;AAAA,YACf,mBAAmB;AAAA,YACnB,QAAQ;AAAA,UAAA,CACT;AAED,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,aAAa,KAAK,UAAU,EAAE,cAAc,MAAM,aAAa;AAAA,YAAA;AAAA,UACjE;AAAA,QAEJ;AAEA,YAAI,KAAK,UAAU,iBAAiB,MAAM,KAAK,UAAU,SAAS,GAAG;AACnE,eAAK,WAAW,KAAK,kCAAkC,QAAQ,KAAK;AAAA,YAClE,UAAU,OAAO,KAAK,SAAoC;AAAA,YAC1D,cAAc,OAAO,KAAK,iBAAiB;AAAA,YAC3C,YAAY;AAAA,UAAA,CACb;AAED,cAAI;AACD,mBAA+B,YAAY;AAAA,UAC9C,QAAQ;AAAA,UAAC;AAAA,QACX,OAAO;AACL,eAAK,WAAW,MAAM,mCAAmC,QAAQ,EAAE;AAAA,QACrE;AAAA,MACF,SAAS,iBAAiB;AACxB,aAAK,WAAW;AAAA,UACd,sCAAsC,QAAQ;AAAA,UAC9C;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAAiB,WAA4B;AACnE,QAAI,CAAC,UAAU,CAAC,WAAW;AACzB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM;AACZ,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,OAAO,IAAI,aAAa,aAAa;AACxC,eAAO;AAAA,MACT;AACA,YAAM,WACJ,OAAO,IAAI,UAAU,aAAa,IAAI,UAAU,IAAI;AACtD,UAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,eAAO;AAAA,MACT;AACA,YAAM,QAAQ;AACd,YAAM,cAAc,MAAM,SAAS;AACnC,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACT;AACA,YAAM,iBAAiB,CAAC,MAAkC;AACxD,cAAM,QAAS,EAA0B;AACzC,YAAI,SAAS,MAAM,aAAa,iBAAiB,MAAM,WAAW;AAChE,iBAAO,MAAM;AAAA,QACf;AACA,eAAO;AAAA,MACT;AACA,YAAM,YAAY,eAAe,WAAW;AAC5C,YAAM,OAAQ,UAAkC;AAChD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,UAAI,KAAK,aAAa,iBAAiB,KAAK,aAAa,cAAc;AACrE,eAAO;AAAA,MACT;AACA,UAAI,KAAK,iBAAiB,QAAW;AACnC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd,gCAAgC,SAAS;AAAA,QACzC;AAAA,MAAA;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,MACb,QACkC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,MAAM,MAAM;AAEvC,UAAI,OAAO,qBAAqB,MAAM,QAAQ,OAAO,iBAAiB,GAAG;AACvE,mBAAW,QAAQ,OAAO,mBAAmB;AAC3C,cAAI,KAAK,aAAa;AACpB,gBAAI;AACF,oBAAM,SACJ,OAAO,KAAK,gBAAgB,WACxB,KAAK,MAAM,KAAK,WAAW,IAC1B,KAAK;AAEZ,kBAAI,OAAO,gBAAgB,OAAO,aAAa;AAC7C,qBAAK,WAAW,KAAK,kCAAkC;AAAA,kBACrD,UAAU,KAAK,QAAQ;AAAA,kBACvB,SAAS;AAAA,gBAAA,CACV;AAED,sBAAM,iBACH,KAA8B,QAAQ,QAAQ;AACjD,sBAAM,eAAe,KAAK,MAAM;AAAA,kBAC9B,CAAC,MAAM,EAAE,SAAS;AAAA,gBAAA;AAEpB,sBAAM,wBACH,gBAAqC,CAAA;AACxC,sBAAM,KAAsB;AAAA,kBAC1B,UAAU;AAAA,kBACV,eAAe;AAAA,kBACf,mBAAoB,KAA8B,QAC9C;AAAA,kBACJ,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,iBAAiB,uBAAuB;AAAA,gBAAA;AAE1C,qBAAK,aAAa,IAAI,OAAO,YAAY,IAAI,EAAE;AAC/C,mCAAmB,IAAI,OAAO,YAAY,IAAI,EAAE;AAEhD,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,cAAc;AAAA,kBACd,aAAa,OAAO;AAAA,kBACpB,QACE,OAAO,WAAW;AAAA,gBAAA;AAAA,cAExB;AAEA,kBACE,OAAO,iBACN,OAAO,WAAW,OAAO,eAAe,OAAO,eAChD;AACA,qBAAK,WAAW,KAAK,iCAAiC;AAAA,kBACpD,UAAW,KAA8B,QAAQ;AAAA,kBACjD,aAAa;AAAA,kBACb,SAAS,OAAO,eAAe;AAAA,gBAAA,CAChC;AAED,sBAAM,mBAAmB,KAAK,wBAAwB,MAAM;AAE5D,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,mBAAmB;AAAA,kBACnB,eAAe,iBAAiB;AAAA,kBAChC,QAAQ,iBAAiB;AAAA,gBAAA;AAAA,cAE7B;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,aAAK,WAAW,KAAK,6CAA6C;AAClE,eAAO,KAAK,sBAAsB,OAAO,QAAQ,CAAA,CAAE;AAAA,MACrD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBACZ,OACA,QACA,mBACkC;AAClC,SAAK,WAAW,KAAK,kDAAkD;AAAA,MACrE,aAAa,MAAM,OAAO;AAAA,MAC1B,WAAW,OAAO,KAAK,MAAM;AAAA,IAAA,CAC9B;AAED,QAAI,WAAW,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,CAAC,UAAU;AACb,WAAK,WAAW;AAAA,QACd;AAAA,MAAA;AAEF,YAAM,eAAe,KAAK,2BAA2B,KAAK;AAC1D,UAAI,CAAC,cAAc;AACjB,aAAK,WAAW;AAAA,UACd;AAAA,QAAA;AAEF,cAAM;AAAA,MACR;AACA,iBAAW;AAAA,IACb;AAEA,SAAK,WAAW,KAAK,6BAA6B;AAAA,MAChD,UAAU,SAAS;AAAA,MACnB,WAAW,CAAC,CAAC,SAAS;AAAA,IAAA,CACvB;AAED,UAAM,cAAc,KAAK,cAAc;AAAA,MACrC;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACR,OAAO,SAAoB;AAAA,IAAA;AAG9B,SAAK,aAAa,IAAI,YAAY,IAAI;AAAA,MACpC,UAAU,SAAS;AAAA,MACnB,eAAe;AAAA,MACf,QAAQ,SAAS;AAAA,IAAA,CAClB;AAED,uBAAmB,IAAI,YAAY,IAAI;AAAA,MACrC,UAAU,SAAS;AAAA,MACnB,eAAe;AAAA,MACf,QAAQ,SAAS;AAAA,IAAA,CAClB;AAED,WAAO;AAAA,MACL,QAAQ,KAAK,mBAAmB,WAAW;AAAA,MAC3C;AAAA,MACA,cAAc;AAAA,MACd,mBAAmB,qBAAqB,CAAA;AAAA,IAAC;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAgD;AAC9C,WAAO,IAAI,IAAI,KAAK,YAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAA2C;AAC7D,eAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO;AACtC,WAAK,aAAa,IAAI,QAAQ,QAAQ;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,YACkC;AAClC,SAAK,WAAW;AAAA,MACd;AAAA,MACA;AAAA,QACE,kBAAkB,WAAW;AAAA,QAC7B,oBAAoB,WAAW;AAAA,MAAA;AAAA,IACjC;AAEF,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,CAAC,WAAW,QAAQ;AACtB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,QACE,CAAC,WAAW,cACZ,WAAW,eAAe,QAC1B,OAAO,WAAW,eAAe,YACjC,MAAM,QAAQ,WAAW,UAAU,GACnC;AACA,YAAM,IAAI;AAAA,QACR,2CAA2C,OAAO,WAAW,UAAU,aACrE,WAAW,eAAe,IAC5B,cAAc,MAAM;AAAA,UAClB,WAAW;AAAA,QAAA,CACZ,iBAAiB,KAAK,UAAU,WAAW,UAAU,CAAC;AAAA,MAAA;AAAA,IAE3D;AAEA,SAAK,WAAW,KAAK,+BAA+B;AAAA,MAClD,QAAQ,WAAW;AAAA,MACnB,UAAU,WAAW;AAAA,MACrB,eAAe,OAAO,KAAK,WAAW,UAAU;AAAA,MAChD,gBAAgB,OAAO,WAAW;AAAA,MAClC,kBAAkB,WAAW,eAAe;AAAA,MAC5C,uBAAuB,WAAW,eAAe;AAAA,MACjD,YAAY,CAAC,CAAC,WAAW;AAAA,IAAA,CAC1B;AAED,QAAI,cAAc,KAAK,aAAa,IAAI,WAAW,MAAM;AAEzD,QAAI,CAAC,aAAa;AAChB,oBAAc,mBAAmB,IAAI,WAAW,MAAM;AACtD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC,WAAW,MAAM,EAAE;AAAA,MACtE;AAAA,IACF;AAEA,SAAK,aAAa,OAAO,WAAW,MAAM;AAC1C,uBAAmB,OAAO,WAAW,MAAM;AAE3C,UAAM,OACJ,YAAY,WACZ,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,QAAQ;AACxD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,uCAAuC,YAAY,QAAQ;AAAA,MAAA;AAAA,IAE/D;AAEA,QAAI,gBAAyC,CAAA;AAC7C,QAAI;AACF,UACE,YAAY,qBACZ,OAAO,YAAY,sBAAsB,UACzC;AACA,wBAAgB;AAAA,UACd,GAAI,YAAY;AAAA,QAAA;AAAA,MAEpB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAEF,sBAAgB,CAAA;AAAA,IAClB;AAEA,QAAI,iBAA0C,CAAA;AAC9C,QAAI;AACF,UAAI,WAAW,cAAc,OAAO,WAAW,eAAe,UAAU;AACtE,yBAAiB;AAAA,UACf,GAAI,WAAW;AAAA,QAAA;AAAA,MAEnB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAEF,uBAAiB,CAAA;AAAA,IACnB;AAEA,UAAM,kBAA2C,CAAA;AACjD,QAAI;AACF,aAAO,KAAK,aAAa,EAAE,QAAQ,CAAC,QAAQ;AAC1C,cAAM,QAAQ,cAAc,GAAG;AAC/B,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,aAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,QAAQ;AAC3C,cAAM,QAAQ,eAAe,GAAG;AAChC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,0BAAgB,GAAG,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,sBAAgB,aAAa;AAC7B,sBAAgB,aAAa;AAE7B,WAAK,WAAW,KAAK,mCAAmC;AAAA,QACtD,UAAU,OAAO,KAAK,aAAa;AAAA,QACnC,gBAAgB,OAAO,KAAK,cAAc;AAAA,QAC1C,YAAY,OAAO,KAAK,eAAe;AAAA,MAAA,CACxC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,WAAW,MAAM,oCAAoC,KAAK;AAC/D,YAAM,IAAI;AAAA,QACR,oCACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI;AACF,YAAM,eAAe;AACrB,UAAI;AACJ,UAAI,OAAO,aAAa,oBAAoB,YAAY;AACtD,qBAAa,MAAM,aAAa,gBAAgB,eAAe;AAAA,MACjE,WAAW,OAAO,aAAa,oBAAoB,YAAY;AAC7D,cAAM,KAAK,aAAa,gBAAA;AACxB,cAAM,SAAS;AACf,YAAI,MAAM,OAAO,OAAO,UAAU,YAAY;AAC5C,uBAAa,MAAM,OAAO,MAAM,eAAe;AAAA,QACjD,WAAW,MAAM,OAAO,OAAO,SAAS,YAAY;AAClD,uBAAa,MAAM,OAAO,KAAK,eAAe;AAAA,QAChD,OAAO;AACL,gBAAM,QAAQ;AACd,cAAI,OAAO,MAAM,SAAS,YAAY;AACpC,yBAAa,MAAM,MAAM,KAAK,eAAe;AAAA,UAC/C,OAAO;AACL,kBAAM,IAAI;AAAA,cACR;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAAA,MACF,WACE,aAAa,gBACb,OAAO,aAAa,aAAa,UAAU,YAC3C;AACA,qBAAa,MAAM,aAAa,aAAa,MAAM,eAAe;AAAA,MACpE,WACE,aAAa,gBACb,OAAO,aAAa,aAAa,SAAS,YAC1C;AACA,qBAAa,MAAM,aAAa,aAAa,KAAK,eAAe;AAAA,MACnE,WAAW,OAAQ,KAAsB,SAAS,YAAY;AAC5D,qBAAa,MAAO,KAAsB,KAAM,eAAe;AAAA,MACjE,OAAO;AACL,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,mBAA4C,CAAA;AAChD,UAAI;AAEJ,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,UAAU;AACpC,aAAK,WAAW;AAAA,UACd;AAAA,UACA;AAAA,YACE,UAAU,OAAO,KAAK,MAAM;AAAA,YAC5B,kBAAkB,CAAC,CAAE,OAClB;AAAA,UAAA;AAAA,QACL;AAGF,YAAI,UAAU,OAAO,WAAW,UAAU;AACxC,cAAI,kBAAkB,mBAAmB,MAAM,GAAG;AAChD,iBAAK,WAAW;AAAA,cACd;AAAA,YAAA;AAGF,+BAAmB;AAAA,cACjB,GAAG;AAAA,cACH,eAAgB,OAAmC;AAAA,YAAA;AAGrD,8BAAkB,kBAAkB,uBAAuB,MAAM;AAEjE,iBAAK,WAAW;AAAA,cACd;AAAA,cACA;AAAA,gBACE,SAAS,KAAK,iBAAiB,gBAAgB,IAC3C,iBAAiB,cAAc,UAC/B;AAAA,gBACJ,aAAa,KAAK,iBAAiB,gBAAgB,IAC/C,CAAC,CAAC,iBAAiB,cAAc,WACjC;AAAA,cAAA;AAAA,YACN;AAAA,UAEJ,OAAO;AACL,8BAAkB,kBAAkB,eAAe,UAAU;AAE7D,+BAAmB;AAAA,cACjB,GAAG;AAAA,cACH,eAAgB,OAAmC;AAAA,YAAA;AAAA,UAEvD;AAAA,QACF,OAAO;AACL,4BAAkB,kBAAkB,eAAe,UAAU;AAAA,QAC/D;AAAA,MACF,SAAS,OAAO;AACd,aAAK,WAAW;AAAA,UACd;AAAA,UACA;AAAA,YACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,YAChD,cACE,OAAO,eAAe,WAClB,WAAW,UAAU,GAAG,GAAG,IAC3B;AAAA,UAAA;AAAA,QACR;AAGF,0BAAkB,kBAAkB,eAAe,UAAU;AAAA,MAC/D;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,gBAAgB,WAAW;AAAA,QAC3B,mBAAmB,CAAA;AAAA,QACnB,UAAU;AAAA,QACV,eAAe;AAAA,QACf,UAAU,YAAY;AAAA,MAAA;AAAA,IAE1B,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,eAAO,KAAK,sBAAsB,OAAO,iBAAiB,CAAA,CAAE;AAAA,MAC9D;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,OACA,QACA,mBAC8C;AAC9C,QAAI;AACF,UAAI,kBAAkB,SAAS,GAAG;AAChC,cAAM,WAAW,kBAAkB,kBAAkB,SAAS,CAAC;AAC/D,YAAI,SAAS,UAAU,SAAS,OAAO,MAAM;AAC3C,gBAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,OAAO,IAAI;AACnE,cAAI,QAAQ,YAAY,MAAM;AAC5B,iBAAK,WAAW;AAAA,cACd;AAAA,cACA,SAAS,OAAO;AAAA,YAAA;AAElB,mBAAO;AAAA,cACL,UAAU,SAAS,OAAO;AAAA,cAC1B,QAAS,KAAwB;AAAA,YAAA;AAAA,UAErC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAc,OAAO,qBAAmC,CAAA;AAC9D,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,WAAW,WAAW,WAAW,SAAS,CAAC;AACjD,YAAI;AAEJ,YAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,mBAAS,SAAS,CAAC;AAAA,QACrB,WAAY,SAAqC,QAAQ;AACvD,mBAAU,SAAqC;AAAA,QACjD,OAAO;AACL,mBAAS;AAAA,QACX;AAEA,YAAI,UAAU,OAAO,MAAM;AACzB,gBAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,IAAI;AAC1D,cAAI,QAAQ,YAAY,MAAM;AAC5B,iBAAK,WAAW,KAAK,gCAAgC,OAAO,IAAI;AAChE,mBAAO;AAAA,cACL,UAAU,OAAO;AAAA,cACjB,QAAS,KAAwB;AAAA,YAAA;AAAA,UAErC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,oBAAoB,MAAM;AACvD,UAAI,iBAAiB;AACnB,aAAK,WAAW;AAAA,UACd;AAAA,UACA,gBAAgB;AAAA,QAAA;AAElB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,WAAK,WAAW,MAAM,+BAA+B,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAGnB;AACP,UAAM,YAAa,OAAO,SAAoB;AAE9C,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,WAAW,KAAK,oBAAoB,KAAK,IAAI;AAEnD,UACE,SAAS;AAAA,QAAK,CAAC,YACb,UAAU,YAAA,EAAc,SAAS,QAAQ,aAAa;AAAA,MAAA,GAExD;AACA,YAAI,YAAY,MAAM;AACpB,iBAAO;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAS,KAAwB;AAAA,UAAA;AAAA,QAErC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,2BACN,OAC8C;AAC9C,UAAM,aAAa,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC;AAEnE,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,YAAY,MAAM;AACpB,cAAM,aAAc,KAAwB;AAC5C,YAAI,KAAK,wBAAwB,YAAY,UAAU,GAAG;AACxD,eAAK,WAAW;AAAA,YACd;AAAA,YACA,KAAK;AAAA,UAAA;AAEP,iBAAO;AAAA,YACL,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACN,QACA,YACS;AACT,UAAM,eAAe;AACrB,QAAI,CAAC,gBAAgB,CAAC,aAAa,KAAM,QAAO;AAEhD,QAAI;AACF,YAAM,MAAM,aAAa;AACzB,UAAI,IAAI,aAAa,aAAa;AAChC,cAAM,QAAQ,IAAI;AAClB,cAAM,aAAa,OAAO,KAAK,SAAS,CAAA,CAAE;AAC1C,eAAO,WAAW,KAAK,CAAC,SAAS;AAC/B,gBAAM,cAAc,KAAK,MAAM,GAAG,EAAE,CAAC;AACrC,iBAAO,WAAW,SAAS,WAAW;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,WAAW,MAAM,qCAAqC,GAAG;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,UAA4B;AACtD,UAAM,QAAQ,SACX,QAAQ,YAAY,KAAK,EACzB,YAAA,EACA,MAAM,SAAS,EACf,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,WAAO,CAAC,GAAG,OAAO,SAAS,aAAa;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,aAAkC;AAC3D,UAAM,aAAa,YAAY,WAAW,OAAO;AACjD,UAAM,YAAY,YAAY,WAAW,OACtC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,EAAE,EACzB,KAAK,IAAI;AAEZ,WAAO;AAAA;AAAA,EAET,YAAY,WAAW,WAAW;AAAA;AAAA;AAAA,EAGlC,SAAS,GAAG,aAAa,IAAI;AAAA,UAAa,aAAa,CAAC,UAAU,EAAE;AAAA;AAAA;AAAA,EAGpE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA2B;AACzB,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAmE;AACjE,WAAO,MAAM,KAAK,KAAK,aAAa,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO;AAAA,MACtE;AAAA,MACA,UAAU,KAAK;AAAA,IAAA,EACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACN,cACkB;AAClB,QAAI;AACF,UAAI;AAEJ,UAAI,aAAa,eAAe;AAC9B,wBAAgB,aAAa;AAAA,MAC/B,WACE,aAAa,WACb,aAAa,eACb,aAAa,eACb;AACA,wBAAgB,aAAa;AAAA,MAC/B;AAEA,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,UACE,CAAC,cAAc,WACf,CAAC,cAAc,YACf,CAAC,cAAc,YACf;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,UAAU;AAEd,UAAI,aAAa,WAAW,aAAa,aAAa;AACpD,cAAM,cAAc,aAAa;AACjC,cAAM,WAAW,aAAa,YAAY,CAAA;AAE1C,kBAAU,KAAK,YAAY,QAAQ;AAAA;AAAA;AAEnC,YAAI,SAAS,MAAM;AACjB,qBAAW,KAAK,SAAS,IAAI;AAAA;AAAA,QAC/B;AAEA,YAAI,SAAS,aAAa;AACxB,qBAAW,GAAG,SAAS,WAAW;AAAA;AAAA;AAAA,QACpC;AAEA,mBAAW,oBAAoB,YAAY,OAAO;AAAA;AAClD,mBAAW,eAAe,YAAY,GAAG;AAAA;AAEzC,YAAI,YAAY,QAAQ;AACtB,qBAAW,mBAAmB,YAAY,MAAM;AAAA;AAAA,QAClD;AAEA,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB,SAAS,OAAO;AAAA;AAAA,QAChD;AAAA,MACF;AAEA,WAAK,WAAW,KAAK,+BAA+B;AAAA,QAClD,SAAS,cAAc;AAAA,QACvB,UAAU,cAAc;AAAA,QACxB,aAAa,CAAC,CAAC,cAAc;AAAA,QAC7B,gBAAgB,OAAO,KAAK,cAAc,cAAc,CAAA,CAAE,EAAE;AAAA,MAAA,CAC7D;AAED,aAAO;AAAA,QACL,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,WAAW,MAAM,uCAAuC,KAAK;AAElE,aAAO;AAAA,QACL,mBAAmB;AAAA,QACnB,SAAS;AAAA,MAAA;AAAA,IAEb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,0BAGE;AACA,WAAO;AAAA,MACL,YAAY,KAAK,WAAW,wBAAA;AAAA,MAC5B,YAAY,KAAK,WAAW,wBAAA;AAAA,IAAwB;AAAA,EAExD;AACF;"}
1
+ {"version":3,"file":"index31.js","sources":["../../src/langchain/form-aware-agent-executor.ts"],"sourcesContent":["import { AgentExecutor } from 'langchain/agents';\nimport { ZodError, z } from 'zod';\nimport { FormGenerator } from '../forms/form-generator';\nimport type { FormMessage, FormSubmission } from '../forms/types';\nimport { FormEngine } from '../forms/form-engine';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport type { AgentAction, AgentFinish, AgentStep } from 'langchain/agents';\nimport type { ToolInterface } from '@langchain/core/tools';\nimport { isFormValidatable } from '@hashgraphonline/standards-agent-kit';\nimport type { ChainValues } from '@langchain/core/utils/types';\nimport type { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport { ResponseFormatter } from '../utils/response-formatter';\n\ntype BasicFieldType = 'text' | 'number' | 'select' | 'checkbox' | 'textarea';\n\nconst globalPendingForms: Map<string, PendingFormData> = new Map();\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface HashLinkResponse {\n hasHashLinkBlocks: boolean;\n hashLinkBlock?: HashLinkBlock;\n message: string;\n}\n\ninterface ToolWithOriginal {\n originalTool?: {\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n}\n\ninterface ActionWithToolInput {\n toolInput?: Record<string, unknown>;\n}\n\ninterface ZodSchemaDefinition {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, z.ZodTypeAny>) | Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n defaultValue?: unknown;\n };\n}\n\ninterface ToolWrapper {\n executeOriginal?: (args: Record<string, unknown>) => Promise<string>;\n getOriginalTool?: () => {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n originalTool?: {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n };\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface CallableTool {\n _call?: (args: Record<string, unknown>) => Promise<string>;\n call?: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface ToolWithSchema {\n schema?: Record<string, unknown>;\n}\n\ninterface PendingFormData {\n toolName: string;\n originalInput: unknown;\n originalToolInput?: unknown;\n schema: unknown;\n toolRef?: ToolInterface | undefined;\n originalToolRef?: ToolWithOriginal['originalTool'];\n}\n\ninterface ToolResponse {\n requiresForm?: boolean;\n formMessage?: {\n id: string;\n [key: string]: unknown;\n };\n message?: string;\n hashLinkBlock?: HashLinkBlock;\n success?: boolean;\n inscription?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\ninterface IntermediateStepData {\n action?: {\n tool?: string;\n [key: string]: unknown;\n };\n observation?: unknown;\n}\n\ninterface HashLinkBlock {\n blockId: string;\n hashLink: string;\n template: string;\n attributes: Record<string, unknown>;\n}\n\ninterface ResponseMetadataWithHashLink {\n hashLinkBlock?: HashLinkBlock;\n [key: string]: unknown;\n}\n\n/**\n * Parameter preprocessing callback interface\n */\nexport interface ParameterPreprocessingCallback {\n (toolName: string, parameters: Record<string, unknown>): Promise<\n Record<string, unknown>\n >;\n}\n\n/**\n * Agent executor that intercepts Zod validation errors and generates forms,\n * and processes HashLink block responses for rich UI rendering\n */\nexport class FormAwareAgentExecutor extends AgentExecutor {\n private formGenerator: FormGenerator;\n private formEngine: FormEngine;\n private formLogger: Logger;\n private pendingForms: Map<string, PendingFormData> = new Map();\n private parameterPreprocessingCallback:\n | ParameterPreprocessingCallback\n | undefined;\n\n /**\n * Type guard to check if a Zod type is a ZodObject\n */\n private isZodObject(schema: unknown): schema is z.ZodObject<z.ZodRawShape> {\n return schema instanceof z.ZodObject;\n }\n\n /**\n * Type guard to check if metadata has hashLinkBlock\n */\n private hasHashLinkBlock(\n metadata: unknown\n ): metadata is ResponseMetadataWithHashLink & {\n hashLinkBlock: HashLinkBlock;\n } {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hashLinkBlock' in metadata &&\n typeof (metadata as Record<string, unknown>).hashLinkBlock === 'object' &&\n (metadata as Record<string, unknown>).hashLinkBlock !== null\n );\n }\n\n constructor(...args: ConstructorParameters<typeof AgentExecutor>) {\n super(...args);\n this.formGenerator = new FormGenerator();\n this.formEngine = new FormEngine(\n new Logger({ module: 'FormAwareAgentExecutor.FormEngine' })\n );\n this.formLogger = new Logger({ module: 'FormAwareAgentExecutor' });\n this.parameterPreprocessingCallback = undefined;\n }\n\n /**\n * Set parameter preprocessing callback\n */\n setParameterPreprocessingCallback(\n callback: ParameterPreprocessingCallback | undefined\n ): void {\n this.parameterPreprocessingCallback = callback;\n }\n\n /**\n * BULLETPROOF TOOL INTERCEPTION\n * Override the single-step execution to intercept tool calls BEFORE LangChain processes them\n */\n override async _takeNextStep(\n nameToolMap: Record<string, ToolInterface>,\n inputs: ChainValues,\n intermediateSteps: AgentStep[],\n runManager?: CallbackManagerForChainRun,\n config?: RunnableConfig\n ): Promise<AgentFinish | AgentStep[]> {\n this.formLogger.info('🛡️ BULLETPROOF INTERCEPTION: _takeNextStep called', {\n availableTools: Object.keys(nameToolMap),\n inputKeys: Object.keys(inputs),\n });\n\n const result = await this.agent.plan(\n intermediateSteps,\n inputs,\n runManager?.getChild()\n );\n\n if ('returnValues' in result) {\n this.formLogger.info('Agent returned finish action, passing through');\n return result;\n }\n\n const action = result as AgentAction;\n const toolName = action.tool;\n const toolInput = action.toolInput;\n\n this.formLogger.info(`🎯 INTERCEPTING TOOL CALL: ${toolName}`, {\n toolInput,\n hasInNameToolMap: toolName in nameToolMap,\n toolInputKeys: Object.keys(toolInput || {}),\n });\n\n const tool =\n nameToolMap[toolName] || this.tools.find((t) => t.name === toolName);\n\n if (!tool) {\n this.formLogger.error(`Tool ${toolName} not found in registry`);\n throw new Error(`Tool \"${toolName}\" not found`);\n }\n\n let shouldGenerateForm = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🔍 Tool ${toolName} implements FormValidatable, checking shouldGenerateForm()`,\n {\n toolInput,\n }\n );\n\n try {\n shouldGenerateForm = tool.shouldGenerateForm(toolInput);\n this.formLogger.info(\n `FormValidatable.shouldGenerateForm() result: ${shouldGenerateForm}`,\n {\n toolName,\n toolInput,\n }\n );\n } catch (error) {\n this.formLogger.error(\n `Error calling shouldGenerateForm() on ${toolName}:`,\n error\n );\n shouldGenerateForm = false;\n }\n }\n\n if (shouldGenerateForm) {\n this.formLogger.info(`🚨 FORM GENERATION TRIGGERED for ${toolName}`);\n\n try {\n let schemaToUse: z.ZodSchema;\n let isFocusedSchema = false;\n\n if (isFormValidatable(tool)) {\n this.formLogger.info(\n `🎯 Tool ${toolName} is FormValidatable, attempting to get focused schema`\n );\n try {\n const focusedSchema = tool.getFormSchema();\n if (focusedSchema) {\n schemaToUse = focusedSchema;\n isFocusedSchema = true;\n this.formLogger.info(\n `✅ Successfully obtained focused schema for ${toolName}`\n );\n } else {\n this.formLogger.warn(\n `getFormSchema() returned null/undefined for ${toolName}, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } catch (error) {\n this.formLogger.error(\n `Failed to get focused schema from ${toolName}:`,\n error\n );\n this.formLogger.info(\n `Falling back to default schema for ${toolName}`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n } else {\n this.formLogger.info(\n `Tool ${toolName} is not FormValidatable, using default schema`\n );\n schemaToUse = tool.schema;\n isFocusedSchema = false;\n }\n\n let schemaFieldCount = 'unknown';\n try {\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape;\n if (shape && typeof shape === 'object') {\n schemaFieldCount = Object.keys(shape).length.toString();\n }\n }\n } catch {}\n\n this.formLogger.info(\n `📋 Generating form with ${\n isFocusedSchema ? 'FOCUSED' : 'DEFAULT'\n } schema`,\n {\n toolName,\n schemaType: schemaToUse?.constructor?.name,\n estimatedFieldCount: schemaFieldCount,\n isFocusedSchema,\n }\n );\n\n let missingFields: Set<string> | undefined;\n\n if (isFocusedSchema) {\n this.formLogger.info(\n `⭐ Using focused schema - letting FormGenerator determine fields from schema`\n );\n missingFields = undefined;\n } else {\n missingFields = new Set<string>();\n if (this.isZodObject(schemaToUse)) {\n const zodObject = schemaToUse as z.ZodObject<z.ZodRawShape>;\n const shape = zodObject.shape || {};\n for (const fieldName of Object.keys(shape)) {\n const value = (toolInput || {})[fieldName];\n\n const isEmpty =\n isFormValidatable(tool) && tool.isFieldEmpty\n ? tool.isFieldEmpty(fieldName, value)\n : value === undefined ||\n value === '' ||\n value === null ||\n (Array.isArray(value) && value.length === 0);\n\n const isRequired = this.isFieldRequired(schemaToUse, fieldName);\n\n const isEssential =\n isFormValidatable(tool) && tool.getEssentialFields\n ? tool.getEssentialFields().includes(fieldName)\n : false;\n\n this.formLogger.info(`🔍 Field analysis: ${fieldName}`, {\n value: value,\n isEmpty: isEmpty,\n isRequired: isRequired,\n isEssential: isEssential,\n willAddToMissingFields: isEmpty && (isRequired || isEssential),\n });\n\n if (isEmpty && (isRequired || isEssential)) {\n missingFields.add(fieldName);\n }\n }\n }\n\n this.formLogger.info(`📋 Missing fields analysis complete`, {\n totalFields: this.isZodObject(schemaToUse)\n ? Object.keys(schemaToUse.shape).length\n : 0,\n missingFieldsCount: missingFields.size,\n missingFields: Array.from(missingFields),\n });\n }\n\n const formMessage = await this.formGenerator.generateFormFromSchema(\n schemaToUse,\n toolInput,\n {\n toolName: toolName,\n toolDescription: tool.description,\n },\n missingFields\n );\n\n if (this.isZodObject(schemaToUse)) {\n try {\n const { jsonSchema, uiSchema } =\n this.formGenerator.generateJsonSchemaForm(\n schemaToUse,\n toolInput as Record<string, unknown> | undefined,\n missingFields\n );\n formMessage.jsonSchema = jsonSchema;\n formMessage.uiSchema = uiSchema;\n } catch (error) {\n this.formLogger.warn(\n 'Failed to generate JSON Schema for RJSF:',\n error\n );\n }\n }\n\n formMessage.partialInput = toolInput;\n\n const formData: PendingFormData = {\n toolName: toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: schemaToUse,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n };\n this.pendingForms.set(formMessage.id, formData);\n globalPendingForms.set(formMessage.id, formData);\n\n this.formLogger.info(`✅ FORM INTERCEPT SUCCESS for ${toolName}`);\n\n const formResult = {\n requiresForm: true,\n formMessage,\n };\n\n return [\n {\n action: action,\n observation: JSON.stringify(formResult),\n },\n ];\n } catch (error) {\n this.formLogger.error(`Form generation failed for ${toolName}:`, error);\n }\n }\n\n this.formLogger.info(\n `⚪ Passing through to normal tool execution for ${toolName}`\n );\n\n if (this.parameterPreprocessingCallback && toolInput) {\n this.formLogger.info(\n `🔄 Applying parameter preprocessing for ${toolName}`\n );\n try {\n const preprocessedInput = await this.parameterPreprocessingCallback(\n toolName,\n toolInput as Record<string, unknown>\n );\n\n if (\n preprocessedInput &&\n typeof preprocessedInput === 'object' &&\n '__requestForm' in (preprocessedInput as Record<string, unknown>)\n ) {\n const rf = (preprocessedInput as Record<string, unknown>)\n .__requestForm as {\n id?: string;\n title?: string;\n description?: string;\n fields?: Array<{\n name: string;\n label: string;\n type: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n }>;\n submitLabel?: string;\n };\n\n const formId =\n rf.id ||\n `form_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const formMessage = {\n type: 'form',\n id: formId,\n originalPrompt: 'Parameter validation required',\n toolName,\n formConfig: {\n title: rf.title || 'Complete required parameters',\n description:\n rf.description ||\n 'One or more parameters require confirmation. Please review and submit.',\n submitLabel: rf.submitLabel || 'Continue',\n fields: (rf.fields || []).map((f) => {\n const allowedTypes: BasicFieldType[] = [\n 'text',\n 'number',\n 'select',\n 'checkbox',\n 'textarea',\n ];\n const resolvedType: BasicFieldType = allowedTypes.includes(\n f.type as BasicFieldType\n )\n ? (f.type as BasicFieldType)\n : 'text';\n\n return {\n name: f.name,\n label: f.label,\n type: resolvedType,\n required: f.required ?? true,\n options: f.options,\n };\n }),\n },\n };\n\n const resolvedSchema = isFormValidatable(tool)\n ? (() => {\n try {\n const s = tool.getFormSchema();\n return s || tool.schema;\n } catch {\n return tool.schema;\n }\n })()\n : tool.schema;\n\n this.pendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n toolRef: tool as ToolInterface | undefined,\n originalToolRef: (tool as ToolWithOriginal).originalTool,\n });\n globalPendingForms.set(formId, {\n toolName,\n originalInput: inputs,\n originalToolInput: toolInput,\n schema: resolvedSchema,\n });\n\n return [\n {\n action,\n observation: JSON.stringify({ requiresForm: true, formMessage }),\n },\n ];\n }\n\n if (JSON.stringify(preprocessedInput) !== JSON.stringify(toolInput)) {\n this.formLogger.info(`📝 Parameters preprocessed for ${toolName}:`, {\n original: Object.keys(toolInput as Record<string, unknown>),\n preprocessed: Object.keys(preprocessedInput),\n hasChanges: true,\n });\n\n try {\n (action as ActionWithToolInput).toolInput = preprocessedInput;\n } catch {}\n } else {\n this.formLogger.debug(`No parameter changes needed for ${toolName}`);\n }\n } catch (preprocessError) {\n this.formLogger.warn(\n `Parameter preprocessing failed for ${toolName}, using original parameters:`,\n preprocessError\n );\n }\n }\n\n return super._takeNextStep(\n nameToolMap,\n inputs,\n intermediateSteps,\n runManager,\n config\n );\n }\n\n /**\n * Helper to determine if a field is required in the schema\n */\n private isFieldRequired(schema: unknown, fieldPath: string): boolean {\n if (!schema || !fieldPath) {\n return false;\n }\n\n try {\n const obj = schema as ZodSchemaDefinition;\n const def = obj._def;\n if (!def || def.typeName !== 'ZodObject') {\n return false;\n }\n const rawShape: unknown =\n typeof def.shape === 'function' ? def.shape() : def.shape;\n if (!rawShape || typeof rawShape !== 'object') {\n return false;\n }\n const shape = rawShape as Record<string, z.ZodTypeAny>;\n const fieldSchema = shape[fieldPath];\n if (!fieldSchema) {\n return false;\n }\n const unwrapOptional = (s: z.ZodTypeAny): z.ZodTypeAny => {\n const inner = (s as ZodSchemaDefinition)._def;\n if (inner && inner.typeName === 'ZodOptional' && inner.innerType) {\n return inner.innerType;\n }\n return s;\n };\n const unwrapped = unwrapOptional(fieldSchema);\n const fdef = (unwrapped as ZodSchemaDefinition)._def;\n if (!fdef) {\n return true;\n }\n if (fdef.typeName === 'ZodOptional' || fdef.typeName === 'ZodDefault') {\n return false;\n }\n if (fdef.defaultValue !== undefined) {\n return false;\n }\n return true;\n } catch (error) {\n this.formLogger.debug(\n `Could not determine if field ${fieldPath} is required:`,\n error\n );\n }\n return false;\n }\n\n /**\n * Override _call to intercept Zod validation errors at the execution level\n */\n override async _call(\n inputs: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n try {\n const result = await super._call(inputs);\n\n if (result.intermediateSteps && Array.isArray(result.intermediateSteps)) {\n for (const step of result.intermediateSteps) {\n if (step.observation) {\n try {\n const parsed: ToolResponse =\n typeof step.observation === 'string'\n ? JSON.parse(step.observation)\n : (step.observation as ToolResponse);\n\n if (parsed.requiresForm && parsed.formMessage) {\n this.formLogger.info('Tool requested form generation', {\n toolName: step.action?.tool,\n hasForm: true,\n });\n\n const actionToolName =\n (step as IntermediateStepData).action?.tool || 'unknown';\n const toolInstance = this.tools.find(\n (t) => t.name === actionToolName\n ) as ToolInterface | undefined;\n const originalToolCandidate =\n (toolInstance as ToolWithOriginal) || {};\n const pf: PendingFormData = {\n toolName: actionToolName,\n originalInput: inputs,\n originalToolInput: (step as IntermediateStepData).action\n ?.toolInput as Record<string, unknown> | undefined,\n schema: null,\n toolRef: toolInstance,\n originalToolRef: originalToolCandidate?.originalTool,\n };\n this.pendingForms.set(parsed.formMessage.id, pf);\n globalPendingForms.set(parsed.formMessage.id, pf);\n\n return {\n ...result,\n requiresForm: true,\n formMessage: parsed.formMessage,\n output:\n parsed.message || 'Please complete the form to continue.',\n };\n }\n\n if (\n parsed.hashLinkBlock ||\n (parsed.success && parsed.inscription && parsed.hashLinkBlock)\n ) {\n this.formLogger.info('Tool returned HashLink blocks', {\n toolName: (step as IntermediateStepData).action?.tool,\n hasHashLink: true,\n blockId: parsed.hashLinkBlock?.blockId,\n });\n\n const hashLinkResponse = this.processHashLinkResponse(parsed);\n\n return {\n ...result,\n hasHashLinkBlocks: true,\n hashLinkBlock: hashLinkResponse.hashLinkBlock,\n output: hashLinkResponse.message,\n };\n }\n } catch {}\n }\n }\n }\n\n return result;\n } catch (error) {\n if (error instanceof ZodError) {\n this.formLogger.info('Intercepted ZodError during agent execution');\n return this.handleValidationError(error, inputs, []);\n }\n throw error;\n }\n }\n\n /**\n * Handles Zod validation errors by generating forms\n */\n private async handleValidationError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): Promise<Record<string, unknown>> {\n this.formLogger.info('Zod validation error detected, generating form', {\n errorIssues: error.issues.length,\n inputKeys: Object.keys(inputs),\n });\n\n let toolInfo = this.extractToolInfoFromError(\n error,\n inputs,\n intermediateSteps\n );\n\n if (!toolInfo) {\n this.formLogger.warn(\n 'Could not extract tool info from validation error, trying fallback detection'\n );\n const fallbackTool = this.detectToolFromErrorContext(error);\n if (!fallbackTool) {\n this.formLogger.error(\n 'No tool detected for form generation, rethrowing error'\n );\n throw error;\n }\n toolInfo = fallbackTool;\n }\n\n this.formLogger.info('Generating form for tool:', {\n toolName: toolInfo.toolName,\n hasSchema: !!toolInfo.schema,\n });\n\n const formMessage = this.formGenerator.generateFormFromError(\n error,\n toolInfo.schema as z.ZodType<unknown, z.ZodTypeDef, unknown>,\n toolInfo.toolName,\n (inputs.input as string) || ''\n );\n\n this.pendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n globalPendingForms.set(formMessage.id, {\n toolName: toolInfo.toolName,\n originalInput: inputs,\n schema: toolInfo.schema,\n });\n\n return {\n output: this.formatFormResponse(formMessage),\n formMessage,\n requiresForm: true,\n intermediateSteps: intermediateSteps || [],\n };\n }\n\n /**\n * Get a copy of pending forms for preservation during executor recreation\n */\n getPendingForms(): Map<string, PendingFormData> {\n return new Map(this.pendingForms);\n }\n\n /**\n * Restore pending forms from a previous executor instance\n */\n restorePendingForms(forms: Map<string, PendingFormData>): void {\n for (const [formId, formData] of forms) {\n this.pendingForms.set(formId, formData);\n }\n }\n\n /**\n * Processes form submission and continues tool execution\n */\n async processFormSubmission(\n submission: FormSubmission\n ): Promise<Record<string, unknown>> {\n this.formLogger.info(\n '🚀 FormAwareAgentExecutor.processFormSubmission called!',\n {\n submissionFormId: submission.formId,\n submissionToolName: submission.toolName,\n }\n );\n if (!submission) {\n throw new Error('Form submission is null or undefined');\n }\n\n if (!submission.formId) {\n throw new Error('Form submission missing formId');\n }\n\n if (\n !submission.parameters ||\n submission.parameters === null ||\n typeof submission.parameters !== 'object' ||\n Array.isArray(submission.parameters)\n ) {\n throw new Error(\n `Form submission parameters are invalid: ${typeof submission.parameters}, isNull: ${\n submission.parameters === null\n }, isArray: ${Array.isArray(\n submission.parameters\n )}, parameters: ${JSON.stringify(submission.parameters)}`\n );\n }\n\n this.formLogger.info('Processing form submission:', {\n formId: submission.formId,\n toolName: submission.toolName,\n parameterKeys: Object.keys(submission.parameters),\n parametersType: typeof submission.parameters,\n parametersIsNull: submission.parameters === null,\n parametersIsUndefined: submission.parameters === undefined,\n hasContext: !!submission.context,\n });\n\n let pendingForm = this.pendingForms.get(submission.formId);\n\n if (!pendingForm) {\n pendingForm = globalPendingForms.get(submission.formId);\n if (!pendingForm) {\n throw new Error(`No pending form found for ID: ${submission.formId}`);\n }\n }\n\n this.pendingForms.delete(submission.formId);\n globalPendingForms.delete(submission.formId);\n\n const tool =\n pendingForm.toolRef ||\n this.tools.find((t) => t.name === pendingForm.toolName);\n if (!tool) {\n throw new Error(\n `Tool not found for form submission: ${pendingForm.toolName}`\n );\n }\n\n let baseToolInput: Record<string, unknown> = {};\n try {\n if (\n pendingForm.originalToolInput &&\n typeof pendingForm.originalToolInput === 'object'\n ) {\n baseToolInput = {\n ...(pendingForm.originalToolInput as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract base tool input, using empty object:',\n error\n );\n baseToolInput = {};\n }\n\n let submissionData: Record<string, unknown> = {};\n try {\n if (submission.parameters && typeof submission.parameters === 'object') {\n submissionData = {\n ...(submission.parameters as Record<string, unknown>),\n };\n }\n } catch (error) {\n this.formLogger.warn(\n 'Failed to extract submission parameters, using empty object:',\n error\n );\n submissionData = {};\n }\n\n const mergedToolInput: Record<string, unknown> = {};\n try {\n Object.keys(baseToolInput).forEach((key) => {\n const value = baseToolInput[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n Object.keys(submissionData).forEach((key) => {\n const value = submissionData[key];\n if (value !== undefined && value !== null) {\n mergedToolInput[key] = value;\n }\n });\n\n mergedToolInput.renderForm = false;\n mergedToolInput.__fromForm = true;\n\n this.formLogger.info('Successfully merged tool input:', {\n baseKeys: Object.keys(baseToolInput),\n submissionKeys: Object.keys(submissionData),\n mergedKeys: Object.keys(mergedToolInput),\n });\n } catch (error) {\n this.formLogger.error('Failed to merge tool input data:', error);\n throw new Error(\n `Failed to merge tool input data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n try {\n const maybeWrapper = tool as ToolWrapper;\n let toolOutput: string;\n if (typeof maybeWrapper.executeOriginal === 'function') {\n toolOutput = await maybeWrapper.executeOriginal(mergedToolInput);\n } else if (typeof maybeWrapper.getOriginalTool === 'function') {\n const ot = maybeWrapper.getOriginalTool();\n const otCall = ot as CallableTool;\n if (ot && typeof otCall._call === 'function') {\n toolOutput = await otCall._call(mergedToolInput);\n } else if (ot && typeof otCall.call === 'function') {\n toolOutput = await otCall.call(mergedToolInput);\n } else {\n const tcall = tool as CallableTool;\n if (typeof tcall.call === 'function') {\n toolOutput = await tcall.call(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n }\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool._call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool._call(mergedToolInput);\n } else if (\n maybeWrapper.originalTool &&\n typeof maybeWrapper.originalTool.call === 'function'\n ) {\n toolOutput = await maybeWrapper.originalTool.call(mergedToolInput);\n } else if (typeof (tool as CallableTool).call === 'function') {\n toolOutput = await (tool as CallableTool).call!(mergedToolInput);\n } else {\n throw new Error(\n 'No callable tool implementation found for form submission'\n );\n }\n\n let responseMetadata: Record<string, unknown> = {};\n let formattedOutput: string;\n\n try {\n const parsed = JSON.parse(toolOutput);\n this.formLogger.info(\n '✅ METADATA EXTRACTION: Successfully parsed JSON',\n {\n jsonKeys: Object.keys(parsed),\n hasHashLinkBlock: !!(parsed as Record<string, unknown>)\n .hashLinkBlock,\n }\n );\n\n if (parsed && typeof parsed === 'object') {\n if (ResponseFormatter.isHashLinkResponse(parsed)) {\n this.formLogger.info(\n '🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata'\n );\n\n const parsedRecord = parsed as Record<string, unknown>;\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: parsedRecord.hashLinkBlock,\n ...parsedRecord,\n };\n\n formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);\n\n this.formLogger.info(\n '🔗 METADATA PRESERVED: HashLink metadata extracted for component rendering',\n {\n blockId: this.hasHashLinkBlock(responseMetadata)\n ? responseMetadata.hashLinkBlock.blockId\n : undefined,\n hasTemplate: this.hasHashLinkBlock(responseMetadata)\n ? !!responseMetadata.hashLinkBlock.template\n : false,\n }\n );\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n\n responseMetadata = {\n ...responseMetadata,\n hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,\n ...parsed,\n };\n }\n } else {\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n } catch (error) {\n this.formLogger.warn(\n '❌ METADATA EXTRACTION: Tool output is not JSON',\n {\n error: error instanceof Error ? error.message : 'unknown error',\n outputSample:\n typeof toolOutput === 'string'\n ? toolOutput.substring(0, 200)\n : 'not-string',\n }\n );\n\n formattedOutput = ResponseFormatter.formatResponse(toolOutput);\n }\n\n return {\n output: formattedOutput,\n formCompleted: true,\n originalFormId: submission.formId,\n intermediateSteps: [],\n metadata: responseMetadata,\n rawToolOutput: toolOutput,\n toolName: pendingForm.toolName,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n return this.handleValidationError(error, mergedToolInput, []);\n }\n throw error;\n }\n }\n\n /**\n * Extracts tool information from the execution context\n */\n private extractToolInfoFromError(\n error: ZodError,\n inputs: Record<string, unknown>,\n intermediateSteps: AgentStep[]\n ): { toolName: string; schema: unknown } | null {\n try {\n if (intermediateSteps.length > 0) {\n const lastStep = intermediateSteps[intermediateSteps.length - 1];\n if (lastStep.action && lastStep.action.tool) {\n const tool = this.tools.find((t) => t.name === lastStep.action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info(\n 'Found tool from intermediate steps:',\n lastStep.action.tool\n );\n return {\n toolName: lastStep.action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const inputSteps = (inputs.intermediateSteps as unknown[]) || [];\n if (inputSteps.length > 0) {\n const lastStep = inputSteps[inputSteps.length - 1];\n let action: AgentAction;\n\n if (Array.isArray(lastStep) && lastStep.length > 0) {\n action = lastStep[0] as AgentAction;\n } else if ((lastStep as Record<string, unknown>).action) {\n action = (lastStep as Record<string, unknown>).action as AgentAction;\n } else {\n action = lastStep as AgentAction;\n }\n\n if (action && action.tool) {\n const tool = this.tools.find((t) => t.name === action.tool);\n if (tool && 'schema' in tool) {\n this.formLogger.info('Found tool from input steps:', action.tool);\n return {\n toolName: action.tool,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n const toolFromContext = this.findToolFromContext(inputs);\n if (toolFromContext) {\n this.formLogger.info(\n 'Found tool from context:',\n toolFromContext.toolName\n );\n return toolFromContext;\n }\n\n return null;\n } catch (err) {\n this.formLogger.error('Error extracting tool info:', err);\n return null;\n }\n }\n\n /**\n * Attempts to find tool from execution context\n */\n private findToolFromContext(inputs: Record<string, unknown>): {\n toolName: string;\n schema: unknown;\n } | null {\n const inputText = (inputs.input as string) || '';\n\n for (const tool of this.tools) {\n const keywords = this.extractToolKeywords(tool.name);\n\n if (\n keywords.some((keyword) =>\n inputText.toLowerCase().includes(keyword.toLowerCase())\n )\n ) {\n if ('schema' in tool) {\n return {\n toolName: tool.name,\n schema: (tool as ToolWithSchema).schema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Additional fallback to detect tool from error context\n */\n private detectToolFromErrorContext(\n error: ZodError\n ): { toolName: string; schema: unknown } | null {\n const errorPaths = error.issues.map((issue) => issue.path.join('.'));\n\n for (const tool of this.tools) {\n if ('schema' in tool) {\n const toolSchema = (tool as ToolWithSchema).schema;\n if (this.schemaMatchesErrorPaths(toolSchema, errorPaths)) {\n this.formLogger.info(\n 'Detected tool from error path analysis:',\n tool.name\n );\n return {\n toolName: tool.name,\n schema: toolSchema,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Checks if a schema structure matches error paths\n */\n private schemaMatchesErrorPaths(\n schema: unknown,\n errorPaths: string[]\n ): boolean {\n const schemaRecord = schema as Record<string, unknown>;\n if (!schemaRecord || !schemaRecord._def) return false;\n\n try {\n const def = schemaRecord._def as Record<string, unknown>;\n if (def.typeName === 'ZodObject') {\n const shape = def.shape as Record<string, unknown>;\n const schemaKeys = Object.keys(shape || {});\n return errorPaths.some((path) => {\n const topLevelKey = path.split('.')[0];\n return schemaKeys.includes(topLevelKey);\n });\n }\n } catch (err) {\n this.formLogger.debug('Error analyzing schema structure:', err);\n }\n\n return false;\n }\n\n /**\n * Extracts keywords from tool name for matching\n */\n private extractToolKeywords(toolName: string): string[] {\n const words = toolName\n .replace(/([A-Z])/g, ' $1')\n .toLowerCase()\n .split(/[\\s_-]+/)\n .filter((w) => w.length > 2);\n\n return [...words, toolName.toLowerCase()];\n }\n\n /**\n * Formats the form message for display\n */\n private formatFormResponse(formMessage: FormMessage): string {\n const fieldCount = formMessage.formConfig.fields.length;\n const fieldList = formMessage.formConfig.fields\n .slice(0, 3)\n .map((f) => `• ${f.label}`)\n .join('\\n');\n\n return `I need some additional information to complete your request.\n\n${formMessage.formConfig.description}\n\nRequired fields:\n${fieldList}${fieldCount > 3 ? `\\n... and ${fieldCount - 3} more` : ''}\n\nPlease fill out the form below to continue.`;\n }\n\n /**\n * Check if there are pending forms\n */\n hasPendingForms(): boolean {\n return this.pendingForms.size > 0;\n }\n\n /**\n * Get information about pending forms\n */\n getPendingFormsInfo(): Array<{ formId: string; toolName: string }> {\n return Array.from(this.pendingForms.entries()).map(([formId, info]) => ({\n formId,\n toolName: info.toolName,\n }));\n }\n\n /**\n * Processes HashLink block responses from tools\n */\n private processHashLinkResponse(\n toolResponse: ToolResponse\n ): HashLinkResponse {\n try {\n let hashLinkBlock: HashLinkBlock | undefined;\n\n if (toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n } else if (toolResponse.success && toolResponse.hashLinkBlock) {\n hashLinkBlock = toolResponse.hashLinkBlock;\n }\n\n if (!hashLinkBlock) {\n throw new Error('HashLink block data not found in response');\n }\n\n if (\n !hashLinkBlock.blockId ||\n !hashLinkBlock.hashLink ||\n !hashLinkBlock.attributes\n ) {\n throw new Error(\n 'Invalid HashLink block structure - missing required fields'\n );\n }\n\n let message = 'Content processed successfully!';\n\n if (toolResponse.success && toolResponse.inscription) {\n const inscription = toolResponse.inscription;\n const metadata = toolResponse.metadata || {};\n\n message = `✅ ${inscription.standard} Hashinal inscription completed!\\n\\n`;\n\n if (metadata.name) {\n message += `**${metadata.name}**\\n`;\n }\n\n if (metadata.description) {\n message += `${metadata.description}\\n\\n`;\n }\n\n message += `📍 **Topic ID:** ${inscription.topicId}\\n`;\n message += `🔗 **HRL:** ${inscription.hrl}\\n`;\n\n if (inscription.cdnUrl) {\n message += `🌐 **CDN URL:** ${inscription.cdnUrl}\\n`;\n }\n\n if (metadata.creator) {\n message += `👤 **Creator:** ${metadata.creator}\\n`;\n }\n }\n\n this.formLogger.info('Processed HashLink response', {\n blockId: hashLinkBlock.blockId,\n hashLink: hashLinkBlock.hashLink,\n hasTemplate: !!hashLinkBlock.template,\n attributeCount: Object.keys(hashLinkBlock.attributes || {}).length,\n });\n\n return {\n hasHashLinkBlocks: true,\n hashLinkBlock,\n message,\n };\n } catch (error) {\n this.formLogger.error('Error processing HashLink response:', error);\n\n return {\n hasHashLinkBlocks: false,\n message: 'Content processed, but interactive display is not available.',\n };\n }\n }\n\n /**\n * Get FormEngine statistics for debugging\n */\n getFormEngineStatistics(): {\n strategies: string[];\n middleware: string[];\n } {\n return {\n strategies: this.formEngine.getRegisteredStrategies(),\n middleware: this.formEngine.getRegisteredMiddleware(),\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,30 @@
1
- const FIELD_PRIORITIES = {
2
- ESSENTIAL: "essential",
3
- COMMON: "common",
4
- ADVANCED: "advanced",
5
- EXPERT: "expert"
1
+ const DEFAULT_CONTENT_REFERENCE_CONFIG = {
2
+ sizeThresholdBytes: 10 * 1024,
3
+ maxAgeMs: 60 * 60 * 1e3,
4
+ maxReferences: 100,
5
+ maxTotalStorageBytes: 100 * 1024 * 1024,
6
+ enableAutoCleanup: true,
7
+ cleanupIntervalMs: 5 * 60 * 1e3,
8
+ enablePersistence: false,
9
+ storageBackend: "memory",
10
+ cleanupPolicies: {
11
+ recent: { maxAgeMs: 30 * 60 * 1e3, priority: 1 },
12
+ userContent: { maxAgeMs: 2 * 60 * 60 * 1e3, priority: 2 },
13
+ agentGenerated: { maxAgeMs: 60 * 60 * 1e3, priority: 3 },
14
+ default: { maxAgeMs: 60 * 60 * 1e3, priority: 4 }
15
+ }
6
16
  };
17
+ class ContentReferenceError extends Error {
18
+ constructor(message, type, referenceId, suggestedActions) {
19
+ super(message);
20
+ this.type = type;
21
+ this.referenceId = referenceId;
22
+ this.suggestedActions = suggestedActions;
23
+ this.name = "ContentReferenceError";
24
+ }
25
+ }
7
26
  export {
8
- FIELD_PRIORITIES
27
+ ContentReferenceError,
28
+ DEFAULT_CONTENT_REFERENCE_CONFIG
9
29
  };
10
30
  //# sourceMappingURL=index46.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index46.js","sources":["../../src/constants/form-priorities.ts"],"sourcesContent":["/**\n * Form field priorities for progressive disclosure\n */\nexport const FIELD_PRIORITIES = {\n ESSENTIAL: 'essential',\n COMMON: 'common', \n ADVANCED: 'advanced',\n EXPERT: 'expert'\n} as const;\n\n/**\n * Form field types\n */\nexport const FORM_FIELD_TYPES = {\n TEXT: 'text',\n NUMBER: 'number',\n SELECT: 'select',\n CHECKBOX: 'checkbox',\n TEXTAREA: 'textarea',\n FILE: 'file',\n ARRAY: 'array',\n OBJECT: 'object',\n CURRENCY: 'currency',\n PERCENTAGE: 'percentage',\n} as const;"],"names":[],"mappings":"AAGO,MAAM,mBAAmB;AAAA,EAC9B,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AACV;"}
1
+ {"version":3,"file":"index46.js","sources":["../../src/types/content-reference.ts"],"sourcesContent":["/**\n * Content Reference System Types\n *\n * Shared interfaces for the Reference-Based Content System that handles\n * large content storage with unique reference IDs to optimize context window usage.\n */\n\n/**\n * Unique identifier for stored content references\n * Format: Cryptographically secure 32-byte identifier with base64url encoding\n */\nexport type ReferenceId = string;\n\n/**\n * Lifecycle state of a content reference\n */\nexport type ReferenceLifecycleState =\n | 'active'\n | 'expired'\n | 'cleanup_pending'\n | 'invalid';\n\n/**\n * Content types supported by the reference system\n */\nexport type ContentType =\n | 'text'\n | 'json'\n | 'html'\n | 'markdown'\n | 'binary'\n | 'unknown';\n\n/**\n * Sources that created the content reference\n */\nexport type ContentSource =\n | 'mcp_tool'\n | 'user_upload'\n | 'agent_generated'\n | 'system';\n\n/**\n * Metadata associated with stored content\n */\nexport interface ContentMetadata {\n /** Content type classification */\n contentType: ContentType;\n\n /** MIME type of the original content */\n mimeType?: string;\n\n /** Size in bytes of the stored content */\n sizeBytes: number;\n\n /** When the content was originally stored */\n createdAt: Date;\n\n /** Last time the content was accessed via reference resolution */\n lastAccessedAt: Date;\n\n /** Source that created this content reference */\n source: ContentSource;\n\n /** Name of the MCP tool that generated the content (if applicable) */\n mcpToolName?: string;\n\n /** Original filename or suggested name for the content */\n fileName?: string;\n\n /** Number of times this reference has been resolved */\n accessCount: number;\n\n /** Tags for categorization and cleanup policies */\n tags?: string[];\n\n /** Custom metadata from the source */\n customMetadata?: Record<string, unknown>;\n}\n\n/**\n * Core content reference object passed through agent context\n * Designed to be lightweight (<100 tokens) while providing enough\n * information for agent decision-making\n */\nexport interface ContentReference {\n /** Unique identifier for resolving the content */\n referenceId: ReferenceId;\n\n /** Current lifecycle state */\n state: ReferenceLifecycleState;\n\n /** Brief description or preview of the content (max 200 chars) */\n preview: string;\n\n /** Essential metadata for agent decision-making */\n metadata: Pick<\n ContentMetadata,\n 'contentType' | 'sizeBytes' | 'source' | 'fileName' | 'mimeType'\n >;\n\n /** When this reference was created */\n createdAt: Date;\n\n /** Special format indicator for reference IDs in content */\n readonly format: 'ref://{id}';\n}\n\n/**\n * Result of attempting to resolve a content reference\n */\nexport interface ReferenceResolutionResult {\n /** Whether the resolution was successful */\n success: boolean;\n\n /** The resolved content if successful */\n content?: Buffer;\n\n /** Complete metadata if successful */\n metadata?: ContentMetadata;\n\n /** Error message if resolution failed */\n error?: string;\n\n /** Specific error type for targeted error handling */\n errorType?:\n | 'not_found'\n | 'expired'\n | 'corrupted'\n | 'access_denied'\n | 'system_error';\n\n /** Suggested actions for recovery */\n suggestedActions?: string[];\n}\n\n/**\n * Configuration for content reference storage and lifecycle\n */\nexport interface ContentReferenceConfig {\n /** Size threshold above which content should be stored as references (default: 10KB) */\n sizeThresholdBytes: number;\n\n /** Maximum age for unused references before cleanup (default: 1 hour) */\n maxAgeMs: number;\n\n /** Maximum number of references to store simultaneously */\n maxReferences: number;\n\n /** Maximum total storage size for all references */\n maxTotalStorageBytes: number;\n\n /** Whether to enable automatic cleanup */\n enableAutoCleanup: boolean;\n\n /** Interval for cleanup checks in milliseconds */\n cleanupIntervalMs: number;\n\n /** Whether to persist references across restarts */\n enablePersistence: boolean;\n\n /** Storage backend configuration */\n storageBackend: 'memory' | 'filesystem' | 'hybrid';\n\n /** Cleanup policies for different content types */\n cleanupPolicies: {\n /** Policy for content marked as \"recent\" from MCP tools */\n recent: { maxAgeMs: number; priority: number };\n\n /** Policy for user-uploaded content */\n userContent: { maxAgeMs: number; priority: number };\n\n /** Policy for agent-generated content */\n agentGenerated: { maxAgeMs: number; priority: number };\n\n /** Default policy for other content */\n default: { maxAgeMs: number; priority: number };\n };\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONTENT_REFERENCE_CONFIG: ContentReferenceConfig = {\n sizeThresholdBytes: 10 * 1024,\n maxAgeMs: 60 * 60 * 1000,\n maxReferences: 100,\n maxTotalStorageBytes: 100 * 1024 * 1024,\n enableAutoCleanup: true,\n cleanupIntervalMs: 5 * 60 * 1000,\n enablePersistence: false,\n storageBackend: 'memory',\n cleanupPolicies: {\n recent: { maxAgeMs: 30 * 60 * 1000, priority: 1 },\n userContent: { maxAgeMs: 2 * 60 * 60 * 1000, priority: 2 },\n agentGenerated: { maxAgeMs: 60 * 60 * 1000, priority: 3 },\n default: { maxAgeMs: 60 * 60 * 1000, priority: 4 },\n },\n};\n\n/**\n * Statistics about content reference usage and storage\n */\nexport interface ContentReferenceStats {\n /** Total number of active references */\n activeReferences: number;\n\n /** Total storage used by all references in bytes */\n totalStorageBytes: number;\n\n /** Number of references cleaned up in last cleanup cycle */\n recentlyCleanedUp: number;\n\n /** Number of successful reference resolutions since startup */\n totalResolutions: number;\n\n /** Number of failed resolution attempts */\n failedResolutions: number;\n\n /** Average content size in bytes */\n averageContentSize: number;\n\n /** Most frequently accessed reference ID */\n mostAccessedReferenceId?: ReferenceId;\n\n /** Storage utilization percentage */\n storageUtilization: number;\n\n /** Performance metrics */\n performanceMetrics: {\n /** Average time to create a reference in milliseconds */\n averageCreationTimeMs: number;\n\n /** Average time to resolve a reference in milliseconds */\n averageResolutionTimeMs: number;\n\n /** Average cleanup time in milliseconds */\n averageCleanupTimeMs: number;\n };\n}\n\n/**\n * Error types for content reference operations\n */\nexport class ContentReferenceError extends Error {\n constructor(\n message: string,\n public readonly type: ReferenceResolutionResult['errorType'],\n public readonly referenceId?: ReferenceId,\n public readonly suggestedActions?: string[]\n ) {\n super(message);\n this.name = 'ContentReferenceError';\n }\n}\n\n/**\n * Interface for content reference storage implementations\n */\nexport interface ContentReferenceStore {\n /**\n * Store content and return a reference\n */\n storeContent(\n content: Buffer,\n metadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n >\n ): Promise<ContentReference>;\n\n /**\n * Resolve a reference to its content\n */\n resolveReference(\n referenceId: ReferenceId\n ): Promise<ReferenceResolutionResult>;\n\n /**\n * Check if a reference exists and is valid\n */\n hasReference(referenceId: ReferenceId): Promise<boolean>;\n\n /**\n * Mark a reference for cleanup\n */\n cleanupReference(referenceId: ReferenceId): Promise<boolean>;\n\n /**\n * Get current storage statistics\n */\n getStats(): Promise<ContentReferenceStats>;\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<ContentReferenceConfig>): Promise<void>;\n\n /**\n * Perform cleanup based on current policies\n */\n performCleanup(): Promise<{ cleanedUp: number; errors: string[] }>;\n\n /**\n * Dispose of resources\n */\n dispose(): Promise<void>;\n}\n"],"names":[],"mappings":"AAuLO,MAAM,mCAA2D;AAAA,EACtE,oBAAoB,KAAK;AAAA,EACzB,UAAU,KAAK,KAAK;AAAA,EACpB,eAAe;AAAA,EACf,sBAAsB,MAAM,OAAO;AAAA,EACnC,mBAAmB;AAAA,EACnB,mBAAmB,IAAI,KAAK;AAAA,EAC5B,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,IACf,QAAQ,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IAC9C,aAAa,EAAE,UAAU,IAAI,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IACvD,gBAAgB,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IACtD,SAAS,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,EAAE;AAErD;AA8CO,MAAM,8BAA8B,MAAM;AAAA,EAC/C,YACE,SACgB,MACA,aACA,kBAChB;AACA,UAAM,OAAO;AAJG,SAAA,OAAA;AACA,SAAA,cAAA;AACA,SAAA,mBAAA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;"}
@@ -1,30 +1,10 @@
1
- const DEFAULT_CONTENT_REFERENCE_CONFIG = {
2
- sizeThresholdBytes: 10 * 1024,
3
- maxAgeMs: 60 * 60 * 1e3,
4
- maxReferences: 100,
5
- maxTotalStorageBytes: 100 * 1024 * 1024,
6
- enableAutoCleanup: true,
7
- cleanupIntervalMs: 5 * 60 * 1e3,
8
- enablePersistence: false,
9
- storageBackend: "memory",
10
- cleanupPolicies: {
11
- recent: { maxAgeMs: 30 * 60 * 1e3, priority: 1 },
12
- userContent: { maxAgeMs: 2 * 60 * 60 * 1e3, priority: 2 },
13
- agentGenerated: { maxAgeMs: 60 * 60 * 1e3, priority: 3 },
14
- default: { maxAgeMs: 60 * 60 * 1e3, priority: 4 }
15
- }
1
+ const FIELD_PRIORITIES = {
2
+ ESSENTIAL: "essential",
3
+ COMMON: "common",
4
+ ADVANCED: "advanced",
5
+ EXPERT: "expert"
16
6
  };
17
- class ContentReferenceError extends Error {
18
- constructor(message, type, referenceId, suggestedActions) {
19
- super(message);
20
- this.type = type;
21
- this.referenceId = referenceId;
22
- this.suggestedActions = suggestedActions;
23
- this.name = "ContentReferenceError";
24
- }
25
- }
26
7
  export {
27
- ContentReferenceError,
28
- DEFAULT_CONTENT_REFERENCE_CONFIG
8
+ FIELD_PRIORITIES
29
9
  };
30
10
  //# sourceMappingURL=index47.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index47.js","sources":["../../src/types/content-reference.ts"],"sourcesContent":["/**\n * Content Reference System Types\n *\n * Shared interfaces for the Reference-Based Content System that handles\n * large content storage with unique reference IDs to optimize context window usage.\n */\n\n/**\n * Unique identifier for stored content references\n * Format: Cryptographically secure 32-byte identifier with base64url encoding\n */\nexport type ReferenceId = string;\n\n/**\n * Lifecycle state of a content reference\n */\nexport type ReferenceLifecycleState =\n | 'active'\n | 'expired'\n | 'cleanup_pending'\n | 'invalid';\n\n/**\n * Content types supported by the reference system\n */\nexport type ContentType =\n | 'text'\n | 'json'\n | 'html'\n | 'markdown'\n | 'binary'\n | 'unknown';\n\n/**\n * Sources that created the content reference\n */\nexport type ContentSource =\n | 'mcp_tool'\n | 'user_upload'\n | 'agent_generated'\n | 'system';\n\n/**\n * Metadata associated with stored content\n */\nexport interface ContentMetadata {\n /** Content type classification */\n contentType: ContentType;\n\n /** MIME type of the original content */\n mimeType?: string;\n\n /** Size in bytes of the stored content */\n sizeBytes: number;\n\n /** When the content was originally stored */\n createdAt: Date;\n\n /** Last time the content was accessed via reference resolution */\n lastAccessedAt: Date;\n\n /** Source that created this content reference */\n source: ContentSource;\n\n /** Name of the MCP tool that generated the content (if applicable) */\n mcpToolName?: string;\n\n /** Original filename or suggested name for the content */\n fileName?: string;\n\n /** Number of times this reference has been resolved */\n accessCount: number;\n\n /** Tags for categorization and cleanup policies */\n tags?: string[];\n\n /** Custom metadata from the source */\n customMetadata?: Record<string, unknown>;\n}\n\n/**\n * Core content reference object passed through agent context\n * Designed to be lightweight (<100 tokens) while providing enough\n * information for agent decision-making\n */\nexport interface ContentReference {\n /** Unique identifier for resolving the content */\n referenceId: ReferenceId;\n\n /** Current lifecycle state */\n state: ReferenceLifecycleState;\n\n /** Brief description or preview of the content (max 200 chars) */\n preview: string;\n\n /** Essential metadata for agent decision-making */\n metadata: Pick<\n ContentMetadata,\n 'contentType' | 'sizeBytes' | 'source' | 'fileName' | 'mimeType'\n >;\n\n /** When this reference was created */\n createdAt: Date;\n\n /** Special format indicator for reference IDs in content */\n readonly format: 'ref://{id}';\n}\n\n/**\n * Result of attempting to resolve a content reference\n */\nexport interface ReferenceResolutionResult {\n /** Whether the resolution was successful */\n success: boolean;\n\n /** The resolved content if successful */\n content?: Buffer;\n\n /** Complete metadata if successful */\n metadata?: ContentMetadata;\n\n /** Error message if resolution failed */\n error?: string;\n\n /** Specific error type for targeted error handling */\n errorType?:\n | 'not_found'\n | 'expired'\n | 'corrupted'\n | 'access_denied'\n | 'system_error';\n\n /** Suggested actions for recovery */\n suggestedActions?: string[];\n}\n\n/**\n * Configuration for content reference storage and lifecycle\n */\nexport interface ContentReferenceConfig {\n /** Size threshold above which content should be stored as references (default: 10KB) */\n sizeThresholdBytes: number;\n\n /** Maximum age for unused references before cleanup (default: 1 hour) */\n maxAgeMs: number;\n\n /** Maximum number of references to store simultaneously */\n maxReferences: number;\n\n /** Maximum total storage size for all references */\n maxTotalStorageBytes: number;\n\n /** Whether to enable automatic cleanup */\n enableAutoCleanup: boolean;\n\n /** Interval for cleanup checks in milliseconds */\n cleanupIntervalMs: number;\n\n /** Whether to persist references across restarts */\n enablePersistence: boolean;\n\n /** Storage backend configuration */\n storageBackend: 'memory' | 'filesystem' | 'hybrid';\n\n /** Cleanup policies for different content types */\n cleanupPolicies: {\n /** Policy for content marked as \"recent\" from MCP tools */\n recent: { maxAgeMs: number; priority: number };\n\n /** Policy for user-uploaded content */\n userContent: { maxAgeMs: number; priority: number };\n\n /** Policy for agent-generated content */\n agentGenerated: { maxAgeMs: number; priority: number };\n\n /** Default policy for other content */\n default: { maxAgeMs: number; priority: number };\n };\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONTENT_REFERENCE_CONFIG: ContentReferenceConfig = {\n sizeThresholdBytes: 10 * 1024,\n maxAgeMs: 60 * 60 * 1000,\n maxReferences: 100,\n maxTotalStorageBytes: 100 * 1024 * 1024,\n enableAutoCleanup: true,\n cleanupIntervalMs: 5 * 60 * 1000,\n enablePersistence: false,\n storageBackend: 'memory',\n cleanupPolicies: {\n recent: { maxAgeMs: 30 * 60 * 1000, priority: 1 },\n userContent: { maxAgeMs: 2 * 60 * 60 * 1000, priority: 2 },\n agentGenerated: { maxAgeMs: 60 * 60 * 1000, priority: 3 },\n default: { maxAgeMs: 60 * 60 * 1000, priority: 4 },\n },\n};\n\n/**\n * Statistics about content reference usage and storage\n */\nexport interface ContentReferenceStats {\n /** Total number of active references */\n activeReferences: number;\n\n /** Total storage used by all references in bytes */\n totalStorageBytes: number;\n\n /** Number of references cleaned up in last cleanup cycle */\n recentlyCleanedUp: number;\n\n /** Number of successful reference resolutions since startup */\n totalResolutions: number;\n\n /** Number of failed resolution attempts */\n failedResolutions: number;\n\n /** Average content size in bytes */\n averageContentSize: number;\n\n /** Most frequently accessed reference ID */\n mostAccessedReferenceId?: ReferenceId;\n\n /** Storage utilization percentage */\n storageUtilization: number;\n\n /** Performance metrics */\n performanceMetrics: {\n /** Average time to create a reference in milliseconds */\n averageCreationTimeMs: number;\n\n /** Average time to resolve a reference in milliseconds */\n averageResolutionTimeMs: number;\n\n /** Average cleanup time in milliseconds */\n averageCleanupTimeMs: number;\n };\n}\n\n/**\n * Error types for content reference operations\n */\nexport class ContentReferenceError extends Error {\n constructor(\n message: string,\n public readonly type: ReferenceResolutionResult['errorType'],\n public readonly referenceId?: ReferenceId,\n public readonly suggestedActions?: string[]\n ) {\n super(message);\n this.name = 'ContentReferenceError';\n }\n}\n\n/**\n * Interface for content reference storage implementations\n */\nexport interface ContentReferenceStore {\n /**\n * Store content and return a reference\n */\n storeContent(\n content: Buffer,\n metadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n >\n ): Promise<ContentReference>;\n\n /**\n * Resolve a reference to its content\n */\n resolveReference(\n referenceId: ReferenceId\n ): Promise<ReferenceResolutionResult>;\n\n /**\n * Check if a reference exists and is valid\n */\n hasReference(referenceId: ReferenceId): Promise<boolean>;\n\n /**\n * Mark a reference for cleanup\n */\n cleanupReference(referenceId: ReferenceId): Promise<boolean>;\n\n /**\n * Get current storage statistics\n */\n getStats(): Promise<ContentReferenceStats>;\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<ContentReferenceConfig>): Promise<void>;\n\n /**\n * Perform cleanup based on current policies\n */\n performCleanup(): Promise<{ cleanedUp: number; errors: string[] }>;\n\n /**\n * Dispose of resources\n */\n dispose(): Promise<void>;\n}\n"],"names":[],"mappings":"AAuLO,MAAM,mCAA2D;AAAA,EACtE,oBAAoB,KAAK;AAAA,EACzB,UAAU,KAAK,KAAK;AAAA,EACpB,eAAe;AAAA,EACf,sBAAsB,MAAM,OAAO;AAAA,EACnC,mBAAmB;AAAA,EACnB,mBAAmB,IAAI,KAAK;AAAA,EAC5B,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,IACf,QAAQ,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IAC9C,aAAa,EAAE,UAAU,IAAI,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IACvD,gBAAgB,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,IACtD,SAAS,EAAE,UAAU,KAAK,KAAK,KAAM,UAAU,EAAA;AAAA,EAAE;AAErD;AA8CO,MAAM,8BAA8B,MAAM;AAAA,EAC/C,YACE,SACgB,MACA,aACA,kBAChB;AACA,UAAM,OAAO;AAJG,SAAA,OAAA;AACA,SAAA,cAAA;AACA,SAAA,mBAAA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;"}
1
+ {"version":3,"file":"index47.js","sources":["../../src/constants/form-priorities.ts"],"sourcesContent":["/**\n * Form field priorities for progressive disclosure\n */\nexport const FIELD_PRIORITIES = {\n ESSENTIAL: 'essential',\n COMMON: 'common', \n ADVANCED: 'advanced',\n EXPERT: 'expert'\n} as const;\n\n/**\n * Form field types\n */\nexport const FORM_FIELD_TYPES = {\n TEXT: 'text',\n NUMBER: 'number',\n SELECT: 'select',\n CHECKBOX: 'checkbox',\n TEXTAREA: 'textarea',\n FILE: 'file',\n ARRAY: 'array',\n OBJECT: 'object',\n CURRENCY: 'currency',\n PERCENTAGE: 'percentage',\n} as const;"],"names":[],"mappings":"AAGO,MAAM,mBAAmB;AAAA,EAC9B,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AACV;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hashgraphonline/conversational-agent",
3
- "version": "0.2.207",
3
+ "version": "0.2.209",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.cjs",
6
6
  "module": "./dist/esm/index.js",
@@ -100,7 +100,7 @@
100
100
  "dependencies": {
101
101
  "@hashgraph/sdk": "^2.72.0",
102
102
  "@hashgraphonline/hashinal-wc": "^1.0.107",
103
- "@hashgraphonline/standards-agent-kit": "^0.2.151",
103
+ "@hashgraphonline/standards-agent-kit": "^0.2.153",
104
104
  "@hashgraphonline/standards-sdk": "0.1.110",
105
105
  "@langchain/anthropic": "^0.3.28",
106
106
  "@langchain/core": "^0.3.77",
@@ -979,9 +979,11 @@ export class FormAwareAgentExecutor extends AgentExecutor {
979
979
  '🔗 HASHLINK DETECTED: Processing HashLink response separately to preserve metadata'
980
980
  );
981
981
 
982
+ const parsedRecord = parsed as Record<string, unknown>;
982
983
  responseMetadata = {
983
984
  ...responseMetadata,
984
- hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,
985
+ hashLinkBlock: parsedRecord.hashLinkBlock,
986
+ ...parsedRecord,
985
987
  };
986
988
 
987
989
  formattedOutput = ResponseFormatter.formatHashLinkResponse(parsed);
@@ -1003,6 +1005,7 @@ export class FormAwareAgentExecutor extends AgentExecutor {
1003
1005
  responseMetadata = {
1004
1006
  ...responseMetadata,
1005
1007
  hashLinkBlock: (parsed as Record<string, unknown>).hashLinkBlock,
1008
+ ...parsed,
1006
1009
  };
1007
1010
  }
1008
1011
  } else {
@@ -1251,11 +1254,7 @@ Please fill out the form below to continue.`;
1251
1254
 
1252
1255
  if (toolResponse.hashLinkBlock) {
1253
1256
  hashLinkBlock = toolResponse.hashLinkBlock;
1254
- } else if (
1255
- toolResponse.success &&
1256
- toolResponse.inscription &&
1257
- toolResponse.hashLinkBlock
1258
- ) {
1257
+ } else if (toolResponse.success && toolResponse.hashLinkBlock) {
1259
1258
  hashLinkBlock = toolResponse.hashLinkBlock;
1260
1259
  }
1261
1260