@@ -166,6 +166,7 @@ const runtimeMock = {
166166 inventoryError : null as Error | null ,
167167 connectionError : null as Error | null ,
168168 inventoryCwd : null as string | null ,
169+ startCalls : 0 ,
169170 closeCalls : 0 ,
170171 sdkClientInputs : [ ] as Array < {
171172 baseUrl : string ;
@@ -186,6 +187,7 @@ const runtimeMock = {
186187 this . state . inventoryError = null ;
187188 this . state . connectionError = null ;
188189 this . state . inventoryCwd = null ;
190+ this . state . startCalls = 0 ;
189191 this . state . closeCalls = 0 ;
190192 this . state . sdkClientInputs . length = 0 ;
191193 this . state . inventory = {
@@ -199,6 +201,7 @@ const runtimeMock = {
199201const OpenCodeRuntimeTestDouble : OpenCodeRuntime . OpenCodeRuntime [ "Service" ] = {
200202 startOpenCodeServerProcess : ( { serverPassword, environment } ) =>
201203 Effect . gen ( function * ( ) {
204+ runtimeMock . state . startCalls += 1 ;
202205 yield * Effect . addFinalizer ( ( ) =>
203206 Effect . sync ( ( ) => {
204207 runtimeMock . state . closeCalls += 1 ;
@@ -551,6 +554,40 @@ it.layer(layerTest)("checkOpenCodeProviderStatus", (it) => {
551554 } ) ,
552555 ) ;
553556
557+ it . effect ( "reports the upgraded CLI without restarting a borrowed OpenCode server" , ( ) =>
558+ Effect . scoped (
559+ Effect . gen ( function * ( ) {
560+ const settings = makeOpenCodeSettings ( ) ;
561+ const owner = yield * OpenCodeServerOwner . make ( {
562+ binaryPath : settings . binaryPath ,
563+ directory : process . cwd ( ) ,
564+ } ) ;
565+ yield * owner . withServer ( ( ) =>
566+ Effect . gen ( function * ( ) {
567+ runtimeMock . state . versionStdout = "opencode 1.14.20\n" ;
568+ const snapshot = yield * checkOpenCodeProviderStatus (
569+ settings ,
570+ process . cwd ( ) ,
571+ probeOpenCodeRuntime ( settings ) . pipe (
572+ Effect . provideService (
573+ HttpClient . HttpClient ,
574+ replayOpenCodeServer ( OPENCODE_1_RESPONSES , settings . serverPassword ) ,
575+ ) ,
576+ Effect . provideService ( OpenCodeRuntime . OpenCodeRuntime , OpenCodeRuntimeTestDouble ) ,
577+ ) ,
578+ Effect . succeed ( [ ] ) ,
579+ ) . pipe ( Effect . provideService ( OpenCodeServerOwner . OpenCodeServerOwner , owner ) ) ;
580+
581+ NodeAssert . equal ( snapshot . version , "1.14.19" ) ;
582+ NodeAssert . equal ( snapshot . installedVersion , "1.14.20" ) ;
583+ NodeAssert . equal ( runtimeMock . state . startCalls , 1 ) ;
584+ NodeAssert . equal ( runtimeMock . state . closeCalls , 0 ) ;
585+ } ) ,
586+ ) ;
587+ } ) ,
588+ ) ,
589+ ) ;
590+
554591 it . effect ( "lists a local OpenCode 2 binary's models in Full access only, never via 1.x" , ( ) =>
555592 Effect . gen ( function * ( ) {
556593 runtimeMock . state . versionStdout = "opencode v2.0.18\n" ;
@@ -572,6 +609,7 @@ it.layer(layerTest)("checkOpenCodeProviderStatus", (it) => {
572609
573610 NodeAssert . equal ( snapshot . status , "ready" ) ;
574611 NodeAssert . equal ( snapshot . version , "2.0.18" ) ;
612+ NodeAssert . equal ( "installedVersion" in snapshot , false ) ;
575613 NodeAssert . deepEqual ( snapshot . supportedRuntimeModes , [
576614 "approval-required" ,
577615 "auto-accept-edits" ,
@@ -652,11 +690,14 @@ it.layer(layerTest)("checkOpenCodeProviderStatus", (it) => {
652690
653691 it . effect ( "reports local model inventory failures without treating them as empty" , ( ) =>
654692 Effect . gen ( function * ( ) {
693+ runtimeMock . state . versionStdout = "opencode 1.14.20\n" ;
655694 runtimeMock . state . inventoryError = new Error ( "opencode models failed" ) ;
656695 const snapshot = yield * checkProvider ( makeOpenCodeSettings ( ) ) ;
657696
658697 NodeAssert . equal ( snapshot . status , "error" ) ;
659698 NodeAssert . equal ( snapshot . installed , true ) ;
699+ NodeAssert . equal ( snapshot . version , "1.14.19" ) ;
700+ NodeAssert . equal ( snapshot . installedVersion , "1.14.20" ) ;
660701 NodeAssert . equal ( snapshot . models . length , 0 ) ;
661702 NodeAssert . equal (
662703 snapshot . message ,
@@ -669,13 +710,15 @@ it.layer(layerTest)("checkOpenCodeProviderStatus", (it) => {
669710it . layer ( layerTest ) ( "checkOpenCodeProviderStatus with configured server URL" , ( it ) => {
670711 it . effect ( "does not send a local environment password to a configured server" , ( ) =>
671712 Effect . gen ( function * ( ) {
713+ runtimeMock . state . versionStdout = "opencode 1.14.20\n" ;
672714 const snapshot = yield * checkProvider (
673715 makeOpenCodeSettings ( { serverUrl : "http://127.0.0.1:9999" } ) ,
674716 process . cwd ( ) ,
675717 { OPENCODE_SERVER_PASSWORD : "local-secret" } ,
676718 ) ;
677719
678720 NodeAssert . equal ( snapshot . version , "1.14.19" ) ;
721+ NodeAssert . equal ( "installedVersion" in snapshot , false ) ;
679722 NodeAssert . deepEqual ( runtimeMock . state . sdkClientInputs , [
680723 {
681724 baseUrl : "http://127.0.0.1:9999" ,
@@ -700,6 +743,7 @@ it.layer(layerTest)("checkOpenCodeProviderStatus with configured server URL", (i
700743
701744 NodeAssert . equal ( snapshot . status , "warning" ) ;
702745 NodeAssert . equal ( snapshot . version , "2.0.18" ) ;
746+ NodeAssert . equal ( "installedVersion" in snapshot , false ) ;
703747 NodeAssert . deepEqual ( snapshot . supportedRuntimeModes , [
704748 "approval-required" ,
705749 "auto-accept-edits" ,
0 commit comments