Skip to content

Commit 47ee41e

Browse files
authored
Merge pull request #11 from ethpandaops/feat/protocol-hardening-and-new-options
feat: add personality, service tier, developer instructions options and harden protocol handling
2 parents b05d619 + 182c462 commit 47ee41e

34 files changed

Lines changed: 2744 additions & 392 deletions

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,9 @@ user_input_callback
4242
hello.txt
4343
hello.go
4444
memories/
45+
cancellation_demo.txt
46+
developer_instructions
47+
extended_thinking
48+
graceful_shutdown_demo.txt
49+
personality
50+
service_tier

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,9 @@ Options are backend-dependent. Unsupported combinations fail fast with `ErrUnsup
249249
| `WithCwd("/path")` / `WithCliPath("/path/codex")` / `WithEnv(...)` | Process/runtime setup |
250250
| `WithPermissionMode("acceptEdits")` / `WithSandbox("workspace-write")` | Permission/sandbox behavior |
251251
| `WithSystemPrompt("...")` / `WithSystemPromptPreset(...)` | System instructions |
252+
| `WithDeveloperInstructions("...")` | Additional agent instructions (separate from system prompt) |
253+
| `WithPersonality("pragmatic")` | Agent response personality (`"none"`, `"friendly"`, `"pragmatic"`) |
254+
| `WithServiceTier("fast")` | API service tier (`"fast"`, `"flex"`) |
252255
| `WithImages(...)` / `WithConfig(...)` | Codex-native CLI image inputs/config |
253256
| `WithOutputSchema(json)` | Passes `--output-schema` |
254257
| `WithOutputFormat(map[string]any{...})` | Structured output wrapper/schema for app-server flow |
@@ -275,7 +278,7 @@ Options are backend-dependent. Unsupported combinations fail fast with `ErrUnsup
275278
|---|---|
276279
| `WithResume("session-id")` / `WithForkSession(true)` | Resume/fork sessions |
277280
| `WithContinueConversation(true)` | Continue prior conversation |
278-
| `WithEffort(codexsdk.EffortHigh)` | Extended thinking effort |
281+
| `WithEffort(codexsdk.EffortMinimal)` | Reasoning effort (`EffortNone`, `EffortMinimal`, `EffortLow`, `EffortMedium`, `EffortHigh`, `EffortMax`) |
279282
| `WithIncludePartialMessages(true)` | Emit streaming deltas as `StreamEvent` |
280283
| `WithAddDirs("/extra/path")` | Additional accessible directories |
281284
| `WithExtraArgs(map[string]*string{...})` | Raw CLI flags |

doc.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,27 @@
134134
// // ...
135135
// }
136136
//
137+
// # Personality, Service Tier, and Developer Instructions
138+
//
139+
// Control the agent's response style with WithPersonality:
140+
//
141+
// codexsdk.WithPersonality("pragmatic") // "none", "friendly", "pragmatic"
142+
//
143+
// Select the API service tier with WithServiceTier:
144+
//
145+
// codexsdk.WithServiceTier("fast") // "fast" or "flex"
146+
//
147+
// Provide additional agent instructions with WithDeveloperInstructions,
148+
// which maps to the Codex CLI's developerInstructions field and is
149+
// separate from WithSystemPrompt:
150+
//
151+
// codexsdk.WithDeveloperInstructions("Always respond in three bullet points.")
152+
//
153+
// Effort levels now include EffortNone and EffortMinimal in addition to
154+
// EffortLow, EffortMedium, EffortHigh, and EffortMax:
155+
//
156+
// codexsdk.WithEffort(codexsdk.EffortMinimal)
157+
//
137158
// # Plan Mode and User Input Callbacks
138159
//
139160
// When using plan mode, the agent can ask the user questions via

