Skip to content

Commit 1b599c7

Browse files
authored
Merge pull request #36 from 0x4D31/codex/refactor-galah-logging-implementation
Refactor logging to charmbracelet/log
2 parents 61185db + b944abb commit 1b599c7

File tree

10 files changed

+149
-82
lines changed

10 files changed

+149
-82
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ See more examples [here](docs/EXAMPLES.md).
194194
195195
## Library Usage
196196
197-
The `galah` package can be used as a standalone library. Create a `galah.Service` and call `GenerateHTTPResponse` with an `http.Request` to produce a response. If `ConfigFile`, `EventLogFile`, or `CacheDBFile` are omitted, their default paths (`config/config.yaml`, `event_log.json`, and `cache.db`) are used. Specify `RulesConfigFile` to enable rule checking; leaving it empty disables the rule engine entirely.
197+
The `galah` package can be used as a standalone library. Create a `galah.Service` and call `GenerateHTTPResponse` with an `http.Request` to produce a response. If `ConfigFile`, `EventLogFile`, or `CacheDBFile` are omitted, their default paths (`config/config.yaml`, `event_log.json`, and `cache.db`) are used. Specify `RulesConfigFile` to enable rule checking; leaving it empty disables the rule engine entirely. Options.Logger can be supplied with a *log.Logger; if nil, Galah creates a default text logger.
198198
199199
```go
200200
svc, err := galah.NewService(context.Background(), galah.Options{
@@ -205,6 +205,7 @@ svc, err := galah.NewService(context.Background(), galah.Options{
205205
RulesConfigFile: "config/rules.yaml", // omit to disable rule engine
206206
EventLogFile: "event_log.json",
207207
CacheDBFile: "cache.db",
208+
Logger: log.NewWithOptions(os.Stderr, log.Options{}),
208209
})
209210
if err != nil {
210211
log.Fatal(err)
@@ -228,6 +229,7 @@ svc, err := galah.NewServiceFromConfig(context.Background(), cfg, rulesCfg.Rules
228229
LLMAPIKey: "YOUR_KEY",
229230
EventLogFile: "event_log.json", // use default if empty
230231
CacheDBFile: "cache.db", // use default if empty
232+
Logger: log.NewWithOptions(os.Stderr, log.Options{}),
231233
})
232234
```
233235

galah/service.go

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import (
1414
el "github.com/0x4d31/galah/internal/logger"
1515
"github.com/0x4d31/galah/pkg/enrich"
1616
"github.com/0x4d31/galah/pkg/llm"
17+
cblog "github.com/charmbracelet/log"
1718
"github.com/0x4d31/galah/pkg/suricata"
18-
"github.com/sirupsen/logrus"
1919
"github.com/tmc/langchaingo/llms"
2020
)
2121

@@ -52,6 +52,7 @@ type Options struct {
5252
CacheDBFile string
5353
CacheDuration int
5454
LogLevel string
55+
Logger *cblog.Logger
5556
}
5657

5758
// Service encapsulates the components required to generate HTTP responses.
@@ -62,18 +63,25 @@ type Service struct {
6263
Rules []config.Rule
6364
EventLogger *el.Logger
6465
LLMConfig llm.Config
65-
Logger *logrus.Logger
66+
Logger *cblog.Logger
6667
Model llms.Model
6768
}
6869

