summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Omni/Agent/Worker.hs55
-rwxr-xr-xOmni/Jr.hs17
2 files changed, 71 insertions, 1 deletions
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 </ readFile (repo </> "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
+ ]
diff --git a/Omni/Jr.hs b/Omni/Jr.hs
index c35efa3..b60a029 100755
--- a/Omni/Jr.hs
+++ b/Omni/Jr.hs
@@ -54,6 +54,7 @@ jr
Usage:
jr task [<args>...]
jr work [<task-id>]
+ jr prompt <task-id>
jr web [--port=PORT]
jr review [<task-id>] [--auto]
jr loop [--delay=SECONDS]
@@ -67,6 +68,7 @@ Usage:
Commands:
task Manage tasks
work Start a worker agent on a task
+ prompt Show the system prompt that would be sent to the agent
web Start the web UI server
review Review a completed task (show diff, accept/reject)
loop Run autonomous work+review loop
@@ -94,6 +96,21 @@ move args
Just p -> fromMaybe Web.defaultPort (readMaybe p)
Nothing -> Web.defaultPort
Web.run port
+ | args `Cli.has` Cli.command "prompt" = do
+ case Cli.getArg args (Cli.argument "task-id") of
+ Nothing -> do
+ IO.hPutStrLn IO.stderr "Error: task-id is required"
+ Exit.exitFailure
+ Just tidStr -> do
+ let tid = Text.pack tidStr
+ tasks <- TaskCore.loadTasks
+ case TaskCore.findTask tid tasks of
+ Nothing -> do
+ IO.hPutStrLn IO.stderr ("Error: task not found: " <> tidStr)
+ Exit.exitFailure
+ Just task -> do
+ prompt <- AgentWorker.buildFullPrompt task
+ putText prompt
| args `Cli.has` Cli.command "work" = do
-- Always run in current directory
let path = "."