Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
7bd74bc
Add initial pkg/ai scaffold and parity unit tests
cursoragent Mar 4, 2026
2f369c2
Add OpenAI/Anthropic cache retention payload builders
cursoragent Mar 4, 2026
9338c11
Add codex SSE mapper and gemini tool-call normalizer
cursoragent Mar 4, 2026
415c8a5
Add OAuth registry and PKCE scaffolding for pkg/ai
cursoragent Mar 4, 2026
1821b22
Add connector-to-pkg-ai context adapter scaffold
cursoragent Mar 4, 2026
d75ca51
Add simple options and tool validation helpers
cursoragent Mar 4, 2026
de4ad3d
Add env-gated ai e2e parity scaffolding tests
cursoragent Mar 4, 2026
5bef3d3
Auto-close assistant event stream on terminal events
cursoragent Mar 4, 2026
71b187f
Sort provider and model registry output deterministically
cursoragent Mar 4, 2026
d090380
Add ai model generator command groundwork
cursoragent Mar 4, 2026
2b5222b
Add Azure OpenAI responses payload/config helpers
cursoragent Mar 4, 2026
2749434
Add deterministic API registry ordering and lifecycle tests
cursoragent Mar 4, 2026
701fea6
Add anthropic payload conversion parity tests
cursoragent Mar 4, 2026
cd4caec
Add OpenAI responses parity tests for reasoning and tool IDs
cursoragent Mar 4, 2026
600bdbf
Register builtin api providers with terminal error streams
cursoragent Mar 4, 2026
b8e24b9
Add tool ID and Claude Code tool-name normalization parity tests
cursoragent Mar 4, 2026
87cd7bd
Add GitHub Copilot dynamic header helper parity
cursoragent Mar 4, 2026
75ad893
Add shared OpenAI responses conversion helpers
cursoragent Mar 4, 2026
f19abad
Add Google Vertex and Bedrock provider helper parity
cursoragent Mar 4, 2026
13fff3e
Add feature-gated pkg-ai runtime selector in connector
cursoragent Mar 4, 2026
d372f48
Add usage total-token normalization and e2e parity scaffolds
cursoragent Mar 4, 2026
a6e655d
Expand Bedrock message and tool config conversion parity
cursoragent Mar 4, 2026
f2218e1
Expand e2e parity scaffolds for remaining TS test suites
cursoragent Mar 4, 2026
49e9328
Prepare pkg-ai bridge context mapping from chat prompt
cursoragent Mar 4, 2026
b2ef0fa
Add pkg-ai event-to-stream adapter mappings
cursoragent Mar 4, 2026
a3fe682
Add OAuth helper parity for Anthropic and GitHub Copilot
cursoragent Mar 4, 2026
5d325f0
Add connector pkg-ai model descriptor mapping helpers
cursoragent Mar 4, 2026
b785d25
Add OAuth helper scaffolds for Gemini CLI Antigravity and Codex
cursoragent Mar 4, 2026
85aa1c9
Add pkg-ai bridge dry-run execution hook
cursoragent Mar 4, 2026
62ec9f2
Add optional pkg-ai provider stream bridge with fallback
cursoragent Mar 4, 2026
d1dafac
Add Gemini CLI Claude thinking header helpers
cursoragent Mar 4, 2026
a382bcc
Implement pkg-ai OpenAI responses streaming runtime
cursoragent Mar 4, 2026
72ec17c
Add pkg-ai OpenAI completions streaming runtime
cursoragent Mar 4, 2026
4dc66e9
Add pkg-ai Azure OpenAI responses streaming runtime
cursoragent Mar 4, 2026
455a400
Map reasoning options through pkg-ai bridge stream simple
cursoragent Mar 4, 2026
0d2445c
Assert builtins use real OpenAI runtime implementations
cursoragent Mar 4, 2026
9f31753
Add Codex responses payload helper parity functions
cursoragent Mar 4, 2026
bff4cda
Add pkg-ai OpenAI Codex responses streaming runtime
cursoragent Mar 4, 2026
5d99997
Add vertex and bedrock env auth key parity
cursoragent Mar 4, 2026
71f49b4
Add pkg-ai Anthropic messages streaming runtime
cursoragent Mar 4, 2026
cca7fcc
Add Gemini CLI empty-stream retry parity helpers
cursoragent Mar 4, 2026
a040e10
Add pkg-ai Google and Vertex streaming runtimes
cursoragent Mar 4, 2026
0a11d30
Add pkg-ai Bedrock converse runtime implementation
cursoragent Mar 4, 2026
10f965e
Expand pkg-ai bridge provider inference coverage
cursoragent Mar 4, 2026
3d89e55
Route OpenAI generate through pkg-ai bridge path
cursoragent Mar 4, 2026
4573e7c
Add connector test for pkg-ai generate bridge usage
cursoragent Mar 4, 2026
dfa464e
Add controlled pkg-ai stream bridge execution path
cursoragent Mar 4, 2026
a82843c
Document pkg-ai runtime bridge flags and rollout
cursoragent Mar 4, 2026
460560e
Implement pkg-ai Google Gemini CLI streaming runtime
cursoragent Mar 4, 2026
5aa5ce7
Widen pkg-ai stream bridge eligibility for tool-safe chats
cursoragent Mar 4, 2026
8692f34
Map antigravity endpoints to pkg-ai Gemini CLI API
cursoragent Mar 4, 2026
e6c7056
Add env-gated connector pkg-ai bridge e2e tests
cursoragent Mar 4, 2026
b24c25d
Add OpenAI abort handling and pkg-ai e2e stream tests
cursoragent Mar 4, 2026
d5301a4
Port OpenAI tool-call and token parity e2e tests
cursoragent Mar 4, 2026
81f5470
Remove obsolete builtin runtime stub helpers
cursoragent Mar 4, 2026
921e09f
Add OpenAI context overflow e2e parity test
cursoragent Mar 4, 2026
eb43ff0
Normalize provider abort handling across streaming runtimes
cursoragent Mar 4, 2026
3f42719
Add Anthropic and Google pkg-ai parity e2e tests
cursoragent Mar 4, 2026
a0d98d5
Add pkg-ai test parity tracker documentation
cursoragent Mar 4, 2026
b056b7d
Handle cancellation as aborted in Gemini CLI runtime
cursoragent Mar 4, 2026
8d394fc
Fix OpenAI responses handoff function-call ID pairing
cursoragent Mar 4, 2026
c575c96
Update parity tracker for reasoning replay coverage
cursoragent Mar 4, 2026
fa4d140
Add OpenAI reasoning replay parity e2e coverage
cursoragent Mar 4, 2026
456d70d
Add cross-provider handoff parity e2e subset tests
cursoragent Mar 4, 2026
ac8ae1e
Port OpenAI responses tool-result image conversion parity
cursoragent Mar 4, 2026
9d62038
Add OpenAI image tool-result parity e2e coverage
cursoragent Mar 4, 2026
c482c59
Add OpenAI tool-call ID normalization parity e2e
cursoragent Mar 4, 2026
dfe549b
Drop scaffolds covered by deterministic parity tests
cursoragent Mar 4, 2026
215751c
Add OpenAI xhigh parity e2e subset
cursoragent Mar 4, 2026
781ed39
Remove interleaved and bedrock e2e scaffolds
cursoragent Mar 4, 2026
b3341ae
Add OpenAI empty-message parity e2e subset
cursoragent Mar 4, 2026
a87393a
Remove Gemini empty-stream e2e scaffold
cursoragent Mar 4, 2026
2a787bc
Align Anthropic runtime with Copilot header semantics
cursoragent Mar 4, 2026
0293ee3
Remove remaining e2e scaffolds and document scope
cursoragent Mar 4, 2026
cb48fce
Make pkg/ai the primary connector runtime
cursoragent Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ Experimental Matrix ↔ AI bridge for Beeper, built on top of [mautrix/bridgev2]

