| |
| |
| |
| |
| |
| |
|
|
| |
| import { |
| ModelVendor, |
| SymbolicPrimitive, |
| GrammarStyle, |
| SymbolicOperation, |
| VendorImplementation, |
| SYMBOLIC_RUNTIME_SCHEMA |
| } from './universal-symbolics-runtime'; |
|
|
| |
| |
| |
| export interface GlyphMapping { |
| glyph: string; |
| primitive: SymbolicPrimitive; |
| description: string; |
| } |
|
|
| export interface TagMapping { |
| tag: string; |
| primitive: SymbolicPrimitive; |
| vendor: ModelVendor; |
| description: string; |
| } |
|
|
| export interface SlashMapping { |
| slash: string; |
| primitive: SymbolicPrimitive; |
| vendor: ModelVendor; |
| description: string; |
| } |
|
|
| export interface DotMapping { |
| dot: string; |
| primitive: SymbolicPrimitive; |
| description: string; |
| } |
|
|
| export interface OperatorMapping { |
| operator: string; |
| primitive: SymbolicPrimitive; |
| description: string; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export class SymbolicsRegistry { |
| |
| private glyphMappings: Map<string, GlyphMapping>; |
| private tagMappings: Map<string, TagMapping>; |
| private slashMappings: Map<string, SlashMapping>; |
| private dotMappings: Map<string, DotMapping>; |
| private operatorMappings: Map<string, OperatorMapping>; |
| |
| |
| private vendorCapabilities: Map<ModelVendor, Set<SymbolicPrimitive>>; |
| |
| |
| private customSymbols: Map<string, SymbolicOperation>; |
| |
| constructor() { |
| |
| this.glyphMappings = new Map(); |
| this.tagMappings = new Map(); |
| this.slashMappings = new Map(); |
| this.dotMappings = new Map(); |
| this.operatorMappings = new Map(); |
| this.vendorCapabilities = new Map(); |
| this.customSymbols = new Map(); |
| |
| |
| this.initializeRegistry(); |
| } |
| |
| |
| |
| |
| private initializeRegistry(): void { |
| |
| for (const vendor of Object.values(ModelVendor)) { |
| this.vendorCapabilities.set(vendor, new Set()); |
| } |
| |
| |
| for (const operation of SYMBOLIC_RUNTIME_SCHEMA) { |
| |
| if (operation.glyphs) { |
| for (const glyph of operation.glyphs) { |
| this.registerGlyph(glyph, operation.type, `Glyph for ${operation.name}`); |
| } |
| } |
| |
| |
| if (operation.tags) { |
| for (const tag of operation.tags) { |
| for (const impl of operation.vendorImplementations) { |
| if (impl.style === GrammarStyle.XML_TAGS) { |
| this.registerTag(tag, operation.type, impl.vendor, `XML tag for ${operation.name}`); |
| } |
| } |
| } |
| } |
| |
| |
| if (operation.slashes) { |
| for (const slash of operation.slashes) { |
| for (const impl of operation.vendorImplementations) { |
| if (impl.style === GrammarStyle.SLASH_COMMANDS) { |
| this.registerSlash(slash, operation.type, impl.vendor, `Slash command for ${operation.name}`); |
| } |
| } |
| } |
| } |
| |
| |
| const dotCommand = operation.universalSyntax.split('{')[0]; |
| this.registerDot(dotCommand, operation.type, `Universal syntax for ${operation.name}`); |
| |
| |
| for (const impl of operation.vendorImplementations) { |
| const capabilities = this.vendorCapabilities.get(impl.vendor); |
| if (capabilities) { |
| capabilities.add(operation.type); |
| } |
| } |
| } |
| } |
| |
| |
| |
| |
| public registerGlyph(glyph: string, primitive: SymbolicPrimitive, description: string): void { |
| this.glyphMappings.set(glyph, { glyph, primitive, description }); |
| } |
| |
| |
| |
| |
| public registerTag(tag: string, primitive: SymbolicPrimitive, vendor: ModelVendor, description: string): void { |
| this.tagMappings.set(`${vendor}:${tag}`, { tag, primitive, vendor, description }); |
| } |
| |
| |
| |
| |
| public registerSlash(slash: string, primitive: SymbolicPrimitive, vendor: ModelVendor, description: string): void { |
| this.slashMappings.set(`${vendor}:${slash}`, { slash, primitive, vendor, description }); |
| } |
| |
| |
| |
| |
| public registerDot(dot: string, primitive: SymbolicPrimitive, description: string): void { |
| this.dotMappings.set(dot, { dot, primitive, description }); |
| } |
| |
| |
| |
| |
| public registerOperator(operator: string, primitive: SymbolicPrimitive, description: string): void { |
| this.operatorMappings.set(operator, { operator, primitive, description }); |
| } |
| |
| |
| |
| |
| public registerCustomSymbol(operation: SymbolicOperation): void { |
| this.customSymbols.set(operation.name, operation); |
| } |
| |
| |
| |
| |
| public getAllGlyphMappings(): GlyphMapping[] { |
| return Array.from(this.glyphMappings.values()); |
| } |
| |
| |
| |
| |
| public getAllTagMappings(): TagMapping[] { |
| return Array.from(this.tagMappings.values()); |
| } |
| |
| |
| |
| |
| public getAllSlashMappings(): SlashMapping[] { |
| return Array.from(this.slashMappings.values()); |
| } |
| |
| |
| |
| |
| public getAllDotMappings(): DotMapping[] { |
| return Array.from(this.dotMappings.values()); |
| } |
| |
| |
| |
| |
| public getAllOperatorMappings(): OperatorMapping[] { |
| return Array.from(this.operatorMappings.values()); |
| } |
| |
| |
| |
| |
| public getPrimitiveByGlyph(glyph: string): SymbolicPrimitive | undefined { |
| const mapping = this.glyphMappings.get(glyph); |
| return mapping?.primitive; |
| } |
| |
| |
| |
| |
| public getPrimitiveByTag(tag: string, vendor: ModelVendor): SymbolicPrimitive | undefined { |
| const mapping = this.tagMappings.get(`${vendor}:${tag}`); |
| return mapping?.primitive; |
| } |
| |
| |
| |
| |
| public getPrimitiveBySlash(slash: string, vendor: ModelVendor): SymbolicPrimitive | undefined { |
| const mapping = this.slashMappings.get(`${vendor}:${slash}`); |
| return mapping?.primitive; |
| } |
| |
| |
| |
| |
| public getPrimitiveByDot(dot: string): SymbolicPrimitive | undefined { |
| const mapping = this.dotMappings.get(dot); |
| return mapping?.primitive; |
| } |
| |
| |
| |
| |
| public getPrimitiveByOperator(operator: string): SymbolicPrimitive | undefined { |
| const mapping = this.operatorMappings.get(operator); |
| return mapping?.primitive; |
| } |
| |
| |
| |
| |
| public getOperationByPrimitive(primitive: SymbolicPrimitive): SymbolicOperation | undefined { |
| |
| const builtIn = SYMBOLIC_RUNTIME_SCHEMA.find(op => op.type === primitive); |
| if (builtIn) return builtIn; |
| |
| |
| for (const operation of this.customSymbols.values()) { |
| if (operation.type === primitive) return operation; |
| } |
| |
| return undefined; |
| } |
| |
| |
| |
| |
| public getVendorImplementation(primitive: SymbolicPrimitive, vendor: ModelVendor): VendorImplementation | undefined { |
| const operation = this.getOperationByPrimitive(primitive); |
| if (!operation) return undefined; |
| |
| return operation.vendorImplementations.find(impl => impl.vendor === vendor); |
| } |
| |
| |
| |
| |
| public vendorSupports(vendor: ModelVendor, primitive: SymbolicPrimitive): boolean { |
| const capabilities = this.vendorCapabilities.get(vendor); |
| if (!capabilities) return false; |
| |
| return capabilities.has(primitive); |
| } |
| |
| |
| |
| |
| public getVendorSupportedPrimitives(vendor: ModelVendor): SymbolicPrimitive[] { |
| const capabilities = this.vendorCapabilities.get(vendor); |
| if (!capabilities) return []; |
| |
| return Array.from(capabilities); |
| } |
| |
| |
| |
| |
| public getPrimitiveSupportMap(primitive: SymbolicPrimitive): Record<ModelVendor, boolean> { |
| const result: Record<ModelVendor, boolean> = {} as Record<ModelVendor, boolean>; |
| |
| for (const vendor of Object.values(ModelVendor)) { |
| result[vendor] = this.vendorSupports(vendor, primitive); |
| } |
| |
| return result; |
| } |
| |
| |
| |
| |
| public transformToVendor(universalSyntax: string, vendor: ModelVendor): string { |
| |
| const match = universalSyntax.match(/^(.+?)\{(.+)\}$/); |
| if (!match) return universalSyntax; |
| |
| const [_, command, paramsString] = match; |
| |
| |
| let params: Record<string, any> = {}; |
| try { |
| |
| paramsString.split(',').forEach(pair => { |
| const [key, value] = pair.split(':').map(s => s.trim()); |
| params[key] = value; |
| }); |
| } catch (error) { |
| return universalSyntax; |
| } |
| |
| |
| const primitive = this.getPrimitiveByDot(command); |
| if (!primitive) return universalSyntax; |
| |
| |
| const implementation = this.getVendorImplementation(primitive, vendor); |
| if (!implementation) return universalSyntax; |
| |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| return `${implementation.prefix}${params.content || ''}${implementation.suffix}`; |
| } |
| break; |
| case GrammarStyle.SLASH_COMMANDS: |
| if (implementation.prefix) { |
| return `${implementation.prefix} ${params.content || ''}`; |
| } |
| break; |
| case GrammarStyle.API_PARAMETERS: |
| |
| return `API parameter: ${JSON.stringify(params)}`; |
| case GrammarStyle.SYSTEM_PROMPTS: |
| |
| const operation = this.getOperationByPrimitive(primitive); |
| return `System instruction for ${operation?.name || primitive}: ${params.content || ''}`; |
| |
| } |
| |
| return universalSyntax; |
| } |
| |
| |
| |
| |
| public transformToUniversal(vendorSyntax: string, vendor: ModelVendor): string { |
| |
| if (vendor === ModelVendor.ANTHROPIC || |
| vendor === ModelVendor.UNIVERSAL) { |
| const tagMatches = vendorSyntax.match(/<(\w+)>([\s\S]*?)<\/\1>/); |
| if (tagMatches) { |
| const [_, tag, content] = tagMatches; |
| const primitive = this.getPrimitiveByTag(tag, vendor); |
| if (primitive) { |
| const operation = this.getOperationByPrimitive(primitive); |
| if (operation) { |
| return `${operation.universalSyntax.split('{')[0]}{content: "${content}"}`; |
| } |
| } |
| } |
| } |
| |
| |
| if (vendor === ModelVendor.OPENAI || |
| vendor === ModelVendor.QWEN || |
| vendor === ModelVendor.UNIVERSAL) { |
| const slashMatches = vendorSyntax.match(/^\/(\w+)\s+([\s\S]*)$/); |
| if (slashMatches) { |
| const [_, slash, content] = slashMatches; |
| const primitive = this.getPrimitiveBySlash(slash, vendor); |
| if (primitive) { |
| const operation = this.getOperationByPrimitive(primitive); |
| if (operation) { |
| return `${operation.universalSyntax.split('{')[0]}{content: "${content}"}`; |
| } |
| } |
| } |
| } |
| |
| |
| |
| return vendorSyntax; |
| } |
| |
| |
| |
| |
| public parseSymbolicOperations(text: string, vendor: ModelVendor): Array<{ primitive: SymbolicPrimitive, params: any }> { |
| const operations: Array<{ primitive: SymbolicPrimitive, params: any }> = []; |
| |
| |
| switch (vendor) { |
| case ModelVendor.ANTHROPIC: |
| |
| const tagRegex = /<(\w+)>([\s\S]*?)<\/\1>/g; |
| let tagMatch; |
| while ((tagMatch = tagRegex.exec(text)) !== null) { |
| const tag = tagMatch[1]; |
| const content = tagMatch[2]; |
| const primitive = this.getPrimitiveByTag(tag, vendor); |
| if (primitive) { |
| operations.push({ |
| primitive, |
| params: { content } |
| }); |
| } |
| } |
| break; |
| |
| case ModelVendor.QWEN: |
| case ModelVendor.OPENAI: |
| |
| const slashRegex = /\/(\w+)\s+([\s\S]*?)(?=\/\w+\s+|$)/g; |
| let slashMatch; |
| while ((slashMatch = slashRegex.exec(text)) !== null) { |
| const slash = slashMatch[1]; |
| const content = slashMatch[2].trim(); |
| const primitive = this.getPrimitiveBySlash(slash, vendor); |
| if (primitive) { |
| operations.push({ |
| primitive, |
| params: { content } |
| }); |
| } |
| } |
| break; |
| |
| |
| } |
| |
| return operations; |
| } |
| |
| |
| |
| |
| public generateSymbolicContent(operations: Array<{ primitive: SymbolicPrimitive, params: any }>, vendor: ModelVendor): string { |
| let content = ''; |
| |
| for (const { primitive, params } of operations) { |
| const implementation = this.getV |
| |
| |
| |
| public generateSymbolicContent(operations: Array<{ primitive: SymbolicPrimitive, params: any }>, vendor: ModelVendor): string { |
| let content = ''; |
| |
| for (const { primitive, params } of operations) { |
| const implementation = this.getVendorImplementation(primitive, vendor); |
| if (!implementation) continue; |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| content += `${implementation.prefix}${params.content || ''}${implementation.suffix}\n`; |
| } |
| break; |
| |
| case GrammarStyle.SLASH_COMMANDS: |
| if (implementation.prefix) { |
| content += `${implementation.prefix} ${params.content || ''}\n`; |
| } |
| break; |
| |
| case GrammarStyle.API_PARAMETERS: |
| |
| content += `[API Parameter] ${JSON.stringify(params)}\n`; |
| break; |
| |
| case GrammarStyle.SYSTEM_PROMPTS: |
| |
| const operation = this.getOperationByPrimitive(primitive); |
| content += `System instruction for ${operation?.name || primitive}: ${params.content || ''}\n`; |
| break; |
| |
| case GrammarStyle.FUNCTION_CALLS: |
| |
| content += `${params.name || primitive}(${JSON.stringify(params.params || {})});\n`; |
| break; |
| |
| case GrammarStyle.DOT_PREFIXED: |
| |
| const opName = primitive.toLowerCase(); |
| let paramsStr = ''; |
| if (params && Object.keys(params).length > 0) { |
| paramsStr = JSON.stringify(params); |
| } |
| content += `.p/${opName}{${paramsStr}}\n`; |
| break; |
| |
| case GrammarStyle.GLYPH_MARKERS: |
| |
| const glyphs = this.findGlyphsForPrimitive(primitive); |
| if (glyphs.length > 0) { |
| content += `${glyphs[0]} ${params.content || ''}\n`; |
| } |
| break; |
| |
| |
| } |
| } |
| |
| return content; |
| } |
| |
| |
| |
| |
| private findGlyphsForPrimitive(primitive: SymbolicPrimitive): string[] { |
| const glyphs: string[] = []; |
| |
| for (const [glyph, mapping] of this.glyphMappings.entries()) { |
| if (mapping.primitive === primitive) { |
| glyphs.push(glyph); |
| } |
| } |
| |
| return glyphs; |
| } |
| |
| |
| |
| |
| public extractParameters(content: string, primitive: SymbolicPrimitive, vendor: ModelVendor): any { |
| const implementation = this.getVendorImplementation(primitive, vendor); |
| if (!implementation) return {}; |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}([\\s\\S]*?)${escapeRegExp(implementation.suffix)}`); |
| const match = content.match(regex); |
| if (match) { |
| return { content: match[1] }; |
| } |
| } |
| break; |
| |
| case GrammarStyle.SLASH_COMMANDS: |
| if (implementation.prefix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}\\s+([\\s\\S]*)`); |
| const match = content.match(regex); |
| if (match) { |
| return { content: match[1] }; |
| } |
| } |
| break; |
| |
| case GrammarStyle.FUNCTION_CALLS: |
| const functionRegex = /(\w+)\(({[\s\S]*?})\)/; |
| const functionMatch = content.match(functionRegex); |
| if (functionMatch) { |
| try { |
| const name = functionMatch[1]; |
| const params = JSON.parse(functionMatch[2]); |
| return { name, params }; |
| } catch (error) { |
| return {}; |
| } |
| } |
| break; |
| |
| |
| } |
| |
| return {}; |
| } |
| |
| |
| |
| |
| public containsSymbolicOperation(content: string, primitive: SymbolicPrimitive, vendor: ModelVendor): boolean { |
| const implementation = this.getVendorImplementation(primitive, vendor); |
| if (!implementation) return false; |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}[\\s\\S]*?${escapeRegExp(implementation.suffix)}`); |
| return regex.test(content); |
| } |
| break; |
| |
| case GrammarStyle.SLASH_COMMANDS: |
| if (implementation.prefix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}\\s+`); |
| return regex.test(content); |
| } |
| break; |
| |
| case GrammarStyle.FUNCTION_CALLS: |
| const functionRegex = /\w+\(.*?\)/; |
| return functionRegex.test(content); |
| |
| |
| } |
| |
| return false; |
| } |
| |
| |
| |
| |
| public extractAllSymbolicOperations(content: string, vendor: ModelVendor): Array<{ primitive: SymbolicPrimitive, params: any }> { |
| const operations: Array<{ primitive: SymbolicPrimitive, params: any }> = []; |
| |
| |
| const supportedPrimitives = this.getVendorSupportedPrimitives(vendor); |
| |
| for (const primitive of supportedPrimitives) { |
| if (this.containsSymbolicOperation(content, primitive, vendor)) { |
| const params = this.extractParameters(content, primitive, vendor); |
| operations.push({ primitive, params }); |
| } |
| } |
| |
| return operations; |
| } |
| |
| |
| |
| |
| |
| public findSymbolicResidue(content: string, vendor: ModelVendor): Array<{ pattern: string, position: number, possiblePrimitive?: SymbolicPrimitive }> { |
| const residue: Array<{ pattern: string, position: number, possiblePrimitive?: SymbolicPrimitive }> = []; |
| |
| switch (vendor) { |
| case ModelVendor.ANTHROPIC: |
| |
| const unclosedTagRegex = /<(\w+)>(?![^<]*<\/\1>)/g; |
| let unclosedMatch; |
| while ((unclosedMatch = unclosedTagRegex.exec(content)) !== null) { |
| const tag = unclosedMatch[1]; |
| const primitive = this.getPrimitiveByTag(tag, vendor); |
| residue.push({ |
| pattern: unclosedMatch[0], |
| position: unclosedMatch.index, |
| possiblePrimitive: primitive |
| }); |
| } |
| break; |
| |
| case ModelVendor.QWEN: |
| case ModelVendor.OPENAI: |
| |
| const incompleteSlashRegex = /\/(\w+)$/g; |
| let incompleteSlashMatch; |
| while ((incompleteSlashMatch = incompleteSlashRegex.exec(content)) !== null) { |
| const slash = incompleteSlashMatch[1]; |
| const primitive = this.getPrimitiveBySlash(slash, vendor); |
| residue.push({ |
| pattern: incompleteSlashMatch[0], |
| position: incompleteSlashMatch.index, |
| possiblePrimitive: primitive |
| }); |
| } |
| break; |
| |
| |
| } |
| |
| |
| for (const [glyph, mapping] of this.glyphMappings.entries()) { |
| const glyphRegex = new RegExp(escapeRegExp(glyph), 'g'); |
| let glyphMatch; |
| while ((glyphMatch = glyphRegex.exec(content)) !== null) { |
| |
| const isIsolated = ( |
| (glyphMatch.index === 0 || /\s/.test(content[glyphMatch.index - 1])) && |
| (glyphMatch.index + glyph.length === content.length || /\s/.test(content[glyphMatch.index + glyph.length])) |
| ); |
| |
| if (isIsolated) { |
| residue.push({ |
| pattern: glyph, |
| position: glyphMatch.index, |
| possiblePrimitive: mapping.primitive |
| }); |
| } |
| } |
| } |
| |
| return residue; |
| } |
| |
| |
| |
| |
| public repairSymbolicResidue(content: string, vendor: ModelVendor): string { |
| let repairedContent = content; |
| |
| |
| const residuePatterns = this.findSymbolicResidue(content, vendor); |
| |
| |
| residuePatterns.sort((a, b) => b.position - a.position); |
| |
| for (const residue of residuePatterns) { |
| if (!residue.possiblePrimitive) continue; |
| |
| const implementation = this.getVendorImplementation(residue.possiblePrimitive, vendor); |
| if (!implementation) continue; |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| |
| if (residue.pattern.startsWith(implementation.prefix)) { |
| repairedContent = |
| repairedContent.substring(0, residue.position) + |
| residue.pattern + '[MISSING CONTENT]' + implementation.suffix + |
| repairedContent.substring(residue.position + residue.pattern.length); |
| } |
| } |
| break; |
| |
| case GrammarStyle.SLASH_COMMANDS: |
| |
| if (residue.pattern.startsWith('/')) { |
| repairedContent = |
| repairedContent.substring(0, residue.position) + |
| residue.pattern + ' [MISSING CONTENT]' + |
| repairedContent.substring(residue.position + residue.pattern.length); |
| } |
| break; |
| |
| |
| } |
| } |
| |
| return repairedContent; |
| } |
| |
| |
| |
| |
| public cleanSymbolicTraces(content: string, vendor: ModelVendor): string { |
| let cleanedContent = content; |
| |
| |
| const primitivesToClean = [ |
| SymbolicPrimitive.THINKING, |
| SymbolicPrimitive.REFLECTION, |
| |
| ]; |
| |
| for (const primitive of primitivesToClean) { |
| const implementation = this.getVendorImplementation(primitive, vendor); |
| if (!implementation) continue; |
| |
| switch (implementation.style) { |
| case GrammarStyle.XML_TAGS: |
| if (implementation.prefix && implementation.suffix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}[\\s\\S]*?${escapeRegExp(implementation.suffix)}`, 'g'); |
| cleanedContent = cleanedContent.replace(regex, ''); |
| } |
| break; |
| |
| case GrammarStyle.SLASH_COMMANDS: |
| if (implementation.prefix) { |
| const regex = new RegExp(`${escapeRegExp(implementation.prefix)}\\s+[^\\n]*\\n?`, 'g'); |
| cleanedContent = cleanedContent.replace(regex, ''); |
| } |
| break; |
| |
| |
| } |
| } |
| |
| |
| for (const [glyph, mapping] of this.glyphMappings.entries()) { |
| if (primitivesToClean.includes(mapping.primitive)) { |
| const glyphRegex = new RegExp(`${escapeRegExp(glyph)}\\s+[^\\n]*\\n?`, 'g'); |
| cleanedContent = cleanedContent.replace(glyphRegex, ''); |
| } |
| } |
| |
| return cleanedContent.trim(); |
| } |
| |
| |
| |
| |
| public getVendorCapabilitiesInfo(vendor: ModelVendor): { |
| supported: SymbolicPrimitive[]; |
| emulated: SymbolicPrimitive[]; |
| unsupported: SymbolicPrimitive[]; |
| grammarStyle: GrammarStyle[]; |
| } { |
| const supported: SymbolicPrimitive[] = []; |
| const emulated: SymbolicPrimitive[] = []; |
| const unsupported: SymbolicPrimitive[] = []; |
| const grammarStyle = new Set<GrammarStyle>(); |
| |
| |
| for (const operation of SYMBOLIC_RUNTIME_SCHEMA) { |
| const implementation = operation.vendorImplementations.find(impl => impl.vendor === vendor); |
| |
| if (implementation) { |
| grammarStyle.add(implementation.style); |
| |
| if (implementation.isNative) { |
| supported.push(operation.type); |
| } else { |
| emulated.push(operation.type); |
| } |
| } else { |
| unsupported.push(operation.type); |
| } |
| } |
| |
| return { |
| supported, |
| emulated, |
| unsupported, |
| grammarStyle: Array.from(grammarStyle) |
| }; |
| } |
| |
| |
| |
| |
| public getCompatibilityMatrix(): Record<SymbolicPrimitive, Record<ModelVendor, 'native' | 'emulated' | 'unsupported'>> { |
| const matrix: Record<SymbolicPrimitive, Record<ModelVendor, 'native' | 'emulated' | 'unsupported'>> = {} as any; |
| |
| |
| for (const primitive of Object.values(SymbolicPrimitive)) { |
| matrix[primitive] = {} as Record<ModelVendor, 'native' | 'emulated' | 'unsupported'>; |
| |
| for (const vendor of Object.values(ModelVendor)) { |
| matrix[primitive][vendor] = 'unsupported'; |
| } |
| } |
| |
| |
| for (const operation of SYMBOLIC_RUNTIME_SCHEMA) { |
| for (const implementation of operation.vendorImplementations) { |
| if (implementation.isNative) { |
| matrix[operation.type][implementation.vendor] = 'native'; |
| } else { |
| matrix[operation.type][implementation.vendor] = 'emulated'; |
| } |
| } |
| } |
| |
| return matrix; |
| } |
| |
| |
| |
| |
| public getSymbolicMappingTable(): Record<SymbolicPrimitive, Record<ModelVendor, string>> { |
| const table: Record<SymbolicPrimitive, Record<ModelVendor, string>> = {} as any; |
| |
| |
| for (const primitive of Object.values(SymbolicPrimitive)) { |
| table[primitive] = {} as Record<ModelVendor, string>; |
| |
| for (const vendor of Object.values(ModelVendor)) { |
| table[primitive][vendor] = 'N/A'; |
| } |
| } |
| |
| |
| for (const operation of SYMBOLIC_RUNTIME_SCHEMA) { |
| |
| table[operation.type][ModelVendor.UNIVERSAL] = operation.universalSyntax; |
| |
| for (const implementation of operation.vendorImplementations) { |
| table[operation.type][implementation.vendor] = implementation.exampleSyntax; |
| } |
| } |
| |
| return table; |
| } |
| |
| |
| |
| |
| public exportRegistryData(): any { |
| return { |
| glyphMappings: Array.from(this.glyphMappings.values()), |
| tagMappings: Array.from(this.tagMappings.values()), |
| slashMappings: Array.from(this.slashMappings.values()), |
| dotMappings: Array.from(this.dotMappings.values()), |
| operatorMappings: Array.from(this.operatorMappings.values()), |
| vendorCapabilities: Array.from(this.vendorCapabilities.entries()).map(([vendor, capabilities]) => ({ |
| vendor, |
| capabilities: Array.from(capabilities) |
| })), |
| customSymbols: Array.from(this.customSymbols.values()), |
| compatibilityMatrix: this.getCompatibilityMatrix(), |
| mappingTable: this.getSymbolicMappingTable() |
| }; |
| } |
| } |
|
|
| |
| |
| |
| function escapeRegExp(string: string): string { |
| return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); |
| } |
|
|