@@ -3,6 +3,7 @@ import ComposableArchitecture
33import Foundation
44import OpenAIService
55import Preferences
6+ import Terminal
67
78public struct DisplayedChatMessage : Equatable {
89 public enum Role : Equatable {
@@ -11,12 +12,12 @@ public struct DisplayedChatMessage: Equatable {
1112 case function
1213 case ignored
1314 }
14-
15+
1516 public struct Reference : Equatable {
1617 public var title : String
1718 public var subtitle : String
1819 public var uri : String
19-
20+
2021 public init ( title: String , subtitle: String , uri: String ) {
2122 self . title = title
2223 self . subtitle = subtitle
@@ -69,6 +70,7 @@ struct Chat: ReducerProtocol {
6970 case resendMessageButtonTapped( MessageID )
7071 case setAsExtraPromptButtonTapped( MessageID )
7172 case focusOnTextField
73+ case referenceClicked( DisplayedChatMessage . Reference )
7274
7375 case observeChatService
7476 case observeHistoryChange
@@ -96,6 +98,8 @@ struct Chat: ReducerProtocol {
9698 case observeExtraSystemPromptChange( UUID )
9799 case observeDefaultScopesChange( UUID )
98100 }
101+
102+ @Dependency ( \. openURL) var openURL
99103
100104 var body : some ReducerProtocol < State , Action > {
101105 BindingReducer ( )
@@ -153,7 +157,26 @@ struct Chat: ReducerProtocol {
153157 return . run { _ in
154158 await service. setMessageAsExtraPrompt ( id: id)
155159 }
156-
160+
161+ case let . referenceClicked( reference) :
162+ let fileURL = URL ( fileURLWithPath: reference. uri)
163+ return . run { _ in
164+ if FileManager . default. fileExists ( atPath: fileURL. path) {
165+ let terminal = Terminal ( )
166+ do {
167+ _ = try await terminal. runCommand (
168+ " /bin/bash " ,
169+ arguments: [ " -c " , " xed -l 0 \" \( reference. uri) \" " ] ,
170+ environment: [ : ]
171+ )
172+ } catch {
173+ print ( error)
174+ }
175+ } else if let url = URL ( string: reference. uri) {
176+ await openURL ( url)
177+ }
178+ }
179+
157180 case . focusOnTextField:
158181 state. focusedField = . textField
159182 return . none
0 commit comments