- `docs/matrix-ai-matrix-spec-v1.md`: Full Matrix transport spec (events, streaming, approvals, state, and schema examples).
- `docs/bridge-orchestrator.md`: One-command bridge management in this repo.
- `docs/pkg-ai-runtime-migration.md`: Feature flags and rollout notes for connector ↔ `pkg/ai` runtime bridging.
- `docs/pkg-ai-test-parity.md`: Port-status tracker for `pi-mono/packages/ai` test parity.

## Bridge Orchestrator

Expand Down
98 changes: 98 additions & 0 deletions cmd/generate-ai-models/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package main

import (
"bytes"
"fmt"
"go/format"
"os"
"slices"
"strings"
)

type seedModel struct {
Provider string
ID string
Name string
API string
MaxTokens int
}

func main() {
models := []seedModel{
{
Provider: "openai",
ID: "gpt-5",
Name: "GPT-5",
API: "APIOpenAIResponses",
MaxTokens: 128000,
},
{
Provider: "openai",
ID: "gpt-5-mini",
Name: "GPT-5 mini",
API: "APIOpenAIResponses",
MaxTokens: 128000,
},
{
Provider: "anthropic",
ID: "claude-sonnet-4-5",
Name: "Claude Sonnet 4.5",
API: "APIAnthropicMessages",
MaxTokens: 64000,
},
{
Provider: "anthropic",
ID: "claude-opus-4-6",
Name: "Claude Opus 4.6",
API: "APIAnthropicMessages",
MaxTokens: 64000,
},
}

slices.SortFunc(models, func(a, b seedModel) int {
if cmp := strings.Compare(a.Provider, b.Provider); cmp != 0 {
return cmp
}
return strings.Compare(a.ID, b.ID)
})

var buf bytes.Buffer
buf.WriteString("// Code generated by cmd/generate-ai-models. DO NOT EDIT.\n\n")
buf.WriteString("package ai\n\n")
buf.WriteString("func registerGeneratedModels() {\n")

byProvider := map[string][]seedModel{}
for _, model := range models {
byProvider[model.Provider] = append(byProvider[model.Provider], model)
}
providers := make([]string, 0, len(byProvider))
for provider := range byProvider {
providers = append(providers, provider)
}
slices.Sort(providers)

for _, provider := range providers {
buf.WriteString(fmt.Sprintf("\tRegisterModels(%q, []Model{\n", provider))
for _, model := range byProvider[provider] {
buf.WriteString("\t\t{\n")
buf.WriteString(fmt.Sprintf("\t\t\tID: %q,\n", model.ID))
buf.WriteString(fmt.Sprintf("\t\t\tName: %q,\n", model.Name))
buf.WriteString(fmt.Sprintf("\t\t\tProvider: %q,\n", model.Provider))
buf.WriteString(fmt.Sprintf("\t\t\tAPI: %s,\n", model.API))
buf.WriteString(fmt.Sprintf("\t\t\tMaxTokens: %d,\n", model.MaxTokens))
buf.WriteString("\t\t},\n")
}
buf.WriteString("\t})\n")
}

buf.WriteString("}\n")

out, err := format.Source(buf.Bytes())
if err != nil {
panic(err)
}

if err := os.WriteFile("pkg/ai/models_generated.go", out, 0o644); err != nil {
panic(err)
}
}
78 changes: 78 additions & 0 deletions docs/pkg-ai-runtime-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# pkg/ai Runtime Migration Notes

