@@ -19,7 +19,6 @@ import type { State, VcsCache } from "./types"
1919import { cmp , normalizeAgentList , normalizeProviderList } from "./utils"
2020import { formatServerError } from "@/utils/server-errors"
2121import { QueryClient , queryOptions , skipToken } from "@tanstack/solid-query"
22- import { loadSessionsQuery } from "../global-sync"
2322
2423type GlobalStore = {
2524 ready : boolean
@@ -82,6 +81,9 @@ export async function bootstrapGlobal(input: {
8281 input . setGlobalStore ( "config" , x . data ! )
8382 } ) ,
8483 ) ,
84+ ]
85+
86+ const slow = [
8587 ( ) =>
8688 input . queryClient . fetchQuery ( {
8789 ...loadProvidersQuery ( null ) ,
@@ -93,9 +95,6 @@ export async function bootstrapGlobal(input: {
9395 } ) ,
9496 ) ,
9597 } ) ,
96- ]
97-
98- const slow = [
9998 ( ) =>
10099 retry ( ( ) =>
101100 input . globalSDK . path . get ( ) . then ( ( x ) => {
@@ -183,8 +182,43 @@ function warmSessions(input: {
183182export const loadProvidersQuery = ( directory : string | null ) =>
184183 queryOptions < null > ( { queryKey : [ directory , "providers" ] , queryFn : skipToken } )
185184
186- export const loadAgentsQuery = ( directory : string | null ) =>
187- queryOptions < null > ( { queryKey : [ directory , "agents" ] , queryFn : skipToken } )
185+ export const loadAgentsQuery = (
186+ directory : string | null ,
187+ sdk ?: OpencodeClient ,
188+ transform ?: ( x : Awaited < ReturnType < OpencodeClient [ "app" ] [ "agents" ] > > ) => void ,
189+ ) =>
190+ queryOptions < null > ( {
191+ queryKey : [ directory , "agents" ] ,
192+ queryFn :
193+ sdk && transform
194+ ? ( ) =>
195+ retry ( ( ) =>
196+ sdk . app
197+ . agents ( )
198+ . then ( transform )
199+ . then ( ( ) => null ) ,
200+ )
201+ : skipToken ,
202+ } )
203+
204+ export const loadPathQuery = (
205+ directory : string | null ,
206+ sdk ?: OpencodeClient ,
207+ transform ?: ( x : Awaited < ReturnType < OpencodeClient [ "path" ] [ "get" ] > > ) => void ,
208+ ) =>
209+ queryOptions < Path > ( {
210+ queryKey : [ directory , "path" ] ,
211+ queryFn :
212+ sdk && transform
213+ ? ( ) =>
214+ retry ( ( ) =>
215+ sdk . path . get ( ) . then ( async ( x ) => {
216+ transform ( x )
217+ return x . data !
218+ } ) ,
219+ )
220+ : skipToken ,
221+ } )
188222
189223export async function bootstrapDirectory ( input : {
190224 directory : string
@@ -222,45 +256,27 @@ export async function bootstrapDirectory(input: {
222256 input . setStore ( "lsp" , [ ] )
223257 if ( loading ) input . setStore ( "status" , "partial" )
224258
225- const fast = [ ( ) => Promise . resolve ( input . loadSessions ( input . directory ) ) ]
226-
227- const errs = errors ( await runAll ( fast ) )
228- if ( errs . length > 0 ) {
229- console . error ( "Failed to bootstrap instance" , errs [ 0 ] )
230- const project = getFilename ( input . directory )
231- showToast ( {
232- variant : "error" ,
233- title : input . translate ( "toast.project.reloadFailed.title" , { project } ) ,
234- description : formatServerError ( errs [ 0 ] , input . translate ) ,
235- } )
236- }
237-
259+ const rev = ( providerRev . get ( input . directory ) ?? 0 ) + 1
260+ providerRev . set ( input . directory , rev )
238261 ; ( async ( ) => {
239262 const slow = [
263+ ( ) => Promise . resolve ( input . loadSessions ( input . directory ) ) ,
240264 ( ) =>
241- input . queryClient . ensureQueryData ( {
242- ...loadAgentsQuery ( input . directory ) ,
243- queryFn : ( ) =>
244- retry ( ( ) => input . sdk . app . agents ( ) . then ( ( x ) => input . setStore ( "agent" , normalizeAgentList ( x . data ) ) ) ) . then (
245- ( ) => null ,
246- ) ,
247- } ) ,
265+ input . queryClient . ensureQueryData (
266+ loadAgentsQuery ( input . directory , input . sdk , ( x ) => input . setStore ( "agent" , normalizeAgentList ( x . data ) ) ) ,
267+ ) ,
248268 ( ) => retry ( ( ) => input . sdk . config . get ( ) . then ( ( x ) => input . setStore ( "config" , x . data ! ) ) ) ,
249269 ( ) => retry ( ( ) => input . sdk . session . status ( ) . then ( ( x ) => input . setStore ( "session_status" , x . data ! ) ) ) ,
250- ( ) =>
251- seededProject
252- ? Promise . resolve ( )
253- : retry ( ( ) => input . sdk . project . current ( ) ) . then ( ( x ) => input . setStore ( "project" , x . data ! . id ) ) ,
254- ( ) =>
255- seededPath
256- ? Promise . resolve ( )
257- : retry ( ( ) =>
258- input . sdk . path . get ( ) . then ( ( x ) => {
259- input . setStore ( "path" , x . data ! )
260- const next = projectID ( x . data ?. directory ?? input . directory , input . global . project )
261- if ( next ) input . setStore ( "project" , next )
262- } ) ,
263- ) ,
270+ ! seededProject &&
271+ ( ( ) => retry ( ( ) => input . sdk . project . current ( ) ) . then ( ( x ) => input . setStore ( "project" , x . data ! . id ) ) ) ,
272+ ! seededPath &&
273+ ( ( ) =>
274+ input . queryClient . ensureQueryData (
275+ loadPathQuery ( input . directory , input . sdk , ( x ) => {
276+ const next = projectID ( x . data ?. directory ?? input . directory , input . global . project )
277+ if ( next ) input . setStore ( "project" , next )
278+ } ) ,
279+ ) ) ,
264280 ( ) =>
265281 retry ( ( ) =>
266282 input . sdk . vcs . get ( ) . then ( ( x ) => {
@@ -330,7 +346,28 @@ export async function bootstrapDirectory(input: {
330346 input . setStore ( "mcp_ready" , true )
331347 } ) ,
332348 ) ,
333- ]
349+ ( ) =>
350+ input . queryClient . ensureQueryData ( {
351+ ...loadProvidersQuery ( input . directory ) ,
352+ queryFn : ( ) =>
353+ retry ( ( ) => input . sdk . provider . list ( ) )
354+ . then ( ( x ) => {
355+ if ( providerRev . get ( input . directory ) !== rev ) return
356+ input . setStore ( "provider" , normalizeProviderList ( x . data ! ) )
357+ input . setStore ( "provider_ready" , true )
358+ } )
359+ . catch ( ( err ) => {
360+ if ( providerRev . get ( input . directory ) !== rev ) console . error ( "Failed to refresh provider list" , err )
361+ const project = getFilename ( input . directory )
362+ showToast ( {
363+ variant : "error" ,
364+ title : input . translate ( "toast.project.reloadFailed.title" , { project } ) ,
365+ description : formatServerError ( err , input . translate ) ,
366+ } )
367+ } )
368+ . then ( ( ) => null ) ,
369+ } ) ,
370+ ] . filter ( Boolean ) as ( ( ) => Promise < any > ) [ ]
334371
335372 await waitForPaint ( )
336373 const slowErrs = errors ( await runAll ( slow ) )
@@ -344,29 +381,6 @@ export async function bootstrapDirectory(input: {
344381 } )
345382 }
346383
347- if ( loading && errs . length === 0 && slowErrs . length === 0 ) input . setStore ( "status" , "complete" )
348-
349- const rev = ( providerRev . get ( input . directory ) ?? 0 ) + 1
350- providerRev . set ( input . directory , rev )
351- void input . queryClient . ensureQueryData ( {
352- ...loadSessionsQuery ( input . directory ) ,
353- queryFn : ( ) =>
354- retry ( ( ) => input . sdk . provider . list ( ) )
355- . then ( ( x ) => {
356- if ( providerRev . get ( input . directory ) !== rev ) return
357- input . setStore ( "provider" , normalizeProviderList ( x . data ! ) )
358- input . setStore ( "provider_ready" , true )
359- } )
360- . catch ( ( err ) => {
361- if ( providerRev . get ( input . directory ) !== rev ) console . error ( "Failed to refresh provider list" , err )
362- const project = getFilename ( input . directory )
363- showToast ( {
364- variant : "error" ,
365- title : input . translate ( "toast.project.reloadFailed.title" , { project } ) ,
366- description : formatServerError ( err , input . translate ) ,
367- } )
368- } )
369- . then ( ( ) => null ) ,
370- } )
384+ if ( loading && slowErrs . length === 0 ) input . setStore ( "status" , "complete" )
371385 } ) ( )
372386}
0 commit comments