@@ -52,6 +52,7 @@ type state = {
5252 acp : acpState ,
5353 relay : relayState ,
5454 session : sessionState ,
55+ initialAuthBehavior : Client__FtueState .authBehavior ,
5556 isSendingPrompt : bool ,
5657 // Relay instance exists before connection completes - needed for MCPServer
5758 relayInstance : option <Relay .t >,
@@ -112,7 +113,11 @@ type action =
112113type effect =
113114 | LogError (string )
114115 | LogInfo (string )
115- | ConnectACP ({config : ACP .config , signal : WebAPI .EventAPI .abortSignal })
116+ | ConnectACP ({
117+ config : ACP .config ,
118+ signal : WebAPI .EventAPI .abortSignal ,
119+ initialAuthBehavior : Client__FtueState .authBehavior ,
120+ })
116121 | ConnectRelay (Relay .t )
117122 | DisconnectRelay (Relay .t )
118123 | DisconnectACP (ACP .connection )
@@ -151,6 +156,7 @@ let initialState: state = {
151156 acp : ACPDisconnected ,
152157 relay : RelayDisconnected ,
153158 session : NoSession ,
159+ initialAuthBehavior : Client__FtueState .RedirectToLogin ,
154160 isSendingPrompt : false ,
155161 relayInstance : None ,
156162 mcpServer : None ,
@@ -248,13 +254,18 @@ let reduce = (state: state, action: action): (state, array<effect>) => {
248254 acp : ACPConnecting ,
249255 relay : RelayConnecting ,
250256 session : NoSession ,
257+ initialAuthBehavior : state .initialAuthBehavior ,
251258 isSendingPrompt : false ,
252259 relayInstance : Some (relay ),
253260 mcpServer : Some (mcpServer ),
254261 abortController : Some (abortController ),
255262 },
256263 [
257- ConnectACP ({config : acpConfig , signal : abortController .signal }),
264+ ConnectACP ({
265+ config : acpConfig ,
266+ signal : abortController .signal ,
267+ initialAuthBehavior : state .initialAuthBehavior ,
268+ }),
258269 ConnectRelay (relay ),
259270 LogInfo ("Initializing connections..." ),
260271 ],
@@ -441,7 +452,7 @@ let reduce = (state: state, action: action): (state, array<effect>) => {
441452 | ACPConnected (conn ) => [DisconnectACP (conn )]
442453 | _ => []
443454 }
444- (initialState , Array .flat ([abortEffects , relayEffects , acpEffects ]))
455+ ({ ... initialState , initialAuthBehavior : state . initialAuthBehavior } , Array .flat ([abortEffects , relayEffects , acpEffects ]))
445456
446457 // === Invalid transitions ===
447458 | (_ , Initialize (_ )) => (
@@ -516,7 +527,7 @@ let handleEffect = (effect: effect, state: state, dispatch: action => unit) => {
516527 | AbortConnections (controller ) =>
517528 Log .info ("Aborting in-flight connections" )
518529 WebAPI .AbortController .abort (controller )
519- | ConnectACP ({config , signal }) =>
530+ | ConnectACP ({config , signal , initialAuthBehavior }) =>
520531 let connect = async () => {
521532 let result = await ACP .connect (config , ~signal )
522533 switch result {
@@ -533,12 +544,10 @@ let handleEffect = (effect: effect, state: state, dispatch: action => unit) => {
533544 WebAPI .Global .window -> WebAPI .Window .location -> WebAPI .Location .href
534545 let returnTo = encodeURIComponent (currentUrl )
535546 let fullUrl = ` ${loginUrl}?return_to=${returnTo}`
536- // For first-time users, surface the auth URL so the UI can show a welcome modal.
537- // Returning users get redirected immediately.
538- switch Client__FtueState .get () {
539- | Client__FtueState .New =>
547+ switch initialAuthBehavior {
548+ | Client__FtueState .ShowWelcomeModal =>
540549 dispatch (ACPConnectError (` auth_required:${fullUrl}` ))
541- | Client__FtueState .WelcomeShown | Client__FtueState . Completed =>
550+ | Client__FtueState .RedirectToLogin =>
542551 WebAPI .Global .window -> WebAPI .Window .location -> WebAPI .Location .assign (fullUrl )
543552 }
544553 | ACP .ConnectionFailed (msg ) => dispatch (ACPConnectError (msg ))
0 commit comments