Skip to content

Commit 2fb6c8f

Browse files
authored
fix(tarko-agent-ui): display environment input on session creation (#1667)
1 parent 9dc0d05 commit 2fb6c8f

3 files changed

Lines changed: 58 additions & 40 deletions

File tree

multimodal/tarko/agent-ui/src/common/state/actions/eventProcessors/handlers/SystemHandler.ts

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ export class EnvironmentInputHandler
5151
): void {
5252
const { get, set } = context;
5353

54+
// Check if this is the first environment_input event BEFORE adding the current message
55+
const existingSessionMessages = get(messagesAtom)[sessionId] || [];
56+
const isFirstEnvironmentInput =
57+
existingSessionMessages.filter((msg) => msg.role === 'environment').length === 0;
58+
5459
const environmentMessage: Message = {
5560
id: event.id,
5661
role: 'environment',
@@ -68,7 +73,7 @@ export class EnvironmentInputHandler
6873
};
6974
});
7075

71-
if (Array.isArray(event.content) && shouldUpdatePanelContent(get, sessionId)) {
76+
if (Array.isArray(event.content)) {
7277
const imageContent = event.content.find(
7378
(item): item is ChatCompletionContentPartImage =>
7479
typeof item === 'object' &&
@@ -83,26 +88,44 @@ export class EnvironmentInputHandler
8388

8489
if (imageContent && imageContent.image_url) {
8590
const currentPanelContent = get(sessionPanelContentAtom);
86-
const sessionMessages = get(messagesAtom)[sessionId] || [];
87-
88-
// Check if this is the first environment_input event in the session
89-
const isFirstEnvironmentInput = sessionMessages.filter(msg => msg.role === 'environment').length === 0;
9091
const currentSessionPanel = currentPanelContent[sessionId];
9192

92-
// Always show first environment_input (initialization screenshot) or update existing browser_vision_control panel
93-
if (isFirstEnvironmentInput || (currentSessionPanel && currentSessionPanel.type === 'browser_vision_control')) {
93+
// Common panel properties
94+
const basePanelContent = {
95+
title: event.description || 'Environment Screenshot',
96+
timestamp: event.timestamp,
97+
originalContent: event.content,
98+
environmentId: event.id,
99+
};
100+
101+
let panelContent = null;
102+
103+
if (isFirstEnvironmentInput) {
104+
// First environment input: always show as simple image
105+
panelContent = {
106+
...basePanelContent,
107+
type: 'image',
108+
source: imageContent.image_url.url,
109+
};
110+
} else if (
111+
currentSessionPanel?.type === 'browser_vision_control' ||
112+
shouldUpdatePanelContent(get, sessionId)
113+
) {
114+
// Update existing browser_vision_control panel or create new one
115+
panelContent = {
116+
...basePanelContent,
117+
type: 'browser_vision_control',
118+
source: null,
119+
title: event.description || 'Browser Screenshot',
120+
};
121+
}
122+
123+
if (panelContent) {
94124
set(sessionPanelContentAtom, (prev) => ({
95125
...prev,
96-
[sessionId]: {
97-
type: 'browser_vision_control',
98-
title: event.description || 'Browser Screenshot',
99-
timestamp: event.timestamp,
100-
originalContent: event.content,
101-
environmentId: event.id,
102-
},
126+
[sessionId]: panelContent,
103127
}));
104128
}
105-
// Skip update for other panel types to avoid duplicate Browser Screenshot rendering
106129
}
107130
}
108131
}

multimodal/tarko/agent-ui/src/common/state/actions/sessionActions.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -186,20 +186,20 @@ export const setActiveSessionAction = atom(null, async (get, set, sessionId: str
186186

187187
set(activeSessionIdAtom, sessionId);
188188

189-
// Auto-select best file for workspace display
190-
const sessionFiles = get(sessionFilesAtom);
191-
const files = sessionFiles[sessionId] || [];
192-
const bestFile = selectBestFileToDisplay(files);
193-
194-
if (bestFile) {
195-
console.log(`Auto-selecting file for workspace: ${bestFile.name} (${bestFile.path})`);
196-
setWorkspacePanelForFile(set, sessionId, bestFile);
197-
} else {
198-
// Clear panel content for this session
199-
set(sessionPanelContentAtom, (prev) => ({
200-
...prev,
201-
[sessionId]: null,
202-
}));
189+
// Auto-select best file for workspace display only if no panel content was set by events
190+
const currentPanelContent = get(sessionPanelContentAtom);
191+
const sessionPanelContent = currentPanelContent[sessionId];
192+
193+
if (!sessionPanelContent) {
194+
// No panel content was set by events, try to auto-select a file
195+
const sessionFiles = get(sessionFilesAtom);
196+
const files = sessionFiles[sessionId] || [];
197+
const bestFile = selectBestFileToDisplay(files);
198+
199+
if (bestFile) {
200+
setWorkspacePanelForFile(set, sessionId, bestFile);
201+
}
202+
// If no files and no panel content, leave it as null (don't explicitly clear)
203203
}
204204
} catch (error) {
205205
console.error('Failed to set active session:', error);

multimodal/tarko/agent-ui/src/standalone/workspace/renderers/ImageRenderer.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,19 @@ export const ImageRenderer: React.FC<ImageRendererProps> = ({ panelContent, onAc
6969
if (isScreenshot) {
7070
return (
7171
<div className="relative group md:text-base text-sm">
72-
<BrowserShell title={name || 'Browser Screenshot'}>
73-
<img
74-
src={src}
75-
alt={name || 'Image'}
76-
className="w-full h-auto object-contain md:max-h-[70vh] max-h-48 rounded-lg"
77-
/>
78-
</BrowserShell>
72+
<img
73+
src={src}
74+
alt={name || 'Image'}
75+
className="w-full h-auto object-contain md:max-h-[70vh] max-h-48 rounded-lg"
76+
/>
7977
{actionButtons}
8078
</div>
8179
);
8280
}
8381

8482
return (
8583
<div className="relative group max-w-full">
86-
<motion.div
87-
whileHover={{ scale: 1.01 }}
88-
className="relative"
89-
>
84+
<motion.div whileHover={{ scale: 1.01 }} className="relative">
9085
<img
9186
src={src}
9287
alt={name || 'Image'}

0 commit comments

Comments
 (0)