{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} module Omni.Agent.Log ( LogEntry (..), parseLine, format, ) where import Alpha import Data.Aeson (FromJSON (..), (.:), (.:?)) import qualified Data.Aeson as Aeson import qualified Data.ByteString.Lazy as BSL data LogEntry = LogEntry { leMessage :: Text, leLevel :: Maybe Text, leToolName :: Maybe Text, leBatches :: Maybe [[Text]], leMethod :: Maybe Text, lePath :: Maybe Text } deriving (Show, Eq, Generic) instance FromJSON LogEntry where parseJSON = Aeson.withObject "LogEntry" <| \v -> ( LogEntry v .:? "level" <*> v .:? "toolName" <*> v .:? "batches" <*> v .:? "method" <*> v .:? "path" parseLine :: Text -> Maybe LogEntry parseLine line = Aeson.decode <| BSL.fromStrict <| encodeUtf8 line format :: LogEntry -> Maybe Text format e = case leMessage e of "executing 1 tools in 1 batch(es)" -> let tool = case leBatches e of Just ((t : _) : _) -> t _ -> "unknown" in Just <| "🤖 THOUGHT: Planning tool execution (" <> tool <> ")" "Tool Bash permitted - action: allow" -> Just "🔧 TOOL: Bash command executed" msg | "Processing tool completion for ledger" == msg && isJust (leToolName e) -> Just <| "✅ TOOL: " <> fromMaybe "" (leToolName e) <> " completed" "ide-fs" -> case leMethod e of Just "readFile" -> Just <| "📂 READ: " <> fromMaybe "" (lePath e) _ -> Nothing "System prompt build complete (no changes)" -> Just "🧠 THINKING..." "System prompt build complete (first build)" -> Just "🚀 STARTING new task context" msg -> case leLevel e of Just "error" -> Just <| "❌ ERROR: " <> msg _ -> Nothing