@prompd/core 0.5.0-beta.13 → 0.5.0-beta.14

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/parser.ts","../src/types/index.ts","../src/lib/errors.ts","../src/lib/compiler/types.ts","../src/lib/compiler/package-ref.ts","../src/lib/compiler/path-utils.ts","../src/lib/compiler/pipeline.ts","../src/lib/compiler/stages/lexical.ts","../src/lib/compiler/stages/dependency.ts","../src/lib/compiler/date-utils.ts","../src/lib/compiler/stages/semantic.ts","../src/lib/compiler/section-override.ts","../src/lib/compiler/language-map.ts","../src/lib/compiler/prompd-loader.ts","../src/lib/compiler/stages/template.ts","../src/lib/compiler/formatters/markdown.ts","../src/lib/compiler/formatters/openai.ts","../src/lib/compiler/formatters/anthropic.ts","../src/lib/compiler/stages/codegen.ts","../src/lib/compiler/file-system.ts","../src/lib/compiler/install.ts","../src/lib/compiler/index.ts","../src/lib/workflowTypes.ts","../src/lib/workflowValidator.ts","../src/lib/workflowParser.ts"],"names":["yaml","CompilationStage","semver","match","nunjucks","nunjucks2","yaml2","JSZip","normalizePosix","joinPosix","dirnamePosix"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as yaml from 'yaml';\nimport { PrompdFile, PrompdMetadata, ValidationIssue } from '../types';\n\n/**\n * Environment-agnostic .prmd parser. Pure string -> structure; no file system.\n * The Node CLI subclasses this to add fs-backed parseFile()/validateFile().\n */\nexport class PrompdParser {\n parseContent(content: string, _filePath?: string): PrompdFile {\n // Remove BOM if present and normalize line endings (CRLF -> LF)\n const cleanContent = content\n .replace(/^\\ufeff/, '')\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n if (!cleanContent.startsWith('---\\n')) {\n throw new Error('File must start with YAML frontmatter (---)');\n }\n\n // Find the closing --- delimiter (must be on its own line)\n // We search after the opening --- to find the first \\n---\\n or \\n--- at end\n const afterOpening = cleanContent.slice(4); // Skip opening \"---\\n\"\n const closingIndex = afterOpening.indexOf('\\n---\\n');\n const closingAtEnd = afterOpening.indexOf('\\n---');\n\n // Determine the actual closing delimiter position\n let delimiterIndex = -1;\n if (closingIndex !== -1) {\n delimiterIndex = closingIndex;\n } else if (closingAtEnd !== -1 && afterOpening.substring(closingAtEnd) === '\\n---') {\n // Handle case where --- is at the very end with no trailing newline\n delimiterIndex = closingAtEnd;\n }\n\n if (delimiterIndex === -1) {\n throw new Error('Invalid frontmatter format');\n }\n\n const yamlContent = afterOpening.substring(0, delimiterIndex);\n // +4 to skip past \"\\n---\\n\" or +4 to skip past \"\\n---\" if at end\n const bodyStart = delimiterIndex + 4;\n const markdownContent = bodyStart < afterOpening.length ? afterOpening.substring(bodyStart) : '';\n\n let metadata: PrompdMetadata;\n try {\n metadata = yaml.parse(yamlContent) as PrompdMetadata;\n } catch (error) {\n throw new Error(`Failed to parse YAML frontmatter: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n \n // Validate required fields\n if (!metadata.id) {\n throw new Error('id field is required');\n }\n \n // Validate ID follows kebab-case\n const kebabCaseRegex = /^[a-z0-9-]+$/;\n if (!kebabCaseRegex.test(metadata.id)) {\n throw new Error(`id '${metadata.id}' must use kebab-case (lowercase letters, numbers, hyphens only)`);\n }\n\n // Extract sections from markdown content\n const sections: Record<string, string> = {};\n const sectionRegex = /^## (.+)$/gm;\n let match;\n while ((match = sectionRegex.exec(markdownContent)) !== null) {\n sections[match[1].toLowerCase()] = match[1];\n }\n\n return {\n metadata,\n content: markdownContent.trim(),\n sections\n };\n }\n\n /**\n * Parse + validate .prmd content. Pure (no file system) so it runs in the\n * browser. Returns parse errors as a single issue when content is malformed.\n */\n validateContent(content: string, _filePath?: string): ValidationIssue[] {\n let prompd: PrompdFile;\n try {\n prompd = this.parseContent(content, _filePath);\n } catch (error) {\n return [{\n level: 'error',\n message: error instanceof Error ? error.message : 'Unknown parsing error'\n }];\n }\n return this.validatePrompdFile(prompd);\n }\n\n protected validatePrompdFile(prompd: PrompdFile): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Validate required fields\n if (!prompd.metadata.name) {\n issues.push({\n level: 'error',\n message: 'name field is required'\n });\n }\n\n // Validate semantic version if present\n if (prompd.metadata.version && !this.isValidSemver(prompd.metadata.version)) {\n issues.push({\n level: 'error',\n message: `invalid semantic version: ${prompd.metadata.version}`\n });\n }\n\n // Validate parameter references\n const variables = new Set<string>();\n \n // Check both parameters and variables fields for backward compatibility\n const allParams = [\n ...(prompd.metadata.parameters || []),\n ...(prompd.metadata.variables || [])\n ];\n\n for (const param of allParams) {\n if (!param.name) {\n issues.push({\n level: 'error',\n message: 'parameter name cannot be empty'\n });\n continue;\n }\n variables.add(param.name);\n\n // Validate parameter type\n const validTypes = ['string', 'number', 'boolean', 'array', 'object'];\n if (!validTypes.includes(param.type)) {\n issues.push({\n level: 'error',\n message: `invalid parameter type: ${param.type}. Must be one of: ${validTypes.join(', ')}`\n });\n }\n\n // Validate pattern for string parameters\n if (param.pattern && param.type !== 'string') {\n issues.push({\n level: 'warning',\n message: `pattern validation only applies to string parameters: ${param.name}`\n });\n }\n\n // Validate minimum/maximum for number parameters\n if ((param.minimum !== undefined || param.maximum !== undefined) && param.type !== 'number') {\n issues.push({\n level: 'warning',\n message: `minimum/maximum validation only applies to number parameters: ${param.name}`\n });\n }\n }\n\n // Check for variable references in content\n const variableReferences = prompd.content.match(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g);\n if (variableReferences) {\n for (const ref of variableReferences) {\n const varName = ref.slice(1, -1); // Remove { and }\n if (!variables.has(varName) && varName !== 'inputs') {\n issues.push({\n level: 'error',\n message: `undefined variable referenced: ${varName}`\n });\n }\n }\n }\n\n return issues;\n }\n\n private isValidSemver(version: string): boolean {\n const semverRegex = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n return semverRegex.test(version);\n }\n}","/**\r\n * Code file extensions that need frontmatter protection for security.\r\n * These files will have prompd content frontmatter added to make them non-executable.\r\n * Used by: CLI packager, registry security validation, frontend file selection\r\n */\r\nexport const CODE_EXTENSIONS = [\r\n // JavaScript/TypeScript ecosystem\r\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\r\n // Python\r\n '.py', '.pyw', '.pyi',\r\n // Shell/Scripts\r\n '.sh', '.bash', '.zsh', '.fish', '.ps1', '.psm1', '.psd1', '.bat', '.cmd',\r\n // Ruby\r\n '.rb', '.rake', '.gemspec',\r\n // Go\r\n '.go',\r\n // Rust\r\n '.rs',\r\n // C/C++\r\n '.c', '.cpp', '.cc', '.cxx', '.h', '.hpp', '.hxx',\r\n // Java/JVM\r\n '.java', '.kt', '.kts', '.scala', '.groovy',\r\n // .NET\r\n '.cs', '.fs', '.vb',\r\n // PHP\r\n '.php', '.phtml',\r\n // Perl\r\n '.pl', '.pm',\r\n // Swift\r\n '.swift',\r\n // Lua\r\n '.lua',\r\n // R\r\n '.r', '.R',\r\n // Julia\r\n '.jl',\r\n // Elixir/Erlang\r\n '.ex', '.exs', '.erl',\r\n // Haskell\r\n '.hs', '.lhs',\r\n // Web frameworks\r\n '.vue', '.svelte',\r\n // SQL (can be dangerous with stored procedures)\r\n '.sql',\r\n] as const;\r\n\r\n/**\r\n * Map file extensions to content type names for frontmatter metadata.\r\n */\r\nexport const CONTENT_TYPES: Record<string, string> = {\r\n // JavaScript/TypeScript\r\n '.ts': 'typescript',\r\n '.tsx': 'typescript-react',\r\n '.js': 'javascript',\r\n '.jsx': 'javascript-react',\r\n '.mjs': 'javascript-module',\r\n '.cjs': 'javascript-commonjs',\r\n // Python\r\n '.py': 'python',\r\n '.pyw': 'python-windows',\r\n '.pyi': 'python-stub',\r\n // Shell\r\n '.sh': 'shell',\r\n '.bash': 'bash',\r\n '.zsh': 'zsh',\r\n '.fish': 'fish',\r\n '.ps1': 'powershell',\r\n '.psm1': 'powershell-module',\r\n '.psd1': 'powershell-data',\r\n '.bat': 'batch',\r\n '.cmd': 'batch',\r\n // Ruby\r\n '.rb': 'ruby',\r\n '.rake': 'ruby-rake',\r\n '.gemspec': 'ruby-gemspec',\r\n // Go\r\n '.go': 'go',\r\n // Rust\r\n '.rs': 'rust',\r\n // C/C++\r\n '.c': 'c',\r\n '.cpp': 'cpp',\r\n '.cc': 'cpp',\r\n '.cxx': 'cpp',\r\n '.h': 'c-header',\r\n '.hpp': 'cpp-header',\r\n '.hxx': 'cpp-header',\r\n // Java/JVM\r\n '.java': 'java',\r\n '.kt': 'kotlin',\r\n '.kts': 'kotlin-script',\r\n '.scala': 'scala',\r\n '.groovy': 'groovy',\r\n // .NET\r\n '.cs': 'csharp',\r\n '.fs': 'fsharp',\r\n '.vb': 'vb',\r\n // PHP\r\n '.php': 'php',\r\n '.phtml': 'php-html',\r\n // Perl\r\n '.pl': 'perl',\r\n '.pm': 'perl-module',\r\n // Swift\r\n '.swift': 'swift',\r\n // Lua\r\n '.lua': 'lua',\r\n // R\r\n '.r': 'r',\r\n '.R': 'r',\r\n // Julia\r\n '.jl': 'julia',\r\n // Elixir/Erlang\r\n '.ex': 'elixir',\r\n '.exs': 'elixir-script',\r\n '.erl': 'erlang',\r\n // Haskell\r\n '.hs': 'haskell',\r\n '.lhs': 'literate-haskell',\r\n // Web frameworks\r\n '.vue': 'vue',\r\n '.svelte': 'svelte',\r\n // SQL\r\n '.sql': 'sql',\r\n};\r\n\r\n/**\r\n * Check if a file extension requires frontmatter protection.\r\n */\r\nexport function needsFrontmatterProtection(filePath: string): boolean {\r\n const ext = filePath.toLowerCase().match(/\\.[^.]+$/)?.[0] || '';\r\n return (CODE_EXTENSIONS as readonly string[]).includes(ext);\r\n}\r\n\r\n/**\r\n * Get the content type for a file extension.\r\n */\r\nexport function getContentType(filePath: string): string {\r\n const ext = filePath.toLowerCase().match(/\\.[^.]+$/)?.[0] || '';\r\n return CONTENT_TYPES[ext] || 'text';\r\n}\r\n\r\n// ── Package Type System ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * Package types supported by the prompd ecosystem.\r\n * Defined in prompd.json under the \"type\" field.\r\n */\r\nexport type PackageType = 'package' | 'workflow' | 'skill' | 'node-template';\r\n\r\n/**\r\n * Maps each PackageType to its install directory name.\r\n * e.g., .prompd/packages/, .prompd/workflows/, .prompd/skills/, .prompd/templates/\r\n */\r\nexport const PACKAGE_TYPE_DIRS: Record<PackageType, string> = {\r\n 'package': 'packages',\r\n 'workflow': 'workflows',\r\n 'skill': 'skills',\r\n 'node-template': 'templates',\r\n};\r\n\r\n/**\r\n * All valid package type strings, for validation.\r\n */\r\nexport const VALID_PACKAGE_TYPES: readonly string[] = Object.keys(PACKAGE_TYPE_DIRS);\r\n\r\n/**\r\n * Maps tool names to their native skill deployment directories.\r\n * Used by `prompd install --tools <tool>` to deploy skills into tool-native locations.\r\n */\r\nexport const TOOL_DEPLOY_DIRS: Record<string, string> = {\r\n 'claude': '~/.claude/skills',\r\n};\r\n\r\n/**\r\n * Check if a string is a valid PackageType.\r\n */\r\nexport function isValidPackageType(type: string): type is PackageType {\r\n return VALID_PACKAGE_TYPES.includes(type);\r\n}\r\n\r\n/**\r\n * Get the install directory name for a given package type.\r\n * Defaults to 'packages' for unknown types.\r\n */\r\nexport function getInstallDirForType(type: string): string {\r\n return PACKAGE_TYPE_DIRS[type as PackageType] || 'packages';\r\n}\r\n\r\n// NOTE: resolveToolDeployDir() (Node-only; uses os.homedir()) lives in @prompd/cli,\r\n// not here, to keep @prompd/core free of Node imports.\r\n\r\n// ── Prompd File Types ────────────────────────────────────────────────────────\r\n\r\nexport interface PrompdParameter {\r\n name: string;\r\n /**\r\n * string — plain text\r\n * number — integer or float\r\n * integer — whole number only\r\n * float — decimal number\r\n * boolean — true / false\r\n * array — JSON array (untyped elements)\r\n * object — plain key-value object (non-array)\r\n * json — any JSON value: objects, arrays of objects, nested structures, etc.\r\n * file — file path; caller supplies file content as a string\r\n * base64 — base64-encoded binary data (images, blobs, streams)\r\n * date — calendar date \"YYYY-MM-DD\"; default may be a relative expression\r\n * (now, today, now-7d, now+1w, now-3m, now-1y) resolved at compile time\r\n * datetime — date + time \"YYYY-MM-DDTHH:mm:ss\"; same relative-default support\r\n * (now, now-2h, now-30min) resolved at compile time\r\n */\r\n type: 'string' | 'number' | 'integer' | 'float' | 'boolean' | 'array' | 'object' | 'json' | 'file' | 'base64' | 'date' | 'datetime';\r\n description?: string;\r\n required?: boolean;\r\n default?: any;\r\n pattern?: string;\r\n minimum?: number;\r\n maximum?: number;\r\n enum?: string[];\r\n}\r\n\r\nexport interface UsingPackage {\r\n name: string;\r\n prefix?: string;\r\n}\r\n\r\nexport interface PrompdMetadata {\r\n id: string; // Machine-readable identifier (kebab-case) - REQUIRED\r\n name?: string; // Human-readable display name (can have spaces)\r\n description?: string;\r\n version?: string;\r\n parameters?: PrompdParameter[];\r\n variables?: PrompdParameter[]; // For backward compatibility\r\n system?: string | string[];\r\n context?: string | string[];\r\n task?: string | string[];\r\n user?: string | string[];\r\n assistant?: string | string[];\r\n response?: string | string[];\r\n output?: string | string[];\r\n requires?: string[];\r\n // Execution hints — used as defaults, overridden by CLI flags / node properties\r\n provider?: string;\r\n model?: string;\r\n temperature?: number;\r\n max_tokens?: number;\r\n // Advanced features for composable architecture\r\n using?: string | UsingPackage[] | Record<string, string>; // Package imports\r\n inherits?: string; // Parent template reference\r\n override?: Record<string, string | null>; // Section overrides\r\n}\r\n\r\nexport interface PrompdFile {\r\n metadata: PrompdMetadata;\r\n content: string;\r\n sections: Record<string, string>;\r\n}\r\n\r\nexport interface CustomProvider {\r\n apiKey?: string;\r\n baseUrl: string;\r\n enabled: boolean;\r\n models: string[];\r\n type: string;\r\n}\r\n\r\nexport interface RegistryConfig {\r\n url: string;\r\n api_key?: string;\r\n token?: string;\r\n username?: string;\r\n}\r\n\r\nexport interface ProviderConfig {\r\n baseUrl?: string; // Custom API endpoint (e.g., proxy, different region)\r\n timeout?: number; // Provider-specific timeout override\r\n maxRetries?: number; // Provider-specific retry count override\r\n extraHeaders?: Record<string, string>; // Custom headers (auth, tracing, etc.)\r\n extraParams?: Record<string, any>; // Provider-specific request parameters\r\n}\r\n\r\nexport interface Config {\r\n apiKeys: Record<string, string>;\r\n defaultProvider?: string;\r\n defaultModel?: string;\r\n customProviders: Record<string, CustomProvider>;\r\n providerConfigs?: Record<string, ProviderConfig>; // Per-provider config overrides\r\n registry: {\r\n default?: string;\r\n registries: Record<string, RegistryConfig>;\r\n };\r\n scopes: Record<string, string>; // scope -> registry mapping\r\n namespaces?: Record<string, string>; // namespace -> registry URL mapping\r\n currentNamespace?: string; // active namespace\r\n maxRetries?: number;\r\n timeout?: number;\r\n verbose?: boolean;\r\n}\r\n\r\nexport interface LLMResponse {\r\n success: boolean;\r\n response?: string;\r\n error?: string;\r\n content?: string;\r\n usage?: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n totalTokens: number;\r\n };\r\n}\r\n\r\nexport interface ValidationIssue {\r\n level: 'error' | 'warning' | 'info';\r\n message: string;\r\n line?: number;\r\n column?: number;\r\n}\r\n\r\nexport interface ExecuteOptions {\r\n provider: string;\r\n model: string;\r\n apiKey?: string;\r\n output?: string;\r\n params?: Record<string, any>;\r\n paramFiles?: string[];\r\n version?: string;\r\n metaSystem?: string;\r\n metaContext?: string;\r\n metaUser?: string;\r\n verbose?: boolean;\r\n registryUrl?: string;\r\n workspaceRoot?: string;\r\n fileSystem?: import('../lib/compiler/file-system').IFileSystem;\r\n // Execution parameter overrides — take priority over frontmatter hints\r\n temperature?: number;\r\n maxTokens?: number;\r\n}","/**\n * Custom error classes for Prompd CLI.\n */\n\nexport class PrompdError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PrompdError';\n Object.setPrototypeOf(this, PrompdError.prototype);\n }\n}\n\nexport class ParseError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n Object.setPrototypeOf(this, ParseError.prototype);\n }\n}\n\nexport class ValidationError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class CompilationError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'CompilationError';\n Object.setPrototypeOf(this, CompilationError.prototype);\n }\n}\n\nexport class SecurityError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'SecurityError';\n Object.setPrototypeOf(this, SecurityError.prototype);\n }\n}\n","/**\n * Compilation pipeline types and interfaces.\n *\n * This module defines the core types used throughout the 6-stage compilation pipeline,\n * mirroring the Python CLI's architecture for feature parity.\n */\n\nimport { PrompdMetadata } from '../../types';\nimport { IFileSystem } from './file-system';\n\n/**\n * Options for resolving a package reference to a path.\n */\nexport interface ResolvePackageOptions {\n fileSystem?: IFileSystem;\n registryUrl?: string;\n workspaceRoot?: string;\n}\n\n/**\n * Injectable package resolver. The Node CLI provides a disk/registry-backed\n * implementation; the browser omits it (single-file compile only), in which\n * case stages that need package/inherits resolution emit a diagnostic instead\n * of importing Node-only code.\n */\nexport interface IPackageResolver {\n resolvePackage(packageRef: string, options: ResolvePackageOptions): Promise<string>;\n}\n\n/**\n * Stages of the compilation pipeline.\n */\nexport enum CompilationStage {\n LEXICAL_ANALYSIS = 'lexical_analysis',\n DEPENDENCY_RESOLUTION = 'dependency_resolution',\n SEMANTIC_ANALYSIS = 'semantic_analysis',\n ASSET_EXTRACTION = 'asset_extraction',\n TEMPLATE_PROCESSING = 'template_processing',\n CODE_GENERATION = 'code_generation'\n}\n\n/**\n * Resolved package information.\n */\nexport interface ResolvedPackage {\n path: string;\n prefix?: string;\n}\n\n/**\n * Structured diagnostic message with location information.\n * Used for both errors and warnings to enable IDE integration.\n */\nexport interface CompilationDiagnostic {\n /** The diagnostic message */\n message: string;\n /** Severity level */\n severity: 'error' | 'warning' | 'info';\n /** Source stage that generated this diagnostic */\n source?: string;\n /** Starting line number (1-indexed) */\n line?: number;\n /** Starting column number (1-indexed) */\n column?: number;\n /** Ending line number (1-indexed) */\n endLine?: number;\n /** Ending column number (1-indexed) */\n endColumn?: number;\n /** Optional error code for quick-fix identification */\n code?: string;\n /** File path if different from main source file */\n file?: string;\n}\n\n/**\n * Context passed between compilation stages.\n *\n * Accumulates data as it flows through the pipeline, collecting errors,\n * warnings, and transforming content at each stage.\n */\nexport class CompilationContext {\n sourceFile: string;\n metadata?: PrompdMetadata;\n content?: string;\n /** Raw source content for line number calculation */\n rawSource?: string;\n dependencies: {\n imports?: Record<string, ResolvedPackage>;\n inherits?: string;\n };\n parameters: Record<string, any>;\n contexts: string[];\n /** Legacy string errors for backward compatibility */\n errors: string[];\n /** Legacy string warnings for backward compatibility */\n warnings: string[];\n /** Structured diagnostics with location information */\n diagnostics: CompilationDiagnostic[];\n outputFormat: string;\n compiledResult?: string | Uint8Array;\n verbose: boolean;\n fileSystem!: IFileSystem; // Set by pipeline\n registryUrl?: string; // Registry URL for package resolution\n workspaceRoot?: string; // Workspace root directory for package cache\n packageResolver?: IPackageResolver; // Injected; absent in browser (single-file compile)\n\n constructor(sourceFile: string, options: CompilationOptions = {}) {\n this.sourceFile = sourceFile;\n this.dependencies = {};\n this.parameters = options.parameters || {};\n this.contexts = [];\n this.errors = [];\n this.warnings = [];\n this.diagnostics = [];\n this.outputFormat = options.outputFormat || 'markdown';\n this.verbose = options.verbose || false;\n this.registryUrl = options.registryUrl;\n this.workspaceRoot = options.workspaceRoot;\n this.packageResolver = options.packageResolver;\n }\n\n /**\n * Add an error to the compilation context (legacy string format).\n */\n addError(message: string): void {\n this.errors.push(message);\n // Also add as structured diagnostic\n this.diagnostics.push({ message, severity: 'error' });\n }\n\n /**\n * Add a warning to the compilation context (legacy string format).\n */\n addWarning(message: string): void {\n this.warnings.push(message);\n // Also add as structured diagnostic\n this.diagnostics.push({ message, severity: 'warning' });\n }\n\n /**\n * Add a structured diagnostic with location information.\n */\n addDiagnostic(diagnostic: CompilationDiagnostic): void {\n this.diagnostics.push(diagnostic);\n // Also add to legacy arrays for backward compatibility\n if (diagnostic.severity === 'error') {\n this.errors.push(diagnostic.message);\n } else if (diagnostic.severity === 'warning') {\n this.warnings.push(diagnostic.message);\n }\n }\n\n /**\n * Find line and column for a pattern in the raw source.\n * Returns 1-indexed line and column numbers.\n */\n findLocation(pattern: string | RegExp): { line: number; column: number; endLine: number; endColumn: number } | null {\n if (!this.rawSource) return null;\n\n const match = typeof pattern === 'string'\n ? this.rawSource.indexOf(pattern)\n : this.rawSource.search(pattern);\n\n if (match === -1) return null;\n\n const beforeMatch = this.rawSource.substring(0, match);\n const lines = beforeMatch.split('\\n');\n const line = lines.length;\n const column = (lines[lines.length - 1]?.length || 0) + 1;\n\n // Calculate end position\n const matchLength = typeof pattern === 'string'\n ? pattern.length\n : (this.rawSource.match(pattern)?.[0]?.length || 0);\n const matchText = this.rawSource.substring(match, match + matchLength);\n const matchLines = matchText.split('\\n');\n const endLine = line + matchLines.length - 1;\n const endColumn = matchLines.length === 1\n ? column + matchLength\n : matchLines[matchLines.length - 1].length + 1;\n\n return { line, column, endLine, endColumn };\n }\n\n /**\n * Check if compilation has errors.\n */\n hasErrors(): boolean {\n return this.errors.length > 0 || this.diagnostics.some(d => d.severity === 'error');\n }\n\n /**\n * Get all diagnostics (errors and warnings).\n */\n getDiagnostics(): CompilationDiagnostic[] {\n return this.diagnostics;\n }\n\n /**\n * Get only error diagnostics.\n */\n getErrors(): CompilationDiagnostic[] {\n return this.diagnostics.filter(d => d.severity === 'error');\n }\n\n /**\n * Get only warning diagnostics.\n */\n getWarnings(): CompilationDiagnostic[] {\n return this.diagnostics.filter(d => d.severity === 'warning');\n }\n}\n\n/**\n * Options for compilation.\n */\nexport interface CompilationOptions {\n outputFormat?: string;\n parameters?: Record<string, any>;\n outputFile?: string;\n verbose?: boolean;\n fileSystem?: IFileSystem;\n /** Injected package resolver (Node CLI provides disk/registry; browser omits). */\n packageResolver?: IPackageResolver;\n /** Registry URL for package resolution. Defaults to https://registry.prompdhub.ai in production. */\n registryUrl?: string;\n /** Root directory for workspace (for package cache location). */\n workspaceRoot?: string;\n /**\n * When true, skip required parameter validation.\n * Use this for validation/diagnostics during editing when parameters won't be provided.\n * When false (default), required parameters are validated during execution.\n */\n validateOnly?: boolean;\n}\n\n/**\n * Abstract base interface for compiler pipeline stages.\n */\nexport interface CompilerStage {\n /**\n * Process the compilation context through this stage.\n */\n process(context: CompilationContext): Promise<void>;\n\n /**\n * Get the name of this compilation stage.\n */\n getName(): string;\n}\n\n/**\n * Represents a compiled prompt ready for formatting.\n */\nexport interface CompiledPrompt {\n metadata?: PrompdMetadata;\n content?: string;\n contexts: string[];\n parameters: Record<string, any>;\n verbose: boolean;\n}\n\n/**\n * Protocol for output format plugins.\n */\nexport interface OutputFormatter {\n name: string;\n fileExtension: string;\n mimeType: string;\n\n /**\n * Format the compiled prompt into the target format.\n */\n format(compiled: CompiledPrompt): Promise<string>;\n}\n\n/**\n * Information about a markdown section.\n */\nexport interface SectionInfo {\n id: string;\n headingText: string;\n content: string;\n startLine: number;\n endLine: number;\n headingLevel: number;\n}\n\n/**\n * Security configuration for file operations.\n */\nexport interface SecurityConfig {\n maxFileSize: number; // Maximum file size in bytes\n allowedExtensions: string[]; // Allowed file extensions\n maxTemplateDepth: number; // Maximum template nesting depth\n templateTimeout: number; // Template rendering timeout in ms\n}\n\n/**\n * Default security configuration.\n */\nexport const DEFAULT_SECURITY_CONFIG: SecurityConfig = {\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowedExtensions: [\n '.prmd', '.md', '.txt', '.json', '.yaml', '.yml',\n '.xlsx', '.docx', '.pdf', '.png', '.jpg', '.jpeg', '.gif'\n ],\n maxTemplateDepth: 10,\n templateTimeout: 5000 // 5 seconds\n};\n","/**\n * Pure package-reference helpers.\n *\n * These are the parts of the CLI's package-resolver that are environment-agnostic\n * (string parsing + path-safety checks). The Node-only disk/registry resolution\n * (`resolvePackage`, base-dir lookups) lives in @prompd/cli and is injected via\n * IPackageResolver. Path operations are inlined as POSIX so this stays node-free.\n */\n\nimport semver from 'semver';\nimport { SecurityError } from '../errors';\nimport type { IPackageResolver, ResolvePackageOptions } from './types';\n\n/** POSIX path normalize (collapse ./ and ../, no fs). */\nfunction posixNormalize(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const part of p.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(part);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nfunction posixIsAbsolute(p: string): boolean {\n return p.startsWith('/');\n}\n\n/**\n * Strip a file path suffix from a package reference.\n * @example \"@ns/pkg@1.0.0/prompts/file.prmd\" -> \"@ns/pkg@1.0.0\"\n */\nexport function stripFilePath(packageRef: string): string {\n const match = packageRef.match(/^(@[\\w.-]+\\/[\\w.-]+(?:@[\\w.-]+)?)/);\n return match ? match[1] : packageRef;\n}\n\n/**\n * Parse package reference into name and version. Strips any file path suffix.\n */\nexport function parsePackageReference(packageRef: string): { name: string; version: string; scope?: string } {\n const stripped = stripFilePath(packageRef);\n const match = stripped.match(/^(@[\\w.-]+\\/[\\w.-]+)@?([\\w.-]+)?$/);\n\n if (!match) {\n throw new Error(`Invalid package reference format: ${packageRef}`);\n }\n\n const name = match[1];\n const rawVersion = match[2] || 'latest';\n const version = semver.valid(rawVersion) || rawVersion;\n\n const scopeMatch = name.match(/^(@[\\w.-]+)\\//);\n const scope = scopeMatch ? scopeMatch[1] : undefined;\n\n return { name, version, scope };\n}\n\n/**\n * Parse a package reference that may include a file path within the package.\n * Format: @namespace/package@version/path/to/file.prmd\n */\nexport function parsePackageReferenceWithPath(packageRef: string): { name: string; version: string; scope?: string; filePath?: string } {\n const { name, version, scope } = parsePackageReference(packageRef);\n const stripped = stripFilePath(packageRef);\n const remainder = packageRef.slice(stripped.length);\n const filePath = remainder.length > 1 ? remainder.slice(1) : undefined;\n return { name, version, scope, filePath };\n}\n\n/**\n * Validate package reference format. Accepts optional file path suffix.\n */\nexport function isValidPackageReference(packageRef: string): boolean {\n if (packageRef.includes('\\0')) {\n return false;\n }\n\n const base = stripFilePath(packageRef);\n\n const pattern = /^@[\\w.-]+\\/[\\w.-]+(@[\\w.-]+)?$/;\n if (!pattern.test(base)) {\n return false;\n }\n\n const remainder = packageRef.slice(base.length);\n if (remainder.length > 0) {\n if (!remainder.startsWith('/')) {\n return false;\n }\n const filePath = remainder.slice(1);\n if (filePath.includes('..') || filePath.includes('//')) {\n return false;\n }\n if (!/^[\\w./\\-]+$/.test(filePath)) {\n return false;\n }\n }\n\n if (base.includes('..') || base.includes('//')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Resolve a file path within a package (POSIX, path-traversal safe).\n */\nexport function resolvePackageFile(packagePath: string, filePath: string): string {\n const normalized = posixNormalize(filePath.replace(/\\\\/g, '/'));\n if (normalized.startsWith('..') || posixIsAbsolute(normalized)) {\n throw new SecurityError(`Invalid file path within package: ${filePath}`);\n }\n\n const packageNorm = packagePath.replace(/\\\\/g, '/');\n const resolvedPath = posixNormalize(`${packageNorm}/${normalized}`);\n\n if (!resolvedPath.startsWith(packageNorm.replace(/\\/$/, ''))) {\n throw new SecurityError(`Path traversal detected: ${filePath}`);\n }\n\n return resolvedPath;\n}\n\n/** Fetch the raw `.pdpkg` (ZIP) bytes for a package@version. The host injects it —\n * the browser with `fetch`, the Node CLI with its registry client — so the resolver\n * itself stays environment-agnostic. */\nexport type PackageDownloader = (name: string, version: string) => Promise<Uint8Array>;\n\n/** The in-memory FS capabilities the resolver needs to ingest a package — both\n * MemoryFileSystem and HybridFileSystem provide these. Duck-typed (not an\n * instanceof) so any host FS that can hold packages works. */\ninterface PackageCapableFileSystem {\n getPackagePath(name: string, version: string): string;\n isDirectory(path: string): boolean | Promise<boolean>;\n addPackage(name: string, version: string, buffer: Uint8Array): Promise<void>;\n}\nfunction isPackageCapable(fs: unknown): fs is PackageCapableFileSystem {\n const f = fs as Partial<PackageCapableFileSystem> | undefined;\n return !!f && typeof f.getPackagePath === 'function' && typeof f.addPackage === 'function' && typeof f.isDirectory === 'function';\n}\n\n/**\n * The environment-agnostic package resolver: loads `using:`/`inherits:` packages\n * into an in-memory FS via an injected registry download. This is the ONE resolver\n * for every host that compiles in memory (the browser, and Node when not using the\n * disk cache) — so the download/unzip/cache logic isn't duplicated per host.\n *\n * `resolvePackage` returns the in-memory directory path; the compiler then reads\n * the referenced file from `options.fileSystem` via resolvePackageFile.\n */\nexport class MemoryPackageResolver implements IPackageResolver {\n constructor(private readonly download: PackageDownloader) {}\n\n async resolvePackage(packageRef: string, options: ResolvePackageOptions): Promise<string> {\n const fs = options.fileSystem;\n if (!isPackageCapable(fs)) {\n throw new Error('MemoryPackageResolver requires a package-capable in-memory file system (MemoryFileSystem or HybridFileSystem)');\n }\n if (!isValidPackageReference(packageRef)) {\n throw new SecurityError(`Invalid package reference format: ${packageRef}`);\n }\n const { name, version } = parsePackageReference(packageRef);\n const packagePath = fs.getPackagePath(name, version);\n if (await fs.isDirectory(packagePath)) return packagePath; // already loaded this session\n const buffer = await this.download(name, version);\n await fs.addPackage(name, version, buffer);\n return packagePath;\n }\n}\n","/**\n * Minimal POSIX path helpers so @prompd/core needs no Node 'path' import.\n * The in-memory/virtual file system uses POSIX-style paths throughout.\n */\n\nexport function normalizePosix(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(seg);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nexport function joinPosix(...segments: string[]): string {\n const filtered = segments.filter((s) => s && s.length > 0);\n if (filtered.length === 0) return '.';\n return normalizePosix(filtered.join('/'));\n}\n\n/** POSIX-style resolve relative to a base (absolute segments win). */\nexport function resolvePosix(base: string, p: string): string {\n if (p.startsWith('/')) return normalizePosix(p);\n return joinPosix(base, p);\n}\n\nexport function dirnamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n if (idx === -1) return '.';\n if (idx === 0) return '/';\n return norm.slice(0, idx);\n}\n\nexport function basenamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n return idx === -1 ? norm : norm.slice(idx + 1);\n}\n\nexport function isAbsolutePosix(p: string): boolean {\n return p.startsWith('/');\n}\n\n/** Return the extension including the dot (e.g. \".prmd\"), or \"\" if none. */\nexport function extname(p: string): string {\n const base = basenamePosix(p);\n const dot = base.lastIndexOf('.');\n return dot <= 0 ? '' : base.slice(dot);\n}\n\n/**\n * Prompd source file extensions. A .prmd is just markdown (.md) with YAML\n * frontmatter, so both are treated as first-class prompt sources.\n */\nexport const PROMPD_EXTENSIONS = ['.prmd', '.md'] as const;\n\n/** True if the path is a Prompd source file (.prmd or .md). */\nexport function isPrompdFile(p: string): boolean {\n const lower = p.toLowerCase();\n return lower.endsWith('.prmd') || lower.endsWith('.md');\n}\n","/**\r\n * Compilation pipeline orchestrator.\r\n *\r\n * Manages the execution of the 6-stage compilation pipeline, ensuring stages\r\n * run in order and errors are properly propagated.\r\n */\r\n\r\nimport {\r\n CompilationContext,\r\n CompilationOptions,\r\n CompilerStage,\r\n DEFAULT_SECURITY_CONFIG,\r\n SecurityConfig,\r\n IPackageResolver\r\n} from './types';\r\nimport { PrompdError } from '../errors';\r\nimport { IFileSystem } from './file-system';\r\nimport { parsePackageReferenceWithPath, resolvePackageFile } from './package-ref';\r\nimport { isPrompdFile } from './path-utils';\r\n\r\n/**\r\n * The main compiler pipeline orchestrator.\r\n */\r\nexport class CompilerPipeline {\r\n private stages: CompilerStage[];\r\n private securityConfig: SecurityConfig;\r\n\r\n constructor(stages?: CompilerStage[], securityConfig?: SecurityConfig) {\r\n this.stages = stages || [];\r\n this.securityConfig = securityConfig || DEFAULT_SECURITY_CONFIG;\r\n }\r\n\r\n /**\r\n * Register a compilation stage.\r\n */\r\n registerStage(stage: CompilerStage): void {\r\n this.stages.push(stage);\r\n }\r\n\r\n /**\r\n * Execute the compilation pipeline.\r\n *\r\n * @param source - Path to .prmd file or package reference\r\n * @param options - Compilation options\r\n * @returns Compilation context with result or errors\r\n */\r\n async execute(source: string, options: CompilationOptions = {}): Promise<CompilationContext> {\r\n // @prompd/core requires an injected file system (MemoryFileSystem in the\r\n // browser/server). The Node CLI supplies NodeFileSystem.\r\n const fileSystem = options.fileSystem;\r\n if (!fileSystem) {\r\n throw new PrompdError('A fileSystem must be provided to the compiler (e.g. MemoryFileSystem).');\r\n }\r\n\r\n // Resolve source (handles both file paths and package references)\r\n const sourcePath = await this.resolveSource(source, fileSystem, options.packageResolver, options.registryUrl, options.workspaceRoot);\r\n\r\n // Create compilation context\r\n const context = new CompilationContext(sourcePath, options);\r\n\r\n // Set file system\r\n context.fileSystem = fileSystem;\r\n\r\n // Run each stage in sequence\r\n // Continue through all stages to accumulate all errors (don't stop at first error)\r\n for (const stage of this.stages) {\r\n try {\r\n if (context.verbose) {\r\n console.log(`Running stage: ${stage.getName()}`);\r\n }\r\n await stage.process(context);\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addError(`${stage.getName()} failed: ${errorMessage}`);\r\n // Continue to next stage to find additional errors\r\n }\r\n }\r\n\r\n return context;\r\n }\r\n\r\n /**\r\n * Resolve source to file path (handles package references).\r\n *\r\n * @param source - Package reference or file path\r\n * @param fileSystem - File system to use for resolution\r\n * @param customFileSystem - Optional custom file system (used to detect in-memory mode)\r\n * @param registryUrl - Optional registry URL for package resolution\r\n * @param workspaceRoot - Optional workspace root for package cache location\r\n */\r\n private async resolveSource(source: string, fileSystem: IFileSystem, packageResolver?: IPackageResolver, registryUrl?: string, workspaceRoot?: string): Promise<string> {\r\n // Check if it's a package reference (starts with @)\r\n if (source.startsWith('@')) {\r\n if (!packageResolver) {\r\n throw new PrompdError(\r\n `Package resolution is unavailable in this environment: ${source}. ` +\r\n `Compile via the backend, or provide a packageResolver in the compilation options.`\r\n );\r\n }\r\n\r\n try {\r\n // Check if the reference includes a specific file path\r\n const { filePath } = parsePackageReferenceWithPath(source);\r\n\r\n // resolvePackage handles stripping the file path internally\r\n const packagePath = await packageResolver.resolvePackage(source, {\r\n fileSystem,\r\n registryUrl,\r\n workspaceRoot\r\n });\r\n\r\n // If a specific file was requested, resolve it within the package\r\n if (filePath) {\r\n return resolvePackageFile(packagePath, filePath);\r\n }\r\n\r\n // No specific file — find the main .prmd file in the package\r\n const prmdFiles = await this.findPromdFiles(packagePath, fileSystem);\r\n\r\n if (prmdFiles.length === 0) {\r\n throw new Error(`No .prmd files found in package: ${source}`);\r\n }\r\n\r\n // Use the first .prmd file (or could look for main.prmd)\r\n return prmdFiles[0];\r\n } catch (error) {\r\n throw new PrompdError(`Failed to resolve package ${source}: ${error}`);\r\n }\r\n }\r\n\r\n // Regular path: with a virtual/in-memory file system, paths like\r\n // '/main.prmd' stay as-is (no disk resolution).\r\n return source;\r\n }\r\n\r\n /**\r\n * Find all .prmd files in a directory.\r\n *\r\n * @param dir - Directory path\r\n * @param fileSystem - File system to use\r\n */\r\n private async findPromdFiles(dir: string, fileSystem: IFileSystem): Promise<string[]> {\r\n const files: string[] = [];\r\n\r\n try {\r\n // Use fileSystem abstraction instead of fs module\r\n const entries = await fileSystem.readdir(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = fileSystem.join(dir, entry);\r\n\r\n if (await fileSystem.isDirectory(fullPath)) {\r\n // Recursively search subdirectories\r\n const subFiles = await this.findPromdFiles(fullPath, fileSystem);\r\n files.push(...subFiles);\r\n } else if (isPrompdFile(entry)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n } catch (error) {\r\n // Ignore errors (directory not accessible, etc.)\r\n }\r\n\r\n return files;\r\n }\r\n\r\n /**\r\n * Get registered stages.\r\n */\r\n getStages(): CompilerStage[] {\r\n return [...this.stages];\r\n }\r\n}\r\n","/**\n * Lexical Analysis Stage - Parse YAML frontmatter + Markdown content.\n *\n * This stage parses the .prmd file into structured metadata and content,\n * populating the compilation context for subsequent stages.\n */\n\nimport { CompilerStage, CompilationContext } from '../types';\nimport { PrompdParser } from '../../parser';\n\nexport class LexicalAnalysisStage implements CompilerStage {\n private parser: PrompdParser;\n\n constructor() {\n this.parser = new PrompdParser();\n }\n\n async process(context: CompilationContext): Promise<void> {\n try {\n // Read file content from file system\n const fileContent = await context.fileSystem.readFile(context.sourceFile);\n\n // Store raw source for line number calculation in later stages\n context.rawSource = fileContent;\n\n // Parse the .prmd file content\n const prompd = this.parser.parseContent(fileContent, context.sourceFile);\n\n // Populate compilation context\n context.metadata = prompd.metadata;\n context.content = prompd.content;\n\n // Convert YAML-defined sections to markdown sections\n context.content = this.injectYamlSections(prompd.metadata, context.content);\n\n if (context.verbose) {\n console.log(`✓ Parsed file: ${context.sourceFile}`);\n console.log(` - Name: ${prompd.metadata.name}`);\n console.log(` - Version: ${prompd.metadata.version || 'N/A'}`);\n console.log(` - Parameters: ${prompd.metadata.parameters?.length || 0}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Try to extract line number from YAML parser errors\n let line: number | undefined;\n let column: number | undefined;\n const lineMatch = errorMessage.match(/at line (\\d+)(?:,? column (\\d+))?/i);\n if (lineMatch) {\n line = parseInt(lineMatch[1], 10) + 1; // Add 1 for opening ---\n column = lineMatch[2] ? parseInt(lineMatch[2], 10) : 1;\n }\n\n context.addDiagnostic({\n message: `Lexical analysis failed: ${errorMessage}`,\n severity: 'error',\n source: 'lexical',\n line,\n column,\n code: 'PARSE_ERROR'\n });\n }\n }\n\n /**\n * Convert YAML-defined sections (system, user, assistant, etc.) to markdown sections.\n * These are appended to the content after any markdown-defined sections.\n */\n private injectYamlSections(metadata: any, content: string): string {\n const yamlSections: string[] = [];\n\n // Standard section order: system → context → task → user → assistant → response → output\n const sectionOrder = ['system', 'context', 'task', 'user', 'assistant', 'response', 'output'];\n\n for (const sectionName of sectionOrder) {\n const sectionValue = metadata[sectionName];\n\n if (sectionValue) {\n // Capitalize first letter for markdown heading\n const headingName = sectionName.charAt(0).toUpperCase() + sectionName.slice(1);\n\n if (Array.isArray(sectionValue)) {\n // Array of file paths - will be processed by asset extraction stage\n yamlSections.push(`# ${headingName}`);\n yamlSections.push(`[YAML section with ${sectionValue.length} file reference(s) - will be processed by asset extraction]`);\n } else if (typeof sectionValue === 'string') {\n // Direct string content or single file path\n yamlSections.push(`# ${headingName}`);\n yamlSections.push(sectionValue);\n }\n }\n }\n\n // Append YAML sections to existing content\n if (yamlSections.length > 0) {\n const yamlContent = yamlSections.join('\\n\\n');\n return content ? `${content}\\n\\n${yamlContent}` : yamlContent;\n }\n\n return content;\n }\n\n getName(): string {\n return 'Lexical Analysis';\n }\n}\n","/**\n * Dependency Resolution Stage\n *\n * Resolves 'using:' imports and 'inherits:' chains, handling both local file\n * paths and package references with alias resolution.\n *\n * This is a direct port of the Python CLI's DependencyResolutionStage.\n */\n\nimport { CompilerStage, CompilationContext, ResolvedPackage } from '../types';\nimport { resolvePackageFile } from '../package-ref';\nimport { isPrompdFile } from '../path-utils';\n\nexport class DependencyResolutionStage implements CompilerStage {\n /**\n * Resolve a package reference via the injected resolver. Absent in the browser\n * (single-file compile), where package/inherits resolution is the backend's job.\n */\n private async resolvePackage(context: CompilationContext, packageRef: string): Promise<string> {\n if (!context.packageResolver) {\n throw new Error(\n `Package resolution is unavailable in this environment: ${packageRef}. ` +\n `Compile via the backend to resolve packages and inheritance.`\n );\n }\n return context.packageResolver.resolvePackage(packageRef, {\n fileSystem: context.fileSystem,\n registryUrl: context.registryUrl,\n workspaceRoot: context.workspaceRoot\n });\n }\n\n async process(context: CompilationContext): Promise<void> {\n if (!context.metadata) {\n return;\n }\n\n // Initialize resolved packages\n const resolvedPackages: Record<string, ResolvedPackage> = {};\n\n // Process 'using' field (package imports with optional prefixes)\n if (context.metadata.using) {\n await this.processUsingField(context, context.metadata.using, resolvedPackages);\n }\n\n // Store resolved imports\n context.dependencies.imports = resolvedPackages;\n\n // Process 'inherits' field (can be package reference or direct file path)\n if (context.metadata.inherits) {\n await this.processInheritsField(context, context.metadata.inherits, resolvedPackages);\n }\n\n // Process content reference fields for alias resolution\n await this.processContentFieldAliases(context, resolvedPackages);\n }\n\n /**\n * Process the 'using' field for package imports.\n */\n private async processUsingField(\n context: CompilationContext,\n usingImports: any,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n if (typeof usingImports === 'string') {\n // Simple string: using: \"@package@version\"\n await this.resolvePackageImport(context, usingImports, null, resolvedPackages);\n } else if (Array.isArray(usingImports)) {\n // List of packages (can be strings, dicts, or objects)\n for (const item of usingImports) {\n if (typeof item === 'string') {\n // Simple string in list\n await this.resolvePackageImport(context, item, null, resolvedPackages);\n } else if (typeof item === 'object' && item !== null) {\n // Object with name and REQUIRED prefix\n const packageRef = item.name || item.package || '';\n const prefix = item.prefix;\n\n if (packageRef) {\n // Prefix is required for 'using' - the whole point is to create a shorthand\n if (!prefix) {\n context.addError(\n `Package '${packageRef}' in 'using' field must have a prefix for shorthand access`\n );\n continue;\n }\n\n await this.resolvePackageImport(context, packageRef, prefix, resolvedPackages);\n }\n }\n }\n } else if (typeof usingImports === 'object' && usingImports !== null) {\n // Dict format: {package: prefix} or structured format\n for (const [key, value] of Object.entries(usingImports)) {\n if (typeof value === 'string') {\n // Format: {\"@package@version\": \"prefix\"}\n await this.resolvePackageImport(context, key, value, resolvedPackages);\n } else if (typeof value === 'object' && value !== null && 'prefix' in value) {\n // Format: {\"@package@version\": {\"prefix\": \"alias\"}}\n const prefix = (value as any).prefix;\n await this.resolvePackageImport(context, key, prefix, resolvedPackages);\n }\n }\n }\n }\n\n /**\n * Resolve a single package import.\n */\n private async resolvePackageImport(\n context: CompilationContext,\n packageRef: string,\n prefix: string | null,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n try {\n // Resolve via the injected package resolver (Node CLI only).\n const packagePath = await this.resolvePackage(context, packageRef);\n resolvedPackages[packageRef] = {\n path: packagePath,\n prefix: prefix || undefined\n };\n\n if (context.verbose) {\n if (prefix) {\n console.log(`✓ Resolved package: ${packageRef} -> ${packagePath} (prefix: ${prefix})`);\n } else {\n console.log(`✓ Resolved package: ${packageRef} -> ${packagePath}`);\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n // Find location of 'using:' in source\n const location = context.findLocation(/using:/);\n context.addDiagnostic({\n message: `Failed to resolve package ${packageRef}: ${errorMessage}`,\n severity: 'warning',\n source: 'dependency',\n code: 'PACKAGE_NOT_FOUND',\n ...location\n });\n }\n }\n\n /**\n * Process the 'inherits' field.\n */\n private async processInheritsField(\n context: CompilationContext,\n inheritsRef: string,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n // Resolve aliases in inherits field\n const resolvedInheritsRef = this.resolveAliasInPath(inheritsRef, resolvedPackages);\n\n if (resolvedInheritsRef !== inheritsRef) {\n // Update the metadata with the resolved reference\n if (context.metadata) {\n context.metadata.inherits = resolvedInheritsRef;\n }\n if (context.verbose) {\n console.log(`✓ Resolved alias in inherits: ${resolvedInheritsRef}`);\n }\n }\n\n // Check if it's a local file path (starts with . or / or doesn't start with @)\n if (\n resolvedInheritsRef.startsWith('./') ||\n resolvedInheritsRef.startsWith('../') ||\n resolvedInheritsRef.startsWith('/') ||\n (!resolvedInheritsRef.startsWith('@') && isPrompdFile(resolvedInheritsRef))\n ) {\n // Direct file path - resolve relative to source file\n const sourceDir = context.fileSystem.dirname(context.sourceFile);\n const parentPath = context.fileSystem.resolve(sourceDir, resolvedInheritsRef);\n\n // Verify the inherited file exists\n const fileExists = await context.fileSystem.exists(parentPath);\n if (!fileExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited file not found: \"${resolvedInheritsRef}\" (resolved to: ${parentPath})`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_FILE_NOT_FOUND',\n ...location\n });\n return; // Don't set dependencies.inherits if file doesn't exist\n }\n\n context.dependencies.inherits = parentPath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance file: ${resolvedInheritsRef} -> ${parentPath}`);\n }\n } else {\n // Package reference with file path - resolve through package system\n try {\n // Parse package reference and file path\n // Format: @namespace/package@version/path/to/file.prmd\n const pattern = /^(@[\\w.-]+\\/[\\w.-]+@[\\w.-]+)\\/(.+)$/;\n const match = resolvedInheritsRef.match(pattern);\n\n if (match) {\n const packageRef = match[1]; // @namespace/package@version\n const filePathInPackage = match[2]; // path/to/file.prmd\n\n if (context.verbose) {\n console.log(`Parsing package inheritance: ${packageRef} / ${filePathInPackage}`);\n }\n\n // Resolve the package to its local path via the injected resolver.\n const packagePath = await this.resolvePackage(context, packageRef);\n\n // Construct full path to the inherited file\n const fullFilePath = resolvePackageFile(packagePath, filePathInPackage);\n\n // Verify the file exists within the package\n const fileExists = await context.fileSystem.exists(fullFilePath);\n if (!fileExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited file not found in package: \"${filePathInPackage}\" (package: ${packageRef})`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_FILE_NOT_FOUND',\n ...location\n });\n return;\n }\n\n context.dependencies.inherits = fullFilePath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance package: ${resolvedInheritsRef} -> ${fullFilePath}`);\n }\n } else {\n // Fallback: try as direct package reference.\n const parentPath = await this.resolvePackage(context, resolvedInheritsRef);\n\n // Verify the package directory exists\n const dirExists = await context.fileSystem.exists(parentPath);\n if (!dirExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited package not found: \"${resolvedInheritsRef}\"`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_PACKAGE_NOT_FOUND',\n ...location\n });\n return;\n }\n\n context.dependencies.inherits = parentPath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance package (direct): ${resolvedInheritsRef} -> ${parentPath}`);\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n // Find location of 'inherits:' in source\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Failed to resolve inheritance \"${resolvedInheritsRef}\": ${errorMessage}`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_NOT_FOUND',\n ...location\n });\n }\n }\n }\n\n /**\n * Process content reference fields (system, context, user, assistant, response) for alias resolution.\n */\n private async processContentFieldAliases(\n context: CompilationContext,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n if (!context.metadata) {\n return;\n }\n\n const contentFields = ['system', 'assistant', 'context', 'user', 'response'];\n\n for (const fieldName of contentFields) {\n const fieldValue = (context.metadata as any)[fieldName];\n\n if (fieldValue) {\n // Handle both single strings and lists of strings\n if (typeof fieldValue === 'string') {\n const resolvedValue = this.resolveAliasInPath(fieldValue, resolvedPackages);\n if (resolvedValue !== fieldValue) {\n (context.metadata as any)[fieldName] = resolvedValue;\n if (context.verbose) {\n console.log(`✓ Resolved alias in ${fieldName}: ${fieldValue} -> ${resolvedValue}`);\n }\n }\n } else if (Array.isArray(fieldValue)) {\n const resolvedList: any[] = [];\n for (const item of fieldValue) {\n if (typeof item === 'string') {\n const resolvedItem = this.resolveAliasInPath(item, resolvedPackages);\n resolvedList.push(resolvedItem);\n if (resolvedItem !== item && context.verbose) {\n console.log(`✓ Resolved alias in ${fieldName}: ${item} -> ${resolvedItem}`);\n }\n } else {\n resolvedList.push(item);\n }\n }\n (context.metadata as any)[fieldName] = resolvedList;\n }\n }\n }\n }\n\n /**\n * Resolve alias prefixes in file paths.\n *\n * Examples:\n * - \"@pkg/templates/file.prmd\" with \"@pkg\" aliased to \"@scope/package@version\"\n * becomes \"@scope/package@version/templates/file.prmd\"\n */\n private resolveAliasInPath(\n pathStr: string,\n resolvedPackages: Record<string, ResolvedPackage>\n ): string {\n if (!pathStr.startsWith('@') || !pathStr.includes('/')) {\n return pathStr;\n }\n\n // Extract the potential alias (everything before the first '/')\n // Use indexOf to preserve the full remaining path (split with limit truncates)\n const firstSlashIndex = pathStr.indexOf('/');\n const potentialAlias = pathStr.substring(0, firstSlashIndex); // e.g., \"@pkg\"\n const remainingPath = pathStr.substring(firstSlashIndex + 1); // e.g., \"templates/file.prmd\"\n\n // Look for this alias in resolved packages\n for (const [packageName, packageInfo] of Object.entries(resolvedPackages)) {\n if (packageInfo.prefix === potentialAlias) {\n // Found the alias! Replace it with the full package name\n const resolvedPath = `${packageName}/${remainingPath}`;\n return resolvedPath;\n }\n }\n\n // No alias found, return original path\n return pathStr;\n }\n\n getName(): string {\n return 'Dependency Resolution';\n }\n}\n","/**\n * Date/datetime parameter resolution.\n *\n * A `date` / `datetime` parameter's value (default or provided) may be a relative\n * expression resolved at COMPILE TIME — so each run uses the current date:\n * now today (alias)\n * now-7d 7 days ago now+1d\n * now-1w 1 week ago now+2weeks\n * now-3m / -3mo 3 months ago now+1month\n * now-1y 1 year ago now+1year\n * now+2h 2 hours from now (datetime)\n * now-30min 30 minutes ago\n * now-15s 15 seconds ago\n * or an ISO / Date-parseable literal (e.g. \"2026-06-10\", \"2026-06-10T09:00\").\n *\n * Output: `date` -> \"YYYY-MM-DD\", `datetime` -> \"YYYY-MM-DDTHH:mm:ss\" (local time).\n * A value that isn't a recognized date expression is returned unchanged so type\n * validation can flag it.\n */\n\n/** Parse a relative date expression or a literal into a Date, or null. */\nexport function parseDateExpr(input: string): Date | null {\n const v = (input ?? '').trim();\n if (!v) return null;\n const lower = v.toLowerCase();\n\n if (lower === 'now' || lower === 'today') return new Date();\n\n const rel = lower.match(/^(?:now|today)\\s*([+-])\\s*(\\d+)\\s*([a-z]+)$/);\n if (rel) {\n const n = (rel[1] === '-' ? -1 : 1) * parseInt(rel[2], 10);\n const u = rel[3];\n const d = new Date();\n if (u === 'd' || u.startsWith('day')) d.setDate(d.getDate() + n);\n else if (u === 'w' || u.startsWith('week')) d.setDate(d.getDate() + n * 7);\n else if (u === 'min' || u.startsWith('minute')) d.setMinutes(d.getMinutes() + n);\n else if (u === 'mo' || u === 'm' || u.startsWith('month')) d.setMonth(d.getMonth() + n);\n else if (u === 'y' || u.startsWith('year')) d.setFullYear(d.getFullYear() + n);\n else if (u === 'h' || u.startsWith('hour')) d.setHours(d.getHours() + n);\n else if (u === 's' || u === 'sec' || u.startsWith('second')) d.setSeconds(d.getSeconds() + n);\n else return null; // unknown unit\n return d;\n }\n\n // Date-only literal: parse as LOCAL midnight. `new Date(\"2026-01-15\")` would\n // parse as UTC, which shifts the day in negative-offset timezones.\n const dateOnly = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (dateOnly) {\n return new Date(Number(dateOnly[1]), Number(dateOnly[2]) - 1, Number(dateOnly[3]));\n }\n\n const parsed = new Date(v);\n return isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/** Local \"YYYY-MM-DD\". */\nexport function formatDate(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Local \"YYYY-MM-DDTHH:mm:ss\". */\nexport function formatDateTime(d: Date): string {\n return `${formatDate(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\n/** Resolve a date/datetime value to its formatted string; non-strings and\n * unrecognized expressions pass through unchanged. */\nexport function resolveDateValue(value: unknown, withTime: boolean): unknown {\n if (typeof value !== 'string') return value;\n const d = parseDateExpr(value);\n if (!d) return value;\n return withTime ? formatDateTime(d) : formatDate(d);\n}\n","/**\r\n * Semantic Analysis Stage - Validate parameters and references.\r\n *\r\n * This stage validates the semantic correctness of the prompt, checks required\r\n * parameters, applies default values, and validates parameter types.\r\n */\r\n\r\nimport { CompilerStage, CompilationContext } from '../types';\r\nimport { resolveDateValue, parseDateExpr } from '../date-utils';\r\n\r\nexport class SemanticAnalysisStage implements CompilerStage {\r\n async process(context: CompilationContext): Promise<void> {\r\n if (!context.metadata) {\r\n return;\r\n }\r\n\r\n // Validate required metadata fields\r\n this.validateRequiredMetadata(context);\r\n\r\n // Merge default parameter values and validate required parameters\r\n if (context.metadata.parameters) {\r\n // Only validate required parameters if we're in execution mode (parameters were explicitly provided).\r\n // When editing/validating a file (no parameters passed), we shouldn't warn about\r\n // required parameters since they'll be provided at execution time.\r\n // A prompt definition file declaring required parameters is perfectly valid.\r\n const isExecutionMode = Object.keys(context.parameters).length > 0;\r\n\r\n for (const param of context.metadata.parameters) {\r\n // Add default value if parameter not provided\r\n if (!(param.name in context.parameters) && param.default !== undefined) {\r\n context.parameters[param.name] = param.default;\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Using default value for '${param.name}': ${param.default}`);\r\n }\r\n }\r\n\r\n // Validate required parameters - only when executing (parameters were provided)\r\n // Skip this check when just validating a definition file\r\n if (isExecutionMode && param.required && !(param.name in context.parameters)) {\r\n context.addWarning(`Required parameter '${param.name}' not provided`);\r\n }\r\n\r\n // Type coercion for provided parameters.\r\n // CLI args always arrive as strings; coerce to the declared type before validation.\r\n if (param.name in context.parameters) {\r\n context.parameters[param.name] = this.coerceParameterValue(\r\n context.parameters[param.name],\r\n param.type\r\n );\r\n }\r\n\r\n // Type validation for provided parameters\r\n if (param.name in context.parameters) {\r\n const value = context.parameters[param.name];\r\n const isValid = this.validateParameterType(value, param.type);\r\n\r\n if (!isValid) {\r\n context.addWarning(\r\n `Parameter '${param.name}' has incorrect type. Expected: ${param.type}, got: ${typeof value}`\r\n );\r\n }\r\n }\r\n\r\n // Pattern validation for string parameters\r\n if (param.pattern && param.name in context.parameters) {\r\n const value = String(context.parameters[param.name]);\r\n const regex = new RegExp(param.pattern);\r\n\r\n if (!regex.test(value)) {\r\n context.addWarning(\r\n `Parameter '${param.name}' does not match pattern: ${param.pattern}`\r\n );\r\n }\r\n }\r\n\r\n // Range validation for number parameters\r\n if (param.type === 'number' && param.name in context.parameters) {\r\n const value = Number(context.parameters[param.name]);\r\n\r\n if (param.minimum !== undefined && value < param.minimum) {\r\n context.addWarning(\r\n `Parameter '${param.name}' is below minimum value: ${param.minimum}`\r\n );\r\n }\r\n\r\n if (param.maximum !== undefined && value > param.maximum) {\r\n context.addWarning(\r\n `Parameter '${param.name}' exceeds maximum value: ${param.maximum}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (context.verbose && context.parameters) {\r\n const paramCount = Object.keys(context.parameters).length;\r\n console.log(`✓ Validated ${paramCount} parameter(s)`);\r\n }\r\n }\r\n\r\n /**\r\n * Validate parameter type.\r\n */\r\n private validateParameterType(value: unknown, expectedType: string): boolean {\r\n switch (expectedType) {\r\n case 'string':\r\n case 'file': // file path provided as a string\r\n case 'base64': // base64-encoded binary provided as a string\r\n return typeof value === 'string';\r\n case 'number':\r\n case 'float':\r\n return typeof value === 'number' && !isNaN(value as number);\r\n case 'integer':\r\n return typeof value === 'number' && !isNaN(value as number) && Number.isInteger(value);\r\n case 'boolean':\r\n return typeof value === 'boolean';\r\n case 'array':\r\n return Array.isArray(value);\r\n case 'object':\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n case 'json':\r\n // Accepts any JSON-compatible value: already-parsed object/array, primitives,\r\n // or a string that is valid JSON.\r\n if (value === null || value === undefined) return false;\r\n if (typeof value !== 'string') return true; // already parsed\r\n try { JSON.parse(value as string); return true; } catch { return false; }\r\n case 'date':\r\n case 'datetime':\r\n // After coercion the value is a resolved date string; reject unparseable values.\r\n return typeof value === 'string' && parseDateExpr(value) !== null;\r\n default:\r\n return true; // Unknown type — allow it\r\n }\r\n }\r\n\r\n /**\r\n * Coerce a parameter value to its declared type.\r\n * CLI args always arrive as strings; this converts them to the correct runtime type\r\n * before the value is handed to the template engine.\r\n * Already-correct types (e.g. from a JSON params file) are passed through unchanged.\r\n */\r\n private coerceParameterValue(value: unknown, type: string): unknown {\r\n if (value === null || value === undefined) return value;\r\n\r\n switch (type) {\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'string') {\r\n if (value.toLowerCase() === 'true') return true;\r\n if (value.toLowerCase() === 'false') return false;\r\n }\r\n return value;\r\n\r\n case 'integer':\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') {\r\n const n = Number(value);\r\n if (!isNaN(n)) return n;\r\n }\r\n return value;\r\n\r\n case 'number':\r\n case 'float':\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') {\r\n const n = parseFloat(value);\r\n if (!isNaN(n)) return n;\r\n }\r\n return value;\r\n\r\n case 'json':\r\n case 'array':\r\n case 'object':\r\n if (typeof value !== 'string') return value; // already parsed\r\n try { return JSON.parse(value); } catch { return value; }\r\n\r\n case 'date':\r\n // Resolve relative expressions (now, now-7d, ...) / ISO literals at compile time.\r\n return resolveDateValue(value, false);\r\n\r\n case 'datetime':\r\n return resolveDateValue(value, true);\r\n\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Validate required metadata fields (id, name, version).\r\n */\r\n private validateRequiredMetadata(context: CompilationContext): void {\r\n const metadata = context.metadata;\r\n if (!metadata) return;\r\n\r\n // Validate 'id' field\r\n if (!metadata.id) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'id' is missing. Add a unique identifier for this prompt.\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_ID',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n } else if (typeof metadata.id === 'string') {\r\n // Validate kebab-case format\r\n if (!/^[a-z0-9-]+$/.test(metadata.id)) {\r\n const location = context.findLocation(/^\\s*id:/m);\r\n context.addDiagnostic({\r\n message: `ID '${metadata.id}' should use kebab-case format (lowercase letters, numbers, hyphens only).`,\r\n severity: 'warning',\r\n source: 'semantic',\r\n code: 'INVALID_ID_FORMAT',\r\n ...location\r\n });\r\n }\r\n }\r\n\r\n // Validate 'name' field\r\n if (!metadata.name) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'name' is missing. Add a display name for this prompt.\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_NAME',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n }\r\n\r\n // Validate 'version' field\r\n if (!metadata.version) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'version' is missing. Add a semantic version (e.g., 1.0.0).\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_VERSION',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n } else if (typeof metadata.version === 'string') {\r\n // Validate semantic version format\r\n if (!/^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$/.test(metadata.version)) {\r\n const location = context.findLocation(/^\\s*version:/m);\r\n context.addDiagnostic({\r\n message: `Invalid semantic version '${metadata.version}'. Use format: MAJOR.MINOR.PATCH (e.g., 1.0.0)`,\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'INVALID_VERSION',\r\n ...location\r\n });\r\n }\r\n }\r\n }\r\n\r\n getName(): string {\r\n return 'Semantic Analysis';\r\n }\r\n}\r\n","/**\n * Section Override Processing\n *\n * Provides complete functionality for parsing, validating, and applying\n * section-based content overrides in prompd template inheritance.\n *\n * This is a direct port of the Python CLI's SectionOverrideProcessor.\n */\n\nimport { SectionInfo } from './types';\nimport { ParseError, ValidationError, SecurityError } from '../errors';\nimport { IFileSystem } from './file-system';\nimport { isAbsolutePosix } from './path-utils';\n\nexport class SectionOverrideProcessor {\n /** Max override file size (DoS protection). */\n private static readonly MAX_OVERRIDE_SIZE = 10 * 1024 * 1024; // 10MB\n\n private headingPattern: RegExp;\n private sectionIdPattern: RegExp;\n\n constructor() {\n // Pattern to match markdown headings (# through ######)\n this.headingPattern = /^(#{1,6})\\s+(.+)$/gm;\n\n // Pattern to match section ID comments (strict - only valid IDs)\n this.sectionIdPattern = /<!--\\s*section-id:\\s*([a-z0-9-]+)\\s*-->/i;\n }\n\n /**\n * Pattern to detect any section-id comment (for validation)\n */\n private detectSectionIdComment(line: string): string | null {\n const match = /<!--\\s*section-id:\\s*(.+?)\\s*-->/i.exec(line);\n return match ? match[1].trim() : null;\n }\n\n /**\n * Extract all sections from markdown content.\n */\n extractSections(content: string): Map<string, SectionInfo> {\n if (!content || !content.trim()) {\n return new Map();\n }\n\n const sections = new Map<string, SectionInfo>();\n const lines = content.split('\\n');\n const encounteredSectionIds = new Set<string>();\n\n // Track explicit section ID comments\n const explicitSectionIds = new Map<number, string>();\n for (let i = 0; i < lines.length; i++) {\n // First check for any section-id comment (valid or invalid)\n const detectedId = this.detectSectionIdComment(lines[i]);\n if (detectedId) {\n // Validate the detected ID (will throw if invalid)\n this.validateSectionId(detectedId, i + 1);\n\n // Now try to match with strict pattern\n const match = this.sectionIdPattern.exec(lines[i]);\n if (match) {\n const sectionId = match[1];\n explicitSectionIds.set(i, sectionId);\n }\n }\n }\n\n // Find all headings and create sections\n const headingMatches: Array<{ level: number; text: string; line: number; index: number }> = [];\n let match;\n\n // Reset regex state\n this.headingPattern.lastIndex = 0;\n\n while ((match = this.headingPattern.exec(content)) !== null) {\n const headingLevel = match[1].length; // Number of # characters\n const headingText = match[2].trim();\n const headingLine = content.substring(0, match.index).split('\\n').length - 1;\n\n headingMatches.push({\n level: headingLevel,\n text: headingText,\n line: headingLine,\n index: match.index\n });\n }\n\n // Process each heading to create sections\n for (let i = 0; i < headingMatches.length; i++) {\n const heading = headingMatches[i];\n\n // Determine section ID\n let sectionId: string | null = null;\n\n // Check for explicit section ID comment before this heading (within 5 lines)\n for (let lineNum = heading.line; lineNum >= Math.max(0, heading.line - 5); lineNum--) {\n if (explicitSectionIds.has(lineNum)) {\n sectionId = explicitSectionIds.get(lineNum)!;\n break;\n }\n }\n\n // If no explicit ID, generate from heading text\n if (!sectionId) {\n sectionId = this.generateSectionId(heading.text);\n }\n\n // Validate section ID\n this.validateSectionId(sectionId, heading.line + 1);\n\n // Check for duplicate section IDs\n if (encounteredSectionIds.has(sectionId)) {\n throw new ParseError(\n `Duplicate section ID '${sectionId}' at line ${heading.line + 1}. ` +\n `Section IDs must be unique.`\n );\n }\n encounteredSectionIds.add(sectionId);\n\n // Determine section content boundaries\n const sectionStart = heading.index;\n const nextHeading = headingMatches[i + 1];\n const sectionEnd = nextHeading ? nextHeading.index : content.length;\n\n // Extract section content\n const sectionContent = content.substring(sectionStart, sectionEnd).trim();\n\n sections.set(sectionId, {\n id: sectionId,\n headingText: heading.text,\n content: sectionContent,\n startLine: heading.line,\n endLine: content.substring(0, sectionEnd).split('\\n').length - 1,\n headingLevel: heading.level\n });\n }\n\n return sections;\n }\n\n /**\n * Apply overrides and merge parent/child sections.\n */\n async applyOverrides(\n parentSections: Map<string, SectionInfo>,\n childSections: Map<string, SectionInfo>,\n overrides: Record<string, string | null>,\n baseDir: string,\n verbose: boolean = false,\n fileSystem?: IFileSystem\n ): Promise<string> {\n // Start with parent sections as base\n const mergedSections = new Map<string, SectionInfo>(parentSections);\n\n // Apply overrides\n for (const [sectionId, overridePath] of Object.entries(overrides)) {\n if (!mergedSections.has(sectionId)) {\n // Override references a section that doesn't exist in parent\n if (verbose) {\n const available = Array.from(mergedSections.keys()).sort().join(', ');\n console.log(\n `Warning: Override section '${sectionId}' not found in parent. Available: ${available}`\n );\n }\n continue;\n }\n\n if (overridePath === null) {\n // Remove section\n mergedSections.delete(sectionId);\n if (verbose) {\n console.log(` - Removing section '${sectionId}'`);\n }\n } else {\n // Replace section with content from file\n try {\n const overrideContent = await this.loadOverrideContent(overridePath, baseDir, fileSystem);\n\n const originalSection = mergedSections.get(sectionId)!;\n mergedSections.set(sectionId, {\n ...originalSection,\n content: overrideContent\n });\n\n if (verbose) {\n console.log(` - Replacing section '${sectionId}' with content from ${overridePath}`);\n }\n } catch (error) {\n throw new Error(\n `Failed to apply override for section '${sectionId}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n // Merge child sections (child overrides parent for matching IDs)\n for (const [sectionId, childSection] of childSections.entries()) {\n mergedSections.set(sectionId, childSection);\n\n if (verbose && parentSections.has(sectionId)) {\n console.log(` - Child overrides parent section '${sectionId}'`);\n } else if (verbose) {\n console.log(` - Adding child section '${sectionId}'`);\n }\n }\n\n // Reconstruct content from merged sections\n const contentParts: string[] = [];\n for (const section of mergedSections.values()) {\n contentParts.push(section.content);\n }\n\n return contentParts.join('\\n\\n');\n }\n\n /**\n * Load override content from a file.\n */\n async loadOverrideContent(overridePath: string, baseDir: string, fileSystem?: IFileSystem): Promise<string> {\n // @prompd/core always uses an injected file system (MemoryFileSystem in the\n // browser/server). The Node CLI provides NodeFileSystem.\n if (!fileSystem) {\n throw new Error('A fileSystem is required to load section override content.');\n }\n\n // Security: Validate and resolve path using the file system's own path style\n // (cross-platform; the in-memory FS is POSIX, NodeFileSystem is OS-native).\n const resolvedPath = this.resolveOverridePath(overridePath, baseDir, fileSystem);\n\n if (!(await fileSystem.exists(resolvedPath))) {\n throw new Error(`Override file not found: ${resolvedPath}`);\n }\n\n try {\n const content = await fileSystem.readFile(resolvedPath);\n // Security: cap override file size (DoS protection).\n if (content.length > SectionOverrideProcessor.MAX_OVERRIDE_SIZE) {\n throw new SecurityError(\n `Override file too large: ${content.length} bytes (max: ${SectionOverrideProcessor.MAX_OVERRIDE_SIZE})`\n );\n }\n return content.trim();\n } catch (error) {\n if (error instanceof SecurityError) throw error;\n throw new Error(\n `Failed to read override file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Resolve override path with security checks.\n */\n private resolveOverridePath(overridePath: string, baseDir: string, fileSystem: IFileSystem): string {\n // Security: Path traversal protection (string check, separator-agnostic).\n const cleaned = overridePath.replace(/\\\\/g, '/');\n if (cleaned.includes('..') && !cleaned.startsWith('./') && !cleaned.startsWith('../')) {\n throw new SecurityError(`Path traversal detected in override path: ${overridePath}`);\n }\n\n // Absolute paths (POSIX or Windows drive) are used as-is — the caller owns them.\n if (isAbsolutePosix(cleaned) || /^[A-Za-z]:/.test(overridePath)) {\n return overridePath;\n }\n\n // Resolve relative to baseDir via the file system's own path semantics.\n const resolved = fileSystem.resolve(baseDir, overridePath);\n\n // Security: ensure the resolved path stays within the base directory.\n const baseResolved = fileSystem.resolve(baseDir);\n const resolvedNorm = resolved.replace(/\\\\/g, '/');\n const baseNorm = baseResolved.replace(/\\\\/g, '/');\n if (!resolvedNorm.startsWith(baseNorm)) {\n throw new SecurityError(`Override path escapes base directory: ${overridePath}`);\n }\n\n return resolved;\n }\n\n /**\n * Generate a section ID from heading text (kebab-case).\n */\n private generateSectionId(headingText: string): string {\n return headingText\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove non-alphanumeric except spaces and hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\n }\n\n /**\n * Validate section ID format.\n */\n private validateSectionId(sectionId: string, lineNumber?: number): void {\n // Security: Reject IDs that might be used for code injection (check first)\n const dangerousPatterns = ['__proto__', 'constructor', 'prototype'];\n if (dangerousPatterns.some(pattern => sectionId.includes(pattern))) {\n throw new SecurityError(`Section ID contains forbidden pattern: ${sectionId}`);\n }\n\n // Security: Check for excessively long IDs (potential DoS)\n if (sectionId.length > 100) {\n throw new ValidationError(`Section ID too long: ${sectionId.length} characters (max: 100)`);\n }\n\n // Section IDs must be kebab-case (lowercase letters, numbers, hyphens)\n const validPattern = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;\n\n if (!validPattern.test(sectionId)) {\n const location = lineNumber ? ` at line ${lineNumber}` : '';\n throw new ValidationError(\n `Invalid section ID '${sectionId}'${location}. ` +\n `Section IDs must be kebab-case (lowercase letters, numbers, hyphens only).`\n );\n }\n }\n}\n","/**\n * Language Mapping Utilities\n *\n * Centralized file extension to programming language mappings\n * used across the compilation pipeline for:\n * - Wrapping extracted code files in markdown code blocks\n * - Filtering code blocks based on context file types\n */\n\n/**\n * Map of file extensions to primary markdown code block language identifier.\n * Used when wrapping extracted code files in markdown code blocks.\n */\nexport const EXTENSION_TO_LANGUAGE: Record<string, string> = {\n // TypeScript/JavaScript\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n // Python\n '.py': 'python',\n '.pyw': 'python',\n // Go\n '.go': 'go',\n // Rust\n '.rs': 'rust',\n // Java/Kotlin\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n // C/C++\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.hpp': 'cpp',\n '.cc': 'cpp',\n // C#\n '.cs': 'csharp',\n // Ruby\n '.rb': 'ruby',\n // PHP\n '.php': 'php',\n // Swift\n '.swift': 'swift',\n // Shell\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'zsh',\n '.fish': 'fish',\n // SQL\n '.sql': 'sql',\n // Web\n '.html': 'html',\n '.htm': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'sass',\n '.less': 'less',\n // Data formats\n '.xml': 'xml',\n '.svg': 'xml',\n '.json': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'toml',\n '.csv': 'csv',\n // Markdown\n '.md': 'markdown',\n '.mdx': 'markdown',\n};\n\n/**\n * Map of file extensions to all valid code block language identifiers.\n * Used when filtering code blocks - includes aliases (e.g., 'ts' for 'typescript').\n */\nexport const EXTENSION_TO_LANGUAGE_ALIASES: Record<string, string[]> = {\n // TypeScript/JavaScript\n '.ts': ['typescript', 'ts'],\n '.tsx': ['typescript', 'tsx', 'ts'],\n '.js': ['javascript', 'js'],\n '.jsx': ['javascript', 'jsx', 'js'],\n '.mjs': ['javascript', 'js'],\n '.cjs': ['javascript', 'js'],\n // Python\n '.py': ['python', 'py'],\n '.pyw': ['python', 'py'],\n // Go\n '.go': ['go', 'golang'],\n // Rust\n '.rs': ['rust', 'rs'],\n // Java/Kotlin\n '.java': ['java'],\n '.kt': ['kotlin', 'kt'],\n '.kts': ['kotlin', 'kt'],\n // C/C++\n '.c': ['c'],\n '.h': ['c', 'h'],\n '.cpp': ['cpp', 'c++', 'cxx'],\n '.hpp': ['cpp', 'c++', 'hpp'],\n '.cc': ['cpp', 'c++'],\n // C#\n '.cs': ['csharp', 'cs', 'c#'],\n // Ruby\n '.rb': ['ruby', 'rb'],\n // PHP\n '.php': ['php'],\n // Swift\n '.swift': ['swift'],\n // Shell\n '.sh': ['bash', 'sh', 'shell'],\n '.bash': ['bash', 'sh', 'shell'],\n '.zsh': ['zsh', 'sh', 'shell'],\n '.fish': ['fish'],\n // SQL\n '.sql': ['sql'],\n // Web\n '.html': ['html', 'htm'],\n '.htm': ['html', 'htm'],\n '.css': ['css'],\n '.scss': ['scss', 'sass'],\n '.sass': ['sass', 'scss'],\n '.less': ['less'],\n // Data formats\n '.json': ['json'],\n '.yaml': ['yaml', 'yml'],\n '.yml': ['yaml', 'yml'],\n '.xml': ['xml'],\n '.svg': ['xml', 'svg'],\n '.toml': ['toml'],\n '.csv': ['csv'],\n // Markdown\n '.md': ['markdown', 'md'],\n '.mdx': ['mdx', 'markdown', 'md'],\n};\n\n/**\n * Get the primary language identifier for a file extension.\n * @param ext - File extension (e.g., '.ts')\n * @returns Primary language identifier or undefined\n */\nexport function getLanguageForExtension(ext: string): string | undefined {\n return EXTENSION_TO_LANGUAGE[ext.toLowerCase()];\n}\n\n/**\n * Get all valid language identifiers (including aliases) for a file extension.\n * @param ext - File extension (e.g., '.ts')\n * @returns Array of language identifiers or empty array\n */\nexport function getLanguageAliasesForExtension(ext: string): string[] {\n return EXTENSION_TO_LANGUAGE_ALIASES[ext.toLowerCase()] || [];\n}\n","/**\n * Custom Nunjucks Loader for Prompd Files\n *\n * This loader enables {% include %} directives in .prmd files with compile-aware behavior:\n * - .prmd files: Parses and returns only the body content (frontmatter stripped)\n * - Other files (.md, .txt, etc.): Returns raw content as-is\n *\n * Features:\n * - Workspace-aware path resolution (relative to source file)\n * - Circular include detection\n * - Compile-on-demand for .prmd files\n */\n\nimport * as nunjucks from 'nunjucks';\nimport { IFileSystem } from './file-system';\nimport { PrompdParser } from '../parser';\nimport { extname, isAbsolutePosix, isPrompdFile, PROMPD_EXTENSIONS } from './path-utils';\n\n/**\n * Global include stack shared across all loader instances.\n * This is necessary because Nunjucks creates new loader instances for nested includes,\n * but we need to track the entire include chain to detect circular dependencies.\n *\n * The stack is keyed by a unique compilation ID to support concurrent compilations.\n */\nconst globalIncludeStacks = new Map<string, Set<string>>();\n\n/**\n * Generate a unique compilation ID.\n */\nlet compilationCounter = 0;\nfunction generateCompilationId(): string {\n return `compile-${++compilationCounter}-${Date.now()}`;\n}\n\n/**\n * Options for the Prompd loader.\n */\nexport interface PrompdLoaderOptions {\n /** File system abstraction (real FS or in-memory) */\n fileSystem: IFileSystem;\n /** Base directory for resolving relative paths */\n baseDir: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Maximum include depth to prevent infinite recursion */\n maxDepth?: number;\n /** Unique compilation ID for tracking include stack across loader instances */\n compilationId?: string;\n}\n\n/**\n * Loader result with source content and metadata.\n * Matches Nunjucks LoaderSource interface.\n */\ninterface LoaderResult {\n src: string;\n path: string;\n noCache: boolean;\n}\n\n/**\n * Custom Nunjucks loader that handles .prmd files specially.\n *\n * When a .prmd file is included, this loader:\n * 1. Parses the frontmatter\n * 2. Extracts only the body content\n * 3. Returns the body for inclusion\n *\n * This allows prompts to be composed from other prompts without\n * duplicating frontmatter or metadata.\n */\nexport class PrompdLoader extends nunjucks.Loader {\n // Required by Nunjucks loader interface - we use synchronous loading\n async = false;\n\n private fileSystem: IFileSystem;\n private baseDir: string;\n private verbose: boolean;\n private maxDepth: number;\n private parser: PrompdParser;\n private compilationId: string;\n\n constructor(options: PrompdLoaderOptions) {\n super();\n this.fileSystem = options.fileSystem;\n this.baseDir = options.baseDir;\n this.verbose = options.verbose || false;\n this.maxDepth = options.maxDepth || 10;\n this.parser = new PrompdParser();\n\n // Use provided compilation ID or generate a new one\n // The compilation ID links all loader instances in a single compilation\n this.compilationId = options.compilationId || generateCompilationId();\n\n // Initialize global stack for this compilation if needed\n if (!globalIncludeStacks.has(this.compilationId)) {\n globalIncludeStacks.set(this.compilationId, new Set());\n }\n }\n\n /**\n * Get the include stack for this compilation.\n */\n private getIncludeStack(): Set<string> {\n return globalIncludeStacks.get(this.compilationId) || new Set();\n }\n\n /**\n * Clean up the global stack after compilation is complete.\n * Should be called when the top-level compilation finishes.\n */\n static cleanupCompilation(compilationId: string): void {\n globalIncludeStacks.delete(compilationId);\n }\n\n /**\n * Get the source content for a template.\n * This is the main entry point called by Nunjucks.\n * Throws an error if the file is not found (required by Nunjucks interface).\n */\n getSource(name: string): LoaderResult {\n // Resolve path relative to base directory\n const resolvedPath = this.resolvePath(name);\n const includeStack = this.getIncludeStack();\n\n if (this.verbose) {\n console.log(`[include] Resolving: ${name} -> ${resolvedPath}`);\n }\n\n // Check for circular includes\n if (includeStack.has(resolvedPath)) {\n const stack = Array.from(includeStack).join(' -> ');\n throw new Error(\n `Circular include detected: ${stack} -> ${resolvedPath}`\n );\n }\n\n // Check max depth\n if (includeStack.size >= this.maxDepth) {\n throw new Error(\n `Maximum include depth (${this.maxDepth}) exceeded. Check for deep nesting or circular includes.`\n );\n }\n\n // Check if file exists\n const exists = this.fileSystem.exists(resolvedPath);\n if (typeof exists === 'object' && 'then' in exists) {\n // Async not supported in getSource - throw helpful error\n throw new Error(\n 'PrompdLoader requires synchronous file system operations. Use NodeFileSystem or ensure MemoryFileSystem is pre-populated.'\n );\n }\n\n if (!exists) {\n // Try Prompd source extensions if none was specified (.prmd, then .md)\n if (!isPrompdFile(resolvedPath)) {\n for (const ext of PROMPD_EXTENSIONS) {\n const withExt = resolvedPath + ext;\n if (this.fileSystem.exists(withExt) === true) {\n return this.loadFile(withExt);\n }\n }\n }\n\n // Nunjucks expects an error to be thrown for missing files\n throw new Error(`Template not found: ${name} (resolved to ${resolvedPath})`);\n }\n\n return this.loadFile(resolvedPath);\n }\n\n /**\n * Load and process a file.\n * Note: We do NOT remove from stack after loading because Nunjucks will process\n * the returned content which may contain more includes. The stack tracks the\n * entire include chain during a single compilation.\n */\n private loadFile(filePath: string): LoaderResult {\n const includeStack = this.getIncludeStack();\n\n // Add to include stack - this persists for the entire compilation\n includeStack.add(filePath);\n\n // Read file content\n const content = this.fileSystem.readFile(filePath);\n if (typeof content === 'object' && 'then' in content) {\n throw new Error(\n 'PrompdLoader requires synchronous file system operations.'\n );\n }\n\n // Process based on file extension\n const ext = extname(filePath).toLowerCase();\n let processedContent: string;\n\n if (isPrompdFile(filePath)) {\n // Parse Prompd source (.prmd or .md) and extract body only. For a .md\n // without frontmatter, processPrompdFile returns the content unchanged.\n processedContent = this.processPrompdFile(content, filePath);\n } else {\n // Return raw content for other file types\n processedContent = content;\n }\n\n if (this.verbose) {\n const preview = processedContent.substring(0, 50).replace(/\\n/g, '\\\\n');\n console.log(`[include] Loaded ${ext} file: ${filePath} (${preview}...)`);\n }\n\n return {\n src: processedContent,\n path: filePath,\n noCache: true // Don't cache - files may change\n };\n }\n\n /**\n * Process a .prmd file: parse frontmatter and return only the body.\n */\n private processPrompdFile(content: string, filePath: string): string {\n try {\n const parsed = this.parser.parseContent(content);\n\n if (this.verbose) {\n const paramCount = parsed.metadata?.parameters?.length || 0;\n console.log(`[include] Parsed .prmd: ${filePath} (${paramCount} params)`);\n }\n\n // Return just the body content (after frontmatter)\n // If no body, return empty string\n return parsed.content || '';\n } catch (error) {\n // If parsing fails, log warning and return raw content\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (this.verbose) {\n console.log(`[include] Warning: Failed to parse ${filePath}: ${errorMessage}`);\n }\n\n // Fall back to raw content minus frontmatter\n // Simple regex to strip frontmatter\n const withoutFrontmatter = content.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '');\n return withoutFrontmatter;\n }\n }\n\n /**\n * Resolve a path relative to the base directory.\n */\n private resolvePath(name: string): string {\n // Handle absolute paths\n if (isAbsolutePosix(name)) {\n return name;\n }\n\n // Handle relative paths (./file.prmd, ../file.prmd, file.prmd)\n return this.fileSystem.join(this.baseDir, name);\n }\n\n /**\n * Create a child loader for nested includes.\n * The child loader shares the compilation ID to use the same include stack.\n */\n createChildLoader(newBaseDir: string): PrompdLoader {\n return new PrompdLoader({\n fileSystem: this.fileSystem,\n baseDir: newBaseDir,\n verbose: this.verbose,\n maxDepth: this.maxDepth,\n compilationId: this.compilationId // Share the compilation ID for cycle detection\n });\n }\n\n /**\n * Get the compilation ID for this loader.\n * Useful for cleanup after compilation.\n */\n getCompilationId(): string {\n return this.compilationId;\n }\n}\n\n/**\n * Create a Nunjucks environment configured with the Prompd loader.\n *\n * @param options - Loader options\n * @returns Configured Nunjucks environment\n */\nexport function createPrompdEnvironment(options: PrompdLoaderOptions): nunjucks.Environment {\n const loader = new PrompdLoader(options);\n\n const env = new nunjucks.Environment(loader, {\n autoescape: false,\n throwOnUndefined: false,\n trimBlocks: true,\n lstripBlocks: true,\n tags: {\n blockStart: '{%',\n blockEnd: '%}',\n variableStart: '{{',\n variableEnd: '}}',\n commentStart: '{#',\n commentEnd: '#}'\n }\n });\n\n return env;\n}\n","/**\r\n * Template Processing Stage\r\n *\r\n * Processes Jinja2/Nunjucks templates, package references, and section overrides.\r\n * This is the most complex stage, handling:\r\n * - Nunjucks template rendering with custom filters (fromcsv, fromjson, tojson, lines)\r\n * - Package reference resolution and content injection\r\n * - Inheritance processing with section-aware merging\r\n * - Enhanced variable substitution with nested property access\r\n */\r\n\r\nimport * as nunjucks from 'nunjucks';\r\nimport { CompilerStage, CompilationContext } from '../types';\r\nimport { PrompdParser } from '../../parser';\r\nimport { SectionOverrideProcessor } from '../section-override';\r\nimport { resolvePackageFile } from '../package-ref';\r\nimport { getLanguageAliasesForExtension } from '../language-map';\r\nimport { PrompdLoader } from '../prompd-loader';\r\nimport { extname, resolvePosix, basenamePosix, isPrompdFile } from '../path-utils';\r\nimport { resolveDateValue } from '../date-utils';\r\n\r\nexport class TemplateProcessingStage implements CompilerStage {\r\n private sectionProcessor: SectionOverrideProcessor;\r\n private nunjucksEnv: nunjucks.Environment;\r\n\r\n constructor() {\r\n this.sectionProcessor = new SectionOverrideProcessor();\r\n\r\n // Configure Nunjucks to use double braces for variables (standard Jinja2/Nunjucks syntax)\r\n this.nunjucksEnv = new nunjucks.Environment(null, {\r\n autoescape: false, // Don't escape HTML - we're doing markdown\r\n throwOnUndefined: false, // Gracefully handle missing variables\r\n trimBlocks: true,\r\n lstripBlocks: true,\r\n tags: {\r\n blockStart: '{%',\r\n blockEnd: '%}',\r\n variableStart: '{{',\r\n variableEnd: '}}',\r\n commentStart: '{#',\r\n commentEnd: '#}'\r\n }\r\n });\r\n\r\n // Register custom filters\r\n this.registerFilters();\r\n }\r\n\r\n /**\r\n * Register custom Jinja2/Nunjucks filters for data transformation.\r\n */\r\n private registerFilters(): void {\r\n // fromcsv - Parse CSV string into array of objects\r\n this.nunjucksEnv.addFilter('fromcsv', (csvString: string) => {\r\n if (!csvString || typeof csvString !== 'string') {\r\n return [];\r\n }\r\n return this.parseCsv(csvString);\r\n });\r\n\r\n // fromjson - Parse JSON string into object/array.\r\n // If the value is already a parsed object or array (e.g. from a JSON params file),\r\n // pass it through unchanged instead of returning null.\r\n this.nunjucksEnv.addFilter('fromjson', (value: unknown) => {\r\n if (value === null || value === undefined) return null;\r\n if (typeof value !== 'string') return value; // already parsed\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n\r\n // tojson - Convert object to JSON string\r\n this.nunjucksEnv.addFilter('tojson', (obj: unknown, indent?: number) => {\r\n try {\r\n return JSON.stringify(obj, null, indent);\r\n } catch {\r\n return '{}';\r\n }\r\n });\r\n\r\n // lines - Split string into array of lines\r\n this.nunjucksEnv.addFilter('lines', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return [];\r\n }\r\n return str.split(/\\r?\\n/);\r\n });\r\n\r\n // dedent - Remove common leading whitespace from text\r\n this.nunjucksEnv.addFilter('dedent', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const lines = str.split(/\\r?\\n/);\r\n // Find minimum indentation (ignoring empty lines)\r\n let minIndent = Infinity;\r\n for (const line of lines) {\r\n if (line.trim().length === 0) continue;\r\n const match = line.match(/^(\\s*)/);\r\n if (match && match[1].length < minIndent) {\r\n minIndent = match[1].length;\r\n }\r\n }\r\n if (minIndent === Infinity) minIndent = 0;\r\n // Remove the common indent from all lines\r\n return lines.map(line => line.slice(minIndent)).join('\\n');\r\n });\r\n\r\n // truncate - Truncate string with ellipsis\r\n this.nunjucksEnv.addFilter('truncate', (str: string, length: number = 80, suffix: string = '...') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n if (str.length <= length) {\r\n return str;\r\n }\r\n return str.slice(0, length - suffix.length) + suffix;\r\n });\r\n\r\n // codeblock - Wrap content in fenced code block\r\n this.nunjucksEnv.addFilter('codeblock', (str: string, language: string = '') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n return '```' + language + '\\n' + str + '\\n```';\r\n });\r\n\r\n // unique - Remove duplicate items from array\r\n this.nunjucksEnv.addFilter('unique', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return [...new Set(arr)];\r\n });\r\n\r\n // pluck - Extract single field from array of objects\r\n this.nunjucksEnv.addFilter('pluck', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.map(item => item?.[field]).filter(v => v !== undefined);\r\n });\r\n\r\n // where - Filter objects by field value\r\n this.nunjucksEnv.addFilter('where', (arr: Record<string, unknown>[], field: string, value: unknown) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.filter(item => item?.[field] === value);\r\n });\r\n\r\n // groupby - Group array items by field value\r\n this.nunjucksEnv.addFilter('groupby', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return {};\r\n }\r\n const result: Record<string, Record<string, unknown>[]> = {};\r\n for (const item of arr) {\r\n const key = String(item?.[field] ?? 'undefined');\r\n if (!result[key]) {\r\n result[key] = [];\r\n }\r\n result[key].push(item);\r\n }\r\n return result;\r\n });\r\n\r\n // shuffle - Randomize array order\r\n this.nunjucksEnv.addFilter('shuffle', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled;\r\n });\r\n\r\n // sample - Pick random N items from array\r\n this.nunjucksEnv.addFilter('sample', (arr: unknown[], count: number = 1) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled.slice(0, Math.min(count, shuffled.length));\r\n });\r\n\r\n // wordwrap - Wrap text at specified width\r\n this.nunjucksEnv.addFilter('wordwrap', (str: string, width: number = 80) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const words = str.split(/\\s+/);\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n for (const word of words) {\r\n if (currentLine.length + word.length + 1 <= width) {\r\n currentLine += (currentLine ? ' ' : '') + word;\r\n } else {\r\n if (currentLine) lines.push(currentLine);\r\n currentLine = word;\r\n }\r\n }\r\n if (currentLine) lines.push(currentLine);\r\n return lines.join('\\n');\r\n });\r\n\r\n // bulletlist - Convert array/lines to bullet list\r\n this.nunjucksEnv.addFilter('bulletlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map(item => `- ${item}`).join('\\n');\r\n });\r\n\r\n // numberedlist - Convert array/lines to numbered list\r\n this.nunjucksEnv.addFilter('numberedlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map((item, i) => `${i + 1}. ${item}`).join('\\n');\r\n });\r\n }\r\n\r\n /**\r\n * Parse CSV string into array of record objects.\r\n */\r\n private parseCsv(csvString: string): Record<string, string>[] {\r\n const lines = csvString.trim().split(/\\r?\\n/);\r\n if (lines.length === 0) {\r\n return [];\r\n }\r\n\r\n // Parse header row\r\n const headers = this.parseCsvLine(lines[0]);\r\n\r\n // Parse data rows\r\n const records: Record<string, string>[] = [];\r\n for (let i = 1; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n if (!line) continue; // Skip empty lines\r\n\r\n const values = this.parseCsvLine(line);\r\n const record: Record<string, string> = {};\r\n\r\n for (let j = 0; j < headers.length; j++) {\r\n const header = headers[j].trim();\r\n const value = values[j]?.trim() ?? '';\r\n record[header] = value;\r\n }\r\n\r\n records.push(record);\r\n }\r\n\r\n return records;\r\n }\r\n\r\n /**\r\n * Parse a single CSV line, handling quoted values.\r\n */\r\n private parseCsvLine(line: string): string[] {\r\n const result: string[] = [];\r\n let current = '';\r\n let inQuotes = false;\r\n\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n // Escaped quote\r\n current += '\"';\r\n i++;\r\n } else {\r\n // Toggle quote mode\r\n inQuotes = !inQuotes;\r\n }\r\n } else if (char === ',' && !inQuotes) {\r\n result.push(current);\r\n current = '';\r\n } else {\r\n current += char;\r\n }\r\n }\r\n\r\n result.push(current);\r\n return result;\r\n }\r\n\r\n async process(context: CompilationContext): Promise<void> {\r\n if (!context.content) {\r\n return;\r\n }\r\n\r\n let content = context.content;\r\n\r\n // Step 1: Process package references with prefixes (e.g., @security/prompts/audit)\r\n if (context.dependencies.imports) {\r\n content = await this.processPackageReferences(context, content);\r\n }\r\n\r\n // Step 2: Process inheritance with section-aware override support\r\n if (context.dependencies.inherits) {\r\n content = await this.processInheritance(context, content);\r\n }\r\n\r\n // Step 3: Process standalone overrides (without inheritance)\r\n if (context.metadata?.override && !context.dependencies.inherits) {\r\n content = await this.processStandaloneOverrides(context, content);\r\n }\r\n\r\n // Step 4: Filter code blocks based on context file types\r\n // If context files are attached, only keep code blocks that match those file extensions\r\n if (context.metadata?.context) {\r\n content = this.filterCodeBlocksByContext(context, content);\r\n }\r\n\r\n // Step 5: Process templates with Jinja2/Nunjucks\r\n content = await this.processTemplate(context, content);\r\n\r\n context.content = content;\r\n }\r\n\r\n /**\r\n * Process package references (e.g., @prefix/path/to/file).\r\n */\r\n private async processPackageReferences(context: CompilationContext, content: string): Promise<string> {\r\n if (!context.dependencies.imports) {\r\n return content;\r\n }\r\n\r\n for (const [packageRef, packageInfo] of Object.entries(context.dependencies.imports)) {\r\n if (!packageInfo.prefix || !packageInfo.path) {\r\n continue;\r\n }\r\n\r\n const prefix = packageInfo.prefix;\r\n const packagePath = packageInfo.path;\r\n\r\n // Replace references like @security/prompts/audit with actual content\r\n // Pattern: @prefix/path/to/resource\r\n const pattern = new RegExp(`@${this.escapeRegex(prefix)}/([^\\\\s]+)`, 'g');\r\n\r\n // Find all matches first\r\n const matches: Array<{ match: string; resourcePath: string; index: number }> = [];\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n matches.push({\r\n match: match[0],\r\n resourcePath: match[1],\r\n index: match.index\r\n });\r\n }\r\n\r\n // Replace in reverse order to preserve indices\r\n for (let i = matches.length - 1; i >= 0; i--) {\r\n const m = matches[i];\r\n const replacement = await this.loadPackageResource(context, packagePath, m.resourcePath, prefix);\r\n content = content.substring(0, m.index) + replacement + content.substring(m.index + m.match.length);\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Load a resource from a package.\r\n */\r\n private async loadPackageResource(\r\n context: CompilationContext,\r\n packagePath: string,\r\n resourcePath: string,\r\n prefix: string\r\n ): Promise<string> {\r\n try {\r\n const fs = context.fileSystem;\r\n // Try different extensions\r\n const possibleExtensions = ['', '.prmd', '.md', '.txt'];\r\n\r\n for (const ext of possibleExtensions) {\r\n const filePath = resolvePackageFile(packagePath, resourcePath + ext);\r\n\r\n if (await fs.exists(filePath)) {\r\n const contentData = await fs.readFile(filePath);\r\n\r\n // If it's a Prompd source (.prmd/.md), parse and extract content\r\n if (isPrompdFile(filePath)) {\r\n const parser = new PrompdParser();\r\n try {\r\n const parsed = parser.parseContent(contentData);\r\n // Return just the content part, not metadata\r\n return parsed.content || `# Content from @${prefix}/${resourcePath}`;\r\n } catch {\r\n // If parsing fails, return raw content\r\n return contentData;\r\n }\r\n } else {\r\n // For other files, return as-is\r\n return contentData;\r\n }\r\n }\r\n }\r\n\r\n // File not found\r\n if (context.verbose) {\r\n console.log(`Warning: Could not find @${prefix}/${resourcePath} in ${packagePath}`);\r\n }\r\n return `[Not found: @${prefix}/${resourcePath}]`;\r\n } catch (error) {\r\n if (context.verbose) {\r\n console.log(`Warning: Failed to load @${prefix}/${resourcePath}: ${error}`);\r\n }\r\n return `[Error loading @${prefix}/${resourcePath}]`;\r\n }\r\n }\r\n\r\n /**\r\n * Process inheritance with section-aware merging.\r\n */\r\n private async processInheritance(context: CompilationContext, content: string): Promise<string> {\r\n const parentPath = context.dependencies.inherits;\r\n if (!parentPath) {\r\n return content;\r\n }\r\n\r\n try {\r\n const fs = context.fileSystem;\r\n const parser = new PrompdParser();\r\n let parentFile: string | null = null;\r\n\r\n // Check if it's a direct file path\r\n if (isPrompdFile(parentPath) && await fs.exists(parentPath)) {\r\n parentFile = parentPath;\r\n } else if (await fs.exists(parentPath) && await fs.isDirectory(parentPath)) {\r\n // Package directory - find main Prompd source file (.prmd or .md)\r\n const files = (await fs.readdir(parentPath)).filter((f: string) => isPrompdFile(f));\r\n\r\n if (files.length > 0) {\r\n // Look for main.prmd / main.md first\r\n const mainFile = files.find((f: string) => f === 'main.prmd' || f === 'main.md');\r\n parentFile = fs.join(parentPath, mainFile || files[0]);\r\n }\r\n }\r\n\r\n if (!parentFile) {\r\n // Find location of 'inherits:' in source for accurate error positioning\r\n const location = context.findLocation(/inherits:/);\r\n context.addDiagnostic({\r\n message: `Could not find inherited file: ${parentPath}`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'INHERITED_FILE_NOT_FOUND',\r\n ...location\r\n });\r\n return content;\r\n }\r\n\r\n // Parse parent file - read content from file system\r\n const parentFileContent = await fs.readFile(parentFile);\r\n const parentData = parser.parseContent(parentFileContent);\r\n\r\n // Validate that all file references in the parent's metadata actually exist on disk.\r\n // AssetExtractionStage only processes the child's metadata, so the parent's file\r\n // references (system:, context:, etc.) must be validated here.\r\n await this.validateParentFileReferences(context, parentData.metadata as unknown as Record<string, unknown>, fs, parentFile);\r\n\r\n // If validation added errors, stop inheritance processing\r\n if (context.hasErrors()) {\r\n return content;\r\n }\r\n\r\n // Resolve relative {% include %} paths in parent content to absolute paths.\r\n // This is necessary because the parent's includes are relative to the parent's\r\n // directory, but after merging into the child, Nunjucks will resolve them\r\n // relative to the child's directory (which may be different).\r\n if (parentData.content) {\r\n const parentDir = fs.dirname(parentFile);\r\n parentData.content = this.resolveIncludePaths(parentData.content, parentDir);\r\n }\r\n\r\n // Get overrides from child metadata\r\n const overrides = context.metadata?.override || {};\r\n\r\n // Process content with section-aware merging\r\n if (parentData.content || content) {\r\n if (Object.keys(overrides).length > 0) {\r\n // Section-aware override processing\r\n try {\r\n // Extract sections from parent and child\r\n const parentSections = parentData.content\r\n ? this.sectionProcessor.extractSections(parentData.content)\r\n : new Map();\r\n const childSections = content\r\n ? this.sectionProcessor.extractSections(content)\r\n : new Map();\r\n\r\n // Determine base directory for resolving override files\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n\r\n // Apply overrides and merge content\r\n const mergedContent = await this.sectionProcessor.applyOverrides(\r\n parentSections,\r\n childSections,\r\n overrides,\r\n baseDir,\r\n context.verbose,\r\n context.fileSystem\r\n );\r\n\r\n content = mergedContent;\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Applied ${Object.keys(overrides).length} section overrides from parent: ${parentPath}`);\r\n }\r\n } catch (error) {\r\n // Fallback to simple concatenation on error\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Section override processing failed, using simple inheritance: ${errorMessage}`);\r\n\r\n if (parentData.content) {\r\n content = content ? `${parentData.content}\\n\\n${content}` : parentData.content;\r\n }\r\n }\r\n } else {\r\n // No overrides - use simple concatenation (backward compatibility)\r\n if (parentData.content) {\r\n content = content ? `${parentData.content}\\n\\n${content}` : parentData.content;\r\n }\r\n }\r\n }\r\n\r\n // Merge parent parameters (child parameters override)\r\n if (parentData.metadata?.parameters && context.metadata) {\r\n for (const parentParam of parentData.metadata.parameters) {\r\n // Only add parent parameter if not defined in child\r\n const paramExists = context.metadata.parameters?.some(\r\n childParam => childParam.name === parentParam.name\r\n );\r\n\r\n if (!paramExists) {\r\n if (!context.metadata.parameters) {\r\n context.metadata.parameters = [];\r\n }\r\n context.metadata.parameters.push(parentParam);\r\n\r\n // Apply default for inherited param (semantic stage already ran)\r\n if (!(parentParam.name in context.parameters) && parentParam.default !== undefined) {\r\n let value = parentParam.default;\r\n // Coerce string defaults to their declared type (mirrors SemanticAnalysisStage)\r\n if (typeof value === 'string') {\r\n const t = parentParam.type;\r\n if (t === 'json' || t === 'object' || t === 'array') {\r\n try { value = JSON.parse(value); } catch { /* keep as string */ }\r\n } else if (t === 'boolean') {\r\n if (value.toLowerCase() === 'true') value = true;\r\n else if (value.toLowerCase() === 'false') value = false;\r\n } else if (t === 'integer' || t === 'number' || t === 'float') {\r\n const n = Number(value);\r\n if (!isNaN(n)) value = n;\r\n } else if (t === 'date' || t === 'datetime') {\r\n value = resolveDateValue(value, t === 'datetime');\r\n }\r\n }\r\n context.parameters[parentParam.name] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Template inherits from: ${parentPath}`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Failed to process inheritance from ${parentPath}: ${errorMessage}`);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Process standalone overrides (without inheritance).\r\n */\r\n private async processStandaloneOverrides(context: CompilationContext, content: string): Promise<string> {\r\n const overrides = context.metadata?.override;\r\n if (!overrides) {\r\n return content;\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`Processing ${Object.keys(overrides).length} standalone section overrides...`);\r\n }\r\n\r\n try {\r\n // Extract sections from current content\r\n const currentSections = this.sectionProcessor.extractSections(content);\r\n\r\n // Determine base directory for resolving override files\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n\r\n // Apply each override to replace sections in current content\r\n for (const [sectionId, overridePath] of Object.entries(overrides)) {\r\n if (currentSections.has(sectionId)) {\r\n if (overridePath === null) {\r\n // Remove section\r\n currentSections.delete(sectionId);\r\n if (context.verbose) {\r\n console.log(` - Removing section '${sectionId}'`);\r\n }\r\n } else if (typeof overridePath === 'string') {\r\n // Replace section content\r\n try {\r\n const overrideContent = await this.sectionProcessor.loadOverrideContent(\r\n overridePath,\r\n baseDir,\r\n context.fileSystem\r\n );\r\n\r\n // Update section with override content\r\n const originalSection = currentSections.get(sectionId)!;\r\n currentSections.set(sectionId, {\r\n ...originalSection,\r\n content: overrideContent\r\n });\r\n\r\n if (context.verbose) {\r\n console.log(` - Replacing section '${sectionId}' with content from ${overridePath}`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Failed to apply override for section '${sectionId}': ${errorMessage}`);\r\n }\r\n }\r\n } else {\r\n context.addWarning(`Override section '${sectionId}' not found in current content`);\r\n if (context.verbose) {\r\n const available = Array.from(currentSections.keys()).sort().join(', ');\r\n console.log(`Warning: Override section '${sectionId}' not found. Available: ${available}`);\r\n }\r\n }\r\n }\r\n\r\n // Reconstruct content from modified sections\r\n const contentParts: string[] = [];\r\n for (const section of currentSections.values()) {\r\n contentParts.push(section.content);\r\n }\r\n\r\n content = contentParts.join('\\n\\n');\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Applied standalone overrides, final content has ${currentSections.size} sections`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Standalone override processing failed: ${errorMessage}`);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Filter code blocks in content based on context file types.\r\n *\r\n * When context files are attached (e.g., .ts files), this method filters\r\n * the prompt content to only keep code blocks that match those file types.\r\n *\r\n * Example:\r\n * - If context contains \"typescript-examples.ts\", keep only ```typescript blocks\r\n * - Non-code content and unmatched code blocks are preserved as plain text\r\n *\r\n * @param context - The compilation context with extracted contexts\r\n * @param content - The markdown content to filter\r\n * @returns Filtered content with only matching code blocks\r\n */\r\n private filterCodeBlocksByContext(context: CompilationContext, content: string): string {\r\n // Extract file extensions from context metadata\r\n const contextExtensions = this.extractContextExtensions(context.metadata?.context);\r\n\r\n if (contextExtensions.size === 0) {\r\n // No recognizable file extensions in context, return content unchanged\r\n return content;\r\n }\r\n\r\n // Build set of allowed language identifiers from context extensions\r\n const allowedLanguages = new Set<string>();\r\n for (const ext of contextExtensions) {\r\n const languages = getLanguageAliasesForExtension(ext);\r\n languages.forEach(lang => allowedLanguages.add(lang.toLowerCase()));\r\n }\r\n\r\n if (allowedLanguages.size === 0) {\r\n // No mapped languages found, return content unchanged\r\n return content;\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`Filtering code blocks for languages: ${Array.from(allowedLanguages).join(', ')}`);\r\n }\r\n\r\n // Parse and filter code blocks\r\n const result = this.filterCodeBlocks(content, allowedLanguages, context.verbose);\r\n\r\n if (context.verbose && result.removedCount > 0) {\r\n console.log(`Removed ${result.removedCount} non-matching code block(s)`);\r\n }\r\n\r\n return result.content;\r\n }\r\n\r\n /**\r\n * Extract file extensions from context metadata.\r\n * Context can be a single file path string or an array of file paths.\r\n */\r\n private extractContextExtensions(contextValue: string | string[] | undefined): Set<string> {\r\n const extensions = new Set<string>();\r\n\r\n if (!contextValue) {\r\n return extensions;\r\n }\r\n\r\n // Normalize to array\r\n const contextFiles = Array.isArray(contextValue) ? contextValue : [contextValue];\r\n\r\n for (const filePath of contextFiles) {\r\n if (typeof filePath === 'string') {\r\n const ext = extname(filePath).toLowerCase();\r\n if (ext) {\r\n extensions.add(ext);\r\n }\r\n }\r\n }\r\n\r\n return extensions;\r\n }\r\n\r\n /**\r\n * Filter code blocks in markdown content, keeping only those with matching languages.\r\n *\r\n * @param content - Markdown content with code blocks\r\n * @param allowedLanguages - Set of allowed language identifiers (lowercase)\r\n * @param verbose - Whether to log filtering actions\r\n * @returns Object with filtered content and count of removed blocks\r\n */\r\n private filterCodeBlocks(\r\n content: string,\r\n allowedLanguages: Set<string>,\r\n verbose: boolean\r\n ): { content: string; removedCount: number } {\r\n // Regex to match fenced code blocks: ```language\\n...content...\\n```\r\n const codeBlockRegex = /```(\\w*)\\n([\\s\\S]*?)```/g;\r\n\r\n let removedCount = 0;\r\n const filteredContent = content.replace(codeBlockRegex, (match, language, blockContent) => {\r\n const lang = (language || '').toLowerCase().trim();\r\n\r\n // If no language specified, keep the block (could be plain text/output)\r\n if (!lang) {\r\n return match;\r\n }\r\n\r\n // Check if language is in allowed set\r\n if (allowedLanguages.has(lang)) {\r\n return match; // Keep matching blocks\r\n }\r\n\r\n // Remove non-matching code blocks\r\n removedCount++;\r\n if (verbose) {\r\n const preview = blockContent.substring(0, 50).replace(/\\n/g, '\\\\n');\r\n console.log(` - Removing \\`\\`\\`${lang} block: \"${preview}...\"`);\r\n }\r\n\r\n // Remove the entire code block (return empty string)\r\n return '';\r\n });\r\n\r\n // Clean up multiple consecutive blank lines that may result from removal\r\n const cleanedContent = filteredContent.replace(/\\n{3,}/g, '\\n\\n');\r\n\r\n return { content: cleanedContent, removedCount };\r\n }\r\n\r\n /**\r\n * Process template with Jinja2/Nunjucks.\r\n * Uses a context-aware environment with PrompdLoader to support {% include %}.\r\n */\r\n private async processTemplate(context: CompilationContext, content: string): Promise<string> {\r\n if (!content) {\r\n return content;\r\n }\r\n\r\n try {\r\n // Create a context-aware Nunjucks environment with the PrompdLoader\r\n // This enables {% include \"file.prmd\" %} directives\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n const loader = new PrompdLoader({\r\n fileSystem: context.fileSystem,\r\n baseDir: baseDir,\r\n verbose: context.verbose,\r\n maxDepth: 10\r\n });\r\n\r\n const env = new nunjucks.Environment(loader, {\r\n autoescape: false,\r\n throwOnUndefined: false,\r\n trimBlocks: true,\r\n lstripBlocks: true,\r\n tags: {\r\n blockStart: '{%',\r\n blockEnd: '%}',\r\n variableStart: '{{',\r\n variableEnd: '}}',\r\n commentStart: '{#',\r\n commentEnd: '#}'\r\n }\r\n });\r\n\r\n // Register custom filters on this environment\r\n this.registerFiltersOnEnv(env);\r\n\r\n // Security: Set timeout for template rendering (prevent DoS)\r\n const renderTimeout = 5000; // 5 seconds\r\n const renderPromise = new Promise<string>((resolve, reject) => {\r\n try {\r\n const result = env.renderString(content, context.parameters);\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n const timeoutPromise = new Promise<string>((_, reject) => {\r\n timeoutId = setTimeout(() => reject(new Error('Template rendering timeout')), renderTimeout);\r\n });\r\n\r\n try {\r\n content = await Promise.race([renderPromise, timeoutPromise]);\r\n } finally {\r\n clearTimeout(timeoutId!);\r\n }\r\n } catch (error) {\r\n // Report template syntax errors properly\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n\r\n // Try to extract line/column from Nunjucks error message\r\n // Format: \"(unknown path) [Line X, Column Y]\" or similar\r\n const lineMatch = errorMessage.match(/\\[Line (\\d+), Column (\\d+)\\]/i) ||\r\n errorMessage.match(/line (\\d+)/i);\r\n\r\n const line = lineMatch ? parseInt(lineMatch[1], 10) : undefined;\r\n const column = lineMatch && lineMatch[2] ? parseInt(lineMatch[2], 10) : undefined;\r\n\r\n // Add as a compilation error (not just a warning)\r\n context.addDiagnostic({\r\n message: `Template syntax error: ${errorMessage}`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'TEMPLATE_SYNTAX_ERROR',\r\n line,\r\n column\r\n });\r\n\r\n // Still fall back to simple substitution so user sees partial output\r\n // but the error is now properly reported\r\n content = this.enhancedSimpleSubstitution(content, context.parameters);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Resolve relative {% include %} paths in content to absolute paths.\r\n * This ensures that when parent content is merged into a child file,\r\n * the includes still resolve correctly relative to the parent's directory.\r\n */\r\n private resolveIncludePaths(content: string, baseDir: string): string {\r\n // Match {% include \"path\" %} and {% include 'path' %} with relative paths\r\n // Captures: (prefix)(quote)(relativePath)(quote)(suffix) to reconstruct safely\r\n return content.replace(\r\n /(\\{%[-\\s]*include\\s+)([\"'])(\\.[^\"']+)\\2(\\s*[-]?%\\})/g,\r\n (_match, prefix, quote, relativePath, suffix) => {\r\n const absolutePath = resolvePosix(baseDir, relativePath);\r\n // Use forward slashes for cross-platform Nunjucks compatibility\r\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\r\n return `${prefix}${quote}${normalizedPath}${quote}${suffix}`;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Register custom filters on a Nunjucks environment.\r\n */\r\n private registerFiltersOnEnv(env: nunjucks.Environment): void {\r\n // Override built-in string filters to handle undefined/null safely\r\n // This prevents \"Cannot read properties of undefined\" errors when template\r\n // variables are undefined during validation (e.g., package creation)\r\n\r\n // trim - safe version\r\n env.addFilter('trim', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).trim();\r\n });\r\n\r\n // lower - safe version\r\n env.addFilter('lower', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).toLowerCase();\r\n });\r\n\r\n // upper - safe version\r\n env.addFilter('upper', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).toUpperCase();\r\n });\r\n\r\n // capitalize - safe version\r\n env.addFilter('capitalize', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n const s = String(str);\r\n return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\r\n });\r\n\r\n // title - safe version (capitalize each word)\r\n env.addFilter('title', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).replace(/\\b\\w/g, c => c.toUpperCase());\r\n });\r\n\r\n // replace - safe version\r\n env.addFilter('replace', (str: unknown, old: string, newStr: string, count?: number) => {\r\n if (str === undefined || str === null) return '';\r\n const s = String(str);\r\n if (count !== undefined) {\r\n // Replace only 'count' occurrences\r\n let result = s;\r\n let replaced = 0;\r\n while (replaced < count) {\r\n const idx = result.indexOf(old);\r\n if (idx === -1) break;\r\n result = result.slice(0, idx) + newStr + result.slice(idx + old.length);\r\n replaced++;\r\n }\r\n return result;\r\n }\r\n return s.split(old).join(newStr);\r\n });\r\n\r\n // striptags - safe version (remove HTML tags)\r\n env.addFilter('striptags', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).replace(/<[^>]*>/g, '');\r\n });\r\n\r\n // urlencode - safe version\r\n env.addFilter('urlencode', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return encodeURIComponent(String(str));\r\n });\r\n\r\n // fromcsv - Parse CSV string into array of objects\r\n env.addFilter('fromcsv', (csvString: string) => {\r\n if (!csvString || typeof csvString !== 'string') {\r\n return [];\r\n }\r\n return this.parseCsv(csvString);\r\n });\r\n\r\n // fromjson - Parse JSON string into object/array.\r\n // If the value is already a parsed object or array (e.g. from a JSON params file),\r\n // pass it through unchanged instead of returning null.\r\n env.addFilter('fromjson', (value: unknown) => {\r\n if (value === null || value === undefined) return null;\r\n if (typeof value !== 'string') return value; // already parsed\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n\r\n // tojson - Convert object to JSON string\r\n env.addFilter('tojson', (obj: unknown, indent?: number) => {\r\n try {\r\n return JSON.stringify(obj, null, indent);\r\n } catch {\r\n return '{}';\r\n }\r\n });\r\n\r\n // lines - Split string into array of lines\r\n env.addFilter('lines', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return [];\r\n }\r\n return str.split(/\\r?\\n/);\r\n });\r\n\r\n // dedent - Remove common leading whitespace from text\r\n env.addFilter('dedent', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const lines = str.split(/\\r?\\n/);\r\n let minIndent = Infinity;\r\n for (const line of lines) {\r\n if (line.trim().length === 0) continue;\r\n const match = line.match(/^(\\s*)/);\r\n if (match && match[1].length < minIndent) {\r\n minIndent = match[1].length;\r\n }\r\n }\r\n if (minIndent === Infinity) minIndent = 0;\r\n return lines.map(line => line.slice(minIndent)).join('\\n');\r\n });\r\n\r\n // truncate - Truncate string with ellipsis\r\n env.addFilter('truncate', (str: string, length: number = 80, suffix: string = '...') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n if (str.length <= length) {\r\n return str;\r\n }\r\n return str.slice(0, length - suffix.length) + suffix;\r\n });\r\n\r\n // codeblock - Wrap content in fenced code block\r\n env.addFilter('codeblock', (str: string, language: string = '') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n return '```' + language + '\\n' + str + '\\n```';\r\n });\r\n\r\n // unique - Remove duplicate items from array\r\n env.addFilter('unique', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return [...new Set(arr)];\r\n });\r\n\r\n // pluck - Extract single field from array of objects\r\n env.addFilter('pluck', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.map(item => item?.[field]).filter(v => v !== undefined);\r\n });\r\n\r\n // where - Filter objects by field value\r\n env.addFilter('where', (arr: Record<string, unknown>[], field: string, value: unknown) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.filter(item => item?.[field] === value);\r\n });\r\n\r\n // groupby - Group array items by field value\r\n env.addFilter('groupby', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return {};\r\n }\r\n const result: Record<string, Record<string, unknown>[]> = {};\r\n for (const item of arr) {\r\n const key = String(item?.[field] ?? 'undefined');\r\n if (!result[key]) {\r\n result[key] = [];\r\n }\r\n result[key].push(item);\r\n }\r\n return result;\r\n });\r\n\r\n // shuffle - Randomize array order\r\n env.addFilter('shuffle', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled;\r\n });\r\n\r\n // sample - Pick random N items from array\r\n env.addFilter('sample', (arr: unknown[], count: number = 1) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled.slice(0, Math.min(count, shuffled.length));\r\n });\r\n\r\n // wordwrap - Wrap text at specified width\r\n env.addFilter('wordwrap', (str: string, width: number = 80) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const words = str.split(/\\s+/);\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n for (const word of words) {\r\n if (currentLine.length + word.length + 1 <= width) {\r\n currentLine += (currentLine ? ' ' : '') + word;\r\n } else {\r\n if (currentLine) lines.push(currentLine);\r\n currentLine = word;\r\n }\r\n }\r\n if (currentLine) lines.push(currentLine);\r\n return lines.join('\\n');\r\n });\r\n\r\n // bulletlist - Convert array/lines to bullet list\r\n env.addFilter('bulletlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map(item => `- ${item}`).join('\\n');\r\n });\r\n\r\n // numberedlist - Convert array/lines to numbered list\r\n env.addFilter('numberedlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map((item, i) => `${i + 1}. ${item}`).join('\\n');\r\n });\r\n }\r\n\r\n /**\r\n * Enhanced simple substitution with nested property access.\r\n * Supports both single brace {var} and double brace {{var}} syntax for backward compatibility.\r\n */\r\n private enhancedSimpleSubstitution(content: string, parameters: Record<string, any>): string {\r\n // Guard against undefined/null content\r\n if (content === undefined || content === null) {\r\n return '';\r\n }\r\n\r\n // Helper function to resolve nested property path\r\n const resolveValue = (fullPath: string): string | null => {\r\n const parts = fullPath.split('.');\r\n let value: any = parameters[parts[0]];\r\n\r\n if (value === undefined || value === null) {\r\n return null;\r\n }\r\n\r\n try {\r\n for (let i = 1; i < parts.length; i++) {\r\n if (typeof value === 'object' && value !== null) {\r\n value = value[parts[i]];\r\n } else {\r\n return null;\r\n }\r\n if (value === undefined || value === null) {\r\n return null;\r\n }\r\n }\r\n return String(value);\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n // First pass: Handle double braces {{ obj.prop }} (Jinja2/Nunjucks standard)\r\n // Supports optional whitespace and whitespace trimming markers (-~)\r\n content = content.replace(/\\{\\{[-~]?\\s*([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\s*[-~]?\\}\\}/g, (_match, fullPath) => {\r\n const resolved = resolveValue(fullPath);\r\n return resolved !== null ? resolved : `[Missing: ${fullPath}]`;\r\n });\r\n\r\n // Second pass: Handle single braces {obj.prop} (legacy syntax)\r\n // Only match single braces that aren't part of {{ }} or {% %}\r\n content = content.replace(/(?<!\\{)\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}(?!\\})/g, (_match, fullPath) => {\r\n const resolved = resolveValue(fullPath);\r\n return resolved !== null ? resolved : `[Missing: ${fullPath}]`;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Escape special regex characters.\r\n */\r\n private escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n }\r\n\r\n /**\r\n * Validate that all file references in a parent .prmd's metadata actually exist.\r\n * Called during inheritance processing because AssetExtractionStage only runs on\r\n * the child file's metadata — the parent is only parsed, never fully compiled.\r\n */\r\n private async validateParentFileReferences(\r\n context: CompilationContext,\r\n metadata: Record<string, unknown> | null | undefined,\r\n fs: CompilationContext['fileSystem'],\r\n parentFile: string\r\n ): Promise<void> {\r\n if (!metadata) return;\r\n\r\n const metadataAsRecord = metadata as Record<string, unknown>;\r\n const parentDir = fs.dirname(parentFile);\r\n const fileFields = ['system', 'task', 'user', 'assistant', 'response', 'output', 'context'];\r\n\r\n for (const field of fileFields) {\r\n const fieldValue = metadataAsRecord[field];\r\n if (!fieldValue) continue;\r\n\r\n const refs: string[] = Array.isArray(fieldValue)\r\n ? (fieldValue as unknown[]).filter((v): v is string => typeof v === 'string')\r\n : typeof fieldValue === 'string' ? [fieldValue] : [];\r\n\r\n for (const ref of refs) {\r\n if (!ref.startsWith('./') && !ref.startsWith('../')) continue;\r\n\r\n const resolvedPath = fs.resolve(parentDir, ref);\r\n const exists = await Promise.resolve(fs.exists(resolvedPath));\r\n\r\n if (!exists) {\r\n const location = context.findLocation(/inherits:/);\r\n context.addDiagnostic({\r\n message: `Inherited file \"${basenamePosix(parentFile)}\" references missing ${field} file: \"${ref}\" (resolved to: ${resolvedPath})`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'INHERITED_METADATA_FILE_NOT_FOUND',\r\n ...(location || {})\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n getName(): string {\r\n return 'Template Processing';\r\n }\r\n}\r\n","/**\n * Markdown Output Formatter\n *\n * Formats compiled prompts as human-readable markdown with optional YAML frontmatter.\n */\n\nimport * as yaml from 'yaml';\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class MarkdownFormatter implements OutputFormatter {\n name = 'markdown';\n fileExtension = '.md';\n mimeType = 'text/markdown';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n const output: string[] = [];\n\n // Add metadata as YAML frontmatter comment (only in verbose mode)\n if (compiled.verbose && compiled.metadata) {\n output.push('<!-- PROMPD METADATA');\n const cleanMetadata = this.cleanMetadataForDisplay(compiled.metadata);\n output.push(yaml.stringify(cleanMetadata));\n output.push('-->');\n output.push('');\n }\n\n // Add extracted contexts as sections\n if (compiled.contexts && compiled.contexts.length > 0) {\n output.push('# Extracted Context Files');\n output.push('');\n for (const ctx of compiled.contexts) {\n output.push(ctx);\n output.push('');\n }\n }\n\n // Add main content (clean output without extra headers by default)\n if (compiled.content) {\n if (compiled.verbose) {\n output.push('# Main Prompt Content');\n output.push('');\n }\n output.push(compiled.content);\n }\n\n return output.join('\\n');\n }\n\n /**\n * Clean metadata dictionary for YAML display, converting complex objects to strings.\n */\n private cleanMetadataForDisplay(metadata: any): any {\n if (typeof metadata !== 'object' || metadata === null) {\n return metadata;\n }\n\n if (Array.isArray(metadata)) {\n return metadata.map(item => this.cleanMetadataForDisplay(item));\n }\n\n const cleaned: any = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value === undefined) {\n continue; // Skip undefined values\n }\n\n // Handle enums and complex objects\n if (typeof value === 'object' && value !== null) {\n if ('value' in value) {\n // Enum object - return its string value\n cleaned[key] = value.value;\n } else if (Array.isArray(value)) {\n cleaned[key] = value.map(item => this.cleanMetadataForDisplay(item));\n } else {\n cleaned[key] = this.cleanMetadataForDisplay(value);\n }\n } else {\n cleaned[key] = value;\n }\n }\n\n return cleaned;\n }\n}\n","/**\n * OpenAI API JSON Formatter\n *\n * Formats compiled prompts for OpenAI API consumption with proper message structure.\n */\n\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class OpenAIFormatter implements OutputFormatter {\n name = 'provider-json:openai';\n fileExtension = '.json';\n mimeType = 'application/json';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (!compiled.content) {\n return JSON.stringify({\n model: 'gpt-4',\n messages: [],\n temperature: 0.1\n }, null, 2);\n }\n\n // Parse all sections\n const sections = this.parseSections(compiled.content);\n\n // Build system message from System and Context sections\n let systemMessage = '';\n const systemParts: string[] = [];\n if (sections.System) {\n systemParts.push(sections.System);\n }\n if (sections.Context) {\n systemParts.push(sections.Context);\n }\n systemMessage = systemParts.join('\\n\\n');\n\n if (systemMessage) {\n messages.push({\n role: 'system',\n content: systemMessage\n });\n }\n\n // Build messages from other sections in order\n let examplesContent = '';\n if (sections.Examples) {\n examplesContent = sections.Examples;\n }\n\n for (const [sectionName, content] of Object.entries(sections)) {\n if (sectionName === 'System' || sectionName === 'Context' || sectionName === 'Examples') continue;\n\n const role = this.sectionToRole(sectionName);\n if (role) {\n let messageContent = content.trim();\n // Add examples to first user message\n if (role === 'user' && examplesContent && messages.filter(m => m.role === 'user').length === 0) {\n messageContent = `${messageContent}\\n\\n${examplesContent}`;\n examplesContent = ''; // Only add once\n }\n messages.push({ role, content: messageContent });\n }\n }\n\n // Add extracted contexts to first user message\n if (compiled.contexts && compiled.contexts.length > 0 && messages.length > 0) {\n const firstUserMsg = messages.find(m => m.role === 'user');\n if (firstUserMsg) {\n const contextContent = compiled.contexts.join('\\n\\n');\n firstUserMsg.content = `${contextContent}\\n\\n${firstUserMsg.content}`;\n }\n }\n\n const apiRequest = {\n model: 'gpt-4',\n messages: messages,\n temperature: 0.1\n };\n\n return JSON.stringify(apiRequest, null, 2);\n }\n\n /**\n * Parse all sections from markdown content.\n */\n private parseSections(content: string): Record<string, string> {\n const sections: Record<string, string> = {};\n const lines = content.split('\\n');\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n let sectionOrder: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a section header\n const match = trimmed.match(/^# (.+)$/);\n if (match) {\n // Save previous section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n sectionOrder.push(currentSection);\n }\n\n // Start new section\n currentSection = match[1];\n currentContent = [];\n } else if (currentSection) {\n // Add line to current section\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n }\n\n return sections;\n }\n\n /**\n * Convert section name to message role.\n */\n private sectionToRole(sectionName: string): string | null {\n const normalized = sectionName.replace(/_\\d+$/, '').toLowerCase();\n if (normalized === 'user') return 'user';\n if (normalized === 'assistant') return 'assistant';\n return null;\n }\n\n}\n","/**\n * Anthropic Claude API JSON Formatter\n *\n * Formats compiled prompts for Anthropic Claude API with system field and messages.\n */\n\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class AnthropicFormatter implements OutputFormatter {\n name = 'provider-json:anthropic';\n fileExtension = '.json';\n mimeType = 'application/json';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n let systemMessage = '';\n const messages: Array<{ role: string; content: string }> = [];\n\n if (!compiled.content) {\n return JSON.stringify({\n model: 'claude-3-sonnet-20240229',\n system: '',\n messages: []\n }, null, 2);\n }\n\n // Parse all sections\n const sections = this.parseSections(compiled.content);\n\n // Build system message from System and Context sections\n const systemParts: string[] = [];\n if (sections.System) {\n systemParts.push(sections.System);\n }\n if (sections.Context) {\n systemParts.push(sections.Context);\n }\n systemMessage = systemParts.join('\\n\\n');\n\n // Build messages from other sections in order\n let examplesContent = '';\n if (sections.Examples) {\n examplesContent = sections.Examples;\n }\n\n for (const [sectionName, content] of Object.entries(sections)) {\n if (sectionName === 'System' || sectionName === 'Context' || sectionName === 'Examples') continue;\n\n const role = this.sectionToRole(sectionName);\n if (role) {\n let messageContent = content.trim();\n // Add examples to first user message\n if (role === 'user' && examplesContent && messages.filter(m => m.role === 'user').length === 0) {\n messageContent = `${messageContent}\\n\\n${examplesContent}`;\n examplesContent = ''; // Only add once\n }\n messages.push({ role, content: messageContent });\n }\n }\n\n // Add extracted contexts to first user message\n if (compiled.contexts && compiled.contexts.length > 0 && messages.length > 0) {\n const firstUserMsg = messages.find(m => m.role === 'user');\n if (firstUserMsg) {\n const contextContent = compiled.contexts.join('\\n\\n');\n firstUserMsg.content = `${contextContent}\\n\\n${firstUserMsg.content}`;\n }\n }\n\n const apiRequest = {\n model: 'claude-3-sonnet-20240229',\n system: systemMessage,\n messages: messages\n };\n\n return JSON.stringify(apiRequest, null, 2);\n }\n\n /**\n * Parse all sections from markdown content.\n */\n private parseSections(content: string): Record<string, string> {\n const sections: Record<string, string> = {};\n const lines = content.split('\\n');\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n let sectionOrder: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a section header\n const match = trimmed.match(/^# (.+)$/);\n if (match) {\n // Save previous section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n sectionOrder.push(currentSection);\n }\n\n // Start new section\n currentSection = match[1];\n currentContent = [];\n } else if (currentSection) {\n // Add line to current section\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n }\n\n return sections;\n }\n\n /**\n * Convert section name to message role.\n */\n private sectionToRole(sectionName: string): string | null {\n const normalized = sectionName.replace(/_\\d+$/, '').toLowerCase();\n if (normalized === 'user') return 'user';\n if (normalized === 'assistant') return 'assistant';\n // Treat other sections as user messages\n if (normalized === 'context' || normalized === 'examples') {\n return 'user';\n }\n return null;\n }\n}\n","/**\n * Code Generation Stage\n *\n * Generates output in the target format using registered formatters.\n */\n\nimport { CompilerStage, CompilationContext, OutputFormatter, CompiledPrompt } from '../types';\nimport { MarkdownFormatter } from '../formatters/markdown';\nimport { OpenAIFormatter } from '../formatters/openai';\nimport { AnthropicFormatter } from '../formatters/anthropic';\n\nexport class CodeGenerationStage implements CompilerStage {\n private formatters: Map<string, OutputFormatter>;\n\n constructor(formatters?: Map<string, OutputFormatter>) {\n this.formatters = formatters || new Map();\n\n // Register default formatters\n this.registerFormatter(new MarkdownFormatter());\n this.registerFormatter(new OpenAIFormatter());\n this.registerFormatter(new AnthropicFormatter());\n }\n\n /**\n * Register a new output formatter.\n */\n registerFormatter(formatter: OutputFormatter): void {\n this.formatters.set(formatter.name, formatter);\n }\n\n async process(context: CompilationContext): Promise<void> {\n let formatName = context.outputFormat;\n\n // Handle legacy format names\n if (formatName.startsWith('to-')) {\n formatName = formatName.substring(3);\n }\n\n // Handle provider-json shorthand\n if (formatName === 'provider-json') {\n formatName = 'provider-json:openai'; // Default to OpenAI\n }\n\n const formatter = this.formatters.get(formatName);\n if (!formatter) {\n context.addError(`Unknown output format: ${formatName}`);\n return;\n }\n\n try {\n const compiled: CompiledPrompt = {\n metadata: context.metadata,\n content: context.content,\n contexts: context.contexts,\n parameters: context.parameters,\n verbose: context.verbose\n };\n\n context.compiledResult = await formatter.format(compiled);\n\n if (context.verbose) {\n console.log(`✓ Generated output in format: ${formatName}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n context.addError(`Code generation failed: ${errorMessage}`);\n }\n }\n\n getName(): string {\n return 'Code Generation';\n }\n}\n","/**\n * File System Abstraction (core, environment-agnostic).\n *\n * Defines the IFileSystem interface and the in-memory implementation used for\n * browser + server compilation. The Node-backed NodeFileSystem and the adm-zip\n * .pdpkg helpers live in @prompd/cli (they need Node APIs). Path operations here\n * are inlined as POSIX so this module has zero Node imports.\n */\nimport JSZip from 'jszip';\n\n/**\n * File system interface that can be implemented for different storage backends.\n */\nexport interface IFileSystem {\n /** Check if a file or directory exists. */\n exists(filePath: string): boolean | Promise<boolean>;\n /** Read a file's contents as a UTF-8 string. */\n readFile(filePath: string): string | Promise<string>;\n /** Check if a path is a directory. */\n isDirectory(filePath: string): boolean | Promise<boolean>;\n /** List files in a directory. */\n readdir(dirPath: string): string[] | Promise<string[]>;\n /** Resolve a path (for package resolution). */\n resolve(...pathSegments: string[]): string;\n /** Get the directory name of a path. */\n dirname(filePath: string): string;\n /** Join path segments. */\n join(...pathSegments: string[]): string;\n}\n\n/** Extensions whose bytes can't live in the string-backed FS — skipped on package\n * ingest. Compilation only needs the text sources; binary assets are resolved\n * server-side (the browser warns) for now. */\nconst BINARY_ASSET_EXT = new Set([\n 'png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff',\n 'pdf', 'xlsx', 'xls', 'docx', 'doc', 'pptx', 'ppt',\n 'zip', 'pdpkg', 'gz', 'tar', 'wasm', 'woff', 'woff2', 'ttf', 'otf', 'eot',\n 'mp3', 'mp4', 'wav', 'ogg', 'webm', 'mov', 'avi',\n]);\nfunction isBinaryAsset(name: string): boolean {\n const dot = name.lastIndexOf('.');\n return dot >= 0 && BINARY_ASSET_EXT.has(name.slice(dot + 1).toLowerCase());\n}\n\n/**\n * Extract a `.pdpkg` (ZIP) buffer to a flat map of entry-relative path -> UTF-8\n * content. The SINGLE ZIP-extraction primitive shared by package ingestion\n * (MemoryFileSystem.addPackage) and skill install — so hosts never hand-roll their\n * own jszip pass. Directories and binary assets are skipped (the consumers store\n * text only).\n */\nexport async function extractPdpkg(buffer: Uint8Array): Promise<Map<string, string>> {\n const zip = await JSZip.loadAsync(buffer);\n const out = new Map<string, string>();\n for (const entry of Object.values(zip.files)) {\n if (entry.dir || isBinaryAsset(entry.name)) continue;\n out.set(entry.name, await entry.async('string'));\n }\n return out;\n}\n\n/* ---- inlined POSIX path helpers (no Node 'path' dependency) ---- */\n\nfunction normalizePosix(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(seg);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nfunction joinPosix(...segments: string[]): string {\n const filtered = segments.filter((s) => s && s.length > 0);\n if (filtered.length === 0) return '.';\n return normalizePosix(filtered.join('/'));\n}\n\nfunction dirnamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n if (idx === -1) return '.';\n if (idx === 0) return '/';\n return norm.slice(0, idx);\n}\n\nfunction utf8ByteLength(s: string): number {\n return new TextEncoder().encode(s).length;\n}\n\n/** Relative key normalization (forward slashes, no leading ./ or /, no trailing\n * slash) shared by MemoryFileSystem and HybridFileSystem so they never drift. */\nfunction toRelKey(filePath: string): string {\n let n = filePath.replace(/\\\\/g, '/');\n if (n.startsWith('./')) n = n.substring(2);\n if (n.startsWith('/')) n = n.substring(1);\n if (n.endsWith('/') && n.length > 1) n = n.substring(0, n.length - 1);\n return n;\n}\n\n/**\n * In-memory file system for browser + server-side compilation.\n * Files are provided as a map of path -> content.\n */\nexport class MemoryFileSystem implements IFileSystem {\n /** Cap on an ingested package buffer (defends against a hostile/huge .pdpkg). */\n private static readonly MAX_PACKAGE_SIZE = 50 * 1024 * 1024;\n private files: Map<string, string>;\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map();\n for (const [filePath, content] of Object.entries(files)) {\n this.addFile(filePath, content);\n }\n }\n\n /** Add or update a file in the in-memory file system. */\n addFile(filePath: string, content: string): void {\n this.files.set(this.normalizePath(filePath), content);\n }\n\n /** Add multiple files at once. */\n addFiles(files: Record<string, string>): void {\n for (const [filePath, content] of Object.entries(files)) {\n this.addFile(filePath, content);\n }\n }\n\n exists(filePath: string): boolean {\n return this.files.has(this.normalizePath(filePath));\n }\n\n readFile(filePath: string): string {\n const normalizedPath = this.normalizePath(filePath);\n const content = this.files.get(normalizedPath);\n if (content === undefined) {\n throw new Error(`File not found: ${filePath}`);\n }\n return content;\n }\n\n isDirectory(filePath: string): boolean {\n const normalizedPath = this.normalizePath(filePath);\n const dirPrefix = normalizedPath.endsWith('/') ? normalizedPath : normalizedPath + '/';\n for (const file of this.files.keys()) {\n if (file.startsWith(dirPrefix)) {\n return true;\n }\n }\n return false;\n }\n\n readdir(dirPath: string): string[] {\n const normalizedDir = this.normalizePath(dirPath);\n const dirPrefix = normalizedDir.endsWith('/') ? normalizedDir : normalizedDir + '/';\n const files: Set<string> = new Set();\n for (const file of this.files.keys()) {\n if (file.startsWith(dirPrefix)) {\n const relativePath = file.substring(dirPrefix.length);\n const slashIndex = relativePath.indexOf('/');\n const fileName = slashIndex === -1 ? relativePath : relativePath.substring(0, slashIndex);\n if (fileName) {\n files.add(fileName);\n }\n }\n }\n return Array.from(files);\n }\n\n resolve(...pathSegments: string[]): string {\n return joinPosix('/', ...pathSegments);\n }\n\n dirname(filePath: string): string {\n return dirnamePosix(filePath);\n }\n\n join(...pathSegments: string[]): string {\n return joinPosix(...pathSegments);\n }\n\n /** Get the virtual file system path for a package. */\n getPackagePath(packageName: string, version: string): string {\n return `/packages/${packageName}@${version}`;\n }\n\n /**\n * Extract a `.pdpkg` (ZIP) buffer into memory under getPackagePath(name, ver).\n *\n * Uses JSZip — isomorphic (browser + Node) — so this is the SINGLE package-ingest\n * path for every host (replacing the CLI's Node-only adm-zip subclass and the\n * skill installer's ad-hoc unzip). Text files only: binary assets aren't\n * representable in the string-backed FS, so they're skipped (a `using:` package's\n * .prmd/.md/.json/.yaml is what matters for compilation). Validates entry paths\n * can't escape the package directory.\n */\n async addPackage(packageName: string, version: string, packageBuffer: Uint8Array): Promise<void> {\n if (packageBuffer.length > MemoryFileSystem.MAX_PACKAGE_SIZE) {\n throw new Error(`Package too large: ${packageBuffer.length} bytes (max ${MemoryFileSystem.MAX_PACKAGE_SIZE})`);\n }\n const files = await extractPdpkg(packageBuffer);\n\n const packagePath = this.getPackagePath(packageName, version);\n const packagePrefix = this.normalizePath(packagePath.endsWith('/') ? packagePath : packagePath + '/');\n const packageRoot = this.normalizePath(packagePath);\n\n for (const [rel, content] of files) {\n const filePath = this.join(packagePath, rel);\n const normalized = this.normalizePath(filePath);\n if (!normalized.startsWith(packagePrefix) && normalized !== packageRoot) {\n throw new Error(`Security violation: extracted path escapes package directory: ${rel}`);\n }\n this.addFile(filePath, content);\n }\n }\n\n /** Get all files under an optional base path. */\n getAllFiles(basePath?: string): Map<string, string> {\n if (!basePath) {\n return new Map(this.files);\n }\n const normalizedBase = this.normalizePath(basePath);\n const prefix = normalizedBase.endsWith('/') ? normalizedBase : normalizedBase + '/';\n const filtered = new Map<string, string>();\n for (const [filePath, content] of this.files.entries()) {\n if (filePath.startsWith(prefix) || filePath === normalizedBase) {\n filtered.set(filePath, content);\n }\n }\n return filtered;\n }\n\n /** Calculate total size (bytes) and file count under a base path. */\n getTotalSize(basePath: string): { size: number; files: number } {\n const files = this.getAllFiles(basePath);\n let totalSize = 0;\n for (const content of files.values()) {\n totalSize += utf8ByteLength(content);\n }\n return { size: totalSize, files: files.size };\n }\n\n /** Normalize path to forward slashes, drop leading ./ and /, no trailing slash. */\n protected normalizePath(filePath: string): string {\n return toRelKey(filePath);\n }\n}\n\n/**\n * Async backend for files NOT held in memory by a HybridFileSystem. Paths are\n * normalized relative keys (forward slashes, no leading ./ or /), matching the\n * keys MemoryFileSystem uses. readFile resolves null when the file is absent.\n *\n * This is how a host streams files lazily — e.g. a browser\n * FileSystemDirectoryHandle, or a registry/package fetch — without loading the\n * whole tree up front.\n */\nexport interface AsyncFileBackend {\n /** Read a file's UTF-8 contents; resolve null when it does not exist. */\n readFile(path: string): Promise<string | null>;\n /** Optional: report whether a path is a directory. */\n isDirectory?(path: string): Promise<boolean>;\n /** Optional: list a directory's immediate entry names. */\n readdir?(path: string): Promise<string[]>;\n}\n\n/**\n * In-memory file system with an async fall-through backend.\n *\n * Files placed in memory (constructor map / addFile) are served SYNCHRONOUSLY,\n * so the synchronous Nunjucks {% include %} loader keeps working for them —\n * pre-load the .prmd sources a compilation can {% include %} or inherit. Any\n * path NOT in memory is read from the async backend, returning a Promise that\n * the compiler's awaiting stages (inherits:, package context, asset extraction)\n * consume. This lets a browser compile a folder of prompts: load the .prmd\n * sources up front, stream binary/context assets on demand.\n *\n * Known limitation: the synchronous Nunjucks {% include %} loader cannot read\n * backend-only files (it gets a Promise and throws a \"requires synchronous\"\n * error). So anything {% include %}'d must be in memory — pre-load every source\n * a compilation can include (the web host pre-loads all .prmd/.md). inherits:\n * has no such limit; it resolves through the async stages.\n *\n * Composes (does not extend) MemoryFileSystem so the in-memory methods keep\n * their strict sync return types and existing consumers are untouched.\n */\nexport class HybridFileSystem implements IFileSystem {\n private mem: MemoryFileSystem;\n private backend: AsyncFileBackend;\n\n constructor(files: Record<string, string> = {}, backend: AsyncFileBackend) {\n this.mem = new MemoryFileSystem(files);\n this.backend = backend;\n }\n\n /** Add or update an in-memory (synchronously-served) file. */\n addFile(filePath: string, content: string): void {\n this.mem.addFile(filePath, content);\n }\n\n /** Add multiple in-memory files at once. */\n addFiles(files: Record<string, string>): void {\n this.mem.addFiles(files);\n }\n\n /** Virtual path where a package's files live (delegates to the memory layer). */\n getPackagePath(packageName: string, version: string): string {\n return this.mem.getPackagePath(packageName, version);\n }\n\n /** Ingest a `.pdpkg` (ZIP) buffer into the in-memory layer, so package files are\n * served synchronously alongside the workspace sources. */\n addPackage(packageName: string, version: string, packageBuffer: Uint8Array): Promise<void> {\n return this.mem.addPackage(packageName, version, packageBuffer);\n }\n\n exists(filePath: string): boolean | Promise<boolean> {\n if (this.mem.exists(filePath)) return true;\n return this.backend\n .readFile(this.normalize(filePath))\n .then((content) => content !== null)\n .catch(() => false);\n }\n\n readFile(filePath: string): string | Promise<string> {\n if (this.mem.exists(filePath)) return this.mem.readFile(filePath);\n return this.backend.readFile(this.normalize(filePath)).then((content) => {\n if (content === null) throw new Error(`File not found: ${filePath}`);\n return content;\n });\n }\n\n isDirectory(filePath: string): boolean | Promise<boolean> {\n if (this.mem.isDirectory(filePath)) return true;\n if (!this.backend.isDirectory) return false;\n return this.backend.isDirectory(this.normalize(filePath)).catch(() => false);\n }\n\n readdir(dirPath: string): string[] | Promise<string[]> {\n const local = this.mem.readdir(dirPath);\n if (!this.backend.readdir) return local;\n return this.backend\n .readdir(this.normalize(dirPath))\n .then((remote) => Array.from(new Set([...local, ...remote])))\n .catch(() => local);\n }\n\n resolve(...pathSegments: string[]): string {\n return this.mem.resolve(...pathSegments);\n }\n\n dirname(filePath: string): string {\n return this.mem.dirname(filePath);\n }\n\n join(...pathSegments: string[]): string {\n return this.mem.join(...pathSegments);\n }\n\n /** Normalize to the same relative keys MemoryFileSystem uses, for backend lookups. */\n private normalize(filePath: string): string {\n return toRelKey(filePath);\n }\n}\n","/**\n * Package installation — the single, host-agnostic installer for every Prompd\n * artifact type (packages, skills, workflows, templates).\n *\n * Mirrors the resolver's design (MemoryPackageResolver): the download fetch and the\n * writable file sink are INJECTED, so the same logic runs in the browser (a\n * workspace FileService) and in the CLI/sidecar (Node fs) with no Node imports here.\n * Core stays Node-free — it never computes '~'; the caller passes the install `root`\n * (the open workspace for a local/browser install, the home dir for a global\n * sidecar/CLI install). Layout is core's canonical one:\n *\n * <root>/.prompd/<getInstallDirForType(type)>/<@scope/name>/...\n *\n * which matches the working CLI install (~/.prompd/packages/@scope/name/, etc.).\n */\nimport { extractPdpkg } from './file-system';\nimport { parsePackageReference, type PackageDownloader } from './package-ref';\nimport { getInstallDirForType, type PackageType } from '../../types';\n\n/** Max .pdpkg size accepted for install (matches MemoryFileSystem's package cap). */\nconst MAX_PACKAGE_SIZE = 50 * 1024 * 1024;\n\n/**\n * A writable sink the host injects so installPackage stays FS-/Node-agnostic.\n * Browser: an adapter over the workspace FileService; CLI/sidecar: over Node fs.\n */\nexport interface PackageStore {\n /** Write a UTF-8 file, creating parent directories as needed. */\n writeFile(path: string, content: string): void | Promise<void>;\n /** Remove a directory and its contents if present, for a clean reinstall. */\n removeDir?(path: string): void | Promise<void>;\n}\n\nexport interface InstallPackageOptions {\n /** \"@scope/name@version\" or \"@scope/name\" (defaults to latest). */\n ref: string;\n /** Artifact type — selects the .prompd subdir (packages/skills/workflows/templates). */\n type: PackageType;\n /**\n * Install root the caller chose: the open workspace folder (browser/local) or the\n * home dir for a global install (sidecar/CLI). installPackage NEVER computes '~'\n * itself — core stays Node-free.\n */\n root: string;\n /** Writable sink for the chosen host. */\n store: PackageStore;\n /**\n * Fetch the .pdpkg bytes for a (name, version). Injected: the registry client in\n * the browser, a Node fetch in the CLI. May resolve 'latest' to a concrete version.\n */\n download: PackageDownloader;\n}\n\nexport interface InstalledPackage {\n /** Full scoped name (manifest-authoritative when present), e.g. \"@prompd/core\". */\n name: string;\n /** Resolved version (from the package manifest when present). */\n version: string;\n scope?: string;\n /** Install dir written to: <root>/.prompd/<typeDir>/<name>. */\n installedPath: string;\n /** Entry-relative paths written under installedPath. */\n files: string[];\n}\n\n/** POSIX join — no Node 'path' (core is Node-free). Drops empty/'.' segments and\n * collapses repeated slashes; preserves a leading slash for absolute roots. */\nfunction joinPosix(...parts: string[]): string {\n const joined = parts.filter((p) => p && p !== '.').join('/').replace(/\\/{2,}/g, '/');\n return joined.replace(/\\/+$/, '') || '/';\n}\n\n/** Resolve '.'/'..' segments for the zip-slip escape check. Leading slash is\n * dropped (the comparison is relative-consistent for base and dest alike). */\nfunction normalizeSegments(p: string): string {\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (!seg || seg === '.') continue;\n if (seg === '..') { out.pop(); continue; }\n out.push(seg);\n }\n return out.join('/');\n}\n\n/**\n * Install a registry artifact into <root>/.prompd/<typeDir>/<name>/, replacing any\n * prior install (idempotent). The host injects the writable `store` and the\n * `download` fetcher, so the same install runs in the browser and the CLI/sidecar.\n * Returns the resolved name/version (manifest-authoritative when present) and the\n * files written. Rejects entries that escape the install directory (zip-slip) and\n * archives over the size cap.\n */\nexport async function installPackage(opts: InstallPackageOptions): Promise<InstalledPackage> {\n const { ref, type, root, store, download } = opts;\n const parsed = parsePackageReference(ref);\n\n const bytes = await download(parsed.name, parsed.version);\n if (bytes.length > MAX_PACKAGE_SIZE) {\n throw new Error(`Package too large: ${bytes.length} bytes (max ${MAX_PACKAGE_SIZE})`);\n }\n const files = await extractPdpkg(bytes);\n if (files.size === 0) {\n throw new Error(`Package \"${parsed.name}\" contains no installable files.`);\n }\n\n // The package manifest is authoritative for name/version when present (download may\n // have resolved 'latest'); fall back to the parsed ref on a missing/bad manifest.\n let name = parsed.name;\n let version = parsed.version;\n const manifest = files.get('manifest.json') ?? files.get('prompd.json');\n if (manifest) {\n try {\n const m = JSON.parse(manifest) as { name?: string; version?: string };\n if (typeof m.name === 'string' && m.name) name = m.name;\n if (typeof m.version === 'string' && m.version) version = m.version;\n } catch { /* keep the parsed values on a malformed manifest */ }\n }\n\n const installedPath = joinPosix(root, '.prompd', getInstallDirForType(type), name);\n const baseSegments = normalizeSegments(installedPath);\n\n // Clean reinstall: drop any prior copy so removed files don't linger.\n await store.removeDir?.(installedPath);\n\n const written: string[] = [];\n for (const [rel, content] of files) {\n const dest = joinPosix(installedPath, rel);\n const destSegments = normalizeSegments(dest);\n if (destSegments !== baseSegments && !destSegments.startsWith(baseSegments + '/')) {\n throw new Error(`Security violation: extracted path escapes install directory: ${rel}`);\n }\n await store.writeFile(dest, content);\n written.push(rel);\n }\n\n return { name, version, scope: parsed.scope, installedPath, files: written };\n}\n","/**\n * @prompd/core compiler — environment-agnostic assembly.\n *\n * Assembles the browser/server-safe compilation pipeline:\n * Lexical -> Dependency -> Semantic -> Template -> CodeGeneration\n *\n * The binary AssetExtractionStage (sharp/pdf/exceljs/mammoth) is Node-only and\n * lives in @prompd/cli, which assembles the full pipeline. Package/inheritance\n * resolution is injected via IPackageResolver (also Node-only); without it, the\n * dependency stage emits a diagnostic and single-file compilation still works.\n */\n\nimport { CompilerPipeline } from './pipeline';\nimport {\n CompilationOptions,\n CompilationContext,\n CompilerStage,\n DEFAULT_SECURITY_CONFIG,\n SecurityConfig\n} from './types';\nimport { CompilationError } from '../errors';\nimport { LexicalAnalysisStage } from './stages/lexical';\nimport { DependencyResolutionStage } from './stages/dependency';\nimport { SemanticAnalysisStage } from './stages/semantic';\nimport { TemplateProcessingStage } from './stages/template';\nimport { CodeGenerationStage } from './stages/codegen';\n\n/**\n * Default browser/server-safe stage set (no binary asset extraction).\n */\nexport function createCoreStages(): CompilerStage[] {\n return [\n new LexicalAnalysisStage(),\n new DependencyResolutionStage(),\n new SemanticAnalysisStage(),\n new TemplateProcessingStage(),\n new CodeGenerationStage()\n ];\n}\n\n/**\n * High-level compiler. Defaults to the core (browser-safe) stage set; callers\n * such as @prompd/cli pass a custom stage list (adding asset extraction).\n */\nexport class PrompdCompiler {\n protected pipeline: CompilerPipeline;\n protected securityConfig: SecurityConfig;\n\n constructor(options: { stages?: CompilerStage[]; securityConfig?: SecurityConfig } = {}) {\n this.securityConfig = options.securityConfig || DEFAULT_SECURITY_CONFIG;\n this.pipeline = new CompilerPipeline(options.stages || createCoreStages(), this.securityConfig);\n }\n\n /**\n * Compile a .prmd source to a string. Throws CompilationError on errors.\n */\n async compile(source: string, options: CompilationOptions = {}): Promise<string> {\n const context = await this.pipeline.execute(source, options);\n\n if (context.hasErrors()) {\n const errorMessages = context.errors.join('\\n - ');\n throw new CompilationError(`Compilation failed:\\n - ${errorMessages}`);\n }\n\n const result = context.compiledResult || '';\n return typeof result === 'string' ? result : new TextDecoder().decode(result);\n }\n\n /**\n * Compile and return the full context (output + diagnostics, no throw).\n */\n async compileWithContext(source: string, options: CompilationOptions = {}): Promise<CompilationContext> {\n return this.pipeline.execute(source, options);\n }\n\n /** Access the underlying pipeline (advanced customization). */\n getPipeline(): CompilerPipeline {\n return this.pipeline;\n }\n}\n\n/**\n * Convenience function for quick single-file compilation.\n */\nexport async function compile(\n source: string,\n outputFormat: string = 'markdown',\n parameters: Record<string, any> = {},\n options: Omit<CompilationOptions, 'outputFormat' | 'parameters'> = {}\n): Promise<string> {\n const compiler = new PrompdCompiler();\n return compiler.compile(source, { outputFormat, parameters, ...options });\n}\n\n// Re-export the building blocks.\nexport * from './types';\nexport * from './pipeline';\nexport * from './file-system';\nexport * from './package-ref';\nexport * from './install';\nexport * from './language-map';\nexport * from './path-utils';\nexport { LexicalAnalysisStage } from './stages/lexical';\nexport { DependencyResolutionStage } from './stages/dependency';\nexport { SemanticAnalysisStage } from './stages/semantic';\nexport { TemplateProcessingStage } from './stages/template';\nexport { CodeGenerationStage } from './stages/codegen';\nexport { SectionOverrideProcessor } from './section-override';\nexport { PrompdLoader, createPrompdEnvironment } from './prompd-loader';\nexport { MarkdownFormatter } from './formatters/markdown';\nexport { OpenAIFormatter } from './formatters/openai';\nexport { AnthropicFormatter } from './formatters/anthropic';\n","/**\r\n * Workflow Types - TypeScript interfaces for .pdflow files\r\n */\r\n\r\n// ============================================================================\r\n// .pdflow File Format Types\r\n// ============================================================================\r\n\r\nexport interface WorkflowFile {\r\n version: string\r\n metadata: WorkflowMetadata\r\n parameters?: WorkflowParameter[]\r\n using?: PackageAlias[]\r\n variables?: WorkflowVariable[]\r\n nodes: WorkflowNode[]\r\n edges: WorkflowEdge[] // React Flow standard format\r\n errorHandling?: ErrorHandlingConfig\r\n execution?: ExecutionConfig\r\n}\r\n\r\nexport interface WorkflowMetadata {\r\n id: string\r\n name: string\r\n description?: string\r\n author?: string\r\n version?: string\r\n tags?: string[]\r\n}\r\n\r\nexport interface WorkflowParameter {\r\n name: string\r\n type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'integer' | 'date' | 'datetime'\r\n required?: boolean\r\n description?: string\r\n default?: unknown\r\n enum?: string[]\r\n min?: number\r\n max?: number\r\n}\r\n\r\nexport interface PackageAlias {\r\n name: string\r\n prefix: string\r\n}\r\n\r\nexport interface WorkflowVariable {\r\n name: string\r\n type: string\r\n scope?: 'workflow' | 'node'\r\n default?: unknown\r\n}\r\n\r\n// ============================================================================\r\n// Node Types\r\n// ============================================================================\r\n\r\nexport type WorkflowNodeType =\r\n | 'trigger' // Workflow entry point (manual, webhook, schedule, file-watch)\r\n | 'prompt'\r\n | 'provider' // LLM provider configuration node\r\n | 'condition'\r\n | 'loop'\r\n | 'parallel'\r\n | 'merge'\r\n | 'transformer'\r\n | 'api'\r\n | 'tool' // Unified tool node: function, MCP, HTTP, command, or code\r\n | 'tool-call-parser' // Parse LLM output for tool calls\r\n | 'tool-call-router' // Container for Tool nodes with routing logic\r\n | 'agent' // Autonomous AI agent with ReAct-style tool-use loop\r\n | 'chat-agent' // Composite: User Input + Guardrail + Agent + Tool Router\r\n | 'guardrail' // Input validation with success/rejected branching\r\n | 'callback'\r\n | 'checkpoint' // Alias for callback (legacy compatibility)\r\n | 'user-input' // Pause and collect user input\r\n | 'error-handler' // Error handling configuration node (referenced by other nodes)\r\n | 'command' // Shell command execution (Phase E)\r\n | 'claude-code' // Claude Code agent with SSH support (Phase E)\r\n | 'workflow' // Sub-workflow invocation (Phase E)\r\n | 'mcp-tool' // External MCP tool execution (Phase E)\r\n | 'code' // Code execution node: TS/JS, Python, or C#\r\n | 'memory' // Memory node: KV store, conversation history, or cache\r\n | 'output'\r\n | 'web-search' // Web search node: search the web via configurable provider\r\n | 'database-query' // Database query execution node\r\n // --- Add new node types here ---\r\n\r\nexport interface WorkflowNode {\r\n id: string\r\n type: WorkflowNodeType\r\n position: { x: number; y: number }\r\n data: TriggerNodeData | PromptNodeData | ProviderNodeData | ConditionNodeData | LoopNodeData | ParallelNodeData | MergeNodeData | TransformerNodeData | ApiNodeData | ToolNodeData | ToolCallParserNodeData | ToolCallRouterNodeData | AgentNodeData | ChatAgentNodeData | GuardrailNodeData | CallbackNodeData | UserInputNodeData | ErrorHandlerNodeData | CommandNodeData | ClaudeCodeNodeData | WorkflowNodeData | McpToolNodeData | CodeNodeData | MemoryNodeData | OutputNodeData | WebSearchNodeData\r\n /** Parent node ID for compound nodes (loop/parallel containers) */\r\n parentId?: string\r\n /** Extent for child nodes - 'parent' constrains to parent bounds */\r\n extent?: 'parent' | [number, number, number, number]\r\n /** Whether this node is expandable (container nodes) */\r\n expandParent?: boolean\r\n /** Width for resizable container nodes */\r\n width?: number\r\n /** Height for resizable container nodes */\r\n height?: number\r\n /** Style overrides */\r\n style?: Record<string, unknown>\r\n}\r\n\r\nexport interface BaseNodeData {\r\n label: string\r\n /** Disable this node to skip it during workflow execution */\r\n disabled?: boolean\r\n /** Lock the node to prevent dragging/moving */\r\n locked?: boolean\r\n /** Reference to ErrorHandler node for this node's errors */\r\n errorHandlerNodeId?: string\r\n /** Override: stop workflow immediately on error (ignores errorHandler) */\r\n failFast?: boolean\r\n /** Reference to a Connection for external service access (SSH, Database, HTTP API, etc.) */\r\n connectionId?: string\r\n /**\r\n * Docking configuration - when this node is docked to another node's handle.\r\n * Docked nodes appear as mini 24px circle previews attached to the host handle.\r\n */\r\n dockedTo?: {\r\n /** ID of the host node this node is docked to */\r\n nodeId: string\r\n /** Handle ID on the host node (e.g., 'rejected', 'onError', 'output') */\r\n handleId: string\r\n }\r\n /** Saved width before docking (for restoring on undock) */\r\n _preDockWidth?: number\r\n /** Saved height before docking (for restoring on undock) */\r\n _preDockHeight?: number\r\n /** Saved position before docking (for restoring on undock) */\r\n _preDockPosition?: { x: number; y: number }\r\n [key: string]: unknown // Index signature for React Flow compatibility\r\n}\r\n\r\n// ============================================================================\r\n// Node Docking Configuration\r\n// ============================================================================\r\n\r\n/** Node types that can be docked to handles */\r\nexport const DOCKABLE_NODE_TYPES: WorkflowNodeType[] = [\r\n 'tool-call-router', 'tool', 'callback', 'checkpoint', 'memory', 'error-handler'\r\n]\r\n\r\n/** Handle configurations that accept docked nodes */\r\nexport const DOCKABLE_HANDLES: Array<{\r\n nodeType: WorkflowNodeType\r\n handleId: string\r\n position: { side: 'left' | 'right' | 'bottom'; topPercent: number }\r\n acceptsTypes: WorkflowNodeType[]\r\n}> = [\r\n // Main agent/guardrail nodes - accept callback, checkpoint, error-handler on rejected handle\r\n { nodeType: 'chat-agent', handleId: 'rejected', position: { side: 'left', topPercent: 80 }, acceptsTypes: ['callback', 'checkpoint', 'error-handler'] },\r\n { nodeType: 'chat-agent', handleId: 'memory', position: { side: 'right', topPercent: 70 }, acceptsTypes: ['memory'] },\r\n { nodeType: 'chat-agent', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'guardrail', handleId: 'rejected', position: { side: 'left', topPercent: 70 }, acceptsTypes: ['callback', 'checkpoint', 'error-handler'] },\r\n { nodeType: 'guardrail', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'agent', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'agent', handleId: 'ai-output', position: { side: 'right', topPercent: 65 }, acceptsTypes: ['tool-call-router'] },\r\n { nodeType: 'agent', handleId: 'toolResult', position: { side: 'right', topPercent: 80 }, acceptsTypes: ['tool-call-router'] },\r\n { nodeType: 'agent', handleId: 'memory', position: { side: 'left', topPercent: 70 }, acceptsTypes: ['memory'] },\r\n\r\n // Prompt node - accepts memory for output caching, callback for logging\r\n { nodeType: 'prompt', handleId: 'output', position: { side: 'right', topPercent: 50 }, acceptsTypes: ['memory', 'callback'] },\r\n { nodeType: 'prompt', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n\r\n // Loop node - accepts memory for iteration state, callback for iteration events\r\n { nodeType: 'loop', handleId: 'onIteration', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['memory', 'callback'] },\r\n\r\n // Condition node - accepts callback for branch logging\r\n { nodeType: 'condition', handleId: 'onEvaluate', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback'] },\r\n\r\n // Code node - accepts memory for state, callback for logging\r\n { nodeType: 'code', handleId: 'onExecute', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['memory', 'callback'] },\r\n\r\n // Transformer node - accepts callback for transform logging\r\n { nodeType: 'transformer', handleId: 'onTransform', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback'] },\r\n\r\n // Tool Call Router node - accepts tool nodes for docking\r\n { nodeType: 'tool-call-router', handleId: 'ai-input', position: { side: 'left', topPercent: 35 }, acceptsTypes: ['tool'] },\r\n\r\n // Tool Call Router node - accepts tool nodes for docking\r\n { nodeType: 'tool-call-router', handleId: 'toolResult', position: { side: 'left', topPercent: 65 }, acceptsTypes: ['tool'] },\r\n\r\n // Loop node - accepts tool-call-router nodes for container-to-container docking\r\n { nodeType: 'loop', handleId: 'ai-output', position: { side: 'left', topPercent: 50 }, acceptsTypes: ['tool-call-router'] },\r\n\r\n // Loop node - accepts tool-call-router nodes for container-to-container docking\r\n { nodeType: 'loop', handleId: 'toolResult', position: { side: 'left', topPercent: 50 }, acceptsTypes: ['tool-call-router'] },\r\n]\r\n\r\n// ============================================================================\r\n// Trigger Node - Workflow Entry Point\r\n// ============================================================================\r\n\r\n/**\r\n * TriggerNodeData - Workflow entry point configuration\r\n *\r\n * Trigger types:\r\n * - manual: User clicks \"Run\" button (default)\r\n * - webhook: HTTP POST to a generated endpoint\r\n * - schedule: Cron expression or interval-based\r\n * - file-watch: File system changes (Electron only)\r\n * - event: Internal event from another workflow\r\n *\r\n * Every workflow should have exactly one TriggerNode as its entry point.\r\n * The trigger node has no inputs and one output that starts the workflow.\r\n */\r\nexport interface TriggerNodeData extends BaseNodeData {\r\n /** Type of trigger */\r\n triggerType: 'manual' | 'webhook' | 'schedule' | 'file-watch' | 'event'\r\n\r\n /** Description of when/how this workflow runs */\r\n description?: string\r\n\r\n // === Webhook Configuration (triggerType: 'webhook') ===\r\n\r\n /** Webhook path suffix (e.g., '/my-workflow' -> POST /api/webhooks/my-workflow) */\r\n webhookPath?: string\r\n /** Secret for HMAC signature validation */\r\n webhookSecret?: string\r\n /** HTTP methods to accept (default: POST only) */\r\n webhookMethods?: ('GET' | 'POST' | 'PUT')[]\r\n /** Whether to require authentication */\r\n webhookRequireAuth?: boolean\r\n\r\n // === Schedule Configuration (triggerType: 'schedule') ===\r\n\r\n /** Schedule type */\r\n scheduleType?: 'cron' | 'interval'\r\n /** Cron expression (e.g., '0 9 * * *' for 9am daily) */\r\n scheduleCron?: string\r\n /** Interval in milliseconds (e.g., 60000 for every minute) */\r\n scheduleIntervalMs?: number\r\n /** Timezone for cron expressions (default: UTC) */\r\n scheduleTimezone?: string\r\n /** Whether schedule is currently active */\r\n scheduleEnabled?: boolean\r\n\r\n // === File Watch Configuration (triggerType: 'file-watch', Electron only) ===\r\n\r\n /** Glob patterns for files to watch */\r\n fileWatchPaths?: string[]\r\n /** Events to trigger on */\r\n fileWatchEvents?: ('create' | 'modify' | 'delete')[]\r\n /** Debounce time in ms to batch rapid changes */\r\n fileWatchDebounceMs?: number\r\n /** Whether to watch subdirectories */\r\n fileWatchRecursive?: boolean\r\n\r\n // === Event Configuration (triggerType: 'event') ===\r\n\r\n /** Event name to listen for */\r\n eventName?: string\r\n /** Optional filter expression for event data */\r\n eventFilter?: string\r\n\r\n // === Output Schema ===\r\n\r\n /** Schema for data this trigger provides to the workflow */\r\n outputSchema?: JsonSchema\r\n}\r\n\r\nexport interface PromptNodeData extends BaseNodeData {\r\n /** Source type: 'file' for .prmd file reference, 'raw' for inline text */\r\n sourceType?: 'file' | 'raw'\r\n /** Path to .prmd file or package reference (used when sourceType is 'file' or undefined) */\r\n source: string\r\n /** Raw prompt text (used when sourceType is 'raw') */\r\n rawPrompt?: string\r\n /** Reference to a provider node ID, or inline provider name */\r\n provider?: string\r\n /** Model name (used with inline provider, ignored if providerNodeId is set) */\r\n model?: string\r\n /** Reference to a provider node by ID (preferred over inline provider/model) */\r\n providerNodeId?: string\r\n parameters?: Record<string, string> // Template expressions\r\n context?: {\r\n previous_output?: 'auto' | string\r\n }\r\n outputMapping?: Record<string, string>\r\n inputSchema?: JsonSchema\r\n outputSchema?: JsonSchema\r\n /** Temperature override (0-2) — overrides frontmatter hint, overridden by provider node */\r\n temperature?: number\r\n /** Max tokens override — overrides frontmatter hint, overridden by provider node */\r\n maxTokens?: number\r\n /** Guardrail configuration (for content filtering/validation) */\r\n guardrail?: {\r\n /** Whether the guardrail is enabled */\r\n enabled?: boolean\r\n /** Output mode when guardrail passes */\r\n outputMode?: 'passthrough' | 'original' | 'reject-message'\r\n /** Expected response format from LLM */\r\n expectedFormat?: 'json' | 'text'\r\n /** JSON field to check for rejection status */\r\n rejectionField?: string\r\n /** Pass when field is true or false */\r\n passWhen?: 'true' | 'false'\r\n /** Action to take when guardrail fails */\r\n failAction?: 'error' | 'stop' | 'continue'\r\n /** Custom message when rejected */\r\n customRejectMessage?: string\r\n /** Custom rejection expression (advanced) - overrides simple field check */\r\n rejectionExpression?: string\r\n }\r\n}\r\n\r\n/**\r\n * ProviderNodeData - LLM provider configuration node\r\n *\r\n * Centralizes provider/model selection so multiple prompt nodes can reference\r\n * the same provider configuration. This makes it easy to switch providers\r\n * across an entire workflow.\r\n */\r\nexport interface ProviderNodeData extends BaseNodeData {\r\n /** Provider ID (e.g., 'openai', 'anthropic', 'google') */\r\n providerId: string\r\n /** Model ID (e.g., 'gpt-4o', 'claude-sonnet-4-20250514') */\r\n model: string\r\n /** Optional description for this provider configuration */\r\n description?: string\r\n /** Temperature override (0-2) */\r\n temperature?: number\r\n /** Max tokens override */\r\n maxTokens?: number\r\n}\r\n\r\nexport interface ConditionNodeData extends BaseNodeData {\r\n conditions: ConditionBranch[]\r\n default?: string // Target node ID\r\n}\r\n\r\nexport interface ConditionBranch {\r\n id: string\r\n expression: string // Template expression e.g. \"{{ score >= 0.8 }}\"\r\n target: string // Target node ID\r\n}\r\n\r\nexport interface LoopNodeData extends BaseNodeData {\r\n loopType: 'while' | 'for-each' | 'count'\r\n condition?: string // For while loops\r\n items?: string // For for-each loops (template expression)\r\n itemVariable?: string // Variable name for current item\r\n count?: number // For count loops\r\n maxIterations: number // Safety limit\r\n body: string[] // Node IDs to execute in loop\r\n onComplete?: string // Target node ID after loop\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface ParallelNodeData extends BaseNodeData {\r\n /** Execution mode: 'broadcast' (container) or 'fork' (edge-based branches) */\r\n mode: 'broadcast' | 'fork'\r\n /** Number of output handles in fork mode */\r\n forkCount?: number\r\n /** Custom labels for fork branches (indexed by branch number) */\r\n forkLabels?: string[]\r\n branches: ParallelBranch[]\r\n waitFor: 'all' | 'any' | 'race'\r\n mergeStrategy: 'object' | 'array' | 'first'\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface ParallelBranch {\r\n id: string\r\n label?: string // Custom label for the branch (defaults to \"Branch N\")\r\n nodes: string[] // Node IDs in this branch\r\n}\r\n\r\nexport interface MergeNodeData extends BaseNodeData {\r\n inputs: string[] // Template expressions for inputs\r\n mergeAs: 'object' | 'array'\r\n /**\r\n * Merge mode determines how the merge node behaves:\r\n * - 'wait': Waits for all connected inputs to have outputs before executing (default)\r\n * - 'transform': Executes immediately with whatever inputs are available (router/passthrough)\r\n */\r\n mode?: 'wait' | 'transform'\r\n}\r\n\r\n/**\r\n * TransformerNodeData - Data transformation node\r\n *\r\n * Transform, reshape, or filter data using templates with {{ variable }} syntax.\r\n * Supports multiple transform modes for different use cases.\r\n *\r\n * Transform Modes:\r\n * - template: JSON template with {{ }} variable interpolation\r\n * - jq: JQ-style query expressions (future)\r\n * - javascript: Inline JS expression (sandboxed)\r\n *\r\n * Variables:\r\n * - {{ previous_output }} - Output from the connected input node\r\n * - {{ node_id.property }} - Access specific node outputs\r\n * - {{ workflow.param_name }} - Workflow parameters\r\n */\r\nexport interface TransformerNodeData extends BaseNodeData {\r\n /** Transform mode */\r\n mode: 'template' | 'jq' | 'expression'\r\n\r\n /** JSON template string with {{ variable }} syntax (for template mode) */\r\n template?: string\r\n\r\n /** JQ-style query expression (for jq mode, future) */\r\n jqExpression?: string\r\n\r\n /** JavaScript expression that returns transformed value (for expression mode) */\r\n expression?: string\r\n\r\n /** Input variable name (defaults to 'input') */\r\n inputVariable?: string\r\n\r\n /** Whether to pass through unchanged if transform fails */\r\n passthroughOnError?: boolean\r\n\r\n /** Description of what this transform does */\r\n description?: string\r\n\r\n // Legacy field for backwards compatibility\r\n transform?: string\r\n}\r\n\r\nexport interface ApiNodeData extends BaseNodeData {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n url: string\r\n headers?: Record<string, string>\r\n body?: string // Template expression\r\n retryPolicy?: RetryPolicy\r\n}\r\n\r\n/**\r\n * ToolNodeData - Unified tool execution node\r\n *\r\n * Supports five tool types:\r\n * - function: Call a registered function/callback provided to the workflow executor\r\n * - mcp: Call a tool exposed by an MCP (Model Context Protocol) server\r\n * - http: Make an HTTP request (similar to ApiNodeData but unified interface)\r\n * - command: Execute a whitelisted shell command (npm, git, python, etc.)\r\n * - code: Execute code snippets (TypeScript/JavaScript, Python, or C#)\r\n *\r\n * Use cases:\r\n * - Database lookups\r\n * - Code execution\r\n * - External API integration\r\n * - MCP-compatible AI tools\r\n * - Custom business logic\r\n * - Shell command execution\r\n * - Data transformation via code\r\n */\r\nexport interface ToolNodeData extends BaseNodeData {\r\n /** Tool type determines how the tool is invoked */\r\n toolType: 'function' | 'mcp' | 'http' | 'command' | 'code'\r\n\r\n /** Tool name - for function/mcp types, this identifies the tool to call */\r\n toolName: string\r\n\r\n /** Description shown in the node and used for documentation */\r\n description?: string\r\n\r\n /** Input parameters - template expressions supported */\r\n parameters?: Record<string, unknown>\r\n\r\n /** Parameter schema for validation and UI generation */\r\n parameterSchema?: {\r\n type: 'object'\r\n properties?: Record<string, {\r\n type: string\r\n description?: string\r\n default?: unknown\r\n enum?: string[]\r\n }>\r\n required?: string[]\r\n }\r\n\r\n // === HTTP-specific fields (toolType: 'http') ===\r\n /** HTTP method (only for http type) */\r\n httpMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n /** URL template (only for http type) */\r\n httpUrl?: string\r\n /** HTTP headers (only for http type) */\r\n httpHeaders?: Record<string, string>\r\n /** Request body template (only for http type) */\r\n httpBody?: string\r\n\r\n // === MCP-specific fields (toolType: 'mcp') ===\r\n /** MCP server URL (only for mcp type) */\r\n mcpServerUrl?: string\r\n /** MCP server name/identifier (alternative to URL for configured servers) */\r\n mcpServerName?: string\r\n\r\n // === Command-specific fields (toolType: 'command') ===\r\n /** The executable to run (must be in allowed list or custom commands) */\r\n commandExecutable?: string\r\n /** Action/subcommand (e.g., 'run' for npm, 'status' for git) */\r\n commandAction?: string\r\n /** Arguments template (supports {{ }} expressions) */\r\n commandArgs?: string\r\n /** Working directory (relative to workspace) */\r\n commandCwd?: string\r\n /** Whether this command requires user approval before execution */\r\n commandRequiresApproval?: boolean\r\n /** Custom command ID (references CustomCommandConfig from connections) */\r\n customCommandId?: string\r\n\r\n // === Code-specific fields (toolType: 'code') ===\r\n /** Programming language for code execution */\r\n codeLanguage?: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n /** The code snippet to execute */\r\n codeSnippet?: string\r\n /** Variable name for previous_output (default: 'input') */\r\n codeInputVariable?: string\r\n /** For TS/JS: execution context */\r\n codeExecutionContext?: 'isolated' | 'main'\r\n\r\n // === Common execution options ===\r\n /** Timeout in milliseconds */\r\n timeout?: number\r\n /** Retry policy for failed executions */\r\n retryPolicy?: RetryPolicy\r\n /** Transform the result before passing to next node */\r\n outputTransform?: string\r\n}\r\n\r\n/**\r\n * ToolCallParserNodeData - Parse LLM output for tool call requests\r\n *\r\n * This node detects and extracts tool calls from LLM responses, enabling\r\n * agentic workflows where the LLM decides which tools to call.\r\n *\r\n * Supported formats:\r\n * - openai: OpenAI function calling format (tool_calls array)\r\n * - anthropic: Anthropic tool_use blocks\r\n * - xml: XML-style <tool_call> tags\r\n * - json: Generic JSON with configurable field names\r\n * - auto: Automatically detect format\r\n *\r\n * Output structure:\r\n * {\r\n * hasToolCall: boolean,\r\n * toolName: string | null,\r\n * toolParameters: Record<string, unknown> | null,\r\n * remainingText: string, // Text after tool call extraction\r\n * rawToolCall: unknown, // Original tool call data\r\n * format: string // Detected format\r\n * }\r\n */\r\nexport interface ToolCallParserNodeData extends BaseNodeData {\r\n /** Format to parse - 'auto' will attempt to detect */\r\n format: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** For 'json' format: field name containing the tool name */\r\n jsonToolNameField?: string\r\n /** For 'json' format: field name containing the parameters */\r\n jsonParametersField?: string\r\n\r\n /** For 'xml' format: tag name for tool calls (default: 'tool_call') */\r\n xmlTagName?: string\r\n\r\n /** List of valid tool names - if provided, only these will be recognized */\r\n allowedTools?: string[]\r\n\r\n /** What to do if no tool call is found */\r\n noToolCallBehavior: 'passthrough' | 'error' | 'default'\r\n\r\n /** Default tool to use if noToolCallBehavior is 'default' */\r\n defaultTool?: string\r\n defaultParameters?: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * ToolCallRouterNodeData - Container node for grouping Tool nodes\r\n *\r\n * This node acts as a container that groups Tool nodes together and routes\r\n * tool calls from Agent nodes to the appropriate Tool node based on tool name.\r\n *\r\n * Usage:\r\n * 1. Create a ToolCallRouter node on the canvas\r\n * 2. Drag Tool nodes inside the container (they become children via parentId)\r\n * 3. Connect Agent's onCheckpoint handle to router's toolCall input\r\n * 4. Connect router's toolResult output back to Agent's toolResult input\r\n *\r\n * The router automatically collects tool schemas from child Tool nodes and\r\n * dispatches tool calls to the matching Tool node for execution.\r\n */\r\nexport interface ToolCallRouterNodeData extends BaseNodeData {\r\n /** How tool calls are matched to Tool nodes */\r\n routingMode: 'name-match' | 'pattern' | 'fallback'\r\n\r\n /** Behavior when no Tool node matches the requested tool name */\r\n onNoMatch: 'error' | 'passthrough' | 'fallback-tool'\r\n\r\n /** ID of a Tool node inside this router to use as fallback */\r\n fallbackToolId?: string\r\n\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface OutputNodeData extends BaseNodeData {\r\n outputSchema?: JsonSchema\r\n result?: unknown // Execution result\r\n}\r\n\r\n/**\r\n * ErrorHandlerNodeData - Workflow-level error handling configuration\r\n *\r\n * Error handling is configured as a **workflow-level node** that other nodes\r\n * reference by ID (similar to how nodes reference Provider nodes). This avoids\r\n * cluttering the graph with inline error edges.\r\n *\r\n * Nodes reference an ErrorHandler via `errorHandlerNodeId` in BaseNodeData.\r\n * When an error occurs, the executor routes it to the referenced ErrorHandler\r\n * for retry, fallback, or notification handling.\r\n *\r\n * Strategies:\r\n * - retry: Attempt the operation again with backoff\r\n * - fallback: Return a fallback value or execute a fallback node\r\n * - notify: Send notification (webhook, log) and continue\r\n * - ignore: Swallow the error and continue with null/undefined\r\n * - rethrow: Re-throw the error to stop execution\r\n *\r\n * Visual representation:\r\n * - Displayed in \"Error Handlers\" section of NodePalette\r\n * - Rose/red color theme\r\n * - Dashed border to indicate \"config node\" vs \"flow node\"\r\n * - No edges - referenced by ID from other nodes\r\n */\r\nexport interface ErrorHandlerNodeData extends BaseNodeData {\r\n /** Error handling strategy */\r\n strategy: 'retry' | 'fallback' | 'notify' | 'ignore' | 'rethrow'\r\n\r\n // === Retry Configuration (strategy: 'retry') ===\r\n\r\n /** Retry policy */\r\n retry?: {\r\n /** Maximum number of retry attempts */\r\n maxAttempts: number\r\n /** Initial backoff delay in milliseconds */\r\n backoffMs: number\r\n /** Backoff multiplier for exponential backoff (e.g., 2 for doubling) */\r\n backoffMultiplier?: number\r\n /** Maximum backoff delay in milliseconds */\r\n maxBackoffMs?: number\r\n /** Error codes/patterns that should trigger a retry (empty = retry all) */\r\n retryOn?: string[]\r\n /** Error codes/patterns that should NOT trigger a retry */\r\n noRetryOn?: string[]\r\n }\r\n\r\n // === Fallback Configuration (strategy: 'fallback') ===\r\n\r\n /** Fallback value or node when all retries exhausted or strategy is 'fallback' */\r\n fallback?: {\r\n /** Type of fallback */\r\n type: 'value' | 'template' | 'node'\r\n /** Static value to return (when type is 'value') */\r\n value?: unknown\r\n /** Template expression to evaluate (when type is 'template') */\r\n template?: string\r\n /** Node ID to execute as fallback (when type is 'node') */\r\n nodeId?: string\r\n }\r\n\r\n // === Notification Configuration (strategy: 'notify' or any strategy) ===\r\n\r\n /** Notification settings */\r\n notify?: {\r\n /** Webhook URL to POST error details */\r\n webhookUrl?: string\r\n /** HTTP headers for webhook */\r\n webhookHeaders?: Record<string, string>\r\n /** Whether to include stack trace in notification */\r\n includeStack?: boolean\r\n /** Whether to include node input/context in notification */\r\n includeContext?: boolean\r\n /** Custom message template (supports {{ error.message }}, {{ node.id }}, etc.) */\r\n messageTemplate?: string\r\n }\r\n\r\n // === Logging Configuration ===\r\n\r\n /** Logging settings */\r\n log?: {\r\n /** Log level for this error handler */\r\n level: 'error' | 'warn' | 'info' | 'debug'\r\n /** Whether to include the node data that caused the error */\r\n includeNodeData?: boolean\r\n /** Whether to include input data */\r\n includeInput?: boolean\r\n }\r\n\r\n // === Condition Configuration ===\r\n\r\n /** Only handle errors matching these conditions */\r\n conditions?: {\r\n /** Error codes/patterns to match (regex supported) */\r\n errorCodes?: string[]\r\n /** Error message patterns to match (regex supported) */\r\n messagePatterns?: string[]\r\n /** Node types this handler applies to */\r\n nodeTypes?: WorkflowNodeType[]\r\n }\r\n\r\n /** Description of this error handler */\r\n description?: string\r\n}\r\n\r\n/**\r\n * CheckpointNodeData - Configurable observation point for workflow execution\r\n *\r\n * The Checkpoint node is a flexible observation/control point that can:\r\n * - Log data to console and execution history\r\n * - Pause execution in debug mode (breakpoint)\r\n * - Gate execution requiring human approval (production use)\r\n * - Send webhook notifications to external systems\r\n *\r\n * Pre-Node Aware: The checkpoint detects what type of node feeds into it\r\n * and can subscribe to specific events from that node (e.g., Agent iterations).\r\n *\r\n * All behaviors are toggleable and can be combined.\r\n */\r\nexport interface CallbackNodeData extends BaseNodeData {\r\n /** Custom name for this checkpoint (shown in logs/UI) */\r\n checkpointName?: string\r\n /** Description of what this checkpoint monitors */\r\n description?: string\r\n\r\n // ============================================================================\r\n // Behaviors (toggleable, can combine multiple)\r\n // ============================================================================\r\n\r\n /** Log checkpoint data to console/stdout */\r\n logToConsole?: boolean\r\n /** Store checkpoint data in execution history for later review */\r\n logToHistory?: boolean\r\n /** Pause execution when running in debug mode (breakpoint) */\r\n pauseInDebug?: boolean\r\n /** Require human approval before continuing (works in production) */\r\n requireApproval?: boolean\r\n /** Send HTTP webhook notification */\r\n sendWebhook?: boolean\r\n\r\n // ============================================================================\r\n // Data Capture Options\r\n // ============================================================================\r\n\r\n /** Include the previous node's output in checkpoint data */\r\n capturePreviousOutput?: boolean\r\n /** Include timestamp and execution duration */\r\n captureTimestamp?: boolean\r\n /** Include full execution context (all variables, workflow state) */\r\n captureFullContext?: boolean\r\n /** Custom message template (supports {{ }} expressions) */\r\n message?: string\r\n\r\n // ============================================================================\r\n // Approval Options (when requireApproval is true)\r\n // ============================================================================\r\n\r\n /** Title shown in approval dialog */\r\n approvalTitle?: string\r\n /** Instructions for the reviewer */\r\n approvalInstructions?: string\r\n /** Timeout in ms to wait for approval (0 = wait indefinitely) */\r\n approvalTimeoutMs?: number\r\n /** What to do if approval times out */\r\n approvalTimeoutAction?: 'continue' | 'fail' | 'skip'\r\n\r\n // ============================================================================\r\n // Webhook Options (when sendWebhook is true)\r\n // ============================================================================\r\n\r\n /** Webhook URL to POST checkpoint data */\r\n webhookUrl?: string\r\n /** Custom headers to include in webhook request */\r\n webhookHeaders?: Record<string, string>\r\n /** Whether to wait for webhook acknowledgment before continuing */\r\n webhookWaitForAck?: boolean\r\n /** Timeout in ms to wait for acknowledgment (0 = no timeout) */\r\n webhookAckTimeoutMs?: number\r\n\r\n // ============================================================================\r\n // Pre-Node Awareness (auto-detected based on incoming connection)\r\n // ============================================================================\r\n\r\n /**\r\n * Detected type of the node connected to this checkpoint's input.\r\n * This is auto-populated and used to show relevant options in the UI.\r\n * @readonly - Set automatically, not user-configurable\r\n */\r\n _detectedSourceType?: WorkflowNodeType\r\n\r\n // === Agent-specific options (shown when source is 'agent') ===\r\n\r\n /** Include full iteration history from agent execution */\r\n agentCaptureIterations?: boolean\r\n /** Include conversation/message history */\r\n agentCaptureConversation?: boolean\r\n /** Include tool call details and results */\r\n agentCaptureToolCalls?: boolean\r\n /** Include agent's thinking/reasoning (if available) */\r\n agentCaptureThinking?: boolean\r\n\r\n /**\r\n * Event types to listen for when connected to an Agent's onCheckpoint handle.\r\n * If empty or undefined, listens to all event types.\r\n */\r\n listenTo?: AgentCheckpointEventType[]\r\n\r\n // === Loop-specific options (shown when source is 'loop') ===\r\n\r\n /** Capture current iteration index */\r\n loopCaptureIteration?: boolean\r\n /** Capture loop variable value */\r\n loopCaptureVariable?: boolean\r\n\r\n // === Prompt-specific options (shown when source is 'prompt') ===\r\n\r\n /** Include the compiled prompt that was sent to the LLM */\r\n promptCaptureCompiled?: boolean\r\n /** Include token usage stats */\r\n promptCaptureTokens?: boolean\r\n\r\n // ============================================================================\r\n // Legacy/Deprecated (for backwards compatibility)\r\n // ============================================================================\r\n\r\n /** @deprecated Use individual behavior toggles instead */\r\n mode?: 'passthrough' | 'pause' | 'report'\r\n /** @deprecated Use capturePreviousOutput instead */\r\n includePreviousOutput?: boolean\r\n /** @deprecated Use captureFullContext instead */\r\n includeNextNodeInfo?: boolean\r\n /** @deprecated Use webhookWaitForAck instead */\r\n waitForAck?: boolean\r\n /** @deprecated Use webhookAckTimeoutMs instead */\r\n ackTimeoutMs?: number\r\n /** @deprecated Use agentCaptureIterations instead */\r\n agentIncludeIterationHistory?: boolean\r\n /** @deprecated Use agentCaptureConversation instead */\r\n agentIncludeConversationHistory?: boolean\r\n /** @deprecated Use agentCaptureToolCalls instead */\r\n agentIncludeToolCalls?: boolean\r\n}\r\n\r\n/**\r\n * UserInputNodeData - Pause workflow and collect user input\r\n *\r\n * This node pauses execution and waits for user input. It can be used for:\r\n * - Interactive chat loops (user message -> LLM -> user message -> ...)\r\n * - Human-in-the-loop approval workflows\r\n * - Data collection mid-workflow\r\n * - Debugging with manual input injection\r\n *\r\n * The node provides context (previous output, conversation history) to help\r\n * the user understand what input is needed.\r\n */\r\nexport interface UserInputNodeData extends BaseNodeData {\r\n /** Prompt message shown to the user (supports {{ }} template expressions) */\r\n prompt: string\r\n /** Type of input to collect */\r\n inputType: 'text' | 'textarea' | 'choice' | 'confirm' | 'number'\r\n /** Choices for 'choice' input type */\r\n choices?: string[]\r\n /** Placeholder text for input field */\r\n placeholder?: string\r\n /** Default value for the input */\r\n defaultValue?: string\r\n /** Whether input is required to continue */\r\n required?: boolean\r\n /** Whether to show the previous node's output to the user */\r\n showContext?: boolean\r\n /** Custom template for displaying context (supports {{ previous_output }}, {{ variables }}) */\r\n contextTemplate?: string\r\n /** Timeout in ms (0 = wait indefinitely) */\r\n timeout?: number\r\n}\r\n\r\n// ============================================================================\r\n// Phase E: Advanced Nodes\r\n// ============================================================================\r\n\r\n/**\r\n * CommandNodeData - Execute whitelisted shell commands\r\n *\r\n * This node executes shell commands with proper security controls:\r\n * - Commands can be whitelisted by admin\r\n * - Arguments are passed safely (not interpolated into command string)\r\n * - Output is captured and parsed\r\n * - Requires approval for sensitive operations\r\n */\r\nexport interface CommandNodeData extends BaseNodeData {\r\n /** Command template (supports {{ }} expressions for arguments) */\r\n command: string\r\n\r\n /** Command arguments (safer than string interpolation) */\r\n args?: string[]\r\n\r\n /** Working directory (relative to workspace) */\r\n cwd?: string\r\n\r\n /** Environment variables to set */\r\n env?: Record<string, string>\r\n\r\n /** Timeout in milliseconds */\r\n timeoutMs?: number\r\n\r\n /** Output parsing format */\r\n outputFormat: 'text' | 'json' | 'lines'\r\n\r\n /** Whether this command requires user approval before execution */\r\n requiresApproval?: boolean\r\n\r\n /** Description shown in approval dialog */\r\n approvalMessage?: string\r\n}\r\n\r\n/**\r\n * WebSearchNodeData - Search the web via configurable provider\r\n *\r\n * Uses the connection system to configure which search provider to use.\r\n * Supports SearXNG (free, no key), Brave Search, and Tavily.\r\n */\r\nexport interface WebSearchNodeData extends BaseNodeData {\r\n /** Search query template (supports {{ }} expressions) */\r\n query: string\r\n\r\n /** Maximum number of results to return (default: 5) */\r\n resultCount?: number\r\n\r\n /** Search provider: 'searxng' (free, default), 'brave', or 'tavily' */\r\n provider?: 'searxng' | 'brave' | 'tavily'\r\n\r\n /** API key for Brave/Tavily providers */\r\n apiKey?: string\r\n\r\n /** SearXNG instance URL (default: https://search.sapti.me) */\r\n instanceUrl?: string\r\n}\r\n\r\n/**\r\n * ClaudeCodeNodeData - Claude Code agent with SSH support for remote development\r\n *\r\n * This node encapsulates a full Claude Code agent that can:\r\n * - Connect to local or remote systems via SSH\r\n * - Execute multi-turn development tasks\r\n * - Use file editing, command execution, and web tools\r\n * - Stream progress back to the workflow\r\n */\r\nexport interface ClaudeCodeNodeData extends BaseNodeData {\r\n /** Connection type and configuration */\r\n connection: {\r\n type: 'local' | 'ssh'\r\n\r\n /** SSH settings (when type === 'ssh') */\r\n ssh?: {\r\n /** Reference to SSH connection from Connections Panel */\r\n connectionId?: string\r\n /** Or inline config (deprecated - use connectionId) */\r\n host?: string\r\n port?: number\r\n username?: string\r\n authMethod?: 'key' | 'agent'\r\n keyPath?: string\r\n }\r\n }\r\n\r\n /** Task configuration */\r\n task: {\r\n /** Main task description (supports {{ }} template expressions) */\r\n prompt: string\r\n\r\n /** Optional system prompt override */\r\n systemPrompt?: string\r\n\r\n /** Working directory on target (relative or absolute) */\r\n workingDirectory?: string\r\n\r\n /** Files to include as context (glob patterns) */\r\n contextFiles?: string[]\r\n }\r\n\r\n /** Execution constraints */\r\n constraints: {\r\n /** Maximum agent turns before forcing completion */\r\n maxTurns?: number\r\n\r\n /** Allowed tool categories */\r\n allowedTools?: ('read' | 'write' | 'execute' | 'web')[]\r\n\r\n /** Blocked file patterns (security) */\r\n blockedPaths?: string[]\r\n\r\n /** Require approval for write operations */\r\n requireApprovalForWrites?: boolean\r\n\r\n /** Timeout for entire execution (ms) */\r\n timeoutMs?: number\r\n }\r\n\r\n /** Output configuration */\r\n output: {\r\n /** What to return as node output */\r\n format: 'final-response' | 'full-conversation' | 'files-changed' | 'structured'\r\n\r\n /** For structured output - JSON schema to enforce */\r\n schema?: JsonSchema\r\n\r\n /** Include execution metadata (tokens, duration, etc.) */\r\n includeMetadata?: boolean\r\n }\r\n}\r\n\r\n/**\r\n * WorkflowNodeData - Invoke another .pdflow as a sub-workflow\r\n *\r\n * This enables workflow composition:\r\n * - Call reusable workflow modules\r\n * - Pass parameters and receive outputs\r\n * - Support for recursive workflows (with depth limit)\r\n */\r\nexport interface WorkflowNodeData extends BaseNodeData {\r\n /** Source workflow path or package reference */\r\n source: string\r\n\r\n /** Parameter mapping (input to sub-workflow) */\r\n parameters: Record<string, string>\r\n\r\n /** Output mapping (sub-workflow output to this node's output) */\r\n outputMapping?: Record<string, string>\r\n\r\n /** Execution options */\r\n timeout?: number\r\n\r\n /** Whether to pass parent workflow variables */\r\n inheritVariables?: boolean\r\n\r\n /** Maximum recursion depth (to prevent infinite loops) */\r\n maxDepth?: number\r\n}\r\n\r\n/**\r\n * McpToolNodeData - Execute tools from external MCP servers\r\n *\r\n * This node connects to external MCP servers and executes their tools.\r\n * Unlike the generic Tool node, this is specifically for MCP protocol\r\n * and supports MCP-specific features like resources and prompts.\r\n */\r\nexport interface McpToolNodeData extends BaseNodeData {\r\n /** Reference to MCP server connection from Connections Panel */\r\n connectionId?: string\r\n\r\n /** Or inline MCP server config (deprecated - use connectionId) */\r\n serverConfig?: {\r\n serverUrl?: string\r\n serverName?: string\r\n transport?: 'stdio' | 'http' | 'websocket'\r\n }\r\n\r\n /** Tool name to execute */\r\n toolName: string\r\n\r\n /** Parameter mapping (supports {{ }} expressions) */\r\n parameters: Record<string, string>\r\n\r\n /** Timeout for tool execution (ms) */\r\n timeoutMs?: number\r\n\r\n /** Whether to include tool result in conversation context */\r\n includeInContext?: boolean\r\n}\r\n\r\n/**\r\n * CodeNodeData - Execute code snippets in various languages\r\n *\r\n * Supports:\r\n * - TypeScript/JavaScript: Runs in isolated VM context or via temp file\r\n * - Python: Executes via python -c or temp file\r\n * - C#: Executes via dotnet-script or compiled temp file\r\n *\r\n * The previous_output is available as a variable (default name: 'input')\r\n */\r\nexport interface CodeNodeData extends BaseNodeData {\r\n /** Programming language */\r\n language: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n\r\n /** The code to execute */\r\n code: string\r\n\r\n /** Variable name for the input (previous_output), default: 'input' */\r\n inputVariable?: string\r\n\r\n /** For TS/JS: run in isolated VM or main context */\r\n executionContext?: 'isolated' | 'main'\r\n\r\n /** Timeout in milliseconds (default: 30000) */\r\n timeoutMs?: number\r\n\r\n /** Description of what this code does */\r\n description?: string\r\n}\r\n\r\n/**\r\n * MemoryNodeData - Configurable memory storage node\r\n *\r\n * Supports multiple memory patterns:\r\n * - 'kv': Key-value store for passing state between nodes\r\n * - 'conversation': Message history with sliding window for chat context\r\n * - 'cache': Time-based caching for expensive operations\r\n *\r\n * Memory is scoped to workflow execution by default, but can be\r\n * persisted across executions via the 'persistent' flag.\r\n *\r\n * Handles:\r\n * - input (left) - Data to store or key to retrieve\r\n * - output (right) - Retrieved value or confirmation\r\n */\r\n/** Memory operation type */\r\nexport type MemoryOperation = 'get' | 'set' | 'delete' | 'clear' | 'list' | 'append'\r\n\r\n/** Operations available per memory mode */\r\nexport const MEMORY_OPERATIONS_BY_MODE: Record<string, MemoryOperation[]> = {\r\n kv: ['get', 'set', 'delete', 'list', 'clear'],\r\n conversation: ['get', 'append', 'clear'],\r\n cache: ['get', 'set', 'delete', 'clear'],\r\n}\r\n\r\nexport interface MemoryNodeData extends BaseNodeData {\r\n /** Memory operation mode */\r\n mode: 'kv' | 'conversation' | 'cache'\r\n\r\n /**\r\n * Operations this node can perform (multi-select).\r\n * When multiple operations are enabled, the input data's `operation` field\r\n * determines which to execute, or defaults to the first enabled operation.\r\n */\r\n operations: MemoryOperation[]\r\n\r\n // ============================================================================\r\n // Key-Value Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Key for the value (supports {{ }} template expressions).\r\n * Used in kv and cache modes.\r\n */\r\n key?: string\r\n\r\n /**\r\n * Value to store (supports {{ }} template expressions).\r\n * Used with 'set' operation. If not provided, uses input data.\r\n */\r\n value?: string\r\n\r\n /**\r\n * Default value to return if key doesn't exist.\r\n * Used with 'get' operation.\r\n */\r\n defaultValue?: string\r\n\r\n // ============================================================================\r\n // Conversation Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Conversation/thread identifier (supports {{ }} expressions).\r\n * Allows multiple separate conversation histories.\r\n */\r\n conversationId?: string\r\n\r\n /**\r\n * Role for the message being appended ('user', 'assistant', 'system').\r\n * Used with 'append' operation in conversation mode.\r\n */\r\n messageRole?: 'user' | 'assistant' | 'system'\r\n\r\n /**\r\n * Maximum messages to retain in sliding window.\r\n * Older messages are removed when limit is exceeded.\r\n * Set to 0 for unlimited.\r\n */\r\n maxMessages?: number\r\n\r\n /**\r\n * Include system messages in the sliding window count.\r\n * If false, system messages are always retained.\r\n */\r\n includeSystemInWindow?: boolean\r\n\r\n // ============================================================================\r\n // Cache Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Time-to-live in seconds for cached values.\r\n * After TTL expires, 'get' returns defaultValue or undefined.\r\n * Set to 0 for no expiration.\r\n */\r\n ttlSeconds?: number\r\n\r\n /**\r\n * Refresh TTL on read (sliding expiration).\r\n * If true, reading a value resets its TTL.\r\n */\r\n refreshOnRead?: boolean\r\n\r\n // ============================================================================\r\n // Persistence & Scope\r\n // ============================================================================\r\n\r\n /**\r\n * Memory scope:\r\n * - 'execution': Cleared when workflow execution completes (default)\r\n * - 'workflow': Persists across executions of this workflow\r\n * - 'global': Shared across all workflows (use with caution)\r\n */\r\n scope?: 'execution' | 'workflow' | 'global'\r\n\r\n /**\r\n * Namespace to isolate this memory from others.\r\n * Useful for avoiding key collisions in global scope.\r\n */\r\n namespace?: string\r\n\r\n // ============================================================================\r\n // Output Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * What to output after the operation:\r\n * - 'value': The retrieved/stored value\r\n * - 'success': Boolean indicating success\r\n * - 'metadata': Object with value, timestamp, ttl info\r\n * - 'passthrough': Pass input through unchanged\r\n */\r\n outputMode?: 'value' | 'success' | 'metadata' | 'passthrough'\r\n}\r\n\r\nexport interface DatabaseQueryNodeData extends BaseNodeData {\r\n /** Reference to a saved database connection */\r\n connectionId: string\r\n\r\n /** Query type determines how the query is executed */\r\n queryType: 'select' | 'insert' | 'update' | 'delete' | 'raw' | 'aggregate'\r\n\r\n /** SQL query, MongoDB JSON query document, or Redis command */\r\n query: string\r\n\r\n /** JSON-encoded parameter array for parameterized queries (SQL only) */\r\n parameters?: string\r\n\r\n /** MongoDB collection name (only for MongoDB connections) */\r\n collection?: string\r\n\r\n /** Maximum rows to return (default 1000) */\r\n maxRows?: number\r\n\r\n /** Query timeout in milliseconds (default 30000) */\r\n timeoutMs?: number\r\n}\r\n\r\n/**\r\n * CustomCommandConfig - User-defined allowed commands\r\n *\r\n * Stored in the Connections panel, these allow users to whitelist\r\n * additional shell commands for use in Tool nodes.\r\n */\r\nexport interface CustomCommandConfig {\r\n /** Unique identifier */\r\n id: string\r\n\r\n /** The executable name (e.g., 'cargo', 'terraform', 'kubectl') */\r\n executable: string\r\n\r\n /** Allowed actions/subcommands (if empty, any args allowed with validation) */\r\n allowedActions?: string[]\r\n\r\n /** Human-readable description */\r\n description?: string\r\n\r\n /** Whether to require approval before execution */\r\n requiresApproval: boolean\r\n\r\n /** When this command was added */\r\n addedAt: number\r\n}\r\n\r\n/**\r\n * Built-in allowed executables for command tool type\r\n */\r\nexport const BUILTIN_COMMAND_EXECUTABLES = [\r\n { executable: 'npm', description: 'Node.js package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'npx', description: 'Execute npm packages', actions: [] },\r\n { executable: 'node', description: 'Node.js runtime', actions: [] },\r\n { executable: 'yarn', description: 'Yarn package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'pnpm', description: 'PNPM package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'git', description: 'Version control', actions: ['status', 'add', 'commit', 'push', 'pull', 'log', 'diff', 'branch'] },\r\n { executable: 'python', description: 'Python interpreter', actions: [] },\r\n { executable: 'python3', description: 'Python 3 interpreter', actions: [] },\r\n { executable: 'pip', description: 'Python package manager', actions: ['install', 'list', 'show'] },\r\n { executable: 'prompd', description: 'Prompd CLI', actions: ['compile', 'run', 'validate', 'package'] },\r\n { executable: 'dotnet', description: '.NET CLI', actions: ['build', 'run', 'test', 'publish'] },\r\n { executable: 'tsc', description: 'TypeScript compiler', actions: [] },\r\n { executable: 'eslint', description: 'JavaScript linter', actions: [] },\r\n { executable: 'prettier', description: 'Code formatter', actions: [] },\r\n { executable: 'echo', description: 'Print text', actions: [] },\r\n] as const\r\n\r\n/**\r\n * AgentIterationRecord - Record of a single agent iteration for debugging\r\n */\r\nexport interface AgentIterationRecord {\r\n iteration: number\r\n timestamp: number\r\n llmInput: {\r\n systemPrompt: string\r\n conversationHistory: Array<{ role: string; content: string }>\r\n }\r\n llmOutput: {\r\n response: string\r\n hasToolCall: boolean\r\n toolName?: string\r\n toolParams?: Record<string, unknown>\r\n }\r\n toolExecution?: {\r\n toolName: string\r\n parameters: Record<string, unknown>\r\n result: unknown\r\n error?: string\r\n durationMs: number\r\n }\r\n durationMs: number\r\n}\r\n\r\n// ============================================================================\r\n// Agent Checkpoint Event Types\r\n// ============================================================================\r\n\r\n/**\r\n * AgentCheckpointEvent - Events emitted by Agent nodes during execution\r\n *\r\n * Agent nodes emit these events through their onCheckpoint handle, allowing\r\n * connected Callback nodes to observe and react to agent execution.\r\n *\r\n * Event types:\r\n * - toolCall: Agent is requesting a tool execution\r\n * - iteration: Agent completed an iteration of the ReAct loop\r\n * - thinking: Agent emitted reasoning/chain-of-thought\r\n * - error: An error occurred during agent execution\r\n * - complete: Agent finished execution\r\n */\r\nexport type AgentCheckpointEventType = 'toolCall' | 'iteration' | 'thinking' | 'error' | 'complete'\r\n\r\nexport interface AgentCheckpointEvent {\r\n /** Type of event */\r\n type: AgentCheckpointEventType\r\n /** When the event occurred */\r\n timestamp: number\r\n /** Current iteration number (1-indexed) */\r\n iteration: number\r\n /** Node ID of the agent that emitted this event */\r\n agentNodeId: string\r\n /** Event-specific data */\r\n data: ToolCallEventData | IterationEventData | ThinkingEventData | ErrorEventData | CompleteEventData\r\n}\r\n\r\n/** Data for 'toolCall' events - agent is requesting tool execution */\r\nexport interface ToolCallEventData {\r\n toolName: string\r\n parameters: Record<string, unknown>\r\n /** Tool schema for validation (if available) */\r\n schema?: {\r\n type: 'object'\r\n properties?: Record<string, { type: string; description?: string }>\r\n required?: string[]\r\n }\r\n}\r\n\r\n/** Data for 'iteration' events - agent completed a ReAct loop iteration */\r\nexport interface IterationEventData {\r\n iterationNumber: number\r\n llmInput: {\r\n systemPrompt: string\r\n messages: Array<{ role: string; content: string }>\r\n }\r\n llmOutput: {\r\n response: string\r\n hasToolCall: boolean\r\n toolName?: string\r\n toolParams?: Record<string, unknown>\r\n }\r\n durationMs: number\r\n}\r\n\r\n/** Data for 'thinking' events - agent's reasoning/chain-of-thought */\r\nexport interface ThinkingEventData {\r\n thought: string\r\n}\r\n\r\n/** Data for 'error' events - an error occurred */\r\nexport interface ErrorEventData {\r\n message: string\r\n code?: string\r\n stack?: string\r\n recoverable: boolean\r\n}\r\n\r\n/** Data for 'complete' events - agent finished execution */\r\nexport interface CompleteEventData {\r\n finalResponse: string\r\n totalIterations: number\r\n totalDurationMs: number\r\n stopReason: 'max-iterations' | 'stop-phrase' | 'no-tool-call' | 'error' | 'completed'\r\n}\r\n\r\n/**\r\n * AgentNodeData - Autonomous AI agent with tool-use loop\r\n *\r\n * Implements a ReAct-style (Reasoning + Acting) agent that:\r\n * 1. Sends a prompt to an LLM with tool definitions\r\n * 2. Parses the response for tool calls\r\n * 3. Executes requested tools\r\n * 4. Feeds results back to the LLM\r\n * 5. Repeats until LLM provides final answer or max iterations reached\r\n *\r\n * This encapsulates the common \"agentic loop\" pattern into a single node.\r\n *\r\n * Debug Mode:\r\n * When debugConfig.debugMode is enabled, the agent emits detailed traces at\r\n * internal checkpoints and can optionally pause at each checkpoint (like breakpoints).\r\n * Iteration history is stored in the node output for downstream analysis.\r\n */\r\nexport interface AgentNodeData extends BaseNodeData {\r\n /** System prompt that defines the agent's behavior and available tools */\r\n systemPrompt: string\r\n\r\n /** Initial user message / task description (supports {{ }} template expressions) */\r\n userPrompt: string\r\n\r\n /** Reference to a Provider node by ID (preferred - enables centralized config) */\r\n providerNodeId?: string\r\n\r\n /** Inline LLM provider (fallback if no providerNodeId) */\r\n provider?: string\r\n\r\n /** Inline model (fallback if no providerNodeId) */\r\n model?: string\r\n\r\n /** Tool definitions available to the agent (legacy - prefer toolRouterNodeId) */\r\n tools: AgentTool[]\r\n\r\n /** Reference to a ToolCallRouter node by ID (preferred over inline tools) */\r\n toolRouterNodeId?: string\r\n\r\n /** Maximum number of tool-use iterations before stopping */\r\n maxIterations: number\r\n\r\n /** Format for tool calls in LLM responses */\r\n toolCallFormat: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** What to output when agent completes */\r\n outputMode: 'final-response' | 'full-conversation' | 'last-tool-result'\r\n\r\n /** Whether to include conversation history in context */\r\n includeHistory?: boolean\r\n\r\n /** Stop phrases that indicate the agent is done (in addition to no tool call) */\r\n stopPhrases?: string[]\r\n\r\n /** Temperature for LLM calls */\r\n temperature?: number\r\n\r\n /** Timeout per LLM call in ms */\r\n llmTimeout?: number\r\n}\r\n\r\n/**\r\n * GuardrailNodeData - Input validation node with success/rejected branching\r\n *\r\n * Validates input against a system prompt and routes to success or rejected paths.\r\n * Uses an LLM to evaluate the input and determine if it passes validation.\r\n *\r\n * Handles:\r\n * - input (left, top) - Data to validate\r\n * - rejected (left, bottom) - Source handle for routing rejected input back\r\n *\r\n * Outputs:\r\n * - output (right) - Validated input passes through on success\r\n *\r\n * The guardrail evaluates the input using the configured provider and system prompt,\r\n * then uses the passExpression to determine if the result indicates pass or fail.\r\n */\r\nexport interface GuardrailNodeData extends BaseNodeData {\r\n /** System prompt that defines the validation criteria */\r\n systemPrompt: string\r\n\r\n /** Reference to a Provider node by ID for LLM evaluation */\r\n providerNodeId?: string\r\n\r\n /** Inline provider (fallback if no providerNodeId) */\r\n provider?: string\r\n\r\n /** Inline model (fallback if no providerNodeId) */\r\n model?: string\r\n\r\n /**\r\n * Expression to evaluate pass/fail from the LLM response.\r\n * Supports {{ }} template syntax with access to the parsed response.\r\n *\r\n * Examples:\r\n * - \"{{ score >= 0.8 }}\" - Pass if score is 0.8 or higher\r\n * - \"{{ !rejected }}\" - Pass if rejected is falsy\r\n * - \"{{ score >= 0.8 && !rejected }}\" - Combined conditions\r\n *\r\n * The expression is evaluated against the parsed JSON response from the LLM.\r\n * If the LLM returns a non-JSON response, it's wrapped as { response: \"...\" }\r\n */\r\n passExpression?: string\r\n\r\n /**\r\n * Numeric threshold for pass/fail (alternative to passExpression).\r\n * If the LLM response contains a 'score' field, this threshold is used.\r\n * Input passes if score >= scoreThreshold.\r\n */\r\n scoreThreshold?: number\r\n\r\n /** Temperature for LLM evaluation (default: 0 for deterministic) */\r\n temperature?: number\r\n\r\n /** Timeout for LLM call in ms */\r\n timeout?: number\r\n\r\n /** Description of what this guardrail validates */\r\n description?: string\r\n}\r\n\r\n/**\r\n * ChatAgentNodeData - Composite container for conversational AI agent pattern\r\n *\r\n * Bundles the common pattern of: User Input → Guardrail → AI Agent ↔ Tool Router\r\n * into a single, configurable node with checkpoints at each stage.\r\n *\r\n * When collapsed: Shows as a single node with key metrics\r\n * When expanded: Shows all internal nodes for detailed editing\r\n *\r\n * Internal nodes (auto-created):\r\n * - UserInput: Collects user message\r\n * - Guardrail: Validates input before processing\r\n * - Agent: AI agent with ReAct loop\r\n * - ToolRouter: Container for available tools\r\n *\r\n * Handles:\r\n * - input (left) - Workflow data / conversation context\r\n * - output (right) - Final agent response\r\n * - rejected (left, bottom) - Guardrail rejection path\r\n */\r\nexport interface ChatAgentNodeData extends BaseNodeData {\r\n // ============================================================================\r\n // Container State\r\n // ============================================================================\r\n\r\n /** Whether the container is collapsed (shows as single node) */\r\n collapsed?: boolean\r\n\r\n /** Saved dimensions when expanded */\r\n _savedWidth?: number\r\n _savedHeight?: number\r\n\r\n // ============================================================================\r\n // Agent Configuration (propagates to internal Agent node)\r\n // ============================================================================\r\n\r\n /**\r\n * Agent prompt source type:\r\n * - 'raw': Inline text prompt (agentSystemPrompt field)\r\n * - 'file': Reference to .prmd file or package (agentPromptSource field)\r\n */\r\n agentPromptSourceType?: 'raw' | 'file'\r\n\r\n /** System prompt for the AI agent (used when agentPromptSourceType is 'raw' or not set) */\r\n agentSystemPrompt: string\r\n\r\n /** Source file for agent prompt (used when agentPromptSourceType is 'file') - local .prmd path or package reference */\r\n agentPromptSource?: string\r\n\r\n /** Initial user prompt template (supports {{ }} expressions) */\r\n agentUserPrompt?: string\r\n\r\n /** Reference to Provider node for LLM */\r\n providerNodeId?: string\r\n\r\n /** Inline provider (fallback) */\r\n provider?: string\r\n\r\n /** Inline model (fallback) */\r\n model?: string\r\n\r\n /** Maximum ReAct loop iterations */\r\n maxIterations?: number\r\n\r\n /** Tool call format detection */\r\n toolCallFormat?: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** What to output when complete */\r\n outputMode?: 'final-response' | 'full-conversation' | 'last-tool-result'\r\n\r\n /** Temperature for LLM calls */\r\n temperature?: number\r\n\r\n // ============================================================================\r\n // Loop Configuration - Controls the agent's iterative behavior\r\n // ============================================================================\r\n\r\n /**\r\n * Loop mode for the chat agent:\r\n * - 'single-turn': Execute once and return (no looping)\r\n * - 'multi-turn': Continue until stop condition or max iterations\r\n * - 'until-complete': Loop until agent signals completion\r\n * - 'user-driven': Loop back for user input after each response\r\n */\r\n loopMode?: 'single-turn' | 'multi-turn' | 'until-complete' | 'user-driven'\r\n\r\n /**\r\n * Condition expression to continue looping (for multi-turn mode).\r\n * Evaluated after each iteration. Loop continues while this is true.\r\n * Uses {{ }} template syntax with access to iteration context.\r\n *\r\n * Examples:\r\n * - \"{{ iteration < 5 }}\" - Continue for 5 iterations\r\n * - \"{{ !response.includes('DONE') }}\" - Until response contains DONE\r\n * - \"{{ tools_used > 0 }}\" - Continue if tools were used\r\n */\r\n loopCondition?: string\r\n\r\n /**\r\n * Stop phrases that signal the agent is done.\r\n * If the response contains any of these, the loop terminates.\r\n */\r\n stopPhrases?: string[]\r\n\r\n /**\r\n * Whether to prompt for user input after each agent response (for user-driven mode).\r\n * When true, the loop pauses for user input before continuing.\r\n */\r\n loopOnUserInput?: boolean\r\n\r\n /**\r\n * Minimum number of iterations before stop condition is checked.\r\n * Ensures the agent runs at least this many times.\r\n */\r\n minIterations?: number\r\n\r\n /**\r\n * Delay between iterations in milliseconds.\r\n * Useful for rate limiting or allowing processing time.\r\n */\r\n iterationDelayMs?: number\r\n\r\n // ============================================================================\r\n // Guardrail Configuration (propagates to internal Guardrail node)\r\n // ============================================================================\r\n\r\n /** Whether guardrail is enabled */\r\n guardrailEnabled?: boolean\r\n\r\n /** Guardrail system prompt */\r\n guardrailSystemPrompt?: string\r\n\r\n /** Reference to Provider node for guardrail LLM (can be different from agent's provider) */\r\n guardrailProviderNodeId?: string\r\n\r\n /** Inline provider for guardrail (fallback if no guardrailProviderNodeId) */\r\n guardrailProvider?: string\r\n\r\n /** Inline model for guardrail (fallback if no guardrailProviderNodeId) */\r\n guardrailModel?: string\r\n\r\n /** Temperature for guardrail LLM evaluation (default: 0 for deterministic) */\r\n guardrailTemperature?: number\r\n\r\n /** Pass/fail expression */\r\n guardrailPassExpression?: string\r\n\r\n /** Score threshold alternative */\r\n guardrailScoreThreshold?: number\r\n\r\n /** Output mode when guardrail passes */\r\n guardrailOutputMode?: 'passthrough' | 'original' | 'reject-message'\r\n\r\n /** Expected response format from guardrail LLM */\r\n guardrailExpectedFormat?: 'json' | 'text'\r\n\r\n /** JSON field to check for rejection status */\r\n guardrailRejectionField?: string\r\n\r\n /** Pass when field is true or false */\r\n guardrailPassWhen?: 'true' | 'false'\r\n\r\n /** Action to take when guardrail fails */\r\n guardrailFailAction?: 'error' | 'stop' | 'continue'\r\n\r\n /** Custom message when rejected */\r\n guardrailCustomRejectMessage?: string\r\n\r\n /** Custom rejection expression (advanced) - overrides simple field check */\r\n guardrailRejectionExpression?: string\r\n\r\n // ============================================================================\r\n // User Input Configuration (propagates to internal UserInput node)\r\n // ============================================================================\r\n\r\n /** Whether to prompt for user input at start of each iteration */\r\n userInputEnabled?: boolean\r\n\r\n /** Prompt message shown to user */\r\n userInputPrompt?: string\r\n\r\n /** Input type */\r\n userInputType?: 'text' | 'textarea' | 'choice' | 'confirm'\r\n\r\n /** Placeholder text */\r\n userInputPlaceholder?: string\r\n\r\n /** Whether to show previous context to user */\r\n userInputShowContext?: boolean\r\n\r\n // ============================================================================\r\n // Tool Configuration (propagates to internal ToolRouter)\r\n // ============================================================================\r\n\r\n /** Inline tool definitions (for simple cases) */\r\n tools?: AgentTool[]\r\n\r\n /** Reference to external ToolRouter node (for complex tool setups) */\r\n toolRouterNodeId?: string\r\n\r\n // ============================================================================\r\n // Checkpoint Configuration - Control observability at each stage\r\n // ============================================================================\r\n\r\n /** Checkpoint settings for different stages */\r\n checkpoints?: {\r\n /** On user input received */\r\n onUserInput?: ChatAgentCheckpointConfig\r\n\r\n /** Before guardrail validation */\r\n beforeGuardrail?: ChatAgentCheckpointConfig\r\n\r\n /** After guardrail (pass or reject) */\r\n afterGuardrail?: ChatAgentCheckpointConfig\r\n\r\n /** Before each agent iteration */\r\n onIterationStart?: ChatAgentCheckpointConfig\r\n\r\n /** After each agent iteration */\r\n onIterationEnd?: ChatAgentCheckpointConfig\r\n\r\n /** When agent requests a tool call */\r\n onToolCall?: ChatAgentCheckpointConfig\r\n\r\n /** After tool execution returns */\r\n onToolResult?: ChatAgentCheckpointConfig\r\n\r\n /** When agent completes */\r\n onAgentComplete?: ChatAgentCheckpointConfig\r\n }\r\n\r\n // ============================================================================\r\n // Internal Node References (auto-managed)\r\n // ============================================================================\r\n\r\n /** IDs of internal nodes (auto-created, managed by the container) */\r\n _internalNodes?: {\r\n userInputId?: string\r\n guardrailId?: string\r\n agentId?: string\r\n toolRouterId?: string\r\n }\r\n}\r\n\r\n/**\r\n * Checkpoint configuration for ChatAgentNode stages\r\n */\r\nexport interface ChatAgentCheckpointConfig {\r\n /** Whether this checkpoint is enabled */\r\n enabled: boolean\r\n\r\n /** Pause execution at this point (debug mode) */\r\n pause?: boolean\r\n\r\n /** Log to console */\r\n logToConsole?: boolean\r\n\r\n /** Log to execution history */\r\n logToHistory?: boolean\r\n\r\n /** Require approval to continue */\r\n requireApproval?: boolean\r\n\r\n /** Send webhook notification */\r\n sendWebhook?: boolean\r\n webhookUrl?: string\r\n\r\n /** Custom message template */\r\n message?: string\r\n\r\n /** Include full context in checkpoint data */\r\n includeFullContext?: boolean\r\n}\r\n\r\n/**\r\n * Tool definition for an agent\r\n */\r\nexport interface AgentTool {\r\n /** Unique tool name */\r\n name: string\r\n\r\n /** Description shown to the LLM */\r\n description: string\r\n\r\n /** JSON schema for tool parameters */\r\n parameters?: {\r\n type: 'object'\r\n properties?: Record<string, {\r\n type: string\r\n description?: string\r\n enum?: string[]\r\n default?: unknown\r\n }>\r\n required?: string[]\r\n }\r\n\r\n /** How this tool is executed */\r\n toolType: 'function' | 'http' | 'mcp' | 'workflow' | 'command' | 'code' | 'web-search' | 'database-query'\r\n\r\n /** For HTTP tools */\r\n httpConfig?: {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n url: string\r\n headers?: Record<string, string>\r\n bodyTemplate?: string\r\n }\r\n\r\n /** For MCP tools */\r\n mcpConfig?: {\r\n serverUrl?: string\r\n serverName?: string\r\n }\r\n\r\n /** For workflow tools - execute a sub-workflow */\r\n workflowConfig?: {\r\n workflowPath: string\r\n }\r\n\r\n /** For command tools - execute shell commands */\r\n commandConfig?: {\r\n executable: string\r\n action?: string\r\n args?: string\r\n cwd?: string\r\n requiresApproval?: boolean\r\n }\r\n\r\n /** For code tools - execute code snippets */\r\n codeConfig?: {\r\n language: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n snippet: string\r\n inputVariable?: string\r\n executionContext?: 'isolated' | 'main'\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Edges (React Flow standard format)\r\n// ============================================================================\r\n\r\n/**\r\n * WorkflowEdge uses React Flow's standard edge format directly.\r\n * This eliminates conversion overhead and makes debugging easier.\r\n */\r\nexport interface WorkflowEdge {\r\n id: string\r\n source: string // Source node ID\r\n target: string // Target node ID\r\n sourceHandle?: string // 'output' or condition ID (optional, defaults to 'output')\r\n targetHandle?: string // 'input' (optional, defaults to 'input')\r\n animated?: boolean // For visual feedback\r\n label?: string // Edge label (e.g., condition name)\r\n}\r\n\r\n// ============================================================================\r\n// Configuration\r\n// ============================================================================\r\n\r\nexport interface ErrorHandlingConfig {\r\n onError: 'continue' | 'stop' | 'retry'\r\n retryPolicy?: RetryPolicy\r\n fallbackNode?: string\r\n}\r\n\r\nexport interface RetryPolicy {\r\n enabled: boolean\r\n maxRetries: number\r\n backoffMs: number\r\n backoffMultiplier?: number\r\n}\r\n\r\nexport interface ExecutionConfig {\r\n timeout?: number // ms\r\n parallelism?: {\r\n enabled: boolean\r\n maxConcurrency: number\r\n }\r\n logging?: {\r\n level: 'debug' | 'info' | 'warn' | 'error'\r\n includeTimings?: boolean\r\n }\r\n caching?: {\r\n enabled: boolean\r\n ttlMs: number\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// JSON Schema (simplified)\r\n// ============================================================================\r\n\r\nexport interface JsonSchema {\r\n type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'integer'\r\n properties?: Record<string, JsonSchema>\r\n items?: JsonSchema\r\n required?: string[]\r\n minLength?: number\r\n maxLength?: number\r\n minimum?: number\r\n maximum?: number\r\n enum?: unknown[]\r\n}\r\n\r\n// ============================================================================\r\n// Validation Types\r\n// ============================================================================\r\n\r\nexport interface WorkflowValidationError {\r\n nodeId?: string\r\n connectionId?: string\r\n field?: string\r\n message: string\r\n code: string\r\n}\r\n\r\nexport interface WorkflowValidationWarning {\r\n nodeId?: string\r\n message: string\r\n code: string\r\n}\r\n\r\n// ============================================================================\r\n// Execution State Types\r\n// ============================================================================\r\n\r\nexport type WorkflowExecutionStatus = 'idle' | 'running' | 'paused' | 'completed' | 'failed'\r\nexport type NodeExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'skipped'\r\n\r\nexport interface WorkflowExecutionState {\r\n workflowId: string\r\n status: WorkflowExecutionStatus\r\n currentNodeId?: string\r\n nodeStates: Record<string, NodeExecutionState>\r\n nodeOutputs: Record<string, unknown>\r\n variables: Record<string, unknown>\r\n errors: WorkflowExecutionError[]\r\n startTime?: number\r\n endTime?: number\r\n /** Memory storage for MemoryNode operations */\r\n memory?: {\r\n /** Key-value store (by namespace or root) */\r\n kv: Record<string, unknown>\r\n /** Conversation histories (by conversation ID) */\r\n conversation: Record<string, unknown[]>\r\n /** Cache entries with TTL (by namespace or root) */\r\n cache: Record<string, unknown>\r\n }\r\n}\r\n\r\nexport interface NodeExecutionState {\r\n nodeId: string\r\n status: NodeExecutionStatus\r\n startTime?: number\r\n endTime?: number\r\n output?: unknown\r\n error?: string\r\n retryCount: number\r\n streamingContent?: string\r\n}\r\n\r\nexport interface WorkflowExecutionError {\r\n nodeId?: string\r\n message: string\r\n stack?: string\r\n timestamp: number\r\n}\r\n\r\nexport interface WorkflowResult {\r\n success: boolean\r\n output?: unknown\r\n nodeOutputs: Record<string, unknown>\r\n errors: WorkflowExecutionError[]\r\n metrics: {\r\n totalDuration: number\r\n nodeMetrics: Record<string, { duration: number; tokens?: number }>\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Connection Types (External Services)\r\n// ============================================================================\r\n\r\n/**\r\n * WorkflowConnectionType - Types of external connections managed in the Connections panel\r\n *\r\n * Connections are managed in a dedicated panel (not canvas nodes) to scale to\r\n * hundreds of connection types. Nodes reference connections by ID.\r\n */\r\nexport type WorkflowConnectionType =\r\n | 'ssh' // SSH to remote server\r\n | 'database' // PostgreSQL, MySQL, MongoDB, Redis, SQLite\r\n | 'http-api' // Generic REST API with auth\r\n | 'slack' // Slack workspace\r\n | 'github' // GitHub API\r\n | 'mcp-server' // External MCP server\r\n | 'websocket' // WebSocket connection\r\n | 'custom' // User-defined\r\n\r\nexport type WorkflowConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error'\r\n\r\n/**\r\n * WorkflowConnection - External service connection managed in the Connections panel\r\n *\r\n * Stored separately from workflow nodes - connections are workflow-scoped resources\r\n * that can be referenced by multiple nodes via connectionId.\r\n */\r\nexport interface WorkflowConnection {\r\n id: string\r\n name: string\r\n type: WorkflowConnectionType\r\n status: WorkflowConnectionStatus\r\n lastConnected?: number\r\n lastError?: string\r\n config: WorkflowConnectionConfig\r\n}\r\n\r\n/** Union type for all connection configs */\r\nexport type WorkflowConnectionConfig =\r\n | SSHConnectionConfig\r\n | DatabaseConnectionConfig\r\n | HttpApiConnectionConfig\r\n | SlackConnectionConfig\r\n | GitHubConnectionConfig\r\n | McpServerConnectionConfig\r\n | WebSocketConnectionConfig\r\n | CustomConnectionConfig\r\n\r\nexport interface SSHConnectionConfig {\r\n type: 'ssh'\r\n host: string\r\n port?: number\r\n username: string\r\n authMethod: 'key' | 'password' | 'agent'\r\n keyPath?: string\r\n // Password/passphrase stored encrypted, never in config\r\n}\r\n\r\nexport interface DatabaseConnectionConfig {\r\n type: 'database'\r\n dbType: 'postgresql' | 'mysql' | 'mongodb' | 'redis' | 'sqlite'\r\n host?: string\r\n port?: number\r\n database: string\r\n username?: string\r\n ssl?: boolean\r\n connectionString?: string\r\n}\r\n\r\nexport interface HttpApiConnectionConfig {\r\n type: 'http-api'\r\n baseUrl: string\r\n authType: 'none' | 'bearer' | 'api-key' | 'basic' | 'oauth2'\r\n headers?: Record<string, string>\r\n apiKeyHeader?: string // Header name for API key\r\n}\r\n\r\nexport interface SlackConnectionConfig {\r\n type: 'slack'\r\n workspace: string\r\n defaultChannel?: string\r\n}\r\n\r\nexport interface GitHubConnectionConfig {\r\n type: 'github'\r\n owner?: string\r\n repo?: string\r\n baseUrl?: string // For GitHub Enterprise\r\n}\r\n\r\nexport interface McpServerConnectionConfig {\r\n type: 'mcp-server'\r\n serverUrl: string\r\n serverName: string\r\n transport: 'stdio' | 'http' | 'websocket'\r\n}\r\n\r\nexport interface WebSocketConnectionConfig {\r\n type: 'websocket'\r\n url: string\r\n protocols?: string[]\r\n headers?: Record<string, string>\r\n}\r\n\r\nexport interface CustomConnectionConfig {\r\n type: 'custom'\r\n [key: string]: unknown\r\n}\r\n","/**\n * Centralized Workflow Validation System\n *\n * Validates workflow structure, edges, and node configurations.\n * Returns errors (blocking issues) and warnings (non-blocking suggestions).\n */\n\nimport type {\n WorkflowFile,\n WorkflowNode,\n WorkflowValidationError,\n WorkflowValidationWarning,\n WorkflowNodeType,\n TriggerNodeData,\n PromptNodeData,\n ConditionNodeData,\n LoopNodeData,\n AgentNodeData,\n BaseNodeData,\n} from './workflowTypes'\n\nexport interface ValidationResult {\n errors: WorkflowValidationError[]\n warnings: WorkflowValidationWarning[]\n isValid: boolean\n}\n\n/**\n * Validates an entire workflow\n */\nexport function validateWorkflow(workflow: WorkflowFile): ValidationResult {\n const errors: WorkflowValidationError[] = []\n const warnings: WorkflowValidationWarning[] = []\n\n // Validate workflow structure\n if (!workflow.nodes || workflow.nodes.length === 0) {\n errors.push({\n message: 'Workflow is empty. Drag a node from the Node Palette on the left to get started.',\n code: 'EMPTY_WORKFLOW',\n })\n return { errors, warnings, isValid: false }\n }\n\n // Validate each node\n for (const node of workflow.nodes) {\n const nodeErrors = validateNode(node, workflow)\n errors.push(...nodeErrors)\n }\n\n // Validate edges\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n const connectionErrors = validateConnection(connection, workflow)\n errors.push(...connectionErrors)\n }\n }\n\n // Check for disconnected nodes (warnings)\n const disconnectedNodes = findDisconnectedNodes(workflow)\n for (const nodeId of disconnectedNodes) {\n const node = workflow.nodes.find(n => n.id === nodeId)\n const nodeLabel = node?.data?.label || nodeId\n warnings.push({\n nodeId,\n message: `Node '${nodeLabel}' is not connected. Connect it to other nodes to include it in the workflow.`,\n code: 'DISCONNECTED_NODE',\n })\n }\n\n // Check for circular dependencies\n const cycles = detectCircularDependencies(workflow)\n for (const cycle of cycles) {\n errors.push({\n message: `Circular dependency detected: ${cycle.join(' → ')}`,\n code: 'CIRCULAR_DEPENDENCY',\n })\n }\n\n // Check for missing trigger nodes\n const triggerCount = workflow.nodes.filter(n => n.type === 'trigger').length\n if (triggerCount === 0) {\n warnings.push({\n message: 'Workflow has no trigger node. Add a trigger to define when the workflow should run.',\n code: 'NO_TRIGGER',\n })\n }\n\n // Check for missing output nodes\n const outputCount = workflow.nodes.filter(n => n.type === 'output').length\n if (outputCount === 0) {\n warnings.push({\n message: 'Workflow has no output node. Add an output node to capture workflow results.',\n code: 'NO_OUTPUT',\n })\n }\n\n return {\n errors,\n warnings,\n isValid: errors.length === 0,\n }\n}\n\n/**\n * Validates a single node\n */\nfunction validateNode(node: WorkflowNode, workflow: WorkflowFile): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n\n // Validate node has required fields\n if (!node.id) {\n errors.push({\n nodeId: node.id,\n message: 'Node is missing required field: id',\n code: 'MISSING_NODE_ID',\n })\n }\n\n if (!node.type) {\n errors.push({\n nodeId: node.id,\n message: 'Node is missing required field: type',\n code: 'MISSING_NODE_TYPE',\n })\n }\n\n // Validate node-specific requirements\n switch (node.type) {\n case 'trigger':\n errors.push(...validateTriggerNode(node))\n break\n case 'prompt':\n errors.push(...validatePromptNode(node))\n break\n case 'condition':\n errors.push(...validateConditionNode(node))\n break\n case 'loop':\n errors.push(...validateLoopNode(node))\n break\n case 'agent':\n errors.push(...validateAgentNode(node))\n break\n // Add more node type validations as needed\n }\n\n // Validate container nodes have proper children\n if (['loop', 'parallel', 'tool-call-router', 'chat-agent'].includes(node.type)) {\n const children = workflow.nodes.filter(n => n.parentId === node.id)\n if (children.length === 0 && node.type !== 'chat-agent') {\n const containerTypeHelp: Record<string, string> = {\n 'loop': 'Drag nodes inside this loop container to define the loop body.',\n 'parallel': 'Drag nodes inside this parallel container to run them concurrently.',\n 'tool-call-router': 'Drag tool nodes inside this router to handle different tool calls.',\n }\n\n errors.push({\n nodeId: node.id,\n message: `Container '${node.type}' (${node.data?.label || node.id}) is empty. ${containerTypeHelp[node.type] || 'Drag nodes inside this container.'}`,\n code: 'EMPTY_CONTAINER',\n })\n }\n }\n\n return errors\n}\n\n/**\n * Validate trigger node\n */\nfunction validateTriggerNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as TriggerNodeData\n\n if (!data.triggerType) {\n errors.push({\n nodeId: node.id,\n field: 'triggerType',\n message: `Trigger '${data.label || node.id}' is missing a trigger type. Select Manual, Schedule, Webhook, or Event in the properties panel.`,\n code: 'MISSING_TRIGGER_TYPE',\n })\n }\n\n // Validate schedule trigger - check BOTH fields\n if (data.triggerType === 'schedule' && !data.schedule && !data.scheduleCron) {\n errors.push({\n nodeId: node.id,\n field: 'schedule',\n message: `Schedule trigger '${data.label || node.id}' needs a schedule. Enter a cron expression in the properties panel.`,\n code: 'MISSING_SCHEDULE',\n })\n }\n\n // Validate webhook trigger\n if (data.triggerType === 'webhook' && !data.webhookPath) {\n errors.push({\n nodeId: node.id,\n field: 'webhookPath',\n message: `Webhook trigger '${data.label || node.id}' needs a webhook path. Enter a URL path (e.g., /api/trigger) in the properties panel.`,\n code: 'MISSING_WEBHOOK_PATH',\n })\n }\n\n return errors\n}\n\n/**\n * Validate prompt node\n */\nfunction validatePromptNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as PromptNodeData\n\n // Check if prompt has content from ANY source\n if (!data.source && !data.content && !data.rawPrompt) {\n errors.push({\n nodeId: node.id,\n message: `Prompt '${data.label || node.id}' has no content. Either select a .prmd file or enter prompt text in the properties panel.`,\n code: 'MISSING_PROMPT_CONTENT',\n })\n }\n\n return errors\n}\n\n/**\n * Validate condition node\n */\nfunction validateConditionNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as ConditionNodeData\n\n if (!data.conditions || data.conditions.length === 0) {\n errors.push({\n nodeId: node.id,\n field: 'conditions',\n message: `Condition '${data.label || node.id}' has no conditions. Add at least one condition in the properties panel.`,\n code: 'MISSING_CONDITIONS',\n })\n }\n\n return errors\n}\n\n/**\n * Validate loop node\n */\nfunction validateLoopNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as LoopNodeData\n\n if (!data.loopType) {\n errors.push({\n nodeId: node.id,\n field: 'loopType',\n message: `Loop '${data.label || node.id}' is missing a loop type. Select While, For-Each, or Count in the properties panel.`,\n code: 'MISSING_LOOP_TYPE',\n })\n }\n\n if (data.loopType === 'while' && !data.condition) {\n errors.push({\n nodeId: node.id,\n field: 'condition',\n message: `While loop '${data.label || node.id}' needs a condition. Enter a condition expression in the properties panel.`,\n code: 'MISSING_LOOP_CONDITION',\n })\n }\n\n if (data.loopType === 'for-each' && !data.arraySource) {\n errors.push({\n nodeId: node.id,\n field: 'arraySource',\n message: `For-Each loop '${data.label || node.id}' needs an array source. Specify the array variable in the properties panel.`,\n code: 'MISSING_ARRAY_SOURCE',\n })\n }\n\n if (data.loopType === 'count' && !data.count) {\n errors.push({\n nodeId: node.id,\n field: 'count',\n message: `Count loop '${data.label || node.id}' needs a count value. Enter the number of iterations in the properties panel.`,\n code: 'MISSING_COUNT',\n })\n }\n\n return errors\n}\n\n/**\n * Validate agent node\n */\nfunction validateAgentNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as AgentNodeData\n\n // Check if agent has EITHER inline model config OR provider node reference\n if (!data.model && !data.provider && !data.providerNodeId) {\n errors.push({\n nodeId: node.id,\n message: `Agent '${data.label || node.id}' has no model configured. Select an LLM provider and model in the properties panel, or connect to a Provider node.`,\n code: 'MISSING_AGENT_MODEL',\n })\n }\n\n return errors\n}\n\n/**\n * Validate a connection\n */\nfunction validateConnection(\n connection: { source: string; target: string; sourceHandle?: string; targetHandle?: string },\n workflow: WorkflowFile\n): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n\n // Check source node exists\n const sourceNode = workflow.nodes.find(n => n.id === connection.source)\n if (!sourceNode) {\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Invalid connection: source node '${connection.source}' no longer exists. Delete this connection.`,\n code: 'INVALID_SOURCE_NODE',\n })\n }\n\n // Check target node exists\n const targetNode = workflow.nodes.find(n => n.id === connection.target)\n if (!targetNode) {\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Invalid connection: target node '${connection.target}' no longer exists. Delete this connection.`,\n code: 'INVALID_TARGET_NODE',\n })\n }\n\n // Check for self-edges\n if (connection.source === connection.target) {\n const selfNode = workflow.nodes.find(n => n.id === connection.source)\n const nodeLabel = selfNode?.data?.label || connection.source\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Node '${nodeLabel}' cannot connect to itself. Remove this connection.`,\n code: 'SELF_CONNECTION',\n })\n }\n\n return errors\n}\n\n/**\n * Find nodes that have no incoming or outgoing edges\n */\nfunction findDisconnectedNodes(workflow: WorkflowFile): string[] {\n const connectedNodes = new Set<string>()\n\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n connectedNodes.add(connection.source)\n connectedNodes.add(connection.target)\n }\n }\n\n return workflow.nodes\n .filter(node => {\n // Trigger and output nodes can be disconnected\n if (node.type === 'trigger' || node.type === 'output') {\n return false\n }\n return !connectedNodes.has(node.id)\n })\n .map(node => node.id)\n}\n\n/**\n * Detect circular dependencies in the workflow\n */\nfunction detectCircularDependencies(workflow: WorkflowFile): string[][] {\n const cycles: string[][] = []\n const visited = new Set<string>()\n const recursionStack = new Set<string>()\n\n // Build adjacency list, excluding special edge types\n const graph = new Map<string, string[]>()\n for (const node of workflow.nodes) {\n graph.set(node.id, [])\n }\n\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n // Exclude docked edges (agent <-> tool-router feedback loops)\n const isDocked = connection.id?.startsWith('docked-') ||\n connection.sourceHandle === 'ai-output' ||\n connection.targetHandle === 'ai-input' ||\n connection.targetHandle === 'toolResult'\n\n // Exclude loop container edges (loop-start, loop-end are valid cycles)\n const sourceNode = workflow.nodes.find(n => n.id === connection.source)\n const isLoopEdge = sourceNode?.type === 'loop' && (\n connection.sourceHandle === 'loop-start' ||\n connection.sourceHandle === 'loop-end'\n )\n\n // Skip these edge types in cycle detection\n if (isDocked || isLoopEdge) {\n continue\n }\n\n const targets = graph.get(connection.source) || []\n targets.push(connection.target)\n graph.set(connection.source, targets)\n }\n }\n\n // DFS to detect cycles\n function dfs(nodeId: string, path: string[]): void {\n visited.add(nodeId)\n recursionStack.add(nodeId)\n path.push(nodeId)\n\n const neighbors = graph.get(nodeId) || []\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n dfs(neighbor, [...path])\n } else if (recursionStack.has(neighbor)) {\n // Found a cycle\n const cycleStart = path.indexOf(neighbor)\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), neighbor])\n }\n }\n }\n\n recursionStack.delete(nodeId)\n }\n\n for (const node of workflow.nodes) {\n if (!visited.has(node.id)) {\n dfs(node.id, [])\n }\n }\n\n return cycles\n}\n\n/**\n * Quick validation for real-time feedback (lighter weight)\n */\nexport function validateWorkflowQuick(workflow: WorkflowFile): Pick<ValidationResult, 'isValid'> {\n // Quick checks only\n if (!workflow.nodes || workflow.nodes.length === 0) {\n return { isValid: false }\n }\n\n // Check for obvious issues\n for (const node of workflow.nodes) {\n if (!node.id || !node.type) {\n return { isValid: false }\n }\n }\n\n return { isValid: true }\n}\n","/**\n * Workflow Parser - Parse and validate .pdflow JSON files\n * Converts between .pdflow format and React Flow format\n */\n\nimport type {\n WorkflowFile,\n WorkflowNode,\n WorkflowEdge,\n WorkflowValidationError,\n WorkflowValidationWarning,\n WorkflowNodeType,\n BaseNodeData,\n} from './workflowTypes'\nimport { validateWorkflow } from './workflowValidator'\n\n// Simple types for canvas representation (compatible with XYFlow but no dependency)\ninterface WorkflowCanvasNode {\n id: string\n type: string\n position: { x: number; y: number }\n data: BaseNodeData\n parentId?: string\n extent?: 'parent'\n width?: number\n height?: number\n selected?: boolean\n dragging?: boolean\n [key: string]: unknown\n}\n\ninterface WorkflowCanvasEdge {\n id: string\n source: string\n target: string\n sourceHandle?: string | null\n targetHandle?: string | null\n animated?: boolean\n label?: string\n selected?: boolean\n [key: string]: unknown\n}\n\nexport interface ParsedWorkflow {\n file: WorkflowFile\n nodes: WorkflowCanvasNode[]\n edges: WorkflowCanvasEdge[]\n errors: WorkflowValidationError[]\n warnings: WorkflowValidationWarning[]\n}\n\n// Valid node types\nconst VALID_NODE_TYPES: WorkflowNodeType[] = [\n 'trigger',\n 'prompt',\n 'provider',\n 'condition',\n 'loop',\n 'parallel',\n 'merge',\n 'transformer',\n 'api',\n 'tool',\n 'tool-call-parser',\n 'tool-call-router',\n 'agent',\n 'chat-agent', // Composite chat agent with guardrail\n 'guardrail', // Input validation node\n 'callback',\n 'checkpoint', // Alias for callback\n 'user-input',\n 'error-handler',\n 'command', // Phase E: Shell command execution\n 'code', // Phase E: Custom code execution\n 'claude-code', // Phase E: Claude Code agent with SSH\n 'workflow', // Phase E: Sub-workflow invocation\n 'mcp-tool', // Phase E: External MCP tool execution\n 'memory', // Memory/storage operations\n 'output',\n]\n\n// Internal handles that indicate container-internal edges\nconst INTERNAL_HANDLES = ['loop-start', 'loop-end', 'parallel-start', 'parallel-end']\n\n/**\n * Determine if an edge should be animated based on its source handle\n * Animated edges: internal container edges and condition branch edges\n * Static edges: regular output → input edges between nodes\n */\nfunction shouldEdgeBeAnimated(sourceHandle: string | null | undefined): boolean {\n if (!sourceHandle) return false\n // Internal container edges\n if (INTERNAL_HANDLES.includes(sourceHandle)) return true\n // Condition branch edges (condition-* or default)\n if (sourceHandle.startsWith('condition-') || sourceHandle === 'default') return true\n // Regular output edges are not animated\n return false\n}\n\n/**\n * Parse a .pdflow JSON string into a ParsedWorkflow\n */\nexport function parseWorkflow(json: string): ParsedWorkflow {\n const errors: WorkflowValidationError[] = []\n const warnings: WorkflowValidationWarning[] = []\n\n let file: WorkflowFile\n\n // Parse JSON\n try {\n file = JSON.parse(json)\n } catch (e) {\n return {\n file: createEmptyWorkflow(),\n nodes: [],\n edges: [],\n errors: [{\n message: `Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`,\n code: 'INVALID_JSON',\n }],\n warnings: [],\n }\n }\n\n // Validate structure\n validateWorkflowStructure(file, errors, warnings)\n\n // Convert nodes to React Flow format (edges are already in standard format)\n const nodes = convertNodesToReactFlow(file.nodes || [], errors)\n const edges = normalizeEdges(file.edges || [], errors)\n\n // Validate data flow\n validateDataFlow(file, errors, warnings)\n\n // Run comprehensive validation (includes node-specific checks like empty containers)\n const validationResult = validateWorkflow(file)\n errors.push(...validationResult.errors)\n warnings.push(...validationResult.warnings)\n\n return {\n file,\n nodes,\n edges,\n errors,\n warnings,\n }\n}\n\n/**\n * Serialize a workflow back to JSON string\n */\nexport function serializeWorkflow(\n file: WorkflowFile,\n nodes: WorkflowCanvasNode[],\n edges: WorkflowCanvasEdge[]\n): string {\n // Update node positions, data, and container properties from React Flow\n const updatedNodes: WorkflowNode[] = file.nodes.map(node => {\n const rfNode = nodes.find(n => n.id === node.id)\n if (rfNode) {\n const nodeData = rfNode.data as BaseNodeData\n\n // For docked nodes, use the saved pre-dock position instead of the off-canvas position\n let position = rfNode.position\n if (nodeData.dockedTo && nodeData._preDockPosition) {\n position = nodeData._preDockPosition\n }\n\n const updated: WorkflowNode = {\n ...node,\n position,\n // Sync node data from React Flow (includes _savedWidth, _savedHeight, collapsed, etc.)\n data: nodeData as WorkflowNode['data'],\n }\n\n // Sync container relationship properties\n if (rfNode.parentId) {\n updated.parentId = rfNode.parentId\n updated.extent = (rfNode.extent as 'parent' | undefined) || 'parent'\n } else {\n // Remove parentId if node was removed from container\n delete updated.parentId\n delete updated.extent\n }\n\n // Sync container dimensions - skip for docked nodes (they have 0 dimensions)\n if (rfNode.width && !nodeData.dockedTo) {\n updated.width = rfNode.width\n } else if (nodeData.dockedTo && nodeData._preDockWidth) {\n // For docked nodes, restore saved dimensions\n updated.width = nodeData._preDockWidth\n }\n if (rfNode.height && !nodeData.dockedTo) {\n updated.height = rfNode.height\n } else if (nodeData.dockedTo && nodeData._preDockHeight) {\n // For docked nodes, restore saved dimensions\n updated.height = nodeData._preDockHeight\n }\n\n return updated\n }\n return node\n })\n\n // Edges are already in React Flow standard format - just map directly\n const workflowEdges: WorkflowEdge[] = edges.map(edge => ({\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle: edge.sourceHandle ?? undefined,\n targetHandle: edge.targetHandle ?? undefined,\n animated: edge.animated,\n label: typeof edge.label === 'string' ? edge.label : undefined,\n }))\n\n const updatedFile: WorkflowFile = {\n ...file,\n nodes: updatedNodes,\n edges: workflowEdges,\n }\n\n return JSON.stringify(updatedFile, null, 2)\n}\n\n/**\n * Create an empty workflow file\n */\nexport function createEmptyWorkflow(): WorkflowFile {\n return {\n version: '1.0',\n metadata: {\n id: `workflow-${Date.now()}`,\n name: 'New Workflow',\n description: '',\n },\n parameters: [],\n nodes: [],\n edges: [],\n }\n}\n\n/**\n * Create a new workflow node\n *\n * IMPORTANT: When adding a new node type, you MUST update THREE places:\n * 1. This switch statement (createWorkflowNode) - add a case with default data\n * 2. getDefaultLabel() below - add the default label for the node type\n * 3. nodes/index.ts - add the component to nodeTypes registry\n *\n * If you only add to nodes/index.ts without adding a case here, the node\n * will render as \"UNKNOWN: <type>\" because createWorkflowNode falls back\n * to a generic tool node for unhandled types.\n */\nexport function createWorkflowNode(\n type: WorkflowNodeType,\n position: { x: number; y: number },\n id?: string\n): WorkflowNode {\n const nodeId = id || `${type}-${Date.now()}`\n\n const baseData = {\n label: getDefaultLabel(type),\n }\n\n switch (type) {\n case 'trigger':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n triggerType: 'manual',\n },\n }\n case 'prompt':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n source: '',\n provider: 'openai',\n model: 'gpt-4o',\n parameters: {},\n },\n }\n case 'provider':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n providerId: 'openai',\n model: 'gpt-4o',\n },\n }\n case 'condition':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n conditions: [],\n default: undefined,\n },\n }\n case 'loop':\n return {\n id: nodeId,\n type,\n position,\n width: 300,\n height: 200,\n data: {\n ...baseData,\n loopType: 'while',\n condition: '',\n maxIterations: 10,\n body: [],\n },\n }\n case 'parallel':\n return {\n id: nodeId,\n type,\n position,\n width: 350,\n height: 200,\n data: {\n ...baseData,\n mode: 'broadcast',\n forkCount: 2,\n branches: [],\n waitFor: 'all',\n mergeStrategy: 'object',\n },\n }\n case 'merge':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n inputs: [],\n mergeAs: 'object',\n },\n }\n case 'api':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n method: 'GET',\n url: '',\n },\n }\n case 'callback':\n case 'checkpoint':\n return {\n id: nodeId,\n type: 'callback',\n position,\n data: {\n ...baseData,\n mode: 'report',\n checkpointName: '',\n includePreviousOutput: true,\n includeNextNodeInfo: true,\n waitForAck: false,\n },\n }\n case 'user-input':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n prompt: 'Enter your input:',\n inputType: 'text',\n required: true,\n showContext: true,\n },\n }\n case 'tool':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n toolType: 'function',\n toolName: '',\n parameters: {},\n },\n }\n case 'tool-call-parser':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n format: 'auto',\n noToolCallBehavior: 'passthrough',\n allowedTools: [],\n },\n }\n case 'agent':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n systemPrompt: 'You are a helpful AI assistant with access to tools. Use the available tools to complete the user\\'s request.',\n userPrompt: '{{ input }}',\n tools: [],\n maxIterations: 10,\n toolCallFormat: 'auto',\n outputMode: 'final-response',\n includeHistory: true,\n },\n }\n case 'chat-agent':\n return {\n id: nodeId,\n type,\n position,\n width: 400,\n height: 320,\n data: {\n ...baseData,\n // Agent configuration\n agentSystemPrompt: 'You are a helpful AI assistant.',\n agentUserPrompt: '{{ input }}',\n maxIterations: 10,\n toolCallFormat: 'auto',\n outputMode: 'final-response',\n // Guardrail configuration (disabled by default)\n guardrailEnabled: false,\n // User input configuration (enabled by default)\n userInputEnabled: true,\n userInputPrompt: 'Enter your message:',\n userInputType: 'textarea',\n // Container state\n collapsed: true,\n // Saved dimensions for when expanded\n _savedWidth: 400,\n _savedHeight: 320,\n tools: [],\n },\n }\n case 'guardrail':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n systemPrompt: 'Validate the input. Respond with \"PASS\" if the input is appropriate and safe, or \"REJECT\" with a reason if it violates guidelines.',\n scoreThreshold: 0.5,\n },\n }\n case 'tool-call-router':\n return {\n id: nodeId,\n type,\n position,\n width: 320,\n height: 180,\n data: {\n ...baseData,\n routingMode: 'name-match',\n onNoMatch: 'error',\n collapsed: false,\n },\n }\n case 'error-handler':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n strategy: 'retry',\n retry: {\n maxAttempts: 3,\n backoffMs: 1000,\n backoffMultiplier: 2,\n },\n },\n }\n case 'output':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n },\n }\n case 'command':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n command: '',\n args: [],\n cwd: '',\n env: {},\n timeoutMs: 30000,\n outputFormat: 'text',\n requiresApproval: true,\n },\n }\n case 'claude-code':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n connection: {\n type: 'local',\n },\n task: {\n prompt: '',\n workingDirectory: '',\n },\n constraints: {\n maxTurns: 50,\n allowedTools: ['read', 'write', 'execute', 'web'],\n requireApprovalForWrites: false,\n },\n output: {\n format: 'final-response',\n includeMetadata: false,\n },\n },\n }\n case 'workflow':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n source: '',\n parameters: {},\n outputMapping: {},\n inheritVariables: false,\n },\n }\n case 'mcp-tool':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n toolName: '',\n parameters: {},\n timeoutMs: 30000,\n includeInContext: false,\n },\n }\n case 'code':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n language: 'typescript',\n code: '',\n inputVariable: 'input',\n executionContext: 'isolated',\n },\n }\n case 'transformer':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n mode: 'template',\n template: '',\n inputVariable: 'input',\n passthroughOnError: false,\n },\n }\n case 'memory':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n mode: 'kv',\n operations: ['get'], // Multi-action array (replaces single 'operation')\n scope: 'execution',\n },\n }\n default:\n // IMPORTANT: If you see this error, add a new case to createWorkflowNode() in workflowParser.ts\n // This fallback should NEVER be hit in production - all node types must have explicit cases\n console.error(\n `[createWorkflowNode] MISSING CASE for node type: \"${type}\". ` +\n `Add a case for '${type}' in workflowParser.ts createWorkflowNode() switch statement!`\n )\n // Return a generic tool node as fallback (more visible than callback)\n return {\n id: nodeId,\n type: 'tool' as const,\n position,\n data: {\n ...baseData,\n label: `UNKNOWN: ${type}`, // Make it obvious this is a fallback\n toolType: 'function',\n toolName: '',\n parameters: {},\n },\n }\n }\n}\n\n/**\n * Get default label for a node type\n */\nfunction getDefaultLabel(type: WorkflowNodeType): string {\n const labels: Record<WorkflowNodeType, string> = {\n trigger: 'Start',\n prompt: 'Prompt',\n provider: 'Provider',\n condition: 'Condition',\n loop: 'Loop',\n parallel: 'Parallel',\n merge: 'Merge',\n transformer: 'Transform',\n api: 'API Call',\n tool: 'Tool',\n 'tool-call-parser': 'Tool Parser',\n 'tool-call-router': 'Tool Router',\n agent: 'AI Agent',\n 'chat-agent': 'Chat Agent',\n guardrail: 'Guardrail',\n callback: 'Checkpoint',\n checkpoint: 'Checkpoint', // Alias for callback\n 'user-input': 'User Input',\n 'error-handler': 'Error Handler',\n command: 'Command',\n code: 'Code',\n 'claude-code': 'Claude Code',\n workflow: 'Sub-Workflow',\n 'mcp-tool': 'MCP Tool',\n memory: 'Memory',\n output: 'Output',\n 'web-search': 'Web Search',\n 'database-query': 'DB Query',\n // --- Add new node type labels here ---\n }\n return labels[type] || 'Node'\n}\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\nfunction validateWorkflowStructure(\n file: WorkflowFile,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n // Version check\n if (!file.version) {\n warnings.push({\n message: 'Missing version field, defaulting to 1.0',\n code: 'MISSING_VERSION',\n })\n }\n\n // Metadata check\n if (!file.metadata) {\n errors.push({\n message: 'Missing metadata section',\n code: 'MISSING_METADATA',\n })\n } else {\n if (!file.metadata.id) {\n errors.push({\n field: 'metadata.id',\n message: 'Missing workflow ID',\n code: 'MISSING_ID',\n })\n }\n if (!file.metadata.name) {\n warnings.push({\n message: 'Missing workflow name',\n code: 'MISSING_NAME',\n })\n }\n }\n\n // Nodes check\n if (!file.nodes || !Array.isArray(file.nodes)) {\n errors.push({\n message: 'Missing or invalid nodes array',\n code: 'INVALID_NODES',\n })\n } else {\n // Check for duplicate IDs\n const nodeIds = new Set<string>()\n for (const node of file.nodes) {\n if (nodeIds.has(node.id)) {\n errors.push({\n nodeId: node.id,\n message: `Duplicate node ID: ${node.id}`,\n code: 'DUPLICATE_NODE_ID',\n })\n }\n nodeIds.add(node.id)\n\n // Validate node type\n if (!VALID_NODE_TYPES.includes(node.type)) {\n errors.push({\n nodeId: node.id,\n message: `Invalid node type: ${node.type}`,\n code: 'INVALID_NODE_TYPE',\n })\n }\n\n // Validate position\n if (!node.position || typeof node.position.x !== 'number' || typeof node.position.y !== 'number') {\n errors.push({\n nodeId: node.id,\n message: 'Invalid or missing position',\n code: 'INVALID_POSITION',\n })\n }\n\n // Validate node-specific data\n validateNodeData(node, errors, warnings)\n }\n }\n\n // Edges check\n if (file.edges && !Array.isArray(file.edges)) {\n errors.push({\n message: 'Invalid edges array',\n code: 'INVALID_EDGES',\n })\n }\n}\n\nfunction validateNodeData(\n node: WorkflowNode,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n if (!node.data) {\n errors.push({\n nodeId: node.id,\n message: 'Missing node data',\n code: 'MISSING_NODE_DATA',\n })\n return\n }\n\n switch (node.type) {\n case 'prompt':\n if (!('source' in node.data)) {\n errors.push({\n nodeId: node.id,\n field: 'source',\n message: 'Prompt node missing source',\n code: 'MISSING_PROMPT_SOURCE',\n })\n }\n break\n\n case 'condition':\n if (!('conditions' in node.data) || !Array.isArray(node.data.conditions)) {\n errors.push({\n nodeId: node.id,\n field: 'conditions',\n message: 'Condition node missing conditions array',\n code: 'MISSING_CONDITIONS',\n })\n }\n break\n\n case 'loop':\n if (!('loopType' in node.data)) {\n errors.push({\n nodeId: node.id,\n field: 'loopType',\n message: 'Loop node missing loopType',\n code: 'MISSING_LOOP_TYPE',\n })\n }\n if (!('maxIterations' in node.data) || typeof node.data.maxIterations !== 'number') {\n warnings.push({\n nodeId: node.id,\n message: 'Loop node missing maxIterations, defaulting to 10',\n code: 'MISSING_MAX_ITERATIONS',\n })\n }\n break\n\n case 'parallel':\n if (!('branches' in node.data) || !Array.isArray(node.data.branches)) {\n errors.push({\n nodeId: node.id,\n field: 'branches',\n message: 'Parallel node missing branches array',\n code: 'MISSING_BRANCHES',\n })\n }\n break\n\n case 'api':\n if (!('url' in node.data) || !node.data.url) {\n errors.push({\n nodeId: node.id,\n field: 'url',\n message: 'API node missing URL',\n code: 'MISSING_API_URL',\n })\n }\n if (!('method' in node.data)) {\n warnings.push({\n nodeId: node.id,\n message: 'API node missing method, defaulting to GET',\n code: 'MISSING_API_METHOD',\n })\n }\n break\n }\n}\n\nfunction validateDataFlow(\n file: WorkflowFile,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n if (!file.nodes || !file.edges) return\n\n const nodeIds = new Set(file.nodes.map(n => n.id))\n\n // Check edge references\n for (const edge of file.edges) {\n if (!nodeIds.has(edge.source)) {\n errors.push({\n connectionId: edge.id,\n message: `Edge references non-existent source node: ${edge.source}`,\n code: 'INVALID_SOURCE_NODE',\n })\n }\n if (!nodeIds.has(edge.target)) {\n errors.push({\n connectionId: edge.id,\n message: `Edge references non-existent target node: ${edge.target}`,\n code: 'INVALID_TARGET_NODE',\n })\n }\n }\n\n // Check for cycles (basic detection)\n const hasCycle = detectCycles(file.nodes, file.edges)\n if (hasCycle) {\n errors.push({\n message: 'Workflow contains cycles which may cause infinite loops',\n code: 'CYCLE_DETECTED',\n })\n }\n\n // Check for unreachable nodes\n const connectedNodes = new Set<string>()\n for (const edge of file.edges) {\n connectedNodes.add(edge.source)\n connectedNodes.add(edge.target)\n }\n\n for (const node of file.nodes) {\n if (!connectedNodes.has(node.id) && file.nodes.length > 1) {\n warnings.push({\n nodeId: node.id,\n message: `Node \"${node.data.label || node.id}\" is not connected to any other nodes`,\n code: 'UNREACHABLE_NODE',\n })\n }\n }\n}\n\n/**\n * Check if an edge is an internal container edge (loop or parallel internal wiring)\n * or a feedback edge (tool results back to agent)\n * These edges are intentional and should not be considered for cycle detection\n */\nfunction isInternalContainerEdge(edge: WorkflowEdge): boolean {\n const internalHandles = [\n 'loop-start',\n 'loop-end',\n 'parallel-start',\n 'parallel-end',\n ]\n\n // Check for internal loop/parallel handles\n if (edge.sourceHandle && internalHandles.includes(edge.sourceHandle)) {\n return true\n }\n if (edge.targetHandle && internalHandles.includes(edge.targetHandle)) {\n return true\n }\n\n // Check for fork handles (fork-0, fork-1, etc.)\n if (edge.sourceHandle && edge.sourceHandle.startsWith('fork-')) {\n return true\n }\n if (edge.targetHandle && edge.targetHandle.startsWith('fork-')) {\n return true\n }\n\n // Check for Agent <-> ToolCallRouter feedback edges\n // toolResult edges go from ToolCallRouter back to Agent - this is intentional feedback\n if (edge.sourceHandle === 'toolResult' && edge.targetHandle === 'toolResult') {\n return true\n }\n\n // onCheckpoint edges are event streams, not data flow cycles\n if (edge.sourceHandle === 'onCheckpoint') {\n return true\n }\n\n return false\n}\n\n/**\n * Simple cycle detection using DFS\n * Excludes internal container edges (loop/parallel internal wiring) from cycle detection\n */\nfunction detectCycles(nodes: WorkflowNode[], edges: WorkflowEdge[]): boolean {\n const adjacencyList = new Map<string, string[]>()\n\n // Build adjacency list, excluding internal container edges\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n }\n for (const edge of edges) {\n // Skip internal loop/parallel edges - these are intentional back-edges\n if (isInternalContainerEdge(edge)) {\n continue\n }\n\n const targets = adjacencyList.get(edge.source) || []\n targets.push(edge.target)\n adjacencyList.set(edge.source, targets)\n }\n\n const visited = new Set<string>()\n const recursionStack = new Set<string>()\n\n function dfs(nodeId: string): boolean {\n visited.add(nodeId)\n recursionStack.add(nodeId)\n\n const neighbors = adjacencyList.get(nodeId) || []\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true\n } else if (recursionStack.has(neighbor)) {\n return true // Cycle found\n }\n }\n\n recursionStack.delete(nodeId)\n return false\n }\n\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n if (dfs(node.id)) return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Conversion Functions\n// ============================================================================\n\nfunction convertNodesToReactFlow(\n nodes: WorkflowNode[],\n errors: WorkflowValidationError[]\n): WorkflowCanvasNode[] {\n // Convert nodes to React Flow format\n const rfNodes = nodes.map(node => {\n // Migration: Convert old MemoryNode 'operation' (single) to 'operations' (array)\n if (node.type === 'memory') {\n const memData = node.data as { operation?: string; operations?: string[] }\n if (memData.operation && !memData.operations) {\n memData.operations = [memData.operation]\n delete memData.operation\n }\n }\n\n const nodeData = node.data as BaseNodeData\n\n const rfNode: WorkflowCanvasNode = {\n id: node.id,\n type: node.type,\n position: node.position || { x: 0, y: 0 },\n data: nodeData,\n }\n\n // Handle docked nodes - restore hidden state and minimal dimensions\n if (nodeData.dockedTo) {\n rfNode.hidden = true\n rfNode.width = 0\n rfNode.height = 0\n rfNode.position = { x: -9999, y: -9999 }\n }\n\n // Preserve container relationship properties\n if (node.parentId) {\n rfNode.parentId = node.parentId\n // Only use 'parent' extent for child nodes (React Flow's CoordinateExtent has different format)\n rfNode.extent = 'parent'\n }\n\n // Preserve container dimensions (for loop/parallel nodes) - skip for docked nodes\n if (node.width && !nodeData.dockedTo) {\n rfNode.width = node.width\n }\n if (node.height && !nodeData.dockedTo) {\n rfNode.height = node.height\n }\n\n return rfNode\n })\n\n // CRITICAL: React Flow requires parent nodes to appear BEFORE their children in the array\n // Sort so that nodes without parentId come first, then children follow their parents\n return sortNodesForReactFlow(rfNodes)\n}\n\n/**\n * Sort nodes so parent nodes appear before their children.\n * React Flow requires this ordering for proper parent-child rendering.\n */\nfunction sortNodesForReactFlow(nodes: WorkflowCanvasNode[]): WorkflowCanvasNode[] {\n // Build a map of node ID to node for quick lookup\n const nodeMap = new Map<string, WorkflowCanvasNode>()\n for (const node of nodes) {\n nodeMap.set(node.id, node)\n }\n\n // Separate root nodes (no parent) from child nodes\n const rootNodes: WorkflowCanvasNode[] = []\n const childNodes: WorkflowCanvasNode[] = []\n\n for (const node of nodes) {\n if (node.parentId) {\n childNodes.push(node)\n } else {\n rootNodes.push(node)\n }\n }\n\n // Result array - start with root nodes\n const result: WorkflowCanvasNode[] = [...rootNodes]\n\n // Add child nodes after their parents\n // We need to handle nested containers, so we iterate until all children are placed\n const remaining = [...childNodes]\n const placedIds = new Set(rootNodes.map(n => n.id))\n\n // Safety limit to prevent infinite loops\n let iterations = 0\n const maxIterations = remaining.length * 2\n\n while (remaining.length > 0 && iterations < maxIterations) {\n iterations++\n for (let i = remaining.length - 1; i >= 0; i--) {\n const child = remaining[i]\n // If parent is already placed, we can place this child\n if (child.parentId && placedIds.has(child.parentId)) {\n result.push(child)\n placedIds.add(child.id)\n remaining.splice(i, 1)\n }\n }\n }\n\n // If any nodes couldn't be placed (orphaned children with missing parents), add them at the end\n if (remaining.length > 0) {\n console.warn('[workflowParser] Some nodes have missing parent references:', remaining.map(n => n.id))\n result.push(...remaining)\n }\n\n return result\n}\n\n/**\n * Normalize edges - already in React Flow format, just ensure defaults\n * Applies consistent animation rules: internal container edges and condition\n * branch edges are animated, regular output edges are not\n */\nfunction normalizeEdges(\n edges: WorkflowEdge[],\n errors: WorkflowValidationError[]\n): WorkflowCanvasEdge[] {\n return edges.map(edge => {\n const sourceHandle = edge.sourceHandle || 'output'\n const targetHandle = edge.targetHandle || 'input'\n // Use explicit animated value if provided, otherwise determine from handles\n const animated = edge.animated ?? (\n shouldEdgeBeAnimated(sourceHandle) || shouldEdgeBeAnimated(targetHandle)\n )\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle,\n targetHandle,\n animated,\n label: edge.label,\n }\n })\n}\n\n/**\n * Check if an edge is used for the main execution flow (should be included in topological sort)\n * Excludes internal container edges that would create back-edges (loop-end, parallel-end)\n * Excludes event-based edges that are triggered by events, not data flow (onError, onCheckpoint, onProgress)\n */\nfunction isExecutionFlowEdge(edge: { sourceHandle?: string; targetHandle?: string }): boolean {\n // Exclude back-edges that go TO container start handles (these create cycles)\n // loop-end -> container and parallel-end -> container edges should not count for topological ordering\n if (edge.sourceHandle === 'loop-end' || edge.sourceHandle === 'parallel-end') {\n return false\n }\n\n // Exclude edges targeting internal handles (fork handles for parallel nodes)\n if (edge.targetHandle && edge.targetHandle.startsWith('fork-')) {\n return false\n }\n\n // Exclude event-based edges - these are triggered by events, not main data flow\n // They should NOT be included in topological sort for execution order\n // - onError: triggered when an error occurs in a node using this error handler\n // - onCheckpoint: triggered when agent emits checkpoint events\n // - onProgress: triggered when a node emits progress events (e.g., ClaudeCode)\n // - toolResult: triggered when a tool returns a result to an agent\n const eventBasedHandles = ['onError', 'onCheckpoint', 'onProgress', 'toolResult']\n if (edge.sourceHandle && eventBasedHandles.includes(edge.sourceHandle)) {\n return false\n }\n\n // Include all other edges:\n // - Regular output -> input edges\n // - Condition branch edges (condition-* or default)\n // - Internal start edges (loop-start, parallel-start) - these are entry points, should flow to children\n return true\n}\n\n/**\n * Build execution order using topological sort\n *\n * Important: Child nodes (nodes with parentId) are EXCLUDED from the main execution order.\n * They are executed by their parent container node (loop, parallel), not by the main executor.\n *\n * Excludes:\n * - Internal back-edges that would create cycles (e.g., loop-end -> container)\n * - Child nodes that belong to container nodes (they have parentId set)\n */\nexport function getExecutionOrder(workflow: ParsedWorkflow): string[] {\n const { file } = workflow\n if (!file.nodes || !file.edges) return []\n\n // Identify child nodes (nodes that have a parentId - they belong to containers)\n const childNodeIds = new Set<string>()\n for (const node of file.nodes) {\n if (node.parentId) {\n childNodeIds.add(node.id)\n }\n }\n\n // Only include root-level nodes in the main execution order\n const rootNodes = file.nodes.filter(n => !n.parentId)\n\n // Build in-degree map and adjacency list for ROOT NODES ONLY\n const inDegree = new Map<string, number>()\n const adjacencyList = new Map<string, string[]>()\n\n // Initialize all root nodes with in-degree 0\n for (const node of rootNodes) {\n inDegree.set(node.id, 0)\n adjacencyList.set(node.id, [])\n }\n\n // Build graph from execution flow edges (only between root nodes)\n for (const edge of file.edges) {\n // Skip edges involving child nodes - they're handled by container execution\n if (childNodeIds.has(edge.source) || childNodeIds.has(edge.target)) {\n continue\n }\n\n // Skip internal back-edges that would create cycles\n if (!isExecutionFlowEdge(edge)) {\n continue\n }\n\n const targets = adjacencyList.get(edge.source) || []\n targets.push(edge.target)\n adjacencyList.set(edge.source, targets)\n\n inDegree.set(edge.target, (inDegree.get(edge.target) || 0) + 1)\n }\n\n // Kahn's algorithm for topological sort with specific node type handling\n //\n // Node categories:\n // 1. Global nodes (provider, error-handler, connection): Always run first, configure the workflow\n // 2. Trigger/Start nodes: Begin the actual execution flow\n // 3. Event-driven nodes (callback, checkpoint): NEVER auto-execute, only run when triggered by events\n // 4. Other nodes: Execute when reached via edges from trigger/start nodes\n //\n const globalNodeTypes = new Set(['provider', 'error-handler', 'connection'])\n const startNodeTypes = new Set(['trigger'])\n // Callback/Checkpoint nodes are event-driven - they ONLY execute when triggered by events\n // from Agent nodes (onCheckpoint), error handlers (onError), etc. They should NEVER auto-start.\n const eventDrivenNodeTypes = new Set(['callback', 'checkpoint'])\n\n const globalQueue: string[] = []\n const startQueue: string[] = []\n const otherQueue: string[] = []\n\n for (const [nodeId, degree] of inDegree) {\n if (degree === 0) {\n const node = rootNodes.find(n => n.id === nodeId)\n const nodeType = node?.type || ''\n\n // NEVER include event-driven nodes in the initial queue\n // They only execute when triggered by events, not as part of the main flow\n if (eventDrivenNodeTypes.has(nodeType)) {\n continue\n }\n\n if (globalNodeTypes.has(nodeType)) {\n globalQueue.push(nodeId)\n } else if (startNodeTypes.has(nodeType)) {\n startQueue.push(nodeId)\n } else {\n otherQueue.push(nodeId)\n }\n }\n }\n\n // Build initial queue: global nodes first, then triggers, then other start points\n // If no triggers exist, use other nodes with in-degree 0 as starting points\n // (this supports simple workflows without explicit trigger nodes)\n const queue: string[] = [...globalQueue, ...startQueue, ...otherQueue]\n const order: string[] = []\n\n while (queue.length > 0) {\n const current = queue.shift()!\n order.push(current)\n\n const neighbors = adjacencyList.get(current) || []\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) || 0) - 1\n inDegree.set(neighbor, newDegree)\n if (newDegree === 0) queue.push(neighbor)\n }\n }\n\n // Log disconnected nodes for debugging (but don't add them to execution order)\n const visitedSet = new Set(order)\n for (const node of rootNodes) {\n if (!visitedSet.has(node.id)) {\n // Don't warn for event-driven nodes - they're intentionally excluded\n if (!eventDrivenNodeTypes.has(node.type || '')) {\n console.log(`[getExecutionOrder] Node not in execution flow (disconnected or event-driven): ${node.id} (type: ${node.type})`)\n }\n }\n }\n\n return order\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/parser.ts","../src/types/index.ts","../src/lib/errors.ts","../src/lib/compiler/types.ts","../src/lib/compiler/package-ref.ts","../src/lib/compiler/path-utils.ts","../src/lib/compiler/pipeline.ts","../src/lib/compiler/stages/lexical.ts","../src/lib/compiler/stages/dependency.ts","../src/lib/compiler/date-utils.ts","../src/lib/compiler/stages/semantic.ts","../src/lib/compiler/section-override.ts","../src/lib/compiler/language-map.ts","../src/lib/compiler/prompd-loader.ts","../src/lib/compiler/stages/template.ts","../src/lib/compiler/formatters/markdown.ts","../src/lib/compiler/formatters/openai.ts","../src/lib/compiler/formatters/anthropic.ts","../src/lib/compiler/stages/codegen.ts","../src/lib/compiler/file-system.ts","../src/lib/compiler/install.ts","../src/lib/compiler/index.ts","../src/lib/workflowTypes.ts","../src/lib/workflowValidator.ts","../src/lib/workflowParser.ts"],"names":["yaml","CompilationStage","semver","match","nunjucks","nunjucks2","yaml2","JSZip","normalizePosix","joinPosix","dirnamePosix"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as yaml from 'yaml';\nimport { PrompdFile, PrompdMetadata, ValidationIssue } from '../types';\n\n/**\n * Environment-agnostic .prmd parser. Pure string -> structure; no file system.\n * The Node CLI subclasses this to add fs-backed parseFile()/validateFile().\n */\nexport class PrompdParser {\n parseContent(content: string, _filePath?: string): PrompdFile {\n // Remove BOM if present and normalize line endings (CRLF -> LF)\n const cleanContent = content\n .replace(/^\\ufeff/, '')\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n if (!cleanContent.startsWith('---\\n')) {\n throw new Error('File must start with YAML frontmatter (---)');\n }\n\n // Find the closing --- delimiter (must be on its own line)\n // We search after the opening --- to find the first \\n---\\n or \\n--- at end\n const afterOpening = cleanContent.slice(4); // Skip opening \"---\\n\"\n const closingIndex = afterOpening.indexOf('\\n---\\n');\n const closingAtEnd = afterOpening.indexOf('\\n---');\n\n // Determine the actual closing delimiter position\n let delimiterIndex = -1;\n if (closingIndex !== -1) {\n delimiterIndex = closingIndex;\n } else if (closingAtEnd !== -1 && afterOpening.substring(closingAtEnd) === '\\n---') {\n // Handle case where --- is at the very end with no trailing newline\n delimiterIndex = closingAtEnd;\n }\n\n if (delimiterIndex === -1) {\n throw new Error('Invalid frontmatter format');\n }\n\n const yamlContent = afterOpening.substring(0, delimiterIndex);\n // +4 to skip past \"\\n---\\n\" or +4 to skip past \"\\n---\" if at end\n const bodyStart = delimiterIndex + 4;\n const markdownContent = bodyStart < afterOpening.length ? afterOpening.substring(bodyStart) : '';\n\n let metadata: PrompdMetadata;\n try {\n metadata = yaml.parse(yamlContent) as PrompdMetadata;\n } catch (error) {\n throw new Error(`Failed to parse YAML frontmatter: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n \n // Validate required fields\n if (!metadata.id) {\n throw new Error('id field is required');\n }\n \n // Validate ID follows kebab-case\n const kebabCaseRegex = /^[a-z0-9-]+$/;\n if (!kebabCaseRegex.test(metadata.id)) {\n throw new Error(`id '${metadata.id}' must use kebab-case (lowercase letters, numbers, hyphens only)`);\n }\n\n // Extract sections from markdown content\n const sections: Record<string, string> = {};\n const sectionRegex = /^## (.+)$/gm;\n let match;\n while ((match = sectionRegex.exec(markdownContent)) !== null) {\n sections[match[1].toLowerCase()] = match[1];\n }\n\n return {\n metadata,\n content: markdownContent.trim(),\n sections\n };\n }\n\n /**\n * Parse + validate .prmd content. Pure (no file system) so it runs in the\n * browser. Returns parse errors as a single issue when content is malformed.\n */\n validateContent(content: string, _filePath?: string): ValidationIssue[] {\n let prompd: PrompdFile;\n try {\n prompd = this.parseContent(content, _filePath);\n } catch (error) {\n return [{\n level: 'error',\n message: error instanceof Error ? error.message : 'Unknown parsing error'\n }];\n }\n return this.validatePrompdFile(prompd);\n }\n\n protected validatePrompdFile(prompd: PrompdFile): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Validate required fields\n if (!prompd.metadata.name) {\n issues.push({\n level: 'error',\n message: 'name field is required'\n });\n }\n\n // Validate semantic version if present\n if (prompd.metadata.version && !this.isValidSemver(prompd.metadata.version)) {\n issues.push({\n level: 'error',\n message: `invalid semantic version: ${prompd.metadata.version}`\n });\n }\n\n // Validate parameter references\n const variables = new Set<string>();\n \n // Check both parameters and variables fields for backward compatibility\n const allParams = [\n ...(prompd.metadata.parameters || []),\n ...(prompd.metadata.variables || [])\n ];\n\n for (const param of allParams) {\n if (!param.name) {\n issues.push({\n level: 'error',\n message: 'parameter name cannot be empty'\n });\n continue;\n }\n variables.add(param.name);\n\n // Validate parameter type\n const validTypes = ['string', 'number', 'boolean', 'array', 'object'];\n if (!validTypes.includes(param.type)) {\n issues.push({\n level: 'error',\n message: `invalid parameter type: ${param.type}. Must be one of: ${validTypes.join(', ')}`\n });\n }\n\n // Validate pattern for string parameters\n if (param.pattern && param.type !== 'string') {\n issues.push({\n level: 'warning',\n message: `pattern validation only applies to string parameters: ${param.name}`\n });\n }\n\n // Validate minimum/maximum for number parameters\n if ((param.minimum !== undefined || param.maximum !== undefined) && param.type !== 'number') {\n issues.push({\n level: 'warning',\n message: `minimum/maximum validation only applies to number parameters: ${param.name}`\n });\n }\n }\n\n // Check for variable references in content\n const variableReferences = prompd.content.match(/\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g);\n if (variableReferences) {\n for (const ref of variableReferences) {\n const varName = ref.slice(1, -1); // Remove { and }\n if (!variables.has(varName) && varName !== 'inputs') {\n issues.push({\n level: 'error',\n message: `undefined variable referenced: ${varName}`\n });\n }\n }\n }\n\n return issues;\n }\n\n private isValidSemver(version: string): boolean {\n const semverRegex = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n return semverRegex.test(version);\n }\n}","/**\r\n * Code file extensions that need frontmatter protection for security.\r\n * These files will have prompd content frontmatter added to make them non-executable.\r\n * Used by: CLI packager, registry security validation, frontend file selection\r\n */\r\nexport const CODE_EXTENSIONS = [\r\n // JavaScript/TypeScript ecosystem\r\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\r\n // Python\r\n '.py', '.pyw', '.pyi',\r\n // Shell/Scripts\r\n '.sh', '.bash', '.zsh', '.fish', '.ps1', '.psm1', '.psd1', '.bat', '.cmd',\r\n // Ruby\r\n '.rb', '.rake', '.gemspec',\r\n // Go\r\n '.go',\r\n // Rust\r\n '.rs',\r\n // C/C++\r\n '.c', '.cpp', '.cc', '.cxx', '.h', '.hpp', '.hxx',\r\n // Java/JVM\r\n '.java', '.kt', '.kts', '.scala', '.groovy',\r\n // .NET\r\n '.cs', '.fs', '.vb',\r\n // PHP\r\n '.php', '.phtml',\r\n // Perl\r\n '.pl', '.pm',\r\n // Swift\r\n '.swift',\r\n // Lua\r\n '.lua',\r\n // R\r\n '.r', '.R',\r\n // Julia\r\n '.jl',\r\n // Elixir/Erlang\r\n '.ex', '.exs', '.erl',\r\n // Haskell\r\n '.hs', '.lhs',\r\n // Web frameworks\r\n '.vue', '.svelte',\r\n // SQL (can be dangerous with stored procedures)\r\n '.sql',\r\n] as const;\r\n\r\n/**\r\n * Map file extensions to content type names for frontmatter metadata.\r\n */\r\nexport const CONTENT_TYPES: Record<string, string> = {\r\n // JavaScript/TypeScript\r\n '.ts': 'typescript',\r\n '.tsx': 'typescript-react',\r\n '.js': 'javascript',\r\n '.jsx': 'javascript-react',\r\n '.mjs': 'javascript-module',\r\n '.cjs': 'javascript-commonjs',\r\n // Python\r\n '.py': 'python',\r\n '.pyw': 'python-windows',\r\n '.pyi': 'python-stub',\r\n // Shell\r\n '.sh': 'shell',\r\n '.bash': 'bash',\r\n '.zsh': 'zsh',\r\n '.fish': 'fish',\r\n '.ps1': 'powershell',\r\n '.psm1': 'powershell-module',\r\n '.psd1': 'powershell-data',\r\n '.bat': 'batch',\r\n '.cmd': 'batch',\r\n // Ruby\r\n '.rb': 'ruby',\r\n '.rake': 'ruby-rake',\r\n '.gemspec': 'ruby-gemspec',\r\n // Go\r\n '.go': 'go',\r\n // Rust\r\n '.rs': 'rust',\r\n // C/C++\r\n '.c': 'c',\r\n '.cpp': 'cpp',\r\n '.cc': 'cpp',\r\n '.cxx': 'cpp',\r\n '.h': 'c-header',\r\n '.hpp': 'cpp-header',\r\n '.hxx': 'cpp-header',\r\n // Java/JVM\r\n '.java': 'java',\r\n '.kt': 'kotlin',\r\n '.kts': 'kotlin-script',\r\n '.scala': 'scala',\r\n '.groovy': 'groovy',\r\n // .NET\r\n '.cs': 'csharp',\r\n '.fs': 'fsharp',\r\n '.vb': 'vb',\r\n // PHP\r\n '.php': 'php',\r\n '.phtml': 'php-html',\r\n // Perl\r\n '.pl': 'perl',\r\n '.pm': 'perl-module',\r\n // Swift\r\n '.swift': 'swift',\r\n // Lua\r\n '.lua': 'lua',\r\n // R\r\n '.r': 'r',\r\n '.R': 'r',\r\n // Julia\r\n '.jl': 'julia',\r\n // Elixir/Erlang\r\n '.ex': 'elixir',\r\n '.exs': 'elixir-script',\r\n '.erl': 'erlang',\r\n // Haskell\r\n '.hs': 'haskell',\r\n '.lhs': 'literate-haskell',\r\n // Web frameworks\r\n '.vue': 'vue',\r\n '.svelte': 'svelte',\r\n // SQL\r\n '.sql': 'sql',\r\n};\r\n\r\n/**\r\n * Check if a file extension requires frontmatter protection.\r\n */\r\nexport function needsFrontmatterProtection(filePath: string): boolean {\r\n const ext = filePath.toLowerCase().match(/\\.[^.]+$/)?.[0] || '';\r\n return (CODE_EXTENSIONS as readonly string[]).includes(ext);\r\n}\r\n\r\n/**\r\n * Get the content type for a file extension.\r\n */\r\nexport function getContentType(filePath: string): string {\r\n const ext = filePath.toLowerCase().match(/\\.[^.]+$/)?.[0] || '';\r\n return CONTENT_TYPES[ext] || 'text';\r\n}\r\n\r\n// ── Package Type System ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * Package types supported by the prompd ecosystem.\r\n * Defined in prompd.json under the \"type\" field.\r\n */\r\nexport type PackageType = 'package' | 'workflow' | 'skill' | 'node-template';\r\n\r\n/**\r\n * Maps each PackageType to its install directory name.\r\n * e.g., .prompd/packages/, .prompd/workflows/, .prompd/skills/, .prompd/templates/\r\n */\r\nexport const PACKAGE_TYPE_DIRS: Record<PackageType, string> = {\r\n 'package': 'packages',\r\n 'workflow': 'workflows',\r\n 'skill': 'skills',\r\n 'node-template': 'templates',\r\n};\r\n\r\n/**\r\n * All valid package type strings, for validation.\r\n */\r\nexport const VALID_PACKAGE_TYPES: readonly string[] = Object.keys(PACKAGE_TYPE_DIRS);\r\n\r\n/**\r\n * Maps tool names to their native skill deployment directories.\r\n * Used by `prompd install --tools <tool>` to deploy skills into tool-native locations.\r\n */\r\nexport const TOOL_DEPLOY_DIRS: Record<string, string> = {\r\n 'claude': '~/.claude/skills',\r\n};\r\n\r\n/**\r\n * Check if a string is a valid PackageType.\r\n */\r\nexport function isValidPackageType(type: string): type is PackageType {\r\n return VALID_PACKAGE_TYPES.includes(type);\r\n}\r\n\r\n/**\r\n * Get the install directory name for a given package type.\r\n * Defaults to 'packages' for unknown types.\r\n */\r\nexport function getInstallDirForType(type: string): string {\r\n return PACKAGE_TYPE_DIRS[type as PackageType] || 'packages';\r\n}\r\n\r\n// NOTE: resolveToolDeployDir() (Node-only; uses os.homedir()) lives in @prompd/cli,\r\n// not here, to keep @prompd/core free of Node imports.\r\n\r\n// ── Prompd File Types ────────────────────────────────────────────────────────\r\n\r\nexport interface PrompdParameter {\r\n name: string;\r\n /**\r\n * string — plain text\r\n * number — integer or float\r\n * integer — whole number only\r\n * float — decimal number\r\n * boolean — true / false\r\n * array — JSON array (untyped elements)\r\n * object — plain key-value object (non-array)\r\n * json — any JSON value: objects, arrays of objects, nested structures, etc.\r\n * file — file path; caller supplies file content as a string\r\n * base64 — base64-encoded binary data (images, blobs, streams)\r\n * date — calendar date \"YYYY-MM-DD\"; default may be a relative expression\r\n * (now, today, now-7d, now+1w, now-3m, now-1y) resolved at compile time\r\n * datetime — date + time \"YYYY-MM-DDTHH:mm:ss\"; same relative-default support\r\n * (now, now-2h, now-30min) resolved at compile time\r\n */\r\n type: 'string' | 'number' | 'integer' | 'float' | 'boolean' | 'array' | 'object' | 'json' | 'file' | 'base64' | 'date' | 'datetime';\r\n description?: string;\r\n required?: boolean;\r\n default?: any;\r\n pattern?: string;\r\n minimum?: number;\r\n maximum?: number;\r\n enum?: string[];\r\n}\r\n\r\nexport interface UsingPackage {\r\n name: string;\r\n prefix?: string;\r\n}\r\n\r\nexport interface PrompdMetadata {\r\n id: string; // Machine-readable identifier (kebab-case) - REQUIRED\r\n name?: string; // Human-readable display name (can have spaces)\r\n description?: string;\r\n version?: string;\r\n parameters?: PrompdParameter[];\r\n variables?: PrompdParameter[]; // For backward compatibility\r\n system?: string | string[];\r\n context?: string | string[];\r\n task?: string | string[];\r\n user?: string | string[];\r\n assistant?: string | string[];\r\n response?: string | string[];\r\n output?: string | string[];\r\n requires?: string[];\r\n // Execution hints — used as defaults, overridden by CLI flags / node properties\r\n provider?: string;\r\n model?: string;\r\n temperature?: number;\r\n max_tokens?: number;\r\n // Advanced features for composable architecture\r\n using?: string | UsingPackage[] | Record<string, string>; // Package imports\r\n inherits?: string; // Parent template reference\r\n override?: Record<string, string | null>; // Section overrides\r\n}\r\n\r\nexport interface PrompdFile {\r\n metadata: PrompdMetadata;\r\n content: string;\r\n sections: Record<string, string>;\r\n}\r\n\r\nexport interface CustomProvider {\r\n apiKey?: string;\r\n baseUrl: string;\r\n enabled: boolean;\r\n models: string[];\r\n type: string;\r\n}\r\n\r\nexport interface RegistryConfig {\r\n url: string;\r\n api_key?: string;\r\n token?: string;\r\n username?: string;\r\n}\r\n\r\nexport interface ProviderConfig {\r\n baseUrl?: string; // Custom API endpoint (e.g., proxy, different region)\r\n timeout?: number; // Provider-specific timeout override\r\n maxRetries?: number; // Provider-specific retry count override\r\n extraHeaders?: Record<string, string>; // Custom headers (auth, tracing, etc.)\r\n extraParams?: Record<string, any>; // Provider-specific request parameters\r\n}\r\n\r\nexport interface Config {\r\n apiKeys: Record<string, string>;\r\n defaultProvider?: string;\r\n defaultModel?: string;\r\n customProviders: Record<string, CustomProvider>;\r\n providerConfigs?: Record<string, ProviderConfig>; // Per-provider config overrides\r\n registry: {\r\n default?: string;\r\n registries: Record<string, RegistryConfig>;\r\n };\r\n scopes: Record<string, string>; // scope -> registry mapping\r\n namespaces?: Record<string, string>; // namespace -> registry URL mapping\r\n currentNamespace?: string; // active namespace\r\n maxRetries?: number;\r\n timeout?: number;\r\n verbose?: boolean;\r\n}\r\n\r\nexport interface LLMResponse {\r\n success: boolean;\r\n response?: string;\r\n error?: string;\r\n content?: string;\r\n usage?: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n totalTokens: number;\r\n };\r\n}\r\n\r\nexport interface ValidationIssue {\r\n level: 'error' | 'warning' | 'info';\r\n message: string;\r\n line?: number;\r\n column?: number;\r\n}\r\n\r\nexport interface ExecuteOptions {\r\n provider: string;\r\n model: string;\r\n apiKey?: string;\r\n output?: string;\r\n params?: Record<string, any>;\r\n paramFiles?: string[];\r\n version?: string;\r\n metaSystem?: string;\r\n metaContext?: string;\r\n metaUser?: string;\r\n verbose?: boolean;\r\n registryUrl?: string;\r\n workspaceRoot?: string;\r\n fileSystem?: import('../lib/compiler/file-system').IFileSystem;\r\n // Execution parameter overrides — take priority over frontmatter hints\r\n temperature?: number;\r\n maxTokens?: number;\r\n}","/**\n * Custom error classes for Prompd CLI.\n */\n\nexport class PrompdError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PrompdError';\n Object.setPrototypeOf(this, PrompdError.prototype);\n }\n}\n\nexport class ParseError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n Object.setPrototypeOf(this, ParseError.prototype);\n }\n}\n\nexport class ValidationError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class CompilationError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'CompilationError';\n Object.setPrototypeOf(this, CompilationError.prototype);\n }\n}\n\nexport class SecurityError extends PrompdError {\n constructor(message: string) {\n super(message);\n this.name = 'SecurityError';\n Object.setPrototypeOf(this, SecurityError.prototype);\n }\n}\n","/**\n * Compilation pipeline types and interfaces.\n *\n * This module defines the core types used throughout the 6-stage compilation pipeline,\n * mirroring the Python CLI's architecture for feature parity.\n */\n\nimport { PrompdMetadata } from '../../types';\nimport { IFileSystem } from './file-system';\n\n/**\n * Options for resolving a package reference to a path.\n */\nexport interface ResolvePackageOptions {\n fileSystem?: IFileSystem;\n registryUrl?: string;\n workspaceRoot?: string;\n}\n\n/**\n * Injectable package resolver. The Node CLI provides a disk/registry-backed\n * implementation; the browser omits it (single-file compile only), in which\n * case stages that need package/inherits resolution emit a diagnostic instead\n * of importing Node-only code.\n */\nexport interface IPackageResolver {\n resolvePackage(packageRef: string, options: ResolvePackageOptions): Promise<string>;\n}\n\n/**\n * Stages of the compilation pipeline.\n */\nexport enum CompilationStage {\n LEXICAL_ANALYSIS = 'lexical_analysis',\n DEPENDENCY_RESOLUTION = 'dependency_resolution',\n SEMANTIC_ANALYSIS = 'semantic_analysis',\n ASSET_EXTRACTION = 'asset_extraction',\n TEMPLATE_PROCESSING = 'template_processing',\n CODE_GENERATION = 'code_generation'\n}\n\n/**\n * Resolved package information.\n */\nexport interface ResolvedPackage {\n path: string;\n prefix?: string;\n}\n\n/**\n * Structured diagnostic message with location information.\n * Used for both errors and warnings to enable IDE integration.\n */\nexport interface CompilationDiagnostic {\n /** The diagnostic message */\n message: string;\n /** Severity level */\n severity: 'error' | 'warning' | 'info';\n /** Source stage that generated this diagnostic */\n source?: string;\n /** Starting line number (1-indexed) */\n line?: number;\n /** Starting column number (1-indexed) */\n column?: number;\n /** Ending line number (1-indexed) */\n endLine?: number;\n /** Ending column number (1-indexed) */\n endColumn?: number;\n /** Optional error code for quick-fix identification */\n code?: string;\n /** File path if different from main source file */\n file?: string;\n}\n\n/**\n * Context passed between compilation stages.\n *\n * Accumulates data as it flows through the pipeline, collecting errors,\n * warnings, and transforming content at each stage.\n */\nexport class CompilationContext {\n sourceFile: string;\n metadata?: PrompdMetadata;\n content?: string;\n /** Raw source content for line number calculation */\n rawSource?: string;\n dependencies: {\n imports?: Record<string, ResolvedPackage>;\n inherits?: string;\n };\n parameters: Record<string, any>;\n contexts: string[];\n /** Legacy string errors for backward compatibility */\n errors: string[];\n /** Legacy string warnings for backward compatibility */\n warnings: string[];\n /** Structured diagnostics with location information */\n diagnostics: CompilationDiagnostic[];\n outputFormat: string;\n compiledResult?: string | Uint8Array;\n verbose: boolean;\n fileSystem!: IFileSystem; // Set by pipeline\n registryUrl?: string; // Registry URL for package resolution\n workspaceRoot?: string; // Workspace root directory for package cache\n packageResolver?: IPackageResolver; // Injected; absent in browser (single-file compile)\n\n constructor(sourceFile: string, options: CompilationOptions = {}) {\n this.sourceFile = sourceFile;\n this.dependencies = {};\n this.parameters = options.parameters || {};\n this.contexts = [];\n this.errors = [];\n this.warnings = [];\n this.diagnostics = [];\n this.outputFormat = options.outputFormat || 'markdown';\n this.verbose = options.verbose || false;\n this.registryUrl = options.registryUrl;\n this.workspaceRoot = options.workspaceRoot;\n this.packageResolver = options.packageResolver;\n }\n\n /**\n * Add an error to the compilation context (legacy string format).\n */\n addError(message: string): void {\n this.errors.push(message);\n // Also add as structured diagnostic\n this.diagnostics.push({ message, severity: 'error' });\n }\n\n /**\n * Add a warning to the compilation context (legacy string format).\n */\n addWarning(message: string): void {\n this.warnings.push(message);\n // Also add as structured diagnostic\n this.diagnostics.push({ message, severity: 'warning' });\n }\n\n /**\n * Add a structured diagnostic with location information.\n */\n addDiagnostic(diagnostic: CompilationDiagnostic): void {\n this.diagnostics.push(diagnostic);\n // Also add to legacy arrays for backward compatibility\n if (diagnostic.severity === 'error') {\n this.errors.push(diagnostic.message);\n } else if (diagnostic.severity === 'warning') {\n this.warnings.push(diagnostic.message);\n }\n }\n\n /**\n * Find line and column for a pattern in the raw source.\n * Returns 1-indexed line and column numbers.\n */\n findLocation(pattern: string | RegExp): { line: number; column: number; endLine: number; endColumn: number } | null {\n if (!this.rawSource) return null;\n\n const match = typeof pattern === 'string'\n ? this.rawSource.indexOf(pattern)\n : this.rawSource.search(pattern);\n\n if (match === -1) return null;\n\n const beforeMatch = this.rawSource.substring(0, match);\n const lines = beforeMatch.split('\\n');\n const line = lines.length;\n const column = (lines[lines.length - 1]?.length || 0) + 1;\n\n // Calculate end position\n const matchLength = typeof pattern === 'string'\n ? pattern.length\n : (this.rawSource.match(pattern)?.[0]?.length || 0);\n const matchText = this.rawSource.substring(match, match + matchLength);\n const matchLines = matchText.split('\\n');\n const endLine = line + matchLines.length - 1;\n const endColumn = matchLines.length === 1\n ? column + matchLength\n : matchLines[matchLines.length - 1].length + 1;\n\n return { line, column, endLine, endColumn };\n }\n\n /**\n * Check if compilation has errors.\n */\n hasErrors(): boolean {\n return this.errors.length > 0 || this.diagnostics.some(d => d.severity === 'error');\n }\n\n /**\n * Get all diagnostics (errors and warnings).\n */\n getDiagnostics(): CompilationDiagnostic[] {\n return this.diagnostics;\n }\n\n /**\n * Get only error diagnostics.\n */\n getErrors(): CompilationDiagnostic[] {\n return this.diagnostics.filter(d => d.severity === 'error');\n }\n\n /**\n * Get only warning diagnostics.\n */\n getWarnings(): CompilationDiagnostic[] {\n return this.diagnostics.filter(d => d.severity === 'warning');\n }\n}\n\n/**\n * Options for compilation.\n */\nexport interface CompilationOptions {\n outputFormat?: string;\n parameters?: Record<string, any>;\n outputFile?: string;\n verbose?: boolean;\n fileSystem?: IFileSystem;\n /** Injected package resolver (Node CLI provides disk/registry; browser omits). */\n packageResolver?: IPackageResolver;\n /** Registry URL for package resolution. Defaults to https://registry.prompdhub.ai in production. */\n registryUrl?: string;\n /** Root directory for workspace (for package cache location). */\n workspaceRoot?: string;\n /**\n * When true, skip required parameter validation.\n * Use this for validation/diagnostics during editing when parameters won't be provided.\n * When false (default), required parameters are validated during execution.\n */\n validateOnly?: boolean;\n}\n\n/**\n * Abstract base interface for compiler pipeline stages.\n */\nexport interface CompilerStage {\n /**\n * Process the compilation context through this stage.\n */\n process(context: CompilationContext): Promise<void>;\n\n /**\n * Get the name of this compilation stage.\n */\n getName(): string;\n}\n\n/**\n * Represents a compiled prompt ready for formatting.\n */\nexport interface CompiledPrompt {\n metadata?: PrompdMetadata;\n content?: string;\n contexts: string[];\n parameters: Record<string, any>;\n verbose: boolean;\n}\n\n/**\n * Protocol for output format plugins.\n */\nexport interface OutputFormatter {\n name: string;\n fileExtension: string;\n mimeType: string;\n\n /**\n * Format the compiled prompt into the target format.\n */\n format(compiled: CompiledPrompt): Promise<string>;\n}\n\n/**\n * Information about a markdown section.\n */\nexport interface SectionInfo {\n id: string;\n headingText: string;\n content: string;\n startLine: number;\n endLine: number;\n headingLevel: number;\n}\n\n/**\n * Security configuration for file operations.\n */\nexport interface SecurityConfig {\n maxFileSize: number; // Maximum file size in bytes\n allowedExtensions: string[]; // Allowed file extensions\n maxTemplateDepth: number; // Maximum template nesting depth\n templateTimeout: number; // Template rendering timeout in ms\n}\n\n/**\n * Default security configuration.\n */\nexport const DEFAULT_SECURITY_CONFIG: SecurityConfig = {\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowedExtensions: [\n '.prmd', '.md', '.txt', '.json', '.yaml', '.yml',\n '.xlsx', '.docx', '.pdf', '.png', '.jpg', '.jpeg', '.gif'\n ],\n maxTemplateDepth: 10,\n templateTimeout: 5000 // 5 seconds\n};\n","/**\n * Pure package-reference helpers.\n *\n * These are the parts of the CLI's package-resolver that are environment-agnostic\n * (string parsing + path-safety checks). The Node-only disk/registry resolution\n * (`resolvePackage`, base-dir lookups) lives in @prompd/cli and is injected via\n * IPackageResolver. Path operations are inlined as POSIX so this stays node-free.\n */\n\nimport semver from 'semver';\nimport { SecurityError } from '../errors';\nimport type { IPackageResolver, ResolvePackageOptions } from './types';\n\n/** POSIX path normalize (collapse ./ and ../, no fs). */\nfunction posixNormalize(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const part of p.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(part);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nfunction posixIsAbsolute(p: string): boolean {\n return p.startsWith('/');\n}\n\n/**\n * Strip a file path suffix from a package reference.\n * @example \"@ns/pkg@1.0.0/prompts/file.prmd\" -> \"@ns/pkg@1.0.0\"\n */\nexport function stripFilePath(packageRef: string): string {\n const match = packageRef.match(/^(@[\\w.-]+\\/[\\w.-]+(?:@[\\w.-]+)?)/);\n return match ? match[1] : packageRef;\n}\n\n/**\n * Parse package reference into name and version. Strips any file path suffix.\n */\nexport function parsePackageReference(packageRef: string): { name: string; version: string; scope?: string } {\n const stripped = stripFilePath(packageRef);\n const match = stripped.match(/^(@[\\w.-]+\\/[\\w.-]+)@?([\\w.-]+)?$/);\n\n if (!match) {\n throw new Error(`Invalid package reference format: ${packageRef}`);\n }\n\n const name = match[1];\n const rawVersion = match[2] || 'latest';\n const version = semver.valid(rawVersion) || rawVersion;\n\n const scopeMatch = name.match(/^(@[\\w.-]+)\\//);\n const scope = scopeMatch ? scopeMatch[1] : undefined;\n\n return { name, version, scope };\n}\n\n/**\n * Parse a package reference that may include a file path within the package.\n * Format: @namespace/package@version/path/to/file.prmd\n */\nexport function parsePackageReferenceWithPath(packageRef: string): { name: string; version: string; scope?: string; filePath?: string } {\n const { name, version, scope } = parsePackageReference(packageRef);\n const stripped = stripFilePath(packageRef);\n const remainder = packageRef.slice(stripped.length);\n const filePath = remainder.length > 1 ? remainder.slice(1) : undefined;\n return { name, version, scope, filePath };\n}\n\n/**\n * Validate package reference format. Accepts optional file path suffix.\n */\nexport function isValidPackageReference(packageRef: string): boolean {\n if (packageRef.includes('\\0')) {\n return false;\n }\n\n const base = stripFilePath(packageRef);\n\n const pattern = /^@[\\w.-]+\\/[\\w.-]+(@[\\w.-]+)?$/;\n if (!pattern.test(base)) {\n return false;\n }\n\n const remainder = packageRef.slice(base.length);\n if (remainder.length > 0) {\n if (!remainder.startsWith('/')) {\n return false;\n }\n const filePath = remainder.slice(1);\n if (filePath.includes('..') || filePath.includes('//')) {\n return false;\n }\n if (!/^[\\w./\\-]+$/.test(filePath)) {\n return false;\n }\n }\n\n if (base.includes('..') || base.includes('//')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Resolve a file path within a package (POSIX, path-traversal safe).\n */\nexport function resolvePackageFile(packagePath: string, filePath: string): string {\n const normalized = posixNormalize(filePath.replace(/\\\\/g, '/'));\n if (normalized.startsWith('..') || posixIsAbsolute(normalized)) {\n throw new SecurityError(`Invalid file path within package: ${filePath}`);\n }\n\n const packageNorm = packagePath.replace(/\\\\/g, '/');\n const resolvedPath = posixNormalize(`${packageNorm}/${normalized}`);\n\n if (!resolvedPath.startsWith(packageNorm.replace(/\\/$/, ''))) {\n throw new SecurityError(`Path traversal detected: ${filePath}`);\n }\n\n return resolvedPath;\n}\n\n/** Fetch the raw `.pdpkg` (ZIP) bytes for a package@version. The host injects it —\n * the browser with `fetch`, the Node CLI with its registry client — so the resolver\n * itself stays environment-agnostic. */\nexport type PackageDownloader = (name: string, version: string) => Promise<Uint8Array>;\n\n/** The in-memory FS capabilities the resolver needs to ingest a package — both\n * MemoryFileSystem and HybridFileSystem provide these. Duck-typed (not an\n * instanceof) so any host FS that can hold packages works. */\ninterface PackageCapableFileSystem {\n getPackagePath(name: string, version: string): string;\n isDirectory(path: string): boolean | Promise<boolean>;\n addPackage(name: string, version: string, buffer: Uint8Array): Promise<void>;\n}\nfunction isPackageCapable(fs: unknown): fs is PackageCapableFileSystem {\n const f = fs as Partial<PackageCapableFileSystem> | undefined;\n return !!f && typeof f.getPackagePath === 'function' && typeof f.addPackage === 'function' && typeof f.isDirectory === 'function';\n}\n\n/**\n * The environment-agnostic package resolver: loads `using:`/`inherits:` packages\n * into an in-memory FS via an injected registry download. This is the ONE resolver\n * for every host that compiles in memory (the browser, and Node when not using the\n * disk cache) — so the download/unzip/cache logic isn't duplicated per host.\n *\n * `resolvePackage` returns the in-memory directory path; the compiler then reads\n * the referenced file from `options.fileSystem` via resolvePackageFile.\n */\nexport class MemoryPackageResolver implements IPackageResolver {\n constructor(private readonly download: PackageDownloader) {}\n\n async resolvePackage(packageRef: string, options: ResolvePackageOptions): Promise<string> {\n const fs = options.fileSystem;\n if (!isPackageCapable(fs)) {\n throw new Error('MemoryPackageResolver requires a package-capable in-memory file system (MemoryFileSystem or HybridFileSystem)');\n }\n if (!isValidPackageReference(packageRef)) {\n throw new SecurityError(`Invalid package reference format: ${packageRef}`);\n }\n const { name, version } = parsePackageReference(packageRef);\n const packagePath = fs.getPackagePath(name, version);\n if (await fs.isDirectory(packagePath)) return packagePath; // already loaded this session\n const buffer = await this.download(name, version);\n await fs.addPackage(name, version, buffer);\n return packagePath;\n }\n}\n","/**\n * Minimal POSIX path helpers so @prompd/core needs no Node 'path' import.\n * The in-memory/virtual file system uses POSIX-style paths throughout.\n */\n\nexport function normalizePosix(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(seg);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nexport function joinPosix(...segments: string[]): string {\n const filtered = segments.filter((s) => s && s.length > 0);\n if (filtered.length === 0) return '.';\n return normalizePosix(filtered.join('/'));\n}\n\n/** POSIX-style resolve relative to a base (absolute segments win). */\nexport function resolvePosix(base: string, p: string): string {\n if (p.startsWith('/')) return normalizePosix(p);\n return joinPosix(base, p);\n}\n\nexport function dirnamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n if (idx === -1) return '.';\n if (idx === 0) return '/';\n return norm.slice(0, idx);\n}\n\nexport function basenamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n return idx === -1 ? norm : norm.slice(idx + 1);\n}\n\nexport function isAbsolutePosix(p: string): boolean {\n return p.startsWith('/');\n}\n\n/** Return the extension including the dot (e.g. \".prmd\"), or \"\" if none. */\nexport function extname(p: string): string {\n const base = basenamePosix(p);\n const dot = base.lastIndexOf('.');\n return dot <= 0 ? '' : base.slice(dot);\n}\n\n/**\n * Prompd source file extensions. A .prmd is just markdown (.md) with YAML\n * frontmatter, so both are treated as first-class prompt sources.\n */\nexport const PROMPD_EXTENSIONS = ['.prmd', '.md'] as const;\n\n/** True if the path is a Prompd source file (.prmd or .md). */\nexport function isPrompdFile(p: string): boolean {\n const lower = p.toLowerCase();\n return lower.endsWith('.prmd') || lower.endsWith('.md');\n}\n","/**\r\n * Compilation pipeline orchestrator.\r\n *\r\n * Manages the execution of the 6-stage compilation pipeline, ensuring stages\r\n * run in order and errors are properly propagated.\r\n */\r\n\r\nimport {\r\n CompilationContext,\r\n CompilationOptions,\r\n CompilerStage,\r\n DEFAULT_SECURITY_CONFIG,\r\n SecurityConfig,\r\n IPackageResolver\r\n} from './types';\r\nimport { PrompdError } from '../errors';\r\nimport { IFileSystem } from './file-system';\r\nimport { parsePackageReferenceWithPath, resolvePackageFile } from './package-ref';\r\nimport { isPrompdFile } from './path-utils';\r\n\r\n/**\r\n * The main compiler pipeline orchestrator.\r\n */\r\nexport class CompilerPipeline {\r\n private stages: CompilerStage[];\r\n private securityConfig: SecurityConfig;\r\n\r\n constructor(stages?: CompilerStage[], securityConfig?: SecurityConfig) {\r\n this.stages = stages || [];\r\n this.securityConfig = securityConfig || DEFAULT_SECURITY_CONFIG;\r\n }\r\n\r\n /**\r\n * Register a compilation stage.\r\n */\r\n registerStage(stage: CompilerStage): void {\r\n this.stages.push(stage);\r\n }\r\n\r\n /**\r\n * Execute the compilation pipeline.\r\n *\r\n * @param source - Path to .prmd file or package reference\r\n * @param options - Compilation options\r\n * @returns Compilation context with result or errors\r\n */\r\n async execute(source: string, options: CompilationOptions = {}): Promise<CompilationContext> {\r\n // @prompd/core requires an injected file system (MemoryFileSystem in the\r\n // browser/server). The Node CLI supplies NodeFileSystem.\r\n const fileSystem = options.fileSystem;\r\n if (!fileSystem) {\r\n throw new PrompdError('A fileSystem must be provided to the compiler (e.g. MemoryFileSystem).');\r\n }\r\n\r\n // Resolve source (handles both file paths and package references)\r\n const sourcePath = await this.resolveSource(source, fileSystem, options.packageResolver, options.registryUrl, options.workspaceRoot);\r\n\r\n // Create compilation context\r\n const context = new CompilationContext(sourcePath, options);\r\n\r\n // Set file system\r\n context.fileSystem = fileSystem;\r\n\r\n // Run each stage in sequence\r\n // Continue through all stages to accumulate all errors (don't stop at first error)\r\n for (const stage of this.stages) {\r\n try {\r\n if (context.verbose) {\r\n console.log(`Running stage: ${stage.getName()}`);\r\n }\r\n await stage.process(context);\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addError(`${stage.getName()} failed: ${errorMessage}`);\r\n // Continue to next stage to find additional errors\r\n }\r\n }\r\n\r\n return context;\r\n }\r\n\r\n /**\r\n * Resolve source to file path (handles package references).\r\n *\r\n * @param source - Package reference or file path\r\n * @param fileSystem - File system to use for resolution\r\n * @param customFileSystem - Optional custom file system (used to detect in-memory mode)\r\n * @param registryUrl - Optional registry URL for package resolution\r\n * @param workspaceRoot - Optional workspace root for package cache location\r\n */\r\n private async resolveSource(source: string, fileSystem: IFileSystem, packageResolver?: IPackageResolver, registryUrl?: string, workspaceRoot?: string): Promise<string> {\r\n // Check if it's a package reference (starts with @)\r\n if (source.startsWith('@')) {\r\n if (!packageResolver) {\r\n throw new PrompdError(\r\n `Package resolution is unavailable in this environment: ${source}. ` +\r\n `Compile via the backend, or provide a packageResolver in the compilation options.`\r\n );\r\n }\r\n\r\n try {\r\n // Check if the reference includes a specific file path\r\n const { filePath } = parsePackageReferenceWithPath(source);\r\n\r\n // resolvePackage handles stripping the file path internally\r\n const packagePath = await packageResolver.resolvePackage(source, {\r\n fileSystem,\r\n registryUrl,\r\n workspaceRoot\r\n });\r\n\r\n // If a specific file was requested, resolve it within the package\r\n if (filePath) {\r\n return resolvePackageFile(packagePath, filePath);\r\n }\r\n\r\n // No specific file — find the main .prmd file in the package\r\n const prmdFiles = await this.findPromdFiles(packagePath, fileSystem);\r\n\r\n if (prmdFiles.length === 0) {\r\n throw new Error(`No .prmd files found in package: ${source}`);\r\n }\r\n\r\n // Use the first .prmd file (or could look for main.prmd)\r\n return prmdFiles[0];\r\n } catch (error) {\r\n throw new PrompdError(`Failed to resolve package ${source}: ${error}`);\r\n }\r\n }\r\n\r\n // Regular path: with a virtual/in-memory file system, paths like\r\n // '/main.prmd' stay as-is (no disk resolution).\r\n return source;\r\n }\r\n\r\n /**\r\n * Find all .prmd files in a directory.\r\n *\r\n * @param dir - Directory path\r\n * @param fileSystem - File system to use\r\n */\r\n private async findPromdFiles(dir: string, fileSystem: IFileSystem): Promise<string[]> {\r\n const files: string[] = [];\r\n\r\n try {\r\n // Use fileSystem abstraction instead of fs module\r\n const entries = await fileSystem.readdir(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = fileSystem.join(dir, entry);\r\n\r\n if (await fileSystem.isDirectory(fullPath)) {\r\n // Recursively search subdirectories\r\n const subFiles = await this.findPromdFiles(fullPath, fileSystem);\r\n files.push(...subFiles);\r\n } else if (isPrompdFile(entry)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n } catch (error) {\r\n // Ignore errors (directory not accessible, etc.)\r\n }\r\n\r\n return files;\r\n }\r\n\r\n /**\r\n * Get registered stages.\r\n */\r\n getStages(): CompilerStage[] {\r\n return [...this.stages];\r\n }\r\n}\r\n","/**\n * Lexical Analysis Stage - Parse YAML frontmatter + Markdown content.\n *\n * This stage parses the .prmd file into structured metadata and content,\n * populating the compilation context for subsequent stages.\n */\n\nimport { CompilerStage, CompilationContext } from '../types';\nimport { PrompdParser } from '../../parser';\n\nexport class LexicalAnalysisStage implements CompilerStage {\n private parser: PrompdParser;\n\n constructor() {\n this.parser = new PrompdParser();\n }\n\n async process(context: CompilationContext): Promise<void> {\n try {\n // Read file content from file system\n const fileContent = await context.fileSystem.readFile(context.sourceFile);\n\n // Store raw source for line number calculation in later stages\n context.rawSource = fileContent;\n\n // Parse the .prmd file content\n const prompd = this.parser.parseContent(fileContent, context.sourceFile);\n\n // Populate compilation context\n context.metadata = prompd.metadata;\n context.content = prompd.content;\n\n // Convert YAML-defined sections to markdown sections\n context.content = this.injectYamlSections(prompd.metadata, context.content);\n\n if (context.verbose) {\n console.log(`✓ Parsed file: ${context.sourceFile}`);\n console.log(` - Name: ${prompd.metadata.name}`);\n console.log(` - Version: ${prompd.metadata.version || 'N/A'}`);\n console.log(` - Parameters: ${prompd.metadata.parameters?.length || 0}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Try to extract line number from YAML parser errors\n let line: number | undefined;\n let column: number | undefined;\n const lineMatch = errorMessage.match(/at line (\\d+)(?:,? column (\\d+))?/i);\n if (lineMatch) {\n line = parseInt(lineMatch[1], 10) + 1; // Add 1 for opening ---\n column = lineMatch[2] ? parseInt(lineMatch[2], 10) : 1;\n }\n\n context.addDiagnostic({\n message: `Lexical analysis failed: ${errorMessage}`,\n severity: 'error',\n source: 'lexical',\n line,\n column,\n code: 'PARSE_ERROR'\n });\n }\n }\n\n /**\n * Convert YAML-defined sections (system, user, assistant, etc.) to markdown sections.\n * These are appended to the content after any markdown-defined sections.\n */\n private injectYamlSections(metadata: any, content: string): string {\n const yamlSections: string[] = [];\n\n // Standard section order: system → context → task → user → assistant → response → output\n const sectionOrder = ['system', 'context', 'task', 'user', 'assistant', 'response', 'output'];\n\n for (const sectionName of sectionOrder) {\n const sectionValue = metadata[sectionName];\n\n if (sectionValue) {\n // Capitalize first letter for markdown heading\n const headingName = sectionName.charAt(0).toUpperCase() + sectionName.slice(1);\n\n if (Array.isArray(sectionValue)) {\n // Array of file paths - will be processed by asset extraction stage\n yamlSections.push(`# ${headingName}`);\n yamlSections.push(`[YAML section with ${sectionValue.length} file reference(s) - will be processed by asset extraction]`);\n } else if (typeof sectionValue === 'string') {\n // Direct string content or single file path\n yamlSections.push(`# ${headingName}`);\n yamlSections.push(sectionValue);\n }\n }\n }\n\n // Append YAML sections to existing content\n if (yamlSections.length > 0) {\n const yamlContent = yamlSections.join('\\n\\n');\n return content ? `${content}\\n\\n${yamlContent}` : yamlContent;\n }\n\n return content;\n }\n\n getName(): string {\n return 'Lexical Analysis';\n }\n}\n","/**\n * Dependency Resolution Stage\n *\n * Resolves 'using:' imports and 'inherits:' chains, handling both local file\n * paths and package references with alias resolution.\n *\n * This is a direct port of the Python CLI's DependencyResolutionStage.\n */\n\nimport { CompilerStage, CompilationContext, ResolvedPackage } from '../types';\nimport { resolvePackageFile } from '../package-ref';\nimport { isPrompdFile } from '../path-utils';\n\nexport class DependencyResolutionStage implements CompilerStage {\n /**\n * Resolve a package reference via the injected resolver. Absent in the browser\n * (single-file compile), where package/inherits resolution is the backend's job.\n */\n private async resolvePackage(context: CompilationContext, packageRef: string): Promise<string> {\n if (!context.packageResolver) {\n throw new Error(\n `Package resolution is unavailable in this environment: ${packageRef}. ` +\n `Compile via the backend to resolve packages and inheritance.`\n );\n }\n return context.packageResolver.resolvePackage(packageRef, {\n fileSystem: context.fileSystem,\n registryUrl: context.registryUrl,\n workspaceRoot: context.workspaceRoot\n });\n }\n\n async process(context: CompilationContext): Promise<void> {\n if (!context.metadata) {\n return;\n }\n\n // Initialize resolved packages\n const resolvedPackages: Record<string, ResolvedPackage> = {};\n\n // Process 'using' field (package imports with optional prefixes)\n if (context.metadata.using) {\n await this.processUsingField(context, context.metadata.using, resolvedPackages);\n }\n\n // Store resolved imports\n context.dependencies.imports = resolvedPackages;\n\n // Process 'inherits' field (can be package reference or direct file path)\n if (context.metadata.inherits) {\n await this.processInheritsField(context, context.metadata.inherits, resolvedPackages);\n }\n\n // Process content reference fields for alias resolution\n await this.processContentFieldAliases(context, resolvedPackages);\n }\n\n /**\n * Process the 'using' field for package imports.\n */\n private async processUsingField(\n context: CompilationContext,\n usingImports: any,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n if (typeof usingImports === 'string') {\n // Simple string: using: \"@package@version\"\n await this.resolvePackageImport(context, usingImports, null, resolvedPackages);\n } else if (Array.isArray(usingImports)) {\n // List of packages (can be strings, dicts, or objects)\n for (const item of usingImports) {\n if (typeof item === 'string') {\n // Simple string in list\n await this.resolvePackageImport(context, item, null, resolvedPackages);\n } else if (typeof item === 'object' && item !== null) {\n // Object with name and REQUIRED prefix\n const packageRef = item.name || item.package || '';\n const prefix = item.prefix;\n\n if (packageRef) {\n // Prefix is required for 'using' - the whole point is to create a shorthand\n if (!prefix) {\n context.addError(\n `Package '${packageRef}' in 'using' field must have a prefix for shorthand access`\n );\n continue;\n }\n\n await this.resolvePackageImport(context, packageRef, prefix, resolvedPackages);\n }\n }\n }\n } else if (typeof usingImports === 'object' && usingImports !== null) {\n // Dict format: {package: prefix} or structured format\n for (const [key, value] of Object.entries(usingImports)) {\n if (typeof value === 'string') {\n // Format: {\"@package@version\": \"prefix\"}\n await this.resolvePackageImport(context, key, value, resolvedPackages);\n } else if (typeof value === 'object' && value !== null && 'prefix' in value) {\n // Format: {\"@package@version\": {\"prefix\": \"alias\"}}\n const prefix = (value as any).prefix;\n await this.resolvePackageImport(context, key, prefix, resolvedPackages);\n }\n }\n }\n }\n\n /**\n * Resolve a single package import.\n */\n private async resolvePackageImport(\n context: CompilationContext,\n packageRef: string,\n prefix: string | null,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n try {\n // Resolve via the injected package resolver (Node CLI only).\n const packagePath = await this.resolvePackage(context, packageRef);\n resolvedPackages[packageRef] = {\n path: packagePath,\n prefix: prefix || undefined\n };\n\n if (context.verbose) {\n if (prefix) {\n console.log(`✓ Resolved package: ${packageRef} -> ${packagePath} (prefix: ${prefix})`);\n } else {\n console.log(`✓ Resolved package: ${packageRef} -> ${packagePath}`);\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n // Find location of 'using:' in source\n const location = context.findLocation(/using:/);\n context.addDiagnostic({\n message: `Failed to resolve package ${packageRef}: ${errorMessage}`,\n severity: 'warning',\n source: 'dependency',\n code: 'PACKAGE_NOT_FOUND',\n ...location\n });\n }\n }\n\n /**\n * Process the 'inherits' field.\n */\n private async processInheritsField(\n context: CompilationContext,\n inheritsRef: string,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n // Resolve aliases in inherits field\n const resolvedInheritsRef = this.resolveAliasInPath(inheritsRef, resolvedPackages);\n\n if (resolvedInheritsRef !== inheritsRef) {\n // Update the metadata with the resolved reference\n if (context.metadata) {\n context.metadata.inherits = resolvedInheritsRef;\n }\n if (context.verbose) {\n console.log(`✓ Resolved alias in inherits: ${resolvedInheritsRef}`);\n }\n }\n\n // Check if it's a local file path (starts with . or / or doesn't start with @)\n if (\n resolvedInheritsRef.startsWith('./') ||\n resolvedInheritsRef.startsWith('../') ||\n resolvedInheritsRef.startsWith('/') ||\n (!resolvedInheritsRef.startsWith('@') && isPrompdFile(resolvedInheritsRef))\n ) {\n // Direct file path - resolve relative to source file\n const sourceDir = context.fileSystem.dirname(context.sourceFile);\n const parentPath = context.fileSystem.resolve(sourceDir, resolvedInheritsRef);\n\n // Verify the inherited file exists\n const fileExists = await context.fileSystem.exists(parentPath);\n if (!fileExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited file not found: \"${resolvedInheritsRef}\" (resolved to: ${parentPath})`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_FILE_NOT_FOUND',\n ...location\n });\n return; // Don't set dependencies.inherits if file doesn't exist\n }\n\n context.dependencies.inherits = parentPath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance file: ${resolvedInheritsRef} -> ${parentPath}`);\n }\n } else {\n // Package reference with file path - resolve through package system\n try {\n // Parse package reference and file path\n // Format: @namespace/package@version/path/to/file.prmd\n const pattern = /^(@[\\w.-]+\\/[\\w.-]+@[\\w.-]+)\\/(.+)$/;\n const match = resolvedInheritsRef.match(pattern);\n\n if (match) {\n const packageRef = match[1]; // @namespace/package@version\n const filePathInPackage = match[2]; // path/to/file.prmd\n\n if (context.verbose) {\n console.log(`Parsing package inheritance: ${packageRef} / ${filePathInPackage}`);\n }\n\n // Resolve the package to its local path via the injected resolver.\n const packagePath = await this.resolvePackage(context, packageRef);\n\n // Construct full path to the inherited file\n const fullFilePath = resolvePackageFile(packagePath, filePathInPackage);\n\n // Verify the file exists within the package\n const fileExists = await context.fileSystem.exists(fullFilePath);\n if (!fileExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited file not found in package: \"${filePathInPackage}\" (package: ${packageRef})`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_FILE_NOT_FOUND',\n ...location\n });\n return;\n }\n\n context.dependencies.inherits = fullFilePath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance package: ${resolvedInheritsRef} -> ${fullFilePath}`);\n }\n } else {\n // Fallback: try as direct package reference.\n const parentPath = await this.resolvePackage(context, resolvedInheritsRef);\n\n // Verify the package directory exists\n const dirExists = await context.fileSystem.exists(parentPath);\n if (!dirExists) {\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Inherited package not found: \"${resolvedInheritsRef}\"`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_PACKAGE_NOT_FOUND',\n ...location\n });\n return;\n }\n\n context.dependencies.inherits = parentPath;\n\n if (context.verbose) {\n console.log(`✓ Resolved inheritance package (direct): ${resolvedInheritsRef} -> ${parentPath}`);\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n // Find location of 'inherits:' in source\n const location = context.findLocation(/inherits:/);\n context.addDiagnostic({\n message: `Failed to resolve inheritance \"${resolvedInheritsRef}\": ${errorMessage}`,\n severity: 'error',\n source: 'dependency',\n code: 'INHERITS_NOT_FOUND',\n ...location\n });\n }\n }\n }\n\n /**\n * Process content reference fields (system, context, user, assistant, response) for alias resolution.\n */\n private async processContentFieldAliases(\n context: CompilationContext,\n resolvedPackages: Record<string, ResolvedPackage>\n ): Promise<void> {\n if (!context.metadata) {\n return;\n }\n\n const contentFields = ['system', 'assistant', 'context', 'user', 'response'];\n\n for (const fieldName of contentFields) {\n const fieldValue = (context.metadata as any)[fieldName];\n\n if (fieldValue) {\n // Handle both single strings and lists of strings\n if (typeof fieldValue === 'string') {\n const resolvedValue = this.resolveAliasInPath(fieldValue, resolvedPackages);\n if (resolvedValue !== fieldValue) {\n (context.metadata as any)[fieldName] = resolvedValue;\n if (context.verbose) {\n console.log(`✓ Resolved alias in ${fieldName}: ${fieldValue} -> ${resolvedValue}`);\n }\n }\n } else if (Array.isArray(fieldValue)) {\n const resolvedList: any[] = [];\n for (const item of fieldValue) {\n if (typeof item === 'string') {\n const resolvedItem = this.resolveAliasInPath(item, resolvedPackages);\n resolvedList.push(resolvedItem);\n if (resolvedItem !== item && context.verbose) {\n console.log(`✓ Resolved alias in ${fieldName}: ${item} -> ${resolvedItem}`);\n }\n } else {\n resolvedList.push(item);\n }\n }\n (context.metadata as any)[fieldName] = resolvedList;\n }\n }\n }\n }\n\n /**\n * Resolve alias prefixes in file paths.\n *\n * Examples:\n * - \"@pkg/templates/file.prmd\" with \"@pkg\" aliased to \"@scope/package@version\"\n * becomes \"@scope/package@version/templates/file.prmd\"\n */\n private resolveAliasInPath(\n pathStr: string,\n resolvedPackages: Record<string, ResolvedPackage>\n ): string {\n if (!pathStr.startsWith('@') || !pathStr.includes('/')) {\n return pathStr;\n }\n\n // Extract the potential alias (everything before the first '/')\n // Use indexOf to preserve the full remaining path (split with limit truncates)\n const firstSlashIndex = pathStr.indexOf('/');\n const potentialAlias = pathStr.substring(0, firstSlashIndex); // e.g., \"@pkg\"\n const remainingPath = pathStr.substring(firstSlashIndex + 1); // e.g., \"templates/file.prmd\"\n\n // Look for this alias in resolved packages\n for (const [packageName, packageInfo] of Object.entries(resolvedPackages)) {\n if (packageInfo.prefix === potentialAlias) {\n // Found the alias! Replace it with the full package name\n const resolvedPath = `${packageName}/${remainingPath}`;\n return resolvedPath;\n }\n }\n\n // No alias found, return original path\n return pathStr;\n }\n\n getName(): string {\n return 'Dependency Resolution';\n }\n}\n","/**\n * Date/datetime parameter resolution.\n *\n * A `date` / `datetime` parameter's value (default or provided) may be a relative\n * expression resolved at COMPILE TIME — so each run uses the current date:\n * now today (alias)\n * now-7d 7 days ago now+1d\n * now-1w 1 week ago now+2weeks\n * now-3m / -3mo 3 months ago now+1month\n * now-1y 1 year ago now+1year\n * now+2h 2 hours from now (datetime)\n * now-30min 30 minutes ago\n * now-15s 15 seconds ago\n * or an ISO / Date-parseable literal (e.g. \"2026-06-10\", \"2026-06-10T09:00\").\n *\n * Output: `date` -> \"YYYY-MM-DD\", `datetime` -> \"YYYY-MM-DDTHH:mm:ss\" (local time).\n * A value that isn't a recognized date expression is returned unchanged so type\n * validation can flag it.\n */\n\n/** Parse a relative date expression or a literal into a Date, or null. */\nexport function parseDateExpr(input: string): Date | null {\n const v = (input ?? '').trim();\n if (!v) return null;\n const lower = v.toLowerCase();\n\n if (lower === 'now' || lower === 'today') return new Date();\n\n const rel = lower.match(/^(?:now|today)\\s*([+-])\\s*(\\d+)\\s*([a-z]+)$/);\n if (rel) {\n const n = (rel[1] === '-' ? -1 : 1) * parseInt(rel[2], 10);\n const u = rel[3];\n const d = new Date();\n if (u === 'd' || u.startsWith('day')) d.setDate(d.getDate() + n);\n else if (u === 'w' || u.startsWith('week')) d.setDate(d.getDate() + n * 7);\n else if (u === 'min' || u.startsWith('minute')) d.setMinutes(d.getMinutes() + n);\n else if (u === 'mo' || u === 'm' || u.startsWith('month')) d.setMonth(d.getMonth() + n);\n else if (u === 'y' || u.startsWith('year')) d.setFullYear(d.getFullYear() + n);\n else if (u === 'h' || u.startsWith('hour')) d.setHours(d.getHours() + n);\n else if (u === 's' || u === 'sec' || u.startsWith('second')) d.setSeconds(d.getSeconds() + n);\n else return null; // unknown unit\n return d;\n }\n\n // Date-only literal: parse as LOCAL midnight. `new Date(\"2026-01-15\")` would\n // parse as UTC, which shifts the day in negative-offset timezones.\n const dateOnly = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (dateOnly) {\n return new Date(Number(dateOnly[1]), Number(dateOnly[2]) - 1, Number(dateOnly[3]));\n }\n\n const parsed = new Date(v);\n return isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0');\n}\n\n/** Local \"YYYY-MM-DD\". */\nexport function formatDate(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Local \"YYYY-MM-DDTHH:mm:ss\". */\nexport function formatDateTime(d: Date): string {\n return `${formatDate(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\n/** Resolve a date/datetime value to its formatted string; non-strings and\n * unrecognized expressions pass through unchanged. */\nexport function resolveDateValue(value: unknown, withTime: boolean): unknown {\n if (typeof value !== 'string') return value;\n const d = parseDateExpr(value);\n if (!d) return value;\n return withTime ? formatDateTime(d) : formatDate(d);\n}\n","/**\r\n * Semantic Analysis Stage - Validate parameters and references.\r\n *\r\n * This stage validates the semantic correctness of the prompt, checks required\r\n * parameters, applies default values, and validates parameter types.\r\n */\r\n\r\nimport { CompilerStage, CompilationContext } from '../types';\r\nimport { resolveDateValue, parseDateExpr } from '../date-utils';\r\n\r\nexport class SemanticAnalysisStage implements CompilerStage {\r\n async process(context: CompilationContext): Promise<void> {\r\n if (!context.metadata) {\r\n return;\r\n }\r\n\r\n // Validate required metadata fields\r\n this.validateRequiredMetadata(context);\r\n\r\n // Merge default parameter values and validate required parameters\r\n if (context.metadata.parameters) {\r\n // Only validate required parameters if we're in execution mode (parameters were explicitly provided).\r\n // When editing/validating a file (no parameters passed), we shouldn't warn about\r\n // required parameters since they'll be provided at execution time.\r\n // A prompt definition file declaring required parameters is perfectly valid.\r\n const isExecutionMode = Object.keys(context.parameters).length > 0;\r\n\r\n for (const param of context.metadata.parameters) {\r\n // Add default value if parameter not provided\r\n if (!(param.name in context.parameters) && param.default !== undefined) {\r\n context.parameters[param.name] = param.default;\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Using default value for '${param.name}': ${param.default}`);\r\n }\r\n }\r\n\r\n // Validate required parameters - only when executing (parameters were provided)\r\n // Skip this check when just validating a definition file\r\n if (isExecutionMode && param.required && !(param.name in context.parameters)) {\r\n context.addWarning(`Required parameter '${param.name}' not provided`);\r\n }\r\n\r\n // Type coercion for provided parameters.\r\n // CLI args always arrive as strings; coerce to the declared type before validation.\r\n if (param.name in context.parameters) {\r\n context.parameters[param.name] = this.coerceParameterValue(\r\n context.parameters[param.name],\r\n param.type\r\n );\r\n }\r\n\r\n // Type validation for provided parameters\r\n if (param.name in context.parameters) {\r\n const value = context.parameters[param.name];\r\n const isValid = this.validateParameterType(value, param.type);\r\n\r\n if (!isValid) {\r\n context.addWarning(\r\n `Parameter '${param.name}' has incorrect type. Expected: ${param.type}, got: ${typeof value}`\r\n );\r\n }\r\n }\r\n\r\n // Pattern validation for string parameters\r\n if (param.pattern && param.name in context.parameters) {\r\n const value = String(context.parameters[param.name]);\r\n const regex = new RegExp(param.pattern);\r\n\r\n if (!regex.test(value)) {\r\n context.addWarning(\r\n `Parameter '${param.name}' does not match pattern: ${param.pattern}`\r\n );\r\n }\r\n }\r\n\r\n // Range validation for number parameters\r\n if (param.type === 'number' && param.name in context.parameters) {\r\n const value = Number(context.parameters[param.name]);\r\n\r\n if (param.minimum !== undefined && value < param.minimum) {\r\n context.addWarning(\r\n `Parameter '${param.name}' is below minimum value: ${param.minimum}`\r\n );\r\n }\r\n\r\n if (param.maximum !== undefined && value > param.maximum) {\r\n context.addWarning(\r\n `Parameter '${param.name}' exceeds maximum value: ${param.maximum}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (context.verbose && context.parameters) {\r\n const paramCount = Object.keys(context.parameters).length;\r\n console.log(`✓ Validated ${paramCount} parameter(s)`);\r\n }\r\n }\r\n\r\n /**\r\n * Validate parameter type.\r\n */\r\n private validateParameterType(value: unknown, expectedType: string): boolean {\r\n switch (expectedType) {\r\n case 'string':\r\n case 'file': // file path provided as a string\r\n case 'base64': // base64-encoded binary provided as a string\r\n return typeof value === 'string';\r\n case 'number':\r\n case 'float':\r\n return typeof value === 'number' && !isNaN(value as number);\r\n case 'integer':\r\n return typeof value === 'number' && !isNaN(value as number) && Number.isInteger(value);\r\n case 'boolean':\r\n return typeof value === 'boolean';\r\n case 'array':\r\n return Array.isArray(value);\r\n case 'object':\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n case 'json':\r\n // Accepts any JSON-compatible value: already-parsed object/array, primitives,\r\n // or a string that is valid JSON.\r\n if (value === null || value === undefined) return false;\r\n if (typeof value !== 'string') return true; // already parsed\r\n try { JSON.parse(value as string); return true; } catch { return false; }\r\n case 'date':\r\n case 'datetime':\r\n // After coercion the value is a resolved date string; reject unparseable values.\r\n return typeof value === 'string' && parseDateExpr(value) !== null;\r\n default:\r\n return true; // Unknown type — allow it\r\n }\r\n }\r\n\r\n /**\r\n * Coerce a parameter value to its declared type.\r\n * CLI args always arrive as strings; this converts them to the correct runtime type\r\n * before the value is handed to the template engine.\r\n * Already-correct types (e.g. from a JSON params file) are passed through unchanged.\r\n */\r\n private coerceParameterValue(value: unknown, type: string): unknown {\r\n if (value === null || value === undefined) return value;\r\n\r\n switch (type) {\r\n case 'boolean':\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'string') {\r\n if (value.toLowerCase() === 'true') return true;\r\n if (value.toLowerCase() === 'false') return false;\r\n }\r\n return value;\r\n\r\n case 'integer':\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') {\r\n const n = Number(value);\r\n if (!isNaN(n)) return n;\r\n }\r\n return value;\r\n\r\n case 'number':\r\n case 'float':\r\n if (typeof value === 'number') return value;\r\n if (typeof value === 'string') {\r\n const n = parseFloat(value);\r\n if (!isNaN(n)) return n;\r\n }\r\n return value;\r\n\r\n case 'json':\r\n case 'array':\r\n case 'object':\r\n if (typeof value !== 'string') return value; // already parsed\r\n try { return JSON.parse(value); } catch { return value; }\r\n\r\n case 'date':\r\n // Resolve relative expressions (now, now-7d, ...) / ISO literals at compile time.\r\n return resolveDateValue(value, false);\r\n\r\n case 'datetime':\r\n return resolveDateValue(value, true);\r\n\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Validate required metadata fields (id, name, version).\r\n */\r\n private validateRequiredMetadata(context: CompilationContext): void {\r\n const metadata = context.metadata;\r\n if (!metadata) return;\r\n\r\n // Validate 'id' field\r\n if (!metadata.id) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'id' is missing. Add a unique identifier for this prompt.\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_ID',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n } else if (typeof metadata.id === 'string') {\r\n // Validate kebab-case format\r\n if (!/^[a-z0-9-]+$/.test(metadata.id)) {\r\n const location = context.findLocation(/^\\s*id:/m);\r\n context.addDiagnostic({\r\n message: `ID '${metadata.id}' should use kebab-case format (lowercase letters, numbers, hyphens only).`,\r\n severity: 'warning',\r\n source: 'semantic',\r\n code: 'INVALID_ID_FORMAT',\r\n ...location\r\n });\r\n }\r\n }\r\n\r\n // Validate 'name' field\r\n if (!metadata.name) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'name' is missing. Add a display name for this prompt.\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_NAME',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n }\r\n\r\n // Validate 'version' field\r\n if (!metadata.version) {\r\n const location = context.findLocation(/^---/m);\r\n context.addDiagnostic({\r\n message: \"Required field 'version' is missing. Add a semantic version (e.g., 1.0.0).\",\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'MISSING_VERSION',\r\n line: location?.line ? location.line + 1 : 2,\r\n column: 1\r\n });\r\n } else if (typeof metadata.version === 'string') {\r\n // Validate semantic version format\r\n if (!/^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$/.test(metadata.version)) {\r\n const location = context.findLocation(/^\\s*version:/m);\r\n context.addDiagnostic({\r\n message: `Invalid semantic version '${metadata.version}'. Use format: MAJOR.MINOR.PATCH (e.g., 1.0.0)`,\r\n severity: 'error',\r\n source: 'semantic',\r\n code: 'INVALID_VERSION',\r\n ...location\r\n });\r\n }\r\n }\r\n }\r\n\r\n getName(): string {\r\n return 'Semantic Analysis';\r\n }\r\n}\r\n","/**\n * Section Override Processing\n *\n * Provides complete functionality for parsing, validating, and applying\n * section-based content overrides in prompd template inheritance.\n *\n * This is a direct port of the Python CLI's SectionOverrideProcessor.\n */\n\nimport { SectionInfo } from './types';\nimport { ParseError, ValidationError, SecurityError } from '../errors';\nimport { IFileSystem } from './file-system';\nimport { isAbsolutePosix } from './path-utils';\n\nexport class SectionOverrideProcessor {\n /** Max override file size (DoS protection). */\n private static readonly MAX_OVERRIDE_SIZE = 10 * 1024 * 1024; // 10MB\n\n private headingPattern: RegExp;\n private sectionIdPattern: RegExp;\n\n constructor() {\n // Pattern to match markdown headings (# through ######)\n this.headingPattern = /^(#{1,6})\\s+(.+)$/gm;\n\n // Pattern to match section ID comments (strict - only valid IDs)\n this.sectionIdPattern = /<!--\\s*section-id:\\s*([a-z0-9-]+)\\s*-->/i;\n }\n\n /**\n * Pattern to detect any section-id comment (for validation)\n */\n private detectSectionIdComment(line: string): string | null {\n const match = /<!--\\s*section-id:\\s*(.+?)\\s*-->/i.exec(line);\n return match ? match[1].trim() : null;\n }\n\n /**\n * Extract all sections from markdown content.\n */\n extractSections(content: string): Map<string, SectionInfo> {\n if (!content || !content.trim()) {\n return new Map();\n }\n\n const sections = new Map<string, SectionInfo>();\n const lines = content.split('\\n');\n const encounteredSectionIds = new Set<string>();\n\n // Track explicit section ID comments\n const explicitSectionIds = new Map<number, string>();\n for (let i = 0; i < lines.length; i++) {\n // First check for any section-id comment (valid or invalid)\n const detectedId = this.detectSectionIdComment(lines[i]);\n if (detectedId) {\n // Validate the detected ID (will throw if invalid)\n this.validateSectionId(detectedId, i + 1);\n\n // Now try to match with strict pattern\n const match = this.sectionIdPattern.exec(lines[i]);\n if (match) {\n const sectionId = match[1];\n explicitSectionIds.set(i, sectionId);\n }\n }\n }\n\n // Find all headings and create sections\n const headingMatches: Array<{ level: number; text: string; line: number; index: number }> = [];\n let match;\n\n // Reset regex state\n this.headingPattern.lastIndex = 0;\n\n while ((match = this.headingPattern.exec(content)) !== null) {\n const headingLevel = match[1].length; // Number of # characters\n const headingText = match[2].trim();\n const headingLine = content.substring(0, match.index).split('\\n').length - 1;\n\n headingMatches.push({\n level: headingLevel,\n text: headingText,\n line: headingLine,\n index: match.index\n });\n }\n\n // Process each heading to create sections\n for (let i = 0; i < headingMatches.length; i++) {\n const heading = headingMatches[i];\n\n // Determine section ID\n let sectionId: string | null = null;\n\n // Check for explicit section ID comment before this heading (within 5 lines)\n for (let lineNum = heading.line; lineNum >= Math.max(0, heading.line - 5); lineNum--) {\n if (explicitSectionIds.has(lineNum)) {\n sectionId = explicitSectionIds.get(lineNum)!;\n break;\n }\n }\n\n // If no explicit ID, generate from heading text\n if (!sectionId) {\n sectionId = this.generateSectionId(heading.text);\n }\n\n // Validate section ID\n this.validateSectionId(sectionId, heading.line + 1);\n\n // Check for duplicate section IDs\n if (encounteredSectionIds.has(sectionId)) {\n throw new ParseError(\n `Duplicate section ID '${sectionId}' at line ${heading.line + 1}. ` +\n `Section IDs must be unique.`\n );\n }\n encounteredSectionIds.add(sectionId);\n\n // Determine section content boundaries\n const sectionStart = heading.index;\n const nextHeading = headingMatches[i + 1];\n const sectionEnd = nextHeading ? nextHeading.index : content.length;\n\n // Extract section content\n const sectionContent = content.substring(sectionStart, sectionEnd).trim();\n\n sections.set(sectionId, {\n id: sectionId,\n headingText: heading.text,\n content: sectionContent,\n startLine: heading.line,\n endLine: content.substring(0, sectionEnd).split('\\n').length - 1,\n headingLevel: heading.level\n });\n }\n\n return sections;\n }\n\n /**\n * Apply overrides and merge parent/child sections.\n */\n async applyOverrides(\n parentSections: Map<string, SectionInfo>,\n childSections: Map<string, SectionInfo>,\n overrides: Record<string, string | null>,\n baseDir: string,\n verbose: boolean = false,\n fileSystem?: IFileSystem\n ): Promise<string> {\n // Start with parent sections as base\n const mergedSections = new Map<string, SectionInfo>(parentSections);\n\n // Apply overrides\n for (const [sectionId, overridePath] of Object.entries(overrides)) {\n if (!mergedSections.has(sectionId)) {\n // Override references a section that doesn't exist in parent\n if (verbose) {\n const available = Array.from(mergedSections.keys()).sort().join(', ');\n console.log(\n `Warning: Override section '${sectionId}' not found in parent. Available: ${available}`\n );\n }\n continue;\n }\n\n if (overridePath === null) {\n // Remove section\n mergedSections.delete(sectionId);\n if (verbose) {\n console.log(` - Removing section '${sectionId}'`);\n }\n } else {\n // Replace section with content from file\n try {\n const overrideContent = await this.loadOverrideContent(overridePath, baseDir, fileSystem);\n\n const originalSection = mergedSections.get(sectionId)!;\n mergedSections.set(sectionId, {\n ...originalSection,\n content: overrideContent\n });\n\n if (verbose) {\n console.log(` - Replacing section '${sectionId}' with content from ${overridePath}`);\n }\n } catch (error) {\n throw new Error(\n `Failed to apply override for section '${sectionId}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n // Merge child sections (child overrides parent for matching IDs)\n for (const [sectionId, childSection] of childSections.entries()) {\n mergedSections.set(sectionId, childSection);\n\n if (verbose && parentSections.has(sectionId)) {\n console.log(` - Child overrides parent section '${sectionId}'`);\n } else if (verbose) {\n console.log(` - Adding child section '${sectionId}'`);\n }\n }\n\n // Reconstruct content from merged sections\n const contentParts: string[] = [];\n for (const section of mergedSections.values()) {\n contentParts.push(section.content);\n }\n\n return contentParts.join('\\n\\n');\n }\n\n /**\n * Load override content from a file.\n */\n async loadOverrideContent(overridePath: string, baseDir: string, fileSystem?: IFileSystem): Promise<string> {\n // @prompd/core always uses an injected file system (MemoryFileSystem in the\n // browser/server). The Node CLI provides NodeFileSystem.\n if (!fileSystem) {\n throw new Error('A fileSystem is required to load section override content.');\n }\n\n // Security: Validate and resolve path using the file system's own path style\n // (cross-platform; the in-memory FS is POSIX, NodeFileSystem is OS-native).\n const resolvedPath = this.resolveOverridePath(overridePath, baseDir, fileSystem);\n\n if (!(await fileSystem.exists(resolvedPath))) {\n throw new Error(`Override file not found: ${resolvedPath}`);\n }\n\n try {\n const content = await fileSystem.readFile(resolvedPath);\n // Security: cap override file size (DoS protection).\n if (content.length > SectionOverrideProcessor.MAX_OVERRIDE_SIZE) {\n throw new SecurityError(\n `Override file too large: ${content.length} bytes (max: ${SectionOverrideProcessor.MAX_OVERRIDE_SIZE})`\n );\n }\n return content.trim();\n } catch (error) {\n if (error instanceof SecurityError) throw error;\n throw new Error(\n `Failed to read override file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Resolve override path with security checks.\n */\n private resolveOverridePath(overridePath: string, baseDir: string, fileSystem: IFileSystem): string {\n // Security: Path traversal protection (string check, separator-agnostic).\n const cleaned = overridePath.replace(/\\\\/g, '/');\n if (cleaned.includes('..') && !cleaned.startsWith('./') && !cleaned.startsWith('../')) {\n throw new SecurityError(`Path traversal detected in override path: ${overridePath}`);\n }\n\n // Absolute paths (POSIX or Windows drive) are used as-is — the caller owns them.\n if (isAbsolutePosix(cleaned) || /^[A-Za-z]:/.test(overridePath)) {\n return overridePath;\n }\n\n // Resolve relative to baseDir via the file system's own path semantics.\n const resolved = fileSystem.resolve(baseDir, overridePath);\n\n // Security: ensure the resolved path stays within the base directory.\n const baseResolved = fileSystem.resolve(baseDir);\n const resolvedNorm = resolved.replace(/\\\\/g, '/');\n const baseNorm = baseResolved.replace(/\\\\/g, '/');\n if (!resolvedNorm.startsWith(baseNorm)) {\n throw new SecurityError(`Override path escapes base directory: ${overridePath}`);\n }\n\n return resolved;\n }\n\n /**\n * Generate a section ID from heading text (kebab-case).\n */\n private generateSectionId(headingText: string): string {\n return headingText\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove non-alphanumeric except spaces and hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\n }\n\n /**\n * Validate section ID format.\n */\n private validateSectionId(sectionId: string, lineNumber?: number): void {\n // Security: Reject IDs that might be used for code injection (check first)\n const dangerousPatterns = ['__proto__', 'constructor', 'prototype'];\n if (dangerousPatterns.some(pattern => sectionId.includes(pattern))) {\n throw new SecurityError(`Section ID contains forbidden pattern: ${sectionId}`);\n }\n\n // Security: Check for excessively long IDs (potential DoS)\n if (sectionId.length > 100) {\n throw new ValidationError(`Section ID too long: ${sectionId.length} characters (max: 100)`);\n }\n\n // Section IDs must be kebab-case (lowercase letters, numbers, hyphens)\n const validPattern = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;\n\n if (!validPattern.test(sectionId)) {\n const location = lineNumber ? ` at line ${lineNumber}` : '';\n throw new ValidationError(\n `Invalid section ID '${sectionId}'${location}. ` +\n `Section IDs must be kebab-case (lowercase letters, numbers, hyphens only).`\n );\n }\n }\n}\n","/**\n * Language Mapping Utilities\n *\n * Centralized file extension to programming language mappings\n * used across the compilation pipeline for:\n * - Wrapping extracted code files in markdown code blocks\n * - Filtering code blocks based on context file types\n */\n\n/**\n * Map of file extensions to primary markdown code block language identifier.\n * Used when wrapping extracted code files in markdown code blocks.\n */\nexport const EXTENSION_TO_LANGUAGE: Record<string, string> = {\n // TypeScript/JavaScript\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n // Python\n '.py': 'python',\n '.pyw': 'python',\n // Go\n '.go': 'go',\n // Rust\n '.rs': 'rust',\n // Java/Kotlin\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n // C/C++\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.hpp': 'cpp',\n '.cc': 'cpp',\n // C#\n '.cs': 'csharp',\n // Ruby\n '.rb': 'ruby',\n // PHP\n '.php': 'php',\n // Swift\n '.swift': 'swift',\n // Shell\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'zsh',\n '.fish': 'fish',\n // SQL\n '.sql': 'sql',\n // Web\n '.html': 'html',\n '.htm': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'sass',\n '.less': 'less',\n // Data formats\n '.xml': 'xml',\n '.svg': 'xml',\n '.json': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'toml',\n '.csv': 'csv',\n // Markdown\n '.md': 'markdown',\n '.mdx': 'markdown',\n};\n\n/**\n * Map of file extensions to all valid code block language identifiers.\n * Used when filtering code blocks - includes aliases (e.g., 'ts' for 'typescript').\n */\nexport const EXTENSION_TO_LANGUAGE_ALIASES: Record<string, string[]> = {\n // TypeScript/JavaScript\n '.ts': ['typescript', 'ts'],\n '.tsx': ['typescript', 'tsx', 'ts'],\n '.js': ['javascript', 'js'],\n '.jsx': ['javascript', 'jsx', 'js'],\n '.mjs': ['javascript', 'js'],\n '.cjs': ['javascript', 'js'],\n // Python\n '.py': ['python', 'py'],\n '.pyw': ['python', 'py'],\n // Go\n '.go': ['go', 'golang'],\n // Rust\n '.rs': ['rust', 'rs'],\n // Java/Kotlin\n '.java': ['java'],\n '.kt': ['kotlin', 'kt'],\n '.kts': ['kotlin', 'kt'],\n // C/C++\n '.c': ['c'],\n '.h': ['c', 'h'],\n '.cpp': ['cpp', 'c++', 'cxx'],\n '.hpp': ['cpp', 'c++', 'hpp'],\n '.cc': ['cpp', 'c++'],\n // C#\n '.cs': ['csharp', 'cs', 'c#'],\n // Ruby\n '.rb': ['ruby', 'rb'],\n // PHP\n '.php': ['php'],\n // Swift\n '.swift': ['swift'],\n // Shell\n '.sh': ['bash', 'sh', 'shell'],\n '.bash': ['bash', 'sh', 'shell'],\n '.zsh': ['zsh', 'sh', 'shell'],\n '.fish': ['fish'],\n // SQL\n '.sql': ['sql'],\n // Web\n '.html': ['html', 'htm'],\n '.htm': ['html', 'htm'],\n '.css': ['css'],\n '.scss': ['scss', 'sass'],\n '.sass': ['sass', 'scss'],\n '.less': ['less'],\n // Data formats\n '.json': ['json'],\n '.yaml': ['yaml', 'yml'],\n '.yml': ['yaml', 'yml'],\n '.xml': ['xml'],\n '.svg': ['xml', 'svg'],\n '.toml': ['toml'],\n '.csv': ['csv'],\n // Markdown\n '.md': ['markdown', 'md'],\n '.mdx': ['mdx', 'markdown', 'md'],\n};\n\n/**\n * Get the primary language identifier for a file extension.\n * @param ext - File extension (e.g., '.ts')\n * @returns Primary language identifier or undefined\n */\nexport function getLanguageForExtension(ext: string): string | undefined {\n return EXTENSION_TO_LANGUAGE[ext.toLowerCase()];\n}\n\n/**\n * Get all valid language identifiers (including aliases) for a file extension.\n * @param ext - File extension (e.g., '.ts')\n * @returns Array of language identifiers or empty array\n */\nexport function getLanguageAliasesForExtension(ext: string): string[] {\n return EXTENSION_TO_LANGUAGE_ALIASES[ext.toLowerCase()] || [];\n}\n","/**\n * Custom Nunjucks Loader for Prompd Files\n *\n * This loader enables {% include %} directives in .prmd files with compile-aware behavior:\n * - .prmd files: Parses and returns only the body content (frontmatter stripped)\n * - Other files (.md, .txt, etc.): Returns raw content as-is\n *\n * Features:\n * - Workspace-aware path resolution (relative to source file)\n * - Circular include detection\n * - Compile-on-demand for .prmd files\n */\n\nimport * as nunjucks from 'nunjucks';\nimport { IFileSystem } from './file-system';\nimport { PrompdParser } from '../parser';\nimport { extname, isAbsolutePosix, isPrompdFile, PROMPD_EXTENSIONS } from './path-utils';\n\n/**\n * Global include stack shared across all loader instances.\n * This is necessary because Nunjucks creates new loader instances for nested includes,\n * but we need to track the entire include chain to detect circular dependencies.\n *\n * The stack is keyed by a unique compilation ID to support concurrent compilations.\n */\nconst globalIncludeStacks = new Map<string, Set<string>>();\n\n/**\n * Generate a unique compilation ID.\n */\nlet compilationCounter = 0;\nfunction generateCompilationId(): string {\n return `compile-${++compilationCounter}-${Date.now()}`;\n}\n\n/**\n * Options for the Prompd loader.\n */\nexport interface PrompdLoaderOptions {\n /** File system abstraction (real FS or in-memory) */\n fileSystem: IFileSystem;\n /** Base directory for resolving relative paths */\n baseDir: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Maximum include depth to prevent infinite recursion */\n maxDepth?: number;\n /** Unique compilation ID for tracking include stack across loader instances */\n compilationId?: string;\n}\n\n/**\n * Loader result with source content and metadata.\n * Matches Nunjucks LoaderSource interface.\n */\ninterface LoaderResult {\n src: string;\n path: string;\n noCache: boolean;\n}\n\n/**\n * Custom Nunjucks loader that handles .prmd files specially.\n *\n * When a .prmd file is included, this loader:\n * 1. Parses the frontmatter\n * 2. Extracts only the body content\n * 3. Returns the body for inclusion\n *\n * This allows prompts to be composed from other prompts without\n * duplicating frontmatter or metadata.\n */\nexport class PrompdLoader extends nunjucks.Loader {\n // Required by Nunjucks loader interface - we use synchronous loading\n async = false;\n\n private fileSystem: IFileSystem;\n private baseDir: string;\n private verbose: boolean;\n private maxDepth: number;\n private parser: PrompdParser;\n private compilationId: string;\n\n constructor(options: PrompdLoaderOptions) {\n super();\n this.fileSystem = options.fileSystem;\n this.baseDir = options.baseDir;\n this.verbose = options.verbose || false;\n this.maxDepth = options.maxDepth || 10;\n this.parser = new PrompdParser();\n\n // Use provided compilation ID or generate a new one\n // The compilation ID links all loader instances in a single compilation\n this.compilationId = options.compilationId || generateCompilationId();\n\n // Initialize global stack for this compilation if needed\n if (!globalIncludeStacks.has(this.compilationId)) {\n globalIncludeStacks.set(this.compilationId, new Set());\n }\n }\n\n /**\n * Get the include stack for this compilation.\n */\n private getIncludeStack(): Set<string> {\n return globalIncludeStacks.get(this.compilationId) || new Set();\n }\n\n /**\n * Clean up the global stack after compilation is complete.\n * Should be called when the top-level compilation finishes.\n */\n static cleanupCompilation(compilationId: string): void {\n globalIncludeStacks.delete(compilationId);\n }\n\n /**\n * Get the source content for a template.\n * This is the main entry point called by Nunjucks.\n * Throws an error if the file is not found (required by Nunjucks interface).\n */\n getSource(name: string): LoaderResult {\n // Resolve path relative to base directory\n const resolvedPath = this.resolvePath(name);\n const includeStack = this.getIncludeStack();\n\n if (this.verbose) {\n console.log(`[include] Resolving: ${name} -> ${resolvedPath}`);\n }\n\n // Check for circular includes\n if (includeStack.has(resolvedPath)) {\n const stack = Array.from(includeStack).join(' -> ');\n throw new Error(\n `Circular include detected: ${stack} -> ${resolvedPath}`\n );\n }\n\n // Check max depth\n if (includeStack.size >= this.maxDepth) {\n throw new Error(\n `Maximum include depth (${this.maxDepth}) exceeded. Check for deep nesting or circular includes.`\n );\n }\n\n // Check if file exists\n const exists = this.fileSystem.exists(resolvedPath);\n if (typeof exists === 'object' && 'then' in exists) {\n // Async not supported in getSource - throw helpful error\n throw new Error(\n 'PrompdLoader requires synchronous file system operations. Use NodeFileSystem or ensure MemoryFileSystem is pre-populated.'\n );\n }\n\n if (!exists) {\n // Try Prompd source extensions if none was specified (.prmd, then .md)\n if (!isPrompdFile(resolvedPath)) {\n for (const ext of PROMPD_EXTENSIONS) {\n const withExt = resolvedPath + ext;\n if (this.fileSystem.exists(withExt) === true) {\n return this.loadFile(withExt);\n }\n }\n }\n\n // Nunjucks expects an error to be thrown for missing files\n throw new Error(`Template not found: ${name} (resolved to ${resolvedPath})`);\n }\n\n return this.loadFile(resolvedPath);\n }\n\n /**\n * Load and process a file.\n * Note: We do NOT remove from stack after loading because Nunjucks will process\n * the returned content which may contain more includes. The stack tracks the\n * entire include chain during a single compilation.\n */\n private loadFile(filePath: string): LoaderResult {\n const includeStack = this.getIncludeStack();\n\n // Add to include stack - this persists for the entire compilation\n includeStack.add(filePath);\n\n // Read file content\n const content = this.fileSystem.readFile(filePath);\n if (typeof content === 'object' && 'then' in content) {\n throw new Error(\n 'PrompdLoader requires synchronous file system operations.'\n );\n }\n\n // Process based on file extension\n const ext = extname(filePath).toLowerCase();\n let processedContent: string;\n\n if (isPrompdFile(filePath)) {\n // Parse Prompd source (.prmd or .md) and extract body only. For a .md\n // without frontmatter, processPrompdFile returns the content unchanged.\n processedContent = this.processPrompdFile(content, filePath);\n } else {\n // Return raw content for other file types\n processedContent = content;\n }\n\n if (this.verbose) {\n const preview = processedContent.substring(0, 50).replace(/\\n/g, '\\\\n');\n console.log(`[include] Loaded ${ext} file: ${filePath} (${preview}...)`);\n }\n\n return {\n src: processedContent,\n path: filePath,\n noCache: true // Don't cache - files may change\n };\n }\n\n /**\n * Process a .prmd file: parse frontmatter and return only the body.\n */\n private processPrompdFile(content: string, filePath: string): string {\n try {\n const parsed = this.parser.parseContent(content);\n\n if (this.verbose) {\n const paramCount = parsed.metadata?.parameters?.length || 0;\n console.log(`[include] Parsed .prmd: ${filePath} (${paramCount} params)`);\n }\n\n // Return just the body content (after frontmatter)\n // If no body, return empty string\n return parsed.content || '';\n } catch (error) {\n // If parsing fails, log warning and return raw content\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (this.verbose) {\n console.log(`[include] Warning: Failed to parse ${filePath}: ${errorMessage}`);\n }\n\n // Fall back to raw content minus frontmatter\n // Simple regex to strip frontmatter\n const withoutFrontmatter = content.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '');\n return withoutFrontmatter;\n }\n }\n\n /**\n * Resolve a path relative to the base directory.\n */\n private resolvePath(name: string): string {\n // Handle absolute paths\n if (isAbsolutePosix(name)) {\n return name;\n }\n\n // Handle relative paths (./file.prmd, ../file.prmd, file.prmd)\n return this.fileSystem.join(this.baseDir, name);\n }\n\n /**\n * Create a child loader for nested includes.\n * The child loader shares the compilation ID to use the same include stack.\n */\n createChildLoader(newBaseDir: string): PrompdLoader {\n return new PrompdLoader({\n fileSystem: this.fileSystem,\n baseDir: newBaseDir,\n verbose: this.verbose,\n maxDepth: this.maxDepth,\n compilationId: this.compilationId // Share the compilation ID for cycle detection\n });\n }\n\n /**\n * Get the compilation ID for this loader.\n * Useful for cleanup after compilation.\n */\n getCompilationId(): string {\n return this.compilationId;\n }\n}\n\n/**\n * Create a Nunjucks environment configured with the Prompd loader.\n *\n * @param options - Loader options\n * @returns Configured Nunjucks environment\n */\nexport function createPrompdEnvironment(options: PrompdLoaderOptions): nunjucks.Environment {\n const loader = new PrompdLoader(options);\n\n const env = new nunjucks.Environment(loader, {\n autoescape: false,\n throwOnUndefined: false,\n trimBlocks: true,\n lstripBlocks: true,\n tags: {\n blockStart: '{%',\n blockEnd: '%}',\n variableStart: '{{',\n variableEnd: '}}',\n commentStart: '{#',\n commentEnd: '#}'\n }\n });\n\n return env;\n}\n","/**\r\n * Template Processing Stage\r\n *\r\n * Processes Jinja2/Nunjucks templates, package references, and section overrides.\r\n * This is the most complex stage, handling:\r\n * - Nunjucks template rendering with custom filters (fromcsv, fromjson, tojson, lines)\r\n * - Package reference resolution and content injection\r\n * - Inheritance processing with section-aware merging\r\n * - Enhanced variable substitution with nested property access\r\n */\r\n\r\nimport * as nunjucks from 'nunjucks';\r\nimport { CompilerStage, CompilationContext } from '../types';\r\nimport { PrompdParser } from '../../parser';\r\nimport { SectionOverrideProcessor } from '../section-override';\r\nimport { resolvePackageFile } from '../package-ref';\r\nimport { getLanguageAliasesForExtension } from '../language-map';\r\nimport { PrompdLoader } from '../prompd-loader';\r\nimport { extname, resolvePosix, basenamePosix, isPrompdFile } from '../path-utils';\r\nimport { resolveDateValue } from '../date-utils';\r\n\r\nexport class TemplateProcessingStage implements CompilerStage {\r\n private sectionProcessor: SectionOverrideProcessor;\r\n private nunjucksEnv: nunjucks.Environment;\r\n\r\n constructor() {\r\n this.sectionProcessor = new SectionOverrideProcessor();\r\n\r\n // Configure Nunjucks to use double braces for variables (standard Jinja2/Nunjucks syntax)\r\n this.nunjucksEnv = new nunjucks.Environment(null, {\r\n autoescape: false, // Don't escape HTML - we're doing markdown\r\n throwOnUndefined: false, // Gracefully handle missing variables\r\n trimBlocks: true,\r\n lstripBlocks: true,\r\n tags: {\r\n blockStart: '{%',\r\n blockEnd: '%}',\r\n variableStart: '{{',\r\n variableEnd: '}}',\r\n commentStart: '{#',\r\n commentEnd: '#}'\r\n }\r\n });\r\n\r\n // Register custom filters\r\n this.registerFilters();\r\n }\r\n\r\n /**\r\n * Register custom Jinja2/Nunjucks filters for data transformation.\r\n */\r\n private registerFilters(): void {\r\n // fromcsv - Parse CSV string into array of objects\r\n this.nunjucksEnv.addFilter('fromcsv', (csvString: string) => {\r\n if (!csvString || typeof csvString !== 'string') {\r\n return [];\r\n }\r\n return this.parseCsv(csvString);\r\n });\r\n\r\n // fromjson - Parse JSON string into object/array.\r\n // If the value is already a parsed object or array (e.g. from a JSON params file),\r\n // pass it through unchanged instead of returning null.\r\n this.nunjucksEnv.addFilter('fromjson', (value: unknown) => {\r\n if (value === null || value === undefined) return null;\r\n if (typeof value !== 'string') return value; // already parsed\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n\r\n // tojson - Convert object to JSON string\r\n this.nunjucksEnv.addFilter('tojson', (obj: unknown, indent?: number) => {\r\n try {\r\n return JSON.stringify(obj, null, indent);\r\n } catch {\r\n return '{}';\r\n }\r\n });\r\n\r\n // lines - Split string into array of lines\r\n this.nunjucksEnv.addFilter('lines', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return [];\r\n }\r\n return str.split(/\\r?\\n/);\r\n });\r\n\r\n // dedent - Remove common leading whitespace from text\r\n this.nunjucksEnv.addFilter('dedent', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const lines = str.split(/\\r?\\n/);\r\n // Find minimum indentation (ignoring empty lines)\r\n let minIndent = Infinity;\r\n for (const line of lines) {\r\n if (line.trim().length === 0) continue;\r\n const match = line.match(/^(\\s*)/);\r\n if (match && match[1].length < minIndent) {\r\n minIndent = match[1].length;\r\n }\r\n }\r\n if (minIndent === Infinity) minIndent = 0;\r\n // Remove the common indent from all lines\r\n return lines.map(line => line.slice(minIndent)).join('\\n');\r\n });\r\n\r\n // truncate - Truncate string with ellipsis\r\n this.nunjucksEnv.addFilter('truncate', (str: string, length: number = 80, suffix: string = '...') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n if (str.length <= length) {\r\n return str;\r\n }\r\n return str.slice(0, length - suffix.length) + suffix;\r\n });\r\n\r\n // codeblock - Wrap content in fenced code block\r\n this.nunjucksEnv.addFilter('codeblock', (str: string, language: string = '') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n return '```' + language + '\\n' + str + '\\n```';\r\n });\r\n\r\n // unique - Remove duplicate items from array\r\n this.nunjucksEnv.addFilter('unique', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return [...new Set(arr)];\r\n });\r\n\r\n // pluck - Extract single field from array of objects\r\n this.nunjucksEnv.addFilter('pluck', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.map(item => item?.[field]).filter(v => v !== undefined);\r\n });\r\n\r\n // where - Filter objects by field value\r\n this.nunjucksEnv.addFilter('where', (arr: Record<string, unknown>[], field: string, value: unknown) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.filter(item => item?.[field] === value);\r\n });\r\n\r\n // groupby - Group array items by field value\r\n this.nunjucksEnv.addFilter('groupby', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return {};\r\n }\r\n const result: Record<string, Record<string, unknown>[]> = {};\r\n for (const item of arr) {\r\n const key = String(item?.[field] ?? 'undefined');\r\n if (!result[key]) {\r\n result[key] = [];\r\n }\r\n result[key].push(item);\r\n }\r\n return result;\r\n });\r\n\r\n // shuffle - Randomize array order\r\n this.nunjucksEnv.addFilter('shuffle', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled;\r\n });\r\n\r\n // sample - Pick random N items from array\r\n this.nunjucksEnv.addFilter('sample', (arr: unknown[], count: number = 1) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled.slice(0, Math.min(count, shuffled.length));\r\n });\r\n\r\n // wordwrap - Wrap text at specified width\r\n this.nunjucksEnv.addFilter('wordwrap', (str: string, width: number = 80) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const words = str.split(/\\s+/);\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n for (const word of words) {\r\n if (currentLine.length + word.length + 1 <= width) {\r\n currentLine += (currentLine ? ' ' : '') + word;\r\n } else {\r\n if (currentLine) lines.push(currentLine);\r\n currentLine = word;\r\n }\r\n }\r\n if (currentLine) lines.push(currentLine);\r\n return lines.join('\\n');\r\n });\r\n\r\n // bulletlist - Convert array/lines to bullet list\r\n this.nunjucksEnv.addFilter('bulletlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map(item => `- ${item}`).join('\\n');\r\n });\r\n\r\n // numberedlist - Convert array/lines to numbered list\r\n this.nunjucksEnv.addFilter('numberedlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map((item, i) => `${i + 1}. ${item}`).join('\\n');\r\n });\r\n }\r\n\r\n /**\r\n * Parse CSV string into array of record objects.\r\n */\r\n private parseCsv(csvString: string): Record<string, string>[] {\r\n const lines = csvString.trim().split(/\\r?\\n/);\r\n if (lines.length === 0) {\r\n return [];\r\n }\r\n\r\n // Parse header row\r\n const headers = this.parseCsvLine(lines[0]);\r\n\r\n // Parse data rows\r\n const records: Record<string, string>[] = [];\r\n for (let i = 1; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n if (!line) continue; // Skip empty lines\r\n\r\n const values = this.parseCsvLine(line);\r\n const record: Record<string, string> = {};\r\n\r\n for (let j = 0; j < headers.length; j++) {\r\n const header = headers[j].trim();\r\n const value = values[j]?.trim() ?? '';\r\n record[header] = value;\r\n }\r\n\r\n records.push(record);\r\n }\r\n\r\n return records;\r\n }\r\n\r\n /**\r\n * Parse a single CSV line, handling quoted values.\r\n */\r\n private parseCsvLine(line: string): string[] {\r\n const result: string[] = [];\r\n let current = '';\r\n let inQuotes = false;\r\n\r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n\r\n if (char === '\"') {\r\n if (inQuotes && line[i + 1] === '\"') {\r\n // Escaped quote\r\n current += '\"';\r\n i++;\r\n } else {\r\n // Toggle quote mode\r\n inQuotes = !inQuotes;\r\n }\r\n } else if (char === ',' && !inQuotes) {\r\n result.push(current);\r\n current = '';\r\n } else {\r\n current += char;\r\n }\r\n }\r\n\r\n result.push(current);\r\n return result;\r\n }\r\n\r\n async process(context: CompilationContext): Promise<void> {\r\n if (!context.content) {\r\n return;\r\n }\r\n\r\n let content = context.content;\r\n\r\n // Step 1: Process package references with prefixes (e.g., @security/prompts/audit)\r\n if (context.dependencies.imports) {\r\n content = await this.processPackageReferences(context, content);\r\n }\r\n\r\n // Step 2: Process inheritance with section-aware override support\r\n if (context.dependencies.inherits) {\r\n content = await this.processInheritance(context, content);\r\n }\r\n\r\n // Step 3: Process standalone overrides (without inheritance)\r\n if (context.metadata?.override && !context.dependencies.inherits) {\r\n content = await this.processStandaloneOverrides(context, content);\r\n }\r\n\r\n // Step 4: Filter code blocks based on context file types\r\n // If context files are attached, only keep code blocks that match those file extensions\r\n if (context.metadata?.context) {\r\n content = this.filterCodeBlocksByContext(context, content);\r\n }\r\n\r\n // Step 5: Process templates with Jinja2/Nunjucks\r\n content = await this.processTemplate(context, content);\r\n\r\n context.content = content;\r\n }\r\n\r\n /**\r\n * Process package references (e.g., @prefix/path/to/file).\r\n */\r\n private async processPackageReferences(context: CompilationContext, content: string): Promise<string> {\r\n if (!context.dependencies.imports) {\r\n return content;\r\n }\r\n\r\n for (const [packageRef, packageInfo] of Object.entries(context.dependencies.imports)) {\r\n if (!packageInfo.prefix || !packageInfo.path) {\r\n continue;\r\n }\r\n\r\n const prefix = packageInfo.prefix;\r\n const packagePath = packageInfo.path;\r\n\r\n // Replace references like @security/prompts/audit with actual content\r\n // Pattern: @prefix/path/to/resource\r\n const pattern = new RegExp(`@${this.escapeRegex(prefix)}/([^\\\\s]+)`, 'g');\r\n\r\n // Find all matches first\r\n const matches: Array<{ match: string; resourcePath: string; index: number }> = [];\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n matches.push({\r\n match: match[0],\r\n resourcePath: match[1],\r\n index: match.index\r\n });\r\n }\r\n\r\n // Replace in reverse order to preserve indices\r\n for (let i = matches.length - 1; i >= 0; i--) {\r\n const m = matches[i];\r\n const replacement = await this.loadPackageResource(context, packagePath, m.resourcePath, prefix);\r\n content = content.substring(0, m.index) + replacement + content.substring(m.index + m.match.length);\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Load a resource from a package.\r\n */\r\n private async loadPackageResource(\r\n context: CompilationContext,\r\n packagePath: string,\r\n resourcePath: string,\r\n prefix: string\r\n ): Promise<string> {\r\n try {\r\n const fs = context.fileSystem;\r\n // Try different extensions\r\n const possibleExtensions = ['', '.prmd', '.md', '.txt'];\r\n\r\n for (const ext of possibleExtensions) {\r\n const filePath = resolvePackageFile(packagePath, resourcePath + ext);\r\n\r\n if (await fs.exists(filePath)) {\r\n const contentData = await fs.readFile(filePath);\r\n\r\n // If it's a Prompd source (.prmd/.md), parse and extract content\r\n if (isPrompdFile(filePath)) {\r\n const parser = new PrompdParser();\r\n try {\r\n const parsed = parser.parseContent(contentData);\r\n // Return just the content part, not metadata\r\n return parsed.content || `# Content from @${prefix}/${resourcePath}`;\r\n } catch {\r\n // If parsing fails, return raw content\r\n return contentData;\r\n }\r\n } else {\r\n // For other files, return as-is\r\n return contentData;\r\n }\r\n }\r\n }\r\n\r\n // File not found\r\n if (context.verbose) {\r\n console.log(`Warning: Could not find @${prefix}/${resourcePath} in ${packagePath}`);\r\n }\r\n return `[Not found: @${prefix}/${resourcePath}]`;\r\n } catch (error) {\r\n if (context.verbose) {\r\n console.log(`Warning: Failed to load @${prefix}/${resourcePath}: ${error}`);\r\n }\r\n return `[Error loading @${prefix}/${resourcePath}]`;\r\n }\r\n }\r\n\r\n /**\r\n * Process inheritance with section-aware merging.\r\n */\r\n private async processInheritance(context: CompilationContext, content: string): Promise<string> {\r\n const parentPath = context.dependencies.inherits;\r\n if (!parentPath) {\r\n return content;\r\n }\r\n\r\n try {\r\n const fs = context.fileSystem;\r\n const parser = new PrompdParser();\r\n let parentFile: string | null = null;\r\n\r\n // Check if it's a direct file path\r\n if (isPrompdFile(parentPath) && await fs.exists(parentPath)) {\r\n parentFile = parentPath;\r\n } else if (await fs.exists(parentPath) && await fs.isDirectory(parentPath)) {\r\n // Package directory - find main Prompd source file (.prmd or .md)\r\n const files = (await fs.readdir(parentPath)).filter((f: string) => isPrompdFile(f));\r\n\r\n if (files.length > 0) {\r\n // Look for main.prmd / main.md first\r\n const mainFile = files.find((f: string) => f === 'main.prmd' || f === 'main.md');\r\n parentFile = fs.join(parentPath, mainFile || files[0]);\r\n }\r\n }\r\n\r\n if (!parentFile) {\r\n // Find location of 'inherits:' in source for accurate error positioning\r\n const location = context.findLocation(/inherits:/);\r\n context.addDiagnostic({\r\n message: `Could not find inherited file: ${parentPath}`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'INHERITED_FILE_NOT_FOUND',\r\n ...location\r\n });\r\n return content;\r\n }\r\n\r\n // Parse parent file - read content from file system\r\n const parentFileContent = await fs.readFile(parentFile);\r\n const parentData = parser.parseContent(parentFileContent);\r\n\r\n // Validate that all file references in the parent's metadata actually exist on disk.\r\n // AssetExtractionStage only processes the child's metadata, so the parent's file\r\n // references (system:, context:, etc.) must be validated here.\r\n await this.validateParentFileReferences(context, parentData.metadata as unknown as Record<string, unknown>, fs, parentFile);\r\n\r\n // If validation added errors, stop inheritance processing\r\n if (context.hasErrors()) {\r\n return content;\r\n }\r\n\r\n // Resolve relative {% include %} paths in parent content to absolute paths.\r\n // This is necessary because the parent's includes are relative to the parent's\r\n // directory, but after merging into the child, Nunjucks will resolve them\r\n // relative to the child's directory (which may be different).\r\n if (parentData.content) {\r\n const parentDir = fs.dirname(parentFile);\r\n parentData.content = this.resolveIncludePaths(parentData.content, parentDir);\r\n }\r\n\r\n // Get overrides from child metadata\r\n const overrides = context.metadata?.override || {};\r\n\r\n // Process content with section-aware merging\r\n if (parentData.content || content) {\r\n if (Object.keys(overrides).length > 0) {\r\n // Section-aware override processing\r\n try {\r\n // Extract sections from parent and child\r\n const parentSections = parentData.content\r\n ? this.sectionProcessor.extractSections(parentData.content)\r\n : new Map();\r\n const childSections = content\r\n ? this.sectionProcessor.extractSections(content)\r\n : new Map();\r\n\r\n // Determine base directory for resolving override files\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n\r\n // Apply overrides and merge content\r\n const mergedContent = await this.sectionProcessor.applyOverrides(\r\n parentSections,\r\n childSections,\r\n overrides,\r\n baseDir,\r\n context.verbose,\r\n context.fileSystem\r\n );\r\n\r\n content = mergedContent;\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Applied ${Object.keys(overrides).length} section overrides from parent: ${parentPath}`);\r\n }\r\n } catch (error) {\r\n // Fallback to simple concatenation on error\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Section override processing failed, using simple inheritance: ${errorMessage}`);\r\n\r\n if (parentData.content) {\r\n content = content ? `${parentData.content}\\n\\n${content}` : parentData.content;\r\n }\r\n }\r\n } else {\r\n // No overrides - use simple concatenation (backward compatibility)\r\n if (parentData.content) {\r\n content = content ? `${parentData.content}\\n\\n${content}` : parentData.content;\r\n }\r\n }\r\n }\r\n\r\n // Merge parent parameters (child parameters override)\r\n if (parentData.metadata?.parameters && context.metadata) {\r\n for (const parentParam of parentData.metadata.parameters) {\r\n // Only add parent parameter if not defined in child\r\n const paramExists = context.metadata.parameters?.some(\r\n childParam => childParam.name === parentParam.name\r\n );\r\n\r\n if (!paramExists) {\r\n if (!context.metadata.parameters) {\r\n context.metadata.parameters = [];\r\n }\r\n context.metadata.parameters.push(parentParam);\r\n\r\n // Apply default for inherited param (semantic stage already ran)\r\n if (!(parentParam.name in context.parameters) && parentParam.default !== undefined) {\r\n let value = parentParam.default;\r\n // Coerce string defaults to their declared type (mirrors SemanticAnalysisStage)\r\n if (typeof value === 'string') {\r\n const t = parentParam.type;\r\n if (t === 'json' || t === 'object' || t === 'array') {\r\n try { value = JSON.parse(value); } catch { /* keep as string */ }\r\n } else if (t === 'boolean') {\r\n if (value.toLowerCase() === 'true') value = true;\r\n else if (value.toLowerCase() === 'false') value = false;\r\n } else if (t === 'integer' || t === 'number' || t === 'float') {\r\n const n = Number(value);\r\n if (!isNaN(n)) value = n;\r\n } else if (t === 'date' || t === 'datetime') {\r\n value = resolveDateValue(value, t === 'datetime');\r\n }\r\n }\r\n context.parameters[parentParam.name] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Template inherits from: ${parentPath}`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Failed to process inheritance from ${parentPath}: ${errorMessage}`);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Process standalone overrides (without inheritance).\r\n */\r\n private async processStandaloneOverrides(context: CompilationContext, content: string): Promise<string> {\r\n const overrides = context.metadata?.override;\r\n if (!overrides) {\r\n return content;\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`Processing ${Object.keys(overrides).length} standalone section overrides...`);\r\n }\r\n\r\n try {\r\n // Extract sections from current content\r\n const currentSections = this.sectionProcessor.extractSections(content);\r\n\r\n // Determine base directory for resolving override files\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n\r\n // Apply each override to replace sections in current content\r\n for (const [sectionId, overridePath] of Object.entries(overrides)) {\r\n if (currentSections.has(sectionId)) {\r\n if (overridePath === null) {\r\n // Remove section\r\n currentSections.delete(sectionId);\r\n if (context.verbose) {\r\n console.log(` - Removing section '${sectionId}'`);\r\n }\r\n } else if (typeof overridePath === 'string') {\r\n // Replace section content\r\n try {\r\n const overrideContent = await this.sectionProcessor.loadOverrideContent(\r\n overridePath,\r\n baseDir,\r\n context.fileSystem\r\n );\r\n\r\n // Update section with override content\r\n const originalSection = currentSections.get(sectionId)!;\r\n currentSections.set(sectionId, {\r\n ...originalSection,\r\n content: overrideContent\r\n });\r\n\r\n if (context.verbose) {\r\n console.log(` - Replacing section '${sectionId}' with content from ${overridePath}`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Failed to apply override for section '${sectionId}': ${errorMessage}`);\r\n }\r\n }\r\n } else {\r\n context.addWarning(`Override section '${sectionId}' not found in current content`);\r\n if (context.verbose) {\r\n const available = Array.from(currentSections.keys()).sort().join(', ');\r\n console.log(`Warning: Override section '${sectionId}' not found. Available: ${available}`);\r\n }\r\n }\r\n }\r\n\r\n // Reconstruct content from modified sections\r\n const contentParts: string[] = [];\r\n for (const section of currentSections.values()) {\r\n contentParts.push(section.content);\r\n }\r\n\r\n content = contentParts.join('\\n\\n');\r\n\r\n if (context.verbose) {\r\n console.log(`✓ Applied standalone overrides, final content has ${currentSections.size} sections`);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n context.addWarning(`Standalone override processing failed: ${errorMessage}`);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Filter code blocks in content based on context file types.\r\n *\r\n * When context files are attached (e.g., .ts files), this method filters\r\n * the prompt content to only keep code blocks that match those file types.\r\n *\r\n * Example:\r\n * - If context contains \"typescript-examples.ts\", keep only ```typescript blocks\r\n * - Non-code content and unmatched code blocks are preserved as plain text\r\n *\r\n * @param context - The compilation context with extracted contexts\r\n * @param content - The markdown content to filter\r\n * @returns Filtered content with only matching code blocks\r\n */\r\n private filterCodeBlocksByContext(context: CompilationContext, content: string): string {\r\n // Extract file extensions from context metadata\r\n const contextExtensions = this.extractContextExtensions(context.metadata?.context);\r\n\r\n if (contextExtensions.size === 0) {\r\n // No recognizable file extensions in context, return content unchanged\r\n return content;\r\n }\r\n\r\n // Build set of allowed language identifiers from context extensions\r\n const allowedLanguages = new Set<string>();\r\n for (const ext of contextExtensions) {\r\n const languages = getLanguageAliasesForExtension(ext);\r\n languages.forEach(lang => allowedLanguages.add(lang.toLowerCase()));\r\n }\r\n\r\n if (allowedLanguages.size === 0) {\r\n // No mapped languages found, return content unchanged\r\n return content;\r\n }\r\n\r\n if (context.verbose) {\r\n console.log(`Filtering code blocks for languages: ${Array.from(allowedLanguages).join(', ')}`);\r\n }\r\n\r\n // Parse and filter code blocks\r\n const result = this.filterCodeBlocks(content, allowedLanguages, context.verbose);\r\n\r\n if (context.verbose && result.removedCount > 0) {\r\n console.log(`Removed ${result.removedCount} non-matching code block(s)`);\r\n }\r\n\r\n return result.content;\r\n }\r\n\r\n /**\r\n * Extract file extensions from context metadata.\r\n * Context can be a single file path string or an array of file paths.\r\n */\r\n private extractContextExtensions(contextValue: string | string[] | undefined): Set<string> {\r\n const extensions = new Set<string>();\r\n\r\n if (!contextValue) {\r\n return extensions;\r\n }\r\n\r\n // Normalize to array\r\n const contextFiles = Array.isArray(contextValue) ? contextValue : [contextValue];\r\n\r\n for (const filePath of contextFiles) {\r\n if (typeof filePath === 'string') {\r\n const ext = extname(filePath).toLowerCase();\r\n if (ext) {\r\n extensions.add(ext);\r\n }\r\n }\r\n }\r\n\r\n return extensions;\r\n }\r\n\r\n /**\r\n * Filter code blocks in markdown content, keeping only those with matching languages.\r\n *\r\n * @param content - Markdown content with code blocks\r\n * @param allowedLanguages - Set of allowed language identifiers (lowercase)\r\n * @param verbose - Whether to log filtering actions\r\n * @returns Object with filtered content and count of removed blocks\r\n */\r\n private filterCodeBlocks(\r\n content: string,\r\n allowedLanguages: Set<string>,\r\n verbose: boolean\r\n ): { content: string; removedCount: number } {\r\n // Regex to match fenced code blocks: ```language\\n...content...\\n```\r\n const codeBlockRegex = /```(\\w*)\\n([\\s\\S]*?)```/g;\r\n\r\n let removedCount = 0;\r\n const filteredContent = content.replace(codeBlockRegex, (match, language, blockContent) => {\r\n const lang = (language || '').toLowerCase().trim();\r\n\r\n // If no language specified, keep the block (could be plain text/output)\r\n if (!lang) {\r\n return match;\r\n }\r\n\r\n // Check if language is in allowed set\r\n if (allowedLanguages.has(lang)) {\r\n return match; // Keep matching blocks\r\n }\r\n\r\n // Remove non-matching code blocks\r\n removedCount++;\r\n if (verbose) {\r\n const preview = blockContent.substring(0, 50).replace(/\\n/g, '\\\\n');\r\n console.log(` - Removing \\`\\`\\`${lang} block: \"${preview}...\"`);\r\n }\r\n\r\n // Remove the entire code block (return empty string)\r\n return '';\r\n });\r\n\r\n // Clean up multiple consecutive blank lines that may result from removal\r\n const cleanedContent = filteredContent.replace(/\\n{3,}/g, '\\n\\n');\r\n\r\n return { content: cleanedContent, removedCount };\r\n }\r\n\r\n /**\r\n * Process template with Jinja2/Nunjucks.\r\n * Uses a context-aware environment with PrompdLoader to support {% include %}.\r\n */\r\n private async processTemplate(context: CompilationContext, content: string): Promise<string> {\r\n if (!content) {\r\n return content;\r\n }\r\n\r\n try {\r\n // Create a context-aware Nunjucks environment with the PrompdLoader\r\n // This enables {% include \"file.prmd\" %} directives\r\n const baseDir = context.fileSystem.dirname(context.sourceFile);\r\n const loader = new PrompdLoader({\r\n fileSystem: context.fileSystem,\r\n baseDir: baseDir,\r\n verbose: context.verbose,\r\n maxDepth: 10\r\n });\r\n\r\n const env = new nunjucks.Environment(loader, {\r\n autoescape: false,\r\n throwOnUndefined: false,\r\n trimBlocks: true,\r\n lstripBlocks: true,\r\n tags: {\r\n blockStart: '{%',\r\n blockEnd: '%}',\r\n variableStart: '{{',\r\n variableEnd: '}}',\r\n commentStart: '{#',\r\n commentEnd: '#}'\r\n }\r\n });\r\n\r\n // Register custom filters on this environment\r\n this.registerFiltersOnEnv(env);\r\n\r\n // Security: Set timeout for template rendering (prevent DoS)\r\n const renderTimeout = 5000; // 5 seconds\r\n const renderPromise = new Promise<string>((resolve, reject) => {\r\n try {\r\n const result = env.renderString(content, context.parameters);\r\n resolve(result);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n const timeoutPromise = new Promise<string>((_, reject) => {\r\n timeoutId = setTimeout(() => reject(new Error('Template rendering timeout')), renderTimeout);\r\n });\r\n\r\n try {\r\n content = await Promise.race([renderPromise, timeoutPromise]);\r\n } finally {\r\n clearTimeout(timeoutId!);\r\n }\r\n } catch (error) {\r\n // Report template syntax errors properly\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n\r\n // Try to extract line/column from Nunjucks error message\r\n // Format: \"(unknown path) [Line X, Column Y]\" or similar\r\n const lineMatch = errorMessage.match(/\\[Line (\\d+), Column (\\d+)\\]/i) ||\r\n errorMessage.match(/line (\\d+)/i);\r\n\r\n const line = lineMatch ? parseInt(lineMatch[1], 10) : undefined;\r\n const column = lineMatch && lineMatch[2] ? parseInt(lineMatch[2], 10) : undefined;\r\n\r\n // Add as a compilation error (not just a warning)\r\n context.addDiagnostic({\r\n message: `Template syntax error: ${errorMessage}`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'TEMPLATE_SYNTAX_ERROR',\r\n line,\r\n column\r\n });\r\n\r\n // Still fall back to simple substitution so user sees partial output\r\n // but the error is now properly reported\r\n content = this.enhancedSimpleSubstitution(content, context.parameters);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Resolve relative {% include %} paths in content to absolute paths.\r\n * This ensures that when parent content is merged into a child file,\r\n * the includes still resolve correctly relative to the parent's directory.\r\n */\r\n private resolveIncludePaths(content: string, baseDir: string): string {\r\n // Match {% include \"path\" %} and {% include 'path' %} with relative paths\r\n // Captures: (prefix)(quote)(relativePath)(quote)(suffix) to reconstruct safely\r\n return content.replace(\r\n /(\\{%[-\\s]*include\\s+)([\"'])(\\.[^\"']+)\\2(\\s*[-]?%\\})/g,\r\n (_match, prefix, quote, relativePath, suffix) => {\r\n const absolutePath = resolvePosix(baseDir, relativePath);\r\n // Use forward slashes for cross-platform Nunjucks compatibility\r\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\r\n return `${prefix}${quote}${normalizedPath}${quote}${suffix}`;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Register custom filters on a Nunjucks environment.\r\n */\r\n private registerFiltersOnEnv(env: nunjucks.Environment): void {\r\n // Override built-in string filters to handle undefined/null safely\r\n // This prevents \"Cannot read properties of undefined\" errors when template\r\n // variables are undefined during validation (e.g., package creation)\r\n\r\n // trim - safe version\r\n env.addFilter('trim', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).trim();\r\n });\r\n\r\n // lower - safe version\r\n env.addFilter('lower', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).toLowerCase();\r\n });\r\n\r\n // upper - safe version\r\n env.addFilter('upper', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).toUpperCase();\r\n });\r\n\r\n // capitalize - safe version\r\n env.addFilter('capitalize', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n const s = String(str);\r\n return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\r\n });\r\n\r\n // title - safe version (capitalize each word)\r\n env.addFilter('title', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).replace(/\\b\\w/g, c => c.toUpperCase());\r\n });\r\n\r\n // replace - safe version\r\n env.addFilter('replace', (str: unknown, old: string, newStr: string, count?: number) => {\r\n if (str === undefined || str === null) return '';\r\n const s = String(str);\r\n if (count !== undefined) {\r\n // Replace only 'count' occurrences\r\n let result = s;\r\n let replaced = 0;\r\n while (replaced < count) {\r\n const idx = result.indexOf(old);\r\n if (idx === -1) break;\r\n result = result.slice(0, idx) + newStr + result.slice(idx + old.length);\r\n replaced++;\r\n }\r\n return result;\r\n }\r\n return s.split(old).join(newStr);\r\n });\r\n\r\n // striptags - safe version (remove HTML tags)\r\n env.addFilter('striptags', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return String(str).replace(/<[^>]*>/g, '');\r\n });\r\n\r\n // urlencode - safe version\r\n env.addFilter('urlencode', (str: unknown) => {\r\n if (str === undefined || str === null) return '';\r\n return encodeURIComponent(String(str));\r\n });\r\n\r\n // fromcsv - Parse CSV string into array of objects\r\n env.addFilter('fromcsv', (csvString: string) => {\r\n if (!csvString || typeof csvString !== 'string') {\r\n return [];\r\n }\r\n return this.parseCsv(csvString);\r\n });\r\n\r\n // fromjson - Parse JSON string into object/array.\r\n // If the value is already a parsed object or array (e.g. from a JSON params file),\r\n // pass it through unchanged instead of returning null.\r\n env.addFilter('fromjson', (value: unknown) => {\r\n if (value === null || value === undefined) return null;\r\n if (typeof value !== 'string') return value; // already parsed\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n\r\n // tojson - Convert object to JSON string\r\n env.addFilter('tojson', (obj: unknown, indent?: number) => {\r\n try {\r\n return JSON.stringify(obj, null, indent);\r\n } catch {\r\n return '{}';\r\n }\r\n });\r\n\r\n // lines - Split string into array of lines\r\n env.addFilter('lines', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return [];\r\n }\r\n return str.split(/\\r?\\n/);\r\n });\r\n\r\n // dedent - Remove common leading whitespace from text\r\n env.addFilter('dedent', (str: string) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const lines = str.split(/\\r?\\n/);\r\n let minIndent = Infinity;\r\n for (const line of lines) {\r\n if (line.trim().length === 0) continue;\r\n const match = line.match(/^(\\s*)/);\r\n if (match && match[1].length < minIndent) {\r\n minIndent = match[1].length;\r\n }\r\n }\r\n if (minIndent === Infinity) minIndent = 0;\r\n return lines.map(line => line.slice(minIndent)).join('\\n');\r\n });\r\n\r\n // truncate - Truncate string with ellipsis\r\n env.addFilter('truncate', (str: string, length: number = 80, suffix: string = '...') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n if (str.length <= length) {\r\n return str;\r\n }\r\n return str.slice(0, length - suffix.length) + suffix;\r\n });\r\n\r\n // codeblock - Wrap content in fenced code block\r\n env.addFilter('codeblock', (str: string, language: string = '') => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n return '```' + language + '\\n' + str + '\\n```';\r\n });\r\n\r\n // unique - Remove duplicate items from array\r\n env.addFilter('unique', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return [...new Set(arr)];\r\n });\r\n\r\n // pluck - Extract single field from array of objects\r\n env.addFilter('pluck', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.map(item => item?.[field]).filter(v => v !== undefined);\r\n });\r\n\r\n // where - Filter objects by field value\r\n env.addFilter('where', (arr: Record<string, unknown>[], field: string, value: unknown) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n return arr.filter(item => item?.[field] === value);\r\n });\r\n\r\n // groupby - Group array items by field value\r\n env.addFilter('groupby', (arr: Record<string, unknown>[], field: string) => {\r\n if (!Array.isArray(arr)) {\r\n return {};\r\n }\r\n const result: Record<string, Record<string, unknown>[]> = {};\r\n for (const item of arr) {\r\n const key = String(item?.[field] ?? 'undefined');\r\n if (!result[key]) {\r\n result[key] = [];\r\n }\r\n result[key].push(item);\r\n }\r\n return result;\r\n });\r\n\r\n // shuffle - Randomize array order\r\n env.addFilter('shuffle', (arr: unknown[]) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled;\r\n });\r\n\r\n // sample - Pick random N items from array\r\n env.addFilter('sample', (arr: unknown[], count: number = 1) => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n const shuffled = [...arr];\r\n for (let i = shuffled.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n }\r\n return shuffled.slice(0, Math.min(count, shuffled.length));\r\n });\r\n\r\n // wordwrap - Wrap text at specified width\r\n env.addFilter('wordwrap', (str: string, width: number = 80) => {\r\n if (!str || typeof str !== 'string') {\r\n return '';\r\n }\r\n const words = str.split(/\\s+/);\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n for (const word of words) {\r\n if (currentLine.length + word.length + 1 <= width) {\r\n currentLine += (currentLine ? ' ' : '') + word;\r\n } else {\r\n if (currentLine) lines.push(currentLine);\r\n currentLine = word;\r\n }\r\n }\r\n if (currentLine) lines.push(currentLine);\r\n return lines.join('\\n');\r\n });\r\n\r\n // bulletlist - Convert array/lines to bullet list\r\n env.addFilter('bulletlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map(item => `- ${item}`).join('\\n');\r\n });\r\n\r\n // numberedlist - Convert array/lines to numbered list\r\n env.addFilter('numberedlist', (input: string | unknown[]) => {\r\n const items = Array.isArray(input) ? input : String(input).split(/\\r?\\n/);\r\n return items.filter(item => String(item).trim()).map((item, i) => `${i + 1}. ${item}`).join('\\n');\r\n });\r\n }\r\n\r\n /**\r\n * Enhanced simple substitution with nested property access.\r\n * Supports both single brace {var} and double brace {{var}} syntax for backward compatibility.\r\n */\r\n private enhancedSimpleSubstitution(content: string, parameters: Record<string, any>): string {\r\n // Guard against undefined/null content\r\n if (content === undefined || content === null) {\r\n return '';\r\n }\r\n\r\n // Helper function to resolve nested property path\r\n const resolveValue = (fullPath: string): string | null => {\r\n const parts = fullPath.split('.');\r\n let value: any = parameters[parts[0]];\r\n\r\n if (value === undefined || value === null) {\r\n return null;\r\n }\r\n\r\n try {\r\n for (let i = 1; i < parts.length; i++) {\r\n if (typeof value === 'object' && value !== null) {\r\n value = value[parts[i]];\r\n } else {\r\n return null;\r\n }\r\n if (value === undefined || value === null) {\r\n return null;\r\n }\r\n }\r\n return String(value);\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n // First pass: Handle double braces {{ obj.prop }} (Jinja2/Nunjucks standard)\r\n // Supports optional whitespace and whitespace trimming markers (-~)\r\n content = content.replace(/\\{\\{[-~]?\\s*([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\s*[-~]?\\}\\}/g, (_match, fullPath) => {\r\n const resolved = resolveValue(fullPath);\r\n return resolved !== null ? resolved : `[Missing: ${fullPath}]`;\r\n });\r\n\r\n // Second pass: Handle single braces {obj.prop} (legacy syntax)\r\n // Only match single braces that aren't part of {{ }} or {% %}\r\n content = content.replace(/(?<!\\{)\\{([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)\\}(?!\\})/g, (_match, fullPath) => {\r\n const resolved = resolveValue(fullPath);\r\n return resolved !== null ? resolved : `[Missing: ${fullPath}]`;\r\n });\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Escape special regex characters.\r\n */\r\n private escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n }\r\n\r\n /**\r\n * Validate that all file references in a parent .prmd's metadata actually exist.\r\n * Called during inheritance processing because AssetExtractionStage only runs on\r\n * the child file's metadata — the parent is only parsed, never fully compiled.\r\n */\r\n private async validateParentFileReferences(\r\n context: CompilationContext,\r\n metadata: Record<string, unknown> | null | undefined,\r\n fs: CompilationContext['fileSystem'],\r\n parentFile: string\r\n ): Promise<void> {\r\n if (!metadata) return;\r\n\r\n const metadataAsRecord = metadata as Record<string, unknown>;\r\n const parentDir = fs.dirname(parentFile);\r\n const fileFields = ['system', 'task', 'user', 'assistant', 'response', 'output', 'context'];\r\n\r\n for (const field of fileFields) {\r\n const fieldValue = metadataAsRecord[field];\r\n if (!fieldValue) continue;\r\n\r\n const refs: string[] = Array.isArray(fieldValue)\r\n ? (fieldValue as unknown[]).filter((v): v is string => typeof v === 'string')\r\n : typeof fieldValue === 'string' ? [fieldValue] : [];\r\n\r\n for (const ref of refs) {\r\n if (!ref.startsWith('./') && !ref.startsWith('../')) continue;\r\n\r\n const resolvedPath = fs.resolve(parentDir, ref);\r\n const exists = await Promise.resolve(fs.exists(resolvedPath));\r\n\r\n if (!exists) {\r\n const location = context.findLocation(/inherits:/);\r\n context.addDiagnostic({\r\n message: `Inherited file \"${basenamePosix(parentFile)}\" references missing ${field} file: \"${ref}\" (resolved to: ${resolvedPath})`,\r\n severity: 'error',\r\n source: 'template',\r\n code: 'INHERITED_METADATA_FILE_NOT_FOUND',\r\n ...(location || {})\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n getName(): string {\r\n return 'Template Processing';\r\n }\r\n}\r\n","/**\n * Markdown Output Formatter\n *\n * Formats compiled prompts as human-readable markdown with optional YAML frontmatter.\n */\n\nimport * as yaml from 'yaml';\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class MarkdownFormatter implements OutputFormatter {\n name = 'markdown';\n fileExtension = '.md';\n mimeType = 'text/markdown';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n const output: string[] = [];\n\n // Add metadata as YAML frontmatter comment (only in verbose mode)\n if (compiled.verbose && compiled.metadata) {\n output.push('<!-- PROMPD METADATA');\n const cleanMetadata = this.cleanMetadataForDisplay(compiled.metadata);\n output.push(yaml.stringify(cleanMetadata));\n output.push('-->');\n output.push('');\n }\n\n // Add extracted contexts as sections\n if (compiled.contexts && compiled.contexts.length > 0) {\n output.push('# Extracted Context Files');\n output.push('');\n for (const ctx of compiled.contexts) {\n output.push(ctx);\n output.push('');\n }\n }\n\n // Add main content (clean output without extra headers by default)\n if (compiled.content) {\n if (compiled.verbose) {\n output.push('# Main Prompt Content');\n output.push('');\n }\n output.push(compiled.content);\n }\n\n return output.join('\\n');\n }\n\n /**\n * Clean metadata dictionary for YAML display, converting complex objects to strings.\n */\n private cleanMetadataForDisplay(metadata: any): any {\n if (typeof metadata !== 'object' || metadata === null) {\n return metadata;\n }\n\n if (Array.isArray(metadata)) {\n return metadata.map(item => this.cleanMetadataForDisplay(item));\n }\n\n const cleaned: any = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value === undefined) {\n continue; // Skip undefined values\n }\n\n // Handle enums and complex objects\n if (typeof value === 'object' && value !== null) {\n if ('value' in value) {\n // Enum object - return its string value\n cleaned[key] = value.value;\n } else if (Array.isArray(value)) {\n cleaned[key] = value.map(item => this.cleanMetadataForDisplay(item));\n } else {\n cleaned[key] = this.cleanMetadataForDisplay(value);\n }\n } else {\n cleaned[key] = value;\n }\n }\n\n return cleaned;\n }\n}\n","/**\n * OpenAI API JSON Formatter\n *\n * Formats compiled prompts for OpenAI API consumption with proper message structure.\n */\n\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class OpenAIFormatter implements OutputFormatter {\n name = 'provider-json:openai';\n fileExtension = '.json';\n mimeType = 'application/json';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (!compiled.content) {\n return JSON.stringify({\n model: 'gpt-4',\n messages: [],\n temperature: 0.1\n }, null, 2);\n }\n\n // Parse all sections\n const sections = this.parseSections(compiled.content);\n\n // Build system message from System and Context sections\n let systemMessage = '';\n const systemParts: string[] = [];\n if (sections.System) {\n systemParts.push(sections.System);\n }\n if (sections.Context) {\n systemParts.push(sections.Context);\n }\n systemMessage = systemParts.join('\\n\\n');\n\n if (systemMessage) {\n messages.push({\n role: 'system',\n content: systemMessage\n });\n }\n\n // Build messages from other sections in order\n let examplesContent = '';\n if (sections.Examples) {\n examplesContent = sections.Examples;\n }\n\n for (const [sectionName, content] of Object.entries(sections)) {\n if (sectionName === 'System' || sectionName === 'Context' || sectionName === 'Examples') continue;\n\n const role = this.sectionToRole(sectionName);\n if (role) {\n let messageContent = content.trim();\n // Add examples to first user message\n if (role === 'user' && examplesContent && messages.filter(m => m.role === 'user').length === 0) {\n messageContent = `${messageContent}\\n\\n${examplesContent}`;\n examplesContent = ''; // Only add once\n }\n messages.push({ role, content: messageContent });\n }\n }\n\n // Add extracted contexts to first user message\n if (compiled.contexts && compiled.contexts.length > 0 && messages.length > 0) {\n const firstUserMsg = messages.find(m => m.role === 'user');\n if (firstUserMsg) {\n const contextContent = compiled.contexts.join('\\n\\n');\n firstUserMsg.content = `${contextContent}\\n\\n${firstUserMsg.content}`;\n }\n }\n\n const apiRequest = {\n model: 'gpt-4',\n messages: messages,\n temperature: 0.1\n };\n\n return JSON.stringify(apiRequest, null, 2);\n }\n\n /**\n * Parse all sections from markdown content.\n */\n private parseSections(content: string): Record<string, string> {\n const sections: Record<string, string> = {};\n const lines = content.split('\\n');\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n let sectionOrder: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a section header\n const match = trimmed.match(/^# (.+)$/);\n if (match) {\n // Save previous section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n sectionOrder.push(currentSection);\n }\n\n // Start new section\n currentSection = match[1];\n currentContent = [];\n } else if (currentSection) {\n // Add line to current section\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n }\n\n return sections;\n }\n\n /**\n * Convert section name to message role.\n */\n private sectionToRole(sectionName: string): string | null {\n const normalized = sectionName.replace(/_\\d+$/, '').toLowerCase();\n if (normalized === 'user') return 'user';\n if (normalized === 'assistant') return 'assistant';\n return null;\n }\n\n}\n","/**\n * Anthropic Claude API JSON Formatter\n *\n * Formats compiled prompts for Anthropic Claude API with system field and messages.\n */\n\nimport { OutputFormatter, CompiledPrompt } from '../types';\n\nexport class AnthropicFormatter implements OutputFormatter {\n name = 'provider-json:anthropic';\n fileExtension = '.json';\n mimeType = 'application/json';\n\n async format(compiled: CompiledPrompt): Promise<string> {\n let systemMessage = '';\n const messages: Array<{ role: string; content: string }> = [];\n\n if (!compiled.content) {\n return JSON.stringify({\n model: 'claude-3-sonnet-20240229',\n system: '',\n messages: []\n }, null, 2);\n }\n\n // Parse all sections\n const sections = this.parseSections(compiled.content);\n\n // Build system message from System and Context sections\n const systemParts: string[] = [];\n if (sections.System) {\n systemParts.push(sections.System);\n }\n if (sections.Context) {\n systemParts.push(sections.Context);\n }\n systemMessage = systemParts.join('\\n\\n');\n\n // Build messages from other sections in order\n let examplesContent = '';\n if (sections.Examples) {\n examplesContent = sections.Examples;\n }\n\n for (const [sectionName, content] of Object.entries(sections)) {\n if (sectionName === 'System' || sectionName === 'Context' || sectionName === 'Examples') continue;\n\n const role = this.sectionToRole(sectionName);\n if (role) {\n let messageContent = content.trim();\n // Add examples to first user message\n if (role === 'user' && examplesContent && messages.filter(m => m.role === 'user').length === 0) {\n messageContent = `${messageContent}\\n\\n${examplesContent}`;\n examplesContent = ''; // Only add once\n }\n messages.push({ role, content: messageContent });\n }\n }\n\n // Add extracted contexts to first user message\n if (compiled.contexts && compiled.contexts.length > 0 && messages.length > 0) {\n const firstUserMsg = messages.find(m => m.role === 'user');\n if (firstUserMsg) {\n const contextContent = compiled.contexts.join('\\n\\n');\n firstUserMsg.content = `${contextContent}\\n\\n${firstUserMsg.content}`;\n }\n }\n\n const apiRequest = {\n model: 'claude-3-sonnet-20240229',\n system: systemMessage,\n messages: messages\n };\n\n return JSON.stringify(apiRequest, null, 2);\n }\n\n /**\n * Parse all sections from markdown content.\n */\n private parseSections(content: string): Record<string, string> {\n const sections: Record<string, string> = {};\n const lines = content.split('\\n');\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n let sectionOrder: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a section header\n const match = trimmed.match(/^# (.+)$/);\n if (match) {\n // Save previous section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n sectionOrder.push(currentSection);\n }\n\n // Start new section\n currentSection = match[1];\n currentContent = [];\n } else if (currentSection) {\n // Add line to current section\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection) {\n const key = sectionOrder.filter(s => s === currentSection).length > 0\n ? `${currentSection}_${sectionOrder.filter(s => s === currentSection).length}`\n : currentSection;\n sections[key] = currentContent.join('\\n').trim();\n }\n\n return sections;\n }\n\n /**\n * Convert section name to message role.\n */\n private sectionToRole(sectionName: string): string | null {\n const normalized = sectionName.replace(/_\\d+$/, '').toLowerCase();\n if (normalized === 'user') return 'user';\n if (normalized === 'assistant') return 'assistant';\n // Treat other sections as user messages\n if (normalized === 'context' || normalized === 'examples') {\n return 'user';\n }\n return null;\n }\n}\n","/**\n * Code Generation Stage\n *\n * Generates output in the target format using registered formatters.\n */\n\nimport { CompilerStage, CompilationContext, OutputFormatter, CompiledPrompt } from '../types';\nimport { MarkdownFormatter } from '../formatters/markdown';\nimport { OpenAIFormatter } from '../formatters/openai';\nimport { AnthropicFormatter } from '../formatters/anthropic';\n\nexport class CodeGenerationStage implements CompilerStage {\n private formatters: Map<string, OutputFormatter>;\n\n constructor(formatters?: Map<string, OutputFormatter>) {\n this.formatters = formatters || new Map();\n\n // Register default formatters\n this.registerFormatter(new MarkdownFormatter());\n this.registerFormatter(new OpenAIFormatter());\n this.registerFormatter(new AnthropicFormatter());\n }\n\n /**\n * Register a new output formatter.\n */\n registerFormatter(formatter: OutputFormatter): void {\n this.formatters.set(formatter.name, formatter);\n }\n\n async process(context: CompilationContext): Promise<void> {\n let formatName = context.outputFormat;\n\n // Handle legacy format names\n if (formatName.startsWith('to-')) {\n formatName = formatName.substring(3);\n }\n\n // Handle provider-json shorthand\n if (formatName === 'provider-json') {\n formatName = 'provider-json:openai'; // Default to OpenAI\n }\n\n const formatter = this.formatters.get(formatName);\n if (!formatter) {\n context.addError(`Unknown output format: ${formatName}`);\n return;\n }\n\n try {\n const compiled: CompiledPrompt = {\n metadata: context.metadata,\n content: context.content,\n contexts: context.contexts,\n parameters: context.parameters,\n verbose: context.verbose\n };\n\n context.compiledResult = await formatter.format(compiled);\n\n if (context.verbose) {\n console.log(`✓ Generated output in format: ${formatName}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n context.addError(`Code generation failed: ${errorMessage}`);\n }\n }\n\n getName(): string {\n return 'Code Generation';\n }\n}\n","/**\n * File System Abstraction (core, environment-agnostic).\n *\n * Defines the IFileSystem interface and the in-memory implementation used for\n * browser + server compilation. The Node-backed NodeFileSystem and the adm-zip\n * .pdpkg helpers live in @prompd/cli (they need Node APIs). Path operations here\n * are inlined as POSIX so this module has zero Node imports.\n */\nimport JSZip from 'jszip';\n\n/**\n * File system interface that can be implemented for different storage backends.\n */\nexport interface IFileSystem {\n /** Check if a file or directory exists. */\n exists(filePath: string): boolean | Promise<boolean>;\n /** Read a file's contents as a UTF-8 string. */\n readFile(filePath: string): string | Promise<string>;\n /** Check if a path is a directory. */\n isDirectory(filePath: string): boolean | Promise<boolean>;\n /** List files in a directory. */\n readdir(dirPath: string): string[] | Promise<string[]>;\n /** Resolve a path (for package resolution). */\n resolve(...pathSegments: string[]): string;\n /** Get the directory name of a path. */\n dirname(filePath: string): string;\n /** Join path segments. */\n join(...pathSegments: string[]): string;\n}\n\n/** Extensions whose bytes can't live in the string-backed FS — skipped on package\n * ingest. Compilation only needs the text sources; binary assets are resolved\n * server-side (the browser warns) for now. */\nconst BINARY_ASSET_EXT = new Set([\n 'png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'ico', 'bmp', 'tiff',\n 'pdf', 'xlsx', 'xls', 'docx', 'doc', 'pptx', 'ppt',\n 'zip', 'pdpkg', 'gz', 'tar', 'wasm', 'woff', 'woff2', 'ttf', 'otf', 'eot',\n 'mp3', 'mp4', 'wav', 'ogg', 'webm', 'mov', 'avi',\n]);\nfunction isBinaryAsset(name: string): boolean {\n const dot = name.lastIndexOf('.');\n return dot >= 0 && BINARY_ASSET_EXT.has(name.slice(dot + 1).toLowerCase());\n}\n\n/**\n * Extract a `.pdpkg` (ZIP) buffer to a flat map of entry-relative path -> UTF-8\n * content. The SINGLE ZIP-extraction primitive shared by package ingestion\n * (MemoryFileSystem.addPackage) and skill install — so hosts never hand-roll their\n * own jszip pass. Directories and binary assets are skipped (the consumers store\n * text only).\n */\nexport async function extractPdpkg(buffer: Uint8Array): Promise<Map<string, string>> {\n const zip = await JSZip.loadAsync(buffer);\n const out = new Map<string, string>();\n for (const entry of Object.values(zip.files)) {\n if (entry.dir || isBinaryAsset(entry.name)) continue;\n out.set(entry.name, await entry.async('string'));\n }\n return out;\n}\n\n/* ---- inlined POSIX path helpers (no Node 'path' dependency) ---- */\n\nfunction normalizePosix(p: string): string {\n const isAbs = p.startsWith('/');\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n if (out.length && out[out.length - 1] !== '..') out.pop();\n else if (!isAbs) out.push('..');\n } else {\n out.push(seg);\n }\n }\n const joined = out.join('/');\n return isAbs ? '/' + joined : (joined || '.');\n}\n\nfunction joinPosix(...segments: string[]): string {\n const filtered = segments.filter((s) => s && s.length > 0);\n if (filtered.length === 0) return '.';\n return normalizePosix(filtered.join('/'));\n}\n\nfunction dirnamePosix(p: string): string {\n const norm = p.replace(/\\/+$/, '');\n const idx = norm.lastIndexOf('/');\n if (idx === -1) return '.';\n if (idx === 0) return '/';\n return norm.slice(0, idx);\n}\n\nfunction utf8ByteLength(s: string): number {\n return new TextEncoder().encode(s).length;\n}\n\n/** Relative key normalization (forward slashes, no leading ./ or /, no trailing\n * slash) shared by MemoryFileSystem and HybridFileSystem so they never drift. */\nfunction toRelKey(filePath: string): string {\n let n = filePath.replace(/\\\\/g, '/');\n if (n.startsWith('./')) n = n.substring(2);\n if (n.startsWith('/')) n = n.substring(1);\n if (n.endsWith('/') && n.length > 1) n = n.substring(0, n.length - 1);\n return n;\n}\n\n/**\n * In-memory file system for browser + server-side compilation.\n * Files are provided as a map of path -> content.\n */\nexport class MemoryFileSystem implements IFileSystem {\n /** Cap on an ingested package buffer (defends against a hostile/huge .pdpkg). */\n private static readonly MAX_PACKAGE_SIZE = 50 * 1024 * 1024;\n private files: Map<string, string>;\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map();\n for (const [filePath, content] of Object.entries(files)) {\n this.addFile(filePath, content);\n }\n }\n\n /** Add or update a file in the in-memory file system. */\n addFile(filePath: string, content: string): void {\n this.files.set(this.normalizePath(filePath), content);\n }\n\n /** Add multiple files at once. */\n addFiles(files: Record<string, string>): void {\n for (const [filePath, content] of Object.entries(files)) {\n this.addFile(filePath, content);\n }\n }\n\n exists(filePath: string): boolean {\n return this.files.has(this.normalizePath(filePath));\n }\n\n readFile(filePath: string): string {\n const normalizedPath = this.normalizePath(filePath);\n const content = this.files.get(normalizedPath);\n if (content === undefined) {\n throw new Error(`File not found: ${filePath}`);\n }\n return content;\n }\n\n isDirectory(filePath: string): boolean {\n const normalizedPath = this.normalizePath(filePath);\n const dirPrefix = normalizedPath.endsWith('/') ? normalizedPath : normalizedPath + '/';\n for (const file of this.files.keys()) {\n if (file.startsWith(dirPrefix)) {\n return true;\n }\n }\n return false;\n }\n\n readdir(dirPath: string): string[] {\n const normalizedDir = this.normalizePath(dirPath);\n const dirPrefix = normalizedDir.endsWith('/') ? normalizedDir : normalizedDir + '/';\n const files: Set<string> = new Set();\n for (const file of this.files.keys()) {\n if (file.startsWith(dirPrefix)) {\n const relativePath = file.substring(dirPrefix.length);\n const slashIndex = relativePath.indexOf('/');\n const fileName = slashIndex === -1 ? relativePath : relativePath.substring(0, slashIndex);\n if (fileName) {\n files.add(fileName);\n }\n }\n }\n return Array.from(files);\n }\n\n resolve(...pathSegments: string[]): string {\n return joinPosix('/', ...pathSegments);\n }\n\n dirname(filePath: string): string {\n return dirnamePosix(filePath);\n }\n\n join(...pathSegments: string[]): string {\n return joinPosix(...pathSegments);\n }\n\n /** Get the virtual file system path for a package. */\n getPackagePath(packageName: string, version: string): string {\n return `/packages/${packageName}@${version}`;\n }\n\n /**\n * Extract a `.pdpkg` (ZIP) buffer into memory under getPackagePath(name, ver).\n *\n * Uses JSZip — isomorphic (browser + Node) — so this is the SINGLE package-ingest\n * path for every host (replacing the CLI's Node-only adm-zip subclass and the\n * skill installer's ad-hoc unzip). Text files only: binary assets aren't\n * representable in the string-backed FS, so they're skipped (a `using:` package's\n * .prmd/.md/.json/.yaml is what matters for compilation). Validates entry paths\n * can't escape the package directory.\n */\n async addPackage(packageName: string, version: string, packageBuffer: Uint8Array): Promise<void> {\n if (packageBuffer.length > MemoryFileSystem.MAX_PACKAGE_SIZE) {\n throw new Error(`Package too large: ${packageBuffer.length} bytes (max ${MemoryFileSystem.MAX_PACKAGE_SIZE})`);\n }\n const files = await extractPdpkg(packageBuffer);\n\n const packagePath = this.getPackagePath(packageName, version);\n const packagePrefix = this.normalizePath(packagePath.endsWith('/') ? packagePath : packagePath + '/');\n const packageRoot = this.normalizePath(packagePath);\n\n for (const [rel, content] of files) {\n const filePath = this.join(packagePath, rel);\n const normalized = this.normalizePath(filePath);\n if (!normalized.startsWith(packagePrefix) && normalized !== packageRoot) {\n throw new Error(`Security violation: extracted path escapes package directory: ${rel}`);\n }\n this.addFile(filePath, content);\n }\n }\n\n /** Get all files under an optional base path. */\n getAllFiles(basePath?: string): Map<string, string> {\n if (!basePath) {\n return new Map(this.files);\n }\n const normalizedBase = this.normalizePath(basePath);\n const prefix = normalizedBase.endsWith('/') ? normalizedBase : normalizedBase + '/';\n const filtered = new Map<string, string>();\n for (const [filePath, content] of this.files.entries()) {\n if (filePath.startsWith(prefix) || filePath === normalizedBase) {\n filtered.set(filePath, content);\n }\n }\n return filtered;\n }\n\n /** Calculate total size (bytes) and file count under a base path. */\n getTotalSize(basePath: string): { size: number; files: number } {\n const files = this.getAllFiles(basePath);\n let totalSize = 0;\n for (const content of files.values()) {\n totalSize += utf8ByteLength(content);\n }\n return { size: totalSize, files: files.size };\n }\n\n /** Normalize path to forward slashes, drop leading ./ and /, no trailing slash. */\n protected normalizePath(filePath: string): string {\n return toRelKey(filePath);\n }\n}\n\n/**\n * Async backend for files NOT held in memory by a HybridFileSystem. Paths are\n * normalized relative keys (forward slashes, no leading ./ or /), matching the\n * keys MemoryFileSystem uses. readFile resolves null when the file is absent.\n *\n * This is how a host streams files lazily — e.g. a browser\n * FileSystemDirectoryHandle, or a registry/package fetch — without loading the\n * whole tree up front.\n */\nexport interface AsyncFileBackend {\n /** Read a file's UTF-8 contents; resolve null when it does not exist. */\n readFile(path: string): Promise<string | null>;\n /** Optional: report whether a path is a directory. */\n isDirectory?(path: string): Promise<boolean>;\n /** Optional: list a directory's immediate entry names. */\n readdir?(path: string): Promise<string[]>;\n}\n\n/**\n * In-memory file system with an async fall-through backend.\n *\n * Files placed in memory (constructor map / addFile) are served SYNCHRONOUSLY,\n * so the synchronous Nunjucks {% include %} loader keeps working for them —\n * pre-load the .prmd sources a compilation can {% include %} or inherit. Any\n * path NOT in memory is read from the async backend, returning a Promise that\n * the compiler's awaiting stages (inherits:, package context, asset extraction)\n * consume. This lets a browser compile a folder of prompts: load the .prmd\n * sources up front, stream binary/context assets on demand.\n *\n * Known limitation: the synchronous Nunjucks {% include %} loader cannot read\n * backend-only files (it gets a Promise and throws a \"requires synchronous\"\n * error). So anything {% include %}'d must be in memory — pre-load every source\n * a compilation can include (the web host pre-loads all .prmd/.md). inherits:\n * has no such limit; it resolves through the async stages.\n *\n * Composes (does not extend) MemoryFileSystem so the in-memory methods keep\n * their strict sync return types and existing consumers are untouched.\n */\nexport class HybridFileSystem implements IFileSystem {\n private mem: MemoryFileSystem;\n private backend: AsyncFileBackend;\n\n constructor(files: Record<string, string> = {}, backend: AsyncFileBackend) {\n this.mem = new MemoryFileSystem(files);\n this.backend = backend;\n }\n\n /** Add or update an in-memory (synchronously-served) file. */\n addFile(filePath: string, content: string): void {\n this.mem.addFile(filePath, content);\n }\n\n /** Add multiple in-memory files at once. */\n addFiles(files: Record<string, string>): void {\n this.mem.addFiles(files);\n }\n\n /** Virtual path where a package's files live (delegates to the memory layer). */\n getPackagePath(packageName: string, version: string): string {\n return this.mem.getPackagePath(packageName, version);\n }\n\n /** Ingest a `.pdpkg` (ZIP) buffer into the in-memory layer, so package files are\n * served synchronously alongside the workspace sources. */\n addPackage(packageName: string, version: string, packageBuffer: Uint8Array): Promise<void> {\n return this.mem.addPackage(packageName, version, packageBuffer);\n }\n\n exists(filePath: string): boolean | Promise<boolean> {\n if (this.mem.exists(filePath)) return true;\n return this.backend\n .readFile(this.normalize(filePath))\n .then((content) => content !== null)\n .catch(() => false);\n }\n\n readFile(filePath: string): string | Promise<string> {\n if (this.mem.exists(filePath)) return this.mem.readFile(filePath);\n return this.backend.readFile(this.normalize(filePath)).then((content) => {\n if (content === null) throw new Error(`File not found: ${filePath}`);\n return content;\n });\n }\n\n isDirectory(filePath: string): boolean | Promise<boolean> {\n if (this.mem.isDirectory(filePath)) return true;\n if (!this.backend.isDirectory) return false;\n return this.backend.isDirectory(this.normalize(filePath)).catch(() => false);\n }\n\n readdir(dirPath: string): string[] | Promise<string[]> {\n const local = this.mem.readdir(dirPath);\n if (!this.backend.readdir) return local;\n return this.backend\n .readdir(this.normalize(dirPath))\n .then((remote) => Array.from(new Set([...local, ...remote])))\n .catch(() => local);\n }\n\n resolve(...pathSegments: string[]): string {\n return this.mem.resolve(...pathSegments);\n }\n\n dirname(filePath: string): string {\n return this.mem.dirname(filePath);\n }\n\n join(...pathSegments: string[]): string {\n return this.mem.join(...pathSegments);\n }\n\n /** Normalize to the same relative keys MemoryFileSystem uses, for backend lookups. */\n private normalize(filePath: string): string {\n return toRelKey(filePath);\n }\n}\n","/**\n * Package installation — the single, host-agnostic installer for every Prompd\n * artifact type (packages, skills, workflows, templates).\n *\n * Mirrors the resolver's design (MemoryPackageResolver): the download fetch and the\n * writable file sink are INJECTED, so the same logic runs in the browser (a\n * workspace FileService) and in the CLI/sidecar (Node fs) with no Node imports here.\n * Core stays Node-free — it never computes '~'; the caller passes the install `root`\n * (the open workspace for a local/browser install, the home dir for a global\n * sidecar/CLI install). Layout is core's canonical one:\n *\n * <root>/.prompd/<getInstallDirForType(type)>/<@scope/name>/...\n *\n * which matches the working CLI install (~/.prompd/packages/@scope/name/, etc.).\n */\nimport { extractPdpkg } from './file-system';\nimport { parsePackageReference, type PackageDownloader } from './package-ref';\nimport { getInstallDirForType, type PackageType } from '../../types';\n\n/** Max .pdpkg size accepted for install (matches MemoryFileSystem's package cap). */\nconst MAX_PACKAGE_SIZE = 50 * 1024 * 1024;\n\n/**\n * A writable sink the host injects so installPackage stays FS-/Node-agnostic.\n * Browser: an adapter over the workspace FileService; CLI/sidecar: over Node fs.\n */\nexport interface PackageStore {\n /** Write a UTF-8 file, creating parent directories as needed. */\n writeFile(path: string, content: string): void | Promise<void>;\n /** Remove a directory and its contents if present, for a clean reinstall. */\n removeDir?(path: string): void | Promise<void>;\n}\n\nexport interface InstallPackageOptions {\n /** \"@scope/name@version\" or \"@scope/name\" (defaults to latest). */\n ref: string;\n /** Artifact type — selects the .prompd subdir (packages/skills/workflows/templates). */\n type: PackageType;\n /**\n * Install root the caller chose: the open workspace folder (browser/local) or the\n * home dir for a global install (sidecar/CLI). installPackage NEVER computes '~'\n * itself — core stays Node-free.\n */\n root: string;\n /** Writable sink for the chosen host. */\n store: PackageStore;\n /**\n * Fetch the .pdpkg bytes for a (name, version). Injected: the registry client in\n * the browser, a Node fetch in the CLI. May resolve 'latest' to a concrete version.\n */\n download: PackageDownloader;\n}\n\nexport interface InstalledPackage {\n /** Full scoped name (manifest-authoritative when present), e.g. \"@prompd/core\". */\n name: string;\n /** Resolved version (from the package manifest when present). */\n version: string;\n scope?: string;\n /** Install dir written to: <root>/.prompd/<typeDir>/<name>. */\n installedPath: string;\n /** Entry-relative paths written under installedPath. */\n files: string[];\n}\n\n/** POSIX join — no Node 'path' (core is Node-free). Drops empty/'.' segments and\n * collapses repeated slashes; preserves a leading slash for absolute roots. */\nfunction joinPosix(...parts: string[]): string {\n const joined = parts.filter((p) => p && p !== '.').join('/').replace(/\\/{2,}/g, '/');\n return joined.replace(/\\/+$/, '') || '/';\n}\n\n/** Resolve '.'/'..' segments for the zip-slip escape check. Leading slash is\n * dropped (the comparison is relative-consistent for base and dest alike). */\nfunction normalizeSegments(p: string): string {\n const out: string[] = [];\n for (const seg of p.split('/')) {\n if (!seg || seg === '.') continue;\n if (seg === '..') { out.pop(); continue; }\n out.push(seg);\n }\n return out.join('/');\n}\n\n/** The single source of truth for an artifact's install directory:\n * <root>/.prompd/<typeDir>/<@scope/name>/ — used by both install and uninstall. */\nfunction resolveInstallDir(root: string, type: PackageType, name: string): string {\n return joinPosix(root, '.prompd', getInstallDirForType(type), name);\n}\n\n/**\n * Install a registry artifact into <root>/.prompd/<typeDir>/<name>/, replacing any\n * prior install (idempotent). The host injects the writable `store` and the\n * `download` fetcher, so the same install runs in the browser and the CLI/sidecar.\n * Returns the resolved name/version (manifest-authoritative when present) and the\n * files written. Rejects entries that escape the install directory (zip-slip) and\n * archives over the size cap.\n */\nexport async function installPackage(opts: InstallPackageOptions): Promise<InstalledPackage> {\n const { ref, type, root, store, download } = opts;\n const parsed = parsePackageReference(ref);\n\n const bytes = await download(parsed.name, parsed.version);\n if (bytes.length > MAX_PACKAGE_SIZE) {\n throw new Error(`Package too large: ${bytes.length} bytes (max ${MAX_PACKAGE_SIZE})`);\n }\n const files = await extractPdpkg(bytes);\n if (files.size === 0) {\n throw new Error(`Package \"${parsed.name}\" contains no installable files.`);\n }\n\n // The package manifest is authoritative for name/version when present (download may\n // have resolved 'latest'); fall back to the parsed ref on a missing/bad manifest.\n let name = parsed.name;\n let version = parsed.version;\n const manifest = files.get('manifest.json') ?? files.get('prompd.json');\n if (manifest) {\n try {\n const m = JSON.parse(manifest) as { name?: string; version?: string };\n if (typeof m.name === 'string' && m.name) name = m.name;\n if (typeof m.version === 'string' && m.version) version = m.version;\n } catch { /* keep the parsed values on a malformed manifest */ }\n }\n\n const installedPath = resolveInstallDir(root, type, name);\n const baseSegments = normalizeSegments(installedPath);\n\n // Clean reinstall: drop any prior copy so removed files don't linger.\n await store.removeDir?.(installedPath);\n\n const written: string[] = [];\n for (const [rel, content] of files) {\n const dest = joinPosix(installedPath, rel);\n const destSegments = normalizeSegments(dest);\n if (destSegments !== baseSegments && !destSegments.startsWith(baseSegments + '/')) {\n throw new Error(`Security violation: extracted path escapes install directory: ${rel}`);\n }\n await store.writeFile(dest, content);\n written.push(rel);\n }\n\n return { name, version, scope: parsed.scope, installedPath, files: written };\n}\n\nexport interface UninstallPackageOptions {\n /** \"@scope/name\" (a version suffix is accepted but ignored — one install per name). */\n ref: string;\n /** Artifact type — selects the .prompd subdir. */\n type: PackageType;\n /** Install root the caller chose (the open workspace, or '~' for a global install). */\n root: string;\n /** Writable sink for the chosen host; removeDir is required to uninstall. */\n store: PackageStore;\n}\n\nexport interface UninstalledPackage {\n name: string;\n scope?: string;\n /** The directory that was removed: <root>/.prompd/<typeDir>/<name>. */\n installedPath: string;\n}\n\n/**\n * Uninstall an artifact: remove <root>/.prompd/<typeDir>/<name>/ via the injected\n * store. The symmetric inverse of installPackage, sharing the same install-dir\n * computation. Idempotent — removing an absent install is a no-op (the host's\n * removeDir should swallow not-found). Throws if the store can't remove directories.\n */\nexport async function uninstallPackage(opts: UninstallPackageOptions): Promise<UninstalledPackage> {\n const { ref, type, root, store } = opts;\n if (!store.removeDir) {\n throw new Error('Uninstall requires a PackageStore with removeDir.');\n }\n const parsed = parsePackageReference(ref);\n const installedPath = resolveInstallDir(root, type, parsed.name);\n await store.removeDir(installedPath);\n return { name: parsed.name, scope: parsed.scope, installedPath };\n}\n","/**\n * @prompd/core compiler — environment-agnostic assembly.\n *\n * Assembles the browser/server-safe compilation pipeline:\n * Lexical -> Dependency -> Semantic -> Template -> CodeGeneration\n *\n * The binary AssetExtractionStage (sharp/pdf/exceljs/mammoth) is Node-only and\n * lives in @prompd/cli, which assembles the full pipeline. Package/inheritance\n * resolution is injected via IPackageResolver (also Node-only); without it, the\n * dependency stage emits a diagnostic and single-file compilation still works.\n */\n\nimport { CompilerPipeline } from './pipeline';\nimport {\n CompilationOptions,\n CompilationContext,\n CompilerStage,\n DEFAULT_SECURITY_CONFIG,\n SecurityConfig\n} from './types';\nimport { CompilationError } from '../errors';\nimport { LexicalAnalysisStage } from './stages/lexical';\nimport { DependencyResolutionStage } from './stages/dependency';\nimport { SemanticAnalysisStage } from './stages/semantic';\nimport { TemplateProcessingStage } from './stages/template';\nimport { CodeGenerationStage } from './stages/codegen';\n\n/**\n * Default browser/server-safe stage set (no binary asset extraction).\n */\nexport function createCoreStages(): CompilerStage[] {\n return [\n new LexicalAnalysisStage(),\n new DependencyResolutionStage(),\n new SemanticAnalysisStage(),\n new TemplateProcessingStage(),\n new CodeGenerationStage()\n ];\n}\n\n/**\n * High-level compiler. Defaults to the core (browser-safe) stage set; callers\n * such as @prompd/cli pass a custom stage list (adding asset extraction).\n */\nexport class PrompdCompiler {\n protected pipeline: CompilerPipeline;\n protected securityConfig: SecurityConfig;\n\n constructor(options: { stages?: CompilerStage[]; securityConfig?: SecurityConfig } = {}) {\n this.securityConfig = options.securityConfig || DEFAULT_SECURITY_CONFIG;\n this.pipeline = new CompilerPipeline(options.stages || createCoreStages(), this.securityConfig);\n }\n\n /**\n * Compile a .prmd source to a string. Throws CompilationError on errors.\n */\n async compile(source: string, options: CompilationOptions = {}): Promise<string> {\n const context = await this.pipeline.execute(source, options);\n\n if (context.hasErrors()) {\n const errorMessages = context.errors.join('\\n - ');\n throw new CompilationError(`Compilation failed:\\n - ${errorMessages}`);\n }\n\n const result = context.compiledResult || '';\n return typeof result === 'string' ? result : new TextDecoder().decode(result);\n }\n\n /**\n * Compile and return the full context (output + diagnostics, no throw).\n */\n async compileWithContext(source: string, options: CompilationOptions = {}): Promise<CompilationContext> {\n return this.pipeline.execute(source, options);\n }\n\n /** Access the underlying pipeline (advanced customization). */\n getPipeline(): CompilerPipeline {\n return this.pipeline;\n }\n}\n\n/**\n * Convenience function for quick single-file compilation.\n */\nexport async function compile(\n source: string,\n outputFormat: string = 'markdown',\n parameters: Record<string, any> = {},\n options: Omit<CompilationOptions, 'outputFormat' | 'parameters'> = {}\n): Promise<string> {\n const compiler = new PrompdCompiler();\n return compiler.compile(source, { outputFormat, parameters, ...options });\n}\n\n// Re-export the building blocks.\nexport * from './types';\nexport * from './pipeline';\nexport * from './file-system';\nexport * from './package-ref';\nexport * from './install';\nexport * from './language-map';\nexport * from './path-utils';\nexport { LexicalAnalysisStage } from './stages/lexical';\nexport { DependencyResolutionStage } from './stages/dependency';\nexport { SemanticAnalysisStage } from './stages/semantic';\nexport { TemplateProcessingStage } from './stages/template';\nexport { CodeGenerationStage } from './stages/codegen';\nexport { SectionOverrideProcessor } from './section-override';\nexport { PrompdLoader, createPrompdEnvironment } from './prompd-loader';\nexport { MarkdownFormatter } from './formatters/markdown';\nexport { OpenAIFormatter } from './formatters/openai';\nexport { AnthropicFormatter } from './formatters/anthropic';\n","/**\r\n * Workflow Types - TypeScript interfaces for .pdflow files\r\n */\r\n\r\n// ============================================================================\r\n// .pdflow File Format Types\r\n// ============================================================================\r\n\r\nexport interface WorkflowFile {\r\n version: string\r\n metadata: WorkflowMetadata\r\n parameters?: WorkflowParameter[]\r\n using?: PackageAlias[]\r\n variables?: WorkflowVariable[]\r\n nodes: WorkflowNode[]\r\n edges: WorkflowEdge[] // React Flow standard format\r\n errorHandling?: ErrorHandlingConfig\r\n execution?: ExecutionConfig\r\n}\r\n\r\nexport interface WorkflowMetadata {\r\n id: string\r\n name: string\r\n description?: string\r\n author?: string\r\n version?: string\r\n tags?: string[]\r\n}\r\n\r\nexport interface WorkflowParameter {\r\n name: string\r\n type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'integer' | 'date' | 'datetime'\r\n required?: boolean\r\n description?: string\r\n default?: unknown\r\n enum?: string[]\r\n min?: number\r\n max?: number\r\n}\r\n\r\nexport interface PackageAlias {\r\n name: string\r\n prefix: string\r\n}\r\n\r\nexport interface WorkflowVariable {\r\n name: string\r\n type: string\r\n scope?: 'workflow' | 'node'\r\n default?: unknown\r\n}\r\n\r\n// ============================================================================\r\n// Node Types\r\n// ============================================================================\r\n\r\nexport type WorkflowNodeType =\r\n | 'trigger' // Workflow entry point (manual, webhook, schedule, file-watch)\r\n | 'prompt'\r\n | 'provider' // LLM provider configuration node\r\n | 'condition'\r\n | 'loop'\r\n | 'parallel'\r\n | 'merge'\r\n | 'transformer'\r\n | 'api'\r\n | 'tool' // Unified tool node: function, MCP, HTTP, command, or code\r\n | 'tool-call-parser' // Parse LLM output for tool calls\r\n | 'tool-call-router' // Container for Tool nodes with routing logic\r\n | 'agent' // Autonomous AI agent with ReAct-style tool-use loop\r\n | 'chat-agent' // Composite: User Input + Guardrail + Agent + Tool Router\r\n | 'guardrail' // Input validation with success/rejected branching\r\n | 'callback'\r\n | 'checkpoint' // Alias for callback (legacy compatibility)\r\n | 'user-input' // Pause and collect user input\r\n | 'error-handler' // Error handling configuration node (referenced by other nodes)\r\n | 'command' // Shell command execution (Phase E)\r\n | 'claude-code' // Claude Code agent with SSH support (Phase E)\r\n | 'workflow' // Sub-workflow invocation (Phase E)\r\n | 'mcp-tool' // External MCP tool execution (Phase E)\r\n | 'code' // Code execution node: TS/JS, Python, or C#\r\n | 'memory' // Memory node: KV store, conversation history, or cache\r\n | 'output'\r\n | 'web-search' // Web search node: search the web via configurable provider\r\n | 'database-query' // Database query execution node\r\n // --- Add new node types here ---\r\n\r\nexport interface WorkflowNode {\r\n id: string\r\n type: WorkflowNodeType\r\n position: { x: number; y: number }\r\n data: TriggerNodeData | PromptNodeData | ProviderNodeData | ConditionNodeData | LoopNodeData | ParallelNodeData | MergeNodeData | TransformerNodeData | ApiNodeData | ToolNodeData | ToolCallParserNodeData | ToolCallRouterNodeData | AgentNodeData | ChatAgentNodeData | GuardrailNodeData | CallbackNodeData | UserInputNodeData | ErrorHandlerNodeData | CommandNodeData | ClaudeCodeNodeData | WorkflowNodeData | McpToolNodeData | CodeNodeData | MemoryNodeData | OutputNodeData | WebSearchNodeData\r\n /** Parent node ID for compound nodes (loop/parallel containers) */\r\n parentId?: string\r\n /** Extent for child nodes - 'parent' constrains to parent bounds */\r\n extent?: 'parent' | [number, number, number, number]\r\n /** Whether this node is expandable (container nodes) */\r\n expandParent?: boolean\r\n /** Width for resizable container nodes */\r\n width?: number\r\n /** Height for resizable container nodes */\r\n height?: number\r\n /** Style overrides */\r\n style?: Record<string, unknown>\r\n}\r\n\r\nexport interface BaseNodeData {\r\n label: string\r\n /** Disable this node to skip it during workflow execution */\r\n disabled?: boolean\r\n /** Lock the node to prevent dragging/moving */\r\n locked?: boolean\r\n /** Reference to ErrorHandler node for this node's errors */\r\n errorHandlerNodeId?: string\r\n /** Override: stop workflow immediately on error (ignores errorHandler) */\r\n failFast?: boolean\r\n /** Reference to a Connection for external service access (SSH, Database, HTTP API, etc.) */\r\n connectionId?: string\r\n /**\r\n * Docking configuration - when this node is docked to another node's handle.\r\n * Docked nodes appear as mini 24px circle previews attached to the host handle.\r\n */\r\n dockedTo?: {\r\n /** ID of the host node this node is docked to */\r\n nodeId: string\r\n /** Handle ID on the host node (e.g., 'rejected', 'onError', 'output') */\r\n handleId: string\r\n }\r\n /** Saved width before docking (for restoring on undock) */\r\n _preDockWidth?: number\r\n /** Saved height before docking (for restoring on undock) */\r\n _preDockHeight?: number\r\n /** Saved position before docking (for restoring on undock) */\r\n _preDockPosition?: { x: number; y: number }\r\n [key: string]: unknown // Index signature for React Flow compatibility\r\n}\r\n\r\n// ============================================================================\r\n// Node Docking Configuration\r\n// ============================================================================\r\n\r\n/** Node types that can be docked to handles */\r\nexport const DOCKABLE_NODE_TYPES: WorkflowNodeType[] = [\r\n 'tool-call-router', 'tool', 'callback', 'checkpoint', 'memory', 'error-handler'\r\n]\r\n\r\n/** Handle configurations that accept docked nodes */\r\nexport const DOCKABLE_HANDLES: Array<{\r\n nodeType: WorkflowNodeType\r\n handleId: string\r\n position: { side: 'left' | 'right' | 'bottom'; topPercent: number }\r\n acceptsTypes: WorkflowNodeType[]\r\n}> = [\r\n // Main agent/guardrail nodes - accept callback, checkpoint, error-handler on rejected handle\r\n { nodeType: 'chat-agent', handleId: 'rejected', position: { side: 'left', topPercent: 80 }, acceptsTypes: ['callback', 'checkpoint', 'error-handler'] },\r\n { nodeType: 'chat-agent', handleId: 'memory', position: { side: 'right', topPercent: 70 }, acceptsTypes: ['memory'] },\r\n { nodeType: 'chat-agent', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'guardrail', handleId: 'rejected', position: { side: 'left', topPercent: 70 }, acceptsTypes: ['callback', 'checkpoint', 'error-handler'] },\r\n { nodeType: 'guardrail', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'agent', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n { nodeType: 'agent', handleId: 'ai-output', position: { side: 'right', topPercent: 65 }, acceptsTypes: ['tool-call-router'] },\r\n { nodeType: 'agent', handleId: 'toolResult', position: { side: 'right', topPercent: 80 }, acceptsTypes: ['tool-call-router'] },\r\n { nodeType: 'agent', handleId: 'memory', position: { side: 'left', topPercent: 70 }, acceptsTypes: ['memory'] },\r\n\r\n // Prompt node - accepts memory for output caching, callback for logging\r\n { nodeType: 'prompt', handleId: 'output', position: { side: 'right', topPercent: 50 }, acceptsTypes: ['memory', 'callback'] },\r\n { nodeType: 'prompt', handleId: 'onCheckpoint', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback', 'checkpoint'] },\r\n\r\n // Loop node - accepts memory for iteration state, callback for iteration events\r\n { nodeType: 'loop', handleId: 'onIteration', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['memory', 'callback'] },\r\n\r\n // Condition node - accepts callback for branch logging\r\n { nodeType: 'condition', handleId: 'onEvaluate', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback'] },\r\n\r\n // Code node - accepts memory for state, callback for logging\r\n { nodeType: 'code', handleId: 'onExecute', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['memory', 'callback'] },\r\n\r\n // Transformer node - accepts callback for transform logging\r\n { nodeType: 'transformer', handleId: 'onTransform', position: { side: 'bottom', topPercent: 100 }, acceptsTypes: ['callback'] },\r\n\r\n // Tool Call Router node - accepts tool nodes for docking\r\n { nodeType: 'tool-call-router', handleId: 'ai-input', position: { side: 'left', topPercent: 35 }, acceptsTypes: ['tool'] },\r\n\r\n // Tool Call Router node - accepts tool nodes for docking\r\n { nodeType: 'tool-call-router', handleId: 'toolResult', position: { side: 'left', topPercent: 65 }, acceptsTypes: ['tool'] },\r\n\r\n // Loop node - accepts tool-call-router nodes for container-to-container docking\r\n { nodeType: 'loop', handleId: 'ai-output', position: { side: 'left', topPercent: 50 }, acceptsTypes: ['tool-call-router'] },\r\n\r\n // Loop node - accepts tool-call-router nodes for container-to-container docking\r\n { nodeType: 'loop', handleId: 'toolResult', position: { side: 'left', topPercent: 50 }, acceptsTypes: ['tool-call-router'] },\r\n]\r\n\r\n// ============================================================================\r\n// Trigger Node - Workflow Entry Point\r\n// ============================================================================\r\n\r\n/**\r\n * TriggerNodeData - Workflow entry point configuration\r\n *\r\n * Trigger types:\r\n * - manual: User clicks \"Run\" button (default)\r\n * - webhook: HTTP POST to a generated endpoint\r\n * - schedule: Cron expression or interval-based\r\n * - file-watch: File system changes (Electron only)\r\n * - event: Internal event from another workflow\r\n *\r\n * Every workflow should have exactly one TriggerNode as its entry point.\r\n * The trigger node has no inputs and one output that starts the workflow.\r\n */\r\nexport interface TriggerNodeData extends BaseNodeData {\r\n /** Type of trigger */\r\n triggerType: 'manual' | 'webhook' | 'schedule' | 'file-watch' | 'event'\r\n\r\n /** Description of when/how this workflow runs */\r\n description?: string\r\n\r\n // === Webhook Configuration (triggerType: 'webhook') ===\r\n\r\n /** Webhook path suffix (e.g., '/my-workflow' -> POST /api/webhooks/my-workflow) */\r\n webhookPath?: string\r\n /** Secret for HMAC signature validation */\r\n webhookSecret?: string\r\n /** HTTP methods to accept (default: POST only) */\r\n webhookMethods?: ('GET' | 'POST' | 'PUT')[]\r\n /** Whether to require authentication */\r\n webhookRequireAuth?: boolean\r\n\r\n // === Schedule Configuration (triggerType: 'schedule') ===\r\n\r\n /** Schedule type */\r\n scheduleType?: 'cron' | 'interval'\r\n /** Cron expression (e.g., '0 9 * * *' for 9am daily) */\r\n scheduleCron?: string\r\n /** Interval in milliseconds (e.g., 60000 for every minute) */\r\n scheduleIntervalMs?: number\r\n /** Timezone for cron expressions (default: UTC) */\r\n scheduleTimezone?: string\r\n /** Whether schedule is currently active */\r\n scheduleEnabled?: boolean\r\n\r\n // === File Watch Configuration (triggerType: 'file-watch', Electron only) ===\r\n\r\n /** Glob patterns for files to watch */\r\n fileWatchPaths?: string[]\r\n /** Events to trigger on */\r\n fileWatchEvents?: ('create' | 'modify' | 'delete')[]\r\n /** Debounce time in ms to batch rapid changes */\r\n fileWatchDebounceMs?: number\r\n /** Whether to watch subdirectories */\r\n fileWatchRecursive?: boolean\r\n\r\n // === Event Configuration (triggerType: 'event') ===\r\n\r\n /** Event name to listen for */\r\n eventName?: string\r\n /** Optional filter expression for event data */\r\n eventFilter?: string\r\n\r\n // === Output Schema ===\r\n\r\n /** Schema for data this trigger provides to the workflow */\r\n outputSchema?: JsonSchema\r\n}\r\n\r\nexport interface PromptNodeData extends BaseNodeData {\r\n /** Source type: 'file' for .prmd file reference, 'raw' for inline text */\r\n sourceType?: 'file' | 'raw'\r\n /** Path to .prmd file or package reference (used when sourceType is 'file' or undefined) */\r\n source: string\r\n /** Raw prompt text (used when sourceType is 'raw') */\r\n rawPrompt?: string\r\n /** Reference to a provider node ID, or inline provider name */\r\n provider?: string\r\n /** Model name (used with inline provider, ignored if providerNodeId is set) */\r\n model?: string\r\n /** Reference to a provider node by ID (preferred over inline provider/model) */\r\n providerNodeId?: string\r\n parameters?: Record<string, string> // Template expressions\r\n context?: {\r\n previous_output?: 'auto' | string\r\n }\r\n outputMapping?: Record<string, string>\r\n inputSchema?: JsonSchema\r\n outputSchema?: JsonSchema\r\n /** Temperature override (0-2) — overrides frontmatter hint, overridden by provider node */\r\n temperature?: number\r\n /** Max tokens override — overrides frontmatter hint, overridden by provider node */\r\n maxTokens?: number\r\n /** Guardrail configuration (for content filtering/validation) */\r\n guardrail?: {\r\n /** Whether the guardrail is enabled */\r\n enabled?: boolean\r\n /** Output mode when guardrail passes */\r\n outputMode?: 'passthrough' | 'original' | 'reject-message'\r\n /** Expected response format from LLM */\r\n expectedFormat?: 'json' | 'text'\r\n /** JSON field to check for rejection status */\r\n rejectionField?: string\r\n /** Pass when field is true or false */\r\n passWhen?: 'true' | 'false'\r\n /** Action to take when guardrail fails */\r\n failAction?: 'error' | 'stop' | 'continue'\r\n /** Custom message when rejected */\r\n customRejectMessage?: string\r\n /** Custom rejection expression (advanced) - overrides simple field check */\r\n rejectionExpression?: string\r\n }\r\n}\r\n\r\n/**\r\n * ProviderNodeData - LLM provider configuration node\r\n *\r\n * Centralizes provider/model selection so multiple prompt nodes can reference\r\n * the same provider configuration. This makes it easy to switch providers\r\n * across an entire workflow.\r\n */\r\nexport interface ProviderNodeData extends BaseNodeData {\r\n /** Provider ID (e.g., 'openai', 'anthropic', 'google') */\r\n providerId: string\r\n /** Model ID (e.g., 'gpt-4o', 'claude-sonnet-4-20250514') */\r\n model: string\r\n /** Optional description for this provider configuration */\r\n description?: string\r\n /** Temperature override (0-2) */\r\n temperature?: number\r\n /** Max tokens override */\r\n maxTokens?: number\r\n}\r\n\r\nexport interface ConditionNodeData extends BaseNodeData {\r\n conditions: ConditionBranch[]\r\n default?: string // Target node ID\r\n}\r\n\r\nexport interface ConditionBranch {\r\n id: string\r\n expression: string // Template expression e.g. \"{{ score >= 0.8 }}\"\r\n target: string // Target node ID\r\n}\r\n\r\nexport interface LoopNodeData extends BaseNodeData {\r\n loopType: 'while' | 'for-each' | 'count'\r\n condition?: string // For while loops\r\n items?: string // For for-each loops (template expression)\r\n itemVariable?: string // Variable name for current item\r\n count?: number // For count loops\r\n maxIterations: number // Safety limit\r\n body: string[] // Node IDs to execute in loop\r\n onComplete?: string // Target node ID after loop\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface ParallelNodeData extends BaseNodeData {\r\n /** Execution mode: 'broadcast' (container) or 'fork' (edge-based branches) */\r\n mode: 'broadcast' | 'fork'\r\n /** Number of output handles in fork mode */\r\n forkCount?: number\r\n /** Custom labels for fork branches (indexed by branch number) */\r\n forkLabels?: string[]\r\n branches: ParallelBranch[]\r\n waitFor: 'all' | 'any' | 'race'\r\n mergeStrategy: 'object' | 'array' | 'first'\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface ParallelBranch {\r\n id: string\r\n label?: string // Custom label for the branch (defaults to \"Branch N\")\r\n nodes: string[] // Node IDs in this branch\r\n}\r\n\r\nexport interface MergeNodeData extends BaseNodeData {\r\n inputs: string[] // Template expressions for inputs\r\n mergeAs: 'object' | 'array'\r\n /**\r\n * Merge mode determines how the merge node behaves:\r\n * - 'wait': Waits for all connected inputs to have outputs before executing (default)\r\n * - 'transform': Executes immediately with whatever inputs are available (router/passthrough)\r\n */\r\n mode?: 'wait' | 'transform'\r\n}\r\n\r\n/**\r\n * TransformerNodeData - Data transformation node\r\n *\r\n * Transform, reshape, or filter data using templates with {{ variable }} syntax.\r\n * Supports multiple transform modes for different use cases.\r\n *\r\n * Transform Modes:\r\n * - template: JSON template with {{ }} variable interpolation\r\n * - jq: JQ-style query expressions (future)\r\n * - javascript: Inline JS expression (sandboxed)\r\n *\r\n * Variables:\r\n * - {{ previous_output }} - Output from the connected input node\r\n * - {{ node_id.property }} - Access specific node outputs\r\n * - {{ workflow.param_name }} - Workflow parameters\r\n */\r\nexport interface TransformerNodeData extends BaseNodeData {\r\n /** Transform mode */\r\n mode: 'template' | 'jq' | 'expression'\r\n\r\n /** JSON template string with {{ variable }} syntax (for template mode) */\r\n template?: string\r\n\r\n /** JQ-style query expression (for jq mode, future) */\r\n jqExpression?: string\r\n\r\n /** JavaScript expression that returns transformed value (for expression mode) */\r\n expression?: string\r\n\r\n /** Input variable name (defaults to 'input') */\r\n inputVariable?: string\r\n\r\n /** Whether to pass through unchanged if transform fails */\r\n passthroughOnError?: boolean\r\n\r\n /** Description of what this transform does */\r\n description?: string\r\n\r\n // Legacy field for backwards compatibility\r\n transform?: string\r\n}\r\n\r\nexport interface ApiNodeData extends BaseNodeData {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n url: string\r\n headers?: Record<string, string>\r\n body?: string // Template expression\r\n retryPolicy?: RetryPolicy\r\n}\r\n\r\n/**\r\n * ToolNodeData - Unified tool execution node\r\n *\r\n * Supports five tool types:\r\n * - function: Call a registered function/callback provided to the workflow executor\r\n * - mcp: Call a tool exposed by an MCP (Model Context Protocol) server\r\n * - http: Make an HTTP request (similar to ApiNodeData but unified interface)\r\n * - command: Execute a whitelisted shell command (npm, git, python, etc.)\r\n * - code: Execute code snippets (TypeScript/JavaScript, Python, or C#)\r\n *\r\n * Use cases:\r\n * - Database lookups\r\n * - Code execution\r\n * - External API integration\r\n * - MCP-compatible AI tools\r\n * - Custom business logic\r\n * - Shell command execution\r\n * - Data transformation via code\r\n */\r\nexport interface ToolNodeData extends BaseNodeData {\r\n /** Tool type determines how the tool is invoked */\r\n toolType: 'function' | 'mcp' | 'http' | 'command' | 'code'\r\n\r\n /** Tool name - for function/mcp types, this identifies the tool to call */\r\n toolName: string\r\n\r\n /** Description shown in the node and used for documentation */\r\n description?: string\r\n\r\n /** Input parameters - template expressions supported */\r\n parameters?: Record<string, unknown>\r\n\r\n /** Parameter schema for validation and UI generation */\r\n parameterSchema?: {\r\n type: 'object'\r\n properties?: Record<string, {\r\n type: string\r\n description?: string\r\n default?: unknown\r\n enum?: string[]\r\n }>\r\n required?: string[]\r\n }\r\n\r\n // === HTTP-specific fields (toolType: 'http') ===\r\n /** HTTP method (only for http type) */\r\n httpMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n /** URL template (only for http type) */\r\n httpUrl?: string\r\n /** HTTP headers (only for http type) */\r\n httpHeaders?: Record<string, string>\r\n /** Request body template (only for http type) */\r\n httpBody?: string\r\n\r\n // === MCP-specific fields (toolType: 'mcp') ===\r\n /** MCP server URL (only for mcp type) */\r\n mcpServerUrl?: string\r\n /** MCP server name/identifier (alternative to URL for configured servers) */\r\n mcpServerName?: string\r\n\r\n // === Command-specific fields (toolType: 'command') ===\r\n /** The executable to run (must be in allowed list or custom commands) */\r\n commandExecutable?: string\r\n /** Action/subcommand (e.g., 'run' for npm, 'status' for git) */\r\n commandAction?: string\r\n /** Arguments template (supports {{ }} expressions) */\r\n commandArgs?: string\r\n /** Working directory (relative to workspace) */\r\n commandCwd?: string\r\n /** Whether this command requires user approval before execution */\r\n commandRequiresApproval?: boolean\r\n /** Custom command ID (references CustomCommandConfig from connections) */\r\n customCommandId?: string\r\n\r\n // === Code-specific fields (toolType: 'code') ===\r\n /** Programming language for code execution */\r\n codeLanguage?: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n /** The code snippet to execute */\r\n codeSnippet?: string\r\n /** Variable name for previous_output (default: 'input') */\r\n codeInputVariable?: string\r\n /** For TS/JS: execution context */\r\n codeExecutionContext?: 'isolated' | 'main'\r\n\r\n // === Common execution options ===\r\n /** Timeout in milliseconds */\r\n timeout?: number\r\n /** Retry policy for failed executions */\r\n retryPolicy?: RetryPolicy\r\n /** Transform the result before passing to next node */\r\n outputTransform?: string\r\n}\r\n\r\n/**\r\n * ToolCallParserNodeData - Parse LLM output for tool call requests\r\n *\r\n * This node detects and extracts tool calls from LLM responses, enabling\r\n * agentic workflows where the LLM decides which tools to call.\r\n *\r\n * Supported formats:\r\n * - openai: OpenAI function calling format (tool_calls array)\r\n * - anthropic: Anthropic tool_use blocks\r\n * - xml: XML-style <tool_call> tags\r\n * - json: Generic JSON with configurable field names\r\n * - auto: Automatically detect format\r\n *\r\n * Output structure:\r\n * {\r\n * hasToolCall: boolean,\r\n * toolName: string | null,\r\n * toolParameters: Record<string, unknown> | null,\r\n * remainingText: string, // Text after tool call extraction\r\n * rawToolCall: unknown, // Original tool call data\r\n * format: string // Detected format\r\n * }\r\n */\r\nexport interface ToolCallParserNodeData extends BaseNodeData {\r\n /** Format to parse - 'auto' will attempt to detect */\r\n format: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** For 'json' format: field name containing the tool name */\r\n jsonToolNameField?: string\r\n /** For 'json' format: field name containing the parameters */\r\n jsonParametersField?: string\r\n\r\n /** For 'xml' format: tag name for tool calls (default: 'tool_call') */\r\n xmlTagName?: string\r\n\r\n /** List of valid tool names - if provided, only these will be recognized */\r\n allowedTools?: string[]\r\n\r\n /** What to do if no tool call is found */\r\n noToolCallBehavior: 'passthrough' | 'error' | 'default'\r\n\r\n /** Default tool to use if noToolCallBehavior is 'default' */\r\n defaultTool?: string\r\n defaultParameters?: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * ToolCallRouterNodeData - Container node for grouping Tool nodes\r\n *\r\n * This node acts as a container that groups Tool nodes together and routes\r\n * tool calls from Agent nodes to the appropriate Tool node based on tool name.\r\n *\r\n * Usage:\r\n * 1. Create a ToolCallRouter node on the canvas\r\n * 2. Drag Tool nodes inside the container (they become children via parentId)\r\n * 3. Connect Agent's onCheckpoint handle to router's toolCall input\r\n * 4. Connect router's toolResult output back to Agent's toolResult input\r\n *\r\n * The router automatically collects tool schemas from child Tool nodes and\r\n * dispatches tool calls to the matching Tool node for execution.\r\n */\r\nexport interface ToolCallRouterNodeData extends BaseNodeData {\r\n /** How tool calls are matched to Tool nodes */\r\n routingMode: 'name-match' | 'pattern' | 'fallback'\r\n\r\n /** Behavior when no Tool node matches the requested tool name */\r\n onNoMatch: 'error' | 'passthrough' | 'fallback-tool'\r\n\r\n /** ID of a Tool node inside this router to use as fallback */\r\n fallbackToolId?: string\r\n\r\n /** Whether the container is collapsed (hides child nodes) */\r\n collapsed?: boolean\r\n}\r\n\r\nexport interface OutputNodeData extends BaseNodeData {\r\n outputSchema?: JsonSchema\r\n result?: unknown // Execution result\r\n}\r\n\r\n/**\r\n * ErrorHandlerNodeData - Workflow-level error handling configuration\r\n *\r\n * Error handling is configured as a **workflow-level node** that other nodes\r\n * reference by ID (similar to how nodes reference Provider nodes). This avoids\r\n * cluttering the graph with inline error edges.\r\n *\r\n * Nodes reference an ErrorHandler via `errorHandlerNodeId` in BaseNodeData.\r\n * When an error occurs, the executor routes it to the referenced ErrorHandler\r\n * for retry, fallback, or notification handling.\r\n *\r\n * Strategies:\r\n * - retry: Attempt the operation again with backoff\r\n * - fallback: Return a fallback value or execute a fallback node\r\n * - notify: Send notification (webhook, log) and continue\r\n * - ignore: Swallow the error and continue with null/undefined\r\n * - rethrow: Re-throw the error to stop execution\r\n *\r\n * Visual representation:\r\n * - Displayed in \"Error Handlers\" section of NodePalette\r\n * - Rose/red color theme\r\n * - Dashed border to indicate \"config node\" vs \"flow node\"\r\n * - No edges - referenced by ID from other nodes\r\n */\r\nexport interface ErrorHandlerNodeData extends BaseNodeData {\r\n /** Error handling strategy */\r\n strategy: 'retry' | 'fallback' | 'notify' | 'ignore' | 'rethrow'\r\n\r\n // === Retry Configuration (strategy: 'retry') ===\r\n\r\n /** Retry policy */\r\n retry?: {\r\n /** Maximum number of retry attempts */\r\n maxAttempts: number\r\n /** Initial backoff delay in milliseconds */\r\n backoffMs: number\r\n /** Backoff multiplier for exponential backoff (e.g., 2 for doubling) */\r\n backoffMultiplier?: number\r\n /** Maximum backoff delay in milliseconds */\r\n maxBackoffMs?: number\r\n /** Error codes/patterns that should trigger a retry (empty = retry all) */\r\n retryOn?: string[]\r\n /** Error codes/patterns that should NOT trigger a retry */\r\n noRetryOn?: string[]\r\n }\r\n\r\n // === Fallback Configuration (strategy: 'fallback') ===\r\n\r\n /** Fallback value or node when all retries exhausted or strategy is 'fallback' */\r\n fallback?: {\r\n /** Type of fallback */\r\n type: 'value' | 'template' | 'node'\r\n /** Static value to return (when type is 'value') */\r\n value?: unknown\r\n /** Template expression to evaluate (when type is 'template') */\r\n template?: string\r\n /** Node ID to execute as fallback (when type is 'node') */\r\n nodeId?: string\r\n }\r\n\r\n // === Notification Configuration (strategy: 'notify' or any strategy) ===\r\n\r\n /** Notification settings */\r\n notify?: {\r\n /** Webhook URL to POST error details */\r\n webhookUrl?: string\r\n /** HTTP headers for webhook */\r\n webhookHeaders?: Record<string, string>\r\n /** Whether to include stack trace in notification */\r\n includeStack?: boolean\r\n /** Whether to include node input/context in notification */\r\n includeContext?: boolean\r\n /** Custom message template (supports {{ error.message }}, {{ node.id }}, etc.) */\r\n messageTemplate?: string\r\n }\r\n\r\n // === Logging Configuration ===\r\n\r\n /** Logging settings */\r\n log?: {\r\n /** Log level for this error handler */\r\n level: 'error' | 'warn' | 'info' | 'debug'\r\n /** Whether to include the node data that caused the error */\r\n includeNodeData?: boolean\r\n /** Whether to include input data */\r\n includeInput?: boolean\r\n }\r\n\r\n // === Condition Configuration ===\r\n\r\n /** Only handle errors matching these conditions */\r\n conditions?: {\r\n /** Error codes/patterns to match (regex supported) */\r\n errorCodes?: string[]\r\n /** Error message patterns to match (regex supported) */\r\n messagePatterns?: string[]\r\n /** Node types this handler applies to */\r\n nodeTypes?: WorkflowNodeType[]\r\n }\r\n\r\n /** Description of this error handler */\r\n description?: string\r\n}\r\n\r\n/**\r\n * CheckpointNodeData - Configurable observation point for workflow execution\r\n *\r\n * The Checkpoint node is a flexible observation/control point that can:\r\n * - Log data to console and execution history\r\n * - Pause execution in debug mode (breakpoint)\r\n * - Gate execution requiring human approval (production use)\r\n * - Send webhook notifications to external systems\r\n *\r\n * Pre-Node Aware: The checkpoint detects what type of node feeds into it\r\n * and can subscribe to specific events from that node (e.g., Agent iterations).\r\n *\r\n * All behaviors are toggleable and can be combined.\r\n */\r\nexport interface CallbackNodeData extends BaseNodeData {\r\n /** Custom name for this checkpoint (shown in logs/UI) */\r\n checkpointName?: string\r\n /** Description of what this checkpoint monitors */\r\n description?: string\r\n\r\n // ============================================================================\r\n // Behaviors (toggleable, can combine multiple)\r\n // ============================================================================\r\n\r\n /** Log checkpoint data to console/stdout */\r\n logToConsole?: boolean\r\n /** Store checkpoint data in execution history for later review */\r\n logToHistory?: boolean\r\n /** Pause execution when running in debug mode (breakpoint) */\r\n pauseInDebug?: boolean\r\n /** Require human approval before continuing (works in production) */\r\n requireApproval?: boolean\r\n /** Send HTTP webhook notification */\r\n sendWebhook?: boolean\r\n\r\n // ============================================================================\r\n // Data Capture Options\r\n // ============================================================================\r\n\r\n /** Include the previous node's output in checkpoint data */\r\n capturePreviousOutput?: boolean\r\n /** Include timestamp and execution duration */\r\n captureTimestamp?: boolean\r\n /** Include full execution context (all variables, workflow state) */\r\n captureFullContext?: boolean\r\n /** Custom message template (supports {{ }} expressions) */\r\n message?: string\r\n\r\n // ============================================================================\r\n // Approval Options (when requireApproval is true)\r\n // ============================================================================\r\n\r\n /** Title shown in approval dialog */\r\n approvalTitle?: string\r\n /** Instructions for the reviewer */\r\n approvalInstructions?: string\r\n /** Timeout in ms to wait for approval (0 = wait indefinitely) */\r\n approvalTimeoutMs?: number\r\n /** What to do if approval times out */\r\n approvalTimeoutAction?: 'continue' | 'fail' | 'skip'\r\n\r\n // ============================================================================\r\n // Webhook Options (when sendWebhook is true)\r\n // ============================================================================\r\n\r\n /** Webhook URL to POST checkpoint data */\r\n webhookUrl?: string\r\n /** Custom headers to include in webhook request */\r\n webhookHeaders?: Record<string, string>\r\n /** Whether to wait for webhook acknowledgment before continuing */\r\n webhookWaitForAck?: boolean\r\n /** Timeout in ms to wait for acknowledgment (0 = no timeout) */\r\n webhookAckTimeoutMs?: number\r\n\r\n // ============================================================================\r\n // Pre-Node Awareness (auto-detected based on incoming connection)\r\n // ============================================================================\r\n\r\n /**\r\n * Detected type of the node connected to this checkpoint's input.\r\n * This is auto-populated and used to show relevant options in the UI.\r\n * @readonly - Set automatically, not user-configurable\r\n */\r\n _detectedSourceType?: WorkflowNodeType\r\n\r\n // === Agent-specific options (shown when source is 'agent') ===\r\n\r\n /** Include full iteration history from agent execution */\r\n agentCaptureIterations?: boolean\r\n /** Include conversation/message history */\r\n agentCaptureConversation?: boolean\r\n /** Include tool call details and results */\r\n agentCaptureToolCalls?: boolean\r\n /** Include agent's thinking/reasoning (if available) */\r\n agentCaptureThinking?: boolean\r\n\r\n /**\r\n * Event types to listen for when connected to an Agent's onCheckpoint handle.\r\n * If empty or undefined, listens to all event types.\r\n */\r\n listenTo?: AgentCheckpointEventType[]\r\n\r\n // === Loop-specific options (shown when source is 'loop') ===\r\n\r\n /** Capture current iteration index */\r\n loopCaptureIteration?: boolean\r\n /** Capture loop variable value */\r\n loopCaptureVariable?: boolean\r\n\r\n // === Prompt-specific options (shown when source is 'prompt') ===\r\n\r\n /** Include the compiled prompt that was sent to the LLM */\r\n promptCaptureCompiled?: boolean\r\n /** Include token usage stats */\r\n promptCaptureTokens?: boolean\r\n\r\n // ============================================================================\r\n // Legacy/Deprecated (for backwards compatibility)\r\n // ============================================================================\r\n\r\n /** @deprecated Use individual behavior toggles instead */\r\n mode?: 'passthrough' | 'pause' | 'report'\r\n /** @deprecated Use capturePreviousOutput instead */\r\n includePreviousOutput?: boolean\r\n /** @deprecated Use captureFullContext instead */\r\n includeNextNodeInfo?: boolean\r\n /** @deprecated Use webhookWaitForAck instead */\r\n waitForAck?: boolean\r\n /** @deprecated Use webhookAckTimeoutMs instead */\r\n ackTimeoutMs?: number\r\n /** @deprecated Use agentCaptureIterations instead */\r\n agentIncludeIterationHistory?: boolean\r\n /** @deprecated Use agentCaptureConversation instead */\r\n agentIncludeConversationHistory?: boolean\r\n /** @deprecated Use agentCaptureToolCalls instead */\r\n agentIncludeToolCalls?: boolean\r\n}\r\n\r\n/**\r\n * UserInputNodeData - Pause workflow and collect user input\r\n *\r\n * This node pauses execution and waits for user input. It can be used for:\r\n * - Interactive chat loops (user message -> LLM -> user message -> ...)\r\n * - Human-in-the-loop approval workflows\r\n * - Data collection mid-workflow\r\n * - Debugging with manual input injection\r\n *\r\n * The node provides context (previous output, conversation history) to help\r\n * the user understand what input is needed.\r\n */\r\nexport interface UserInputNodeData extends BaseNodeData {\r\n /** Prompt message shown to the user (supports {{ }} template expressions) */\r\n prompt: string\r\n /** Type of input to collect */\r\n inputType: 'text' | 'textarea' | 'choice' | 'confirm' | 'number'\r\n /** Choices for 'choice' input type */\r\n choices?: string[]\r\n /** Placeholder text for input field */\r\n placeholder?: string\r\n /** Default value for the input */\r\n defaultValue?: string\r\n /** Whether input is required to continue */\r\n required?: boolean\r\n /** Whether to show the previous node's output to the user */\r\n showContext?: boolean\r\n /** Custom template for displaying context (supports {{ previous_output }}, {{ variables }}) */\r\n contextTemplate?: string\r\n /** Timeout in ms (0 = wait indefinitely) */\r\n timeout?: number\r\n}\r\n\r\n// ============================================================================\r\n// Phase E: Advanced Nodes\r\n// ============================================================================\r\n\r\n/**\r\n * CommandNodeData - Execute whitelisted shell commands\r\n *\r\n * This node executes shell commands with proper security controls:\r\n * - Commands can be whitelisted by admin\r\n * - Arguments are passed safely (not interpolated into command string)\r\n * - Output is captured and parsed\r\n * - Requires approval for sensitive operations\r\n */\r\nexport interface CommandNodeData extends BaseNodeData {\r\n /** Command template (supports {{ }} expressions for arguments) */\r\n command: string\r\n\r\n /** Command arguments (safer than string interpolation) */\r\n args?: string[]\r\n\r\n /** Working directory (relative to workspace) */\r\n cwd?: string\r\n\r\n /** Environment variables to set */\r\n env?: Record<string, string>\r\n\r\n /** Timeout in milliseconds */\r\n timeoutMs?: number\r\n\r\n /** Output parsing format */\r\n outputFormat: 'text' | 'json' | 'lines'\r\n\r\n /** Whether this command requires user approval before execution */\r\n requiresApproval?: boolean\r\n\r\n /** Description shown in approval dialog */\r\n approvalMessage?: string\r\n}\r\n\r\n/**\r\n * WebSearchNodeData - Search the web via configurable provider\r\n *\r\n * Uses the connection system to configure which search provider to use.\r\n * Supports SearXNG (free, no key), Brave Search, and Tavily.\r\n */\r\nexport interface WebSearchNodeData extends BaseNodeData {\r\n /** Search query template (supports {{ }} expressions) */\r\n query: string\r\n\r\n /** Maximum number of results to return (default: 5) */\r\n resultCount?: number\r\n\r\n /** Search provider: 'searxng' (free, default), 'brave', or 'tavily' */\r\n provider?: 'searxng' | 'brave' | 'tavily'\r\n\r\n /** API key for Brave/Tavily providers */\r\n apiKey?: string\r\n\r\n /** SearXNG instance URL (default: https://search.sapti.me) */\r\n instanceUrl?: string\r\n}\r\n\r\n/**\r\n * ClaudeCodeNodeData - Claude Code agent with SSH support for remote development\r\n *\r\n * This node encapsulates a full Claude Code agent that can:\r\n * - Connect to local or remote systems via SSH\r\n * - Execute multi-turn development tasks\r\n * - Use file editing, command execution, and web tools\r\n * - Stream progress back to the workflow\r\n */\r\nexport interface ClaudeCodeNodeData extends BaseNodeData {\r\n /** Connection type and configuration */\r\n connection: {\r\n type: 'local' | 'ssh'\r\n\r\n /** SSH settings (when type === 'ssh') */\r\n ssh?: {\r\n /** Reference to SSH connection from Connections Panel */\r\n connectionId?: string\r\n /** Or inline config (deprecated - use connectionId) */\r\n host?: string\r\n port?: number\r\n username?: string\r\n authMethod?: 'key' | 'agent'\r\n keyPath?: string\r\n }\r\n }\r\n\r\n /** Task configuration */\r\n task: {\r\n /** Main task description (supports {{ }} template expressions) */\r\n prompt: string\r\n\r\n /** Optional system prompt override */\r\n systemPrompt?: string\r\n\r\n /** Working directory on target (relative or absolute) */\r\n workingDirectory?: string\r\n\r\n /** Files to include as context (glob patterns) */\r\n contextFiles?: string[]\r\n }\r\n\r\n /** Execution constraints */\r\n constraints: {\r\n /** Maximum agent turns before forcing completion */\r\n maxTurns?: number\r\n\r\n /** Allowed tool categories */\r\n allowedTools?: ('read' | 'write' | 'execute' | 'web')[]\r\n\r\n /** Blocked file patterns (security) */\r\n blockedPaths?: string[]\r\n\r\n /** Require approval for write operations */\r\n requireApprovalForWrites?: boolean\r\n\r\n /** Timeout for entire execution (ms) */\r\n timeoutMs?: number\r\n }\r\n\r\n /** Output configuration */\r\n output: {\r\n /** What to return as node output */\r\n format: 'final-response' | 'full-conversation' | 'files-changed' | 'structured'\r\n\r\n /** For structured output - JSON schema to enforce */\r\n schema?: JsonSchema\r\n\r\n /** Include execution metadata (tokens, duration, etc.) */\r\n includeMetadata?: boolean\r\n }\r\n}\r\n\r\n/**\r\n * WorkflowNodeData - Invoke another .pdflow as a sub-workflow\r\n *\r\n * This enables workflow composition:\r\n * - Call reusable workflow modules\r\n * - Pass parameters and receive outputs\r\n * - Support for recursive workflows (with depth limit)\r\n */\r\nexport interface WorkflowNodeData extends BaseNodeData {\r\n /** Source workflow path or package reference */\r\n source: string\r\n\r\n /** Parameter mapping (input to sub-workflow) */\r\n parameters: Record<string, string>\r\n\r\n /** Output mapping (sub-workflow output to this node's output) */\r\n outputMapping?: Record<string, string>\r\n\r\n /** Execution options */\r\n timeout?: number\r\n\r\n /** Whether to pass parent workflow variables */\r\n inheritVariables?: boolean\r\n\r\n /** Maximum recursion depth (to prevent infinite loops) */\r\n maxDepth?: number\r\n}\r\n\r\n/**\r\n * McpToolNodeData - Execute tools from external MCP servers\r\n *\r\n * This node connects to external MCP servers and executes their tools.\r\n * Unlike the generic Tool node, this is specifically for MCP protocol\r\n * and supports MCP-specific features like resources and prompts.\r\n */\r\nexport interface McpToolNodeData extends BaseNodeData {\r\n /** Reference to MCP server connection from Connections Panel */\r\n connectionId?: string\r\n\r\n /** Or inline MCP server config (deprecated - use connectionId) */\r\n serverConfig?: {\r\n serverUrl?: string\r\n serverName?: string\r\n transport?: 'stdio' | 'http' | 'websocket'\r\n }\r\n\r\n /** Tool name to execute */\r\n toolName: string\r\n\r\n /** Parameter mapping (supports {{ }} expressions) */\r\n parameters: Record<string, string>\r\n\r\n /** Timeout for tool execution (ms) */\r\n timeoutMs?: number\r\n\r\n /** Whether to include tool result in conversation context */\r\n includeInContext?: boolean\r\n}\r\n\r\n/**\r\n * CodeNodeData - Execute code snippets in various languages\r\n *\r\n * Supports:\r\n * - TypeScript/JavaScript: Runs in isolated VM context or via temp file\r\n * - Python: Executes via python -c or temp file\r\n * - C#: Executes via dotnet-script or compiled temp file\r\n *\r\n * The previous_output is available as a variable (default name: 'input')\r\n */\r\nexport interface CodeNodeData extends BaseNodeData {\r\n /** Programming language */\r\n language: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n\r\n /** The code to execute */\r\n code: string\r\n\r\n /** Variable name for the input (previous_output), default: 'input' */\r\n inputVariable?: string\r\n\r\n /** For TS/JS: run in isolated VM or main context */\r\n executionContext?: 'isolated' | 'main'\r\n\r\n /** Timeout in milliseconds (default: 30000) */\r\n timeoutMs?: number\r\n\r\n /** Description of what this code does */\r\n description?: string\r\n}\r\n\r\n/**\r\n * MemoryNodeData - Configurable memory storage node\r\n *\r\n * Supports multiple memory patterns:\r\n * - 'kv': Key-value store for passing state between nodes\r\n * - 'conversation': Message history with sliding window for chat context\r\n * - 'cache': Time-based caching for expensive operations\r\n *\r\n * Memory is scoped to workflow execution by default, but can be\r\n * persisted across executions via the 'persistent' flag.\r\n *\r\n * Handles:\r\n * - input (left) - Data to store or key to retrieve\r\n * - output (right) - Retrieved value or confirmation\r\n */\r\n/** Memory operation type */\r\nexport type MemoryOperation = 'get' | 'set' | 'delete' | 'clear' | 'list' | 'append'\r\n\r\n/** Operations available per memory mode */\r\nexport const MEMORY_OPERATIONS_BY_MODE: Record<string, MemoryOperation[]> = {\r\n kv: ['get', 'set', 'delete', 'list', 'clear'],\r\n conversation: ['get', 'append', 'clear'],\r\n cache: ['get', 'set', 'delete', 'clear'],\r\n}\r\n\r\nexport interface MemoryNodeData extends BaseNodeData {\r\n /** Memory operation mode */\r\n mode: 'kv' | 'conversation' | 'cache'\r\n\r\n /**\r\n * Operations this node can perform (multi-select).\r\n * When multiple operations are enabled, the input data's `operation` field\r\n * determines which to execute, or defaults to the first enabled operation.\r\n */\r\n operations: MemoryOperation[]\r\n\r\n // ============================================================================\r\n // Key-Value Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Key for the value (supports {{ }} template expressions).\r\n * Used in kv and cache modes.\r\n */\r\n key?: string\r\n\r\n /**\r\n * Value to store (supports {{ }} template expressions).\r\n * Used with 'set' operation. If not provided, uses input data.\r\n */\r\n value?: string\r\n\r\n /**\r\n * Default value to return if key doesn't exist.\r\n * Used with 'get' operation.\r\n */\r\n defaultValue?: string\r\n\r\n // ============================================================================\r\n // Conversation Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Conversation/thread identifier (supports {{ }} expressions).\r\n * Allows multiple separate conversation histories.\r\n */\r\n conversationId?: string\r\n\r\n /**\r\n * Role for the message being appended ('user', 'assistant', 'system').\r\n * Used with 'append' operation in conversation mode.\r\n */\r\n messageRole?: 'user' | 'assistant' | 'system'\r\n\r\n /**\r\n * Maximum messages to retain in sliding window.\r\n * Older messages are removed when limit is exceeded.\r\n * Set to 0 for unlimited.\r\n */\r\n maxMessages?: number\r\n\r\n /**\r\n * Include system messages in the sliding window count.\r\n * If false, system messages are always retained.\r\n */\r\n includeSystemInWindow?: boolean\r\n\r\n // ============================================================================\r\n // Cache Mode Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * Time-to-live in seconds for cached values.\r\n * After TTL expires, 'get' returns defaultValue or undefined.\r\n * Set to 0 for no expiration.\r\n */\r\n ttlSeconds?: number\r\n\r\n /**\r\n * Refresh TTL on read (sliding expiration).\r\n * If true, reading a value resets its TTL.\r\n */\r\n refreshOnRead?: boolean\r\n\r\n // ============================================================================\r\n // Persistence & Scope\r\n // ============================================================================\r\n\r\n /**\r\n * Memory scope:\r\n * - 'execution': Cleared when workflow execution completes (default)\r\n * - 'workflow': Persists across executions of this workflow\r\n * - 'global': Shared across all workflows (use with caution)\r\n */\r\n scope?: 'execution' | 'workflow' | 'global'\r\n\r\n /**\r\n * Namespace to isolate this memory from others.\r\n * Useful for avoiding key collisions in global scope.\r\n */\r\n namespace?: string\r\n\r\n // ============================================================================\r\n // Output Configuration\r\n // ============================================================================\r\n\r\n /**\r\n * What to output after the operation:\r\n * - 'value': The retrieved/stored value\r\n * - 'success': Boolean indicating success\r\n * - 'metadata': Object with value, timestamp, ttl info\r\n * - 'passthrough': Pass input through unchanged\r\n */\r\n outputMode?: 'value' | 'success' | 'metadata' | 'passthrough'\r\n}\r\n\r\nexport interface DatabaseQueryNodeData extends BaseNodeData {\r\n /** Reference to a saved database connection */\r\n connectionId: string\r\n\r\n /** Query type determines how the query is executed */\r\n queryType: 'select' | 'insert' | 'update' | 'delete' | 'raw' | 'aggregate'\r\n\r\n /** SQL query, MongoDB JSON query document, or Redis command */\r\n query: string\r\n\r\n /** JSON-encoded parameter array for parameterized queries (SQL only) */\r\n parameters?: string\r\n\r\n /** MongoDB collection name (only for MongoDB connections) */\r\n collection?: string\r\n\r\n /** Maximum rows to return (default 1000) */\r\n maxRows?: number\r\n\r\n /** Query timeout in milliseconds (default 30000) */\r\n timeoutMs?: number\r\n}\r\n\r\n/**\r\n * CustomCommandConfig - User-defined allowed commands\r\n *\r\n * Stored in the Connections panel, these allow users to whitelist\r\n * additional shell commands for use in Tool nodes.\r\n */\r\nexport interface CustomCommandConfig {\r\n /** Unique identifier */\r\n id: string\r\n\r\n /** The executable name (e.g., 'cargo', 'terraform', 'kubectl') */\r\n executable: string\r\n\r\n /** Allowed actions/subcommands (if empty, any args allowed with validation) */\r\n allowedActions?: string[]\r\n\r\n /** Human-readable description */\r\n description?: string\r\n\r\n /** Whether to require approval before execution */\r\n requiresApproval: boolean\r\n\r\n /** When this command was added */\r\n addedAt: number\r\n}\r\n\r\n/**\r\n * Built-in allowed executables for command tool type\r\n */\r\nexport const BUILTIN_COMMAND_EXECUTABLES = [\r\n { executable: 'npm', description: 'Node.js package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'npx', description: 'Execute npm packages', actions: [] },\r\n { executable: 'node', description: 'Node.js runtime', actions: [] },\r\n { executable: 'yarn', description: 'Yarn package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'pnpm', description: 'PNPM package manager', actions: ['run', 'install', 'test', 'build', 'start'] },\r\n { executable: 'git', description: 'Version control', actions: ['status', 'add', 'commit', 'push', 'pull', 'log', 'diff', 'branch'] },\r\n { executable: 'python', description: 'Python interpreter', actions: [] },\r\n { executable: 'python3', description: 'Python 3 interpreter', actions: [] },\r\n { executable: 'pip', description: 'Python package manager', actions: ['install', 'list', 'show'] },\r\n { executable: 'prompd', description: 'Prompd CLI', actions: ['compile', 'run', 'validate', 'package'] },\r\n { executable: 'dotnet', description: '.NET CLI', actions: ['build', 'run', 'test', 'publish'] },\r\n { executable: 'tsc', description: 'TypeScript compiler', actions: [] },\r\n { executable: 'eslint', description: 'JavaScript linter', actions: [] },\r\n { executable: 'prettier', description: 'Code formatter', actions: [] },\r\n { executable: 'echo', description: 'Print text', actions: [] },\r\n] as const\r\n\r\n/**\r\n * AgentIterationRecord - Record of a single agent iteration for debugging\r\n */\r\nexport interface AgentIterationRecord {\r\n iteration: number\r\n timestamp: number\r\n llmInput: {\r\n systemPrompt: string\r\n conversationHistory: Array<{ role: string; content: string }>\r\n }\r\n llmOutput: {\r\n response: string\r\n hasToolCall: boolean\r\n toolName?: string\r\n toolParams?: Record<string, unknown>\r\n }\r\n toolExecution?: {\r\n toolName: string\r\n parameters: Record<string, unknown>\r\n result: unknown\r\n error?: string\r\n durationMs: number\r\n }\r\n durationMs: number\r\n}\r\n\r\n// ============================================================================\r\n// Agent Checkpoint Event Types\r\n// ============================================================================\r\n\r\n/**\r\n * AgentCheckpointEvent - Events emitted by Agent nodes during execution\r\n *\r\n * Agent nodes emit these events through their onCheckpoint handle, allowing\r\n * connected Callback nodes to observe and react to agent execution.\r\n *\r\n * Event types:\r\n * - toolCall: Agent is requesting a tool execution\r\n * - iteration: Agent completed an iteration of the ReAct loop\r\n * - thinking: Agent emitted reasoning/chain-of-thought\r\n * - error: An error occurred during agent execution\r\n * - complete: Agent finished execution\r\n */\r\nexport type AgentCheckpointEventType = 'toolCall' | 'iteration' | 'thinking' | 'error' | 'complete'\r\n\r\nexport interface AgentCheckpointEvent {\r\n /** Type of event */\r\n type: AgentCheckpointEventType\r\n /** When the event occurred */\r\n timestamp: number\r\n /** Current iteration number (1-indexed) */\r\n iteration: number\r\n /** Node ID of the agent that emitted this event */\r\n agentNodeId: string\r\n /** Event-specific data */\r\n data: ToolCallEventData | IterationEventData | ThinkingEventData | ErrorEventData | CompleteEventData\r\n}\r\n\r\n/** Data for 'toolCall' events - agent is requesting tool execution */\r\nexport interface ToolCallEventData {\r\n toolName: string\r\n parameters: Record<string, unknown>\r\n /** Tool schema for validation (if available) */\r\n schema?: {\r\n type: 'object'\r\n properties?: Record<string, { type: string; description?: string }>\r\n required?: string[]\r\n }\r\n}\r\n\r\n/** Data for 'iteration' events - agent completed a ReAct loop iteration */\r\nexport interface IterationEventData {\r\n iterationNumber: number\r\n llmInput: {\r\n systemPrompt: string\r\n messages: Array<{ role: string; content: string }>\r\n }\r\n llmOutput: {\r\n response: string\r\n hasToolCall: boolean\r\n toolName?: string\r\n toolParams?: Record<string, unknown>\r\n }\r\n durationMs: number\r\n}\r\n\r\n/** Data for 'thinking' events - agent's reasoning/chain-of-thought */\r\nexport interface ThinkingEventData {\r\n thought: string\r\n}\r\n\r\n/** Data for 'error' events - an error occurred */\r\nexport interface ErrorEventData {\r\n message: string\r\n code?: string\r\n stack?: string\r\n recoverable: boolean\r\n}\r\n\r\n/** Data for 'complete' events - agent finished execution */\r\nexport interface CompleteEventData {\r\n finalResponse: string\r\n totalIterations: number\r\n totalDurationMs: number\r\n stopReason: 'max-iterations' | 'stop-phrase' | 'no-tool-call' | 'error' | 'completed'\r\n}\r\n\r\n/**\r\n * AgentNodeData - Autonomous AI agent with tool-use loop\r\n *\r\n * Implements a ReAct-style (Reasoning + Acting) agent that:\r\n * 1. Sends a prompt to an LLM with tool definitions\r\n * 2. Parses the response for tool calls\r\n * 3. Executes requested tools\r\n * 4. Feeds results back to the LLM\r\n * 5. Repeats until LLM provides final answer or max iterations reached\r\n *\r\n * This encapsulates the common \"agentic loop\" pattern into a single node.\r\n *\r\n * Debug Mode:\r\n * When debugConfig.debugMode is enabled, the agent emits detailed traces at\r\n * internal checkpoints and can optionally pause at each checkpoint (like breakpoints).\r\n * Iteration history is stored in the node output for downstream analysis.\r\n */\r\nexport interface AgentNodeData extends BaseNodeData {\r\n /** System prompt that defines the agent's behavior and available tools */\r\n systemPrompt: string\r\n\r\n /** Initial user message / task description (supports {{ }} template expressions) */\r\n userPrompt: string\r\n\r\n /** Reference to a Provider node by ID (preferred - enables centralized config) */\r\n providerNodeId?: string\r\n\r\n /** Inline LLM provider (fallback if no providerNodeId) */\r\n provider?: string\r\n\r\n /** Inline model (fallback if no providerNodeId) */\r\n model?: string\r\n\r\n /** Tool definitions available to the agent (legacy - prefer toolRouterNodeId) */\r\n tools: AgentTool[]\r\n\r\n /** Reference to a ToolCallRouter node by ID (preferred over inline tools) */\r\n toolRouterNodeId?: string\r\n\r\n /** Maximum number of tool-use iterations before stopping */\r\n maxIterations: number\r\n\r\n /** Format for tool calls in LLM responses */\r\n toolCallFormat: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** What to output when agent completes */\r\n outputMode: 'final-response' | 'full-conversation' | 'last-tool-result'\r\n\r\n /** Whether to include conversation history in context */\r\n includeHistory?: boolean\r\n\r\n /** Stop phrases that indicate the agent is done (in addition to no tool call) */\r\n stopPhrases?: string[]\r\n\r\n /** Temperature for LLM calls */\r\n temperature?: number\r\n\r\n /** Timeout per LLM call in ms */\r\n llmTimeout?: number\r\n}\r\n\r\n/**\r\n * GuardrailNodeData - Input validation node with success/rejected branching\r\n *\r\n * Validates input against a system prompt and routes to success or rejected paths.\r\n * Uses an LLM to evaluate the input and determine if it passes validation.\r\n *\r\n * Handles:\r\n * - input (left, top) - Data to validate\r\n * - rejected (left, bottom) - Source handle for routing rejected input back\r\n *\r\n * Outputs:\r\n * - output (right) - Validated input passes through on success\r\n *\r\n * The guardrail evaluates the input using the configured provider and system prompt,\r\n * then uses the passExpression to determine if the result indicates pass or fail.\r\n */\r\nexport interface GuardrailNodeData extends BaseNodeData {\r\n /** System prompt that defines the validation criteria */\r\n systemPrompt: string\r\n\r\n /** Reference to a Provider node by ID for LLM evaluation */\r\n providerNodeId?: string\r\n\r\n /** Inline provider (fallback if no providerNodeId) */\r\n provider?: string\r\n\r\n /** Inline model (fallback if no providerNodeId) */\r\n model?: string\r\n\r\n /**\r\n * Expression to evaluate pass/fail from the LLM response.\r\n * Supports {{ }} template syntax with access to the parsed response.\r\n *\r\n * Examples:\r\n * - \"{{ score >= 0.8 }}\" - Pass if score is 0.8 or higher\r\n * - \"{{ !rejected }}\" - Pass if rejected is falsy\r\n * - \"{{ score >= 0.8 && !rejected }}\" - Combined conditions\r\n *\r\n * The expression is evaluated against the parsed JSON response from the LLM.\r\n * If the LLM returns a non-JSON response, it's wrapped as { response: \"...\" }\r\n */\r\n passExpression?: string\r\n\r\n /**\r\n * Numeric threshold for pass/fail (alternative to passExpression).\r\n * If the LLM response contains a 'score' field, this threshold is used.\r\n * Input passes if score >= scoreThreshold.\r\n */\r\n scoreThreshold?: number\r\n\r\n /** Temperature for LLM evaluation (default: 0 for deterministic) */\r\n temperature?: number\r\n\r\n /** Timeout for LLM call in ms */\r\n timeout?: number\r\n\r\n /** Description of what this guardrail validates */\r\n description?: string\r\n}\r\n\r\n/**\r\n * ChatAgentNodeData - Composite container for conversational AI agent pattern\r\n *\r\n * Bundles the common pattern of: User Input → Guardrail → AI Agent ↔ Tool Router\r\n * into a single, configurable node with checkpoints at each stage.\r\n *\r\n * When collapsed: Shows as a single node with key metrics\r\n * When expanded: Shows all internal nodes for detailed editing\r\n *\r\n * Internal nodes (auto-created):\r\n * - UserInput: Collects user message\r\n * - Guardrail: Validates input before processing\r\n * - Agent: AI agent with ReAct loop\r\n * - ToolRouter: Container for available tools\r\n *\r\n * Handles:\r\n * - input (left) - Workflow data / conversation context\r\n * - output (right) - Final agent response\r\n * - rejected (left, bottom) - Guardrail rejection path\r\n */\r\nexport interface ChatAgentNodeData extends BaseNodeData {\r\n // ============================================================================\r\n // Container State\r\n // ============================================================================\r\n\r\n /** Whether the container is collapsed (shows as single node) */\r\n collapsed?: boolean\r\n\r\n /** Saved dimensions when expanded */\r\n _savedWidth?: number\r\n _savedHeight?: number\r\n\r\n // ============================================================================\r\n // Agent Configuration (propagates to internal Agent node)\r\n // ============================================================================\r\n\r\n /**\r\n * Agent prompt source type:\r\n * - 'raw': Inline text prompt (agentSystemPrompt field)\r\n * - 'file': Reference to .prmd file or package (agentPromptSource field)\r\n */\r\n agentPromptSourceType?: 'raw' | 'file'\r\n\r\n /** System prompt for the AI agent (used when agentPromptSourceType is 'raw' or not set) */\r\n agentSystemPrompt: string\r\n\r\n /** Source file for agent prompt (used when agentPromptSourceType is 'file') - local .prmd path or package reference */\r\n agentPromptSource?: string\r\n\r\n /** Initial user prompt template (supports {{ }} expressions) */\r\n agentUserPrompt?: string\r\n\r\n /** Reference to Provider node for LLM */\r\n providerNodeId?: string\r\n\r\n /** Inline provider (fallback) */\r\n provider?: string\r\n\r\n /** Inline model (fallback) */\r\n model?: string\r\n\r\n /** Maximum ReAct loop iterations */\r\n maxIterations?: number\r\n\r\n /** Tool call format detection */\r\n toolCallFormat?: 'auto' | 'openai' | 'anthropic' | 'xml' | 'json'\r\n\r\n /** What to output when complete */\r\n outputMode?: 'final-response' | 'full-conversation' | 'last-tool-result'\r\n\r\n /** Temperature for LLM calls */\r\n temperature?: number\r\n\r\n // ============================================================================\r\n // Loop Configuration - Controls the agent's iterative behavior\r\n // ============================================================================\r\n\r\n /**\r\n * Loop mode for the chat agent:\r\n * - 'single-turn': Execute once and return (no looping)\r\n * - 'multi-turn': Continue until stop condition or max iterations\r\n * - 'until-complete': Loop until agent signals completion\r\n * - 'user-driven': Loop back for user input after each response\r\n */\r\n loopMode?: 'single-turn' | 'multi-turn' | 'until-complete' | 'user-driven'\r\n\r\n /**\r\n * Condition expression to continue looping (for multi-turn mode).\r\n * Evaluated after each iteration. Loop continues while this is true.\r\n * Uses {{ }} template syntax with access to iteration context.\r\n *\r\n * Examples:\r\n * - \"{{ iteration < 5 }}\" - Continue for 5 iterations\r\n * - \"{{ !response.includes('DONE') }}\" - Until response contains DONE\r\n * - \"{{ tools_used > 0 }}\" - Continue if tools were used\r\n */\r\n loopCondition?: string\r\n\r\n /**\r\n * Stop phrases that signal the agent is done.\r\n * If the response contains any of these, the loop terminates.\r\n */\r\n stopPhrases?: string[]\r\n\r\n /**\r\n * Whether to prompt for user input after each agent response (for user-driven mode).\r\n * When true, the loop pauses for user input before continuing.\r\n */\r\n loopOnUserInput?: boolean\r\n\r\n /**\r\n * Minimum number of iterations before stop condition is checked.\r\n * Ensures the agent runs at least this many times.\r\n */\r\n minIterations?: number\r\n\r\n /**\r\n * Delay between iterations in milliseconds.\r\n * Useful for rate limiting or allowing processing time.\r\n */\r\n iterationDelayMs?: number\r\n\r\n // ============================================================================\r\n // Guardrail Configuration (propagates to internal Guardrail node)\r\n // ============================================================================\r\n\r\n /** Whether guardrail is enabled */\r\n guardrailEnabled?: boolean\r\n\r\n /** Guardrail system prompt */\r\n guardrailSystemPrompt?: string\r\n\r\n /** Reference to Provider node for guardrail LLM (can be different from agent's provider) */\r\n guardrailProviderNodeId?: string\r\n\r\n /** Inline provider for guardrail (fallback if no guardrailProviderNodeId) */\r\n guardrailProvider?: string\r\n\r\n /** Inline model for guardrail (fallback if no guardrailProviderNodeId) */\r\n guardrailModel?: string\r\n\r\n /** Temperature for guardrail LLM evaluation (default: 0 for deterministic) */\r\n guardrailTemperature?: number\r\n\r\n /** Pass/fail expression */\r\n guardrailPassExpression?: string\r\n\r\n /** Score threshold alternative */\r\n guardrailScoreThreshold?: number\r\n\r\n /** Output mode when guardrail passes */\r\n guardrailOutputMode?: 'passthrough' | 'original' | 'reject-message'\r\n\r\n /** Expected response format from guardrail LLM */\r\n guardrailExpectedFormat?: 'json' | 'text'\r\n\r\n /** JSON field to check for rejection status */\r\n guardrailRejectionField?: string\r\n\r\n /** Pass when field is true or false */\r\n guardrailPassWhen?: 'true' | 'false'\r\n\r\n /** Action to take when guardrail fails */\r\n guardrailFailAction?: 'error' | 'stop' | 'continue'\r\n\r\n /** Custom message when rejected */\r\n guardrailCustomRejectMessage?: string\r\n\r\n /** Custom rejection expression (advanced) - overrides simple field check */\r\n guardrailRejectionExpression?: string\r\n\r\n // ============================================================================\r\n // User Input Configuration (propagates to internal UserInput node)\r\n // ============================================================================\r\n\r\n /** Whether to prompt for user input at start of each iteration */\r\n userInputEnabled?: boolean\r\n\r\n /** Prompt message shown to user */\r\n userInputPrompt?: string\r\n\r\n /** Input type */\r\n userInputType?: 'text' | 'textarea' | 'choice' | 'confirm'\r\n\r\n /** Placeholder text */\r\n userInputPlaceholder?: string\r\n\r\n /** Whether to show previous context to user */\r\n userInputShowContext?: boolean\r\n\r\n // ============================================================================\r\n // Tool Configuration (propagates to internal ToolRouter)\r\n // ============================================================================\r\n\r\n /** Inline tool definitions (for simple cases) */\r\n tools?: AgentTool[]\r\n\r\n /** Reference to external ToolRouter node (for complex tool setups) */\r\n toolRouterNodeId?: string\r\n\r\n // ============================================================================\r\n // Checkpoint Configuration - Control observability at each stage\r\n // ============================================================================\r\n\r\n /** Checkpoint settings for different stages */\r\n checkpoints?: {\r\n /** On user input received */\r\n onUserInput?: ChatAgentCheckpointConfig\r\n\r\n /** Before guardrail validation */\r\n beforeGuardrail?: ChatAgentCheckpointConfig\r\n\r\n /** After guardrail (pass or reject) */\r\n afterGuardrail?: ChatAgentCheckpointConfig\r\n\r\n /** Before each agent iteration */\r\n onIterationStart?: ChatAgentCheckpointConfig\r\n\r\n /** After each agent iteration */\r\n onIterationEnd?: ChatAgentCheckpointConfig\r\n\r\n /** When agent requests a tool call */\r\n onToolCall?: ChatAgentCheckpointConfig\r\n\r\n /** After tool execution returns */\r\n onToolResult?: ChatAgentCheckpointConfig\r\n\r\n /** When agent completes */\r\n onAgentComplete?: ChatAgentCheckpointConfig\r\n }\r\n\r\n // ============================================================================\r\n // Internal Node References (auto-managed)\r\n // ============================================================================\r\n\r\n /** IDs of internal nodes (auto-created, managed by the container) */\r\n _internalNodes?: {\r\n userInputId?: string\r\n guardrailId?: string\r\n agentId?: string\r\n toolRouterId?: string\r\n }\r\n}\r\n\r\n/**\r\n * Checkpoint configuration for ChatAgentNode stages\r\n */\r\nexport interface ChatAgentCheckpointConfig {\r\n /** Whether this checkpoint is enabled */\r\n enabled: boolean\r\n\r\n /** Pause execution at this point (debug mode) */\r\n pause?: boolean\r\n\r\n /** Log to console */\r\n logToConsole?: boolean\r\n\r\n /** Log to execution history */\r\n logToHistory?: boolean\r\n\r\n /** Require approval to continue */\r\n requireApproval?: boolean\r\n\r\n /** Send webhook notification */\r\n sendWebhook?: boolean\r\n webhookUrl?: string\r\n\r\n /** Custom message template */\r\n message?: string\r\n\r\n /** Include full context in checkpoint data */\r\n includeFullContext?: boolean\r\n}\r\n\r\n/**\r\n * Tool definition for an agent\r\n */\r\nexport interface AgentTool {\r\n /** Unique tool name */\r\n name: string\r\n\r\n /** Description shown to the LLM */\r\n description: string\r\n\r\n /** JSON schema for tool parameters */\r\n parameters?: {\r\n type: 'object'\r\n properties?: Record<string, {\r\n type: string\r\n description?: string\r\n enum?: string[]\r\n default?: unknown\r\n }>\r\n required?: string[]\r\n }\r\n\r\n /** How this tool is executed */\r\n toolType: 'function' | 'http' | 'mcp' | 'workflow' | 'command' | 'code' | 'web-search' | 'database-query'\r\n\r\n /** For HTTP tools */\r\n httpConfig?: {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\r\n url: string\r\n headers?: Record<string, string>\r\n bodyTemplate?: string\r\n }\r\n\r\n /** For MCP tools */\r\n mcpConfig?: {\r\n serverUrl?: string\r\n serverName?: string\r\n }\r\n\r\n /** For workflow tools - execute a sub-workflow */\r\n workflowConfig?: {\r\n workflowPath: string\r\n }\r\n\r\n /** For command tools - execute shell commands */\r\n commandConfig?: {\r\n executable: string\r\n action?: string\r\n args?: string\r\n cwd?: string\r\n requiresApproval?: boolean\r\n }\r\n\r\n /** For code tools - execute code snippets */\r\n codeConfig?: {\r\n language: 'typescript' | 'javascript' | 'python' | 'csharp'\r\n snippet: string\r\n inputVariable?: string\r\n executionContext?: 'isolated' | 'main'\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Edges (React Flow standard format)\r\n// ============================================================================\r\n\r\n/**\r\n * WorkflowEdge uses React Flow's standard edge format directly.\r\n * This eliminates conversion overhead and makes debugging easier.\r\n */\r\nexport interface WorkflowEdge {\r\n id: string\r\n source: string // Source node ID\r\n target: string // Target node ID\r\n sourceHandle?: string // 'output' or condition ID (optional, defaults to 'output')\r\n targetHandle?: string // 'input' (optional, defaults to 'input')\r\n animated?: boolean // For visual feedback\r\n label?: string // Edge label (e.g., condition name)\r\n}\r\n\r\n// ============================================================================\r\n// Configuration\r\n// ============================================================================\r\n\r\nexport interface ErrorHandlingConfig {\r\n onError: 'continue' | 'stop' | 'retry'\r\n retryPolicy?: RetryPolicy\r\n fallbackNode?: string\r\n}\r\n\r\nexport interface RetryPolicy {\r\n enabled: boolean\r\n maxRetries: number\r\n backoffMs: number\r\n backoffMultiplier?: number\r\n}\r\n\r\nexport interface ExecutionConfig {\r\n timeout?: number // ms\r\n parallelism?: {\r\n enabled: boolean\r\n maxConcurrency: number\r\n }\r\n logging?: {\r\n level: 'debug' | 'info' | 'warn' | 'error'\r\n includeTimings?: boolean\r\n }\r\n caching?: {\r\n enabled: boolean\r\n ttlMs: number\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// JSON Schema (simplified)\r\n// ============================================================================\r\n\r\nexport interface JsonSchema {\r\n type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'integer'\r\n properties?: Record<string, JsonSchema>\r\n items?: JsonSchema\r\n required?: string[]\r\n minLength?: number\r\n maxLength?: number\r\n minimum?: number\r\n maximum?: number\r\n enum?: unknown[]\r\n}\r\n\r\n// ============================================================================\r\n// Validation Types\r\n// ============================================================================\r\n\r\nexport interface WorkflowValidationError {\r\n nodeId?: string\r\n connectionId?: string\r\n field?: string\r\n message: string\r\n code: string\r\n}\r\n\r\nexport interface WorkflowValidationWarning {\r\n nodeId?: string\r\n message: string\r\n code: string\r\n}\r\n\r\n// ============================================================================\r\n// Execution State Types\r\n// ============================================================================\r\n\r\nexport type WorkflowExecutionStatus = 'idle' | 'running' | 'paused' | 'completed' | 'failed'\r\nexport type NodeExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'skipped'\r\n\r\nexport interface WorkflowExecutionState {\r\n workflowId: string\r\n status: WorkflowExecutionStatus\r\n currentNodeId?: string\r\n nodeStates: Record<string, NodeExecutionState>\r\n nodeOutputs: Record<string, unknown>\r\n variables: Record<string, unknown>\r\n errors: WorkflowExecutionError[]\r\n startTime?: number\r\n endTime?: number\r\n /** Memory storage for MemoryNode operations */\r\n memory?: {\r\n /** Key-value store (by namespace or root) */\r\n kv: Record<string, unknown>\r\n /** Conversation histories (by conversation ID) */\r\n conversation: Record<string, unknown[]>\r\n /** Cache entries with TTL (by namespace or root) */\r\n cache: Record<string, unknown>\r\n }\r\n}\r\n\r\nexport interface NodeExecutionState {\r\n nodeId: string\r\n status: NodeExecutionStatus\r\n startTime?: number\r\n endTime?: number\r\n output?: unknown\r\n error?: string\r\n retryCount: number\r\n streamingContent?: string\r\n}\r\n\r\nexport interface WorkflowExecutionError {\r\n nodeId?: string\r\n message: string\r\n stack?: string\r\n timestamp: number\r\n}\r\n\r\nexport interface WorkflowResult {\r\n success: boolean\r\n output?: unknown\r\n nodeOutputs: Record<string, unknown>\r\n errors: WorkflowExecutionError[]\r\n metrics: {\r\n totalDuration: number\r\n nodeMetrics: Record<string, { duration: number; tokens?: number }>\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Connection Types (External Services)\r\n// ============================================================================\r\n\r\n/**\r\n * WorkflowConnectionType - Types of external connections managed in the Connections panel\r\n *\r\n * Connections are managed in a dedicated panel (not canvas nodes) to scale to\r\n * hundreds of connection types. Nodes reference connections by ID.\r\n */\r\nexport type WorkflowConnectionType =\r\n | 'ssh' // SSH to remote server\r\n | 'database' // PostgreSQL, MySQL, MongoDB, Redis, SQLite\r\n | 'http-api' // Generic REST API with auth\r\n | 'slack' // Slack workspace\r\n | 'github' // GitHub API\r\n | 'mcp-server' // External MCP server\r\n | 'websocket' // WebSocket connection\r\n | 'custom' // User-defined\r\n\r\nexport type WorkflowConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error'\r\n\r\n/**\r\n * WorkflowConnection - External service connection managed in the Connections panel\r\n *\r\n * Stored separately from workflow nodes - connections are workflow-scoped resources\r\n * that can be referenced by multiple nodes via connectionId.\r\n */\r\nexport interface WorkflowConnection {\r\n id: string\r\n name: string\r\n type: WorkflowConnectionType\r\n status: WorkflowConnectionStatus\r\n lastConnected?: number\r\n lastError?: string\r\n config: WorkflowConnectionConfig\r\n}\r\n\r\n/** Union type for all connection configs */\r\nexport type WorkflowConnectionConfig =\r\n | SSHConnectionConfig\r\n | DatabaseConnectionConfig\r\n | HttpApiConnectionConfig\r\n | SlackConnectionConfig\r\n | GitHubConnectionConfig\r\n | McpServerConnectionConfig\r\n | WebSocketConnectionConfig\r\n | CustomConnectionConfig\r\n\r\nexport interface SSHConnectionConfig {\r\n type: 'ssh'\r\n host: string\r\n port?: number\r\n username: string\r\n authMethod: 'key' | 'password' | 'agent'\r\n keyPath?: string\r\n // Password/passphrase stored encrypted, never in config\r\n}\r\n\r\nexport interface DatabaseConnectionConfig {\r\n type: 'database'\r\n dbType: 'postgresql' | 'mysql' | 'mongodb' | 'redis' | 'sqlite'\r\n host?: string\r\n port?: number\r\n database: string\r\n username?: string\r\n ssl?: boolean\r\n connectionString?: string\r\n}\r\n\r\nexport interface HttpApiConnectionConfig {\r\n type: 'http-api'\r\n baseUrl: string\r\n authType: 'none' | 'bearer' | 'api-key' | 'basic' | 'oauth2'\r\n headers?: Record<string, string>\r\n apiKeyHeader?: string // Header name for API key\r\n}\r\n\r\nexport interface SlackConnectionConfig {\r\n type: 'slack'\r\n workspace: string\r\n defaultChannel?: string\r\n}\r\n\r\nexport interface GitHubConnectionConfig {\r\n type: 'github'\r\n owner?: string\r\n repo?: string\r\n baseUrl?: string // For GitHub Enterprise\r\n}\r\n\r\nexport interface McpServerConnectionConfig {\r\n type: 'mcp-server'\r\n serverUrl: string\r\n serverName: string\r\n transport: 'stdio' | 'http' | 'websocket'\r\n}\r\n\r\nexport interface WebSocketConnectionConfig {\r\n type: 'websocket'\r\n url: string\r\n protocols?: string[]\r\n headers?: Record<string, string>\r\n}\r\n\r\nexport interface CustomConnectionConfig {\r\n type: 'custom'\r\n [key: string]: unknown\r\n}\r\n","/**\n * Centralized Workflow Validation System\n *\n * Validates workflow structure, edges, and node configurations.\n * Returns errors (blocking issues) and warnings (non-blocking suggestions).\n */\n\nimport type {\n WorkflowFile,\n WorkflowNode,\n WorkflowValidationError,\n WorkflowValidationWarning,\n WorkflowNodeType,\n TriggerNodeData,\n PromptNodeData,\n ConditionNodeData,\n LoopNodeData,\n AgentNodeData,\n BaseNodeData,\n} from './workflowTypes'\n\nexport interface ValidationResult {\n errors: WorkflowValidationError[]\n warnings: WorkflowValidationWarning[]\n isValid: boolean\n}\n\n/**\n * Validates an entire workflow\n */\nexport function validateWorkflow(workflow: WorkflowFile): ValidationResult {\n const errors: WorkflowValidationError[] = []\n const warnings: WorkflowValidationWarning[] = []\n\n // Validate workflow structure\n if (!workflow.nodes || workflow.nodes.length === 0) {\n errors.push({\n message: 'Workflow is empty. Drag a node from the Node Palette on the left to get started.',\n code: 'EMPTY_WORKFLOW',\n })\n return { errors, warnings, isValid: false }\n }\n\n // Validate each node\n for (const node of workflow.nodes) {\n const nodeErrors = validateNode(node, workflow)\n errors.push(...nodeErrors)\n }\n\n // Validate edges\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n const connectionErrors = validateConnection(connection, workflow)\n errors.push(...connectionErrors)\n }\n }\n\n // Check for disconnected nodes (warnings)\n const disconnectedNodes = findDisconnectedNodes(workflow)\n for (const nodeId of disconnectedNodes) {\n const node = workflow.nodes.find(n => n.id === nodeId)\n const nodeLabel = node?.data?.label || nodeId\n warnings.push({\n nodeId,\n message: `Node '${nodeLabel}' is not connected. Connect it to other nodes to include it in the workflow.`,\n code: 'DISCONNECTED_NODE',\n })\n }\n\n // Check for circular dependencies\n const cycles = detectCircularDependencies(workflow)\n for (const cycle of cycles) {\n errors.push({\n message: `Circular dependency detected: ${cycle.join(' → ')}`,\n code: 'CIRCULAR_DEPENDENCY',\n })\n }\n\n // Check for missing trigger nodes\n const triggerCount = workflow.nodes.filter(n => n.type === 'trigger').length\n if (triggerCount === 0) {\n warnings.push({\n message: 'Workflow has no trigger node. Add a trigger to define when the workflow should run.',\n code: 'NO_TRIGGER',\n })\n }\n\n // Check for missing output nodes\n const outputCount = workflow.nodes.filter(n => n.type === 'output').length\n if (outputCount === 0) {\n warnings.push({\n message: 'Workflow has no output node. Add an output node to capture workflow results.',\n code: 'NO_OUTPUT',\n })\n }\n\n return {\n errors,\n warnings,\n isValid: errors.length === 0,\n }\n}\n\n/**\n * Validates a single node\n */\nfunction validateNode(node: WorkflowNode, workflow: WorkflowFile): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n\n // Validate node has required fields\n if (!node.id) {\n errors.push({\n nodeId: node.id,\n message: 'Node is missing required field: id',\n code: 'MISSING_NODE_ID',\n })\n }\n\n if (!node.type) {\n errors.push({\n nodeId: node.id,\n message: 'Node is missing required field: type',\n code: 'MISSING_NODE_TYPE',\n })\n }\n\n // Validate node-specific requirements\n switch (node.type) {\n case 'trigger':\n errors.push(...validateTriggerNode(node))\n break\n case 'prompt':\n errors.push(...validatePromptNode(node))\n break\n case 'condition':\n errors.push(...validateConditionNode(node))\n break\n case 'loop':\n errors.push(...validateLoopNode(node))\n break\n case 'agent':\n errors.push(...validateAgentNode(node))\n break\n // Add more node type validations as needed\n }\n\n // Validate container nodes have proper children\n if (['loop', 'parallel', 'tool-call-router', 'chat-agent'].includes(node.type)) {\n const children = workflow.nodes.filter(n => n.parentId === node.id)\n if (children.length === 0 && node.type !== 'chat-agent') {\n const containerTypeHelp: Record<string, string> = {\n 'loop': 'Drag nodes inside this loop container to define the loop body.',\n 'parallel': 'Drag nodes inside this parallel container to run them concurrently.',\n 'tool-call-router': 'Drag tool nodes inside this router to handle different tool calls.',\n }\n\n errors.push({\n nodeId: node.id,\n message: `Container '${node.type}' (${node.data?.label || node.id}) is empty. ${containerTypeHelp[node.type] || 'Drag nodes inside this container.'}`,\n code: 'EMPTY_CONTAINER',\n })\n }\n }\n\n return errors\n}\n\n/**\n * Validate trigger node\n */\nfunction validateTriggerNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as TriggerNodeData\n\n if (!data.triggerType) {\n errors.push({\n nodeId: node.id,\n field: 'triggerType',\n message: `Trigger '${data.label || node.id}' is missing a trigger type. Select Manual, Schedule, Webhook, or Event in the properties panel.`,\n code: 'MISSING_TRIGGER_TYPE',\n })\n }\n\n // Validate schedule trigger - check BOTH fields\n if (data.triggerType === 'schedule' && !data.schedule && !data.scheduleCron) {\n errors.push({\n nodeId: node.id,\n field: 'schedule',\n message: `Schedule trigger '${data.label || node.id}' needs a schedule. Enter a cron expression in the properties panel.`,\n code: 'MISSING_SCHEDULE',\n })\n }\n\n // Validate webhook trigger\n if (data.triggerType === 'webhook' && !data.webhookPath) {\n errors.push({\n nodeId: node.id,\n field: 'webhookPath',\n message: `Webhook trigger '${data.label || node.id}' needs a webhook path. Enter a URL path (e.g., /api/trigger) in the properties panel.`,\n code: 'MISSING_WEBHOOK_PATH',\n })\n }\n\n return errors\n}\n\n/**\n * Validate prompt node\n */\nfunction validatePromptNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as PromptNodeData\n\n // Check if prompt has content from ANY source\n if (!data.source && !data.content && !data.rawPrompt) {\n errors.push({\n nodeId: node.id,\n message: `Prompt '${data.label || node.id}' has no content. Either select a .prmd file or enter prompt text in the properties panel.`,\n code: 'MISSING_PROMPT_CONTENT',\n })\n }\n\n return errors\n}\n\n/**\n * Validate condition node\n */\nfunction validateConditionNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as ConditionNodeData\n\n if (!data.conditions || data.conditions.length === 0) {\n errors.push({\n nodeId: node.id,\n field: 'conditions',\n message: `Condition '${data.label || node.id}' has no conditions. Add at least one condition in the properties panel.`,\n code: 'MISSING_CONDITIONS',\n })\n }\n\n return errors\n}\n\n/**\n * Validate loop node\n */\nfunction validateLoopNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as LoopNodeData\n\n if (!data.loopType) {\n errors.push({\n nodeId: node.id,\n field: 'loopType',\n message: `Loop '${data.label || node.id}' is missing a loop type. Select While, For-Each, or Count in the properties panel.`,\n code: 'MISSING_LOOP_TYPE',\n })\n }\n\n if (data.loopType === 'while' && !data.condition) {\n errors.push({\n nodeId: node.id,\n field: 'condition',\n message: `While loop '${data.label || node.id}' needs a condition. Enter a condition expression in the properties panel.`,\n code: 'MISSING_LOOP_CONDITION',\n })\n }\n\n if (data.loopType === 'for-each' && !data.arraySource) {\n errors.push({\n nodeId: node.id,\n field: 'arraySource',\n message: `For-Each loop '${data.label || node.id}' needs an array source. Specify the array variable in the properties panel.`,\n code: 'MISSING_ARRAY_SOURCE',\n })\n }\n\n if (data.loopType === 'count' && !data.count) {\n errors.push({\n nodeId: node.id,\n field: 'count',\n message: `Count loop '${data.label || node.id}' needs a count value. Enter the number of iterations in the properties panel.`,\n code: 'MISSING_COUNT',\n })\n }\n\n return errors\n}\n\n/**\n * Validate agent node\n */\nfunction validateAgentNode(node: WorkflowNode): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n const data = node.data as AgentNodeData\n\n // Check if agent has EITHER inline model config OR provider node reference\n if (!data.model && !data.provider && !data.providerNodeId) {\n errors.push({\n nodeId: node.id,\n message: `Agent '${data.label || node.id}' has no model configured. Select an LLM provider and model in the properties panel, or connect to a Provider node.`,\n code: 'MISSING_AGENT_MODEL',\n })\n }\n\n return errors\n}\n\n/**\n * Validate a connection\n */\nfunction validateConnection(\n connection: { source: string; target: string; sourceHandle?: string; targetHandle?: string },\n workflow: WorkflowFile\n): WorkflowValidationError[] {\n const errors: WorkflowValidationError[] = []\n\n // Check source node exists\n const sourceNode = workflow.nodes.find(n => n.id === connection.source)\n if (!sourceNode) {\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Invalid connection: source node '${connection.source}' no longer exists. Delete this connection.`,\n code: 'INVALID_SOURCE_NODE',\n })\n }\n\n // Check target node exists\n const targetNode = workflow.nodes.find(n => n.id === connection.target)\n if (!targetNode) {\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Invalid connection: target node '${connection.target}' no longer exists. Delete this connection.`,\n code: 'INVALID_TARGET_NODE',\n })\n }\n\n // Check for self-edges\n if (connection.source === connection.target) {\n const selfNode = workflow.nodes.find(n => n.id === connection.source)\n const nodeLabel = selfNode?.data?.label || connection.source\n errors.push({\n connectionId: `${connection.source}-${connection.target}`,\n message: `Node '${nodeLabel}' cannot connect to itself. Remove this connection.`,\n code: 'SELF_CONNECTION',\n })\n }\n\n return errors\n}\n\n/**\n * Find nodes that have no incoming or outgoing edges\n */\nfunction findDisconnectedNodes(workflow: WorkflowFile): string[] {\n const connectedNodes = new Set<string>()\n\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n connectedNodes.add(connection.source)\n connectedNodes.add(connection.target)\n }\n }\n\n return workflow.nodes\n .filter(node => {\n // Trigger and output nodes can be disconnected\n if (node.type === 'trigger' || node.type === 'output') {\n return false\n }\n return !connectedNodes.has(node.id)\n })\n .map(node => node.id)\n}\n\n/**\n * Detect circular dependencies in the workflow\n */\nfunction detectCircularDependencies(workflow: WorkflowFile): string[][] {\n const cycles: string[][] = []\n const visited = new Set<string>()\n const recursionStack = new Set<string>()\n\n // Build adjacency list, excluding special edge types\n const graph = new Map<string, string[]>()\n for (const node of workflow.nodes) {\n graph.set(node.id, [])\n }\n\n if (workflow.edges) {\n for (const connection of workflow.edges) {\n // Exclude docked edges (agent <-> tool-router feedback loops)\n const isDocked = connection.id?.startsWith('docked-') ||\n connection.sourceHandle === 'ai-output' ||\n connection.targetHandle === 'ai-input' ||\n connection.targetHandle === 'toolResult'\n\n // Exclude loop container edges (loop-start, loop-end are valid cycles)\n const sourceNode = workflow.nodes.find(n => n.id === connection.source)\n const isLoopEdge = sourceNode?.type === 'loop' && (\n connection.sourceHandle === 'loop-start' ||\n connection.sourceHandle === 'loop-end'\n )\n\n // Skip these edge types in cycle detection\n if (isDocked || isLoopEdge) {\n continue\n }\n\n const targets = graph.get(connection.source) || []\n targets.push(connection.target)\n graph.set(connection.source, targets)\n }\n }\n\n // DFS to detect cycles\n function dfs(nodeId: string, path: string[]): void {\n visited.add(nodeId)\n recursionStack.add(nodeId)\n path.push(nodeId)\n\n const neighbors = graph.get(nodeId) || []\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n dfs(neighbor, [...path])\n } else if (recursionStack.has(neighbor)) {\n // Found a cycle\n const cycleStart = path.indexOf(neighbor)\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), neighbor])\n }\n }\n }\n\n recursionStack.delete(nodeId)\n }\n\n for (const node of workflow.nodes) {\n if (!visited.has(node.id)) {\n dfs(node.id, [])\n }\n }\n\n return cycles\n}\n\n/**\n * Quick validation for real-time feedback (lighter weight)\n */\nexport function validateWorkflowQuick(workflow: WorkflowFile): Pick<ValidationResult, 'isValid'> {\n // Quick checks only\n if (!workflow.nodes || workflow.nodes.length === 0) {\n return { isValid: false }\n }\n\n // Check for obvious issues\n for (const node of workflow.nodes) {\n if (!node.id || !node.type) {\n return { isValid: false }\n }\n }\n\n return { isValid: true }\n}\n","/**\n * Workflow Parser - Parse and validate .pdflow JSON files\n * Converts between .pdflow format and React Flow format\n */\n\nimport type {\n WorkflowFile,\n WorkflowNode,\n WorkflowEdge,\n WorkflowValidationError,\n WorkflowValidationWarning,\n WorkflowNodeType,\n BaseNodeData,\n} from './workflowTypes'\nimport { validateWorkflow } from './workflowValidator'\n\n// Simple types for canvas representation (compatible with XYFlow but no dependency)\ninterface WorkflowCanvasNode {\n id: string\n type: string\n position: { x: number; y: number }\n data: BaseNodeData\n parentId?: string\n extent?: 'parent'\n width?: number\n height?: number\n selected?: boolean\n dragging?: boolean\n [key: string]: unknown\n}\n\ninterface WorkflowCanvasEdge {\n id: string\n source: string\n target: string\n sourceHandle?: string | null\n targetHandle?: string | null\n animated?: boolean\n label?: string\n selected?: boolean\n [key: string]: unknown\n}\n\nexport interface ParsedWorkflow {\n file: WorkflowFile\n nodes: WorkflowCanvasNode[]\n edges: WorkflowCanvasEdge[]\n errors: WorkflowValidationError[]\n warnings: WorkflowValidationWarning[]\n}\n\n// Valid node types\nconst VALID_NODE_TYPES: WorkflowNodeType[] = [\n 'trigger',\n 'prompt',\n 'provider',\n 'condition',\n 'loop',\n 'parallel',\n 'merge',\n 'transformer',\n 'api',\n 'tool',\n 'tool-call-parser',\n 'tool-call-router',\n 'agent',\n 'chat-agent', // Composite chat agent with guardrail\n 'guardrail', // Input validation node\n 'callback',\n 'checkpoint', // Alias for callback\n 'user-input',\n 'error-handler',\n 'command', // Phase E: Shell command execution\n 'code', // Phase E: Custom code execution\n 'claude-code', // Phase E: Claude Code agent with SSH\n 'workflow', // Phase E: Sub-workflow invocation\n 'mcp-tool', // Phase E: External MCP tool execution\n 'memory', // Memory/storage operations\n 'output',\n]\n\n// Internal handles that indicate container-internal edges\nconst INTERNAL_HANDLES = ['loop-start', 'loop-end', 'parallel-start', 'parallel-end']\n\n/**\n * Determine if an edge should be animated based on its source handle\n * Animated edges: internal container edges and condition branch edges\n * Static edges: regular output → input edges between nodes\n */\nfunction shouldEdgeBeAnimated(sourceHandle: string | null | undefined): boolean {\n if (!sourceHandle) return false\n // Internal container edges\n if (INTERNAL_HANDLES.includes(sourceHandle)) return true\n // Condition branch edges (condition-* or default)\n if (sourceHandle.startsWith('condition-') || sourceHandle === 'default') return true\n // Regular output edges are not animated\n return false\n}\n\n/**\n * Parse a .pdflow JSON string into a ParsedWorkflow\n */\nexport function parseWorkflow(json: string): ParsedWorkflow {\n const errors: WorkflowValidationError[] = []\n const warnings: WorkflowValidationWarning[] = []\n\n let file: WorkflowFile\n\n // Parse JSON\n try {\n file = JSON.parse(json)\n } catch (e) {\n return {\n file: createEmptyWorkflow(),\n nodes: [],\n edges: [],\n errors: [{\n message: `Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`,\n code: 'INVALID_JSON',\n }],\n warnings: [],\n }\n }\n\n // Validate structure\n validateWorkflowStructure(file, errors, warnings)\n\n // Convert nodes to React Flow format (edges are already in standard format)\n const nodes = convertNodesToReactFlow(file.nodes || [], errors)\n const edges = normalizeEdges(file.edges || [], errors)\n\n // Validate data flow\n validateDataFlow(file, errors, warnings)\n\n // Run comprehensive validation (includes node-specific checks like empty containers)\n const validationResult = validateWorkflow(file)\n errors.push(...validationResult.errors)\n warnings.push(...validationResult.warnings)\n\n return {\n file,\n nodes,\n edges,\n errors,\n warnings,\n }\n}\n\n/**\n * Serialize a workflow back to JSON string\n */\nexport function serializeWorkflow(\n file: WorkflowFile,\n nodes: WorkflowCanvasNode[],\n edges: WorkflowCanvasEdge[]\n): string {\n // Update node positions, data, and container properties from React Flow\n const updatedNodes: WorkflowNode[] = file.nodes.map(node => {\n const rfNode = nodes.find(n => n.id === node.id)\n if (rfNode) {\n const nodeData = rfNode.data as BaseNodeData\n\n // For docked nodes, use the saved pre-dock position instead of the off-canvas position\n let position = rfNode.position\n if (nodeData.dockedTo && nodeData._preDockPosition) {\n position = nodeData._preDockPosition\n }\n\n const updated: WorkflowNode = {\n ...node,\n position,\n // Sync node data from React Flow (includes _savedWidth, _savedHeight, collapsed, etc.)\n data: nodeData as WorkflowNode['data'],\n }\n\n // Sync container relationship properties\n if (rfNode.parentId) {\n updated.parentId = rfNode.parentId\n updated.extent = (rfNode.extent as 'parent' | undefined) || 'parent'\n } else {\n // Remove parentId if node was removed from container\n delete updated.parentId\n delete updated.extent\n }\n\n // Sync container dimensions - skip for docked nodes (they have 0 dimensions)\n if (rfNode.width && !nodeData.dockedTo) {\n updated.width = rfNode.width\n } else if (nodeData.dockedTo && nodeData._preDockWidth) {\n // For docked nodes, restore saved dimensions\n updated.width = nodeData._preDockWidth\n }\n if (rfNode.height && !nodeData.dockedTo) {\n updated.height = rfNode.height\n } else if (nodeData.dockedTo && nodeData._preDockHeight) {\n // For docked nodes, restore saved dimensions\n updated.height = nodeData._preDockHeight\n }\n\n return updated\n }\n return node\n })\n\n // Edges are already in React Flow standard format - just map directly\n const workflowEdges: WorkflowEdge[] = edges.map(edge => ({\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle: edge.sourceHandle ?? undefined,\n targetHandle: edge.targetHandle ?? undefined,\n animated: edge.animated,\n label: typeof edge.label === 'string' ? edge.label : undefined,\n }))\n\n const updatedFile: WorkflowFile = {\n ...file,\n nodes: updatedNodes,\n edges: workflowEdges,\n }\n\n return JSON.stringify(updatedFile, null, 2)\n}\n\n/**\n * Create an empty workflow file\n */\nexport function createEmptyWorkflow(): WorkflowFile {\n return {\n version: '1.0',\n metadata: {\n id: `workflow-${Date.now()}`,\n name: 'New Workflow',\n description: '',\n },\n parameters: [],\n nodes: [],\n edges: [],\n }\n}\n\n/**\n * Create a new workflow node\n *\n * IMPORTANT: When adding a new node type, you MUST update THREE places:\n * 1. This switch statement (createWorkflowNode) - add a case with default data\n * 2. getDefaultLabel() below - add the default label for the node type\n * 3. nodes/index.ts - add the component to nodeTypes registry\n *\n * If you only add to nodes/index.ts without adding a case here, the node\n * will render as \"UNKNOWN: <type>\" because createWorkflowNode falls back\n * to a generic tool node for unhandled types.\n */\nexport function createWorkflowNode(\n type: WorkflowNodeType,\n position: { x: number; y: number },\n id?: string\n): WorkflowNode {\n const nodeId = id || `${type}-${Date.now()}`\n\n const baseData = {\n label: getDefaultLabel(type),\n }\n\n switch (type) {\n case 'trigger':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n triggerType: 'manual',\n },\n }\n case 'prompt':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n source: '',\n provider: 'openai',\n model: 'gpt-4o',\n parameters: {},\n },\n }\n case 'provider':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n providerId: 'openai',\n model: 'gpt-4o',\n },\n }\n case 'condition':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n conditions: [],\n default: undefined,\n },\n }\n case 'loop':\n return {\n id: nodeId,\n type,\n position,\n width: 300,\n height: 200,\n data: {\n ...baseData,\n loopType: 'while',\n condition: '',\n maxIterations: 10,\n body: [],\n },\n }\n case 'parallel':\n return {\n id: nodeId,\n type,\n position,\n width: 350,\n height: 200,\n data: {\n ...baseData,\n mode: 'broadcast',\n forkCount: 2,\n branches: [],\n waitFor: 'all',\n mergeStrategy: 'object',\n },\n }\n case 'merge':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n inputs: [],\n mergeAs: 'object',\n },\n }\n case 'api':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n method: 'GET',\n url: '',\n },\n }\n case 'callback':\n case 'checkpoint':\n return {\n id: nodeId,\n type: 'callback',\n position,\n data: {\n ...baseData,\n mode: 'report',\n checkpointName: '',\n includePreviousOutput: true,\n includeNextNodeInfo: true,\n waitForAck: false,\n },\n }\n case 'user-input':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n prompt: 'Enter your input:',\n inputType: 'text',\n required: true,\n showContext: true,\n },\n }\n case 'tool':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n toolType: 'function',\n toolName: '',\n parameters: {},\n },\n }\n case 'tool-call-parser':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n format: 'auto',\n noToolCallBehavior: 'passthrough',\n allowedTools: [],\n },\n }\n case 'agent':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n systemPrompt: 'You are a helpful AI assistant with access to tools. Use the available tools to complete the user\\'s request.',\n userPrompt: '{{ input }}',\n tools: [],\n maxIterations: 10,\n toolCallFormat: 'auto',\n outputMode: 'final-response',\n includeHistory: true,\n },\n }\n case 'chat-agent':\n return {\n id: nodeId,\n type,\n position,\n width: 400,\n height: 320,\n data: {\n ...baseData,\n // Agent configuration\n agentSystemPrompt: 'You are a helpful AI assistant.',\n agentUserPrompt: '{{ input }}',\n maxIterations: 10,\n toolCallFormat: 'auto',\n outputMode: 'final-response',\n // Guardrail configuration (disabled by default)\n guardrailEnabled: false,\n // User input configuration (enabled by default)\n userInputEnabled: true,\n userInputPrompt: 'Enter your message:',\n userInputType: 'textarea',\n // Container state\n collapsed: true,\n // Saved dimensions for when expanded\n _savedWidth: 400,\n _savedHeight: 320,\n tools: [],\n },\n }\n case 'guardrail':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n systemPrompt: 'Validate the input. Respond with \"PASS\" if the input is appropriate and safe, or \"REJECT\" with a reason if it violates guidelines.',\n scoreThreshold: 0.5,\n },\n }\n case 'tool-call-router':\n return {\n id: nodeId,\n type,\n position,\n width: 320,\n height: 180,\n data: {\n ...baseData,\n routingMode: 'name-match',\n onNoMatch: 'error',\n collapsed: false,\n },\n }\n case 'error-handler':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n strategy: 'retry',\n retry: {\n maxAttempts: 3,\n backoffMs: 1000,\n backoffMultiplier: 2,\n },\n },\n }\n case 'output':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n },\n }\n case 'command':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n command: '',\n args: [],\n cwd: '',\n env: {},\n timeoutMs: 30000,\n outputFormat: 'text',\n requiresApproval: true,\n },\n }\n case 'claude-code':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n connection: {\n type: 'local',\n },\n task: {\n prompt: '',\n workingDirectory: '',\n },\n constraints: {\n maxTurns: 50,\n allowedTools: ['read', 'write', 'execute', 'web'],\n requireApprovalForWrites: false,\n },\n output: {\n format: 'final-response',\n includeMetadata: false,\n },\n },\n }\n case 'workflow':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n source: '',\n parameters: {},\n outputMapping: {},\n inheritVariables: false,\n },\n }\n case 'mcp-tool':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n toolName: '',\n parameters: {},\n timeoutMs: 30000,\n includeInContext: false,\n },\n }\n case 'code':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n language: 'typescript',\n code: '',\n inputVariable: 'input',\n executionContext: 'isolated',\n },\n }\n case 'transformer':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n mode: 'template',\n template: '',\n inputVariable: 'input',\n passthroughOnError: false,\n },\n }\n case 'memory':\n return {\n id: nodeId,\n type,\n position,\n data: {\n ...baseData,\n mode: 'kv',\n operations: ['get'], // Multi-action array (replaces single 'operation')\n scope: 'execution',\n },\n }\n default:\n // IMPORTANT: If you see this error, add a new case to createWorkflowNode() in workflowParser.ts\n // This fallback should NEVER be hit in production - all node types must have explicit cases\n console.error(\n `[createWorkflowNode] MISSING CASE for node type: \"${type}\". ` +\n `Add a case for '${type}' in workflowParser.ts createWorkflowNode() switch statement!`\n )\n // Return a generic tool node as fallback (more visible than callback)\n return {\n id: nodeId,\n type: 'tool' as const,\n position,\n data: {\n ...baseData,\n label: `UNKNOWN: ${type}`, // Make it obvious this is a fallback\n toolType: 'function',\n toolName: '',\n parameters: {},\n },\n }\n }\n}\n\n/**\n * Get default label for a node type\n */\nfunction getDefaultLabel(type: WorkflowNodeType): string {\n const labels: Record<WorkflowNodeType, string> = {\n trigger: 'Start',\n prompt: 'Prompt',\n provider: 'Provider',\n condition: 'Condition',\n loop: 'Loop',\n parallel: 'Parallel',\n merge: 'Merge',\n transformer: 'Transform',\n api: 'API Call',\n tool: 'Tool',\n 'tool-call-parser': 'Tool Parser',\n 'tool-call-router': 'Tool Router',\n agent: 'AI Agent',\n 'chat-agent': 'Chat Agent',\n guardrail: 'Guardrail',\n callback: 'Checkpoint',\n checkpoint: 'Checkpoint', // Alias for callback\n 'user-input': 'User Input',\n 'error-handler': 'Error Handler',\n command: 'Command',\n code: 'Code',\n 'claude-code': 'Claude Code',\n workflow: 'Sub-Workflow',\n 'mcp-tool': 'MCP Tool',\n memory: 'Memory',\n output: 'Output',\n 'web-search': 'Web Search',\n 'database-query': 'DB Query',\n // --- Add new node type labels here ---\n }\n return labels[type] || 'Node'\n}\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\nfunction validateWorkflowStructure(\n file: WorkflowFile,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n // Version check\n if (!file.version) {\n warnings.push({\n message: 'Missing version field, defaulting to 1.0',\n code: 'MISSING_VERSION',\n })\n }\n\n // Metadata check\n if (!file.metadata) {\n errors.push({\n message: 'Missing metadata section',\n code: 'MISSING_METADATA',\n })\n } else {\n if (!file.metadata.id) {\n errors.push({\n field: 'metadata.id',\n message: 'Missing workflow ID',\n code: 'MISSING_ID',\n })\n }\n if (!file.metadata.name) {\n warnings.push({\n message: 'Missing workflow name',\n code: 'MISSING_NAME',\n })\n }\n }\n\n // Nodes check\n if (!file.nodes || !Array.isArray(file.nodes)) {\n errors.push({\n message: 'Missing or invalid nodes array',\n code: 'INVALID_NODES',\n })\n } else {\n // Check for duplicate IDs\n const nodeIds = new Set<string>()\n for (const node of file.nodes) {\n if (nodeIds.has(node.id)) {\n errors.push({\n nodeId: node.id,\n message: `Duplicate node ID: ${node.id}`,\n code: 'DUPLICATE_NODE_ID',\n })\n }\n nodeIds.add(node.id)\n\n // Validate node type\n if (!VALID_NODE_TYPES.includes(node.type)) {\n errors.push({\n nodeId: node.id,\n message: `Invalid node type: ${node.type}`,\n code: 'INVALID_NODE_TYPE',\n })\n }\n\n // Validate position\n if (!node.position || typeof node.position.x !== 'number' || typeof node.position.y !== 'number') {\n errors.push({\n nodeId: node.id,\n message: 'Invalid or missing position',\n code: 'INVALID_POSITION',\n })\n }\n\n // Validate node-specific data\n validateNodeData(node, errors, warnings)\n }\n }\n\n // Edges check\n if (file.edges && !Array.isArray(file.edges)) {\n errors.push({\n message: 'Invalid edges array',\n code: 'INVALID_EDGES',\n })\n }\n}\n\nfunction validateNodeData(\n node: WorkflowNode,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n if (!node.data) {\n errors.push({\n nodeId: node.id,\n message: 'Missing node data',\n code: 'MISSING_NODE_DATA',\n })\n return\n }\n\n switch (node.type) {\n case 'prompt':\n if (!('source' in node.data)) {\n errors.push({\n nodeId: node.id,\n field: 'source',\n message: 'Prompt node missing source',\n code: 'MISSING_PROMPT_SOURCE',\n })\n }\n break\n\n case 'condition':\n if (!('conditions' in node.data) || !Array.isArray(node.data.conditions)) {\n errors.push({\n nodeId: node.id,\n field: 'conditions',\n message: 'Condition node missing conditions array',\n code: 'MISSING_CONDITIONS',\n })\n }\n break\n\n case 'loop':\n if (!('loopType' in node.data)) {\n errors.push({\n nodeId: node.id,\n field: 'loopType',\n message: 'Loop node missing loopType',\n code: 'MISSING_LOOP_TYPE',\n })\n }\n if (!('maxIterations' in node.data) || typeof node.data.maxIterations !== 'number') {\n warnings.push({\n nodeId: node.id,\n message: 'Loop node missing maxIterations, defaulting to 10',\n code: 'MISSING_MAX_ITERATIONS',\n })\n }\n break\n\n case 'parallel':\n if (!('branches' in node.data) || !Array.isArray(node.data.branches)) {\n errors.push({\n nodeId: node.id,\n field: 'branches',\n message: 'Parallel node missing branches array',\n code: 'MISSING_BRANCHES',\n })\n }\n break\n\n case 'api':\n if (!('url' in node.data) || !node.data.url) {\n errors.push({\n nodeId: node.id,\n field: 'url',\n message: 'API node missing URL',\n code: 'MISSING_API_URL',\n })\n }\n if (!('method' in node.data)) {\n warnings.push({\n nodeId: node.id,\n message: 'API node missing method, defaulting to GET',\n code: 'MISSING_API_METHOD',\n })\n }\n break\n }\n}\n\nfunction validateDataFlow(\n file: WorkflowFile,\n errors: WorkflowValidationError[],\n warnings: WorkflowValidationWarning[]\n): void {\n if (!file.nodes || !file.edges) return\n\n const nodeIds = new Set(file.nodes.map(n => n.id))\n\n // Check edge references\n for (const edge of file.edges) {\n if (!nodeIds.has(edge.source)) {\n errors.push({\n connectionId: edge.id,\n message: `Edge references non-existent source node: ${edge.source}`,\n code: 'INVALID_SOURCE_NODE',\n })\n }\n if (!nodeIds.has(edge.target)) {\n errors.push({\n connectionId: edge.id,\n message: `Edge references non-existent target node: ${edge.target}`,\n code: 'INVALID_TARGET_NODE',\n })\n }\n }\n\n // Check for cycles (basic detection)\n const hasCycle = detectCycles(file.nodes, file.edges)\n if (hasCycle) {\n errors.push({\n message: 'Workflow contains cycles which may cause infinite loops',\n code: 'CYCLE_DETECTED',\n })\n }\n\n // Check for unreachable nodes\n const connectedNodes = new Set<string>()\n for (const edge of file.edges) {\n connectedNodes.add(edge.source)\n connectedNodes.add(edge.target)\n }\n\n for (const node of file.nodes) {\n if (!connectedNodes.has(node.id) && file.nodes.length > 1) {\n warnings.push({\n nodeId: node.id,\n message: `Node \"${node.data.label || node.id}\" is not connected to any other nodes`,\n code: 'UNREACHABLE_NODE',\n })\n }\n }\n}\n\n/**\n * Check if an edge is an internal container edge (loop or parallel internal wiring)\n * or a feedback edge (tool results back to agent)\n * These edges are intentional and should not be considered for cycle detection\n */\nfunction isInternalContainerEdge(edge: WorkflowEdge): boolean {\n const internalHandles = [\n 'loop-start',\n 'loop-end',\n 'parallel-start',\n 'parallel-end',\n ]\n\n // Check for internal loop/parallel handles\n if (edge.sourceHandle && internalHandles.includes(edge.sourceHandle)) {\n return true\n }\n if (edge.targetHandle && internalHandles.includes(edge.targetHandle)) {\n return true\n }\n\n // Check for fork handles (fork-0, fork-1, etc.)\n if (edge.sourceHandle && edge.sourceHandle.startsWith('fork-')) {\n return true\n }\n if (edge.targetHandle && edge.targetHandle.startsWith('fork-')) {\n return true\n }\n\n // Check for Agent <-> ToolCallRouter feedback edges\n // toolResult edges go from ToolCallRouter back to Agent - this is intentional feedback\n if (edge.sourceHandle === 'toolResult' && edge.targetHandle === 'toolResult') {\n return true\n }\n\n // onCheckpoint edges are event streams, not data flow cycles\n if (edge.sourceHandle === 'onCheckpoint') {\n return true\n }\n\n return false\n}\n\n/**\n * Simple cycle detection using DFS\n * Excludes internal container edges (loop/parallel internal wiring) from cycle detection\n */\nfunction detectCycles(nodes: WorkflowNode[], edges: WorkflowEdge[]): boolean {\n const adjacencyList = new Map<string, string[]>()\n\n // Build adjacency list, excluding internal container edges\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n }\n for (const edge of edges) {\n // Skip internal loop/parallel edges - these are intentional back-edges\n if (isInternalContainerEdge(edge)) {\n continue\n }\n\n const targets = adjacencyList.get(edge.source) || []\n targets.push(edge.target)\n adjacencyList.set(edge.source, targets)\n }\n\n const visited = new Set<string>()\n const recursionStack = new Set<string>()\n\n function dfs(nodeId: string): boolean {\n visited.add(nodeId)\n recursionStack.add(nodeId)\n\n const neighbors = adjacencyList.get(nodeId) || []\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true\n } else if (recursionStack.has(neighbor)) {\n return true // Cycle found\n }\n }\n\n recursionStack.delete(nodeId)\n return false\n }\n\n for (const node of nodes) {\n if (!visited.has(node.id)) {\n if (dfs(node.id)) return true\n }\n }\n\n return false\n}\n\n// ============================================================================\n// Conversion Functions\n// ============================================================================\n\nfunction convertNodesToReactFlow(\n nodes: WorkflowNode[],\n errors: WorkflowValidationError[]\n): WorkflowCanvasNode[] {\n // Convert nodes to React Flow format\n const rfNodes = nodes.map(node => {\n // Migration: Convert old MemoryNode 'operation' (single) to 'operations' (array)\n if (node.type === 'memory') {\n const memData = node.data as { operation?: string; operations?: string[] }\n if (memData.operation && !memData.operations) {\n memData.operations = [memData.operation]\n delete memData.operation\n }\n }\n\n const nodeData = node.data as BaseNodeData\n\n const rfNode: WorkflowCanvasNode = {\n id: node.id,\n type: node.type,\n position: node.position || { x: 0, y: 0 },\n data: nodeData,\n }\n\n // Handle docked nodes - restore hidden state and minimal dimensions\n if (nodeData.dockedTo) {\n rfNode.hidden = true\n rfNode.width = 0\n rfNode.height = 0\n rfNode.position = { x: -9999, y: -9999 }\n }\n\n // Preserve container relationship properties\n if (node.parentId) {\n rfNode.parentId = node.parentId\n // Only use 'parent' extent for child nodes (React Flow's CoordinateExtent has different format)\n rfNode.extent = 'parent'\n }\n\n // Preserve container dimensions (for loop/parallel nodes) - skip for docked nodes\n if (node.width && !nodeData.dockedTo) {\n rfNode.width = node.width\n }\n if (node.height && !nodeData.dockedTo) {\n rfNode.height = node.height\n }\n\n return rfNode\n })\n\n // CRITICAL: React Flow requires parent nodes to appear BEFORE their children in the array\n // Sort so that nodes without parentId come first, then children follow their parents\n return sortNodesForReactFlow(rfNodes)\n}\n\n/**\n * Sort nodes so parent nodes appear before their children.\n * React Flow requires this ordering for proper parent-child rendering.\n */\nfunction sortNodesForReactFlow(nodes: WorkflowCanvasNode[]): WorkflowCanvasNode[] {\n // Build a map of node ID to node for quick lookup\n const nodeMap = new Map<string, WorkflowCanvasNode>()\n for (const node of nodes) {\n nodeMap.set(node.id, node)\n }\n\n // Separate root nodes (no parent) from child nodes\n const rootNodes: WorkflowCanvasNode[] = []\n const childNodes: WorkflowCanvasNode[] = []\n\n for (const node of nodes) {\n if (node.parentId) {\n childNodes.push(node)\n } else {\n rootNodes.push(node)\n }\n }\n\n // Result array - start with root nodes\n const result: WorkflowCanvasNode[] = [...rootNodes]\n\n // Add child nodes after their parents\n // We need to handle nested containers, so we iterate until all children are placed\n const remaining = [...childNodes]\n const placedIds = new Set(rootNodes.map(n => n.id))\n\n // Safety limit to prevent infinite loops\n let iterations = 0\n const maxIterations = remaining.length * 2\n\n while (remaining.length > 0 && iterations < maxIterations) {\n iterations++\n for (let i = remaining.length - 1; i >= 0; i--) {\n const child = remaining[i]\n // If parent is already placed, we can place this child\n if (child.parentId && placedIds.has(child.parentId)) {\n result.push(child)\n placedIds.add(child.id)\n remaining.splice(i, 1)\n }\n }\n }\n\n // If any nodes couldn't be placed (orphaned children with missing parents), add them at the end\n if (remaining.length > 0) {\n console.warn('[workflowParser] Some nodes have missing parent references:', remaining.map(n => n.id))\n result.push(...remaining)\n }\n\n return result\n}\n\n/**\n * Normalize edges - already in React Flow format, just ensure defaults\n * Applies consistent animation rules: internal container edges and condition\n * branch edges are animated, regular output edges are not\n */\nfunction normalizeEdges(\n edges: WorkflowEdge[],\n errors: WorkflowValidationError[]\n): WorkflowCanvasEdge[] {\n return edges.map(edge => {\n const sourceHandle = edge.sourceHandle || 'output'\n const targetHandle = edge.targetHandle || 'input'\n // Use explicit animated value if provided, otherwise determine from handles\n const animated = edge.animated ?? (\n shouldEdgeBeAnimated(sourceHandle) || shouldEdgeBeAnimated(targetHandle)\n )\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle,\n targetHandle,\n animated,\n label: edge.label,\n }\n })\n}\n\n/**\n * Check if an edge is used for the main execution flow (should be included in topological sort)\n * Excludes internal container edges that would create back-edges (loop-end, parallel-end)\n * Excludes event-based edges that are triggered by events, not data flow (onError, onCheckpoint, onProgress)\n */\nfunction isExecutionFlowEdge(edge: { sourceHandle?: string; targetHandle?: string }): boolean {\n // Exclude back-edges that go TO container start handles (these create cycles)\n // loop-end -> container and parallel-end -> container edges should not count for topological ordering\n if (edge.sourceHandle === 'loop-end' || edge.sourceHandle === 'parallel-end') {\n return false\n }\n\n // Exclude edges targeting internal handles (fork handles for parallel nodes)\n if (edge.targetHandle && edge.targetHandle.startsWith('fork-')) {\n return false\n }\n\n // Exclude event-based edges - these are triggered by events, not main data flow\n // They should NOT be included in topological sort for execution order\n // - onError: triggered when an error occurs in a node using this error handler\n // - onCheckpoint: triggered when agent emits checkpoint events\n // - onProgress: triggered when a node emits progress events (e.g., ClaudeCode)\n // - toolResult: triggered when a tool returns a result to an agent\n const eventBasedHandles = ['onError', 'onCheckpoint', 'onProgress', 'toolResult']\n if (edge.sourceHandle && eventBasedHandles.includes(edge.sourceHandle)) {\n return false\n }\n\n // Include all other edges:\n // - Regular output -> input edges\n // - Condition branch edges (condition-* or default)\n // - Internal start edges (loop-start, parallel-start) - these are entry points, should flow to children\n return true\n}\n\n/**\n * Build execution order using topological sort\n *\n * Important: Child nodes (nodes with parentId) are EXCLUDED from the main execution order.\n * They are executed by their parent container node (loop, parallel), not by the main executor.\n *\n * Excludes:\n * - Internal back-edges that would create cycles (e.g., loop-end -> container)\n * - Child nodes that belong to container nodes (they have parentId set)\n */\nexport function getExecutionOrder(workflow: ParsedWorkflow): string[] {\n const { file } = workflow\n if (!file.nodes || !file.edges) return []\n\n // Identify child nodes (nodes that have a parentId - they belong to containers)\n const childNodeIds = new Set<string>()\n for (const node of file.nodes) {\n if (node.parentId) {\n childNodeIds.add(node.id)\n }\n }\n\n // Only include root-level nodes in the main execution order\n const rootNodes = file.nodes.filter(n => !n.parentId)\n\n // Build in-degree map and adjacency list for ROOT NODES ONLY\n const inDegree = new Map<string, number>()\n const adjacencyList = new Map<string, string[]>()\n\n // Initialize all root nodes with in-degree 0\n for (const node of rootNodes) {\n inDegree.set(node.id, 0)\n adjacencyList.set(node.id, [])\n }\n\n // Build graph from execution flow edges (only between root nodes)\n for (const edge of file.edges) {\n // Skip edges involving child nodes - they're handled by container execution\n if (childNodeIds.has(edge.source) || childNodeIds.has(edge.target)) {\n continue\n }\n\n // Skip internal back-edges that would create cycles\n if (!isExecutionFlowEdge(edge)) {\n continue\n }\n\n const targets = adjacencyList.get(edge.source) || []\n targets.push(edge.target)\n adjacencyList.set(edge.source, targets)\n\n inDegree.set(edge.target, (inDegree.get(edge.target) || 0) + 1)\n }\n\n // Kahn's algorithm for topological sort with specific node type handling\n //\n // Node categories:\n // 1. Global nodes (provider, error-handler, connection): Always run first, configure the workflow\n // 2. Trigger/Start nodes: Begin the actual execution flow\n // 3. Event-driven nodes (callback, checkpoint): NEVER auto-execute, only run when triggered by events\n // 4. Other nodes: Execute when reached via edges from trigger/start nodes\n //\n const globalNodeTypes = new Set(['provider', 'error-handler', 'connection'])\n const startNodeTypes = new Set(['trigger'])\n // Callback/Checkpoint nodes are event-driven - they ONLY execute when triggered by events\n // from Agent nodes (onCheckpoint), error handlers (onError), etc. They should NEVER auto-start.\n const eventDrivenNodeTypes = new Set(['callback', 'checkpoint'])\n\n const globalQueue: string[] = []\n const startQueue: string[] = []\n const otherQueue: string[] = []\n\n for (const [nodeId, degree] of inDegree) {\n if (degree === 0) {\n const node = rootNodes.find(n => n.id === nodeId)\n const nodeType = node?.type || ''\n\n // NEVER include event-driven nodes in the initial queue\n // They only execute when triggered by events, not as part of the main flow\n if (eventDrivenNodeTypes.has(nodeType)) {\n continue\n }\n\n if (globalNodeTypes.has(nodeType)) {\n globalQueue.push(nodeId)\n } else if (startNodeTypes.has(nodeType)) {\n startQueue.push(nodeId)\n } else {\n otherQueue.push(nodeId)\n }\n }\n }\n\n // Build initial queue: global nodes first, then triggers, then other start points\n // If no triggers exist, use other nodes with in-degree 0 as starting points\n // (this supports simple workflows without explicit trigger nodes)\n const queue: string[] = [...globalQueue, ...startQueue, ...otherQueue]\n const order: string[] = []\n\n while (queue.length > 0) {\n const current = queue.shift()!\n order.push(current)\n\n const neighbors = adjacencyList.get(current) || []\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) || 0) - 1\n inDegree.set(neighbor, newDegree)\n if (newDegree === 0) queue.push(neighbor)\n }\n }\n\n // Log disconnected nodes for debugging (but don't add them to execution order)\n const visitedSet = new Set(order)\n for (const node of rootNodes) {\n if (!visitedSet.has(node.id)) {\n // Don't warn for event-driven nodes - they're intentionally excluded\n if (!eventDrivenNodeTypes.has(node.type || '')) {\n console.log(`[getExecutionOrder] Node not in execution flow (disconnected or event-driven): ${node.id} (type: ${node.type})`)\n }\n }\n }\n\n return order\n}\n"]}