This repository now includes a standalone `pkg/ai` Go port of `pi-mono/packages/ai`,
and the connector now runs on `pkg/ai` as the primary runtime.

## Runtime architecture (current)

- Connector streaming path:
- `selectResponseFn` now selects `pkg_ai` by default for all non-audio prompts.
- `streamWithPkgAIBridge` is the primary streaming implementation.
- Tool-call rounds are executed via connector tool infrastructure and continued
through `pkg/ai` context updates.
- Audio prompts continue using Chat Completions path until audio parity lands in
`pkg/ai`.

- Provider abstraction:
- `OpenAIProvider.GenerateStream(...)` and `Generate(...)` route through
`tryGenerateStreamWithPkgAI(...)` / `tryGenerateWithPkgAI(...)` as primary paths.

## High-signal test commands

```bash
go test ./pkg/ai/...
go test ./pkg/connector -run "TestPkgAIProviderRuntimeEnabled|TestInferProviderNameFromBaseURL|TestBuildPkgAIModelFromGenerateParams|TestShouldFallbackFromPkgAIEvent|TestShouldFallbackFromPkgAIError|TestTryGenerateStreamWithPkgAIReturnsRuntimeErrorEventsWhenProviderResolved|TestTryGenerateWithPkgAIReturnsRuntimeErrorForGeminiCLI|TestTryGenerateWithPkgAIReturnsRuntimeErrorWhenProviderResolved|TestGenerateResponseFromAIMessage|TestParseThinkingLevel|TestOpenAIProviderGenerate_UsesPkgAIBridgeWhenEnabled|TestPkgAIRuntimeEnabledFromEnv|TestChooseStreamingRuntimePath|TestBuildPkgAIBridgeGenerateParams|TestPkgAIProviderBridgeCredentials|TestAIEventToStreamEvent_Mapping|TestStreamEventsFromAIStream|TestToAIContext_MapsMessagesAndTools"
```

