Skip to content

Commit 69ac0cb

Browse files
authored
Merge pull request #18 from ethpandaops/feat/issue-15
refactor(observability): migrate to shared agent-sdk-observability module
2 parents 6aa4ffd + be51a10 commit 69ac0cb

22 files changed

Lines changed: 3094 additions & 69 deletions

client_impl.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,23 @@ func newClientImpl() Client {
2121
return &clientWrapper{impl: client.New()}
2222
}
2323

24+
// applyAgentOptionsToConfig applies functional options and initializes the
25+
// OTel metrics recorder so the persistent client path records metrics/traces.
26+
func applyAgentOptionsToConfig(opts []Option) *CodexAgentOptions {
27+
options := applyAgentOptions(opts)
28+
initMetricsRecorder(options)
29+
30+
return options
31+
}
32+
2433
// Start establishes a connection to the Codex CLI.
2534
func (c *clientWrapper) Start(ctx context.Context, opts ...Option) error {
26-
return c.impl.Start(ctx, applyAgentOptions(opts))
35+
return c.impl.Start(ctx, applyAgentOptionsToConfig(opts))
2736
}
2837

2938
// StartWithContent establishes a connection and immediately sends an initial message.
3039
func (c *clientWrapper) StartWithContent(ctx context.Context, content UserMessageContent, opts ...Option) error {
31-
return c.impl.StartWithContent(ctx, content, applyAgentOptions(opts))
40+
return c.impl.StartWithContent(ctx, content, applyAgentOptionsToConfig(opts))
3241
}
3342

3443
// StartWithStream establishes a connection and streams initial messages.
@@ -45,7 +54,7 @@ func (c *clientWrapper) StartWithStream(
4554
}
4655
}
4756

48-
return c.impl.StartWithStream(ctx, convertedMessages, applyAgentOptions(opts))
57+
return c.impl.StartWithStream(ctx, convertedMessages, applyAgentOptionsToConfig(opts))
4958
}
5059

5160
// Query sends user content to the agent.