6970
// NewService loads configuration and initializes the components required for response generation.
7071
func NewService(ctx context.Context, opts Options) (*Service, error) {
71-
logger := logrus.New()
7272
if opts.LogLevel != "" {
73-
if lvl, err := logrus.ParseLevel(opts.LogLevel); err == nil {
74-
logger.SetLevel(lvl)
73+
level, err := cblog.ParseLevel(opts.LogLevel)
74+
if err == nil {
75+
cblog.SetLevel(level)
7576
}
7677
}
78+
cblog.SetPrefix("GALAH")
79+
cblog.SetTimeFormat("2006/01/02 15:04:05")
80+
81+
logger := opts.Logger
82+
if logger == nil {
83+
logger = cblog.Default()
84+
}
7785

7886
if opts.ConfigFile == "" {
7987
opts.ConfigFile = DefaultConfigFile
@@ -105,12 +113,19 @@ func NewService(ctx context.Context, opts Options) (*Service, error) {
105113
// NewServiceFromConfig initializes a Service using the provided configuration
106114
// and rule set. The ConfigFile and RulesConfigFile values from opts are ignored.
107115
func NewServiceFromConfig(ctx context.Context, cfg *config.Config, rules []config.Rule, opts Options) (*Service, error) {
108-
logger := logrus.New()
109116
if opts.LogLevel != "" {
110-
if lvl, err := logrus.ParseLevel(opts.LogLevel); err == nil {
111-
logger.SetLevel(lvl)
117+
level, err := cblog.ParseLevel(opts.LogLevel)
118+
if err == nil {
119+
cblog.SetLevel(level)
112120
}
113121
}
122+
cblog.SetPrefix("GALAH")
123+
cblog.SetTimeFormat("2006/01/02 15:04:05")
124+
125+
logger := opts.Logger
126+
if logger == nil {
127+
logger = cblog.Default()
128+
}
114129

115130
if opts.ConfigFile == "" {
116131
opts.ConfigFile = DefaultConfigFile
@@ -125,7 +140,7 @@ func NewServiceFromConfig(ctx context.Context, cfg *config.Config, rules []confi
125140
return createService(ctx, cfg, rules, opts, logger)
126141
}
127142

128-
func createService(ctx context.Context, cfg *config.Config, rules []config.Rule, opts Options, logger *logrus.Logger) (*Service, error) {
143+
func createService(ctx context.Context, cfg *config.Config, rules []config.Rule, opts Options, logger *cblog.Logger) (*Service, error) {
129144
modelCfg := llm.Config{
130145
Provider: opts.LLMProvider,
131146
Model: opts.LLMModel,
@@ -170,24 +185,24 @@ func createService(ctx context.Context, cfg *config.Config, rules []config.Rule,
170185
func (s *Service) GenerateHTTPResponse(r *http.Request, port string) ([]byte, error) {
171186
messages, err := llm.CreateMessageContent(r, s.Config, s.LLMConfig.Provider)
172187
if err != nil {
173-
s.Logger.Errorf("error creating llm message: %s", err)
188+
s.Logger.WithPrefix("GALAH").Errorf("error creating llm message: %s", err)
174189
return nil, err
175190
}
176191

177192
respStr, err := llm.GenerateLLMResponse(r.Context(), s.Model, s.LLMConfig.Temperature, messages)
178193
if err != nil {
179-
s.Logger.Errorf("error generating response: %s", err)
194+
s.Logger.WithPrefix("GALAH").Errorf("error generating response: %s", err)
180195
s.EventLogger.LogError(r, respStr, port, err)
181196
return nil, err
182197
}
183198
resp := []byte(respStr)
184199

185-
s.Logger.Infof("generated HTTP response: %s", strings.ReplaceAll(respStr, "\n", " "))
200+
s.Logger.WithPrefix("GALAH").Infof("generated HTTP response: %s", strings.ReplaceAll(respStr, "\n", " "))
186201

187202
if s.CacheDuration != 0 {
188203
key := cache.GetCacheKey(r, port)
189204
if err := cache.StoreResponse(s.Cache, key, resp); err != nil {
190-
s.Logger.Errorf("error storing response in cache: %s", err)
205+
s.Logger.WithPrefix("GALAH").Errorf("error storing response in cache: %s", err)
191206
}
192207
}
193208

go.mod

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,35 @@ toolchain go1.22.3
77
require (
88
github.com/alexflint/go-arg v1.4.3
99
github.com/bluele/gcache v0.0.2
10-
github.com/sirupsen/logrus v1.9.3
11-
github.com/stretchr/testify v1.9.0
10+
github.com/charmbracelet/log v0.4.2
11+
github.com/stretchr/testify v1.10.0
1212
github.com/tmc/langchaingo v0.1.10
1313
golang.org/x/sync v0.6.0
1414
gopkg.in/yaml.v3 v3.0.1
1515
)
1616

1717
require (
18+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
19+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
20+
github.com/charmbracelet/lipgloss v1.1.0 // indirect
21+
github.com/charmbracelet/x/ansi v0.8.0 // indirect
22+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
23+
github.com/charmbracelet/x/term v0.2.1 // indirect
1824
github.com/cohere-ai/tokenizer v1.1.2 // indirect
1925
github.com/davecgh/go-spew v1.1.1 // indirect
26+
github.com/go-logfmt/logfmt v0.6.0 // indirect
2027
github.com/go-playground/locales v0.14.1 // indirect
2128
github.com/go-playground/universal-translator v0.18.1 // indirect
2229
github.com/leodido/go-urn v1.4.0 // indirect
30+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
31+
github.com/mattn/go-isatty v0.0.20 // indirect
32+
github.com/mattn/go-runewidth v0.0.16 // indirect
33+
github.com/muesli/termenv v0.16.0 // indirect
2334
github.com/pkg/errors v0.9.1 // indirect
2435
github.com/pmezard/go-difflib v1.0.0 // indirect
36+
github.com/rivo/uniseg v0.4.7 // indirect
37+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
38+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
2539
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
2640
)
2741

@@ -58,7 +72,7 @@ require (
5872
golang.org/x/crypto v0.23.0 // indirect
5973
golang.org/x/net v0.25.0 // indirect
6074
golang.org/x/oauth2 v0.18.0 // indirect
61-
golang.org/x/sys v0.20.0 // indirect
75+
golang.org/x/sys v0.30.0 // indirect
6276
golang.org/x/text v0.15.0 // indirect
6377
golang.org/x/time v0.5.0 // indirect
6478
google.golang.org/api v0.172.0 // indirect

go.sum

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,23 @@ github.com/alexflint/go-arg v1.4.3 h1:9rwwEBpMXfKQKceuZfYcwuc/7YY7tWJbFsgG5cAU/u
2020
github.com/alexflint/go-arg v1.4.3/go.mod h1:3PZ/wp/8HuqRZMUUgu7I+e1qcpUbvmS258mRXkFH4IA=
2121
github.com/alexflint/go-scalar v1.1.0 h1:aaAouLLzI9TChcPXotr6gUhq+Scr8rl0P9P4PnltbhM=
2222
github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
23+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
24+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
2325
github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
2426
github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
2527
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
28+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
29+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
30+
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
31+
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
32+
github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig=
33+
github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw=
34+
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
35+
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
36+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
37+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
38+
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
39+
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
2640
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
2741
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
2842
github.com/cohere-ai/tokenizer v1.1.2 h1:t3KwUBSpKiBVFtpnHBfVIQNmjfZUuqFVYuSFkZYOWpU=
@@ -38,6 +52,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
3852
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
3953
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
4054
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
55+
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
56+
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
4157
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
4258
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
4359
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -89,17 +105,26 @@ github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/
89105
github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4=
90106
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
91107
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
108+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
109+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
110+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
111+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
112+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
113+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
92114
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
93115
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
116+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
117+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
94118
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
95119
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
96120
github.com/pkoukk/tiktoken-go v0.1.6 h1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=
97121
github.com/pkoukk/tiktoken-go v0.1.6/go.mod h1:9NiV+i9mJKGj1rYOT+njbv+ZwA/zJxYdewGl6qVatpg=
98122
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
99123
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
100124
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
101-
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
102-
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
125+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
126+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
127+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
103128
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
104129
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
105130
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -108,10 +133,12 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
108133
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
109134
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
110135
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
111-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
112-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
136+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
137+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
113138
github.com/tmc/langchaingo v0.1.10 h1:+cssnyaY1avZwzdDFvJYlVUsch9oFRgoqw3Avk5Zig4=
114139
github.com/tmc/langchaingo v0.1.10/go.mod h1:lPKUIu8ZGI7RAksRFtKbgtS2v3LL0j7LcccHPCvgNfY=
140+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
141+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
115142
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
116143
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
117144
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
@@ -131,6 +158,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
131158
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
132159
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
133160
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
161+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
162+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
134163
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
135164
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
136165
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -162,10 +191,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
162191
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
163192
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
164193
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
165-
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
166194
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
167-
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
168-
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
195+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
196+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
197+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
169198
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
170199
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
171200
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

0 commit comments

Comments
 (0)