@@ -3,7 +3,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
33import { batch , createEffect , createMemo , createRoot , onCleanup } from "solid-js"
44import { useParams } from "@solidjs/router"
55import { useSDK } from "./sdk"
6- import { Persist , persisted } from "@/utils/persist"
6+ import { Persist , persisted , removePersisted } from "@/utils/persist"
77
88export type LocalPTY = {
99 id : string
@@ -35,6 +35,28 @@ type TerminalCacheEntry = {
3535 dispose : VoidFunction
3636}
3737
38+ const caches = new Set < Map < string , TerminalCacheEntry > > ( )
39+
40+ export function clearWorkspaceTerminals ( dir : string , sessionIDs ?: string [ ] ) {
41+ const key = getWorkspaceTerminalCacheKey ( dir )
42+ for ( const cache of caches ) {
43+ const entry = cache . get ( key )
44+ entry ?. value . clear ( )
45+ }
46+
47+ removePersisted ( Persist . workspace ( dir , "terminal" ) )
48+
49+ const legacy = new Set ( getLegacyTerminalStorageKeys ( dir ) )
50+ for ( const id of sessionIDs ?? [ ] ) {
51+ for ( const key of getLegacyTerminalStorageKeys ( dir , id ) ) {
52+ legacy . add ( key )
53+ }
54+ }
55+ for ( const key of legacy ) {
56+ removePersisted ( { key } )
57+ }
58+ }
59+
3860function createWorkspaceTerminalSession ( sdk : ReturnType < typeof useSDK > , dir : string , legacySessionID ?: string ) {
3961 const legacy = getLegacyTerminalStorageKeys ( dir , legacySessionID )
4062
@@ -56,7 +78,7 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
5678 } ) ,
5779 )
5880
59- const unsub = sdk . event . on ( "pty.exited" , ( event ) => {
81+ const unsub = sdk . event . on ( "pty.exited" , ( event : { properties : { id : string } } ) => {
6082 const id = event . properties . id
6183 if ( ! store . all . some ( ( x ) => x . id === id ) ) return
6284 batch ( ( ) => {
@@ -96,6 +118,12 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
96118 ready,
97119 all : createMemo ( ( ) => Object . values ( store . all ) ) ,
98120 active : createMemo ( ( ) => store . active ) ,
121+ clear ( ) {
122+ batch ( ( ) => {
123+ setStore ( "active" , undefined )
124+ setStore ( "all" , [ ] )
125+ } )
126+ } ,
99127 new ( ) {
100128 const existingTitleNumbers = new Set (
101129 store . all . flatMap ( ( pty ) => {
@@ -114,7 +142,7 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
114142
115143 sdk . client . pty
116144 . create ( { title : `Terminal ${ nextNumber } ` } )
117- . then ( ( pty ) => {
145+ . then ( ( pty : { data ?: { id ?: string ; title ?: string } } ) => {
118146 const id = pty . data ?. id
119147 if ( ! id ) return
120148 const newTerminal = {
@@ -128,8 +156,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
128156 } )
129157 setStore ( "active" , id )
130158 } )
131- . catch ( ( e ) => {
132- console . error ( "Failed to create terminal" , e )
159+ . catch ( ( error : unknown ) => {
160+ console . error ( "Failed to create terminal" , error )
133161 } )
134162 } ,
135163 update ( pty : Partial < LocalPTY > & { id : string } ) {
@@ -143,8 +171,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
143171 title : pty . title ,
144172 size : pty . cols && pty . rows ? { rows : pty . rows , cols : pty . cols } : undefined ,
145173 } )
146- . catch ( ( e ) => {
147- console . error ( "Failed to update terminal" , e )
174+ . catch ( ( error : unknown ) => {
175+ console . error ( "Failed to update terminal" , error )
148176 } )
149177 } ,
150178 async clone ( id : string ) {
@@ -155,8 +183,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
155183 . create ( {
156184 title : pty . title ,
157185 } )
158- . catch ( ( e ) => {
159- console . error ( "Failed to clone terminal" , e )
186+ . catch ( ( error : unknown ) => {
187+ console . error ( "Failed to clone terminal" , error )
160188 return undefined
161189 } )
162190 if ( ! clone ?. data ) return
@@ -200,8 +228,8 @@ function createWorkspaceTerminalSession(sdk: ReturnType<typeof useSDK>, dir: str
200228 setStore ( "all" , filtered )
201229 } )
202230
203- await sdk . client . pty . remove ( { ptyID : id } ) . catch ( ( e ) => {
204- console . error ( "Failed to close terminal" , e )
231+ await sdk . client . pty . remove ( { ptyID : id } ) . catch ( ( error : unknown ) => {
232+ console . error ( "Failed to close terminal" , error )
205233 } )
206234 } ,
207235 move ( id : string , to : number ) {
@@ -225,6 +253,9 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
225253 const params = useParams ( )
226254 const cache = new Map < string , TerminalCacheEntry > ( )
227255
256+ caches . add ( cache )
257+ onCleanup ( ( ) => caches . delete ( cache ) )
258+
228259 const disposeAll = ( ) => {
229260 for ( const entry of cache . values ( ) ) {
230261 entry . dispose ( )
0 commit comments