@@ -2,7 +2,11 @@ package cmd
2
2
3
3
import (
4
4
"fmt"
5
+ "github.com/intility/cwc/pkg/config"
6
+ "github.com/intility/cwc/pkg/filetree"
7
+ "github.com/intility/cwc/pkg/systemcontext"
5
8
"github.com/intility/cwc/pkg/templates"
9
+ "github.com/intility/cwc/pkg/ui"
6
10
"github.com/spf13/cobra"
7
11
"os"
8
12
"path/filepath"
@@ -11,7 +15,8 @@ import (
11
15
)
12
16
13
17
const (
14
- longDescription = `The 'cwc' command initiates a new chat session,
18
+ warnFileSizeThreshold = 100000
19
+ longDescription = `The 'cwc' command initiates a new chat session,
15
20
providing granular control over the inclusion and exclusion of files via regular expression patterns.
16
21
It allows for specification of paths to include or exclude files from the chat context.
17
22
@@ -60,13 +65,24 @@ func CreateRootCommand() *cobra.Command {
60
65
Long : longDescription ,
61
66
Args : cobra .MaximumNArgs (1 ),
62
67
RunE : func (cobraCmd * cobra.Command , args []string ) error {
63
- deps := createDefaultDeps (args , chatOpts .TemplateName , chatOpts .TemplateVariables )
68
+ cfgProvider := config .NewDefaultProvider ()
69
+ clientProvider := internal .NewOpenAIClientProvider (cfgProvider )
70
+ templateLocator := getTemplateLocator (cfgProvider )
71
+ promptResolver := internal .NewArgsOrTemplatePromptResolver (templateLocator , args , chatOpts .TemplateName )
64
72
65
73
if isPiped (os .Stdin ) {
74
+ contextRetriever := systemcontext .NewIOReaderContextRetriever (os .Stdin )
75
+ smGenerator := internal .NewTemplatedSystemMessageGenerator (
76
+ templateLocator ,
77
+ chatOpts .TemplateName ,
78
+ chatOpts .TemplateVariables ,
79
+ contextRetriever ,
80
+ )
81
+
66
82
nic := internal .NewNonInteractiveCmd (
67
- deps . clientProvider ,
68
- deps . promptResolver ,
69
- deps . systemMessageGenerator ,
83
+ clientProvider ,
84
+ promptResolver ,
85
+ smGenerator ,
70
86
)
71
87
72
88
err := nic .Run ()
@@ -77,10 +93,24 @@ func CreateRootCommand() *cobra.Command {
77
93
return nil
78
94
}
79
95
96
+ contextRetriever := systemcontext .NewFileContextRetriever (
97
+ cfgProvider ,
98
+ chatOpts .IncludePattern ,
99
+ chatOpts .ExcludePattern ,
100
+ chatOpts .Paths ,
101
+ printContext )
102
+
103
+ smGenerator := internal .NewTemplatedSystemMessageGenerator (
104
+ templateLocator ,
105
+ chatOpts .TemplateName ,
106
+ chatOpts .TemplateVariables ,
107
+ contextRetriever ,
108
+ )
109
+
80
110
interactiveCmd := internal .NewInteractiveCmd (
81
- deps . promptResolver ,
82
- deps . clientProvider ,
83
- deps . systemMessageGenerator ,
111
+ promptResolver ,
112
+ clientProvider ,
113
+ smGenerator ,
84
114
chatOpts ,
85
115
)
86
116
@@ -103,35 +133,52 @@ func CreateRootCommand() *cobra.Command {
103
133
return rootCmd
104
134
}
105
135
136
+ func printContext (fileTree string , files []filetree.File ) {
137
+ ui .PrintMessage (fileTree , ui .MessageTypeInfo )
138
+ for _ , file := range files {
139
+ printLargeFileWarning (file )
140
+ }
141
+ }
142
+
143
+ func printLargeFileWarning (file filetree.File ) {
144
+ if len (file .Data ) > warnFileSizeThreshold {
145
+ largeFileMsg := fmt .Sprintf (
146
+ "warning: %s is very large (%d bytes) and will degrade performance.\n " ,
147
+ file .Path , len (file .Data ))
148
+
149
+ ui .PrintMessage (largeFileMsg , ui .MessageTypeWarning )
150
+ }
151
+ }
152
+
106
153
type defaultDeps struct {
107
- configProvider internal .ConfigProvider
154
+ configProvider config .ConfigProvider
108
155
clientProvider internal.ClientProvider
109
156
templateLocator templates.TemplateLocator
110
157
promptResolver internal.PromptResolver
111
158
systemMessageGenerator internal.SystemMessageGenerator
112
159
}
113
160
114
- func createDefaultDeps (args []string , templateName string , templateVars map [string ]string ) * defaultDeps {
115
- cfgProvider := internal .NewDefaultProvider ()
116
- clientProvider := internal .NewOpenAIClientProvider (cfgProvider )
117
- templateLocator := getTemplateLocator (cfgProvider )
118
- promptResolver := internal .NewArgsOrTemplatePromptResolver (templateLocator , args , templateName )
119
- systemMessageGenerator := internal .NewTemplatedSystemMessageGenerator (
120
- templateLocator ,
121
- templateName ,
122
- templateVars ,
123
- )
124
-
125
- return & defaultDeps {
126
- configProvider : cfgProvider ,
127
- clientProvider : clientProvider ,
128
- templateLocator : templateLocator ,
129
- promptResolver : promptResolver ,
130
- systemMessageGenerator : systemMessageGenerator ,
131
- }
132
- }
133
-
134
- func getTemplateLocator (cfgProvider internal .ConfigProvider ) templates.TemplateLocator {
161
+ // func createDefaultDeps(args []string, templateName string, templateVars map[string]string) *defaultDeps {
162
+ // cfgProvider := internal.NewDefaultProvider()
163
+ // clientProvider := internal.NewOpenAIClientProvider(cfgProvider)
164
+ // templateLocator := getTemplateLocator(cfgProvider)
165
+ // promptResolver := internal.NewArgsOrTemplatePromptResolver(templateLocator, args, templateName)
166
+ // systemMessageGenerator := internal.NewTemplatedSystemMessageGenerator(
167
+ // templateLocator,
168
+ // templateName,
169
+ // templateVars,
170
+ // )
171
+ //
172
+ // return &defaultDeps{
173
+ // configProvider: cfgProvider,
174
+ // clientProvider: clientProvider,
175
+ // templateLocator: templateLocator,
176
+ // promptResolver: promptResolver,
177
+ // systemMessageGenerator: systemMessageGenerator,
178
+ // }
179
+ // }
180
+
181
+ func getTemplateLocator (cfgProvider config .ConfigProvider ) templates.TemplateLocator {
135
182
var locators []templates.TemplateLocator
136
183
137
184
configDir , err := cfgProvider .GetConfigDir ()
0 commit comments