From eb8a78baafa4556fde11cddda4740fe4b733cf31 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Tue, 2 Dec 2025 11:09:56 -0500 Subject: jr: add 'prompt' command to inspect agent system prompt jr prompt constructs and prints the full system prompt that would be sent to the agent, including: - Agent configuration (model, cost budget) - Base instructions - AGENTS.md content - Relevant facts from knowledge base - Retry/progress context if applicable Useful for debugging agent behavior and token usage. --- Omni/Agent/Worker.hs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'Omni/Agent') diff --git a/Omni/Agent/Worker.hs b/Omni/Agent/Worker.hs index 45caf9b..110c929 100644 --- a/Omni/Agent/Worker.hs +++ b/Omni/Agent/Worker.hs @@ -1,7 +1,13 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} -module Omni.Agent.Worker where +module Omni.Agent.Worker + ( start, + buildFullPrompt, + selectModel, + selectCostByComplexity, + ) +where import Alpha import qualified Data.Aeson as Aeson @@ -575,3 +581,50 @@ formatFact f = then "" else " [" <> Text.intercalate ", " (TaskCore.factRelatedFiles f) <> "]" ) + +-- | Build the full system prompt for a task without starting the agent. +-- This is useful for debugging/inspecting what the agent will be told. +buildFullPrompt :: TaskCore.Task -> IO Text +buildFullPrompt task = do + repo <- Directory.getCurrentDirectory + let ns = fromMaybe "." (TaskCore.taskNamespace task) + let basePrompt = buildBasePrompt task ns repo + + maybeRetry <- TaskCore.getRetryContext (TaskCore.taskId task) + progressContent <- TaskCore.getProgressSummary (TaskCore.taskId task) + + let progressPrompt = buildProgressPrompt progressContent + let retryPrompt = buildRetryPrompt maybeRetry + let prompt = basePrompt <> progressPrompt <> retryPrompt + + agentsMd <- + fmap (fromMaybe "") <| do + exists <- Directory.doesFileExist (repo "AGENTS.md") + if exists + then Just "AGENTS.md") + else pure Nothing + + relevantFacts <- getRelevantFacts task + let factsSection = formatFacts relevantFacts + + let systemPrompt = + prompt + <> "\n\nREPOSITORY GUIDELINES (AGENTS.md):\n" + <> agentsMd + <> factsSection + + let model = selectModel task + let costBudget = selectCostByComplexity (TaskCore.taskComplexity task) + + pure + <| Text.unlines + [ "=== AGENT CONFIGURATION ===", + "Model: " <> model, + "Cost budget: " <> tshow costBudget <> " cents", + "", + "=== SYSTEM PROMPT ===", + systemPrompt, + "", + "=== USER PROMPT (task details) ===", + formatTask task + ] -- cgit v1.2.3