diff options
| author | Ben Sima <ben@bensima.com> | 2025-11-27 09:55:55 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bensima.com> | 2025-11-27 09:55:55 -0500 |
| commit | f151fbf764670369c54d2b9c03a5d1c8c1bb82fb (patch) | |
| tree | 25ee597904196cec3bc25ca54ca29c9bb82b7620 | |
| parent | 27792ace8ae994c84ccbed9b80671fd0e133bb6f (diff) | |
Add logActivity helper and integrate into Worker.hs
Implementation complete. The task is done:
1. **Created `logActivity` helper** in `Omni/Task/Core.hs` that writes
t 2. **Integrated into Worker.hs** at all key points:
- `Claiming` - when claiming task - `Running` - when starting amp
- `Reviewing` - when amp completes successfully - `Retrying` -
on retry (includes attempt count in metadata) - `Completed` - on
success (includes result type in metadata) - `Failed` - on failure
(includes exit code or reason in metadata)
Task-Id: t-148.2
| -rw-r--r-- | Omni/Agent/Worker.hs | 17 | ||||
| -rw-r--r-- | Omni/Task/Core.hs | 9 |
2 files changed, 26 insertions, 0 deletions
diff --git a/Omni/Agent/Worker.hs b/Omni/Agent/Worker.hs index 0bf7519..2c603a9 100644 --- a/Omni/Agent/Worker.hs +++ b/Omni/Agent/Worker.hs @@ -4,7 +4,10 @@ module Omni.Agent.Worker where import Alpha +import qualified Data.Aeson as Aeson +import qualified Data.ByteString.Lazy as BSL import qualified Data.Text as Text +import qualified Data.Text.Encoding as TE import qualified Data.Text.IO as TIO import qualified Omni.Agent.Core as Core import qualified Omni.Agent.Log as AgentLog @@ -34,6 +37,12 @@ logMsg worker msg = then putText msg else AgentLog.log msg +-- | Convert key-value pairs to JSON metadata string +toMetadata :: [(Text, Text)] -> Text +toMetadata pairs = + let obj = Aeson.object [(k, Aeson.String v) | (k, v) <- pairs] + in TE.decodeUtf8 (BSL.toStrict (Aeson.encode obj)) + runOnce :: Core.Worker -> Maybe Text -> IO () runOnce worker maybeTaskId = do -- Find work @@ -69,16 +78,19 @@ processTask worker task = do say ("[worker] Claiming task " <> tid) -- Claim task + TaskCore.logActivity tid TaskCore.Claiming Nothing TaskCore.updateTaskStatus tid TaskCore.InProgress [] say "[worker] Status -> InProgress" -- Run Amp say "[worker] Starting amp..." + TaskCore.logActivity tid TaskCore.Running Nothing (exitCode, output) <- runAmp repo task say ("[worker] Amp exited with: " <> tshow exitCode) case exitCode of Exit.ExitSuccess -> do + TaskCore.logActivity tid TaskCore.Reviewing Nothing say "[worker] Running formatters..." _ <- runFormatters repo @@ -98,6 +110,7 @@ processTask worker task = do if attempt > 3 then do say "[worker] Task failed 3 times, needs human intervention" + TaskCore.logActivity tid TaskCore.Failed (Just (toMetadata [("reason", "max_retries_exceeded")])) TaskCore.updateTaskStatus tid TaskCore.Open [] else do TaskCore.setRetryContext @@ -108,22 +121,26 @@ processTask worker task = do TaskCore.retryAttempt = attempt, TaskCore.retryReason = "commit_failed: " <> commitErr } + TaskCore.logActivity tid TaskCore.Retrying (Just (toMetadata [("attempt", tshow attempt)])) TaskCore.updateTaskStatus tid TaskCore.Open [] say ("[worker] Task reopened (attempt " <> tshow attempt <> "/3)") NoChanges -> do -- No changes = task already implemented, mark as Done say "[worker] No changes to commit - task already done" TaskCore.clearRetryContext tid + TaskCore.logActivity tid TaskCore.Completed (Just (toMetadata [("result", "no_changes")])) TaskCore.updateTaskStatus tid TaskCore.Done [] say ("[worker] ✓ Task " <> tid <> " -> Done (no changes)") unless quiet <| AgentLog.update (\s -> s {AgentLog.statusTask = Nothing}) CommitSuccess -> do -- Commit succeeded, set to Review + TaskCore.logActivity tid TaskCore.Completed (Just (toMetadata [("result", "committed")])) TaskCore.updateTaskStatus tid TaskCore.Review [] say ("[worker] ✓ Task " <> tid <> " -> Review") unless quiet <| AgentLog.update (\s -> s {AgentLog.statusTask = Nothing}) Exit.ExitFailure code -> do say ("[worker] Amp failed with code " <> tshow code) + TaskCore.logActivity tid TaskCore.Failed (Just (toMetadata [("exit_code", tshow code)])) -- Don't set back to Open here - leave in InProgress for debugging say "[worker] Task left in InProgress (amp failure)" diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs index 3a5dd49..d9ea98c 100644 --- a/Omni/Task/Core.hs +++ b/Omni/Task/Core.hs @@ -1005,3 +1005,12 @@ incrementRetryAttempt tid = do let newAttempt = retryAttempt ctx + 1 setRetryContext ctx {retryAttempt = newAttempt} pure newAttempt + +-- | Log activity to the task_activity table +logActivity :: Text -> ActivityStage -> Maybe Text -> IO () +logActivity tid stage metadata = + withDb <| \conn -> + SQL.execute + conn + "INSERT INTO task_activity (task_id, stage, message, metadata) VALUES (?, ?, ?, ?)" + (tid, show stage, Nothing :: Maybe Text, metadata) |
