summaryrefslogtreecommitdiff
path: root/Omni/Agent
diff options
context:
space:
mode:
authorOmni Worker <bot@omni.agent>2025-11-22 04:53:03 -0500
committerOmni Worker <bot@omni.agent>2025-11-22 04:53:03 -0500
commite733b42ceb547015cba5c99a612857727b31d3c8 (patch)
tree63352f49528ece3861aa896fe8deb83ebb665fae /Omni/Agent
parent5230af5dbf1cdda90ce768cf9bf251d403a81271 (diff)
feat(agent): responsive 4-line status bar with thread ID
Amp-Thread-ID: https://ampcode.com/threads/T-79499d9e-f4f4-40de-893c-524c32a45483 Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'Omni/Agent')
-rw-r--r--Omni/Agent/Log.hs63
1 files changed, 34 insertions, 29 deletions
diff --git a/Omni/Agent/Log.hs b/Omni/Agent/Log.hs
index afaf1da..1f2746d 100644
--- a/Omni/Agent/Log.hs
+++ b/Omni/Agent/Log.hs
@@ -16,6 +16,7 @@ import System.IO.Unsafe (unsafePerformIO)
data Status = Status
{ statusWorker :: Text,
statusTask :: Maybe Text,
+ statusThreadId :: Maybe Text,
statusFiles :: Int,
statusCredits :: Double,
statusTime :: Text, -- formatted time string
@@ -28,6 +29,7 @@ emptyStatus workerName =
Status
{ statusWorker = workerName,
statusTask = Nothing,
+ statusThreadId = Nothing,
statusFiles = 0,
statusCredits = 0.0,
statusTime = "00:00",
@@ -44,10 +46,9 @@ init :: Text -> IO ()
init workerName = do
IO.hSetBuffering IO.stderr IO.LineBuffering
writeIORef currentStatus (emptyStatus workerName)
- -- Reserve 2 lines at bottom
- IO.hPutStrLn IO.stderr ""
- IO.hPutStrLn IO.stderr ""
- ANSI.hCursorUp IO.stderr 2
+ -- Reserve 4 lines at bottom
+ replicateM_ 4 (IO.hPutStrLn IO.stderr "")
+ ANSI.hCursorUp IO.stderr 4
-- | Update the status
update :: (Status -> Status) -> IO ()
@@ -62,50 +63,54 @@ updateActivity msg = update (\s -> s {statusActivity = msg})
-- | Log a scrolling message (appears above status bars)
log :: Text -> IO ()
log msg = do
- -- Clear status bars
+ -- Clear status bars (4 lines)
ANSI.hClearLine IO.stderr
ANSI.hCursorDown IO.stderr 1
ANSI.hClearLine IO.stderr
- ANSI.hCursorUp IO.stderr 1
-
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hClearLine IO.stderr
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hClearLine IO.stderr
+ ANSI.hCursorUp IO.stderr 3
+
-- Print message (scrolls screen)
TIO.hPutStrLn IO.stderr msg
-
+
-- Re-render status bars at bottom
-- (Since we scrolled, we are now on the line above where the first status line should be)
render
--- | Render the two status lines
+-- | Render the 4 status lines (Vertical Layout)
render :: IO ()
render = do
Status {..} <- readIORef currentStatus
-
- -- Line 1: Meta
- -- [Worker: name] Task: t-123 | Files: 3 | Credits: $0.45 | Time: 05:23
+
let taskStr = maybe "None" identity statusTask
- meta =
- "[Worker: "
- <> statusWorker
- <> "] Task: "
- <> taskStr
- <> " | Files: "
- <> tshow statusFiles
- <> " | Credits: $"
- <> tshow statusCredits
- <> " | Time: "
- <> statusTime
+ threadStr = maybe "None" identity statusThreadId
+
+ -- Line 1: Worker + Time
+ ANSI.hSetCursorColumn IO.stderr 0
+ ANSI.hClearLine IO.stderr
+ TIO.hPutStr IO.stderr <| "Worker: " <> statusWorker <> " | Time: " <> statusTime
+ -- Line 2: Task
+ ANSI.hCursorDown IO.stderr 1
ANSI.hSetCursorColumn IO.stderr 0
ANSI.hClearLine IO.stderr
- TIO.hPutStr IO.stderr meta
+ TIO.hPutStr IO.stderr <| "Task: " <> taskStr
- -- Line 2: Activity
- -- [14:05:22] > Thinking...
+ -- Line 3: Thread + Credits
ANSI.hCursorDown IO.stderr 1
ANSI.hSetCursorColumn IO.stderr 0
ANSI.hClearLine IO.stderr
- TIO.hPutStr IO.stderr ("> " <> statusActivity)
+ TIO.hPutStr IO.stderr <| "Thread: " <> threadStr <> " | Credits: $" <> tshow statusCredits
- -- Return cursor to line 1
- ANSI.hCursorUp IO.stderr 1
+ -- Line 4: Activity
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hSetCursorColumn IO.stderr 0
+ ANSI.hClearLine IO.stderr
+ TIO.hPutStr IO.stderr ("> " <> statusActivity)
+
+ -- Return cursor to Line 1
+ ANSI.hCursorUp IO.stderr 3
IO.hFlush IO.stderr