UNPKG

mlld

Version:

mlld: llm scripting language

1 lines 19.9 kB
{"version":3,"sources":["../interpreter/eval/auto-unwrap-manager.ts"],"names":["asyncLocalStorage","AsyncLocalStorage","MetadataShelf","shelf","Map","singleFileMetadata","structuredShelf","WeakMap","storeMetadata","value","isStructuredValue","type","items","data","item","isLoadContentResult","getBucket","content","push","set","restoreMetadata","structuredRestored","restoreStructuredFromShelf","Array","isArray","restored","hasRestorable","restoredItem","shiftFromBucket","bucketMatch","original","process","env","MLLD_DEBUG","console","error","originalContent","substring","newContent","filename","get","undefined","text","computeStructuredText","wrapStructured","metadata","String","toString","prototype","JSON","stringify","map","join","clear","debugSnapshot","loadContentEntries","size","hasSingleFileMetadata","Boolean","structuredEntries","bucket","length","shift","delete","AutoUnwrapManager","unwrap","getStore","Error","internal","keepStructured","hasLoadContentResults","some","isLegacyLCR","isStructuredArray","shelfInContext","executeWithPreservation","fn","result","run","restore"],"mappings":"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","file":"chunk-QTYWAF2L.mjs","sourcesContent":["/**\n * Centralized manager for auto-unwrapping LoadContentResult objects\n * and preserving their metadata through JavaScript/Node execution.\n * \n * This implements a thread-local pattern using AsyncLocalStorage to handle\n * nested and concurrent executions safely.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { isLoadContentResult, LoadContentResult } from '@core/types/load-content';\nimport { isStructuredValue, StructuredValue, wrapStructured } from '@interpreter/utils/structured-value';\n\n/**\n * Thread-local storage for metadata shelves\n * Each async context gets its own shelf instance\n */\nconst asyncLocalStorage = new AsyncLocalStorage<MetadataShelf>();\n\n/**\n * Metadata shelf for preserving LoadContentResult metadata\n */\nclass MetadataShelf {\n private shelf: Map<string, LoadContentResult[]> = new Map();\n private singleFileMetadata: LoadContentResult | null = null;\n private structuredShelf: WeakMap<object, StructuredValue> = new WeakMap();\n \n /**\n * Store LoadContentResult objects on the shelf before unwrapping\n */\n storeMetadata(value: any): void {\n if (isStructuredValue(value) && value.type === 'array') {\n // Store each LoadContentResult from the array's data\n const items = value.data as any[];\n for (const item of items) {\n if (isLoadContentResult(item)) {\n this.getBucket(item.content).push(item);\n }\n }\n // Also store the structured value itself\n if (value.data && typeof value.data === 'object') {\n this.structuredShelf.set(value.data as object, value);\n }\n } else if (isLoadContentResult(value)) {\n // Store both in shelf (for exact matching) and as single file metadata (for auto-restoration)\n this.getBucket(value.content).push(value);\n this.singleFileMetadata = value;\n } else if (isStructuredValue(value)) {\n if (value.data && typeof value.data === 'object') {\n this.structuredShelf.set(value.data as object, value);\n }\n }\n }\n \n /**\n * Attempt to restore metadata to returned values from JS functions\n */\n restoreMetadata(value: any): any {\n const structuredRestored = this.restoreStructuredFromShelf(value);\n if (structuredRestored) {\n return structuredRestored;\n }\n\n // Handle arrays (existing functionality)\n if (Array.isArray(value)) {\n // Check if all items are strings that match shelved content\n const restored: any[] = [];\n let hasRestorable = false;\n \n for (const item of value) {\n if (typeof item === 'string') {\n const restoredItem = this.shiftFromBucket(item);\n if (restoredItem) {\n restored.push(restoredItem);\n hasRestorable = true;\n continue;\n }\n }\n\n if (typeof item === 'string' && this.singleFileMetadata && this.singleFileMetadata.content === item) {\n restored.push(this.singleFileMetadata);\n hasRestorable = true;\n continue;\n }\n\n // Not restorable - keep as is\n restored.push(item);\n }\n \n // Only return restored array if we actually restored something\n return hasRestorable ? restored : value;\n }\n\n // Handle single values (new functionality)\n if (typeof value === 'string' && this.singleFileMetadata) {\n const bucketMatch = this.shiftFromBucket(value);\n if (bucketMatch) {\n return bucketMatch;\n }\n\n // Check for exact match first\n if (this.singleFileMetadata.content === value) {\n return this.singleFileMetadata;\n }\n \n // Auto-restore for transformed single file content\n // Create a new LoadContentResult with the transformed content but original metadata\n const original = this.singleFileMetadata;\n const restored = {\n ...original,\n content: value // Use the transformed content\n };\n \n if (process.env.MLLD_DEBUG === 'true') {\n console.error('[MetadataShelf] Auto-restoring single file metadata:', {\n originalContent: original.content.substring(0, 50) + '...',\n newContent: value.substring(0, 50) + '...',\n filename: original.filename\n });\n }\n \n return restored;\n }\n \n return value;\n }\n\n private restoreStructuredFromShelf(value: any): StructuredValue | null {\n const original = value && typeof value === 'object' ? this.structuredShelf.get(value) : undefined;\n if (!original) {\n return null;\n }\n const text = this.computeStructuredText(original, value);\n const restored = wrapStructured(value, original.type, text, original.metadata);\n this.structuredShelf.set(value, restored);\n return restored;\n }\n\n private computeStructuredText(original: StructuredValue, data: any): string {\n if (original.type === 'text') {\n return typeof data === 'string' ? data : String(data ?? '');\n }\n\n if (original.type === 'array') {\n if (Array.isArray(data)) {\n if (typeof data.toString === 'function' && data.toString !== Array.prototype.toString) {\n return data.toString();\n }\n try {\n return JSON.stringify(data);\n } catch {\n return data.map(item => String(item)).join('\\n');\n }\n }\n return String(data ?? '');\n }\n\n if (data && typeof data === 'object' && 'content' in data && typeof (data as any).content === 'string') {\n return (data as any).content;\n }\n\n try {\n return JSON.stringify(data);\n } catch {\n return String(data ?? '');\n }\n }\n \n /**\n * Clear the shelf to prevent memory leaks\n */\n clear(): void {\n this.shelf.clear();\n this.singleFileMetadata = null;\n this.structuredShelf = new WeakMap();\n }\n\n debugSnapshot(): Record<string, unknown> {\n return {\n loadContentEntries: this.shelf.size,\n hasSingleFileMetadata: Boolean(this.singleFileMetadata),\n structuredEntries: 'weak'\n };\n }\n\n private getBucket(content: string): LoadContentResult[] {\n let bucket = this.shelf.get(content);\n if (!bucket) {\n bucket = [];\n this.shelf.set(content, bucket);\n }\n return bucket;\n }\n\n private shiftFromBucket(content: string): LoadContentResult | undefined {\n const bucket = this.shelf.get(content);\n if (!bucket || bucket.length === 0) {\n return undefined;\n }\n const value = bucket.shift();\n if (!bucket.length) {\n this.shelf.delete(content);\n }\n return value;\n }\n}\n\n/**\n * Central manager for auto-unwrapping with metadata preservation\n */\nexport class AutoUnwrapManager {\n /**\n * Auto-unwrap LoadContentResult objects to their content property\n * while preserving metadata on the thread-local shelf\n * \n * @param value - The value to potentially unwrap\n * @returns The unwrapped content or the original value\n */\n static unwrap(value: any): any {\n // Get shelf for current async context\n const shelf = asyncLocalStorage.getStore();\n if (!shelf) {\n throw new Error('AutoUnwrapManager.unwrap called outside executeWithPreservation context');\n }\n\n if (isStructuredValue(value)) {\n if (value.internal && (value.internal as any).keepStructured) {\n return value;\n }\n shelf.storeMetadata(value);\n return value.data;\n }\n\n // Handle arrays of LoadContentResult\n if (Array.isArray(value)) {\n const hasLoadContentResults = value.some(item => isLoadContentResult(item));\n if (hasLoadContentResults) {\n // Store metadata for each LoadContentResult\n for (const item of value) {\n if (isLoadContentResult(item)) {\n shelf.storeMetadata(item);\n }\n }\n // Unwrap each LoadContentResult to its content\n return value.map(item =>\n isLoadContentResult(item) ? item.content : item\n );\n }\n }\n\n const isLegacyLCR = isLoadContentResult(value);\n const isStructuredArray = isStructuredValue(value) && value.type === 'array';\n\n if (process.env.MLLD_DEBUG === 'true' && (isLegacyLCR || isStructuredArray)) {\n console.error('[AutoUnwrapManager.unwrap] Unwrapping:', {\n type: isStructuredArray ? 'StructuredValue[array]' : 'LoadContentResult',\n shelfInContext: !!asyncLocalStorage.getStore()\n });\n }\n\n // Store metadata before unwrapping\n shelf.storeMetadata(value);\n\n // Handle single LoadContentResult\n if (isLoadContentResult(value)) {\n return value.content;\n }\n\n // Handle StructuredValue arrays - unwrap to underlying data\n if (isStructuredArray) {\n return value.data;\n }\n\n // Return original value if not a LoadContentResult\n return value;\n }\n \n /**\n * Execute a function with metadata preservation\n * Sets up a new async context with its own metadata shelf\n * \n * @param fn - The function to execute\n * @returns The result with restored metadata if applicable\n */\n static async executeWithPreservation<T>(fn: () => T | Promise<T>): Promise<T> {\n const shelf = new MetadataShelf();\n \n try {\n // Run the function in a new async context with its own shelf\n const result = await asyncLocalStorage.run(shelf, fn);\n \n if (process.env.MLLD_DEBUG === 'true') {\n console.error('[AutoUnwrapManager] Result before restoration:', result);\n console.error('[AutoUnwrapManager] Shelf snapshot:', shelf.debugSnapshot());\n }\n \n // Restore metadata if applicable\n const restored = shelf.restoreMetadata(result) as T;\n \n if (process.env.MLLD_DEBUG === 'true') {\n console.error('[AutoUnwrapManager] Result after restoration:', restored);\n }\n \n return restored;\n } finally {\n // Always clear the shelf to prevent memory leaks\n shelf.clear();\n }\n }\n \n /**\n * Restore metadata from the current context's shelf\n * Used when we have a result that might contain unwrapped content\n * \n * @param value - The value to potentially restore\n * @returns The value with restored metadata if applicable\n */\n static restore(value: any): any {\n const shelf = asyncLocalStorage.getStore();\n if (!shelf) {\n return value;\n }\n \n return shelf.restoreMetadata(value);\n }\n \n /**\n * Clear the current context's shelf\n * Should be called after restoration to prevent memory leaks\n */\n static clear(): void {\n const shelf = asyncLocalStorage.getStore();\n if (shelf) {\n shelf.clear();\n }\n }\n}\n"]}