@@ -24,6 +24,32 @@ class TerminalManager {
2424 this . terminalCounter = 0 ;
2525 }
2626
27+ extractTerminalNumber ( name ) {
28+ if ( ! name ) return null ;
29+ const match = String ( name ) . match ( / ^ T e r m i n a l \s + ( \d + ) (?: \b | - ) / i) ;
30+ if ( ! match ) return null ;
31+ const number = Number . parseInt ( match [ 1 ] , 10 ) ;
32+ return Number . isInteger ( number ) && number > 0 ? number : null ;
33+ }
34+
35+ getNextAvailableTerminalNumber ( ) {
36+ const usedNumbers = new Set ( ) ;
37+
38+ for ( const terminal of this . terminals . values ( ) ) {
39+ const number = terminal ?. terminalNumber ;
40+ if ( Number . isInteger ( number ) && number > 0 ) {
41+ usedNumbers . add ( number ) ;
42+ }
43+ }
44+
45+ let nextNumber = 1 ;
46+ while ( usedNumbers . has ( nextNumber ) ) {
47+ nextNumber ++ ;
48+ }
49+
50+ return nextNumber ;
51+ }
52+
2753 async getPersistedSessions ( ) {
2854 try {
2955 const stored = helpers . parseJSON (
@@ -163,7 +189,15 @@ class TerminalManager {
163189 const isServerMode = serverMode !== false ;
164190
165191 const terminalId = `terminal_${ ++ this . terminalCounter } ` ;
166- const terminalName = options . name || `Terminal ${ this . terminalCounter } ` ;
192+ const providedName =
193+ typeof options . name === "string" ? options . name . trim ( ) : "" ;
194+ const terminalNumber = providedName
195+ ? this . extractTerminalNumber ( providedName )
196+ : this . getNextAvailableTerminalNumber ( ) ;
197+ const terminalName = providedName || `Terminal ${ terminalNumber } ` ;
198+ const titlePrefix = terminalNumber
199+ ? `Terminal ${ terminalNumber } `
200+ : terminalName ;
167201
168202 // Check if terminal is installed before proceeding
169203 if ( isServerMode ) {
@@ -228,11 +262,13 @@ class TerminalManager {
228262 terminalFile ,
229263 terminalComponent ,
230264 uniqueId ,
265+ titlePrefix ,
231266 ) ;
232267
233268 const instance = {
234269 id : uniqueId ,
235270 name : terminalName ,
271+ terminalNumber,
236272 component : terminalComponent ,
237273 file : terminalFile ,
238274 container : terminalContainer ,
@@ -430,7 +466,12 @@ class TerminalManager {
430466 * @param {TerminalComponent } terminalComponent - Terminal component
431467 * @param {string } terminalId - Terminal ID
432468 */
433- async setupTerminalHandlers ( terminalFile , terminalComponent , terminalId ) {
469+ async setupTerminalHandlers (
470+ terminalFile ,
471+ terminalComponent ,
472+ terminalId ,
473+ titlePrefix = terminalId ,
474+ ) {
434475 const textarea = terminalComponent . terminal ?. textarea ;
435476 if ( textarea ) {
436477 const onFocus = ( ) => {
@@ -583,8 +624,8 @@ class TerminalManager {
583624
584625 terminalComponent . onTitleChange = async ( title ) => {
585626 if ( title ) {
586- // Format terminal title as "Terminal ! - title"
587- const formattedTitle = `Terminal ${ this . terminalCounter } - ${ title } ` ;
627+ // Keep the tab prefix stable for this terminal instance.
628+ const formattedTitle = `${ titlePrefix } - ${ title } ` ;
588629 terminalFile . filename = formattedTitle ;
589630
590631 if ( terminalComponent . serverMode && terminalComponent . pid ) {
0 commit comments