/** * Frontend-side variable substitution for display during navigation. * * - [VAR:name] → replaced with variables[name] * - [USER_INPUT:prompt] → replaced with variables[prompt] * - [SAVE_AS:name] → removed from display */ export function resolveVariables(text: string, variables: Record): string { // Replace [VAR:name] let result = text.replace(/\[VAR:([^\]]+)\]/g, (_, name) => { const key = name.trim() return variables[key] ?? `[VAR:${key}]` }) // Replace [USER_INPUT:prompt] result = result.replace(/\[USER_INPUT:([^\]]+)\]/g, (_, prompt) => { const key = prompt.trim() return variables[key] ?? `[USER_INPUT:${key}]` }) // Remove [SAVE_AS:name] result = result.replace(/\[SAVE_AS:[^\]]+\]/g, '') return result } /** * Extract all [USER_INPUT:prompt] tokens from text. * Returns array of prompt strings. */ export function extractUserInputPrompts(text: string): string[] { const prompts: string[] = [] const re = /\[USER_INPUT:([^\]]+)\]/g let match while ((match = re.exec(text)) !== null) { const prompt = match[1].trim() if (!prompts.includes(prompt)) { prompts.push(prompt) } } return prompts } /** * Check if text contains any variable tokens. */ export function hasVariableTokens(text: string): boolean { return /\[(USER_INPUT|VAR|SAVE_AS):[^\]]+\]/.test(text) }