@@ -51,11 +51,13 @@ struct Chat: ReducerProtocol {
5151 case observeIsReceivingMessageChange
5252 case observeSystemPromptChange
5353 case observeExtraSystemPromptChange
54+ case observeDefaultScopesChange
5455
5556 case historyChanged
5657 case isReceivingMessageChanged
5758 case systemPromptChanged
5859 case extraSystemPromptChanged
60+ case defaultScopesChanged
5961
6062 case chatMenu( ChatMenu . Action )
6163 }
@@ -68,6 +70,7 @@ struct Chat: ReducerProtocol {
6870 case observeIsReceivingMessageChange( UUID )
6971 case observeSystemPromptChange( UUID )
7072 case observeExtraSystemPromptChange( UUID )
73+ case observeDefaultScopesChange( UUID )
7174 }
7275
7376 var body : some ReducerProtocol < State , Action > {
@@ -131,6 +134,7 @@ struct Chat: ReducerProtocol {
131134 await send ( . observeIsReceivingMessageChange)
132135 await send ( . observeSystemPromptChange)
133136 await send ( . observeExtraSystemPromptChange)
137+ await send ( . observeDefaultScopesChange)
134138 }
135139
136140 case . observeHistoryChange:
@@ -198,6 +202,22 @@ struct Chat: ReducerProtocol {
198202 }
199203 } . cancellable ( id: CancelID . observeExtraSystemPromptChange ( id) , cancelInFlight: true )
200204
205+ case . observeDefaultScopesChange:
206+ return . run { send in
207+ let stream = AsyncStream< Void> { continuation in
208+ let cancellable = service. $defaultScopes
209+ . sink { _ in
210+ continuation. yield ( )
211+ }
212+ continuation. onTermination = { _ in
213+ cancellable. cancel ( )
214+ }
215+ }
216+ for await _ in stream {
217+ await send ( . defaultScopesChanged)
218+ }
219+ } . cancellable ( id: CancelID . observeDefaultScopesChange ( id) , cancelInFlight: true )
220+
201221 case . historyChanged:
202222 state. history = service. chatHistory. map { message in
203223 . init(
@@ -250,6 +270,10 @@ struct Chat: ReducerProtocol {
250270 state. chatMenu. extraSystemPrompt = service. extraSystemPrompt
251271 return . none
252272
273+ case . defaultScopesChanged:
274+ state. chatMenu. defaultScopes = service. defaultScopes
275+ return . none
276+
253277 case . binding:
254278 return . none
255279
@@ -266,6 +290,7 @@ struct ChatMenu: ReducerProtocol {
266290 var extraSystemPrompt : String = " "
267291 var temperatureOverride : Double ? = nil
268292 var chatModelIdOverride : String ? = nil
293+ var defaultScopes : Set < ChatService . Scope > = [ ]
269294 }
270295
271296 enum Action : Equatable {
@@ -274,6 +299,8 @@ struct ChatMenu: ReducerProtocol {
274299 case temperatureOverrideSelected( Double ? )
275300 case chatModelIdOverrideSelected( String ? )
276301 case customCommandButtonTapped( CustomCommand )
302+ case resetDefaultScopesButtonTapped
303+ case toggleScope( ChatService . Scope )
277304 }
278305
279306 let service : ChatService
@@ -304,6 +331,15 @@ struct ChatMenu: ReducerProtocol {
304331 return . run { _ in
305332 try await service. handleCustomCommand ( command)
306333 }
334+
335+ case . resetDefaultScopesButtonTapped:
336+ return . run { _ in
337+ service. resetDefaultScopes ( )
338+ }
339+ case let . toggleScope( scope) :
340+ return . run { _ in
341+ service. defaultScopes. formSymmetricDifference ( [ scope] )
342+ }
307343 }
308344 }
309345 }
0 commit comments