summaryrefslogtreecommitdiff
path: root/Omni/Agent/Log.hs
blob: 33b9722226a69700918dd106c05a471f5d6ae331 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# 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 .: "message"
      <*> 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