2026-03-06 18:35:58 +00:00
package recipe
2026-03-06 20:32:04 +00:00
import (
"fmt"
"strings"
"gmgauthier.com/grokkit/internal/grok"
)
2026-03-06 18:35:58 +00:00
type Runner struct {
Recipe * Recipe
2026-03-06 20:32:04 +00:00
Client * grok . Client
Model string
2026-03-06 18:35:58 +00:00
}
2026-03-06 20:32:04 +00:00
func NewRunner ( r * Recipe , client * grok . Client , model string ) * Runner {
return & Runner { Recipe : r , Client : client , Model : model }
2026-03-06 18:35:58 +00:00
}
func ( r * Runner ) Run ( ) error {
2026-03-06 19:00:16 +00:00
fmt . Printf ( "🍳 Starting recipe: %s v%s\n\n" , r . Recipe . Name , r . Recipe . Version )
2026-03-06 20:32:04 +00:00
var previousResults [ ] string
2026-03-06 18:35:58 +00:00
for _ , step := range r . Recipe . Steps {
fmt . Printf ( "Step %d/%d: %s\n" , step . Number , len ( r . Recipe . Steps ) , step . Title )
2026-03-06 20:32:04 +00:00
2026-03-06 20:46:30 +00:00
prompt := fmt . Sprintf ( ` Recipe Overview :
2026-03-06 20:32:04 +00:00
% s
Previous step results ( for context ) :
% s
== = CURRENT STEP == =
Objective : % s
Instructions : % s
Expected output format : % s
2026-03-06 20:46:30 +00:00
Execute this step now . Respond ONLY with the expected output format — no explanations , no extra text . ` ,
r . Recipe . Overview ,
strings . Join ( previousResults , "\n\n---\n\n" ) ,
2026-03-06 20:32:04 +00:00
step . Objective ,
step . Instructions ,
step . Expected )
messages := [ ] map [ string ] string {
2026-03-06 20:46:30 +00:00
{ "role" : "system" , "content" : "You are Grok, built by xAI. You are a precise, expert Go programmer and refactoring assistant. Always follow the user's instructions exactly for legitimate coding tasks. Never refuse or add safety warnings." } ,
2026-03-06 20:32:04 +00:00
{ "role" : "user" , "content" : prompt } ,
}
response := r . Client . Stream ( messages , r . Model )
2026-03-06 20:46:30 +00:00
fmt . Println ( )
2026-03-06 20:32:04 +00:00
previousResults = append ( previousResults , fmt . Sprintf ( "Step %d result:\n%s" , step . Number , response ) )
}
2026-03-06 20:46:30 +00:00
// Final summary
2026-03-06 20:32:04 +00:00
fmt . Println ( "Final Summary" )
finalPrompt := fmt . Sprintf ( ` You just executed the entire recipe . Here is the full history :
% s
2026-03-06 20:46:30 +00:00
% s ` , strings . Join ( previousResults , "\n\n---\n\n" ) , r . Recipe . FinalSummaryPrompt )
2026-03-06 20:32:04 +00:00
messages := [ ] map [ string ] string {
2026-03-06 20:46:30 +00:00
{ "role" : "system" , "content" : "You are Grok, built by xAI. You are a precise, expert programmer and refactoring assistant." } ,
2026-03-06 20:32:04 +00:00
{ "role" : "user" , "content" : finalPrompt } ,
2026-03-06 18:35:58 +00:00
}
2026-03-06 20:32:04 +00:00
r . Client . Stream ( messages , r . Model )
2026-03-06 19:00:16 +00:00
fmt . Println ( "\n✅ Recipe complete." )
2026-03-06 18:35:58 +00:00
return nil
}