1- import { useEffect } from "react" ;
1+ import { useEffect , useMemo } from "react" ;
22import { Button } from "@mui/material" ;
33import Grid from "@mui/material/Unstable_Grid2" ;
44import { useSetRecoilState } from "recoil" ;
5+ import { Liquid } from "liquidjs" ;
56import {
67 AgentMessage ,
78 AppMessage ,
9+ AgentStepMessage ,
810 UserMessage ,
911} from "../apps/renderer/Messages" ;
1012import { appRunDataState } from "../../data/atoms" ;
1113import StoreAppHeader from "./StoreAppHeader" ;
1214import LayoutRenderer from "../apps/renderer/LayoutRenderer" ;
15+ import { useCallback } from "react" ;
1316
1417const SessionRenderer = ( { sessionData } ) => {
1518 const storeApp = sessionData ?. store_app ;
1619 const appTypeSlug = storeApp ?. data ?. type_slug || "agent" ;
1720 const setAppRunData = useSetRecoilState ( appRunDataState ) ;
21+ const templateEngine = useMemo ( ( ) => new Liquid ( ) , [ ] ) ;
22+
23+ const renderAgentStepOutput = useCallback (
24+ ( output , processorId ) => {
25+ const template = storeApp ?. data ?. processors ?. find (
26+ ( processor ) => processor . id === processorId ,
27+ ) ?. output_template ;
28+
29+ if ( ! template ) {
30+ return JSON . stringify ( output ) ;
31+ }
32+
33+ return templateEngine . renderSync (
34+ templateEngine . parse ( template . markdown ) ,
35+ output ,
36+ ) ;
37+ } ,
38+ [ storeApp ?. data ?. processors , templateEngine ] ,
39+ ) ;
1840
1941 useEffect ( ( ) => {
2042 let messages = [ ] ;
@@ -29,6 +51,28 @@ const SessionRenderer = ({ sessionData }) => {
2951 }
3052
3153 messages . push ( new UserMessage ( null , runEntry . request_uuid , input ) ) ;
54+
55+ if ( appTypeSlug === "agent" ) {
56+ for ( const processorRun of runEntry . processor_runs ) {
57+ messages . push (
58+ new AgentStepMessage (
59+ null ,
60+ null ,
61+ {
62+ name : processorRun . processor_id || "" ,
63+ arguments : JSON . stringify ( processorRun . input ) ,
64+ output : renderAgentStepOutput (
65+ processorRun . output ,
66+ processorRun . processor_id ,
67+ ) ,
68+ } ,
69+ null ,
70+ false ,
71+ ) ,
72+ ) ;
73+ }
74+ }
75+
3276 messages . push (
3377 appTypeSlug === "agent"
3478 ? new AgentMessage (
@@ -44,15 +88,27 @@ const SessionRenderer = ({ sessionData }) => {
4488 messages,
4589 assistantImage : storeApp . data ?. config ?. assistant_image || "" ,
4690 inputFields : storeApp . data ?. input_fields || [ ] ,
91+ processors : storeApp . data ?. processors || [ ] ,
4792 } ) ;
4893 } , [
4994 sessionData ,
5095 appTypeSlug ,
5196 setAppRunData ,
97+ renderAgentStepOutput ,
5298 storeApp . data ?. config ?. assistant_image ,
5399 storeApp . data ?. input_fields ,
100+ storeApp . data ?. processors ,
54101 ] ) ;
55102
103+ const memoizedLayoutRenderer = useMemo (
104+ ( ) => (
105+ < LayoutRenderer noInput >
106+ { storeApp ?. data ?. config ?. layout || "" }
107+ </ LayoutRenderer >
108+ ) ,
109+ [ storeApp ] ,
110+ ) ;
111+
56112 return (
57113 < Grid container spacing = { 1 } direction = { "column" } sx = { { height : "100%" } } >
58114 < Grid >
@@ -76,9 +132,7 @@ const SessionRenderer = ({ sessionData }) => {
76132 overflow : "auto" ,
77133 } }
78134 >
79- < LayoutRenderer noInput >
80- { storeApp ?. data ?. config ?. layout || "" }
81- </ LayoutRenderer >
135+ { memoizedLayoutRenderer }
82136 </ Grid >
83137 < Button
84138 variant = "contained"
0 commit comments