summaryrefslogtreecommitdiff
path: root/Omni
diff options
context:
space:
mode:
authorOmni Worker <bot@omni.agent>2025-11-22 05:44:37 -0500
committerOmni Worker <bot@omni.agent>2025-11-22 05:44:37 -0500
commit7b2eb67300010a1b1090635577fa86832259dd00 (patch)
treea77c5c4ea2820fe4a1d1a8656a64d2ba92101746 /Omni
parent6f4b2c97a24967508f3970b46999052fd1f44e67 (diff)
task: claim t-rWclFp3vN
Diffstat (limited to 'Omni')
-rw-r--r--Omni/Agent/Log.hs75
-rw-r--r--Omni/Agent/Worker.hs35
2 files changed, 109 insertions, 1 deletions
diff --git a/Omni/Agent/Log.hs b/Omni/Agent/Log.hs
index afaf1da..28b39ec 100644
--- a/Omni/Agent/Log.hs
+++ b/Omni/Agent/Log.hs
@@ -11,6 +11,11 @@ import qualified Data.Text.IO as TIO
import qualified System.Console.ANSI as ANSI
import qualified System.IO as IO
import System.IO.Unsafe (unsafePerformIO)
+import Data.Aeson (Value(..), decode)
+import qualified Data.Aeson.KeyMap as KM
+import qualified Data.ByteString.Lazy as BL
+import qualified Data.Text.Encoding as TextEnc
+import qualified Data.Vector as V
-- | Status of the agent for the UI
data Status = Status
@@ -59,6 +64,76 @@ update f = do
updateActivity :: Text -> IO ()
updateActivity msg = update (\s -> s {statusActivity = msg})
+-- | Process a log line from the agent and update status if relevant
+processLogLine :: Text -> IO ()
+processLogLine line = do
+ let lbs = BL.fromStrict (TextEnc.encodeUtf8 line)
+ case decode lbs of
+ Just (Object obj) -> do
+ let message =
+ case KM.lookup "message" obj of
+ Just (String m) -> Just m
+ _ -> Nothing
+
+ let toolName =
+ case KM.lookup "toolName" obj of
+ Just (String t) -> Just t
+ _ -> Nothing
+
+ let level =
+ case KM.lookup "level" obj of
+ Just (String l) -> Just l
+ _ -> Nothing
+
+ case message of
+ Just "executing 1 tools in 1 batch(es)" -> do
+ let batchTool =
+ case KM.lookup "batches" obj of
+ Just (Array b) ->
+ case V.toList b of
+ (Array b0 : _) ->
+ case V.toList b0 of
+ (String t : _) -> Just t
+ _ -> Nothing
+ _ -> Nothing
+ _ -> Nothing
+ updateActivity ("THOUGHT: Planning tool execution (" <> fromMaybe "unknown" batchTool <> ")")
+
+ Just "Tool Bash permitted - action: allow" ->
+ updateActivity "TOOL: Bash command executed"
+
+ Just msg | toolName /= Nothing && msg == "Processing tool completion for ledger" ->
+ updateActivity ("TOOL: " <> fromMaybe "unknown" toolName <> " completed")
+
+ Just "ide-fs" -> do
+ let method =
+ case KM.lookup "method" obj of
+ Just (String m) -> Just m
+ _ -> Nothing
+ case method of
+ Just "readFile" -> do
+ let path =
+ case KM.lookup "path" obj of
+ Just (String p) -> Just p
+ _ -> Nothing
+ case path of
+ Just p -> updateActivity ("READ: " <> p)
+ Nothing -> pure ()
+ _ -> pure ()
+
+ Just "System prompt build complete (no changes)" ->
+ updateActivity "THINKING..."
+
+ Just "System prompt build complete (first build)" ->
+ updateActivity "STARTING new task context"
+
+ Just msg | level == Just "error" ->
+ updateActivity ("ERROR: " <> msg)
+
+ _ -> pure ()
+
+ _ -> pure ()
+
-- | Log a scrolling message (appears above status bars)
log :: Text -> IO ()
log msg = do
diff --git a/Omni/Agent/Worker.hs b/Omni/Agent/Worker.hs
index 01099a0..3bf4579 100644
--- a/Omni/Agent/Worker.hs
+++ b/Omni/Agent/Worker.hs
@@ -13,7 +13,11 @@ import qualified Omni.Task.Core as TaskCore
import qualified System.Directory as Directory
import qualified System.Exit as Exit
import System.FilePath ((</>))
+import qualified System.IO as IO
import qualified System.Process as Process
+import Control.Concurrent (forkIO, killThread, threadDelay)
+import qualified Data.Text.IO as TIO
+import Control.Monad (forever)
start :: Core.Worker -> IO ()
start worker = do
@@ -144,13 +148,22 @@ runAmp repo task = do
<> "'.\n"
Directory.createDirectoryIfMissing True (repo </> "_/llm")
+ let logPath = repo </> "_/llm/amp.log"
+ -- Ensure log file is empty/exists
+ IO.writeFile logPath ""
+
+ -- Monitor log file
+ monitorThread <- forkIO (monitorLog logPath)
-- Assume amp is in PATH
let args = ["--log-level", "debug", "--log-file", "_/llm/amp.log", "--dangerously-allow-all", "-x", Text.unpack prompt]
let cp = (Process.proc "amp" args) {Process.cwd = Just repo}
(_, _, _, ph) <- Process.createProcess cp
- Process.waitForProcess ph
+ exitCode <- Process.waitForProcess ph
+
+ killThread monitorThread
+ pure exitCode
formatTask :: TaskCore.Task -> Text
formatTask t =
@@ -202,3 +215,23 @@ findBaseBranch repo task = do
case candidates of
(candidate : _) -> pure ("task/" <> TaskCore.depId candidate)
[] -> pure "live"
+
+monitorLog :: FilePath -> IO ()
+monitorLog path = do
+ -- Wait for file to exist
+ waitForFile path
+
+ IO.withFile path IO.ReadMode $ \h -> do
+ IO.hSetBuffering h IO.LineBuffering
+ forever $ do
+ eof <- IO.hIsEOF h
+ if eof
+ then threadDelay 100000 -- 0.1s
+ else do
+ line <- TIO.hGetLine h
+ AgentLog.processLogLine line
+
+waitForFile :: FilePath -> IO ()
+waitForFile p = do
+ e <- Directory.doesFileExist p
+ if e then pure () else threadDelay 100000 >> waitForFile p