diff --git a/frontend/src/components/UnifiedPromptModal.jsx b/frontend/src/components/UnifiedPromptModal.jsx index 74ce044..2157eb2 100644 --- a/frontend/src/components/UnifiedPromptModal.jsx +++ b/frontend/src/components/UnifiedPromptModal.jsx @@ -308,6 +308,58 @@ export default function UnifiedPromptModal({ prompt, onSave, onClose }) { } } + const handleExportPlaceholders = () => { + if (!testResult) return + + // Extract all placeholder data from test result + const debug = testResult.debug || testResult + const exportData = { + export_date: new Date().toISOString(), + prompt_slug: prompt?.slug || 'unknown', + prompt_name: name || 'Unnamed Prompt', + placeholders: {} + } + + // For pipeline prompts, collect from all stages + if (debug.stages && Array.isArray(debug.stages)) { + debug.stages.forEach(stage => { + exportData.placeholders[`stage_${stage.stage}`] = { + available_variables: stage.available_variables || [], + prompts: stage.prompts?.map(p => ({ + source: p.source, + resolved: p.resolved_placeholders || p.ref_debug?.resolved_placeholders || {}, + unresolved: p.unresolved_placeholders || p.ref_debug?.unresolved_placeholders || [] + })) || [] + } + }) + } + + // For base prompts or direct execution + if (debug.resolved_placeholders) { + exportData.placeholders.resolved = debug.resolved_placeholders + } + if (debug.unresolved_placeholders) { + exportData.placeholders.unresolved = debug.unresolved_placeholders + } + if (debug.available_variables) { + exportData.available_variables = debug.available_variables + } + if (debug.initial_variables) { + exportData.initial_variables = debug.initial_variables + } + + // Download as JSON + const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `placeholders-${prompt?.slug || 'test'}-${new Date().toISOString().split('T')[0]}.json` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + } + return (