{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} -- | Fact module for the Jr knowledge base. -- -- Facts are pieces of knowledge learned during task execution that can -- inform future work on similar tasks or files. module Omni.Fact ( Fact (..), createFact, getFact, getAllFacts, getFactsByProject, getFactsByFile, updateFact, deleteFact, ) where import Alpha import Data.Aeson (encode) import qualified Data.ByteString.Lazy.Char8 as BLC import qualified Data.Text as Text import Data.Time (getCurrentTime) import qualified Database.SQLite.Simple as SQL import Omni.Task.Core ( Fact (..), getFactsForFile, getFactsForProject, loadFacts, saveFact, withDb, ) import qualified Omni.Task.Core as TaskCore -- | Create a new fact and return its ID. createFact :: Text -> Text -> [Text] -> Maybe Text -> Double -> IO Int createFact project content relatedFiles sourceTask confidence = do now <- getCurrentTime let fact = Fact { factId = Nothing, factProject = project, factContent = content, factRelatedFiles = relatedFiles, factSourceTask = sourceTask, factConfidence = confidence, factCreatedAt = now } saveFact fact -- | Get a fact by its ID. getFact :: Int -> IO (Maybe Fact) getFact fid = do facts <- getAllFacts pure <| find (\f -> factId f == Just fid) facts -- | Get all facts from the database. getAllFacts :: IO [Fact] getAllFacts = loadFacts -- | Get facts for a specific project. getFactsByProject :: Text -> IO [Fact] getFactsByProject = getFactsForProject -- | Get facts related to a specific file. getFactsByFile :: Text -> IO [Fact] getFactsByFile = getFactsForFile -- | Update an existing fact. updateFact :: Int -> Text -> [Text] -> Double -> IO () updateFact fid content relatedFiles confidence = withDb <| \conn -> SQL.execute conn "UPDATE facts SET fact = ?, related_files = ?, confidence = ? WHERE id = ?" (content, Text.pack (BLC.unpack (encode relatedFiles)), confidence, fid) -- | Delete a fact by ID. deleteFact :: Int -> IO () deleteFact = TaskCore.deleteFact