@@ -19,15 +19,13 @@ import {
1919TooltipProvider ,
2020TooltipTrigger ,
2121} from "components/Tooltip/Tooltip" ;
22- import { useProxy } from "contexts/ProxyContext" ;
2322import {
2423ArrowLeftIcon ,
2524ChevronDownIcon ,
2625LayoutGridIcon ,
2726RotateCcwIcon ,
2827} from "lucide-react" ;
2928import { AppStatusIcon } from "modules/apps/AppStatusIcon" ;
30- import { getAppHref } from "modules/apps/apps" ;
3129import { useAppLink } from "modules/apps/useAppLink" ;
3230import { AI_PROMPT_PARAMETER_NAME , type Task } from "modules/tasks/tasks" ;
3331import { WorkspaceAppStatus } from "modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus" ;
@@ -312,17 +310,6 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
312310throw new Error ( `Agent for app${ activeAppId } not found in task workspace` ) ;
313311}
314312
315- const { proxy} = useProxy ( ) ;
316- const [ iframeSrc , setIframeSrc ] = useState ( ( ) => {
317- const src = getAppHref ( activeApp , {
318- agent,
319- workspace :task . workspace ,
320- path :proxy . preferredPathAppURL ,
321- host :proxy . preferredWildcardHostname ,
322- } ) ;
323- return src ;
324- } ) ;
325-
326313const embeddedApps = apps . filter ( ( app ) => ! app . external ) ;
327314const externalApps = apps . filter ( ( app ) => app . external ) ;
328315
@@ -344,7 +331,6 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
344331
345332e . preventDefault ( ) ;
346333setActiveAppId ( app . id ) ;
347- setIframeSrc ( e . currentTarget . href ) ;
348334} }
349335/>
350336) ) }
@@ -387,11 +373,16 @@ const TaskApps: FC<TaskAppsProps> = ({ task }) => {
387373</ div >
388374
389375< div className = "flex-1" >
390- < iframe
391- title = { activeApp . display_name ?? activeApp . slug }
392- className = "w-full h-full border-0"
393- src = { iframeSrc }
394- />
376+ { embeddedApps . map ( ( app ) => {
377+ return (
378+ < TaskAppIFrame
379+ key = { app . id }
380+ active = { activeAppId === app . id }
381+ app = { app }
382+ task = { task }
383+ />
384+ ) ;
385+ } ) }
395386</ div >
396387</ main >
397388) ;
@@ -443,6 +434,37 @@ const TaskAppButton: FC<TaskAppButtonProps> = ({
443434) ;
444435} ;
445436
437+ type TaskAppIFrameProps = {
438+ task :Task ;
439+ app :WorkspaceApp ;
440+ active :boolean ;
441+ } ;
442+
443+ const TaskAppIFrame :FC < TaskAppIFrameProps > = ( { task, app, active} ) => {
444+ const agent = task . workspace . latest_build . resources
445+ . flatMap ( ( r ) => r . agents )
446+ . filter ( ( a ) => ! ! a )
447+ . find ( ( a ) => a . apps . some ( ( a ) => a . id === app . id ) ) ;
448+
449+ if ( ! agent ) {
450+ throw new Error ( `Agent for app${ app . id } not found in task workspace` ) ;
451+ }
452+
453+ const link = useAppLink ( app , {
454+ agent,
455+ workspace :task . workspace ,
456+ } ) ;
457+
458+ return (
459+ < iframe
460+ src = { link . href }
461+ title = { link . label }
462+ loading = "eager"
463+ className = { cn ( [ active ?"block" :"hidden" , "w-full h-full border-0" ] ) }
464+ />
465+ ) ;
466+ } ;
467+
446468export const data = {
447469fetchTask :async ( workspaceOwnerUsername :string , workspaceName :string ) => {
448470const workspace = await API . getWorkspaceByOwnerAndName (