1
1
import type {
2
+ Template ,
2
3
Workspace ,
3
4
WorkspaceAgent ,
4
5
WorkspaceAgentDevcontainer ,
@@ -30,12 +31,16 @@ import {
30
31
} from "./SSHButton/SSHButton" ;
31
32
import { TerminalLink } from "./TerminalLink/TerminalLink" ;
32
33
import { VSCodeDevContainerButton } from "./VSCodeDevContainerButton/VSCodeDevContainerButton" ;
34
+ import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility" ;
35
+ import { useProxy } from "contexts/ProxyContext" ;
36
+ import { PortForwardButton } from "./PortForwardButton" ;
33
37
34
38
type AgentDevcontainerCardProps = {
35
39
parentAgent :WorkspaceAgent ;
36
40
subAgents :WorkspaceAgent [ ] ;
37
41
devcontainer :WorkspaceAgentDevcontainer ;
38
42
workspace :Workspace ;
43
+ template :Template ;
39
44
wildcardHostname :string ;
40
45
} ;
41
46
@@ -44,10 +49,13 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
44
49
subAgents,
45
50
devcontainer,
46
51
workspace,
52
+ template,
47
53
wildcardHostname,
48
54
} ) => {
55
+ const { browser_only} = useFeatureVisibility ( ) ;
56
+ const { proxy} = useProxy ( ) ;
57
+
49
58
const [ isRecreating , setIsRecreating ] = useState ( false ) ;
50
- const [ subAgent , setSubAgent ] = useState < WorkspaceAgent | null > ( null ) ;
51
59
52
60
const handleRecreateDevcontainer = async ( ) => {
53
61
setIsRecreating ( true ) ;
@@ -83,24 +91,24 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
83
91
}
84
92
} ;
85
93
94
+ const subAgent = subAgents . find ( ( sub ) => sub . id === devcontainer . agent ?. id ) ;
95
+ const shouldDisplaySubAgentApps =
96
+ subAgent ?. status === "connected" || subAgent ?. status === "connecting" ;
97
+
86
98
// If the devcontainer is starting, reflect this in the recreate button.
87
99
useEffect ( ( ) => {
100
+ console . log (
101
+ "Devcontainer status:" ,
102
+ devcontainer . status ,
103
+ "Sub agent status:" ,
104
+ subAgent ?. status ,
105
+ ) ;
88
106
if ( devcontainer . status === "starting" ) {
89
107
setIsRecreating ( true ) ;
90
108
} else {
91
109
setIsRecreating ( false ) ;
92
110
}
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 ] ) ;
111
+ } , [ devcontainer ] ) ;
104
112
105
113
return (
106
114
< section
@@ -148,26 +156,41 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
148
156
Recreate
149
157
</ Button >
150
158
151
- { subAgent && subAgent . display_apps . includes ( "ssh_helper" ) && (
152
- < AgentSSHButton
153
- workspaceName = { workspace . name }
154
- agentName = { subAgent . name }
155
- workspaceOwnerUsername = { workspace . owner_name }
156
- />
157
- ) }
159
+ { shouldDisplaySubAgentApps &&
160
+ ! browser_only &&
161
+ // TODO(mafredri): We could use subAgent display apps here but we currently set none.
162
+ parentAgent . display_apps . includes ( "ssh_helper" ) && (
163
+ < AgentSSHButton
164
+ workspaceName = { workspace . name }
165
+ agentName = { subAgent . name }
166
+ workspaceOwnerUsername = { workspace . owner_name }
167
+ />
168
+ ) }
169
+
170
+ { shouldDisplaySubAgentApps &&
171
+ proxy . preferredWildcardHostname === "" &&
172
+ // TODO(mafredri): We could use subAgent display apps here but we currently set none.
173
+ parentAgent . display_apps . includes ( "port_forwarding_helper" ) && (
174
+ < PortForwardButton
175
+ host = { proxy . preferredWildcardHostname }
176
+ workspace = { workspace }
177
+ agent = { subAgent }
178
+ template = { template }
179
+ />
180
+ ) }
158
181
</ div >
159
182
</ header >
160
183
161
- { subAgent && devcontainer . container && (
184
+ { shouldDisplaySubAgentApps && devcontainer . container && (
162
185
< >
163
186
< h4 className = "m-0 text-xl font-semibold mb-2" > Forwarded ports</ h4 >
164
187
< div className = "flex gap-4 flex-wrap mt-4" >
165
188
< VSCodeDevContainerButton
166
189
userName = { workspace . owner_name }
167
190
workspaceName = { workspace . name }
168
191
devContainerName = { devcontainer . container . name }
169
- devContainerFolder = { subAgent . directory ?? "" } // This will always be set.
170
- displayApps = { subAgent . display_apps }
192
+ devContainerFolder = { subAgent . directory ?? "/ " } // This will always be set on subagents but provide fallback anyway .
193
+ displayApps = { parentAgent . display_apps } // TODO(mafredri): We could use subAgent display apps here but we currently set none.
171
194
agentName = { parentAgent . name }
172
195
/>
173
196