import { getSharedModule, getRoleSystemPrompt, getRoleUserPrompt } from '../../prompts' import type { PromptOverrides } from '../../types' import type { CodeRetryContext } from './types' function applyPromptTemplate( template: string, values: Record, promptOverrides?: PromptOverrides ): string { let output = template output = output.replace(/\{\{apiIndexModule\}\}/g, getSharedModule('apiIndex', promptOverrides)) output = output.replace(/\{\{sharedSpecification\}\}/g, getSharedModule('specification', promptOverrides)) for (const [key, value] of Object.entries(values)) { output = output.replace(new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g'), String(value)) } return output } export function getCodeRetrySystemPrompt(promptOverrides?: PromptOverrides): string { return getRoleSystemPrompt('codeRetry', promptOverrides) } export function buildRetryFixPrompt( concept: string, errorMessage: string, code: string, codeSnippet: string | undefined, attempt: number | string, outputMode: 'video' | 'image', promptOverrides?: PromptOverrides ): string { return getRoleUserPrompt( 'codeRetry', { concept, errorMessage, code, codeSnippet, attempt: Number(attempt), outputMode, isImage: outputMode === 'image', isVideo: outputMode === 'video' }, promptOverrides ) } export function buildRetryPrompt( context: CodeRetryContext, errorMessage: string, attempt: number, currentCode: string, codeSnippet?: string ): string { const override = context.promptOverrides?.roles?.codeRetry?.user if (override) { return applyPromptTemplate( override, { concept: context.concept, errorMessage, code: currentCode, codeSnippet: codeSnippet || '', attempt: String(attempt), outputMode: context.outputMode, isImage: context.outputMode === 'image', isVideo: context.outputMode === 'video' }, context.promptOverrides ) } return buildRetryFixPrompt( context.concept, errorMessage, currentCode, codeSnippet, attempt, context.outputMode, context.promptOverrides ) }