@@ -312,10 +312,11 @@ export async function openSettings(page: Page) {
312312 return dialog
313313}
314314
315- export async function seedProjects ( page : Page , input : { directory : string ; extra ?: string [ ] } ) {
315+ export async function seedProjects ( page : Page , input : { directory : string ; extra ?: string [ ] ; serverUrl ?: string } ) {
316316 await page . addInitScript (
317317 ( args : { directory : string ; serverUrl : string ; extra : string [ ] } ) => {
318318 const key = "opencode.global.dat:server"
319+ const defaultKey = "opencode.settings.dat:defaultServerUrl"
319320 const raw = localStorage . getItem ( key )
320321 const parsed = ( ( ) => {
321322 if ( ! raw ) return undefined
@@ -331,6 +332,7 @@ export async function seedProjects(page: Page, input: { directory: string; extra
331332 const lastProject = store . lastProject && typeof store . lastProject === "object" ? store . lastProject : { }
332333 const projects = store . projects && typeof store . projects === "object" ? store . projects : { }
333334 const nextProjects = { ...( projects as Record < string , unknown > ) }
335+ const nextList = list . includes ( args . serverUrl ) ? list : [ args . serverUrl , ...list ]
334336
335337 const add = ( origin : string , directory : string ) => {
336338 const current = nextProjects [ origin ]
@@ -356,17 +358,18 @@ export async function seedProjects(page: Page, input: { directory: string; extra
356358 localStorage . setItem (
357359 key ,
358360 JSON . stringify ( {
359- list,
361+ list : nextList ,
360362 projects : nextProjects ,
361363 lastProject,
362364 } ) ,
363365 )
366+ localStorage . setItem ( defaultKey , args . serverUrl )
364367 } ,
365- { directory : input . directory , serverUrl, extra : input . extra ?? [ ] } ,
368+ { directory : input . directory , serverUrl : input . serverUrl ?? serverUrl , extra : input . extra ?? [ ] } ,
366369 )
367370}
368371
369- export async function createTestProject ( ) {
372+ export async function createTestProject ( input ?: { serverUrl ?: string } ) {
370373 const root = await fs . mkdtemp ( path . join ( os . tmpdir ( ) , "opencode-e2e-project-" ) )
371374 const id = `e2e-${ path . basename ( root ) } `
372375
@@ -381,7 +384,7 @@ export async function createTestProject() {
381384 stdio : "ignore" ,
382385 } )
383386
384- return resolveDirectory ( root )
387+ return resolveDirectory ( root , input ?. serverUrl )
385388}
386389
387390export async function cleanupTestProject ( directory : string ) {
@@ -430,22 +433,22 @@ export async function waitSlug(page: Page, skip: string[] = []) {
430433 return next
431434}
432435
433- export async function resolveSlug ( slug : string ) {
436+ export async function resolveSlug ( slug : string , input ?: { serverUrl ?: string } ) {
434437 const directory = base64Decode ( slug )
435438 if ( ! directory ) throw new Error ( `Failed to decode workspace slug: ${ slug } ` )
436- const resolved = await resolveDirectory ( directory )
439+ const resolved = await resolveDirectory ( directory , input ?. serverUrl )
437440 return { directory : resolved , slug : base64Encode ( resolved ) , raw : slug }
438441}
439442
440- export async function waitDir ( page : Page , directory : string ) {
441- const target = await resolveDirectory ( directory )
443+ export async function waitDir ( page : Page , directory : string , input ?: { serverUrl ?: string } ) {
444+ const target = await resolveDirectory ( directory , input ?. serverUrl )
442445 await expect
443446 . poll (
444447 async ( ) => {
445448 await assertHealthy ( page , "waitDir" )
446449 const slug = slugFromUrl ( page . url ( ) )
447450 if ( ! slug ) return ""
448- return resolveSlug ( slug )
451+ return resolveSlug ( slug , input )
449452 . then ( ( item ) => item . directory )
450453 . catch ( ( ) => "" )
451454 } ,
@@ -455,15 +458,15 @@ export async function waitDir(page: Page, directory: string) {
455458 return { directory : target , slug : base64Encode ( target ) }
456459}
457460
458- export async function waitSession ( page : Page , input : { directory : string ; sessionID ?: string } ) {
459- const target = await resolveDirectory ( input . directory )
461+ export async function waitSession ( page : Page , input : { directory : string ; sessionID ?: string ; serverUrl ?: string } ) {
462+ const target = await resolveDirectory ( input . directory , input . serverUrl )
460463 await expect
461464 . poll (
462465 async ( ) => {
463466 await assertHealthy ( page , "waitSession" )
464467 const slug = slugFromUrl ( page . url ( ) )
465468 if ( ! slug ) return false
466- const resolved = await resolveSlug ( slug ) . catch ( ( ) => undefined )
469+ const resolved = await resolveSlug ( slug , { serverUrl : input . serverUrl } ) . catch ( ( ) => undefined )
467470 if ( ! resolved || resolved . directory !== target ) return false
468471 const current = sessionIDFromUrl ( page . url ( ) )
469472 if ( input . sessionID && current !== input . sessionID ) return false
@@ -473,7 +476,7 @@ export async function waitSession(page: Page, input: { directory: string; sessio
473476 if ( input . sessionID && ( ! state || state . sessionID !== input . sessionID ) ) return false
474477 if ( ! input . sessionID && state ?. sessionID ) return false
475478 if ( state ?. dir ) {
476- const dir = await resolveDirectory ( state . dir ) . catch ( ( ) => state . dir ?? "" )
479+ const dir = await resolveDirectory ( state . dir , input . serverUrl ) . catch ( ( ) => state . dir ?? "" )
477480 if ( dir !== target ) return false
478481 }
479482
@@ -489,9 +492,9 @@ export async function waitSession(page: Page, input: { directory: string; sessio
489492 return { directory : target , slug : base64Encode ( target ) }
490493}
491494
492- export async function waitSessionSaved ( directory : string , sessionID : string , timeout = 30_000 ) {
493- const sdk = createSdk ( directory )
494- const target = await resolveDirectory ( directory )
495+ export async function waitSessionSaved ( directory : string , sessionID : string , timeout = 30_000 , serverUrl ?: string ) {
496+ const sdk = createSdk ( directory , serverUrl )
497+ const target = await resolveDirectory ( directory , serverUrl )
495498
496499 await expect
497500 . poll (
@@ -501,7 +504,7 @@ export async function waitSessionSaved(directory: string, sessionID: string, tim
501504 . then ( ( x ) => x . data )
502505 . catch ( ( ) => undefined )
503506 if ( ! data ?. directory ) return ""
504- return resolveDirectory ( data . directory ) . catch ( ( ) => data . directory )
507+ return resolveDirectory ( data . directory , serverUrl ) . catch ( ( ) => data . directory )
505508 } ,
506509 { timeout } ,
507510 )
@@ -666,8 +669,9 @@ export async function cleanupSession(input: {
666669 sessionID : string
667670 directory ?: string
668671 sdk ?: ReturnType < typeof createSdk >
672+ serverUrl ?: string
669673} ) {
670- const sdk = input . sdk ?? ( input . directory ? createSdk ( input . directory ) : undefined )
674+ const sdk = input . sdk ?? ( input . directory ? createSdk ( input . directory , input . serverUrl ) : undefined )
671675 if ( ! sdk ) throw new Error ( "cleanupSession requires sdk or directory" )
672676 await waitSessionIdle ( sdk , input . sessionID , 5_000 ) . catch ( ( ) => undefined )
673677 const current = await status ( sdk , input . sessionID ) . catch ( ( ) => undefined )
@@ -1019,3 +1023,13 @@ export async function openWorkspaceMenu(page: Page, workspaceSlug: string) {
10191023 await expect ( menu ) . toBeVisible ( )
10201024 return menu
10211025}
1026+
1027+ export async function assistantText ( sdk : ReturnType < typeof createSdk > , sessionID : string ) {
1028+ const messages = await sdk . session . messages ( { sessionID, limit : 50 } ) . then ( ( r ) => r . data ?? [ ] )
1029+ return messages
1030+ . filter ( ( m ) => m . info . role === "assistant" )
1031+ . flatMap ( ( m ) => m . parts )
1032+ . filter ( ( p ) => p . type === "text" )
1033+ . map ( ( p ) => p . text )
1034+ . join ( "\n" )
1035+ }
0 commit comments