@hashgraphonline/conversational-agent 0.2.106 → 0.2.107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/runtime/wallet-bridge.d.ts +3 -0
- package/dist/esm/index10.js +2 -2
- package/dist/esm/index13.js.map +1 -1
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index2.js.map +1 -1
- package/dist/esm/index23.js +1 -1
- package/dist/esm/index3.js.map +1 -1
- package/dist/esm/index33.js +4 -4
- package/dist/esm/index36.js.map +1 -1
- package/dist/esm/index39.js.map +1 -1
- package/dist/esm/index4.js.map +1 -1
- package/dist/esm/index41.js +4 -11
- package/dist/esm/index41.js.map +1 -1
- package/dist/esm/index42.js +11 -6
- package/dist/esm/index42.js.map +1 -1
- package/dist/esm/index43.js +271 -5
- package/dist/esm/index43.js.map +1 -1
- package/dist/esm/index44.js +142 -229
- package/dist/esm/index44.js.map +1 -1
- package/dist/esm/index45.js +7 -184
- package/dist/esm/index45.js.map +1 -1
- package/dist/esm/index6.js +28 -20
- package/dist/esm/index6.js.map +1 -1
- package/dist/types/runtime/wallet-bridge.d.ts +3 -0
- package/package.json +2 -2
- package/src/conversational-agent.ts +79 -26
- package/src/core/tool-registry.ts +0 -1
- package/src/forms/field-guidance-registry.ts +0 -2
- package/src/memory/smart-memory-manager.ts +0 -1
- package/src/plugins/hcs-10/HCS10Plugin.ts +0 -2
- package/src/plugins/hcs-2/HCS2Plugin.ts +0 -2
- package/src/plugins/inscribe/InscribePlugin.ts +0 -1
- package/src/runtime/wallet-bridge.ts +5 -0
- package/src/signers/browser-signer.ts +0 -1
|
@@ -18,6 +18,9 @@ export interface WalletBridgeProvider {
|
|
|
18
18
|
status: () => Promise<WalletStatus> | WalletStatus;
|
|
19
19
|
executeBytes: (base64: string, network: WalletNetwork) => Promise<WalletExecutorResult>;
|
|
20
20
|
startInscription?: (request: Record<string, unknown>, network: WalletNetwork) => Promise<StartInscriptionResult>;
|
|
21
|
+
startHCS?: (op: string, request: Record<string, unknown>, network: WalletNetwork) => Promise<{
|
|
22
|
+
transactionBytes: string;
|
|
23
|
+
}>;
|
|
21
24
|
}
|
|
22
25
|
export declare function setWalletBridgeProvider(provider: WalletBridgeProvider): void;
|
|
23
26
|
export declare function getWalletBridgeProvider(): WalletBridgeProvider | null;
|
package/dist/esm/index10.js
CHANGED
|
@@ -3,8 +3,8 @@ import { extractRenderConfigs, generateFieldOrdering } from "@hashgraphonline/st
|
|
|
3
3
|
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
4
4
|
import { fieldTypeRegistry } from "./index12.js";
|
|
5
5
|
import { fieldGuidanceRegistry } from "./index13.js";
|
|
6
|
-
import "./
|
|
7
|
-
import { FIELD_PRIORITIES } from "./
|
|
6
|
+
import "./index42.js";
|
|
7
|
+
import { FIELD_PRIORITIES } from "./index45.js";
|
|
8
8
|
function isZodObjectSchema(schema) {
|
|
9
9
|
return typeof schema === "object" && schema !== null && "shape" in schema;
|
|
10
10
|
}
|
package/dist/esm/index13.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index13.js","sources":["../../src/forms/field-guidance-registry.ts"],"sourcesContent":["import type { FormFieldType, FieldOption } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Field guidance configuration for providing contextual help and suggestions\n */\nexport interface FieldGuidance {\n /**\n * Suggestions to show as placeholder or examples\n */\n suggestions?: string[];\n\n /**\n * Predefined options for select fields\n */\n predefinedOptions?: FieldOption[];\n\n /**\n * Warning messages for specific patterns to avoid\n */\n warnings?: {\n pattern: RegExp;\n message: string;\n }[];\n\n /**\n * Validation rules specific to the field context\n */\n validationRules?: {\n /**\n * Patterns that should be rejected\n */\n rejectPatterns?: {\n pattern: RegExp;\n reason: string;\n }[];\n\n /**\n * Minimum quality requirements\n */\n qualityChecks?: {\n minNonTechnicalWords?: number;\n requireSpecificTerms?: string[];\n forbidTechnicalTerms?: string[];\n };\n };\n\n /**\n * Field type override for specific contexts\n */\n fieldTypeOverride?: FormFieldType;\n\n /**\n * Help text specific to the tool context\n */\n contextualHelpText?: string;\n}\n\n/**\n * Tool-specific field configurations\n */\nexport interface ToolFieldConfiguration {\n /**\n * Tool name or pattern to match\n */\n toolPattern: string | RegExp;\n\n /**\n * Field-specific guidance\n */\n fields: Record<string, FieldGuidance>;\n\n /**\n * Global guidance for all fields in this tool\n */\n globalGuidance?: {\n /**\n * General warnings to show\n */\n warnings?: string[];\n\n /**\n * Quality standards for this tool\n */\n qualityStandards?: string[];\n };\n}\n\n/**\n * Registry for field guidance configurations\n */\nclass FieldGuidanceRegistry {\n private configurations: ToolFieldConfiguration[] = [];\n private providers: Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n provider: FieldGuidanceProvider;\n order: number;\n }> = [];\n private registerOrderCounter = 0;\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FieldGuidanceRegistry' });\n }\n\n /**\n * Register field guidance for a specific tool\n */\n registerToolConfiguration(config: ToolFieldConfiguration): void {\n this.configurations.push(config);\n }\n\n /**\n * Register a provider for dynamic field/global guidance\n */\n registerToolProvider(\n toolPattern: string | RegExp,\n provider: FieldGuidanceProvider,\n options?: { id?: string; priority?: number }\n ): string {\n const id = options?.id ?? `provider-${this.providers.length + 1}`;\n const priority = options?.priority ?? 0;\n if (this.providers.some((p) => p.id === id)) {\n this.logger.error('Duplicate provider id', { id });\n throw new Error('DUPLICATE_PROVIDER_ID');\n }\n this.providers.push({\n id,\n priority,\n pattern: toolPattern,\n provider,\n order: this.registerOrderCounter++,\n });\n return id;\n }\n\n /** Unregister a provider by id */\n unregisterProvider(id: string): void {\n this.providers = this.providers.filter((p) => p.id !== id);\n }\n\n /** List registered providers */\n listProviders(): Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n }> {\n return this.providers.map(({ id, priority, pattern }) => ({\n id,\n priority,\n pattern,\n }));\n }\n\n /**\n * Get field guidance for a specific tool and field\n */\n getFieldGuidance(toolName: string, fieldName: string): FieldGuidance | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.fields[fieldName]) {\n const staticGuidance = config.fields[fieldName];\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return staticGuidance;\n let merged: FieldGuidance = { ...staticGuidance };\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetFieldGuidance(\n p,\n fieldName,\n toolName\n );\n if (fromProvider) {\n merged = this.mergeGuidance(merged, fromProvider);\n }\n }\n return merged;\n }\n }\n // No static guidance matched; try provider-only (apply from highest to lowest)\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let merged: FieldGuidance = {};\n for (const p of [...providers].reverse()) {\n const g = this.safeGetFieldGuidance(p, fieldName, toolName);\n if (g) merged = this.mergeGuidance(merged, g);\n }\n return Object.keys(merged).length > 0 ? merged : null;\n }\n return null;\n }\n\n /**\n * Get global guidance for a tool\n */\n getGlobalGuidance(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.globalGuidance) {\n const base = config.globalGuidance;\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return base;\n let mergedWarnings: string[] | undefined = base.warnings;\n let mergedQuality: string[] | undefined = base.qualityStandards;\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetGlobalGuidance(p, toolName);\n if (fromProvider) {\n mergedWarnings = fromProvider.warnings ?? mergedWarnings;\n mergedQuality = fromProvider.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> =\n {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined)\n result.qualityStandards = mergedQuality;\n return result;\n }\n }\n // No static matched → provider-only\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let mergedWarnings: string[] | undefined;\n let mergedQuality: string[] | undefined;\n for (const p of [...providers].reverse()) {\n const g = this.safeGetGlobalGuidance(p, toolName);\n if (g) {\n mergedWarnings = g.warnings ?? mergedWarnings;\n mergedQuality = g.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> = {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined) result.qualityStandards = mergedQuality;\n return Object.keys(result).length > 0 ? result : null;\n }\n return null;\n }\n\n /**\n * Validate field value against guidance rules\n */\n validateFieldValue(\n toolName: string,\n fieldName: string,\n value: unknown\n ): {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n } {\n const guidance = this.getFieldGuidance(toolName, fieldName);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (!guidance || typeof value !== 'string') {\n return { isValid: true, warnings, errors };\n }\n\n if (guidance.warnings) {\n for (const warning of guidance.warnings) {\n if (warning.pattern.test(value)) {\n warnings.push(warning.message);\n }\n }\n }\n\n if (guidance.validationRules) {\n const { rejectPatterns, qualityChecks } = guidance.validationRules;\n\n if (rejectPatterns) {\n for (const reject of rejectPatterns) {\n if (reject.pattern.test(value)) {\n errors.push(`Rejected: ${reject.reason}`);\n }\n }\n }\n\n if (qualityChecks) {\n if (qualityChecks.forbidTechnicalTerms) {\n const lowerValue = value.toLowerCase();\n for (const term of qualityChecks.forbidTechnicalTerms) {\n if (lowerValue.includes(term.toLowerCase())) {\n errors.push(\n `Avoid technical terms like \"${term}\" in NFT metadata`\n );\n }\n }\n }\n\n if (qualityChecks.requireSpecificTerms) {\n const lowerValue = value.toLowerCase();\n const hasRequired = qualityChecks.requireSpecificTerms.some((term) =>\n lowerValue.includes(term.toLowerCase())\n );\n if (!hasRequired) {\n warnings.push(\n `Consider including terms like: ${qualityChecks.requireSpecificTerms.join(\n ', '\n )}`\n );\n }\n }\n\n if (qualityChecks.minNonTechnicalWords) {\n const words = value.split(/\\s+/).filter((word) => word.length > 2);\n if (words.length < qualityChecks.minNonTechnicalWords) {\n warnings.push(\n `Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`\n );\n }\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n };\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configurations = [];\n this.providers = [];\n this.registerOrderCounter = 0;\n }\n\n /** Choose matching provider by priority then last-in wins */\n private pickMatchingProviders(toolName: string): Array<{\n id: string;\n provider: FieldGuidanceProvider;\n priority: number;\n order: number;\n }> {\n const matches = this.providers.filter((p) =>\n typeof p.pattern === 'string'\n ? toolName.toLowerCase().includes((p.pattern as string).toLowerCase())\n : (p.pattern as RegExp).test(toolName)\n );\n const sorted = matches.sort((a, b) => {\n if (b.priority !== a.priority) return b.priority - a.priority;\n return b.order - a.order; // last-in wins when equal priority\n });\n return sorted.map((m) => ({\n id: m.id,\n provider: m.provider,\n priority: m.priority,\n order: m.order,\n }));\n }\n\n private safeGetFieldGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n fieldName: string,\n toolName: string\n ): FieldGuidance | null {\n try {\n return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;\n } catch (err) {\n this.logger.warn('Provider getFieldGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private safeGetGlobalGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n try {\n return winner.provider.getGlobalGuidance?.(toolName) ?? null;\n } catch (err) {\n this.logger.warn('Provider getGlobalGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private mergeGuidance(\n base: FieldGuidance,\n over: FieldGuidance\n ): FieldGuidance {\n const out: FieldGuidance = {};\n const suggestions = over.suggestions ?? base.suggestions;\n if (suggestions !== undefined) out.suggestions = suggestions;\n const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;\n if (predefinedOptions !== undefined)\n out.predefinedOptions = predefinedOptions;\n const warnings = over.warnings ?? base.warnings;\n if (warnings !== undefined) out.warnings = warnings;\n const validationRules = over.validationRules ?? base.validationRules;\n if (validationRules !== undefined) out.validationRules = validationRules;\n const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;\n if (fieldTypeOverride !== undefined)\n out.fieldTypeOverride = fieldTypeOverride;\n const contextualHelpText =\n over.contextualHelpText ?? base.contextualHelpText;\n if (contextualHelpText !== undefined)\n out.contextualHelpText = contextualHelpText;\n return out;\n }\n}\n\nexport const fieldGuidanceRegistry = new FieldGuidanceRegistry();\n\n/**\n * Provider interface (optional, for dynamic guidance)\n */\nexport interface FieldGuidanceProvider {\n getFieldGuidance(\n fieldName: string,\n ctx: { toolName: string }\n ): FieldGuidance | null;\n getGlobalGuidance?(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null;\n}\n"],"names":["providers"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index13.js","sources":["../../src/forms/field-guidance-registry.ts"],"sourcesContent":["import type { FormFieldType, FieldOption } from './types';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Field guidance configuration for providing contextual help and suggestions\n */\nexport interface FieldGuidance {\n /**\n * Suggestions to show as placeholder or examples\n */\n suggestions?: string[];\n\n /**\n * Predefined options for select fields\n */\n predefinedOptions?: FieldOption[];\n\n /**\n * Warning messages for specific patterns to avoid\n */\n warnings?: {\n pattern: RegExp;\n message: string;\n }[];\n\n /**\n * Validation rules specific to the field context\n */\n validationRules?: {\n /**\n * Patterns that should be rejected\n */\n rejectPatterns?: {\n pattern: RegExp;\n reason: string;\n }[];\n\n /**\n * Minimum quality requirements\n */\n qualityChecks?: {\n minNonTechnicalWords?: number;\n requireSpecificTerms?: string[];\n forbidTechnicalTerms?: string[];\n };\n };\n\n /**\n * Field type override for specific contexts\n */\n fieldTypeOverride?: FormFieldType;\n\n /**\n * Help text specific to the tool context\n */\n contextualHelpText?: string;\n}\n\n/**\n * Tool-specific field configurations\n */\nexport interface ToolFieldConfiguration {\n /**\n * Tool name or pattern to match\n */\n toolPattern: string | RegExp;\n\n /**\n * Field-specific guidance\n */\n fields: Record<string, FieldGuidance>;\n\n /**\n * Global guidance for all fields in this tool\n */\n globalGuidance?: {\n /**\n * General warnings to show\n */\n warnings?: string[];\n\n /**\n * Quality standards for this tool\n */\n qualityStandards?: string[];\n };\n}\n\n/**\n * Registry for field guidance configurations\n */\nclass FieldGuidanceRegistry {\n private configurations: ToolFieldConfiguration[] = [];\n private providers: Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n provider: FieldGuidanceProvider;\n order: number;\n }> = [];\n private registerOrderCounter = 0;\n private logger: Logger;\n\n constructor() {\n this.logger = new Logger({ module: 'FieldGuidanceRegistry' });\n }\n\n /**\n * Register field guidance for a specific tool\n */\n registerToolConfiguration(config: ToolFieldConfiguration): void {\n this.configurations.push(config);\n }\n\n /**\n * Register a provider for dynamic field/global guidance\n */\n registerToolProvider(\n toolPattern: string | RegExp,\n provider: FieldGuidanceProvider,\n options?: { id?: string; priority?: number }\n ): string {\n const id = options?.id ?? `provider-${this.providers.length + 1}`;\n const priority = options?.priority ?? 0;\n if (this.providers.some((p) => p.id === id)) {\n this.logger.error('Duplicate provider id', { id });\n throw new Error('DUPLICATE_PROVIDER_ID');\n }\n this.providers.push({\n id,\n priority,\n pattern: toolPattern,\n provider,\n order: this.registerOrderCounter++,\n });\n return id;\n }\n\n /** Unregister a provider by id */\n unregisterProvider(id: string): void {\n this.providers = this.providers.filter((p) => p.id !== id);\n }\n\n /** List registered providers */\n listProviders(): Array<{\n id: string;\n priority: number;\n pattern: string | RegExp;\n }> {\n return this.providers.map(({ id, priority, pattern }) => ({\n id,\n priority,\n pattern,\n }));\n }\n\n /**\n * Get field guidance for a specific tool and field\n */\n getFieldGuidance(toolName: string, fieldName: string): FieldGuidance | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.fields[fieldName]) {\n const staticGuidance = config.fields[fieldName];\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return staticGuidance;\n let merged: FieldGuidance = { ...staticGuidance };\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetFieldGuidance(\n p,\n fieldName,\n toolName\n );\n if (fromProvider) {\n merged = this.mergeGuidance(merged, fromProvider);\n }\n }\n return merged;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let merged: FieldGuidance = {};\n for (const p of [...providers].reverse()) {\n const g = this.safeGetFieldGuidance(p, fieldName, toolName);\n if (g) merged = this.mergeGuidance(merged, g);\n }\n return Object.keys(merged).length > 0 ? merged : null;\n }\n return null;\n }\n\n /**\n * Get global guidance for a tool\n */\n getGlobalGuidance(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n if (process.env.CA_FORM_GUIDANCE_ENABLED === 'false') {\n return null;\n }\n for (const config of this.configurations) {\n const matches =\n typeof config.toolPattern === 'string'\n ? toolName.toLowerCase().includes(config.toolPattern.toLowerCase())\n : config.toolPattern.test(toolName);\n\n if (matches && config.globalGuidance) {\n const base = config.globalGuidance;\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length === 0) return base;\n let mergedWarnings: string[] | undefined = base.warnings;\n let mergedQuality: string[] | undefined = base.qualityStandards;\n for (const p of [...providers].reverse()) {\n const fromProvider = this.safeGetGlobalGuidance(p, toolName);\n if (fromProvider) {\n mergedWarnings = fromProvider.warnings ?? mergedWarnings;\n mergedQuality = fromProvider.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> =\n {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined)\n result.qualityStandards = mergedQuality;\n return result;\n }\n }\n const providers = this.pickMatchingProviders(toolName);\n if (providers.length > 0) {\n let mergedWarnings: string[] | undefined;\n let mergedQuality: string[] | undefined;\n for (const p of [...providers].reverse()) {\n const g = this.safeGetGlobalGuidance(p, toolName);\n if (g) {\n mergedWarnings = g.warnings ?? mergedWarnings;\n mergedQuality = g.qualityStandards ?? mergedQuality;\n }\n }\n const result: NonNullable<ToolFieldConfiguration['globalGuidance']> = {};\n if (mergedWarnings !== undefined) result.warnings = mergedWarnings;\n if (mergedQuality !== undefined) result.qualityStandards = mergedQuality;\n return Object.keys(result).length > 0 ? result : null;\n }\n return null;\n }\n\n /**\n * Validate field value against guidance rules\n */\n validateFieldValue(\n toolName: string,\n fieldName: string,\n value: unknown\n ): {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n } {\n const guidance = this.getFieldGuidance(toolName, fieldName);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (!guidance || typeof value !== 'string') {\n return { isValid: true, warnings, errors };\n }\n\n if (guidance.warnings) {\n for (const warning of guidance.warnings) {\n if (warning.pattern.test(value)) {\n warnings.push(warning.message);\n }\n }\n }\n\n if (guidance.validationRules) {\n const { rejectPatterns, qualityChecks } = guidance.validationRules;\n\n if (rejectPatterns) {\n for (const reject of rejectPatterns) {\n if (reject.pattern.test(value)) {\n errors.push(`Rejected: ${reject.reason}`);\n }\n }\n }\n\n if (qualityChecks) {\n if (qualityChecks.forbidTechnicalTerms) {\n const lowerValue = value.toLowerCase();\n for (const term of qualityChecks.forbidTechnicalTerms) {\n if (lowerValue.includes(term.toLowerCase())) {\n errors.push(\n `Avoid technical terms like \"${term}\" in NFT metadata`\n );\n }\n }\n }\n\n if (qualityChecks.requireSpecificTerms) {\n const lowerValue = value.toLowerCase();\n const hasRequired = qualityChecks.requireSpecificTerms.some((term) =>\n lowerValue.includes(term.toLowerCase())\n );\n if (!hasRequired) {\n warnings.push(\n `Consider including terms like: ${qualityChecks.requireSpecificTerms.join(\n ', '\n )}`\n );\n }\n }\n\n if (qualityChecks.minNonTechnicalWords) {\n const words = value.split(/\\s+/).filter((word) => word.length > 2);\n if (words.length < qualityChecks.minNonTechnicalWords) {\n warnings.push(\n `Consider providing more descriptive content (at least ${qualityChecks.minNonTechnicalWords} meaningful words)`\n );\n }\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n };\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configurations = [];\n this.providers = [];\n this.registerOrderCounter = 0;\n }\n\n /** Choose matching provider by priority then last-in wins */\n private pickMatchingProviders(toolName: string): Array<{\n id: string;\n provider: FieldGuidanceProvider;\n priority: number;\n order: number;\n }> {\n const matches = this.providers.filter((p) =>\n typeof p.pattern === 'string'\n ? toolName.toLowerCase().includes((p.pattern as string).toLowerCase())\n : (p.pattern as RegExp).test(toolName)\n );\n const sorted = matches.sort((a, b) => {\n if (b.priority !== a.priority) return b.priority - a.priority;\n return b.order - a.order; // last-in wins when equal priority\n });\n return sorted.map((m) => ({\n id: m.id,\n provider: m.provider,\n priority: m.priority,\n order: m.order,\n }));\n }\n\n private safeGetFieldGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n fieldName: string,\n toolName: string\n ): FieldGuidance | null {\n try {\n return winner.provider.getFieldGuidance(fieldName, { toolName }) ?? null;\n } catch (err) {\n this.logger.warn('Provider getFieldGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private safeGetGlobalGuidance(\n winner: { id: string; provider: FieldGuidanceProvider },\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null {\n try {\n return winner.provider.getGlobalGuidance?.(toolName) ?? null;\n } catch (err) {\n this.logger.warn('Provider getGlobalGuidance failed', {\n id: winner.id,\n err,\n });\n return null;\n }\n }\n\n private mergeGuidance(\n base: FieldGuidance,\n over: FieldGuidance\n ): FieldGuidance {\n const out: FieldGuidance = {};\n const suggestions = over.suggestions ?? base.suggestions;\n if (suggestions !== undefined) out.suggestions = suggestions;\n const predefinedOptions = over.predefinedOptions ?? base.predefinedOptions;\n if (predefinedOptions !== undefined)\n out.predefinedOptions = predefinedOptions;\n const warnings = over.warnings ?? base.warnings;\n if (warnings !== undefined) out.warnings = warnings;\n const validationRules = over.validationRules ?? base.validationRules;\n if (validationRules !== undefined) out.validationRules = validationRules;\n const fieldTypeOverride = over.fieldTypeOverride ?? base.fieldTypeOverride;\n if (fieldTypeOverride !== undefined)\n out.fieldTypeOverride = fieldTypeOverride;\n const contextualHelpText =\n over.contextualHelpText ?? base.contextualHelpText;\n if (contextualHelpText !== undefined)\n out.contextualHelpText = contextualHelpText;\n return out;\n }\n}\n\nexport const fieldGuidanceRegistry = new FieldGuidanceRegistry();\n\n/**\n * Provider interface (optional, for dynamic guidance)\n */\nexport interface FieldGuidanceProvider {\n getFieldGuidance(\n fieldName: string,\n ctx: { toolName: string }\n ): FieldGuidance | null;\n getGlobalGuidance?(\n toolName: string\n ): ToolFieldConfiguration['globalGuidance'] | null;\n}\n"],"names":["providers"],"mappings":"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"}
|
package/dist/esm/index18.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index18.js","sources":["../../src/memory/smart-memory-manager.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { SystemMessage } from '@langchain/core/messages';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { MemoryWindow } from './memory-window';\nimport { ContentStorage } from './content-storage';\nimport { TokenCounter } from './token-counter';\n\n/**\n * Entity association for storing blockchain entity contexts\n */\nexport interface EntityAssociation {\n /** The blockchain entity ID (e.g., tokenId, accountId, topicId) */\n entityId: string;\n /** User-provided or derived friendly name */\n entityName: string;\n /** Type of entity (token, account, topic, schedule, etc.) */\n entityType: string;\n /** When the entity was created/associated */\n createdAt: Date;\n /** Transaction ID that created this entity */\n transactionId?: string;\n /** Optional session identifier to scope associations */\n sessionId?: string;\n}\n\n/**\n * Options for resolving entity references\n */\nexport interface EntityResolutionOptions {\n /** Filter by specific entity type */\n entityType?: string;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use fuzzy matching for natural language queries */\n fuzzyMatch?: boolean;\n}\n\n/**\n * Configuration for SmartMemoryManager\n */\nexport interface SmartMemoryConfig {\n /** Maximum tokens for active memory window */\n maxTokens?: number;\n /** Reserve tokens for response generation */\n reserveTokens?: number;\n /** Model name for token counting */\n modelName?: string;\n /** Maximum messages to store in content storage */\n storageLimit?: number;\n}\n\n/**\n * Search options for history search\n */\nexport interface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Memory statistics for active memory window\n */\nexport interface MemoryStats {\n /** Total active messages in memory window */\n totalActiveMessages: number;\n /** Current token count including system prompt */\n currentTokenCount: number;\n /** Maximum token capacity */\n maxTokens: number;\n /** Remaining token capacity */\n remainingCapacity: number;\n /** System prompt token count */\n systemPromptTokens: number;\n /** Memory usage percentage */\n usagePercentage: number;\n}\n\nconst IS_ENTITY_ASSOCIATION_FLAG = '\"isEntityAssociation\":true';\n\n/**\n * TODO: investigate using chroma / rag for long term memory\n * Smart memory manager that combines active memory window with long-term storage\n * Provides context-aware memory management with automatic pruning and searchable history\n */\nexport class SmartMemoryManager {\n private memoryWindow: MemoryWindow;\n private _contentStorage: ContentStorage;\n private tokenCounter: TokenCounter;\n private config: Required<SmartMemoryConfig>;\n private logger: Logger;\n\n private static readonly DEFAULT_CONFIG: Required<SmartMemoryConfig> = {\n maxTokens: 8000,\n reserveTokens: 1000,\n modelName: 'gpt-4o',\n storageLimit: 1000,\n };\n\n constructor(config: SmartMemoryConfig = {}) {\n this.config = { ...SmartMemoryManager.DEFAULT_CONFIG, ...config };\n this.logger = new Logger({ module: 'SmartMemoryManager' });\n\n this.tokenCounter = new TokenCounter(this.config.modelName);\n this._contentStorage = new ContentStorage(this.config.storageLimit);\n this.memoryWindow = new MemoryWindow(\n this.config.maxTokens,\n this.config.reserveTokens,\n this.tokenCounter\n );\n }\n\n /**\n * Get the content storage instance for file/content reference operations\n * @returns ContentStorage instance\n */\n get contentStorage(): ContentStorage {\n return this._contentStorage;\n }\n\n /**\n * Add a message to the active memory window\n * Automatically handles pruning and storage of displaced messages\n * @param message - Message to add\n */\n addMessage(message: BaseMessage): void {\n const result = this.memoryWindow.addMessage(message);\n\n if (result.prunedMessages.length > 0) {\n this._contentStorage.storeMessages(result.prunedMessages);\n }\n }\n\n /**\n * Get all active messages from the memory window\n * @returns Array of active messages in chronological order\n */\n getMessages(): BaseMessage[] {\n return this.memoryWindow.getMessages();\n }\n\n /**\n * Clear active memory window\n * @param clearStorage - Whether to also clear the content storage (default: false)\n */\n clear(clearStorage: boolean = false): void {\n this.memoryWindow.clear();\n\n if (clearStorage) {\n this._contentStorage.clear();\n }\n }\n\n /**\n * Set the system prompt for the memory window\n * @param systemPrompt - System prompt text\n */\n setSystemPrompt(systemPrompt: string): void {\n this.memoryWindow.setSystemPrompt(systemPrompt);\n }\n\n /**\n * Get the current system prompt\n * @returns Current system prompt text\n */\n getSystemPrompt(): string {\n return this.memoryWindow.getSystemPrompt();\n }\n\n /**\n * Search through stored message history\n * @param query - Search term or pattern\n * @param options - Search configuration\n * @returns Array of matching messages from history\n */\n searchHistory(query: string, options: SearchOptions = {}): BaseMessage[] {\n return this._contentStorage.searchMessages(query, options);\n }\n\n /**\n * Get recent messages from storage history\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages from storage\n */\n getRecentHistory(count: number): BaseMessage[] {\n return this._contentStorage.getRecentMessages(count);\n }\n\n /**\n * Check if a message can be added without exceeding limits\n * @param message - Message to test\n * @returns True if message can be added\n */\n canAddMessage(message: BaseMessage): boolean {\n return this.memoryWindow.canAddMessage(message);\n }\n\n /**\n * Get statistics about the active memory window\n * @returns Memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n const windowStats = this.memoryWindow.getStats();\n\n return {\n totalActiveMessages: windowStats.totalMessages,\n currentTokenCount: windowStats.currentTokens,\n maxTokens: windowStats.maxTokens,\n remainingCapacity: windowStats.remainingCapacity,\n systemPromptTokens: windowStats.systemPromptTokens,\n usagePercentage: windowStats.usagePercentage,\n };\n }\n\n /**\n * Get statistics about the content storage\n * @returns Storage usage statistics\n */\n getStorageStats(): ReturnType<ContentStorage['getStorageStats']> {\n return this._contentStorage.getStorageStats();\n }\n\n /**\n * Get combined statistics for both active memory and storage\n * @returns Combined memory and storage statistics\n */\n getOverallStats(): {\n activeMemory: MemoryStats;\n storage: ReturnType<ContentStorage['getStorageStats']>;\n totalMessagesManaged: number;\n activeMemoryUtilization: number;\n storageUtilization: number;\n } {\n const memoryStats = this.getMemoryStats();\n const storageStats = this.getStorageStats();\n\n return {\n activeMemory: memoryStats,\n storage: storageStats,\n totalMessagesManaged:\n memoryStats.totalActiveMessages + storageStats.totalMessages,\n activeMemoryUtilization: memoryStats.usagePercentage,\n storageUtilization: storageStats.usagePercentage,\n };\n }\n\n /**\n * Update the configuration and apply changes\n * @param newConfig - New configuration options\n */\n updateConfig(newConfig: Partial<SmartMemoryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (\n newConfig.maxTokens !== undefined ||\n newConfig.reserveTokens !== undefined\n ) {\n this.memoryWindow.updateLimits(\n this.config.maxTokens,\n this.config.reserveTokens\n );\n }\n\n if (newConfig.storageLimit !== undefined) {\n this._contentStorage.updateStorageLimit(this.config.storageLimit);\n }\n }\n\n /**\n * Get current configuration\n * @returns Current configuration settings\n */\n getConfig(): Required<SmartMemoryConfig> {\n return { ...this.config };\n }\n\n /**\n * Get messages from storage within a time range\n * @param startTime - Start of time range\n * @param endTime - End of time range\n * @returns Messages within the specified time range\n */\n getHistoryFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n return this._contentStorage.getMessagesFromTimeRange(startTime, endTime);\n }\n\n /**\n * Get messages from storage by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Messages of the specified type\n */\n getHistoryByType(messageType: string, limit?: number): BaseMessage[] {\n return this._contentStorage.getMessagesByType(messageType, limit);\n }\n\n /**\n * Get recent messages from storage within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Messages from the last N minutes\n */\n getRecentHistoryByTime(minutes: number): BaseMessage[] {\n return this._contentStorage.getRecentMessagesByTime(minutes);\n }\n\n /**\n * Export the current state for persistence or analysis\n * @returns Serializable representation of memory state\n */\n exportState(): {\n config: Required<SmartMemoryConfig>;\n activeMessages: Array<{ content: unknown; type: string }>;\n systemPrompt: string;\n memoryStats: MemoryStats;\n storageStats: ReturnType<ContentStorage['getStorageStats']>;\n storedMessages: ReturnType<ContentStorage['exportMessages']>;\n } {\n return {\n config: this.config,\n activeMessages: this.memoryWindow.getMessages().map((msg) => ({\n content: msg.content,\n type: msg._getType(),\n })),\n systemPrompt: this.memoryWindow.getSystemPrompt(),\n memoryStats: this.getMemoryStats(),\n storageStats: this.getStorageStats(),\n storedMessages: this._contentStorage.exportMessages(),\n };\n }\n\n /**\n * Get a summary of conversation context for external use\n * Useful for providing context to other systems or for logging\n * @param includeStoredContext - Whether to include recent stored messages\n * @returns Context summary object\n */\n getContextSummary(includeStoredContext: boolean = false): {\n activeMessageCount: number;\n systemPrompt: string;\n recentMessages: BaseMessage[];\n memoryUtilization: number;\n hasStoredHistory: boolean;\n recentStoredMessages?: BaseMessage[];\n storageStats?: ReturnType<ContentStorage['getStorageStats']>;\n } {\n const activeMessages = this.getMessages();\n const summary = {\n activeMessageCount: activeMessages.length,\n systemPrompt: this.getSystemPrompt(),\n recentMessages: activeMessages.slice(-5),\n memoryUtilization: this.getMemoryStats().usagePercentage,\n hasStoredHistory: this.getStorageStats().totalMessages > 0,\n };\n\n if (includeStoredContext) {\n return {\n ...summary,\n recentStoredMessages: this.getRecentHistory(10),\n storageStats: this.getStorageStats(),\n };\n }\n\n return summary;\n }\n\n /**\n * Perform maintenance operations\n * Optimizes storage and cleans up resources\n */\n performMaintenance(): void {}\n\n /**\n * Store an entity association for later resolution\n * @param entityId - The blockchain entity ID\n * @param entityName - User-provided or derived friendly name\n * @param entityType - Type of entity (token, account, topic, etc.)\n * @param transactionId - Optional transaction ID that created this entity\n */\n storeEntityAssociation(\n entityId: string,\n entityName: string,\n entityType: string,\n transactionId?: string,\n sessionId?: string\n ): void {\n try {\n if (\n !entityId ||\n typeof entityId !== 'string' ||\n entityId.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityName ||\n typeof entityName !== 'string' ||\n entityName.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityType ||\n typeof entityType !== 'string' ||\n entityType.trim().length === 0\n ) {\n return;\n }\n\n const sanitizedEntityId = entityId.trim();\n const sanitizedEntityName = entityName.trim().substring(0, 100);\n const sanitizedEntityType = this.normalizeEntityType(entityType);\n\n let usageHint = '';\n if (sanitizedEntityType === 'tokenid') {\n usageHint = 'Use this as tokenId for HTS operations';\n } else if (sanitizedEntityType === 'topicid') {\n usageHint =\n 'Can be used for HCS operations, HRLs for minting with the format hcs://1/<topicId>, etc.';\n } else if (sanitizedEntityType === 'accountid') {\n usageHint = 'Can be used for account based operations';\n }\n\n const association: EntityAssociation & {\n isEntityAssociation: boolean;\n usage?: string;\n hrl?: string;\n } = {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n createdAt: new Date(),\n isEntityAssociation: true,\n ...(usageHint ? { usage: usageHint } : {}),\n ...(sanitizedEntityType === 'topicId'\n ? { hrl: `hcs://1/${sanitizedEntityId}` }\n : {}),\n ...(transactionId !== undefined &&\n transactionId !== null &&\n transactionId.trim() !== ''\n ? { transactionId: transactionId.trim() }\n : {}),\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n };\n\n const content = JSON.stringify(association);\n type LangChainLikeMessage = {\n _getType: () => string;\n content: unknown;\n id: string;\n name?: string;\n additional_kwargs?: Record<string, unknown>;\n };\n\n const entityMessage: LangChainLikeMessage = {\n _getType: () => 'system',\n content: content,\n id: `entity_${sanitizedEntityId}_${Date.now()}`,\n name: 'entity_association',\n additional_kwargs: {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n isEntityAssociation: true,\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n },\n };\n\n try {\n this.memoryWindow.addMessage(new SystemMessage(content));\n } catch {}\n\n this._contentStorage.storeMessages([entityMessage as BaseMessage]);\n } catch (error) {\n this.logger.error('Failed to store entity association', {\n entityId,\n entityName,\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Normalize various type aliases to canonical EntityFormat strings using a registry.\n */\n private normalizeEntityType(input: string): string {\n const raw = (input || '').trim();\n if (raw.length === 0) {\n return '';\n }\n\n const key = raw.replace(/[^a-z]/gi, '').toLowerCase();\n\n const REGISTRY: Record<string, string> = {\n topic: 'topicId',\n topicid: 'topicId',\n token: 'tokenId',\n tokenid: 'tokenId',\n account: 'accountId',\n accountid: 'accountId',\n contract: 'contractId',\n contractid: 'contractId',\n file: 'fileId',\n fileid: 'fileId',\n schedule: 'scheduleId',\n scheduleid: 'scheduleId',\n };\n\n if (Object.prototype.hasOwnProperty.call(REGISTRY, key)) {\n return REGISTRY[key];\n }\n\n if (/^[a-z]+Id$/.test(raw)) {\n return raw;\n }\n\n return raw;\n }\n\n /**\n * Resolve entity references from natural language queries\n * @param query - Search query (entity name or natural language reference)\n * @param options - Resolution options for filtering and fuzzy matching\n * @returns Array of matching entity associations\n */\n resolveEntityReference(\n query: string,\n options: EntityResolutionOptions = {}\n ): EntityAssociation[] {\n try {\n if (!query || typeof query !== 'string') {\n return [];\n }\n\n const sanitizedQuery = query.trim();\n if (sanitizedQuery.length === 0) {\n return [];\n }\n\n if (sanitizedQuery.length > 200) {\n }\n\n const { entityType, limit = 10, fuzzyMatch = true } = options;\n\n const safeLimit = Math.max(1, Math.min(limit || 10, 100));\n\n const isEntityIdQuery = /^0\\.0\\.\\d+$/.test(sanitizedQuery);\n\n const searchResults = this._contentStorage.searchMessages(\n sanitizedQuery.substring(0, 200),\n {\n caseSensitive: false,\n limit: safeLimit * 2,\n }\n );\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (\n content.includes(IS_ENTITY_ASSOCIATION_FLAG) ||\n content.includes('entityId')\n ) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n\n if (isEntityIdQuery) {\n if (parsed.entityId !== sanitizedQuery) {\n continue;\n }\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n\n if (fuzzyMatch && associations.length === 0 && !isEntityIdQuery) {\n const fuzzyQueries = [\n query.toLowerCase(),\n `token`,\n `account`,\n entityType || '',\n ].filter(Boolean);\n\n for (const fuzzyQuery of fuzzyQueries) {\n if (fuzzyQuery === query.toLowerCase()) continue;\n\n const fuzzyResults = this._contentStorage.searchMessages(fuzzyQuery, {\n caseSensitive: false,\n limit: limit,\n });\n\n for (const message of fuzzyResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n const uniqueAssociations = associations\n .filter(\n (assoc, index, arr) =>\n arr.findIndex((a) => a.entityId === assoc.entityId) === index\n )\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n const results = uniqueAssociations.slice(0, safeLimit);\n\n return results;\n } catch (error) {\n this.logger.error('Failed to resolve entity reference', {\n query,\n options,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Get all entity associations, optionally filtered by type\n * @param entityType - Optional filter by entity type\n * @returns Array of entity associations\n */\n getEntityAssociations(entityType?: string): EntityAssociation[] {\n try {\n const rawFilter = entityType ? entityType.trim() : undefined;\n const filterCanonical = rawFilter ? this.normalizeEntityType(rawFilter) : undefined;\n\n if (entityType && (!rawFilter || rawFilter.length === 0)) {\n return [];\n }\n\n const SEARCH_ANY_ENTITY = 'entityId';\n const searchQuery = filterCanonical || SEARCH_ANY_ENTITY;\n const searchResults = this._contentStorage.searchMessages(searchQuery, {\n caseSensitive: false,\n limit: 100,\n });\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (filterCanonical && parsed.entityType !== filterCanonical) {\n continue;\n }\n\n if (parsed.createdAt && typeof parsed.createdAt === 'string') {\n parsed.createdAt = new Date(parsed.createdAt);\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch (parseError) {\n this.logger.warn('Failed to parse entity association from message', {\n messageContent:\n typeof message.content === 'string'\n ? message.content.substring(0, 100)\n : 'non-string',\n error:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n });\n continue;\n }\n }\n\n // Merge duplicates by entityId, preferring the newest and one that carries transactionId\n const mergedById = new Map<string, EntityAssociation>();\n const getTime = (d: Date | string): number =>\n d instanceof Date ? d.getTime() : new Date(d).getTime();\n\n for (const assoc of associations) {\n const existing = mergedById.get(assoc.entityId);\n if (!existing) {\n mergedById.set(assoc.entityId, assoc);\n continue;\n }\n\n const existingTime = getTime(existing.createdAt);\n const currentTime = getTime(assoc.createdAt);\n\n const preferCurrent =\n currentTime > existingTime ||\n (!!assoc.transactionId && !existing.transactionId);\n\n if (preferCurrent) {\n mergedById.set(assoc.entityId, {\n ...existing,\n ...assoc,\n });\n }\n }\n\n const results = Array.from(mergedById.values()).sort((a, b) =>\n getTime(b.createdAt) - getTime(a.createdAt)\n );\n\n return results;\n } catch (error) {\n this.logger.error('Failed to get entity associations', {\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Clean up resources and dispose of components\n */\n dispose(): void {\n this.memoryWindow.dispose();\n this._contentStorage.dispose();\n this.tokenCounter.dispose();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index18.js","sources":["../../src/memory/smart-memory-manager.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { SystemMessage } from '@langchain/core/messages';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { MemoryWindow } from './memory-window';\nimport { ContentStorage } from './content-storage';\nimport { TokenCounter } from './token-counter';\n\n/**\n * Entity association for storing blockchain entity contexts\n */\nexport interface EntityAssociation {\n /** The blockchain entity ID (e.g., tokenId, accountId, topicId) */\n entityId: string;\n /** User-provided or derived friendly name */\n entityName: string;\n /** Type of entity (token, account, topic, schedule, etc.) */\n entityType: string;\n /** When the entity was created/associated */\n createdAt: Date;\n /** Transaction ID that created this entity */\n transactionId?: string;\n /** Optional session identifier to scope associations */\n sessionId?: string;\n}\n\n/**\n * Options for resolving entity references\n */\nexport interface EntityResolutionOptions {\n /** Filter by specific entity type */\n entityType?: string;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use fuzzy matching for natural language queries */\n fuzzyMatch?: boolean;\n}\n\n/**\n * Configuration for SmartMemoryManager\n */\nexport interface SmartMemoryConfig {\n /** Maximum tokens for active memory window */\n maxTokens?: number;\n /** Reserve tokens for response generation */\n reserveTokens?: number;\n /** Model name for token counting */\n modelName?: string;\n /** Maximum messages to store in content storage */\n storageLimit?: number;\n}\n\n/**\n * Search options for history search\n */\nexport interface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Memory statistics for active memory window\n */\nexport interface MemoryStats {\n /** Total active messages in memory window */\n totalActiveMessages: number;\n /** Current token count including system prompt */\n currentTokenCount: number;\n /** Maximum token capacity */\n maxTokens: number;\n /** Remaining token capacity */\n remainingCapacity: number;\n /** System prompt token count */\n systemPromptTokens: number;\n /** Memory usage percentage */\n usagePercentage: number;\n}\n\nconst IS_ENTITY_ASSOCIATION_FLAG = '\"isEntityAssociation\":true';\n\n/**\n * TODO: investigate using chroma / rag for long term memory\n * Smart memory manager that combines active memory window with long-term storage\n * Provides context-aware memory management with automatic pruning and searchable history\n */\nexport class SmartMemoryManager {\n private memoryWindow: MemoryWindow;\n private _contentStorage: ContentStorage;\n private tokenCounter: TokenCounter;\n private config: Required<SmartMemoryConfig>;\n private logger: Logger;\n\n private static readonly DEFAULT_CONFIG: Required<SmartMemoryConfig> = {\n maxTokens: 8000,\n reserveTokens: 1000,\n modelName: 'gpt-4o',\n storageLimit: 1000,\n };\n\n constructor(config: SmartMemoryConfig = {}) {\n this.config = { ...SmartMemoryManager.DEFAULT_CONFIG, ...config };\n this.logger = new Logger({ module: 'SmartMemoryManager' });\n\n this.tokenCounter = new TokenCounter(this.config.modelName);\n this._contentStorage = new ContentStorage(this.config.storageLimit);\n this.memoryWindow = new MemoryWindow(\n this.config.maxTokens,\n this.config.reserveTokens,\n this.tokenCounter\n );\n }\n\n /**\n * Get the content storage instance for file/content reference operations\n * @returns ContentStorage instance\n */\n get contentStorage(): ContentStorage {\n return this._contentStorage;\n }\n\n /**\n * Add a message to the active memory window\n * Automatically handles pruning and storage of displaced messages\n * @param message - Message to add\n */\n addMessage(message: BaseMessage): void {\n const result = this.memoryWindow.addMessage(message);\n\n if (result.prunedMessages.length > 0) {\n this._contentStorage.storeMessages(result.prunedMessages);\n }\n }\n\n /**\n * Get all active messages from the memory window\n * @returns Array of active messages in chronological order\n */\n getMessages(): BaseMessage[] {\n return this.memoryWindow.getMessages();\n }\n\n /**\n * Clear active memory window\n * @param clearStorage - Whether to also clear the content storage (default: false)\n */\n clear(clearStorage: boolean = false): void {\n this.memoryWindow.clear();\n\n if (clearStorage) {\n this._contentStorage.clear();\n }\n }\n\n /**\n * Set the system prompt for the memory window\n * @param systemPrompt - System prompt text\n */\n setSystemPrompt(systemPrompt: string): void {\n this.memoryWindow.setSystemPrompt(systemPrompt);\n }\n\n /**\n * Get the current system prompt\n * @returns Current system prompt text\n */\n getSystemPrompt(): string {\n return this.memoryWindow.getSystemPrompt();\n }\n\n /**\n * Search through stored message history\n * @param query - Search term or pattern\n * @param options - Search configuration\n * @returns Array of matching messages from history\n */\n searchHistory(query: string, options: SearchOptions = {}): BaseMessage[] {\n return this._contentStorage.searchMessages(query, options);\n }\n\n /**\n * Get recent messages from storage history\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages from storage\n */\n getRecentHistory(count: number): BaseMessage[] {\n return this._contentStorage.getRecentMessages(count);\n }\n\n /**\n * Check if a message can be added without exceeding limits\n * @param message - Message to test\n * @returns True if message can be added\n */\n canAddMessage(message: BaseMessage): boolean {\n return this.memoryWindow.canAddMessage(message);\n }\n\n /**\n * Get statistics about the active memory window\n * @returns Memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n const windowStats = this.memoryWindow.getStats();\n\n return {\n totalActiveMessages: windowStats.totalMessages,\n currentTokenCount: windowStats.currentTokens,\n maxTokens: windowStats.maxTokens,\n remainingCapacity: windowStats.remainingCapacity,\n systemPromptTokens: windowStats.systemPromptTokens,\n usagePercentage: windowStats.usagePercentage,\n };\n }\n\n /**\n * Get statistics about the content storage\n * @returns Storage usage statistics\n */\n getStorageStats(): ReturnType<ContentStorage['getStorageStats']> {\n return this._contentStorage.getStorageStats();\n }\n\n /**\n * Get combined statistics for both active memory and storage\n * @returns Combined memory and storage statistics\n */\n getOverallStats(): {\n activeMemory: MemoryStats;\n storage: ReturnType<ContentStorage['getStorageStats']>;\n totalMessagesManaged: number;\n activeMemoryUtilization: number;\n storageUtilization: number;\n } {\n const memoryStats = this.getMemoryStats();\n const storageStats = this.getStorageStats();\n\n return {\n activeMemory: memoryStats,\n storage: storageStats,\n totalMessagesManaged:\n memoryStats.totalActiveMessages + storageStats.totalMessages,\n activeMemoryUtilization: memoryStats.usagePercentage,\n storageUtilization: storageStats.usagePercentage,\n };\n }\n\n /**\n * Update the configuration and apply changes\n * @param newConfig - New configuration options\n */\n updateConfig(newConfig: Partial<SmartMemoryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (\n newConfig.maxTokens !== undefined ||\n newConfig.reserveTokens !== undefined\n ) {\n this.memoryWindow.updateLimits(\n this.config.maxTokens,\n this.config.reserveTokens\n );\n }\n\n if (newConfig.storageLimit !== undefined) {\n this._contentStorage.updateStorageLimit(this.config.storageLimit);\n }\n }\n\n /**\n * Get current configuration\n * @returns Current configuration settings\n */\n getConfig(): Required<SmartMemoryConfig> {\n return { ...this.config };\n }\n\n /**\n * Get messages from storage within a time range\n * @param startTime - Start of time range\n * @param endTime - End of time range\n * @returns Messages within the specified time range\n */\n getHistoryFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n return this._contentStorage.getMessagesFromTimeRange(startTime, endTime);\n }\n\n /**\n * Get messages from storage by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Messages of the specified type\n */\n getHistoryByType(messageType: string, limit?: number): BaseMessage[] {\n return this._contentStorage.getMessagesByType(messageType, limit);\n }\n\n /**\n * Get recent messages from storage within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Messages from the last N minutes\n */\n getRecentHistoryByTime(minutes: number): BaseMessage[] {\n return this._contentStorage.getRecentMessagesByTime(minutes);\n }\n\n /**\n * Export the current state for persistence or analysis\n * @returns Serializable representation of memory state\n */\n exportState(): {\n config: Required<SmartMemoryConfig>;\n activeMessages: Array<{ content: unknown; type: string }>;\n systemPrompt: string;\n memoryStats: MemoryStats;\n storageStats: ReturnType<ContentStorage['getStorageStats']>;\n storedMessages: ReturnType<ContentStorage['exportMessages']>;\n } {\n return {\n config: this.config,\n activeMessages: this.memoryWindow.getMessages().map((msg) => ({\n content: msg.content,\n type: msg._getType(),\n })),\n systemPrompt: this.memoryWindow.getSystemPrompt(),\n memoryStats: this.getMemoryStats(),\n storageStats: this.getStorageStats(),\n storedMessages: this._contentStorage.exportMessages(),\n };\n }\n\n /**\n * Get a summary of conversation context for external use\n * Useful for providing context to other systems or for logging\n * @param includeStoredContext - Whether to include recent stored messages\n * @returns Context summary object\n */\n getContextSummary(includeStoredContext: boolean = false): {\n activeMessageCount: number;\n systemPrompt: string;\n recentMessages: BaseMessage[];\n memoryUtilization: number;\n hasStoredHistory: boolean;\n recentStoredMessages?: BaseMessage[];\n storageStats?: ReturnType<ContentStorage['getStorageStats']>;\n } {\n const activeMessages = this.getMessages();\n const summary = {\n activeMessageCount: activeMessages.length,\n systemPrompt: this.getSystemPrompt(),\n recentMessages: activeMessages.slice(-5),\n memoryUtilization: this.getMemoryStats().usagePercentage,\n hasStoredHistory: this.getStorageStats().totalMessages > 0,\n };\n\n if (includeStoredContext) {\n return {\n ...summary,\n recentStoredMessages: this.getRecentHistory(10),\n storageStats: this.getStorageStats(),\n };\n }\n\n return summary;\n }\n\n /**\n * Perform maintenance operations\n * Optimizes storage and cleans up resources\n */\n performMaintenance(): void {}\n\n /**\n * Store an entity association for later resolution\n * @param entityId - The blockchain entity ID\n * @param entityName - User-provided or derived friendly name\n * @param entityType - Type of entity (token, account, topic, etc.)\n * @param transactionId - Optional transaction ID that created this entity\n */\n storeEntityAssociation(\n entityId: string,\n entityName: string,\n entityType: string,\n transactionId?: string,\n sessionId?: string\n ): void {\n try {\n if (\n !entityId ||\n typeof entityId !== 'string' ||\n entityId.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityName ||\n typeof entityName !== 'string' ||\n entityName.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityType ||\n typeof entityType !== 'string' ||\n entityType.trim().length === 0\n ) {\n return;\n }\n\n const sanitizedEntityId = entityId.trim();\n const sanitizedEntityName = entityName.trim().substring(0, 100);\n const sanitizedEntityType = this.normalizeEntityType(entityType);\n\n let usageHint = '';\n if (sanitizedEntityType === 'tokenid') {\n usageHint = 'Use this as tokenId for HTS operations';\n } else if (sanitizedEntityType === 'topicid') {\n usageHint =\n 'Can be used for HCS operations, HRLs for minting with the format hcs://1/<topicId>, etc.';\n } else if (sanitizedEntityType === 'accountid') {\n usageHint = 'Can be used for account based operations';\n }\n\n const association: EntityAssociation & {\n isEntityAssociation: boolean;\n usage?: string;\n hrl?: string;\n } = {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n createdAt: new Date(),\n isEntityAssociation: true,\n ...(usageHint ? { usage: usageHint } : {}),\n ...(sanitizedEntityType === 'topicId'\n ? { hrl: `hcs://1/${sanitizedEntityId}` }\n : {}),\n ...(transactionId !== undefined &&\n transactionId !== null &&\n transactionId.trim() !== ''\n ? { transactionId: transactionId.trim() }\n : {}),\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n };\n\n const content = JSON.stringify(association);\n type LangChainLikeMessage = {\n _getType: () => string;\n content: unknown;\n id: string;\n name?: string;\n additional_kwargs?: Record<string, unknown>;\n };\n\n const entityMessage: LangChainLikeMessage = {\n _getType: () => 'system',\n content: content,\n id: `entity_${sanitizedEntityId}_${Date.now()}`,\n name: 'entity_association',\n additional_kwargs: {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n isEntityAssociation: true,\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n },\n };\n\n try {\n this.memoryWindow.addMessage(new SystemMessage(content));\n } catch {}\n\n this._contentStorage.storeMessages([entityMessage as BaseMessage]);\n } catch (error) {\n this.logger.error('Failed to store entity association', {\n entityId,\n entityName,\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Normalize various type aliases to canonical EntityFormat strings using a registry.\n */\n private normalizeEntityType(input: string): string {\n const raw = (input || '').trim();\n if (raw.length === 0) {\n return '';\n }\n\n const key = raw.replace(/[^a-z]/gi, '').toLowerCase();\n\n const REGISTRY: Record<string, string> = {\n topic: 'topicId',\n topicid: 'topicId',\n token: 'tokenId',\n tokenid: 'tokenId',\n account: 'accountId',\n accountid: 'accountId',\n contract: 'contractId',\n contractid: 'contractId',\n file: 'fileId',\n fileid: 'fileId',\n schedule: 'scheduleId',\n scheduleid: 'scheduleId',\n };\n\n if (Object.prototype.hasOwnProperty.call(REGISTRY, key)) {\n return REGISTRY[key];\n }\n\n if (/^[a-z]+Id$/.test(raw)) {\n return raw;\n }\n\n return raw;\n }\n\n /**\n * Resolve entity references from natural language queries\n * @param query - Search query (entity name or natural language reference)\n * @param options - Resolution options for filtering and fuzzy matching\n * @returns Array of matching entity associations\n */\n resolveEntityReference(\n query: string,\n options: EntityResolutionOptions = {}\n ): EntityAssociation[] {\n try {\n if (!query || typeof query !== 'string') {\n return [];\n }\n\n const sanitizedQuery = query.trim();\n if (sanitizedQuery.length === 0) {\n return [];\n }\n\n if (sanitizedQuery.length > 200) {\n }\n\n const { entityType, limit = 10, fuzzyMatch = true } = options;\n\n const safeLimit = Math.max(1, Math.min(limit || 10, 100));\n\n const isEntityIdQuery = /^0\\.0\\.\\d+$/.test(sanitizedQuery);\n\n const searchResults = this._contentStorage.searchMessages(\n sanitizedQuery.substring(0, 200),\n {\n caseSensitive: false,\n limit: safeLimit * 2,\n }\n );\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (\n content.includes(IS_ENTITY_ASSOCIATION_FLAG) ||\n content.includes('entityId')\n ) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n\n if (isEntityIdQuery) {\n if (parsed.entityId !== sanitizedQuery) {\n continue;\n }\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n\n if (fuzzyMatch && associations.length === 0 && !isEntityIdQuery) {\n const fuzzyQueries = [\n query.toLowerCase(),\n `token`,\n `account`,\n entityType || '',\n ].filter(Boolean);\n\n for (const fuzzyQuery of fuzzyQueries) {\n if (fuzzyQuery === query.toLowerCase()) continue;\n\n const fuzzyResults = this._contentStorage.searchMessages(fuzzyQuery, {\n caseSensitive: false,\n limit: limit,\n });\n\n for (const message of fuzzyResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n const uniqueAssociations = associations\n .filter(\n (assoc, index, arr) =>\n arr.findIndex((a) => a.entityId === assoc.entityId) === index\n )\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n const results = uniqueAssociations.slice(0, safeLimit);\n\n return results;\n } catch (error) {\n this.logger.error('Failed to resolve entity reference', {\n query,\n options,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Get all entity associations, optionally filtered by type\n * @param entityType - Optional filter by entity type\n * @returns Array of entity associations\n */\n getEntityAssociations(entityType?: string): EntityAssociation[] {\n try {\n const rawFilter = entityType ? entityType.trim() : undefined;\n const filterCanonical = rawFilter ? this.normalizeEntityType(rawFilter) : undefined;\n\n if (entityType && (!rawFilter || rawFilter.length === 0)) {\n return [];\n }\n\n const SEARCH_ANY_ENTITY = 'entityId';\n const searchQuery = filterCanonical || SEARCH_ANY_ENTITY;\n const searchResults = this._contentStorage.searchMessages(searchQuery, {\n caseSensitive: false,\n limit: 100,\n });\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (filterCanonical && parsed.entityType !== filterCanonical) {\n continue;\n }\n\n if (parsed.createdAt && typeof parsed.createdAt === 'string') {\n parsed.createdAt = new Date(parsed.createdAt);\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch (parseError) {\n this.logger.warn('Failed to parse entity association from message', {\n messageContent:\n typeof message.content === 'string'\n ? message.content.substring(0, 100)\n : 'non-string',\n error:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n });\n continue;\n }\n }\n\n const mergedById = new Map<string, EntityAssociation>();\n const getTime = (d: Date | string): number =>\n d instanceof Date ? d.getTime() : new Date(d).getTime();\n\n for (const assoc of associations) {\n const existing = mergedById.get(assoc.entityId);\n if (!existing) {\n mergedById.set(assoc.entityId, assoc);\n continue;\n }\n\n const existingTime = getTime(existing.createdAt);\n const currentTime = getTime(assoc.createdAt);\n\n const preferCurrent =\n currentTime > existingTime ||\n (!!assoc.transactionId && !existing.transactionId);\n\n if (preferCurrent) {\n mergedById.set(assoc.entityId, {\n ...existing,\n ...assoc,\n });\n }\n }\n\n const results = Array.from(mergedById.values()).sort((a, b) =>\n getTime(b.createdAt) - getTime(a.createdAt)\n );\n\n return results;\n } catch (error) {\n this.logger.error('Failed to get entity associations', {\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Clean up resources and dispose of components\n */\n dispose(): void {\n this.memoryWindow.dispose();\n this._contentStorage.dispose();\n this.tokenCounter.dispose();\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/index2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\nimport { HCS10Client } from '@hashgraphonline/standards-sdk';\n\ninterface HCS10ClientManager {\n initializeConnectionsManager(client: HCS10Client): void;\n}\n\n/**\n * Extracts private key string from operator key\n */\nfunction extractPrivateKey(opKey: unknown): string {\n const key = opKey as {\n toString?: () => string;\n toStringRaw?: () => string;\n };\n \n if (typeof key?.toStringRaw === 'function') {\n return key.toStringRaw();\n }\n \n if (typeof key?.toString === 'function') {\n return key.toString();\n }\n \n return String(key);\n}\n\nfunction hasInitializeConnectionsManager(\n stateManager: IStateManager\n): stateManager is IStateManager & HCS10ClientManager {\n return (\n typeof stateManager === 'object' &&\n stateManager !== null &&\n 'initializeConnectionsManager' in stateManager &&\n typeof stateManager.initializeConnectionsManager === 'function'\n );\n}\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: any[] = [];\n appConfig?: Record<string, unknown>;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) ||\n (context.config.stateManager as IStateManager) ||\n (this.appConfig?.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n const accountId = hederaKit.signer.getAccountId().toString();\n const isBytesMode = String(hederaKit.operationalMode || 'returnBytes') === 'returnBytes';\n let inboundTopicId = '';\n let outboundTopicId = '';\n\n if (!isBytesMode) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n const profileResponse = await hcs10Client.retrieveProfile(accountId);\n if (profileResponse.success && profileResponse.topicInfo) {\n inboundTopicId = profileResponse.topicInfo.inboundTopic;\n outboundTopicId = profileResponse.topicInfo.outboundTopic;\n }\n } catch (profileError) {\n this.context.logger.warn('Skipping profile topic discovery', profileError);\n }\n }\n\n const agentRecord: Record<string, unknown> = {\n name: `Agent ${accountId}`,\n accountId: accountId,\n inboundTopicId,\n outboundTopicId,\n };\n if (!isBytesMode) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n agentRecord.privateKey = extractPrivateKey(opKey);\n } catch {}\n }\n this.stateManager.setCurrentAgent(agentRecord as any);\n\n this.context.logger.info(\n `Set current agent: ${accountId} with topics ${inboundTopicId}/${outboundTopicId}`\n );\n\n if (!isBytesMode && this.stateManager && !this.stateManager.getConnectionsManager()) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n if (hasInitializeConnectionsManager(this.stateManager)) {\n this.stateManager.initializeConnectionsManager(hcs10Client);\n } else {\n this.context.logger.warn('StateManager does not support connection manager initialization');\n }\n this.context.logger.info(\n 'ConnectionsManager initialized in HCS10Plugin'\n );\n } catch (cmError) {\n this.context.logger.warn('Could not initialize ConnectionsManager:', cmError);\n }\n }\n\n // Always initialize HCS-10 tools, even in bytes mode. Some operations may execute directly\n // when returnBytes/provideBytes is active; that is acceptable and preferred over disabling.\n this.initializeTools();\n this.context.logger.info('HCS-10 Plugin initialized successfully');\n } catch (error) {\n this.context.logger.error('Failed to initialize HCS-10 plugin:', error);\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info('HCS-10 Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":";;;AA+BA,SAAS,kBAAkB,OAAwB;AACjD,QAAM,MAAM;AAKZ,MAAI,OAAO,KAAK,gBAAgB,YAAY;AAC1C,WAAO,IAAI,YAAA;AAAA,EACb;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY;AACvC,WAAO,IAAI,SAAA;AAAA,EACb;AAEA,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,gCACP,cACoD;AACpD,SACE,OAAO,iBAAiB,YACxB,iBAAiB,QACjB,kCAAkC,gBAClC,OAAO,aAAa,iCAAiC;AAEzD;AAEO,MAAM,oBAAoB,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAGZ,SAAQ,QAAe,CAAA;AAAA,EAAC;AAAA,EAGxB,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,eACF,QAAQ,gBACR,QAAQ,OAAO,gBACf,KAAK,WAAW,gBACjB,IAAI,gBAAA;AAEN,YAAM,YAAY,UAAU,OAAO,aAAA,EAAe,SAAA;AAClD,YAAM,cAAc,OAAO,UAAU,mBAAmB,aAAa,MAAM;AAC3E,UAAI,iBAAiB;AACrB,UAAI,kBAAkB;AAEtB,UAAI,CAAC,aAAa;AAChB,YAAI;AACF,gBAAM,QAAQ,UAAU,OAAO,sBAAA;AAC/B,gBAAM,aAAa,kBAAkB,KAAK;AAE1C,gBAAM,cAAc,IAAI,YAAY;AAAA,YAClC,SAAS,UAAU;AAAA,YACnB,YAAY;AAAA,YACZ,oBAAoB;AAAA,YACpB,UAAU;AAAA,UAAA,CACX;AAED,gBAAM,kBAAkB,MAAM,YAAY,gBAAgB,SAAS;AACnE,cAAI,gBAAgB,WAAW,gBAAgB,WAAW;AACxD,6BAAiB,gBAAgB,UAAU;AAC3C,8BAAkB,gBAAgB,UAAU;AAAA,UAC9C;AAAA,QACF,SAAS,cAAc;AACrB,eAAK,QAAQ,OAAO,KAAK,oCAAoC,YAAY;AAAA,QAC3E;AAAA,MACF;AAEA,YAAM,cAAuC;AAAA,QAC3C,MAAM,SAAS,SAAS;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,CAAC,aAAa;AAChB,YAAI;AACF,gBAAM,QAAQ,UAAU,OAAO,sBAAA;AAC/B,sBAAY,aAAa,kBAAkB,KAAK;AAAA,QAClD,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,WAAK,aAAa,gBAAgB,WAAkB;AAEpD,WAAK,QAAQ,OAAO;AAAA,QAClB,sBAAsB,SAAS,gBAAgB,cAAc,IAAI,eAAe;AAAA,MAAA;AAGlF,UAAI,CAAC,eAAe,KAAK,gBAAgB,CAAC,KAAK,aAAa,yBAAyB;AACnF,YAAI;AACF,gBAAM,QAAQ,UAAU,OAAO,sBAAA;AAC/B,gBAAM,aAAa,kBAAkB,KAAK;AAC1C,gBAAM,cAAc,IAAI,YAAY;AAAA,YAClC,SAAS,UAAU;AAAA,YACnB,YAAY;AAAA,YACZ,oBAAoB;AAAA,YACpB,UAAU;AAAA,UAAA,CACX;AAED,cAAI,gCAAgC,KAAK,YAAY,GAAG;AACtD,iBAAK,aAAa,6BAA6B,WAAW;AAAA,UAC5D,OAAO;AACL,iBAAK,QAAQ,OAAO,KAAK,iEAAiE;AAAA,UAC5F;AACA,eAAK,QAAQ,OAAO;AAAA,YAClB;AAAA,UAAA;AAAA,QAEJ,SAAS,SAAS;AAChB,eAAK,QAAQ,OAAO,KAAK,4CAA4C,OAAO;AAAA,QAC9E;AAAA,MACF;AAIA,WAAK,gBAAA;AACL,WAAK,QAAQ,OAAO,KAAK,wCAAwC;AAAA,IACnE,SAAS,OAAO;AACd,WAAK,QAAQ,OAAO,MAAM,uCAAuC,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,eAAe,IAAI,aAAa,WAAW,KAAK,YAAY;AAElE,SAAK,QAAQ;AAAA,MACX,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,sBAAsB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,uBAAuB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,4BAA4B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,sBAAsB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,6BAA6B;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,4BAA4B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,qCAAqC;AAAA,QACvC;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,WAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA6C;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAe,UAAyB;AACtC,SAAK,QAAQ,CAAA;AACb,WAAO,KAAK;AACZ,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,QAAQ,OAAO,KAAK,0BAA0B;AAAA,IACrD;AAAA,EACF;AACF;"}
|
|
1
|
+
{"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\nimport { HCS10Client } from '@hashgraphonline/standards-sdk';\n\ninterface HCS10ClientManager {\n initializeConnectionsManager(client: HCS10Client): void;\n}\n\n/**\n * Extracts private key string from operator key\n */\nfunction extractPrivateKey(opKey: unknown): string {\n const key = opKey as {\n toString?: () => string;\n toStringRaw?: () => string;\n };\n \n if (typeof key?.toStringRaw === 'function') {\n return key.toStringRaw();\n }\n \n if (typeof key?.toString === 'function') {\n return key.toString();\n }\n \n return String(key);\n}\n\nfunction hasInitializeConnectionsManager(\n stateManager: IStateManager\n): stateManager is IStateManager & HCS10ClientManager {\n return (\n typeof stateManager === 'object' &&\n stateManager !== null &&\n 'initializeConnectionsManager' in stateManager &&\n typeof stateManager.initializeConnectionsManager === 'function'\n );\n}\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: any[] = [];\n appConfig?: Record<string, unknown>;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) ||\n (context.config.stateManager as IStateManager) ||\n (this.appConfig?.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n const accountId = hederaKit.signer.getAccountId().toString();\n const isBytesMode = String(hederaKit.operationalMode || 'returnBytes') === 'returnBytes';\n let inboundTopicId = '';\n let outboundTopicId = '';\n\n if (!isBytesMode) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n const profileResponse = await hcs10Client.retrieveProfile(accountId);\n if (profileResponse.success && profileResponse.topicInfo) {\n inboundTopicId = profileResponse.topicInfo.inboundTopic;\n outboundTopicId = profileResponse.topicInfo.outboundTopic;\n }\n } catch (profileError) {\n this.context.logger.warn('Skipping profile topic discovery', profileError);\n }\n }\n\n const agentRecord: Record<string, unknown> = {\n name: `Agent ${accountId}`,\n accountId: accountId,\n inboundTopicId,\n outboundTopicId,\n };\n if (!isBytesMode) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n agentRecord.privateKey = extractPrivateKey(opKey);\n } catch {}\n }\n this.stateManager.setCurrentAgent(agentRecord as any);\n\n this.context.logger.info(\n `Set current agent: ${accountId} with topics ${inboundTopicId}/${outboundTopicId}`\n );\n\n if (!isBytesMode && this.stateManager && !this.stateManager.getConnectionsManager()) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n if (hasInitializeConnectionsManager(this.stateManager)) {\n this.stateManager.initializeConnectionsManager(hcs10Client);\n } else {\n this.context.logger.warn('StateManager does not support connection manager initialization');\n }\n this.context.logger.info(\n 'ConnectionsManager initialized in HCS10Plugin'\n );\n } catch (cmError) {\n this.context.logger.warn('Could not initialize ConnectionsManager:', cmError);\n }\n }\n\n this.initializeTools();\n this.context.logger.info('HCS-10 Plugin initialized successfully');\n } catch (error) {\n this.context.logger.error('Failed to initialize HCS-10 plugin:', error);\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info('HCS-10 Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/index23.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChatOpenAI } from "@langchain/openai";
|
|
2
2
|
import { Logger } from "@hashgraphonline/standards-sdk";
|
|
3
|
-
import { ENTITY_PATTERNS } from "./
|
|
3
|
+
import { ENTITY_PATTERNS } from "./index42.js";
|
|
4
4
|
import "hedera-agent-kit";
|
|
5
5
|
import "@hashgraphonline/standards-agent-kit";
|
|
6
6
|
import "./index13.js";
|
package/dist/esm/index3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","sources":["../../src/plugins/hcs-2/HCS2Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n HCS2Builder,\n CreateRegistryTool,\n RegisterEntryTool,\n UpdateEntryTool,\n DeleteEntryTool,\n MigrateRegistryTool,\n QueryRegistryTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing HCS-2 registry management tools\n */\nexport class HCS2Plugin extends BasePlugin {\n id = 'hcs-2';\n name = 'HCS-2 Plugin';\n description =\n 'HCS-2 registry management tools for decentralized registries on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs2';\n\n private tools: any[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-2 tools will not be available.'\n );\n return;\n }\n\n try {\n
|
|
1
|
+
{"version":3,"file":"index3.js","sources":["../../src/plugins/hcs-2/HCS2Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n HCS2Builder,\n CreateRegistryTool,\n RegisterEntryTool,\n UpdateEntryTool,\n DeleteEntryTool,\n MigrateRegistryTool,\n QueryRegistryTool,\n} from '@hashgraphonline/standards-agent-kit';\n\n/**\n * Plugin providing HCS-2 registry management tools\n */\nexport class HCS2Plugin extends BasePlugin {\n id = 'hcs-2';\n name = 'HCS-2 Plugin';\n description =\n 'HCS-2 registry management tools for decentralized registries on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs2';\n\n private tools: any[] = [];\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-2 tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n this.context.logger.info(\n 'HCS-2 Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize HCS-2 plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs2Builder = new HCS2Builder(hederaKit);\n\n this.tools = [\n new CreateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new RegisterEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new UpdateEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new DeleteEntryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new MigrateRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n new QueryRegistryTool({\n hederaKit: hederaKit,\n hcs2Builder: hcs2Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.context?.logger) {\n this.context.logger.info('HCS-2 Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":";;AAmBO,MAAM,mBAAmB,WAAW;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAEZ,SAAQ,QAAe,CAAA;AAAA,EAAC;AAAA,EAExB,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,gBAAA;AAEL,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,cAAc,IAAI,YAAY,SAAS;AAE7C,SAAK,QAAQ;AAAA,MACX,IAAI,mBAAmB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,kBAAkB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,WAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAe,UAAyB;AACtC,SAAK,QAAQ,CAAA;AACb,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,QAAQ,OAAO,KAAK,yBAAyB;AAAA,IACpD;AAAA,EACF;AACF;"}
|
package/dist/esm/index33.js
CHANGED
|
@@ -8,11 +8,11 @@ import { MCPClientManager } from "./index15.js";
|
|
|
8
8
|
import { convertMCPToolToLangChain } from "./index17.js";
|
|
9
9
|
import { SmartMemoryManager } from "./index18.js";
|
|
10
10
|
import { ResponseFormatter } from "./index35.js";
|
|
11
|
-
import { ERROR_MESSAGES } from "./
|
|
12
|
-
import "./
|
|
11
|
+
import { ERROR_MESSAGES } from "./index41.js";
|
|
12
|
+
import "./index42.js";
|
|
13
13
|
import { SystemMessage, AIMessage, HumanMessage } from "@langchain/core/messages";
|
|
14
|
-
import { ToolRegistry } from "./
|
|
15
|
-
import { ExecutionPipeline } from "./
|
|
14
|
+
import { ToolRegistry } from "./index43.js";
|
|
15
|
+
import { ExecutionPipeline } from "./index44.js";
|
|
16
16
|
import { FormEngine } from "./index11.js";
|
|
17
17
|
function hasHashLinkBlock(metadata) {
|
|
18
18
|
if (!metadata || typeof metadata !== "object") {
|
package/dist/esm/index36.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index36.js","sources":["../../src/runtime/wallet-bridge.ts"],"sourcesContent":["export type WalletNetwork = 'mainnet' | 'testnet';\n\nexport interface WalletStatus {\n connected: boolean;\n accountId?: string;\n network?: WalletNetwork;\n}\n\nexport interface WalletExecutorResult {\n transactionId: string;\n}\n\nexport interface StartInscriptionResult {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface WalletBridgeProvider {\n status: () => Promise<WalletStatus> | WalletStatus;\n executeBytes: (\n base64: string,\n network: WalletNetwork\n ) => Promise<WalletExecutorResult>;\n startInscription?: (\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<StartInscriptionResult>;\n}\n\nlet providerRef: WalletBridgeProvider | null = null;\n\nexport function setWalletBridgeProvider(provider: WalletBridgeProvider): void {\n providerRef = provider;\n}\n\nexport function getWalletBridgeProvider(): WalletBridgeProvider | null {\n return providerRef;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index36.js","sources":["../../src/runtime/wallet-bridge.ts"],"sourcesContent":["export type WalletNetwork = 'mainnet' | 'testnet';\n\nexport interface WalletStatus {\n connected: boolean;\n accountId?: string;\n network?: WalletNetwork;\n}\n\nexport interface WalletExecutorResult {\n transactionId: string;\n}\n\nexport interface StartInscriptionResult {\n transactionBytes: string;\n tx_id?: string;\n topic_id?: string;\n status?: string;\n completed?: boolean;\n}\n\nexport interface WalletBridgeProvider {\n status: () => Promise<WalletStatus> | WalletStatus;\n executeBytes: (\n base64: string,\n network: WalletNetwork\n ) => Promise<WalletExecutorResult>;\n startInscription?: (\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<StartInscriptionResult>;\n startHCS?: (\n op: string,\n request: Record<string, unknown>,\n network: WalletNetwork\n ) => Promise<{ transactionBytes: string }>;\n}\n\nlet providerRef: WalletBridgeProvider | null = null;\n\nexport function setWalletBridgeProvider(provider: WalletBridgeProvider): void {\n providerRef = provider;\n}\n\nexport function getWalletBridgeProvider(): WalletBridgeProvider | null {\n return providerRef;\n}\n"],"names":[],"mappings":"AAqCA,IAAI,cAA2C;AAExC,SAAS,wBAAwB,UAAsC;AAC5E,gBAAc;AAChB;AAEO,SAAS,0BAAuD;AACrE,SAAO;AACT;"}
|
package/dist/esm/index39.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index39.js","sources":["../../src/signers/browser-signer.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n PrivateKey,\n PublicKey,\n Transaction,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { AbstractSigner } from 'hedera-agent-kit';\nimport {\n HederaMirrorNode,\n Logger,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * BrowserSigner (bytes-only)\n *\n * Minimal signer compatible with HederaAgentKit in bytes/Provide Bytes mode.\n * - Does NOT hold a private key\n * - Cannot execute transactions; only provides identity and network context\n * - getOperatorPrivateKey() throws to signal absence of a local key\n */\nexport class BrowserSigner extends AbstractSigner {\n private readonly account: AccountId;\n private readonly network: 'mainnet' | 'testnet';\n private readonly client: Client;\n private readonly exec: ((\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>) | null;\n private readonly ephemeralKey: PrivateKey;\n\n getAccountId(): AccountId {\n return this.account;\n }\n\n getNetwork(): 'mainnet' | 'testnet' {\n return this.network;\n }\n\n constructor(\n accountId: string,\n network: 'mainnet' | 'testnet',\n executor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ) {\n super();\n this.account = AccountId.fromString(accountId);\n this.network = network;\n this.client =\n network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n this.exec = executor ?? null;\n this.ephemeralKey = PrivateKey.generateED25519();\n }\n\n /**\n * Returns an auto-generated ED25519 key for client wiring only.\n * Do not use for signing; wallet performs signing in renderer.\n */\n getOperatorPrivateKey(): PrivateKey {\n return this.ephemeralKey;\n }\n\n getClient(): Client {\n return this.client;\n }\n\n async signAndExecuteTransaction(\n tx: Transaction\n ): Promise<TransactionReceipt> {\n if (!this.exec) {\n throw new Error('BrowserSigner executor not available');\n }\n if (!tx.isFrozen()) {\n await tx.freezeWith(this.client);\n }\n const base64 = Buffer.from(tx.toBytes()).toString('base64');\n const { transactionId } = await this.exec(base64, this.network);\n const mirror = new HederaMirrorNode(this.network);\n const deadline = Date.now() + 60000;\n while (Date.now() < deadline) {\n try {\n const details = await mirror.getTransaction(transactionId);\n if (details && details.result) {\n return TransactionReceipt.fromBytes(\n Buffer.from(details.result, 'base64')\n );\n }\n } catch {}\n await new Promise((r) => setTimeout(r, 1200));\n }\n return TransactionReceipt.fromBytes(Buffer.from(''));\n }\n\n override async getPublicKey(): Promise<PublicKey> {\n const network: NetworkType =\n this.network === 'mainnet' ? 'mainnet' : 'testnet';\n const mirror = new HederaMirrorNode(\n network,\n new Logger({ module: 'BrowserSigner' })\n );\n
|
|
1
|
+
{"version":3,"file":"index39.js","sources":["../../src/signers/browser-signer.ts"],"sourcesContent":["import {\n AccountId,\n Client,\n PrivateKey,\n PublicKey,\n Transaction,\n TransactionReceipt,\n} from '@hashgraph/sdk';\nimport { AbstractSigner } from 'hedera-agent-kit';\nimport {\n HederaMirrorNode,\n Logger,\n type NetworkType,\n} from '@hashgraphonline/standards-sdk';\n\n/**\n * BrowserSigner (bytes-only)\n *\n * Minimal signer compatible with HederaAgentKit in bytes/Provide Bytes mode.\n * - Does NOT hold a private key\n * - Cannot execute transactions; only provides identity and network context\n * - getOperatorPrivateKey() throws to signal absence of a local key\n */\nexport class BrowserSigner extends AbstractSigner {\n private readonly account: AccountId;\n private readonly network: 'mainnet' | 'testnet';\n private readonly client: Client;\n private readonly exec: ((\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>) | null;\n private readonly ephemeralKey: PrivateKey;\n\n getAccountId(): AccountId {\n return this.account;\n }\n\n getNetwork(): 'mainnet' | 'testnet' {\n return this.network;\n }\n\n constructor(\n accountId: string,\n network: 'mainnet' | 'testnet',\n executor?: (\n base64: string,\n network: 'mainnet' | 'testnet'\n ) => Promise<{ transactionId: string }>\n ) {\n super();\n this.account = AccountId.fromString(accountId);\n this.network = network;\n this.client =\n network === 'mainnet' ? Client.forMainnet() : Client.forTestnet();\n this.exec = executor ?? null;\n this.ephemeralKey = PrivateKey.generateED25519();\n }\n\n /**\n * Returns an auto-generated ED25519 key for client wiring only.\n * Do not use for signing; wallet performs signing in renderer.\n */\n getOperatorPrivateKey(): PrivateKey {\n return this.ephemeralKey;\n }\n\n getClient(): Client {\n return this.client;\n }\n\n async signAndExecuteTransaction(\n tx: Transaction\n ): Promise<TransactionReceipt> {\n if (!this.exec) {\n throw new Error('BrowserSigner executor not available');\n }\n if (!tx.isFrozen()) {\n await tx.freezeWith(this.client);\n }\n const base64 = Buffer.from(tx.toBytes()).toString('base64');\n const { transactionId } = await this.exec(base64, this.network);\n const mirror = new HederaMirrorNode(this.network);\n const deadline = Date.now() + 60000;\n while (Date.now() < deadline) {\n try {\n const details = await mirror.getTransaction(transactionId);\n if (details && details.result) {\n return TransactionReceipt.fromBytes(\n Buffer.from(details.result, 'base64')\n );\n }\n } catch {}\n await new Promise((r) => setTimeout(r, 1200));\n }\n return TransactionReceipt.fromBytes(Buffer.from(''));\n }\n\n override async getPublicKey(): Promise<PublicKey> {\n const network: NetworkType =\n this.network === 'mainnet' ? 'mainnet' : 'testnet';\n const mirror = new HederaMirrorNode(\n network,\n new Logger({ module: 'BrowserSigner' })\n );\n const anyKey: any = await mirror.getPublicKey(this.account.toString());\n const keyStr = typeof anyKey?.toString === 'function' ? anyKey.toString() : String(anyKey);\n return PublicKey.fromString(keyStr);\n }\n}\n\nexport default BrowserSigner;\n"],"names":[],"mappings":";;;AAuBO,MAAM,sBAAsB,eAAe;AAAA,EAUhD,eAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YACE,WACA,SACA,UAIA;AACA,UAAA;AACA,SAAK,UAAU,UAAU,WAAW,SAAS;AAC7C,SAAK,UAAU;AACf,SAAK,SACH,YAAY,YAAY,OAAO,WAAA,IAAe,OAAO,WAAA;AACvD,SAAK,OAAO,YAAY;AACxB,SAAK,eAAe,WAAW,gBAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,0BACJ,IAC6B;AAC7B,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,CAAC,GAAG,YAAY;AAClB,YAAM,GAAG,WAAW,KAAK,MAAM;AAAA,IACjC;AACA,UAAM,SAAS,OAAO,KAAK,GAAG,SAAS,EAAE,SAAS,QAAQ;AAC1D,UAAM,EAAE,kBAAkB,MAAM,KAAK,KAAK,QAAQ,KAAK,OAAO;AAC9D,UAAM,SAAS,IAAI,iBAAiB,KAAK,OAAO;AAChD,UAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAO,KAAK,IAAA,IAAQ,UAAU;AAC5B,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,eAAe,aAAa;AACzD,YAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAO,mBAAmB;AAAA,YACxB,OAAO,KAAK,QAAQ,QAAQ,QAAQ;AAAA,UAAA;AAAA,QAExC;AAAA,MACF,QAAQ;AAAA,MAAC;AACT,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAAA,IAC9C;AACA,WAAO,mBAAmB,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,EACrD;AAAA,EAEA,MAAe,eAAmC;AAChD,UAAM,UACJ,KAAK,YAAY,YAAY,YAAY;AAC3C,UAAM,SAAS,IAAI;AAAA,MACjB;AAAA,MACA,IAAI,OAAO,EAAE,QAAQ,iBAAiB;AAAA,IAAA;AAExC,UAAM,SAAc,MAAM,OAAO,aAAa,KAAK,QAAQ,UAAU;AACrE,UAAM,SAAS,OAAO,QAAQ,aAAa,aAAa,OAAO,SAAA,IAAa,OAAO,MAAM;AACzF,WAAO,UAAU,WAAW,MAAM;AAAA,EACpC;AACF;"}
|
package/dist/esm/index4.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index4.js","sources":["../../src/plugins/inscribe/InscribePlugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n InscriberBuilder,\n InscribeFromUrlTool,\n InscribeFromFileTool,\n InscribeFromBufferTool,\n InscribeHashinalTool,\n RetrieveInscriptionTool,\n} from '@hashgraphonline/standards-agent-kit';\nimport { fieldGuidanceRegistry, type FieldGuidance } from '../../forms/field-guidance-registry';\n\n/**\n * Plugin providing content inscription tools for Hedera\n */\nexport class InscribePlugin extends BasePlugin {\n id = 'inscribe';\n name = 'Inscribe Plugin';\n description =\n 'Content inscription tools for storing data on Hedera Consensus Service';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'inscribe';\n\n private tools: any[] = [];\n private providerId: string | null = null;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. Inscription tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n
|
|
1
|
+
{"version":3,"file":"index4.js","sources":["../../src/plugins/inscribe/InscribePlugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n InscriberBuilder,\n InscribeFromUrlTool,\n InscribeFromFileTool,\n InscribeFromBufferTool,\n InscribeHashinalTool,\n RetrieveInscriptionTool,\n} from '@hashgraphonline/standards-agent-kit';\nimport { fieldGuidanceRegistry, type FieldGuidance } from '../../forms/field-guidance-registry';\n\n/**\n * Plugin providing content inscription tools for Hedera\n */\nexport class InscribePlugin extends BasePlugin {\n id = 'inscribe';\n name = 'Inscribe Plugin';\n description =\n 'Content inscription tools for storing data on Hedera Consensus Service';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'inscribe';\n\n private tools: any[] = [];\n private providerId: string | null = null;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. Inscription tools will not be available.'\n );\n return;\n }\n\n try {\n this.initializeTools();\n\n try {\n const provider = {\n getFieldGuidance: (fieldName: string): FieldGuidance | null => {\n if (fieldName === 'name') {\n return {\n suggestions: [\n 'Sunset Landscape #42',\n 'Digital Abstract Art',\n ],\n contextualHelpText:\n 'Create a distinctive name that collectors will find appealing',\n };\n }\n if (fieldName === 'description') {\n return {\n fieldTypeOverride: 'textarea',\n suggestions: ['A beautiful piece representing...'],\n };\n }\n return null;\n },\n getGlobalGuidance: () => ({\n qualityStandards: [\n 'Use meaningful names that describe the artwork or content',\n ],\n }),\n };\n this.providerId = fieldGuidanceRegistry.registerToolProvider(\n /inscribe.*hashinal/i,\n provider,\n { id: 'inscribe:hashinal:provider', priority: 1 }\n );\n } catch (e) {\n this.context.logger.warn('Could not register Inscribe field guidance provider');\n }\n\n this.context.logger.info(\n 'Inscribe Plugin initialized successfully'\n );\n } catch (error) {\n this.context.logger.error(\n 'Failed to initialize Inscribe plugin:',\n error\n );\n }\n }\n\n private initializeTools(): void {\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const inscriberBuilder = new InscriberBuilder(hederaKit);\n\n this.tools = [\n new InscribeFromUrlTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromFileTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeFromBufferTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new InscribeHashinalTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n new RetrieveInscriptionTool({\n hederaKit: hederaKit,\n inscriberBuilder: inscriberBuilder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n if (this.providerId) {\n try {\n fieldGuidanceRegistry.unregisterProvider(this.providerId);\n } catch {}\n this.providerId = null;\n }\n if (this.context?.logger) {\n this.context.logger.info('Inscribe Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":";;;AAmBO,MAAM,uBAAuB,WAAW;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA;AACL,SAAA,KAAK;AACL,SAAA,OAAO;AACP,SAAA,cACE;AACF,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,YAAY;AAEZ,SAAQ,QAAe,CAAA;AACvB,SAAQ,aAA4B;AAAA,EAAA;AAAA,EAEpC,MAAe,WAAW,SAA8C;AACtE,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,CAAC,WAAW;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI;AACF,WAAK,gBAAA;AAEL,UAAI;AACF,cAAM,WAAW;AAAA,UACf,kBAAkB,CAAC,cAA4C;AAC7D,gBAAI,cAAc,QAAQ;AACxB,qBAAO;AAAA,gBACL,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAEF,oBACE;AAAA,cAAA;AAAA,YAEN;AACA,gBAAI,cAAc,eAAe;AAC/B,qBAAO;AAAA,gBACL,mBAAmB;AAAA,gBACnB,aAAa,CAAC,mCAAmC;AAAA,cAAA;AAAA,YAErD;AACA,mBAAO;AAAA,UACT;AAAA,UACA,mBAAmB,OAAO;AAAA,YACxB,kBAAkB;AAAA,cAChB;AAAA,YAAA;AAAA,UACF;AAAA,QACF;AAEF,aAAK,aAAa,sBAAsB;AAAA,UACtC;AAAA,UACA;AAAA,UACA,EAAE,IAAI,8BAA8B,UAAU,EAAA;AAAA,QAAE;AAAA,MAEpD,SAAS,GAAG;AACV,aAAK,QAAQ,OAAO,KAAK,qDAAqD;AAAA,MAChF;AAEA,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,mBAAmB,IAAI,iBAAiB,SAAS;AAEvD,SAAK,QAAQ;AAAA,MACX,IAAI,oBAAoB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,qBAAqB;AAAA,QACvB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,uBAAuB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,qBAAqB;AAAA,QACvB;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,MACD,IAAI,wBAAwB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,MAAA,CACtB;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,WAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAe,UAAyB;AACtC,SAAK,QAAQ,CAAA;AACb,QAAI,KAAK,YAAY;AACnB,UAAI;AACF,8BAAsB,mBAAmB,KAAK,UAAU;AAAA,MAC1D,QAAQ;AAAA,MAAC;AACT,WAAK,aAAa;AAAA,IACpB;AACA,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,QAAQ,OAAO,KAAK,4BAA4B;AAAA,IACvD;AAAA,EACF;AACF;"}
|
package/dist/esm/index41.js
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
TOKEN_REFERENCE: "the token"
|
|
1
|
+
const ERROR_MESSAGES = {
|
|
2
|
+
TOO_MANY_REQUESTS: "Too many requests. Please wait a moment and try again.",
|
|
3
|
+
RATE_LIMITED: "I'm receiving too many requests right now. Please wait a moment and try again."
|
|
5
4
|
};
|
|
6
|
-
({
|
|
7
|
-
TOPIC: EntityFormat.TOPIC_ID,
|
|
8
|
-
TOKEN: EntityFormat.TOKEN_ID,
|
|
9
|
-
ACCOUNT: EntityFormat.ACCOUNT_ID,
|
|
10
|
-
CONTRACT: EntityFormat.CONTRACT_ID
|
|
11
|
-
});
|
|
12
5
|
export {
|
|
13
|
-
|
|
6
|
+
ERROR_MESSAGES
|
|
14
7
|
};
|
|
15
8
|
//# sourceMappingURL=index41.js.map
|
package/dist/esm/index41.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index41.js","sources":["../../src/constants/
|
|
1
|
+
{"version":3,"file":"index41.js","sources":["../../src/constants/messages.ts"],"sourcesContent":["/**\n * Common error messages and user feedback strings\n */\nexport const ERROR_MESSAGES = {\n TOO_MANY_REQUESTS: 'Too many requests. Please wait a moment and try again.',\n RATE_LIMITED: \"I'm receiving too many requests right now. Please wait a moment and try again.\",\n SYSTEM_ERROR: 'System error occurred',\n INVALID_INPUT: 'Invalid input provided',\n NETWORK_ERROR: 'Network error occurred',\n} as const;\n\n/**\n * Common success and status messages\n */\nexport const STATUS_MESSAGES = {\n OPERATION_SUCCESSFUL: 'Operation completed successfully',\n PROCESSING: 'Processing your request...',\n READY: 'Ready to process requests',\n INITIALIZING: 'Initializing...',\n} as const;"],"names":[],"mappings":"AAGO,MAAM,iBAAiB;AAAA,EAC5B,mBAAmB;AAAA,EACnB,cAAc;AAIhB;"}
|
package/dist/esm/index42.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
EXPERT: "expert"
|
|
1
|
+
import { EntityFormat } from "./index26.js";
|
|
2
|
+
const ENTITY_PATTERNS = {
|
|
3
|
+
TOPIC_REFERENCE: "the topic",
|
|
4
|
+
TOKEN_REFERENCE: "the token"
|
|
6
5
|
};
|
|
6
|
+
({
|
|
7
|
+
TOPIC: EntityFormat.TOPIC_ID,
|
|
8
|
+
TOKEN: EntityFormat.TOKEN_ID,
|
|
9
|
+
ACCOUNT: EntityFormat.ACCOUNT_ID,
|
|
10
|
+
CONTRACT: EntityFormat.CONTRACT_ID
|
|
11
|
+
});
|
|
7
12
|
export {
|
|
8
|
-
|
|
13
|
+
ENTITY_PATTERNS
|
|
9
14
|
};
|
|
10
15
|
//# sourceMappingURL=index42.js.map
|
package/dist/esm/index42.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index42.js","sources":["../../src/constants/
|
|
1
|
+
{"version":3,"file":"index42.js","sources":["../../src/constants/entity-references.ts"],"sourcesContent":["/**\n * Common entity reference patterns used across the application\n */\nexport const ENTITY_PATTERNS = {\n TOPIC_REFERENCE: 'the topic',\n TOKEN_REFERENCE: 'the token',\n ACCOUNT_REFERENCE: 'the account',\n TRANSACTION_REFERENCE: 'the transaction',\n CONTRACT_REFERENCE: 'the contract',\n} as const;\n\n/**\n * Entity type identifiers\n */\nimport { EntityFormat } from '../services/formatters/types';\n\nexport const ENTITY_TYPES = {\n TOPIC: EntityFormat.TOPIC_ID,\n TOKEN: EntityFormat.TOKEN_ID,\n ACCOUNT: EntityFormat.ACCOUNT_ID,\n TRANSACTION: 'transaction',\n CONTRACT: EntityFormat.CONTRACT_ID,\n} as const;\n"],"names":[],"mappings":";AAGO,MAAM,kBAAkB;AAAA,EAC7B,iBAAiB;AAAA,EACjB,iBAAiB;AAInB;AAAA,CAO4B;AAAA,EAC1B,OAAO,aAAa;AAAA,EACpB,OAAO,aAAa;AAAA,EACpB,SAAS,aAAa;AAAA,EAEtB,UAAU,aAAa;AACzB;"}
|