From e77f8a82cbd6aa5381af8fd711bc9522357a3518 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 19 Dec 2025 23:26:55 -0500 Subject: Omni/Ava/Web: embed trace template, remove CODEROOT dependency Also added HTML escaping for input/output JSON. --- Omni/Ava/Web.hs | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 9 deletions(-) diff --git a/Omni/Ava/Web.hs b/Omni/Ava/Web.hs index 4d4ece6..f9dd7cd 100644 --- a/Omni/Ava/Web.hs +++ b/Omni/Ava/Web.hs @@ -26,13 +26,11 @@ import qualified Data.Aeson as Aeson import qualified Data.ByteString.Lazy as LBS import qualified Data.Text as Text import qualified Data.Text.Encoding as Encoding -import qualified Data.Text.IO as TextIO import qualified Database.SQLite.Simple as SQL import qualified Network.HTTP.Types as HTTP import qualified Network.Wai as Wai import qualified Network.Wai.Handler.Warp as Warp import qualified Omni.Ava.Trace as Trace -import qualified System.Environment as Environment main :: IO () main = putText "Use Omni.Ava for the main entry point" @@ -75,15 +73,97 @@ serveTraceJson dbPath tid _req respond = do respond <| Wai.responseLBS HTTP.status200 [(HTTP.hContentType, "application/json")] json renderTraceHtml :: Trace.TraceRecord -> IO Text -renderTraceHtml rec = do - coderoot <- Environment.getEnv "CODEROOT" - let templatePath = coderoot <> "/Omni/Ava/Web/trace.html" - template <- TextIO.readFile templatePath +renderTraceHtml rec = pure <| Text.replace "{{trace_id}}" (Trace.trcId rec) <| Text.replace "{{tool_name}}" (Trace.trcToolName rec) <| Text.replace "{{created_at}}" (Trace.trcCreatedAt rec) <| Text.replace "{{duration_ms}}" (tshow <| Trace.trcDurationMs rec) - <| Text.replace "{{input_json}}" (Trace.trcInput rec) - <| Text.replace "{{output_json}}" (Trace.trcOutput rec) - <| template + <| Text.replace "{{input_json}}" (escapeHtml <| Trace.trcInput rec) + <| Text.replace "{{output_json}}" (escapeHtml <| Trace.trcOutput rec) + <| traceTemplate + +-- | Escape HTML special characters +escapeHtml :: Text -> Text +escapeHtml = + Text.replace "&" "&" + <. Text.replace "<" "<" + <. Text.replace ">" ">" + <. Text.replace "\"" """ + +-- | Embedded trace HTML template +traceTemplate :: Text +traceTemplate = + Text.unlines + [ "", + "", + "", + " ", + " ", + " Trace: {{tool_name}}", + " ", + "", + "", + "

{{tool_name}}

", + "

{{created_at}} · {{duration_ms}}ms

", + "", + "
", + "
", + " Input", + " ", + "
", + "
{{input_json}}
", + "
", + "", + "
", + "
", + " Output", + " ", + "
", + "
{{output_json}}
", + "
", + "", + "

Trace ID: {{trace_id}}

", + "", + " ", + "", + "" + ] -- cgit v1.2.3