@@ -4,6 +4,7 @@ import { batch, createEffect, createMemo, createRoot, on, onCleanup } from "soli
44import { useParams } from "@solidjs/router"
55import { useSDK } from "./sdk"
66import type { Platform } from "./platform"
7+ import { ServerConnection , useServer } from "./server"
78import { defaultTitle , titleNumber } from "./terminal-title"
89import { Persist , persisted , removePersisted } from "@/utils/persist"
910
@@ -82,10 +83,31 @@ export function migrateTerminalState(value: unknown) {
8283 }
8384}
8485
85- export function getWorkspaceTerminalCacheKey ( dir : string ) {
86+ export function getWorkspaceTerminalCacheKey ( dir : string , scope ?: string ) {
87+ if ( scope ) return `${ scope } :${ dir } :${ WORKSPACE_KEY } `
8688 return `${ dir } :${ WORKSPACE_KEY } `
8789}
8890
91+ export function getTerminalServerScope ( conn : ServerConnection . Any | undefined , key : ServerConnection . Key ) {
92+ if ( ! conn ) return
93+ if ( conn . type === "sidecar" && conn . variant === "base" ) return
94+ if ( conn . type === "http" ) {
95+ try {
96+ const url = new URL ( conn . http . url )
97+ if (
98+ url . hostname === "localhost" ||
99+ url . hostname === "127.0.0.1" ||
100+ url . hostname === "::1" ||
101+ url . hostname === "[::1]"
102+ )
103+ return
104+ } catch {
105+ return key
106+ }
107+ }
108+ return key
109+ }
110+
89111export function getLegacyTerminalStorageKeys ( dir : string , legacySessionID ?: string ) {
90112 if ( ! legacySessionID ) return [ `${ dir } /terminal.v1` ]
91113 return [ `${ dir } /terminal/${ legacySessionID } .v1` , `${ dir } /terminal.v1` ]
@@ -110,15 +132,16 @@ const trimTerminal = (pty: LocalPTY) => {
110132 }
111133}
112134
113- export function clearWorkspaceTerminals ( dir : string , sessionIDs ?: string [ ] , platform ?: Platform ) {
114- const key = getWorkspaceTerminalCacheKey ( dir )
135+ export function clearWorkspaceTerminals ( dir : string , sessionIDs ?: string [ ] , platform ?: Platform , scope ?: string ) {
136+ const key = getWorkspaceTerminalCacheKey ( dir , scope )
115137 for ( const cache of caches ) {
116138 const entry = cache . get ( key )
117139 entry ?. value . clear ( )
118140 }
119141
120- void removePersisted ( Persist . workspace ( dir , "terminal" ) , platform )
142+ void removePersisted ( Persist . workspace ( dir , scope ? `terminal: ${ scope } ` : "terminal" ) , platform )
121143
144+ if ( scope ) return
122145 const legacy = new Set ( getLegacyTerminalStorageKeys ( dir ) )
123146 for ( const id of sessionIDs ?? [ ] ) {
124147 for ( const key of getLegacyTerminalStorageKeys ( dir , id ) ) {
@@ -130,12 +153,17 @@ export function clearWorkspaceTerminals(dir: string, sessionIDs?: string[], plat
130153 }
131154}
132155
133- function createWorkspaceTerminalSession ( sdk : ReturnType < typeof useSDK > , dir : string , legacySessionID ?: string ) {
134- const legacy = getLegacyTerminalStorageKeys ( dir , legacySessionID )
156+ function createWorkspaceTerminalSession (
157+ sdk : ReturnType < typeof useSDK > ,
158+ dir : string ,
159+ legacySessionID ?: string ,
160+ scope ?: string ,
161+ ) {
162+ const legacy = scope ? [ ] : getLegacyTerminalStorageKeys ( dir , legacySessionID )
135163
136164 const [ store , setStore , _ , ready ] = persisted (
137165 {
138- ...Persist . workspace ( dir , "terminal" , legacy ) ,
166+ ...Persist . workspace ( dir , scope ? `terminal: ${ scope } ` : "terminal" , legacy ) ,
139167 migrate : migrateTerminalState ,
140168 } ,
141169 createStore < {
@@ -357,8 +385,12 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
357385 gate : false ,
358386 init : ( ) => {
359387 const sdk = useSDK ( )
388+ const server = useServer ( )
360389 const params = useParams ( )
361390 const cache = new Map < string , TerminalCacheEntry > ( )
391+ const scope = createMemo ( ( ) => {
392+ return getTerminalServerScope ( server . current , server . key )
393+ } )
362394
363395 caches . add ( cache )
364396 onCleanup ( ( ) => caches . delete ( cache ) )
@@ -382,9 +414,9 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
382414 }
383415 }
384416
385- const loadWorkspace = ( dir : string , legacySessionID ? : string ) => {
417+ const loadWorkspace = ( dir : string , legacySessionID : string | undefined , serverScope : string | undefined ) => {
386418 // Terminals are workspace-scoped so tabs persist while switching sessions in the same directory.
387- const key = getWorkspaceTerminalCacheKey ( dir )
419+ const key = getWorkspaceTerminalCacheKey ( dir , serverScope )
388420 const existing = cache . get ( key )
389421 if ( existing ) {
390422 cache . delete ( key )
@@ -393,7 +425,7 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
393425 }
394426
395427 const entry = createRoot ( ( dispose ) => ( {
396- value : createWorkspaceTerminalSession ( sdk , dir , legacySessionID ) ,
428+ value : createWorkspaceTerminalSession ( sdk , dir , legacySessionID , serverScope ) ,
397429 dispose,
398430 } ) )
399431
@@ -402,16 +434,16 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
402434 return entry . value
403435 }
404436
405- const workspace = createMemo ( ( ) => loadWorkspace ( params . dir ! , params . id ) )
437+ const workspace = createMemo ( ( ) => loadWorkspace ( params . dir ! , params . id , scope ( ) ) )
406438
407439 createEffect (
408440 on (
409- ( ) => ( { dir : params . dir , id : params . id } ) ,
441+ ( ) => ( { dir : params . dir , id : params . id , scope : scope ( ) } ) ,
410442 ( next , prev ) => {
411443 if ( ! prev ?. dir ) return
412- if ( next . dir === prev . dir && next . id === prev . id ) return
413- if ( next . dir === prev . dir && next . id ) return
414- loadWorkspace ( prev . dir , prev . id ) . trimAll ( )
444+ if ( next . dir === prev . dir && next . id === prev . id && next . scope === prev . scope ) return
445+ if ( next . dir === prev . dir && next . id && next . scope === prev . scope ) return
446+ loadWorkspace ( prev . dir , prev . id , prev . scope ) . trimAll ( )
415447 } ,
416448 { defer : true } ,
417449 ) ,
0 commit comments