diff --git a/apps/webapp/app/components/logs/log-details.tsx b/apps/webapp/app/components/logs/log-details.tsx index bdc9fc7..5e24d80 100644 --- a/apps/webapp/app/components/logs/log-details.tsx +++ b/apps/webapp/app/components/logs/log-details.tsx @@ -23,6 +23,7 @@ interface EpisodeFact { interface EpisodeFactsResponse { facts: EpisodeFact[]; + invalidFacts: EpisodeFact[]; } export function LogDetails({ @@ -33,6 +34,7 @@ export function LogDetails({ log, }: LogDetailsProps) { const [facts, setFacts] = useState([]); + const [invalidFacts, setInvalidFacts] = useState([]); const [factsLoading, setFactsLoading] = useState(false); const fetcher = useFetcher(); @@ -50,6 +52,7 @@ export function LogDetails({ setFactsLoading(false); const response = fetcher.data; setFacts(response.facts); + setInvalidFacts(response.invalidFacts); } }, [fetcher.data, fetcher.state]); @@ -122,6 +125,33 @@ export function LogDetails({ Valid: {new Date(fact.validAt).toLocaleString()} + {fact.invalidAt && ( + + Invalid:{" "} + {new Date(fact.invalidAt).toLocaleString()} + + )} + {Object.keys(fact.attributes).length > 0 && ( + + {Object.keys(fact.attributes).length} attributes + + )} + + + ))} + {invalidFacts.map((fact) => ( +
+

{fact.fact}

+
+ {fact.invalidAt && ( + + Invalid:{" "} + {new Date(fact.invalidAt).toLocaleString()} + + )} {Object.keys(fact.attributes).length > 0 && ( {Object.keys(fact.attributes).length} attributes diff --git a/apps/webapp/app/models/workspace.server.ts b/apps/webapp/app/models/workspace.server.ts index e6e3d75..25dbfd7 100644 --- a/apps/webapp/app/models/workspace.server.ts +++ b/apps/webapp/app/models/workspace.server.ts @@ -48,9 +48,10 @@ export async function createWorkspace( }); try { - await sendEmail({ email: "welcome", to: user.email }); + const response = await sendEmail({ email: "welcome", to: user.email }); + logger.info(`${JSON.stringify(response)}`); } catch (e) { - logger.error("Error sending email"); + logger.error(`Error sending email: ${e}`); } return workspace; diff --git a/apps/webapp/app/services/email.server.ts b/apps/webapp/app/services/email.server.ts index c27a65b..6d615f8 100644 --- a/apps/webapp/app/services/email.server.ts +++ b/apps/webapp/app/services/email.server.ts @@ -86,7 +86,9 @@ export async function scheduleEmail( export async function sendEmail(data: DeliverEmail) { try { - return client.send(data); + const response = client.send(data); + + return response; } catch (e) { logger.error(`Error: ${e}`); } diff --git a/apps/webapp/app/services/episodeFacts.server.ts b/apps/webapp/app/services/episodeFacts.server.ts index 3b765ed..e589505 100644 --- a/apps/webapp/app/services/episodeFacts.server.ts +++ b/apps/webapp/app/services/episodeFacts.server.ts @@ -1,4 +1,7 @@ -import { getEpisodeStatements } from "~/services/graphModels/episode"; +import { + getEpisodeStatements, + getStatementsInvalidatedByEpisode, +} from "~/services/graphModels/episode"; export async function getEpisodeFacts(episodeUuid: string, userId: string) { try { @@ -7,13 +10,27 @@ export async function getEpisodeFacts(episodeUuid: string, userId: string) { userId, }); + const invalidFacts = await getStatementsInvalidatedByEpisode({ + episodeUuid, + userId, + }); + return { success: true, - facts: facts.map(fact => ({ + facts: facts.map((fact) => ({ uuid: fact.uuid, fact: fact.fact, createdAt: fact.createdAt.toISOString(), validAt: fact.validAt.toISOString(), + invalidAt: fact.invalidAt ? fact.invalidAt.toISOString() : null, + attributes: fact.attributes, + })), + invalidFacts: invalidFacts.map((fact) => ({ + uuid: fact.uuid, + fact: fact.fact, + createdAt: fact.createdAt.toISOString(), + validAt: fact.validAt.toISOString(), + invalidAt: fact.invalidAt ? fact.invalidAt.toISOString() : null, attributes: fact.attributes, })), }; @@ -25,4 +42,4 @@ export async function getEpisodeFacts(episodeUuid: string, userId: string) { facts: [], }; } -} \ No newline at end of file +} diff --git a/apps/webapp/app/services/graphModels/episode.ts b/apps/webapp/app/services/graphModels/episode.ts index 634ae85..38bac51 100644 --- a/apps/webapp/app/services/graphModels/episode.ts +++ b/apps/webapp/app/services/graphModels/episode.ts @@ -315,6 +315,35 @@ export async function getEpisodeStatements(params: { userId: params.userId, }); + return result.map((record) => { + const stmt = record.get("stmt").properties; + + return { + uuid: stmt.uuid, + fact: stmt.fact, + factEmbedding: stmt.factEmbedding, + createdAt: new Date(stmt.createdAt), + validAt: new Date(stmt.validAt), + invalidAt: stmt.invalidAt ? new Date(stmt.invalidAt) : null, + attributes: stmt.attributesJson ? JSON.parse(stmt.attributesJson) : {}, + userId: stmt.userId, + }; + }); +} + +export async function getStatementsInvalidatedByEpisode(params: { + episodeUuid: string; + userId: string; +}) { + const query = ` + MATCH (stmt:Statement {invalidatedBy: $episodeUuid}) + RETURN stmt + `; + + const result = await runQuery(query, { + episodeUuid: params.episodeUuid, + }); + return result.map((record) => { const stmt = record.get("stmt").properties; return {