@@ -24,6 +24,7 @@ function getMergedConfig(server) {
2424 return {
2525 ...server ,
2626 enabled : override . enabled ?? server . enabled ,
27+ startupTimeout : override . startupTimeout ?? server . startupTimeout ,
2728 initializationOptions : {
2829 ...( server . initializationOptions || { } ) ,
2930 ...( override . initializationOptions || { } ) ,
@@ -47,11 +48,24 @@ function getMergedConfig(server) {
4748async function updateServerConfig ( serverId , partial ) {
4849 const current = JSON . parse ( JSON . stringify ( appSettings . value . lsp || { } ) ) ;
4950 current . servers = current . servers || { } ;
50- current . servers [ serverId ] = {
51+ const nextServer = {
5152 ...( current . servers [ serverId ] || { } ) ,
52- ...partial ,
5353 } ;
5454
55+ Object . entries ( partial || { } ) . forEach ( ( [ key , value ] ) => {
56+ if ( value === undefined ) {
57+ delete nextServer [ key ] ;
58+ return ;
59+ }
60+ nextServer [ key ] = value ;
61+ } ) ;
62+
63+ if ( Object . keys ( nextServer ) . length ) {
64+ current . servers [ serverId ] = nextServer ;
65+ } else {
66+ delete current . servers [ serverId ] ;
67+ }
68+
5569 await appSettings . update ( { lsp : current } , false ) ;
5670}
5771
@@ -146,6 +160,15 @@ export default function lspServerDetail(serverId) {
146160 info : "View the server initialization options as JSON" ,
147161 } ) ;
148162
163+ items . push ( {
164+ key : "edit_startup_timeout" ,
165+ text : "Startup Timeout" ,
166+ info :
167+ typeof merged . startupTimeout === "number"
168+ ? `${ merged . startupTimeout } ms`
169+ : "Default (5000 ms)" ,
170+ } ) ;
171+
149172 items . push ( {
150173 key : "edit_init_options" ,
151174 text : "Edit Initialization Options" ,
@@ -210,6 +233,40 @@ export default function lspServerDetail(serverId) {
210233 break ;
211234 }
212235
236+ case "edit_startup_timeout" : {
237+ const currentTimeout =
238+ override . startupTimeout ?? server . startupTimeout ?? 5000 ;
239+ const result = await prompt (
240+ "Startup Timeout (milliseconds)" ,
241+ String ( currentTimeout ) ,
242+ "number" ,
243+ {
244+ test : ( val ) => {
245+ const timeout = Number . parseInt ( String ( val ) , 10 ) ;
246+ return Number . isFinite ( timeout ) && timeout >= 1000 ;
247+ } ,
248+ } ,
249+ ) ;
250+
251+ if ( result !== null ) {
252+ const timeout = Number . parseInt ( String ( result ) , 10 ) ;
253+ if ( ! Number . isFinite ( timeout ) || timeout < 1000 ) {
254+ toast ( "Invalid timeout value" ) ;
255+ break ;
256+ }
257+
258+ await updateServerConfig ( serverId , {
259+ startupTimeout : timeout ,
260+ } ) ;
261+ serverRegistry . updateServer ( serverId , ( current ) => ( {
262+ ...current ,
263+ startupTimeout : timeout ,
264+ } ) ) ;
265+ toast ( `Startup timeout set to ${ timeout } ms` ) ;
266+ }
267+ break ;
268+ }
269+
213270 case "edit_init_options" : {
214271 const currentInitOpts = override . initializationOptions || { } ;
215272 const currentJson = JSON . stringify ( currentInitOpts , null , 2 ) ;
0 commit comments