## Connector bridge env-gated provider validation

To validate real provider happy paths for connector bridge routing (OpenAI, Anthropic, Google), set credentials and:

```bash
PI_AI_E2E=1 go test ./pkg/connector -run "TestPkgAIProviderBridgeE2E_"
```

Optional model overrides:

- `PI_AI_E2E_OPENAI_MODEL`
- `PI_AI_E2E_ANTHROPIC_MODEL`
- `PI_AI_E2E_GOOGLE_MODEL`

## pkg/ai env-gated provider parity e2e tests

The `pkg/ai/e2e` suite now includes live provider parity checks for:

- OpenAI basic complete/stream flows (`stream.test.ts` parity subset),
- stream cancel behavior (`abort.test.ts` parity subset),
- orphan tool-call recovery (`tool-call-without-result.test.ts` parity subset),
- usage total-token accounting (`total-tokens.test.ts` parity subset).
- context-overflow detection (`context-overflow.test.ts` parity subset).
- OpenAI Responses reasoning replay/handoff (`openai-responses-reasoning-replay-e2e.test.ts` subset).
- tool-result image handling (`image-tool-result.test.ts` OpenAI subset).
- tool-call-id normalization (`tool-call-id-normalization.test.ts` OpenAI subset).
- xhigh reasoning request path (`xhigh.test.ts` OpenAI subset).
- empty-message handling (`empty.test.ts` OpenAI subset).
- cross-provider handoff smoke coverage (`cross-provider-handoff.test.ts` subset).
- Anthropic and Google complete/stream smoke coverage.

Run with:

```bash
PI_AI_E2E=1 OPENAI_API_KEY=... ANTHROPIC_API_KEY=... GEMINI_API_KEY=... \
go test ./pkg/ai/e2e -run "TestGenerateE2E_OpenAI|TestAbortE2E_OpenAIStream|TestToolCallWithoutResultE2E_OpenAI|TestTotalTokensE2E_OpenAI|TestContextOverflowE2E_OpenAI|TestOpenAIReasoningReplayE2E_|TestImageToolResultE2E_OpenAI|TestToolCallIDNormalizationE2E_OpenAI|TestXhighE2E_OpenAIResponses|TestEmptyE2E_OpenAI|TestCrossProviderHandoffE2E_|TestGenerateE2E_Anthropic|TestGenerateE2E_Google"
```

