diff options
| author | Omni Worker <bot@omni.agent> | 2025-11-21 05:33:04 -0500 |
|---|---|---|
| committer | Omni Worker <bot@omni.agent> | 2025-11-21 05:33:04 -0500 |
| commit | 03a77c071b626d5d4bd8c476e31aa3e577ceaef1 (patch) | |
| tree | 5c32f15b58fd20fd38240f2e408e31c2471e6b59 /Omni/Agent/Log.hs | |
| parent | e64a083fd1afff96962c663b4e3fa694b0063b36 (diff) | |
task: t-rWa5yilwM.5 done (Omni.Agent.Log enhancements)
Amp-Thread-ID:
https://ampcode.com/threads/T-7109f8d0-feb4-4a24-bc4b-37743227e2cb
Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'Omni/Agent/Log.hs')
| -rw-r--r-- | Omni/Agent/Log.hs | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/Omni/Agent/Log.hs b/Omni/Agent/Log.hs index c93479b..28dbab2 100644 --- a/Omni/Agent/Log.hs +++ b/Omni/Agent/Log.hs @@ -4,6 +4,10 @@ module Omni.Agent.Log ( LogEntry (..), + Status (..), + initialStatus, + updateStatus, + renderStatus, parseLine, format, ) @@ -13,6 +17,7 @@ import Alpha import Data.Aeson (FromJSON (..), (.:), (.:?)) import qualified Data.Aeson as Aeson import qualified Data.ByteString.Lazy as BSL +import qualified Data.Set as Set data LogEntry = LogEntry { leMessage :: Text, @@ -20,7 +25,8 @@ data LogEntry = LogEntry leToolName :: Maybe Text, leBatches :: Maybe [[Text]], leMethod :: Maybe Text, - lePath :: Maybe Text + lePath :: Maybe Text, + leTimestamp :: Maybe Text } deriving (Show, Eq, Generic) @@ -40,6 +46,52 @@ instance FromJSON LogEntry where .:? "method" <*> v .:? "path" + <*> v + .:? "timestamp" + +data Status = Status + { sWorkerName :: Text, + sTaskId :: Maybe Text, + sFiles :: Set.Set Text, + sStartTime :: Maybe Text, + sLastActivity :: Text + } + deriving (Show, Eq, Generic) + +initialStatus :: Text -> Status +initialStatus name = + Status + { sWorkerName = name, + sTaskId = Nothing, + sFiles = Set.empty, + sStartTime = Nothing, + sLastActivity = "Idle" + } + +updateStatus :: LogEntry -> Status -> Status +updateStatus e s = + let s' = case format e of + Just msg -> s {sLastActivity = msg} + Nothing -> s + s'' = case leTimestamp e of + Just t -> if isNothing (sStartTime s) then s' {sStartTime = Just t} else s' + Nothing -> s' + in case (leMessage e, lePath e) of + ("ide-fs", Just p) -> s'' {sFiles = Set.insert p (sFiles s'')} + _ -> s'' + +renderStatus :: Status -> Text +renderStatus s = + let line1 = + "[Worker: " + <> sWorkerName s + <> "] " + <> "Task: " + <> fromMaybe "None" (sTaskId s) + <> " | Files: " + <> show (Set.size (sFiles s)) + line2 = sLastActivity s + in line1 <> "\n" <> line2 parseLine :: Text -> Maybe LogEntry parseLine line = Aeson.decode <| BSL.fromStrict <| encodeUtf8 line |
