diff --git a/evals/apps/cli/src/index.ts b/evals/apps/cli/src/index.ts index 6b287042b08..3bd71c86a7a 100644 --- a/evals/apps/cli/src/index.ts +++ b/evals/apps/cli/src/index.ts @@ -178,6 +178,15 @@ const runExercise = async ({ run, task, server }: { run: Run; task: Task; server const workspacePath = path.resolve(exercisesPath, language, exercise) const taskSocketPath = path.resolve(dirname, `${dirname}/task-${task.id}.sock`) + // Inject foot gun system prompt if present + if (process.env.FOOTGUN_SYSTEM_PROMPT) { + const rooDir = path.join(workspacePath, ".roo") + if (!fs.existsSync(rooDir)) { + fs.mkdirSync(rooDir, { recursive: true }) + } + fs.writeFileSync(path.join(rooDir, "system-prompt-code"), process.env.FOOTGUN_SYSTEM_PROMPT) + } + // If debugging: // Use --wait --log trace or --verbose. // Don't await execa and store result as subprocess. diff --git a/evals/apps/web/src/app/runs/new/new-run.tsx b/evals/apps/web/src/app/runs/new/new-run.tsx index 71b7422ff31..54dd553b829 100644 --- a/evals/apps/web/src/app/runs/new/new-run.tsx +++ b/evals/apps/web/src/app/runs/new/new-run.tsx @@ -8,6 +8,7 @@ import { zodResolver } from "@hookform/resolvers/zod" import fuzzysort from "fuzzysort" import { toast } from "sonner" import { X, Rocket, Check, ChevronsUpDown, HardDriveUpload, CircleCheck } from "lucide-react" +import { Dialog, DialogContent, DialogTitle, DialogFooter } from "@/components/ui/dialog" import { globalSettingsSchema, providerSettingsSchema, rooCodeDefaults } from "@evals/types" @@ -83,6 +84,10 @@ export function NewRun() { const [model, suite, settings] = watch(["model", "suite", "settings", "concurrency"]) + const [systemPromptDialogOpen, setSystemPromptDialogOpen] = useState(false) + const [systemPrompt, setSystemPrompt] = useState("") + const systemPromptRef = useRef(null) + const onSubmit = useCallback( async (values: FormValues) => { try { @@ -97,13 +102,13 @@ export function NewRun() { values.settings = { ...(values.settings || {}), openRouterModelId } } - const { id } = await createRun(values) + const { id } = await createRun({ ...values, systemPrompt }) router.push(`/runs/${id}`) } catch (e) { toast.error(e instanceof Error ? e.message : "An unknown error occurred.") } }, - [mode, model, models.data, router], + [mode, model, models.data, router, systemPrompt], ) const onFilterModels = useCallback( @@ -313,6 +318,10 @@ export function NewRun() { )} + + router.push("/")}> + + + Import Foot Gun System Prompt +