22// SPDX-License-Identifier: Apache-2.0
33
44import { App } from "@/app/app" ;
5- import { loadMonaco } from "@/app/monaco/monaco-env" ;
65import { loadBadges } from "@/app/store/badge" ;
76import { GlobalModel } from "@/app/store/global-model" ;
87import {
@@ -40,6 +39,7 @@ const platform = getApi().getPlatform();
4039document . title = `Wave Terminal` ;
4140let savedInitOpts : WaveInitOpts = null ;
4241let tabTitleUnsub : ( ( ) => void ) | null = null ;
42+ let monacoLoadPromise : Promise < void > | null = null ;
4343
4444( window as any ) . WOS = WOS ;
4545( window as any ) . globalStore = globalStore ;
@@ -57,6 +57,27 @@ function updateZoomFactor(zoomFactor: number) {
5757 document . documentElement . style . setProperty ( "--zoomfactor-inv" , String ( 1 / zoomFactor ) ) ;
5858}
5959
60+ function ensureMonacoLoaded ( ) : Promise < void > {
61+ if ( monacoLoadPromise == null ) {
62+ monacoLoadPromise = import ( "@/app/monaco/monaco-env" ) . then ( ( { loadMonaco } ) => {
63+ loadMonaco ( ) ;
64+ } ) ;
65+ }
66+ return monacoLoadPromise ;
67+ }
68+
69+ function preloadMonaco ( ) {
70+ fireAndForget ( async ( ) => {
71+ try {
72+ await ensureMonacoLoaded ( ) ;
73+ } catch ( e ) {
74+ const error = e instanceof Error ? e : new Error ( String ( e ) ) ;
75+ getApi ( ) . sendLog ( "Error preloading Monaco " + error . message + "\n" + error . stack ) ;
76+ console . error ( "Error preloading Monaco" , e ) ;
77+ }
78+ } ) ;
79+ }
80+
6081function formatWaveWindowTitle ( tabName ?: string | null ) {
6182 const trimmedTabName = tabName ?. trim ( ) ;
6283 return trimmedTabName ? `Wave Terminal - ${ trimmedTabName } ` : "Wave Terminal" ;
@@ -182,11 +203,15 @@ async function initWave(initOpts: WaveInitOpts) {
182203 const globalWS = initWshrpc ( makeTabRouteId ( initOpts . tabId ) ) ;
183204 ( window as any ) . globalWS = globalWS ;
184205 ( window as any ) . TabRpcClient = TabRpcClient ;
206+ const startupConfigPromise = Promise . all ( [
207+ RpcApi . GetFullConfigCommand ( TabRpcClient ) ,
208+ RpcApi . GetWaveAIModeConfigCommand ( TabRpcClient ) ,
209+ ] ) ;
210+ startupConfigPromise . catch ( ( ) => undefined ) ;
185211
186212 // ensures client/window/workspace are loaded into the cache before rendering
187213 try {
188- await loadConnStatus ( ) ;
189- await loadBadges ( ) ;
214+ await Promise . all ( [ loadConnStatus ( ) , loadBadges ( ) ] ) ;
190215 initGlobalWaveEventSubs ( initOpts ) ;
191216 subscribeToConnEvents ( ) ;
192217 if ( isMacOS ( ) ) {
@@ -212,11 +237,9 @@ async function initWave(initOpts: WaveInitOpts) {
212237 registerGlobalKeys ( ) ;
213238 registerElectronReinjectKeyHandler ( ) ;
214239 registerControlShiftStateUpdateHandler ( ) ;
215- await loadMonaco ( ) ;
216- const fullConfig = await RpcApi . GetFullConfigCommand ( TabRpcClient ) ;
240+ const [ fullConfig , waveaiModeConfig ] = await startupConfigPromise ;
217241 console . log ( "fullconfig" , fullConfig ) ;
218242 globalStore . set ( atoms . fullConfigAtom , fullConfig ) ;
219- const waveaiModeConfig = await RpcApi . GetWaveAIModeConfigCommand ( TabRpcClient ) ;
220243 globalStore . set ( atoms . waveaiModeConfigAtom , waveaiModeConfig . configs ) ;
221244 console . log ( "Wave First Render" ) ;
222245 let firstRenderResolveFn : ( ) => void = null ;
@@ -230,6 +253,7 @@ async function initWave(initOpts: WaveInitOpts) {
230253 await firstRenderPromise ;
231254 console . log ( "Wave First Render Done" ) ;
232255 getApi ( ) . setWindowInitStatus ( "wave-ready" ) ;
256+ preloadMonaco ( ) ;
233257}
234258
235259async function initBuilderWrap ( initOpts : BuilderInitOpts ) {
@@ -283,7 +307,7 @@ async function initBuilder(initOpts: BuilderInitOpts) {
283307
284308 registerBuilderGlobalKeys ( ) ;
285309 registerElectronReinjectKeyHandler ( ) ;
286- await loadMonaco ( ) ;
310+ await ensureMonacoLoaded ( ) ;
287311 const fullConfig = await RpcApi . GetFullConfigCommand ( TabRpcClient ) ;
288312 console . log ( "fullconfig" , fullConfig ) ;
289313 globalStore . set ( atoms . fullConfigAtom , fullConfig ) ;
0 commit comments