@@ -184,22 +184,6 @@ class WebSocketManager {
184184
185185const wsManager = new WebSocketManager ( ) ;
186186
187- // Cache workspace metadata to avoid async lookup during user gestures (popup blocker issue)
188- let workspaceMetadataCache : Array < {
189- id : string ;
190- runtimeConfig ?: { type : "local" | "ssh" } ;
191- } > = [ ] ;
192-
193- // Update cache when workspace metadata changes
194- function updateWorkspaceCache ( ) {
195- void invokeIPC ( IPC_CHANNELS . WORKSPACE_LIST ) . then ( ( workspaces ) => {
196- workspaceMetadataCache = workspaces as typeof workspaceMetadataCache ;
197- } ) ;
198- }
199-
200- // Initialize cache
201- updateWorkspaceCache ( ) ;
202-
203187// Create the Web API implementation
204188const webApi : IPCApi = {
205189 tokenizer : {
@@ -256,9 +240,7 @@ const webApi: IPCApi = {
256240 } ,
257241
258242 onMetadata : ( callback ) => {
259- // Update cache whenever workspace metadata changes
260243 const unsubscribe = wsManager . on ( IPC_CHANNELS . WORKSPACE_METADATA , ( data : unknown ) => {
261- updateWorkspaceCache ( ) ;
262244 callback ( data as Parameters < typeof callback > [ 0 ] ) ;
263245 } ) ;
264246 return unsubscribe ;
@@ -289,18 +271,12 @@ const webApi: IPCApi = {
289271 return wsManager . on ( channel , callback as ( data : unknown ) => void ) ;
290272 } ,
291273 openWindow : ( workspaceId ) => {
292- // Check workspace runtime type using cached metadata (synchronous )
274+ // In browser mode, always open terminal in a new browser window (for both local and SSH workspaces )
293275 // This must be synchronous to avoid popup blocker during user gesture
294- const workspace = workspaceMetadataCache . find ( ( ws ) => ws . id === workspaceId ) ;
295- const isSSH = workspace ?. runtimeConfig ?. type === "ssh" ;
296-
297- if ( isSSH ) {
298- // SSH workspace - open browser tab with terminal UI (must be synchronous)
299- const url = `/terminal.html?workspaceId=${ encodeURIComponent ( workspaceId ) } ` ;
300- window . open ( url , `terminal-${ workspaceId } -${ Date . now ( ) } ` , "width=1000,height=600" ) ;
301- }
302- // For local workspaces, the IPC handler will open a native terminal
276+ const url = `/terminal.html?workspaceId=${ encodeURIComponent ( workspaceId ) } ` ;
277+ window . open ( url , `terminal-${ workspaceId } -${ Date . now ( ) } ` , "width=1000,height=600,popup=yes" ) ;
303278
279+ // Also invoke IPC to let backend know (desktop mode will handle native/ghostty-web routing)
304280 return invokeIPC ( IPC_CHANNELS . TERMINAL_WINDOW_OPEN , workspaceId ) ;
305281 } ,
306282 closeWindow : ( workspaceId ) => invokeIPC ( IPC_CHANNELS . TERMINAL_WINDOW_CLOSE , workspaceId ) ,
0 commit comments