examples/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ This is ideal for:
4848
| `mcp_calculator` | MCP server integration |
4949
| `plugin_example` | Plugin system usage |
5050
| `system_prompt` | Customizing system prompts |
51+
| `developer_instructions` | Using `WithDeveloperInstructions()` for additional agent guidance |
52+
| `personality` | Agent personality control with `WithPersonality()` |
53+
| `service_tier` | API service tier selection with `WithServiceTier()` |
5154
| `tools_option` | Configuring allowed tools |
5255
| `sdk_tools` | SDK-defined tools with `WithSDKTools` and `NewTool` |
5356
| `tool_permission_callback` | Custom tool permission handling |

examples/cancellation/main.go

Lines changed: 28 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,22 @@ package main
33
import (
44
"context"
55
"fmt"
6-
"log/slog"
76
"os"
87
"sync"
98
"time"
109

1110
codexsdk "github.com/ethpandaops/codex-agent-sdk-go"
1211
)
1312

14-
// displayMessage standardizes message display function.
15-
func displayMessage(msg codexsdk.Message) {
16-
switch m := msg.(type) {
17-
case *codexsdk.AssistantMessage:
18-
for _, block := range m.Content {
19-
if textBlock, ok := block.(*codexsdk.TextBlock); ok {
20-
fmt.Printf("Codex: %s\n", textBlock.Text)
21-
}
22-
}
23-
24-
case *codexsdk.ResultMessage:
25-
fmt.Println("Result ended")
26-
}
27-
}
28-
2913
// exampleCancellation demonstrates cancelling a long-running callback.
3014
func exampleCancellation() {
3115
fmt.Println("=== Cancellation Example ===")
32-
fmt.Println("This example demonstrates cancellation with tool-permission callbacks.")
33-
fmt.Println("The example triggers cancellation automatically after the callback starts.")
16+
fmt.Println("This example demonstrates cancellation of a long-running permission callback.")
17+
fmt.Println("The callback is driven directly so the cancellation behavior is deterministic.")
3418
fmt.Println()
3519

36-
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
37-
38-
client := codexsdk.NewClient()
39-
40-
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
20+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
4121
defer cancel()
42-
defer func() {
43-
if err := client.Close(); err != nil {
44-
fmt.Fprintf(os.Stderr, "failed to close client: %v\n", err)
45-
}
46-
}()
4722

4823
callbackStarted := make(chan struct{})
4924

@@ -55,7 +30,7 @@ func exampleCancellation() {
5530
_ map[string]any,
5631
_ *codexsdk.ToolPermissionContext,
5732
) (codexsdk.PermissionResult, error) {
58-
if toolName != "Bash" {
33+
if toolName != "Bash" && toolName != "Write" && toolName != "Edit" {
5934
return &codexsdk.PermissionResultAllow{}, nil
6035
}
6136

@@ -80,39 +55,19 @@ func exampleCancellation() {
8055
return &codexsdk.PermissionResultAllow{}, nil
8156
}
8257

83-
if err := client.Start(ctx,
84-
codexsdk.WithLogger(logger),
85-
codexsdk.WithCanUseTool(longRunningCallback),
86-
codexsdk.WithPermissionMode("default"),
87-
); err != nil {
88-
fmt.Printf("Failed to connect: %v\n", err)
89-
90-
return
91-
}
92-
93-
fmt.Println("User: Create a file named cancellation_demo.txt with 'Hello World'")
58+
fmt.Println("[MAIN] Starting simulated permission callback...")
9459
fmt.Println()
9560

9661
queryDone := make(chan error, 1)
9762

9863
go func() {
99-
queryDone <- client.Query(ctx, codexsdk.Text("Create a file named cancellation_demo.txt with 'Hello World'"))
100-
}()
101-
102-
responseDone := make(chan struct{})
103-
104-
go func() {
105-
defer close(responseDone)
106-
107-
for msg, err := range client.ReceiveResponse(ctx) {
108-
if err != nil {
109-
fmt.Printf("[MAIN] ReceiveResponse ended: %v\n", err)
110-
111-
return
112-
}
113-
114-
displayMessage(msg)
115-
}
64+
_, err := longRunningCallback(
65+
ctx,
66+
"Bash",
67+
map[string]any{"command": "printf 'Hello World' > cancellation_demo.txt"},
68+
&codexsdk.ToolPermissionContext{},
69+
)
70+
queryDone <- err
11671
}()
11772

11873
select {
@@ -129,28 +84,24 @@ func exampleCancellation() {
12984
select {
13085
case err := <-queryDone:
13186
if err != nil {
132-
fmt.Printf("[MAIN] Query ended with error (expected after cancel): %v\n", err)
87+
fmt.Printf("[MAIN] Callback ended with error (expected after cancel): %v\n", err)
13388
}
13489
case <-time.After(15 * time.Second):
135-
fmt.Println("[MAIN] Query did not finish in time after cancellation")
90+
fmt.Println("[MAIN] Callback did not finish in time after cancellation")
13691
}
13792

138-
<-responseDone
13993
fmt.Println("[MAIN] Cancellation example completed")
14094
fmt.Println()
14195
}
14296

14397
// exampleGracefulShutdown demonstrates graceful shutdown with in-flight callbacks.
14498
func exampleGracefulShutdown() {
14599
fmt.Println("=== Graceful Shutdown Example ===")
146-
fmt.Println("This example demonstrates graceful shutdown of in-flight callbacks.")
100+
fmt.Println("This example demonstrates shutdown of an in-flight permission callback.")
101+
fmt.Println("The callback is driven directly so the shutdown behavior is deterministic.")
147102
fmt.Println()
148103

149-
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
150-
151-
client := codexsdk.NewClient()
152-
153-
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
104+
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
154105
defer cancel()
155106

156107
callbackStarted := make(chan struct{})
@@ -164,7 +115,7 @@ func exampleGracefulShutdown() {
164115
_ map[string]any,
165116
_ *codexsdk.ToolPermissionContext,
166117
) (codexsdk.PermissionResult, error) {
167-
if toolName != "Bash" {
118+
if toolName != "Bash" && toolName != "Write" && toolName != "Edit" {
168119
return &codexsdk.PermissionResultAllow{}, nil
169120
}
170121

@@ -178,27 +129,14 @@ func exampleGracefulShutdown() {
178129
return nil, ctx.Err()
179130
}
180131

181-
if err := client.Start(ctx,
182-
codexsdk.WithLogger(logger),
183-
codexsdk.WithCanUseTool(waitingCallback),
184-
codexsdk.WithPermissionMode("default"),
185-
); err != nil {
186-
fmt.Printf("Failed to connect: %v\n", err)
187-
188-
return
189-
}
190-
191-
receiveCtx, stopReceive := context.WithCancel(context.Background())
192-
defer stopReceive()
193-
194-
go func() {
195-
for range client.ReceiveMessages(receiveCtx) {
196-
}
197-
}()
198-
199132
go func() {
200-
prompt := "Use Bash to run exactly this command and create the file: printf 'test' > graceful_shutdown_demo.txt"
201-
if err := client.Query(ctx, codexsdk.Text(prompt)); err != nil {
133+
_, err := waitingCallback(
134+
ctx,
135+
"Bash",
136+
map[string]any{"command": "printf 'test' > graceful_shutdown_demo.txt"},
137+
&codexsdk.ToolPermissionContext{},
138+
)
139+
if err != nil {
202140
fmt.Printf("Query error (expected during shutdown): %v\n", err)
203141
}
204142
}()
@@ -214,13 +152,9 @@ func exampleGracefulShutdown() {
214152

215153
time.Sleep(500 * time.Millisecond)
216154

217-
fmt.Println("[MAIN] Calling client.Close() - this will cancel in-flight operations")
218-
219-
if err := client.Close(); err != nil {
220-
fmt.Printf("[MAIN] Close completed with: %v\n", err)
221-
} else {
222-
fmt.Println("[MAIN] Close completed successfully")
223-
}
155+
fmt.Println("[MAIN] Simulating client shutdown by cancelling the callback context")
156+
cancel()
157+
fmt.Println("[MAIN] Shutdown signal sent")
224158

225159
select {
226160
case <-callbackDone:
13.5 MB
Binary file not shown.

examples/custom_logger/go.mod

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module github.com/ethpandaops/codex-agent-sdk-go/examples/custom_logger
2+
3+
go 1.26.0
4+
5+
replace github.com/ethpandaops/codex-agent-sdk-go => ../..
6+
7+
require (
8+
github.com/ethpandaops/codex-agent-sdk-go v0.0.6
9+
github.com/sirupsen/logrus v1.9.4
10+
)
11+
12+
require (
13+
github.com/dustin/go-humanize v1.0.1 // indirect
14+
github.com/glebarez/go-sqlite v1.22.0 // indirect
15+
github.com/google/jsonschema-go v0.4.2 // indirect
16+
github.com/google/uuid v1.6.0 // indirect
17+
github.com/mattn/go-isatty v0.0.20 // indirect
18+
github.com/modelcontextprotocol/go-sdk v1.4.1 // indirect
19+
github.com/ncruces/go-strftime v1.0.0 // indirect
20+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
21+
github.com/segmentio/asm v1.2.1 // indirect
22+
github.com/segmentio/encoding v0.5.4 // indirect
23+
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
24+
golang.org/x/oauth2 v0.36.0 // indirect
25+
golang.org/x/sync v0.20.0 // indirect
26+
golang.org/x/sys v0.42.0 // indirect
27+
modernc.org/libc v1.70.0 // indirect
28+
modernc.org/mathutil v1.7.1 // indirect
29+
modernc.org/memory v1.11.0 // indirect
30+
modernc.org/sqlite v1.48.0 // indirect
31+
)

examples/custom_logger/go.sum

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
4+
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
5+
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
6+
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
7+
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
8+
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
9+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
10+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
11+
github.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8=
12+
github.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
13+
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
14+
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
15+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
16+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
17+
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
18+
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
19+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
20+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
21+
github.com/modelcontextprotocol/go-sdk v1.4.1 h1:M4x9GyIPj+HoIlHNGpK2hq5o3BFhC+78PkEaldQRphc=
22+
github.com/modelcontextprotocol/go-sdk v1.4.1/go.mod h1:Bo/mS87hPQqHSRkMv4dQq1XCu6zv4INdXnFZabkNU6s=
23+
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
24+
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
25+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
26+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
27+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
28+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
29+
github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
30+
github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
31+
github.com/segmentio/encoding v0.5.4 h1:OW1VRern8Nw6ITAtwSZ7Idrl3MXCFwXHPgqESYfvNt0=
32+
github.com/segmentio/encoding v0.5.4/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0=
33+
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
34+
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
35+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
36+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
37+
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
38+
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
39+
golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=
40+
golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
41+
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
42+
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
43+
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
44+
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
45+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
46+
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
47+
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
48+
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
49+
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
50+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
51+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
52+
modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis=
53+
modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
54+
modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw=
55+
modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0=
56+
modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM=
57+
modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU=
58+
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
59+
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
60+
modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo=
61+
modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
62+
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
63+
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
64+
modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw=
65+
modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo=
66+
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
67+
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
68+
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
69+
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
70+
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
71+
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
72+
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
73+
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
74+
modernc.org/sqlite v1.48.0 h1:ElZyLop3Q2mHYk5IFPPXADejZrlHu7APbpB0sF78bq4=
75+
modernc.org/sqlite v1.48.0/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig=
76+
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
77+
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
78+
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
79+
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

0 commit comments

Comments
 (0)