Optional overrides:

- `PI_AI_E2E_OPENAI_MODEL` (default: `gpt-4o-mini`)
- `PI_AI_E2E_OPENAI_BASE_URL` (for OpenAI-compatible endpoints)
- `PI_AI_E2E_OPENAI_CONTEXT_WINDOW` (default: `128000`, or `400000` for `gpt-5*` models)
- `PI_AI_E2E_OPENAI_REASONING_SOURCE_MODEL` / `PI_AI_E2E_OPENAI_REASONING_TARGET_MODEL`
- `PI_AI_E2E_ANTHROPIC_MODEL` / `PI_AI_E2E_ANTHROPIC_BASE_URL`
- `PI_AI_E2E_GOOGLE_MODEL` / `PI_AI_E2E_GOOGLE_BASE_URL`

## Notes

- `pkg/ai` is now the default bridge runtime for connector turn execution.
- Legacy streaming/provider implementations remain in-tree for now, but are no
longer selected on the primary non-audio path.
56 changes: 56 additions & 0 deletions docs/pkg-ai-test-parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# pkg/ai Test Parity Tracker

This document tracks parity between upstream `pi-mono/packages/ai/test/*.test.ts`
and the Go port in `pkg/ai`.

Legend:

- ✅ **Ported**: implemented as Go test(s) with runtime behavior coverage.
- 🧪 **Env-gated**: implemented as live provider test, skipped without credentials.
- 📝 **Scaffold**: placeholder test exists; behavior not fully ported yet.

## Current parity snapshot

### Core stream/runtime/e2e behavior

- `stream.test.ts` → ✅🧪 `pkg/ai/e2e/stream_test.go`, `pkg/ai/e2e/parity_provider_runtime_test.go`
- `abort.test.ts` → ✅🧪 `pkg/ai/e2e/abort_test.go`
- `context-overflow.test.ts` → ✅🧪 `pkg/ai/e2e/context_overflow_test.go`
- `tool-call-without-result.test.ts` → ✅🧪 `pkg/ai/e2e/parity_openai_test.go`
- `total-tokens.test.ts` → ✅🧪 `pkg/ai/e2e/parity_openai_test.go`
- `tokens.test.ts` → ✅🧪 `pkg/ai/e2e/abort_test.go` (OpenAI subset)
- `openai-responses-reasoning-replay-e2e.test.ts` → ✅🧪 `pkg/ai/e2e/openai_reasoning_replay_e2e_test.go` (+ deterministic conversion assertions in `pkg/ai/providers/openai_responses_shared_test.go`)
- `cross-provider-handoff.test.ts` → ✅🧪 `pkg/ai/e2e/cross_provider_handoff_e2e_test.go` (OpenAI↔Anthropic subset)
- `tool-call-id-normalization.test.ts` → ✅🧪 `pkg/ai/e2e/tool_call_id_normalization_e2e_test.go` (OpenAI subset) + deterministic ID normalization tests in providers
- `xhigh.test.ts` → ✅🧪 `pkg/ai/e2e/xhigh_e2e_test.go` (OpenAI subset) + deterministic support checks in `pkg/ai/models_test.go`
- `empty.test.ts` → ✅🧪 `pkg/ai/e2e/empty_e2e_test.go` (OpenAI subset)

### Provider/unit parity

