@@ -32,26 +32,29 @@ import { TerminalLink } from "./TerminalLink/TerminalLink";
32
32
import { VSCodeDevContainerButton } from "./VSCodeDevContainerButton/VSCodeDevContainerButton" ;
33
33
34
34
type AgentDevcontainerCardProps = {
35
- agent :WorkspaceAgent ;
35
+ parentAgent :WorkspaceAgent ;
36
+ subAgents :WorkspaceAgent [ ] ;
36
37
devcontainer :WorkspaceAgentDevcontainer ;
37
38
workspace :Workspace ;
38
39
wildcardHostname :string ;
39
40
} ;
40
41
41
42
export const AgentDevcontainerCard :FC < AgentDevcontainerCardProps > = ( {
42
- agent,
43
+ parentAgent,
44
+ subAgents,
43
45
devcontainer,
44
46
workspace,
45
47
wildcardHostname,
46
48
} ) => {
47
49
const [ isRecreating , setIsRecreating ] = useState ( false ) ;
50
+ const [ subAgent , setSubAgent ] = useState < WorkspaceAgent | null > ( null ) ;
48
51
49
52
const handleRecreateDevcontainer = async ( ) => {
50
53
setIsRecreating ( true ) ;
51
54
let recreateSucceeded = false ;
52
55
try {
53
56
const response = await fetch (
54
- `/api/v2/workspaceagents/${ agent . id } /containers/devcontainers/container/${ devcontainer . container ?. id } /recreate` ,
57
+ `/api/v2/workspaceagents/${ parentAgent . id } /containers/devcontainers/container/${ devcontainer . container ?. id } /recreate` ,
55
58
{
56
59
method :"POST" ,
57
60
} ,
@@ -87,7 +90,17 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
87
90
} else {
88
91
setIsRecreating ( false ) ;
89
92
}
90
- } , [ devcontainer . status ] ) ;
93
+ } , [ devcontainer . id , devcontainer . status ] ) ;
94
+
95
+ const shouldDisplayAgentApps =
96
+ subAgent ?. status === "connected" || subAgent ?. status === "connecting" ;
97
+
98
+ // Woot! We have a sub agent, so we can display the forwarded ports.
99
+ useEffect ( ( ) => {
100
+ setSubAgent (
101
+ subAgents . find ( ( sub ) => sub . id === devcontainer . agent ?. id ) || null ,
102
+ ) ;
103
+ } , [ subAgents , devcontainer . agent ?. id ] ) ;
91
104
92
105
return (
93
106
< section
@@ -135,46 +148,37 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
135
148
Recreate
136
149
</ Button >
137
150
138
- { /* <AgentDevcontainerSSHButton
139
- workspace={workspace.name}
140
- container={devcontainer.container?.name || devcontainer.name}
141
- /> */ }
142
- { /* TODO(mafredri): Sub agent display apps. */ }
143
- { devcontainer . agent && agent . display_apps . includes ( "ssh_helper" ) && (
151
+ { subAgent && subAgent . display_apps . includes ( "ssh_helper" ) && (
144
152
< AgentSSHButton
145
153
workspaceName = { workspace . name }
146
- agentName = { devcontainer . agent . name || devcontainer . name }
154
+ agentName = { subAgent . name }
147
155
workspaceOwnerUsername = { workspace . owner_name }
148
156
/>
149
157
) }
150
158
</ div >
151
159
</ header >
152
160
153
- { devcontainer . agent && (
161
+ { subAgent && devcontainer . container && (
154
162
< >
155
163
< h4 className = "m-0 text-xl font-semibold mb-2" > Forwarded ports</ h4 >
156
164
< div className = "flex gap-4 flex-wrap mt-4" >
157
- { devcontainer . container && (
158
- < VSCodeDevContainerButton
159
- userName = { workspace . owner_name }
160
- workspaceName = { workspace . name }
161
- devContainerName = { devcontainer . container . name }
162
- devContainerFolder = { devcontainer . agent . directory }
163
- displayApps = { agent . display_apps } // TODO(mafredri): Sub agent display apps.
164
- agentName = { agent . name } // This must be set to the parent agent.
165
- />
166
- ) }
165
+ < VSCodeDevContainerButton
166
+ userName = { workspace . owner_name }
167
+ workspaceName = { workspace . name }
168
+ devContainerName = { devcontainer . container . name }
169
+ devContainerFolder = { subAgent . directory ?? "" } // This will always be set.
170
+ displayApps = { subAgent . display_apps }
171
+ agentName = { parentAgent . name }
172
+ />
167
173
168
- { devcontainer . agent && (
169
- < TerminalLink
170
- workspaceName = { workspace . name }
171
- agentName = { devcontainer . agent . name }
172
- userName = { workspace . owner_name }
173
- />
174
- ) }
174
+ < TerminalLink
175
+ workspaceName = { workspace . name }
176
+ agentName = { subAgent . name }
177
+ userName = { workspace . owner_name }
178
+ />
175
179
176
180
{ wildcardHostname !== "" &&
177
- devcontainer . container ? .ports . map ( ( port ) => {
181
+ devcontainer . container . ports . map ( ( port ) => {
178
182
const portLabel = `${ port . port } /${ port . network . toUpperCase ( ) } ` ;
179
183
const hasHostBind =
180
184
port . host_port !== undefined && port . host_ip !== undefined ;
@@ -185,7 +189,7 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
185
189
?portForwardURL (
186
190
wildcardHostname ,
187
191
port . host_port ,
188
- devcontainer . agent ?. name || agent . name ,
192
+ subAgent . name ,
189
193
workspace . name ,
190
194
workspace . owner_name ,
191
195
location . protocol === "https" ?"https" :"http" ,