@@ -23,6 +23,11 @@ type TaskAppsProps = {
23
23
task : Task ;
24
24
} ;
25
25
26
+ type AppWithAgent = {
27
+ app : WorkspaceApp ;
28
+ agent : WorkspaceAgent ;
29
+ } ;
30
+
26
31
export const TaskApps : FC < TaskAppsProps > = ( { task } ) => {
27
32
const agents = task . workspace . latest_build . resources
28
33
. flatMap ( ( r ) => r . agents )
@@ -31,27 +36,34 @@ export const TaskApps: FC<TaskAppsProps> = ({ task }) => {
31
36
// The Chat UI app will be displayed in the sidebar, so we don't want to show
32
37
// it here
33
38
const apps = agents
34
- . flatMap ( ( a ) => a ?. apps )
39
+ . flatMap ( ( agent ) =>
40
+ agent . apps . map ( ( app ) => ( {
41
+ app,
42
+ agent,
43
+ } ) ) ,
44
+ )
35
45
. filter (
36
- ( a ) => ! ! a && a . id !== task . workspace . latest_build . ai_task_sidebar_app_id ,
46
+ ( { app } ) =>
47
+ ! ! app && app . id !== task . workspace . latest_build . ai_task_sidebar_app_id ,
37
48
) ;
38
49
39
- const embeddedApps = apps . filter ( ( app ) => ! app . external ) ;
40
- const externalApps = apps . filter ( ( app ) => app . external ) ;
50
+ const embeddedApps = apps . filter ( ( { app } ) => ! app . external ) ;
51
+ const externalApps = apps . filter ( ( { app } ) => app . external ) ;
41
52
42
53
const [ activeAppId , setActiveAppId ] = useState < string | undefined > (
43
- embeddedApps [ 0 ] ?. id ,
54
+ embeddedApps [ 0 ] ?. app . id ,
44
55
) ;
45
56
46
57
return (
47
58
< main className = "flex flex-col" >
48
59
< div className = "w-full flex items-center border-0 border-b border-border border-solid" >
49
60
< div className = "p-2 pb-0 flex gap-2 items-center" >
50
- { embeddedApps . map ( ( app ) => (
61
+ { embeddedApps . map ( ( { app, agent } ) => (
51
62
< TaskAppTab
52
63
key = { app . id }
53
64
task = { task }
54
65
app = { app }
66
+ agent = { agent }
55
67
active = { app . id === activeAppId }
56
68
onClick = { ( e ) => {
57
69
e . preventDefault ( ) ;
@@ -72,7 +84,7 @@ export const TaskApps: FC<TaskAppsProps> = ({ task }) => {
72
84
73
85
{ embeddedApps . length > 0 ? (
74
86
< div className = "flex-1" >
75
- { embeddedApps . map ( ( app ) => {
87
+ { embeddedApps . map ( ( { app } ) => {
76
88
return (
77
89
< TaskAppIFrame
78
90
key = { app . id }
@@ -108,7 +120,7 @@ export const TaskApps: FC<TaskAppsProps> = ({ task }) => {
108
120
type TaskExternalAppsDropdownProps = {
109
121
task : Task ;
110
122
agents : WorkspaceAgent [ ] ;
111
- externalApps : WorkspaceApp [ ] ;
123
+ externalApps : AppWithAgent [ ] ;
112
124
} ;
113
125
114
126
const TaskExternalAppsDropdown : FC < TaskExternalAppsDropdownProps > = ( {
@@ -126,16 +138,7 @@ const TaskExternalAppsDropdown: FC<TaskExternalAppsDropdownProps> = ({
126
138
</ Button >
127
139
</ DropdownMenuTrigger >
128
140
< DropdownMenuContent >
129
- { externalApps . map ( ( app ) => {
130
- const agent = agents . find ( ( agent ) =>
131
- agent . apps . some ( ( a ) => a . id === app . id ) ,
132
- ) ;
133
- if ( ! agent ) {
134
- throw new Error (
135
- `Agent for app ${ app . id } not found in task workspace` ,
136
- ) ;
137
- }
138
-
141
+ { externalApps . map ( ( { app, agent } ) => {
139
142
const link = useAppLink ( app , {
140
143
agent,
141
144
workspace : task . workspace ,
@@ -163,20 +166,18 @@ const TaskExternalAppsDropdown: FC<TaskExternalAppsDropdownProps> = ({
163
166
type TaskAppTabProps = {
164
167
task : Task ;
165
168
app : WorkspaceApp ;
169
+ agent : WorkspaceAgent ;
166
170
active : boolean ;
167
171
onClick : ( e : React . MouseEvent < HTMLAnchorElement > ) => void ;
168
172
} ;
169
173
170
- const TaskAppTab : FC < TaskAppTabProps > = ( { task, app, active, onClick } ) => {
171
- const agent = task . workspace . latest_build . resources
172
- . flatMap ( ( r ) => r . agents )
173
- . filter ( ( a ) => ! ! a )
174
- . find ( ( a ) => a . apps . some ( ( a ) => a . id === app . id ) ) ;
175
-
176
- if ( ! agent ) {
177
- throw new Error ( `Agent for app ${ app . id } not found in task workspace` ) ;
178
- }
179
-
174
+ const TaskAppTab : FC < TaskAppTabProps > = ( {
175
+ task,
176
+ app,
177
+ agent,
178
+ active,
179
+ onClick,
180
+ } ) => {
180
181
const link = useAppLink ( app , {
181
182
agent,
182
183
workspace : task . workspace ,
0 commit comments