- `openai-completions-tool-choice.test.ts` → ✅ `pkg/ai/providers/openai_completions_test.go`
- `openai-completions-tool-result-images.test.ts` → ✅ `pkg/ai/providers/openai_completions_test.go`
- `openai-codex-stream.test.ts` → ✅ `pkg/ai/providers/openai_codex_responses_test.go`
- `google-gemini-cli-retry-delay.test.ts` → ✅ `pkg/ai/providers/google_gemini_cli_test.go`
- `google-gemini-cli-empty-stream.test.ts` → ✅ `pkg/ai/providers/google_gemini_cli_test.go`
- `google-gemini-cli-claude-thinking-header.test.ts` → ✅ `pkg/ai/providers/google_gemini_cli_test.go`
- `github-copilot-anthropic.test.ts` → ✅ `pkg/ai/providers/anthropic_runtime_test.go`, `pkg/ai/providers/github_copilot_headers_test.go`
- `google-tool-call-missing-args.test.ts` → ✅ `pkg/ai/providers/google_tool_call_missing_args_test.go`
- `google-shared-gemini3-unsigned-tool-call.test.ts` → ✅ `pkg/ai/providers/google_shared_test.go`
- `google-thinking-signature.test.ts` → ✅ `pkg/ai/providers/google_shared_test.go`
- `transform-messages-copilot-openai-to-anthropic.test.ts` → ✅ `pkg/ai/providers/transform_messages_test.go`
- `anthropic-tool-name-normalization.test.ts` → ✅ `pkg/ai/providers/anthropic_test.go`
- `cache-retention.test.ts` → ✅ `pkg/ai/providers/cache_retention_test.go`
- `image-tool-result.test.ts` → ✅🧪 `pkg/ai/e2e/image_tool_result_e2e_test.go` (OpenAI subset) + deterministic conversion tests in `pkg/ai/providers/openai_completions_test.go`, `pkg/ai/providers/openai_responses_shared_test.go`
- `unicode-surrogate.test.ts` → ✅ `pkg/ai/utils/sanitize_unicode_test.go`
- `supports-xhigh.test.ts` / `xhigh.test.ts` → ✅ `pkg/ai/models_test.go`
- `interleaved-thinking.test.ts` (deterministic parts) → ✅ `pkg/ai/providers/anthropic_test.go`, `pkg/ai/providers/amazon_bedrock_test.go`
- `bedrock-models.test.ts` (deterministic parts) → ✅ `pkg/ai/providers/amazon_bedrock_test.go`

### OAuth parity

- `oauth.ts` (provider/token helper semantics) → ✅ `pkg/ai/oauth/*_test.go`

### Out of scope for this port

- `zen.test.ts` targets OpenCode Zen-specific provider/runtime behavior, which is
outside the `pi-mono/packages/ai/src` provider set and outside this port scope.
30 changes: 30 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,36 @@ require (
)

require (
cloud.google.com/go v0.116.0 // indirect
cloud.google.com/go/auth v0.9.3 // indirect
cloud.google.com/go/compute/metadata v0.5.0 // indirect
filippo.io/edwards25519 v1.2.0 // indirect
github.com/andybalholm/cascadia v1.3.3 // indirect
github.com/anthropics/anthropic-sdk-go v1.26.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.41.3 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect
github.com/aws/aws-sdk-go-v2/config v1.32.11 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 // indirect
github.com/aws/smithy-go v1.24.2 // indirect
github.com/coreos/go-systemd/v22 v22.6.0 // indirect
github.com/dlclark/regexp2 v1.10.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/jsonschema-go v0.3.0 // indirect
github.com/google/s2a-go v0.1.8 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/lib/pq v1.11.2 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
Expand All @@ -43,6 +68,7 @@ require (
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
github.com/yuin/goldmark v1.7.16 // indirect
go.mau.fi/zeroconfig v0.2.0 // indirect
go.opencensus.io v0.24.0 // indirect
golang.org/x/crypto v0.48.0 // indirect
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect
golang.org/x/mod v0.33.0 // indirect
Expand All @@ -51,6 +77,10 @@ require (
golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/text v0.34.0 // indirect
google.golang.org/genai v1.48.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/grpc v1.66.2 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
maunium.net/go/mauflag v1.0.0 // indirect
)
Loading
Loading