contrib/prometheus/prometheus.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Package prometheus provides a convenience helper for wiring Prometheus metrics
2+
// into the Codex Agent SDK without pulling OTel SDK dependencies into the
3+
// root module for every consumer.
4+
//
5+
// Usage:
6+
//
7+
// mp, err := prometheus.NewMeterProvider(reg)
8+
// if err != nil {
9+
// log.Fatal(err)
10+
// }
11+
// codexsdk.WithMeterProvider(mp)
12+
//
13+
// The returned MeterProvider is built via the shared
14+
// agent-sdk-observability/promexporter helper, which applies exponential
15+
// histograms and trace-based exemplars uniformly across all ethPandaOps agent
16+
// SDKs.
17+
package prometheus
18+
19+
import (
20+
prom "github.com/prometheus/client_golang/prometheus"
21+
"go.opentelemetry.io/otel/metric"
22+
23+
"github.com/ethpandaops/codex-agent-sdk-go/internal/observability"
24+
)
25+
26+
// NewMeterProvider creates an OTel MeterProvider backed by the given Prometheus
27+
// registerer. The returned provider can be passed to codexsdk.WithMeterProvider.
28+
func NewMeterProvider(reg prom.Registerer) (metric.MeterProvider, error) {
29+
return observability.NewPrometheusMeterProvider(reg)
30+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Package main demonstrates using WithPrometheusRegisterer for OpenTelemetry
2+
// observability with the Codex Agent SDK.
3+
//
4+
// WithPrometheusRegisterer is the simplest way to get Prometheus metrics from
5+
// the SDK. It automatically creates an OTel MeterProvider backed by the
6+
// provided Prometheus registerer via the OTel→Prometheus bridge.
7+
package main
8+
9+
import (
10+
"context"
11+
"fmt"
12+
"log/slog"
13+
"os"
14+
"time"
15+
16+
"github.com/prometheus/client_golang/prometheus"
17+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
18+
19+
codexsdk "github.com/ethpandaops/codex-agent-sdk-go"
20+
)
21+
22+
func main() {
23+
fmt.Println("=== Prometheus Metrics Example ===")
24+
25+
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
26+
27+
// Create a Prometheus registry. In production, use prometheus.DefaultRegisterer
28+
// or a custom registry exposed via an HTTP handler for scraping.
29+
reg := prometheus.NewRegistry()
30+
31+
// Create an OTel TracerProvider for distributed tracing.
32+
tp := sdktrace.NewTracerProvider()
33+
34+
defer func() {
35+
if err := tp.Shutdown(context.Background()); err != nil {
36+
logger.Error("failed to shutdown tracer provider", "error", err)
37+
}
38+
}()
39+
40+
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
41+
defer cancel()
42+
43+
// Pass the Prometheus registerer and tracer provider to the SDK.
44+
// When WithPrometheusRegisterer is set (and WithMeterProvider is not),
45+
// the SDK automatically creates an OTel MeterProvider from the registerer.
46+
//
47+
// The SDK records (via OpenTelemetry):
48+
// - gen_ai.client.operation.duration (histogram, GenAI semconv)
49+
// - gen_ai.client.token.usage (histogram, GenAI semconv)
50+
// - gen_ai.client.operation.time_to_first_chunk (histogram, TTFT)
51+
// - gen_ai.client.cost_usd_total (counter, USD cost)
52+
// - codex.tool_calls_total (counter, per tool name + outcome)
53+
// - codex.tool_call_duration (histogram, per tool)
54+
// - codex.hook_dispatch_duration (histogram, per hook event)
55+
// - One span per Query/QueryStream call (GenAI "chat" span)
56+
// - Child spans per tool invocation (GenAI "execute_tool" span)
57+
for msg, err := range codexsdk.Query(ctx, codexsdk.Text("What is 2 + 2?"),
58+
codexsdk.WithLogger(logger),
59+
codexsdk.WithPrometheusRegisterer(reg),
60+
codexsdk.WithTracerProvider(tp),
61+
codexsdk.WithPermissionMode("bypassPermissions"),
62+
) {
63+
if err != nil {
64+
fmt.Printf("Error: %v\n", err)
65+
66+
return
67+
}
68+
69+
switch m := msg.(type) {
70+
case *codexsdk.AssistantMessage:
71+
for _, block := range m.Content {
72+
if textBlock, ok := block.(*codexsdk.TextBlock); ok {
73+
fmt.Printf("Codex: %s\n", textBlock.Text)
74+
}
75+
}
76+
77+
case *codexsdk.ResultMessage:
78+
fmt.Println("Query complete")
79+
80+
if m.Usage != nil {
81+
fmt.Printf("Tokens: %d in / %d out\n",
82+
m.Usage.InputTokens, m.Usage.OutputTokens)
83+
}
84+
}
85+
}
86+
87+
// In production, expose reg via promhttp.HandlerFor(reg, ...) on an
88+
// HTTP endpoint for Prometheus to scrape.
89+
families, err := reg.Gather()
90+
if err != nil {
91+
logger.Error("failed to gather metrics", "error", err)
92+
93+
return
94+
}
95+
96+
fmt.Printf("\nCollected %d metric families from Prometheus registry\n", len(families))
97+
98+
for _, fam := range families {
99+
fmt.Printf(" %s\n", fam.GetName())
100+
}
101+
}

go.mod

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,47 @@ module github.com/ethpandaops/codex-agent-sdk-go
33
go 1.26.0
44

55
require (
6+
github.com/ethpandaops/agent-sdk-observability v0.0.1
67
github.com/glebarez/go-sqlite v1.22.0
78
github.com/google/jsonschema-go v0.4.2
89
github.com/google/uuid v1.6.0
910
github.com/modelcontextprotocol/go-sdk v1.4.1
11+
github.com/prometheus/client_golang v1.23.2
1012
github.com/stretchr/testify v1.11.1
13+
go.opentelemetry.io/otel v1.43.0
14+
go.opentelemetry.io/otel/metric v1.43.0
15+
go.opentelemetry.io/otel/sdk v1.43.0
16+
go.opentelemetry.io/otel/sdk/metric v1.43.0
17+
go.opentelemetry.io/otel/trace v1.43.0
1118
golang.org/x/sync v0.20.0
1219
)
1320

1421
require (
22+
github.com/beorn7/perks v1.0.1 // indirect
23+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1524
github.com/davecgh/go-spew v1.1.1 // indirect
1625
github.com/dustin/go-humanize v1.0.1 // indirect
26+
github.com/go-logr/logr v1.4.3 // indirect
27+
github.com/go-logr/stdr v1.2.2 // indirect
1728
github.com/mattn/go-isatty v0.0.20 // indirect
29+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
1830
github.com/ncruces/go-strftime v1.0.0 // indirect
1931
github.com/pmezard/go-difflib v1.0.0 // indirect
32+
github.com/prometheus/client_model v0.6.2 // indirect
33+
github.com/prometheus/common v0.67.5 // indirect
34+
github.com/prometheus/otlptranslator v1.0.0 // indirect
35+
github.com/prometheus/procfs v0.20.1 // indirect
2036
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
2137
github.com/segmentio/asm v1.2.1 // indirect
2238
github.com/segmentio/encoding v0.5.4 // indirect
2339
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
40+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
41+
go.opentelemetry.io/otel/exporters/prometheus v0.65.0 // indirect
42+
go.yaml.in/yaml/v2 v2.4.4 // indirect
2443
golang.org/x/oauth2 v0.36.0 // indirect
2544
golang.org/x/sys v0.42.0 // indirect
2645
golang.org/x/tools v0.43.0 // indirect
46+
google.golang.org/protobuf v1.36.11 // indirect
2747
gopkg.in/yaml.v3 v3.0.1 // indirect
2848
modernc.org/libc v1.70.0 // indirect
2949
modernc.org/mathutil v1.7.1 // indirect

go.sum

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
2+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
4+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
15
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
26
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
37
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
48
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
9+
github.com/ethpandaops/agent-sdk-observability v0.0.1 h1:A5cpbBcQp9kl2MGtq6yp2kWamLjcsb6Q2KC8f//i0NU=
10+
github.com/ethpandaops/agent-sdk-observability v0.0.1/go.mod h1:itLg/ECCupMjzp6003Gekv9nPzskqxfUZPBVvWrwC5s=
511
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
612
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
13+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
14+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
15+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
16+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
17+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
718
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
819
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
920
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -16,16 +27,36 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
1627
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1728
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
1829
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
30+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
31+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
32+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
33+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
34+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
35+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
1936
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
2037
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
2138
github.com/modelcontextprotocol/go-sdk v1.4.1 h1:M4x9GyIPj+HoIlHNGpK2hq5o3BFhC+78PkEaldQRphc=
2239
github.com/modelcontextprotocol/go-sdk v1.4.1/go.mod h1:Bo/mS87hPQqHSRkMv4dQq1XCu6zv4INdXnFZabkNU6s=
40+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
41+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
2342
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
2443
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
2544
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2645
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
46+
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
47+
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
48+
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
49+
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
50+
github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
51+
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
52+
github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos=
53+
github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM=
54+
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
55+
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
2756
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
2857
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
58+
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
59+
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
2960
github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
3061
github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
3162
github.com/segmentio/encoding v0.5.4 h1:OW1VRern8Nw6ITAtwSZ7Idrl3MXCFwXHPgqESYfvNt0=
@@ -34,6 +65,24 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
3465
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
3566
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
3667
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
68+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
69+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
70+
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
71+
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
72+
go.opentelemetry.io/otel/exporters/prometheus v0.65.0 h1:jOveH/b4lU9HT7y+Gfamf18BqlOuz2PWEvs8yM7Q6XE=
73+
go.opentelemetry.io/otel/exporters/prometheus v0.65.0/go.mod h1:i1P8pcumauPtUI4YNopea1dhzEMuEqWP1xoUZDylLHo=
74+
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
75+
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
76+
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
77+
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
78+
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
79+
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
80+
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
81+
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
82+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
83+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
84+
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
85+
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
3786
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
3887
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
3988
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
@@ -45,8 +94,11 @@ golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
4594
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
4695
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
4796
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
48-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
97+
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
98+
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
4999
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
100+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
101+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
50102
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
51103
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
52104
modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis=

0 commit comments

Comments
 (0)