UNPKG

meld

Version:

Meld: A template language for LLM prompts

189 lines (169 loc) 6.97 kB
/** * Integration with StateVisualizationService * * This module provides utilities to extend the StateVisualizationService * with ASCII rendering capabilities. */ import { mermaidToAscii, MermaidAsciiOptions } from './index'; import { IStateVisualizationService, VisualizationConfig } from '../debug/StateVisualizationService/IStateVisualizationService'; /** * Options for ASCII visualization */ export interface AsciiVisualizationOptions extends MermaidAsciiOptions { // Additional ASCII-specific options can be added here includeHeader?: boolean; } /** * Adapter class that extends a visualization service to provide ASCII rendering capabilities */ export class AsciiVisualizationAdapter { constructor(private visualizationService: IStateVisualizationService) {} /** * Generate an ASCII representation of a state hierarchy * * @param stateId The ID of the root state * @param options ASCII visualization options * @returns ASCII representation of the hierarchy */ async generateHierarchyViewAscii(stateId: string, options: AsciiVisualizationOptions = {}): Promise<string> { const config: VisualizationConfig = { format: 'mermaid', ascii: { width: options.width, height: options.height, color: options.color, includeHeader: options.includeHeader } }; const mermaidDiagram = this.visualizationService.generateHierarchyView(stateId, config); return mermaidToAscii(mermaidDiagram, options); } /** * Generate an ASCII representation of state transitions * * @param stateId The ID of the state * @param options ASCII visualization options * @returns ASCII representation of transitions */ async generateTransitionDiagramAscii(stateId: string, options: AsciiVisualizationOptions = {}): Promise<string> { const config: VisualizationConfig = { format: 'mermaid', ascii: { width: options.width, height: options.height, color: options.color, includeHeader: options.includeHeader } }; const mermaidDiagram = this.visualizationService.generateTransitionDiagram(stateId, config); return mermaidToAscii(mermaidDiagram, options); } /** * Generate an ASCII representation of state relationships * * @param stateId The ID of the state or array of state IDs * @param options ASCII visualization options * @returns ASCII representation of relationships */ async generateRelationshipGraphAscii(stateId: string | string[], options: AsciiVisualizationOptions = {}): Promise<string> { const config: VisualizationConfig = { format: 'mermaid', ascii: { width: options.width, height: options.height, color: options.color, includeHeader: options.includeHeader } }; const stateIds = Array.isArray(stateId) ? stateId : [stateId]; const mermaidDiagram = this.visualizationService.generateRelationshipGraph(stateIds, config); return mermaidToAscii(mermaidDiagram, options); } /** * Generate an ASCII representation of a timeline * * @param stateId The ID of the state or array of state IDs * @param options ASCII visualization options * @returns ASCII representation of the timeline */ async generateTimelineAscii(stateId: string | string[], options: AsciiVisualizationOptions = {}): Promise<string> { const config: VisualizationConfig = { format: 'mermaid', ascii: { width: options.width, height: options.height, color: options.color, includeHeader: options.includeHeader } }; const stateIds = Array.isArray(stateId) ? stateId : [stateId]; const mermaidDiagram = this.visualizationService.generateTimeline(stateIds, config); return mermaidToAscii(mermaidDiagram, options); } /** * Generate an ASCII representation of variable resolution * * @param stateId The ID of the state * @param variableName The name of the variable * @param options ASCII visualization options * @returns ASCII representation of variable resolution */ async generateVariableResolutionAscii(stateId: string, variableName: string, options: AsciiVisualizationOptions = {}): Promise<string> { const config: VisualizationConfig = { format: 'mermaid', ascii: { width: options.width, height: options.height, color: options.color, includeHeader: options.includeHeader } }; const mermaidDiagram = this.visualizationService.visualizeResolutionPathTimeline(variableName, stateId, { ...config, includeVars: true, highlightBoundaries: true }); return mermaidToAscii(mermaidDiagram, options); } } /** * Create an enhanced visualization service with ASCII capabilities * * @param visualizationService The base visualization service to enhance * @returns Enhanced visualization service with ASCII methods */ export function enhanceWithAsciiVisualization(visualizationService: IStateVisualizationService): IStateVisualizationService & { generateAsciiHierarchyView: (stateId: string, options?: AsciiVisualizationOptions) => Promise<string>; generateAsciiTransitionDiagram: (stateId: string, options?: AsciiVisualizationOptions) => Promise<string>; generateAsciiRelationshipGraph: (stateId: string | string[], options?: AsciiVisualizationOptions) => Promise<string>; generateAsciiTimeline: (stateId: string | string[], options?: AsciiVisualizationOptions) => Promise<string>; generateAsciiVariableResolution: (stateId: string, variableName: string, options?: AsciiVisualizationOptions) => Promise<string>; } { const adapter = new AsciiVisualizationAdapter(visualizationService); return Object.assign(visualizationService, { generateAsciiHierarchyView: adapter.generateHierarchyViewAscii.bind(adapter), generateAsciiTransitionDiagram: adapter.generateTransitionDiagramAscii.bind(adapter), generateAsciiRelationshipGraph: adapter.generateRelationshipGraphAscii.bind(adapter), generateAsciiTimeline: adapter.generateTimelineAscii.bind(adapter), generateAsciiVariableResolution: adapter.generateVariableResolutionAscii.bind(adapter) }); } /** * Create a wrapper function for CLI commands to render any mermaid diagram as ASCII */ export function createAsciiRenderer(options: AsciiVisualizationOptions = {}): (diagram: string, title?: string) => Promise<string> { return async (diagram: string, title?: string): Promise<string> => { const asciiArt = await mermaidToAscii(diagram, { width: options.width || 120, height: options.height, color: options.color !== undefined ? options.color : true }); if (!title) { return asciiArt; } // Create a header with title const header = `=== ${title} ===`; const footer = '='.repeat(header.length); return `${header}\n${asciiArt}\n${footer}`; }; }