@@ -16,9 +16,12 @@ import {
1616import { OpenCodeProviderLive } from "./OpenCodeProvider.ts" ;
1717import type { OpenCodeInventory } from "../opencodeRuntime.ts" ;
1818
19+ const DEFAULT_VERSION_STDOUT = "opencode 1.14.19\n" ;
20+
1921const runtimeMock = {
2022 state : {
2123 runVersionError : null as Error | null ,
24+ versionStdout : DEFAULT_VERSION_STDOUT ,
2225 inventoryError : null as Error | null ,
2326 inventory : {
2427 providerList : { connected : [ ] as string [ ] , all : [ ] as unknown [ ] , default : { } } ,
@@ -27,6 +30,7 @@ const runtimeMock = {
2730 } ,
2831 reset ( ) {
2932 this . state . runVersionError = null ;
33+ this . state . versionStdout = DEFAULT_VERSION_STDOUT ;
3034 this . state . inventoryError = null ;
3135 this . state . inventory = {
3236 providerList : { connected : [ ] , all : [ ] as unknown [ ] , default : { } } ,
@@ -56,7 +60,7 @@ const OpenCodeRuntimeTestDouble: OpenCodeRuntimeShape = {
5660 cause : runtimeMock . state . runVersionError ,
5761 } ) ,
5862 )
59- : Effect . succeed ( { stdout : "opencode 1.0.0\n" , stderr : "" , code : 0 } ) ,
63+ : Effect . succeed ( { stdout : runtimeMock . state . versionStdout , stderr : "" , code : 0 } ) ,
6064 createOpenCodeSdkClient : ( ) =>
6165 ( { } ) as unknown as ReturnType < OpenCodeRuntimeShape [ "createOpenCodeSdkClient" ] > ,
6266 loadOpenCodeInventory : ( ) =>
@@ -108,6 +112,33 @@ it.layer(makeTestLayer())("OpenCodeProviderLive", (it) => {
108112 } ) ,
109113 ) ;
110114
115+ it . effect ( "refuses to probe when opencode is older than the required minimum" , ( ) =>
116+ Effect . gen ( function * ( ) {
117+ runtimeMock . state . versionStdout = "opencode 1.4.7\n" ;
118+ const provider = yield * OpenCodeProvider ;
119+ const snapshot = yield * provider . refresh ;
120+
121+ assert . equal ( snapshot . status , "error" ) ;
122+ assert . equal ( snapshot . installed , true ) ;
123+ assert . equal ( snapshot . version , "1.4.7" ) ;
124+ assert . ok ( snapshot . message ?. includes ( "1.14.19" ) ) ;
125+ assert . ok ( snapshot . message ?. toLowerCase ( ) . includes ( "upgrade" ) ) ;
126+ } ) ,
127+ ) ;
128+
129+ it . effect ( "refuses to probe when opencode --version output is unparseable" , ( ) =>
130+ Effect . gen ( function * ( ) {
131+ runtimeMock . state . versionStdout = "garbled binary output\n" ;
132+ const provider = yield * OpenCodeProvider ;
133+ const snapshot = yield * provider . refresh ;
134+
135+ assert . equal ( snapshot . status , "error" ) ;
136+ assert . equal ( snapshot . installed , true ) ;
137+ assert . equal ( snapshot . version , null ) ;
138+ assert . ok ( snapshot . message ?. includes ( "1.14.19" ) ) ;
139+ } ) ,
140+ ) ;
141+
111142 it . effect ( "emits OpenCode variant defaults so trait picker can resolve a visible selection" , ( ) =>
112143 Effect . gen ( function * ( ) {
113144 runtimeMock . state . inventory = {
0 commit comments