diff options
| author | Ben Sima <ben@bensima.com> | 2025-11-28 03:39:48 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bensima.com> | 2025-11-28 03:39:48 -0500 |
| commit | 8690ad0626b6a859e5311d6c955c04622ff83795 (patch) | |
| tree | a2db7df02cadcc3db05028d8c3b241ee4a8e49fc /Omni/Task/Core.hs | |
| parent | c0675cca7ef24f9405f5c019f54021e062a1b054 (diff) | |
Fix llm tool installation - update nixpkgs hash in Biz/Bild.nix
The build passed. The task was to update nixpkgs hash in Biz/Bild.nix,
b
Task-Id: t-163
Diffstat (limited to 'Omni/Task/Core.hs')
| -rw-r--r-- | Omni/Task/Core.hs | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs index c469bf8..6d69834 100644 --- a/Omni/Task/Core.hs +++ b/Omni/Task/Core.hs @@ -13,7 +13,7 @@ import qualified Data.ByteString.Lazy.Char8 as BLC import qualified Data.List as List import qualified Data.Text as T import qualified Data.Text.IO as TIO -import Data.Time (UTCTime, getCurrentTime) +import Data.Time (UTCTime, diffUTCTime, getCurrentTime) import qualified Database.SQLite.Simple as SQL import qualified Database.SQLite.Simple.FromField as SQL import qualified Database.SQLite.Simple.Ok as SQLOk @@ -72,6 +72,14 @@ data TaskProgress = TaskProgress } deriving (Show, Eq, Generic) +data AggregatedMetrics = AggregatedMetrics + { aggTotalCostCents :: Int, + aggTotalDurationSeconds :: Int, + aggCompletedTasks :: Int, + aggTotalTokens :: Int + } + deriving (Show, Eq, Generic) + -- Retry context for tasks that failed due to merge conflicts data RetryContext = RetryContext { retryTaskId :: Text, @@ -143,6 +151,10 @@ instance ToJSON TaskProgress instance FromJSON TaskProgress +instance ToJSON AggregatedMetrics + +instance FromJSON AggregatedMetrics + instance ToJSON RetryContext instance FromJSON RetryContext @@ -1233,6 +1245,29 @@ getLatestRunningActivity tid = do activities <- getActivitiesForTask tid pure <| List.find (\a -> activityStage a == Running) activities +-- | Get aggregated metrics for all descendants of an epic +getAggregatedMetrics :: Text -> IO AggregatedMetrics +getAggregatedMetrics epicId = do + allTasks <- loadTasks + let descendants = getAllDescendants allTasks epicId + descendantIds = map taskId descendants + completedCount = length [t | t <- descendants, taskStatus t == Done] + activities <- concat </ traverse getActivitiesForTask descendantIds + let totalCost = sum [c | act <- activities, Just c <- [activityCostCents act]] + totalTokens = sum [t | act <- activities, Just t <- [activityTokensUsed act]] + totalDuration = sum [calcDuration act | act <- activities] + pure + AggregatedMetrics + { aggTotalCostCents = totalCost, + aggTotalDurationSeconds = totalDuration, + aggCompletedTasks = completedCount, + aggTotalTokens = totalTokens + } + where + calcDuration act = case (activityStartedAt act, activityCompletedAt act) of + (Just start, Just end) -> floor (diffUTCTime end start) + _ -> 0 + -- | Get tasks with unmet blocking dependencies (not ready, not done) getBlockedTasks :: IO [Task] getBlockedTasks = do |
