@@ -8019,6 +8019,13 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
80198019 bootstrapGitOperations . push ( "fetch" ) ;
80208020 } ) ,
80218021 ) ;
8022+ const remoteBranchExists = vi . fn (
8023+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "remoteBranchExists" ] > [ 0 ] ) =>
8024+ Effect . sync ( ( ) => {
8025+ bootstrapGitOperations . push ( "remote-branch-exists" ) ;
8026+ return true ;
8027+ } ) ,
8028+ ) ;
80228029 const fetchedOriginCommit = "0123456789abcdef0123456789abcdef01234567" ;
80238030 const resolveRemoteTrackingCommit = vi . fn (
80248031 ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "resolveRemoteTrackingCommit" ] > [ 0 ] ) =>
@@ -8062,6 +8069,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
80628069 gitVcsDriver : {
80638070 remoteExists,
80648071 fetchRemote,
8072+ remoteBranchExists,
80658073 resolveRemoteTrackingCommit,
80668074 createWorktree,
80678075 } ,
@@ -8145,6 +8153,11 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
81458153 cwd : "/tmp/project" ,
81468154 remoteName : "origin" ,
81478155 } ) ;
8156+ assert . deepEqual ( remoteBranchExists . mock . calls [ 0 ] ?. [ 0 ] , {
8157+ cwd : "/tmp/project" ,
8158+ remoteName : "origin" ,
8159+ refName : "main" ,
8160+ } ) ;
81488161 assert . deepEqual ( resolveRemoteTrackingCommit . mock . calls [ 0 ] ?. [ 0 ] , {
81498162 cwd : "/tmp/project" ,
81508163 refName : "main" ,
@@ -8153,6 +8166,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
81538166 assert . deepEqual ( bootstrapGitOperations , [
81548167 "remote-exists" ,
81558168 "fetch" ,
8169+ "remote-branch-exists" ,
81568170 "resolve-remote-commit" ,
81578171 "create-worktree" ,
81588172 ] ) ;
@@ -8180,108 +8194,122 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
81808194 } ) . pipe ( Effect . provide ( NodeHttpServer . layerTest ) ) ,
81818195 ) ;
81828196
8183- it . effect (
8184- "falls back to the local base branch when startFromOrigin is set but no origin remote exists" ,
8185- ( ) =>
8186- Effect . gen ( function * ( ) {
8187- const dispatchedCommands : Array < OrchestrationCommand > = [ ] ;
8188- const remoteExists = vi . fn (
8189- ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "remoteExists" ] > [ 0 ] ) =>
8190- Effect . succeed ( false ) ,
8191- ) ;
8192- const fetchRemote = vi . fn (
8193- ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "fetchRemote" ] > [ 0 ] ) => Effect . void ,
8194- ) ;
8195- const resolveRemoteTrackingCommit = vi . fn (
8196- ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "resolveRemoteTrackingCommit" ] > [ 0 ] ) =>
8197- Effect . succeed ( {
8198- commitSha : "0123456789abcdef0123456789abcdef01234567" ,
8199- remoteRefName : "origin/main" ,
8200- } ) ,
8201- ) ;
8202- const createWorktree = vi . fn (
8203- ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "createWorktree" ] > [ 0 ] ) =>
8204- Effect . succeed ( {
8205- worktree : {
8206- refName : "t3code/bootstrap-refName" ,
8207- path : "/tmp/bootstrap-worktree" ,
8208- } ,
8209- } ) ,
8210- ) ;
8211-
8212- yield * buildAppUnderTest ( {
8213- layers : {
8214- gitVcsDriver : {
8215- remoteExists,
8216- fetchRemote,
8217- resolveRemoteTrackingCommit,
8218- createWorktree,
8219- } ,
8220- orchestrationEngine : {
8221- dispatch : ( command ) =>
8222- Effect . sync ( ( ) => {
8223- dispatchedCommands . push ( command ) ;
8224- return { sequence : dispatchedCommands . length } ;
8225- } ) ,
8226- readEvents : ( ) => Stream . empty ,
8197+ it . effect . each ( [
8198+ { caseName : "the origin remote is missing" , hasOrigin : false } ,
8199+ { caseName : "the base branch exists only locally" , hasOrigin : true } ,
8200+ ] ) ( "falls back to the local base branch when $caseName" , ( { hasOrigin } ) =>
8201+ Effect . gen ( function * ( ) {
8202+ const dispatchedCommands : Array < OrchestrationCommand > = [ ] ;
8203+ const remoteExists = vi . fn (
8204+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "remoteExists" ] > [ 0 ] ) =>
8205+ Effect . succeed ( hasOrigin ) ,
8206+ ) ;
8207+ const fetchRemote = vi . fn (
8208+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "fetchRemote" ] > [ 0 ] ) => Effect . void ,
8209+ ) ;
8210+ const resolveRemoteTrackingCommit = vi . fn (
8211+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "resolveRemoteTrackingCommit" ] > [ 0 ] ) =>
8212+ Effect . succeed ( {
8213+ commitSha : "0123456789abcdef0123456789abcdef01234567" ,
8214+ remoteRefName : "origin/main" ,
8215+ } ) ,
8216+ ) ;
8217+ const remoteBranchExists = vi . fn (
8218+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "remoteBranchExists" ] > [ 0 ] ) =>
8219+ Effect . succeed ( false ) ,
8220+ ) ;
8221+ const createWorktree = vi . fn (
8222+ ( _ : Parameters < GitVcsDriver . GitVcsDriver [ "Service" ] [ "createWorktree" ] > [ 0 ] ) =>
8223+ Effect . succeed ( {
8224+ worktree : {
8225+ refName : "t3code/bootstrap-refName" ,
8226+ path : "/tmp/bootstrap-worktree" ,
82278227 } ,
8228+ } ) ,
8229+ ) ;
8230+
8231+ yield * buildAppUnderTest ( {
8232+ layers : {
8233+ gitVcsDriver : {
8234+ remoteExists,
8235+ fetchRemote,
8236+ remoteBranchExists,
8237+ resolveRemoteTrackingCommit,
8238+ createWorktree,
82288239 } ,
8229- } ) ;
8240+ orchestrationEngine : {
8241+ dispatch : ( command ) =>
8242+ Effect . sync ( ( ) => {
8243+ dispatchedCommands . push ( command ) ;
8244+ return { sequence : dispatchedCommands . length } ;
8245+ } ) ,
8246+ readEvents : ( ) => Stream . empty ,
8247+ } ,
8248+ } ,
8249+ } ) ;
82308250
8231- const createdAt = "2026-01-01T00:00:00.000Z" ;
8232- const wsUrl = yield * getWsServerUrl ( "/ws" ) ;
8233- yield * Effect . scoped (
8234- withWsRpcClient ( wsUrl , ( client ) =>
8235- client [ ORCHESTRATION_WS_METHODS . dispatchCommand ] ( {
8236- type : "thread.turn.start" ,
8237- commandId : CommandId . make ( "cmd-bootstrap-turn-start-no-origin" ) ,
8238- threadId : ThreadId . make ( "thread-bootstrap-no-origin" ) ,
8239- message : {
8240- messageId : MessageId . make ( "msg-bootstrap-no-origin" ) ,
8241- role : "user" ,
8242- text : "hello" ,
8243- attachments : [ ] ,
8251+ const createdAt = "2026-01-01T00:00:00.000Z" ;
8252+ const wsUrl = yield * getWsServerUrl ( "/ws" ) ;
8253+ yield * Effect . scoped (
8254+ withWsRpcClient ( wsUrl , ( client ) =>
8255+ client [ ORCHESTRATION_WS_METHODS . dispatchCommand ] ( {
8256+ type : "thread.turn.start" ,
8257+ commandId : CommandId . make ( "cmd-bootstrap-turn-start-no-origin" ) ,
8258+ threadId : ThreadId . make ( "thread-bootstrap-no-origin" ) ,
8259+ message : {
8260+ messageId : MessageId . make ( "msg-bootstrap-no-origin" ) ,
8261+ role : "user" ,
8262+ text : "hello" ,
8263+ attachments : [ ] ,
8264+ } ,
8265+ modelSelection : defaultModelSelection ,
8266+ runtimeMode : "full-access" ,
8267+ interactionMode : "default" ,
8268+ bootstrap : {
8269+ createThread : {
8270+ projectId : defaultProjectId ,
8271+ title : "Bootstrap Thread" ,
8272+ modelSelection : defaultModelSelection ,
8273+ runtimeMode : "full-access" ,
8274+ interactionMode : "default" ,
8275+ branch : "main" ,
8276+ worktreePath : null ,
8277+ createdAt,
82448278 } ,
8245- modelSelection : defaultModelSelection ,
8246- runtimeMode : "full-access" ,
8247- interactionMode : "default" ,
8248- bootstrap : {
8249- createThread : {
8250- projectId : defaultProjectId ,
8251- title : "Bootstrap Thread" ,
8252- modelSelection : defaultModelSelection ,
8253- runtimeMode : "full-access" ,
8254- interactionMode : "default" ,
8255- branch : "main" ,
8256- worktreePath : null ,
8257- createdAt,
8258- } ,
8259- prepareWorktree : {
8260- projectCwd : "/tmp/project" ,
8261- baseBranch : "main" ,
8262- branch : "t3code/bootstrap-refName" ,
8263- startFromOrigin : true ,
8264- } ,
8279+ prepareWorktree : {
8280+ projectCwd : "/tmp/project" ,
8281+ baseBranch : "main" ,
8282+ branch : "t3code/bootstrap-refName" ,
8283+ startFromOrigin : true ,
82658284 } ,
8266- createdAt,
8267- } ) ,
8268- ) ,
8269- ) ;
8285+ } ,
8286+ createdAt,
8287+ } ) ,
8288+ ) ,
8289+ ) ;
82708290
8271- assert . deepEqual ( remoteExists . mock . calls [ 0 ] ?. [ 0 ] , {
8291+ assert . deepEqual ( remoteExists . mock . calls [ 0 ] ?. [ 0 ] , {
8292+ cwd : "/tmp/project" ,
8293+ remoteName : "origin" ,
8294+ } ) ;
8295+ assert . equal ( fetchRemote . mock . calls . length , hasOrigin ? 1 : 0 ) ;
8296+ assert . equal ( remoteBranchExists . mock . calls . length , hasOrigin ? 1 : 0 ) ;
8297+ if ( hasOrigin ) {
8298+ assert . deepEqual ( remoteBranchExists . mock . calls [ 0 ] ?. [ 0 ] , {
82728299 cwd : "/tmp/project" ,
82738300 remoteName : "origin" ,
8274- } ) ;
8275- assert . equal ( fetchRemote . mock . calls . length , 0 ) ;
8276- assert . equal ( resolveRemoteTrackingCommit . mock . calls . length , 0 ) ;
8277- assert . deepEqual ( createWorktree . mock . calls [ 0 ] ?. [ 0 ] , {
8278- cwd : "/tmp/project" ,
82798301 refName : "main" ,
8280- newRefName : "t3code/bootstrap-refName" ,
8281- baseRefName : "main" ,
8282- path : null ,
82838302 } ) ;
8284- } ) . pipe ( Effect . provide ( NodeHttpServer . layerTest ) ) ,
8303+ }
8304+ assert . equal ( resolveRemoteTrackingCommit . mock . calls . length , 0 ) ;
8305+ assert . deepEqual ( createWorktree . mock . calls [ 0 ] ?. [ 0 ] , {
8306+ cwd : "/tmp/project" ,
8307+ refName : "main" ,
8308+ newRefName : "t3code/bootstrap-refName" ,
8309+ baseRefName : "main" ,
8310+ path : null ,
8311+ } ) ;
8312+ } ) . pipe ( Effect . provide ( NodeHttpServer . layerTest ) ) ,
82858313 ) ;
82868314
82878315 it . effect ( "records setup-script failures without aborting bootstrap turn start" , ( ) =>
0 commit comments