diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 8e47745..eb91a66 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,17 +1,16 @@ # CodeRabbit Configuration File # Reference: https://docs.coderabbit.ai/spec/configuration +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json language: "en-US" -tone_instruction: "Review code as a senior Go software engineer with a focus on concurrency safety, modular monolithic design boundaries, and clear error propagation." reviews: profile: "assertive" + tone_instructions: "Review code as a senior Go software engineer with a focus on concurrency safety, modular monolithic design boundaries, and clear error propagation." auto_review: enabled: true drafts: false high_level_summary: true - reviews_per_file: true - collapse_dependency_reviews: true chat: auto_reply: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 35295d1..05d2740 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,23 +9,64 @@ on: jobs: build: runs-on: ubuntu-latest - permissions: - contents: write - env: - GOPRIVATE: github.com/GoHyperrr/* steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - name: Checkout hyperrr + uses: actions/checkout@v4 with: - go-version: '1.25' - - run: go mod download - - run: go run ./cmd/builder - - run: go vet ./... - - run: go test -v -coverprofile=coverage.out ./... - - name: Go Coverage Report - uses: ncruces/go-coverage-report@v0 + path: hyperrr + + - name: Checkout mdk + uses: actions/checkout@v4 + with: + repository: GoHyperrr/mdk + ref: ${{ github.head_ref || github.ref_name }} + path: mdk + + - name: Checkout auth + uses: actions/checkout@v4 + with: + repository: GoHyperrr/auth + ref: ${{ github.head_ref || github.ref_name }} + path: auth + + - name: Checkout commerce + uses: actions/checkout@v4 + with: + repository: GoHyperrr/commerce + ref: ${{ github.head_ref || github.ref_name }} + path: commerce + + - name: Checkout file-storage + uses: actions/checkout@v4 with: - report: 'true' - chart: 'true' - amend: 'true' - continue-on-error: true + repository: GoHyperrr/file-storage + ref: ${{ github.head_ref || github.ref_name }} + path: file-storage + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '1.25' + + - name: Setup Workspace + run: | + echo "go 1.25.5" > go.work + echo "use (" >> go.work + echo " ./auth" >> go.work + echo " ./commerce" >> go.work + echo " ./file-storage" >> go.work + echo " ./hyperrr" >> go.work + echo " ./mdk" >> go.work + echo ")" >> go.work + + - name: Generate Code + run: cd hyperrr && go run build_ci.go + + - name: Go Vet + run: cd hyperrr && go vet ./... + + - name: Go Test + run: cd hyperrr && go test -v ./... + + - name: Go Build + run: cd hyperrr && go build ./cmd/hyperrr diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ec714c7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.1.0] - 2026-06-05 + +### Added +- Multi-repo local workspace testing CI workflows. +- Lightweight built-in local disk and memory storage provider. +- Static plugin Cobra CLI registrations and string-based step resolutions. diff --git a/README.md b/README.md index 5d713ad..435ee6d 100644 --- a/README.md +++ b/README.md @@ -54,14 +54,16 @@ Hyperrr is a modern, event-native commerce engine designed as a modular monolith ## 🚥 Getting Started -### 1. Compile the Unified Executable -Compile the consolidated binary using Go: +### 1. Run Schema Aggregation & Compile the Executable +Discover GraphQL schemas, run `gqlgen` code generation, and compile the unified `hyperrr` server executable: ```bash -# Using standard Go -go build -o bin/hyperrr ./cmd/hyperrr +go run ./cmd/builder +``` +This writes the compiled binary to `bin/hyperrr` (or `bin/hyperrr.exe` on Windows). -# Or using Makefile -make build +After compiling, you can also use the CLI's built-in build command to rebuild dynamically: +```bash +./bin/hyperrr build ``` ### 2. Start the Backend Commerce Server @@ -121,10 +123,10 @@ You can register users via GraphQL or directly from your terminal using the dyna ```bash # Register a user via the CLI -go run ./cmd/hyperrr auth user register dev@example.com mypassword "Developer User" +./bin/hyperrr auth user register dev@example.com mypassword "Developer User" # Generate an API Key for MCP AI Agents -go run ./cmd/hyperrr auth apikey generate +./bin/hyperrr auth apikey generate ``` To register via the GraphQL Playground (which emits `identity.user_created` to automatically create a customer profile): diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..662d04c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Supported Versions + +For pre-1.0 releases we support the latest release or the latest patch series (e.g., 0.1.x), and for 1.0+ we support the latest major release branch. + +## Reporting a Vulnerability + +If you discover a security vulnerability within Hyperrr or any of its modules, please do not disclose it publicly. Report it directly by emailing security@hyperrr.org or opening a draft security advisory on GitHub. + +We will acknowledge receipt of your report within 48 hours and work with you to patch the issue promptly. diff --git a/api/gqlgen.yml b/api/gqlgen.yml index 6de90cf..ceb5cbd 100644 --- a/api/gqlgen.yml +++ b/api/gqlgen.yml @@ -11,6 +11,8 @@ model: autobind: - github.com/GoHyperrr/commerce/product + - github.com/GoHyperrr/commerce/seo + - github.com/GoHyperrr/commerce/taxonomy - github.com/GoHyperrr/commerce/cart - github.com/GoHyperrr/commerce/order - github.com/GoHyperrr/commerce/customer diff --git a/api/graph/api_test.go b/api/graph/api_test.go index 12a005c..10c06e5 100644 --- a/api/graph/api_test.go +++ b/api/graph/api_test.go @@ -153,7 +153,14 @@ func TestResolvers(t *testing.T) { t.Run("Product Resolvers", func(t *testing.T) { // Create a product - p := &product.Product{ID: "p1", Name: "Product 1", Price: 10.0} + p := &product.Product{ + ID: "p1", + Name: "Product 1", + Handle: "product-1", + Variants: []product.ProductVariant{ + {ID: "v1", Title: "Default", Price: 10.0}, + }, + } prodMod.Repo().Save(ctx, p) res, err := resolver.Query().GetProduct(ctx, "p1") @@ -176,9 +183,12 @@ func TestResolvers(t *testing.T) { t.Run("Product Mutations", func(t *testing.T) { // Create createInput := product.CreateProductInput{ - ID: "p_new", - Name: "New Product", - Price: 50.0, + ID: "p_new", + Name: "New Product", + Handle: "new-product", + Variants: []product.CreateProductVariantInput{ + {Title: "Default", Price: 50.0}, + }, } res, err := resolver.Mutation().CreateProduct(ctx, createInput) if err != nil || res.Name != "New Product" { @@ -199,8 +209,8 @@ func TestResolvers(t *testing.T) { t.Fatalf("DeleteProduct failed: %v", err) } - // Create failure (missing name) - _, err = resolver.Mutation().CreateProduct(ctx, product.CreateProductInput{ID: "fail", Price: 10.0}) + // Create failure (missing required fields: name and handle) + _, err = resolver.Mutation().CreateProduct(ctx, product.CreateProductInput{ID: "fail", Handle: ""}) if err == nil { t.Error("expected error for invalid product create") } @@ -742,7 +752,14 @@ func TestResolvers(t *testing.T) { }) badResolver3 := *resolver badResolver3.ProductModule = badProductMod3 - _, err = badResolver3.Mutation().CreateProduct(ctx, product.CreateProductInput{ID: "p_fail", Name: "Fail", Price: 10}) + _, err = badResolver3.Mutation().CreateProduct(ctx, product.CreateProductInput{ + ID: "p_fail", + Name: "Fail", + Handle: "fail", + Variants: []product.CreateProductVariantInput{ + {Title: "Default", Price: 10.0}, + }, + }) if err == nil || !strings.Contains(err.Error(), "failed to retrieve created product") { t.Errorf("expected 'failed to retrieve created product' error, got %v", err) } diff --git a/api/mcp/handlers_test.go b/api/mcp/handlers_test.go index e7955c8..3b96573 100644 --- a/api/mcp/handlers_test.go +++ b/api/mcp/handlers_test.go @@ -42,7 +42,7 @@ func (m *mockWorkflowRegistry) List() []*workflow.Workflow { type mockWorkflowRunner struct { lastExecuted string lastInput any - lastActor *ident.Actor + lastActor ident.Actor } func (m *mockWorkflowRunner) ExecuteSyncWorkflow(ctx context.Context, id string, wf *workflow.Workflow, input any) (map[string]any, error) { @@ -88,7 +88,7 @@ func TestMCP_DiscoveryAndExecution(t *testing.T) { }) t.Run("Tools Call Execution", func(t *testing.T) { - actor := &ident.Actor{ID: "agent_1", Type: ident.ActorAIAgent} + actor := &ident.BaseActor{ID: "agent_1", Type: ident.ActorAIAgent} params := map[string]any{ "name": "public-tool", "arguments": map[string]any{"id": "123"}, @@ -108,7 +108,7 @@ func TestMCP_DiscoveryAndExecution(t *testing.T) { t.Error("runner was not invoked with the correct tool") } - if runner.lastActor == nil || runner.lastActor.ID != "agent_1" { + if runner.lastActor == nil || runner.lastActor.GetID() != "agent_1" { t.Errorf("expected actor ID agent_1, got %v", runner.lastActor) } @@ -119,7 +119,7 @@ func TestMCP_DiscoveryAndExecution(t *testing.T) { }) t.Run("Tools Call Unauthorized Tool", func(t *testing.T) { - actor := &ident.Actor{ID: "agent_1", Type: ident.ActorAIAgent} + actor := &ident.BaseActor{ID: "agent_1", Type: ident.ActorAIAgent} params := map[string]any{"name": "private-tool"} _, errRPC := server.handleToolsCall(context.Background(), actor, params) diff --git a/api/mcp/server.go b/api/mcp/server.go index 8bd6972..7f1691a 100644 --- a/api/mcp/server.go +++ b/api/mcp/server.go @@ -146,7 +146,7 @@ func (s *Server) HandleMessages(w http.ResponseWriter, r *http.Request) { providers = []string{"apikey"} // Default fallback } - var actor *ident.Actor + var actor ident.Actor var authErr error authenticated := false @@ -154,7 +154,7 @@ func (s *Server) HandleMessages(w http.ResponseWriter, r *http.Request) { switch p { case "none": // Bypass authentication check entirely and mock a developer actor - actor = &ident.Actor{ + actor = &ident.BaseActor{ ID: "act_mcp_developer", Type: ident.ActorAIAgent, Name: "Developer Agent (No Auth)", @@ -175,7 +175,7 @@ func (s *Server) HandleMessages(w http.ResponseWriter, r *http.Request) { authErr = fmt.Errorf("invalid api key: %w", err) continue } - if resActor.Type != ident.ActorAIAgent { + if resActor.GetType() != ident.ActorAIAgent { authErr = fmt.Errorf("actor is not an AI agent") continue } @@ -214,7 +214,7 @@ func (s *Server) HandleMessages(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) } -func (s *Server) dispatch(ctx context.Context, sessionID string, actor *ident.Actor, req JSONRPCRequest) { +func (s *Server) dispatch(ctx context.Context, sessionID string, actor ident.Actor, req JSONRPCRequest) { var resp JSONRPCResponse resp.JSONRPC = "2.0" resp.ID = req.ID @@ -483,7 +483,7 @@ func (s *Server) handleToolsList(ctx context.Context) *ListToolsResult { return &ListToolsResult{Tools: tools} } -func (s *Server) handleToolsCall(ctx context.Context, actor *ident.Actor, params map[string]any) (any, *Error) { +func (s *Server) handleToolsCall(ctx context.Context, actor ident.Actor, params map[string]any) (any, *Error) { name, ok := params["name"].(string) if !ok { return nil, &Error{Code: CodeInvalidParams, Message: "Tool name required"} @@ -925,14 +925,43 @@ func (s *Server) renderUI(ctx context.Context, appName string) string { content += `No products registered.` } else { for _, p := range list { + currencyCode := "USD" + if s.deps.Config != nil && s.deps.Config.Currency != "" { + currencyCode = s.deps.Config.Currency + } + if p.Metadata != nil { + if curr, ok := p.Metadata["currency"].(string); ok { + currencyCode = curr + } + } + + priceStr := "N/A" + if len(p.Variants) > 0 { + priceStr = formatPrice(p.Variants[0].Price, currencyCode) + if len(p.Variants) > 1 { + minP := p.Variants[0].Price + maxP := p.Variants[0].Price + for _, v := range p.Variants { + if v.Price < minP { + minP = v.Price + } + if v.Price > maxP { + maxP = v.Price + } + } + if minP != maxP { + priceStr = fmt.Sprintf("%s - %s", formatPrice(minP, currencyCode), formatPrice(maxP, currencyCode)) + } + } + } content += fmt.Sprintf(` %s %s %s - $%.2f + %s %s - `, p.ID, p.Name, p.Description, p.Price, p.Currency) + `, p.ID, p.Name, p.Description, priceStr, currencyCode) } } content += ` @@ -1842,3 +1871,20 @@ func (s *Server) renderUI(ctx context.Context, appName string) string { return fmt.Sprintf(htmlSkeleton, title, accent, accentGlow, title, content) } + +func formatPrice(price float64, currencyCode string) string { + switch strings.ToUpper(currencyCode) { + case "USD": + return fmt.Sprintf("$%.2f", price) + case "EUR": + return fmt.Sprintf("€%.2f", price) + case "GBP": + return fmt.Sprintf("£%.2f", price) + case "JPY": + return fmt.Sprintf("¥%.0f", price) + case "INR": + return fmt.Sprintf("₹%.2f", price) + default: + return fmt.Sprintf("%.2f %s", price, currencyCode) + } +} diff --git a/api/mcp/transport_test.go b/api/mcp/transport_test.go index 80257c3..d87f157 100644 --- a/api/mcp/transport_test.go +++ b/api/mcp/transport_test.go @@ -96,10 +96,10 @@ func TestMCP_SSE_Integration(t *testing.T) { } type mockActorResolver struct { - keyActorMap map[string]*ident.Actor + keyActorMap map[string]ident.Actor } -func (m *mockActorResolver) GetActorByAPIKey(ctx context.Context, key string) (*ident.Actor, error) { +func (m *mockActorResolver) GetActorByAPIKey(ctx context.Context, key string) (ident.Actor, error) { if a, ok := m.keyActorMap[key]; ok { return a, nil } @@ -108,8 +108,8 @@ func (m *mockActorResolver) GetActorByAPIKey(ctx context.Context, key string) (* func TestMCP_Authentication(t *testing.T) { resolver := &mockActorResolver{ - keyActorMap: map[string]*ident.Actor{ - "valid-key": { + keyActorMap: map[string]ident.Actor{ + "valid-key": &ident.BaseActor{ ID: "act_test_agent", Type: ident.ActorAIAgent, Name: "Test Agent", diff --git a/api/middleware/auth.go b/api/middleware/auth.go index 02913b1..0facd4c 100644 --- a/api/middleware/auth.go +++ b/api/middleware/auth.go @@ -12,12 +12,12 @@ import ( // TokenValidator defines an interface for validating authentication tokens. type TokenValidator interface { - ValidateToken(ctx context.Context, token string) (*identity.Actor, error) + ValidateToken(ctx context.Context, token string) (identity.Actor, error) } // ActorResolver defines the interface for resolving API Keys. type ActorResolver interface { - GetActorByAPIKey(ctx context.Context, key string) (*identity.Actor, error) + GetActorByAPIKey(ctx context.Context, key string) (identity.Actor, error) } // AuthMiddleware extracts the credentials (JWT or API Key) and injects the Actor into the context. @@ -28,7 +28,7 @@ func AuthMiddleware(providers []string, validator TokenValidator, resolver Actor return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - var actor *identity.Actor + var actor identity.Actor var authErr error authenticated := false authAttempted := false @@ -36,7 +36,7 @@ func AuthMiddleware(providers []string, validator TokenValidator, resolver Actor for _, p := range providers { switch p { case "none": - actor = &identity.Actor{ + actor = &identity.BaseActor{ ID: "act_http_developer", Type: identity.ActorAIAgent, Name: "Developer User (No Auth)", @@ -117,12 +117,12 @@ func AuthMiddleware(providers []string, validator TokenValidator, resolver Actor } // WithActor returns a new context with the given actor. -func WithActor(ctx context.Context, actor *identity.Actor) context.Context { +func WithActor(ctx context.Context, actor identity.Actor) context.Context { return mdk.WithActor(ctx, actor) } // ForContext retrieves the Actor from the context and a boolean indicating success. -func ForContext(ctx context.Context) (*identity.Actor, bool) { +func ForContext(ctx context.Context) (identity.Actor, bool) { return mdk.ActorFromContext(ctx) } diff --git a/api/middleware/auth_test.go b/api/middleware/auth_test.go index 12bb89c..9c3a4b2 100644 --- a/api/middleware/auth_test.go +++ b/api/middleware/auth_test.go @@ -10,32 +10,32 @@ import ( ) type mockValidator struct { - actor *identity.Actor + actor identity.Actor err error } -func (m *mockValidator) ValidateToken(ctx context.Context, token string) (*identity.Actor, error) { +func (m *mockValidator) ValidateToken(ctx context.Context, token string) (identity.Actor, error) { return m.actor, m.err } type mockResolver struct { - actor *identity.Actor + actor identity.Actor err error } -func (m *mockResolver) GetActorByAPIKey(ctx context.Context, key string) (*identity.Actor, error) { +func (m *mockResolver) GetActorByAPIKey(ctx context.Context, key string) (identity.Actor, error) { return m.actor, m.err } func TestAuthMiddleware_Scenarios(t *testing.T) { t.Run("Valid JWT Token", func(t *testing.T) { - expectedActor := &identity.Actor{ID: "act_1", Type: identity.ActorHuman} + expectedActor := &identity.BaseActor{ID: "act_1", Type: identity.ActorHuman} validator := &mockValidator{actor: expectedActor} mw := AuthMiddleware([]string{"jwt"}, validator, nil) h := mw(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { actor, ok := ForContext(r.Context()) - if !ok || actor.ID != "act_1" { + if !ok || actor.GetID() != "act_1" { t.Errorf("expected actor act_1, got %v", actor) } })) @@ -80,13 +80,13 @@ func TestAuthMiddleware_Scenarios(t *testing.T) { }) t.Run("Valid API Key", func(t *testing.T) { - expectedActor := &identity.Actor{ID: "agent_1", Type: identity.ActorAIAgent} + expectedActor := &identity.BaseActor{ID: "agent_1", Type: identity.ActorAIAgent} resolver := &mockResolver{actor: expectedActor} mw := AuthMiddleware([]string{"apikey"}, nil, resolver) h := mw(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { actor, ok := ForContext(r.Context()) - if !ok || actor.ID != "agent_1" { + if !ok || actor.GetID() != "agent_1" { t.Errorf("expected actor agent_1, got %v", actor) } })) @@ -106,7 +106,7 @@ func TestAuthMiddleware_Scenarios(t *testing.T) { h := mw(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { actor, ok := ForContext(r.Context()) - if !ok || actor.ID != "act_http_developer" { + if !ok || actor.GetID() != "act_http_developer" { t.Errorf("expected actor act_http_developer, got %v", actor) } })) @@ -127,12 +127,12 @@ func TestAuthMiddleware_Scenarios(t *testing.T) { t.Error("expected no actor") } }) - + t.Run("WithActor helper", func(t *testing.T) { - actor := &identity.Actor{ID: "test"} + actor := &identity.BaseActor{ID: "test"} ctx := WithActor(context.Background(), actor) got, ok := ForContext(ctx) - if !ok || got.ID != "test" { + if !ok || got.GetID() != "test" { t.Error("WithActor failed") } }) diff --git a/build_ci.go b/build_ci.go new file mode 100644 index 0000000..5d83ae2 --- /dev/null +++ b/build_ci.go @@ -0,0 +1,16 @@ +//go:build ignore +package main + +import ( + "fmt" + "os" + + "github.com/GoHyperrr/hyperrr/internal/builder" +) + +func main() { + if err := builder.RunBuild(); err != nil { + fmt.Fprintf(os.Stderr, "Build failed: %v\n", err) + os.Exit(1) + } +} diff --git a/cmd/hyperrr/root.go b/cmd/hyperrr/root.go index 9d3ab7a..9fedeeb 100644 --- a/cmd/hyperrr/root.go +++ b/cmd/hyperrr/root.go @@ -5,8 +5,10 @@ import ( "os" "strings" - "github.com/spf13/cobra" + "github.com/GoHyperrr/auth/apikey" + "github.com/GoHyperrr/auth/emailpass" "github.com/GoHyperrr/hyperrr/pkg/registry" + "github.com/spf13/cobra" "gorm.io/gorm" ) @@ -70,6 +72,28 @@ func findOrCreateGroupCmd(groupName string) *cobra.Command { } func registerPluginCommands() { + // Register built-in dynamic commands from auth packages + registry.RegisterCommand(registry.CLICommand{ + Group: "auth", + Name: "apikey", + Aliases: []string{"key"}, + Short: "Generate a new secure API key on-demand", + Long: "Generate a new secure API key on-demand and write it to the database.", + Usage: "generate", + NeedsDB: true, + Run: apikey.RunAPIKeyCmd, + }) + + registry.RegisterCommand(registry.CLICommand{ + Group: "auth", + Name: "user", + Usage: "register ", + Short: "Register a new user via email/password", + Long: "Register a new user dynamically via email/password and write it to the database.", + NeedsDB: true, + Run: emailpass.RunEmailPassCmd, + }) + for _, c := range registry.ListCommands() { var parent *cobra.Command if c.Group != "" { diff --git a/go.mod b/go.mod index ca0ccef..fcba61c 100644 --- a/go.mod +++ b/go.mod @@ -15,52 +15,13 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.21.0 github.com/vektah/gqlparser/v2 v2.5.33 - gocloud.dev v0.45.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/postgres v1.6.0 gorm.io/gorm v1.31.1 ) require ( - cel.dev/expr v0.25.1 // indirect - cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.17.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.3 // indirect - cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.57.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect github.com/agnivade/levenshtein v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2 v1.40.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.14 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.92.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.2 // indirect - github.com/aws/smithy-go v1.24.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/colorprofile v0.4.3 // indirect github.com/charmbracelet/ultraviolet v0.0.0-20260416155717-489999b90468 // indirect @@ -70,23 +31,14 @@ require ( github.com/charmbracelet/x/windows v0.2.2 // indirect github.com/clipperhouse/displaywidth v0.11.0 // indirect github.com/clipperhouse/uax29/v2 v2.7.0 // indirect - github.com/cncf/xds/go v0.0.0-20251110193048-8bfbf64dc13e // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/glebarez/go-sqlite v1.21.2 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect - github.com/google/s2a-go v0.1.9 // indirect - github.com/google/wire v0.7.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect - github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -97,7 +49,6 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/klauspost/compress v1.18.5 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.4.0 // indirect github.com/mattn/go-isatty v0.0.21 // indirect github.com/mattn/go-runewidth v0.0.23 // indirect @@ -105,49 +56,35 @@ require ( github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sosodev/duration v1.4.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/urfave/cli/v3 v3.8.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.51.0 // indirect + golang.org/x/crypto v0.52.0 // indirect golang.org/x/mod v0.35.0 // indirect - golang.org/x/net v0.53.0 // indirect - golang.org/x/oauth2 v0.33.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect - golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.44.0 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/api v0.256.0 // indirect - google.golang.org/genproto v0.0.0-20251124214823-79d6a2a48846 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect - google.golang.org/grpc v1.77.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect modernc.org/libc v1.22.5 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/sqlite v1.23.1 // indirect ) + +replace ( + github.com/GoHyperrr/auth => ../auth + github.com/GoHyperrr/commerce => ../commerce + github.com/GoHyperrr/mdk => ../mdk +) diff --git a/go.sum b/go.sum index 4f60463..b9fa56b 100644 --- a/go.sum +++ b/go.sum @@ -1,63 +1,7 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU= charm.land/lipgloss/v2 v2.0.3/go.mod h1:7myLU9iG/3xluAWzpY/fSxYYHCgoKTie7laxk6ATwXA= -cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= -cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= -cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= -cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= -cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= -cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= -cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= -cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= -cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= -cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.57.2 h1:sVlym3cHGYhrp6XZKkKb+92I1V42ks2qKKpB0CF5Mb4= -cloud.google.com/go/storage v1.57.2/go.mod h1:n5ijg4yiRXXpCu0sJTD6k+eMf7GRrJmPyr9YxLXGHOk= -cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= -cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= github.com/99designs/gqlgen v0.17.90 h1:wSv6blm/PoplU6QoNw83EcQpNtC0HX3/+44vITJOzpk= github.com/99designs/gqlgen v0.17.90/go.mod h1:GqYrEwYsqCG8VaOsq2kJUCUKwAE1T+u2i+Nj7NtXiVI= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 h1:ZJJNFaQ86GVKQ9ehwqyAFE6pIfyicpuJ8IkVaPBc6/4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3/go.mod h1:URuDvhmATVKqHBH9/0nOiNKk0+YcwfQ3WkK5PqHKxc8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest/to v0.4.1 h1:CxNHBqdzTr7rLtdrtb5CMjJcDut+WNGCVv7OmS5+lTc= -github.com/Azure/go-autorest/autorest/to v0.4.1/go.mod h1:EtaofgU4zmtvn1zT2ARsjRFdq9vXx0YWtmElwL+GZ9M= -github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= -github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= -github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= -github.com/GoHyperrr/auth v0.0.0-20260605044914-36c40a774fca h1:a4CJ6okZi29sGqsJHPygcuvZH2IghMBG8rU9mdXbWkY= -github.com/GoHyperrr/auth v0.0.0-20260605044914-36c40a774fca/go.mod h1:uVfTJ/O61t1xdUP1RAp2ZmnUvnQCpV6lIs8QC2EKBEs= -github.com/GoHyperrr/commerce v0.0.0-20260605045145-ef7fc66628c7 h1:xT2APQeHpA9wd8yX0kysrI+hcoqO6CSQmS/PE9nMi3k= -github.com/GoHyperrr/commerce v0.0.0-20260605045145-ef7fc66628c7/go.mod h1:AeWVvpdTn7S10yQjPz7hChQQq6iwWA/KkopmbRM96tg= -github.com/GoHyperrr/mdk v0.0.0-20260605044506-3d2ab0d97ca9 h1:32yHu/Gnk+ztrDUZ8D+WnjWmkKZd8ebs+yxrjKJFq8Y= -github.com/GoHyperrr/mdk v0.0.0-20260605044506-3d2ab0d97ca9/go.mod h1:eZBBN0St+r0Gu5K5CklIsS6/SlVx6t2WsvOjkR1t4Ak= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0 h1:xfK3bbi6F2RDtaZFtUdKO3osOBIhNb+xTs8lFW6yx9o= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/PuerkitoBio/goquery v1.12.0 h1:pAcL4g3WRXekcB9AU/y1mbKez2dbY2AajVhtkO8RIBo= github.com/PuerkitoBio/goquery v1.12.0/go.mod h1:802ej+gV2y7bbIhOIoPY5sT183ZW0YFofScC4q/hIpQ= github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= @@ -68,46 +12,6 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= -github.com/aws/aws-sdk-go-v2 v1.40.0 h1:/WMUA0kjhZExjOQN2z3oLALDREea1A7TobfuiBrKlwc= -github.com/aws/aws-sdk-go-v2 v1.40.0/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y= -github.com/aws/aws-sdk-go-v2/config v1.32.2 h1:4liUsdEpUUPZs5WVapsJLx5NPmQhQdez7nYFcovrytk= -github.com/aws/aws-sdk-go-v2/config v1.32.2/go.mod h1:l0hs06IFz1eCT+jTacU/qZtC33nvcnLADAPL/XyrkZI= -github.com/aws/aws-sdk-go-v2/credentials v1.19.2 h1:qZry8VUyTK4VIo5aEdUcBjPZHL2v4FyQ3QEOaWcFLu4= -github.com/aws/aws-sdk-go-v2/credentials v1.19.2/go.mod h1:YUqm5a1/kBnoK+/NY5WEiMocZihKSo15/tJdmdXnM5g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14 h1:WZVR5DbDgxzA0BJeudId89Kmgy6DIU4ORpxwsVHz0qA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14/go.mod h1:Dadl9QO0kHgbrH1GRqGiZdYtW5w+IXXaBNCHTIaheM4= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.12 h1:Zy6Tme1AA13kX8x3CnkHx5cqdGWGaj/anwOiWGnA0Xo= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.12/go.mod h1:ql4uXYKoTM9WUAUSmthY4AtPVrlTBZOvnBJTiCUdPxI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14 h1:PZHqQACxYb8mYgms4RZbhZG0a7dPW06xOjmaH0EJC/I= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14/go.mod h1:VymhrMJUWs69D8u0/lZ7jSB6WgaG/NqHi3gX0aYf6U0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14 h1:bOS19y6zlJwagBfHxs0ESzr1XCOU2KXJCWcq3E2vfjY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14/go.mod h1:1ipeGBMAxZ0xcTm6y6paC2C/J6f6OO7LBODV9afuAyM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.14 h1:ITi7qiDSv/mSGDSWNpZ4k4Ve0DQR6Ug2SJQ8zEHoDXg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.14/go.mod h1:k1xtME53H1b6YpZt74YmwlONMWf4ecM+lut1WQLAF/U= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.5 h1:Hjkh7kE6D81PgrHlE/m9gx+4TyyeLHuY8xJs7yXN5C4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.5/go.mod h1:nPRXgyCfAurhyaTMoBMwRBYBhaHI4lNPAnJmjM0Tslc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14 h1:FIouAnCE46kyYqyhs0XEBDFFSREtdnr8HQuLPQPLCrY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14/go.mod h1:UTwDc5COa5+guonQU8qBikJo1ZJ4ln2r1MkF7Dqag1E= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.14 h1:FzQE21lNtUor0Fb7QNgnEyiRCBlolLTX/Z1j65S7teM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.14/go.mod h1:s1ydyWG9pm3ZwmmYN21HKyG9WzAZhYVW85wMHs5FV6w= -github.com/aws/aws-sdk-go-v2/service/s3 v1.92.1 h1:OgQy/+0+Kc3khtqiEOk23xQAglXi3Tj0y5doOxbi5tg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.92.1/go.mod h1:wYNqY3L02Z3IgRYxOBPH9I1zD9Cjh9hI5QOy/eOjQvw= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.2 h1:MxMBdKTYBjPQChlJhi4qlEueqB1p1KcbTEa7tD5aqPs= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.2/go.mod h1:iS6EPmNeqCsGo+xQmXv0jIMjyYtQfnwg36zl2FwEouk= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.5 h1:ksUT5KtgpZd3SAiFJNJ0AFEJVva3gjBmN7eXUZjzUwQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.5/go.mod h1:av+ArJpoYf3pgyrj6tcehSFW+y9/QvAY8kMooR9bZCw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10 h1:GtsxyiF3Nd3JahRBJbxLCCdYW9ltGQYrFWg8XdkGDd8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10/go.mod h1:/j67Z5XBVDx8nZVp9EuFM9/BS5dvBznbqILGuu73hug= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.2 h1:a5UTtD4mHBU3t0o6aHQZFJTNKVfxFWfPX7J0Lr7G+uY= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.2/go.mod h1:6TxbXoDSgBQ225Qd8Q+MbxUxUh6TtNKwbRt/EPS9xso= -github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= -github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -130,8 +34,6 @@ github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSE github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= -github.com/cncf/xds/go v0.0.0-20251110193048-8bfbf64dc13e h1:gt7U1Igw0xbJdyaCM5H2CnlAlPSkzrhsebQB6WQWjLA= -github.com/cncf/xds/go v0.0.0-20251110193048-8bfbf64dc13e/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -140,16 +42,6 @@ github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7c github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= -github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= -github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= -github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= -github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= @@ -158,41 +50,18 @@ github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9g github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= -github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= -github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= -github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= -github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= -github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= -github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= -github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -211,8 +80,6 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= -github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= @@ -221,8 +88,6 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= @@ -239,10 +104,6 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -275,8 +136,6 @@ github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -292,69 +151,26 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= -go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= -go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= -go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iLZEPtdV7vie80Yyqf7oikJLjQ/myi0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -gocloud.dev v0.45.0 h1:WknIK8IbRdmynDvara3Q7G6wQhmEiOGwpgJufbM39sY= -gocloud.dev v0.45.0/go.mod h1:0kXKmkCLG6d31N7NyLZWzt7jDSQura9zD/mWgiB6THI= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= -golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI= -google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964= -google.golang.org/genproto v0.0.0-20251124214823-79d6a2a48846 h1:dDbsTLIK7EzwUq36kCSAsk0slouq/S0tWHeeGi97cD8= -google.golang.org/genproto v0.0.0-20251124214823-79d6a2a48846/go.mod h1:PP0g88Dz3C7hRAfbQCQggeWAXjuqGsNPLE4s7jh0RGU= -google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846 h1:ZdyUkS9po3H7G0tuh955QVyyotWvOD4W0aEapeGeUYk= -google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846/go.mod h1:Fk4kyraUvqD7i5H6S43sj2W98fbZa75lpZz/eUyhfO0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= -google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/app/app.go b/internal/app/app.go index c2b705e..f3bdec9 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -251,6 +251,23 @@ func RunWithConfig(cfg *config.Config) error { } // 9. Register system.about workflow for AI agent context + _ = runner.RegisterHandler("system.about_handler", func(sCtx mdk.StepContext) mdk.StepResult { + var activeModules []string + for _, m := range registry.List() { + activeModules = append(activeModules, m.ID()) + } + + info := map[string]any{ + "version": internal.Version, + "environment": cfg.AppEnv, + "current_time": time.Now().Format(time.RFC3339), + "active_modules": activeModules, + "event_bus": cfg.EventBusProvider, + "state_store": cfg.WorkflowStoreType, + } + return mdk.StepResult{Output: info} + }) + _ = registryStore.Register(&workflow.Workflow{ Name: "system.about", Description: "Returns metadata about the running system, including active modules, version, current server time, and environment configurations.", @@ -262,22 +279,7 @@ func RunWithConfig(cfg *config.Config) error { { ID: "about", Name: "About System", - Handler: func(sCtx mdk.StepContext) mdk.StepResult { - var activeModules []string - for _, m := range registry.List() { - activeModules = append(activeModules, m.ID()) - } - - info := map[string]any{ - "version": internal.Version, - "environment": cfg.AppEnv, - "current_time": time.Now().Format(time.RFC3339), - "active_modules": activeModules, - "event_bus": cfg.EventBusProvider, - "state_store": cfg.WorkflowStoreType, - } - return mdk.StepResult{Output: info} - }, + Uses: "system.about_handler", }, }, }) diff --git a/internal/builder/codegen.go b/internal/builder/codegen.go index b0cbb34..4efc7d8 100644 --- a/internal/builder/codegen.go +++ b/internal/builder/codegen.go @@ -475,7 +475,17 @@ func generateResolversImpl(modules []ModuleInfo, interfaces []ResolverInterface) methodsBuf.WriteString(fmt.Sprintf("func (r *%s) %s(%s) %s {\n", resolverStructName, method.Name, method.Params, method.Results)) - if found { + if iface.Name == "ActorResolver" { + if method.Name == "ID" { + methodsBuf.WriteString("\treturn obj.GetID(), nil\n") + } else if method.Name == "Type" { + methodsBuf.WriteString("\treturn string(obj.GetType()), nil\n") + } else if method.Name == "Name" { + methodsBuf.WriteString("\treturn obj.GetName(), nil\n") + } else { + methodsBuf.WriteString(fmt.Sprintf("\tpanic(fmt.Errorf(\"not implemented: %s\"))\n", method.Name)) + } + } else if found { var moduleRef string if targetMod.Name == "ctxengine" { moduleRef = "r.CtxEngineModule" @@ -587,7 +597,7 @@ func getZeroReturnStringInternal(resultsStr string, exceptLast bool) string { continue } - if strings.HasPrefix(part, "*") || strings.HasPrefix(part, "[]") || strings.HasPrefix(part, "map[") { + if strings.HasPrefix(part, "*") || strings.HasPrefix(part, "[]") || strings.HasPrefix(part, "map[") || part == "mdk.Actor" { zeroVals = append(zeroVals, "nil") } else if part == "string" { zeroVals = append(zeroVals, `""`) diff --git a/internal/storage/cloud.go b/internal/storage/cloud.go index 7443c9c..f6c3c6f 100644 --- a/internal/storage/cloud.go +++ b/internal/storage/cloud.go @@ -1,74 +1,149 @@ package storage import ( + "bytes" "context" "fmt" "io" - "mime" + "net/url" + "os" "path/filepath" - - "gocloud.dev/blob" - _ "gocloud.dev/blob/azureblob" - _ "gocloud.dev/blob/fileblob" - _ "gocloud.dev/blob/gcsblob" - _ "gocloud.dev/blob/memblob" - _ "gocloud.dev/blob/s3blob" + "strings" + "sync" ) -// CloudProvider implements ObjectStorage using Go Cloud Development Kit. -// It supports S3, GCS, Azure Blob Storage, and local filesystem via URL schemes. +// CloudProvider implements ObjectStorage using local filesystem and memory fallbacks, +// avoiding external heavy cloud SDK dependencies. type CloudProvider struct { - bucket *blob.Bucket - url string + mu sync.RWMutex + mem map[string][]byte + url string + isMem bool + baseDir string } // NewCloudProvider creates a new CloudProvider from a bucket URL. // Example URLs: -// - S3: s3://my-bucket?region=us-west-1 -// - GCS: gs://my-bucket -// - Azure: azblob://my-container +// - Mem: mem:// // - Local: file:///path/to/dir (use file:///C:/path on Windows) +// - Fallback relative/absolute directory path: ./uploads func NewCloudProvider(ctx context.Context, bucketURL string) (*CloudProvider, error) { - b, err := blob.OpenBucket(ctx, bucketURL) + u, err := url.Parse(bucketURL) if err != nil { - return nil, fmt.Errorf("failed to open bucket %s: %w", bucketURL, err) + return nil, fmt.Errorf("invalid storage URL: %w", err) + } + + p := &CloudProvider{ + url: bucketURL, } - return &CloudProvider{bucket: b, url: bucketURL}, nil + + if u.Scheme == "mem" { + p.isMem = true + p.mem = make(map[string][]byte) + } else if u.Scheme == "file" { + dir := u.Path + if os.PathSeparator == '\\' { + // On Windows, remove leading slash if it precedes a drive letter + if len(dir) > 2 && dir[0] == '/' && dir[2] == ':' { + dir = dir[1:] + } + dir = filepath.FromSlash(dir) + } + if err := os.MkdirAll(dir, 0755); err != nil { + return nil, fmt.Errorf("failed to create storage directory %s: %w", dir, err) + } + p.baseDir = dir + } else { + dir := filepath.Clean(bucketURL) + if err := os.MkdirAll(dir, 0755); err != nil { + return nil, fmt.Errorf("failed to create storage directory %s: %w", dir, err) + } + p.baseDir = dir + } + + return p, nil } +// Upload saves a file to storage and returns its path or URL. func (p *CloudProvider) Upload(ctx context.Context, path string, data io.Reader) (string, error) { - opts := &blob.WriterOptions{ - ContentType: mime.TypeByExtension(filepath.Ext(path)), + if p.isMem { + buf, err := io.ReadAll(data) + if err != nil { + return "", err + } + p.mu.Lock() + p.mem[path] = buf + p.mu.Unlock() + return path, nil } - w, err := p.bucket.NewWriter(ctx, path, opts) - if err != nil { + fullPath := filepath.Join(p.baseDir, path) + if err := os.MkdirAll(filepath.Dir(fullPath), 0755); err != nil { return "", err } - if _, err := io.Copy(w, data); err != nil { - w.Close() + + f, err := os.Create(fullPath) + if err != nil { return "", err } - if err := w.Close(); err != nil { + defer f.Close() + + if _, err := io.Copy(f, data); err != nil { return "", err } + return path, nil } +// Open retrieves a file from storage. func (p *CloudProvider) Open(ctx context.Context, path string) (io.ReadCloser, error) { - return p.bucket.NewReader(ctx, path, nil) + if p.isMem { + p.mu.RLock() + buf, ok := p.mem[path] + p.mu.RUnlock() + if !ok { + return nil, os.ErrNotExist + } + return io.NopCloser(bytes.NewReader(buf)), nil + } + + fullPath := filepath.Join(p.baseDir, path) + f, err := os.Open(fullPath) + if err != nil { + return nil, err + } + return f, nil } +// Delete removes a file from storage. func (p *CloudProvider) Delete(ctx context.Context, path string) error { - return p.bucket.Delete(ctx, path) + if p.isMem { + p.mu.Lock() + delete(p.mem, path) + p.mu.Unlock() + return nil + } + + fullPath := filepath.Join(p.baseDir, path) + err := os.Remove(fullPath) + if os.IsNotExist(err) { + return nil + } + return err } +// GetURL returns a public or signed URL for a file. func (p *CloudProvider) GetURL(ctx context.Context, path string) (string, error) { - // gocloud doesn't have a single way to get a public URL because it depends on the provider's policy. - // But we can return the path combined with the base URL for reference. - return fmt.Sprintf("%s/%s", p.url, path), nil + u, err := url.Parse(p.url) + if err != nil { + return "", err + } + normalizedPath := filepath.ToSlash(path) + u.Path = strings.TrimSuffix(u.Path, "/") + "/" + strings.TrimPrefix(normalizedPath, "/") + return u.String(), nil } +// Close releases any resources. func (p *CloudProvider) Close() error { - return p.bucket.Close() + return nil } diff --git a/pkg/config/config.go b/pkg/config/config.go index 0305171..4b90f26 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -27,6 +27,7 @@ const ( DefaultStorageProvider = "cloud" DefaultStorageBucketURL = "mem://" DefaultNatsURL = "nats://localhost:4222" + DefaultCurrency = "USD" ) // ModuleConfig represents registration info for a dynamic module. @@ -53,6 +54,7 @@ type Config struct { StoragePath string `mapstructure:"STORAGE_PATH"` StorageBucketURL string `mapstructure:"STORAGE_BUCKET_URL"` NATSURL string `mapstructure:"NATS_URL"` + Currency string `mapstructure:"CURRENCY"` MCPAuthProviders []string `mapstructure:"MCP_AUTH_PROVIDERS"` AuthProviders []string `mapstructure:"AUTH_PROVIDERS"` Modules []ModuleConfig `mapstructure:"modules"` @@ -126,6 +128,7 @@ func LoadWithFile(filename string) (*Config, error) { v.SetDefault("STORAGE_PROVIDER", DefaultStorageProvider) v.SetDefault("STORAGE_BUCKET_URL", DefaultStorageBucketURL) v.SetDefault("NATS_URL", DefaultNatsURL) + v.SetDefault("CURRENCY", DefaultCurrency) v.SetDefault("MCP_AUTH_PROVIDERS", []string{"apikey"}) v.SetDefault("AUTH_PROVIDERS", []string{"jwt"}) diff --git a/pkg/identity/actor.go b/pkg/identity/actor.go index f486a42..2ddff6d 100644 --- a/pkg/identity/actor.go +++ b/pkg/identity/actor.go @@ -4,7 +4,7 @@ import ( "github.com/GoHyperrr/mdk" ) -// Re-export/alias mdk actor types for backward compatibility inside hyperrr. +// ActorType represents the type of security principal. type ActorType = mdk.ActorType const ( @@ -15,3 +15,4 @@ const ( type Actor = mdk.Actor +type BaseActor = mdk.BaseActor diff --git a/pkg/registry/module.go b/pkg/registry/module.go index 1eb525c..b711501 100644 --- a/pkg/registry/module.go +++ b/pkg/registry/module.go @@ -20,7 +20,7 @@ import ( // ActorResolver defines the interface for resolving identities. type ActorResolver interface { - GetActorByAPIKey(ctx context.Context, key string) (*identity.Actor, error) + GetActorByAPIKey(ctx context.Context, key string) (identity.Actor, error) } // WorkflowRunner defines the interface for executing workflows. diff --git a/pkg/workflow/runner.go b/pkg/workflow/runner.go index 24b175b..c917e76 100644 --- a/pkg/workflow/runner.go +++ b/pkg/workflow/runner.go @@ -202,8 +202,8 @@ func (r *Runner) ExecuteSyncWorkflow(ctx context.Context, id string, wf *Workflo time.Sleep(100 * time.Millisecond) } - handler := s.Handler - if handler == nil && s.Uses != "" { + var handler mdk.StepHandler + if s.Uses != "" { r.mu.RLock() h, ok := r.handlers[s.Uses] r.mu.RUnlock() @@ -433,8 +433,8 @@ func (r *Runner) ResumeExecution(ctx context.Context, id string, wf *Workflow) ( time.Sleep(100 * time.Millisecond) } - handler := s.Handler - if handler == nil && s.Uses != "" { + var handler mdk.StepHandler + if s.Uses != "" { r.mu.RLock() h, ok := r.handlers[s.Uses] r.mu.RUnlock() @@ -669,8 +669,8 @@ func (r *Runner) ExecuteSync(ctx context.Context, id string, workflowID string, time.Sleep(100 * time.Millisecond) // Static backoff } - handler := s.Handler - if handler == nil && s.Uses != "" { + var handler mdk.StepHandler + if s.Uses != "" { r.mu.RLock() h, ok := r.handlers[s.Uses] r.mu.RUnlock() @@ -767,8 +767,8 @@ func (r *Runner) compensate(ctx context.Context, id string, history []mdk.Step, r.emit(ctx, EventWorkflowCompensating, map[string]any{"id": id, "steps_count": len(history)}) for i := len(history) - 1; i >= 0; i-- { step := history[i] - compensate := step.Compensate - if compensate == nil && step.Saga != nil && step.Saga.Uses != "" { + var compensate mdk.StepHandler + if step.Saga != nil && step.Saga.Uses != "" { r.mu.RLock() h, ok := r.handlers[step.Saga.Uses] r.mu.RUnlock() diff --git a/tests/auth_test.go b/tests/auth_test.go index 0300102..392eadb 100644 --- a/tests/auth_test.go +++ b/tests/auth_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/GoHyperrr/auth" "github.com/GoHyperrr/hyperrr/api/graph" "github.com/GoHyperrr/hyperrr/api/middleware" "github.com/GoHyperrr/commerce/customer" @@ -84,7 +85,7 @@ func TestAuthFlow(t *testing.T) { } // 3. Verify Customer created via event - c, err := custMod.Repo().GetByUserID(ctx, loginRes.Actor.ID) + c, err := custMod.Repo().GetByUserID(ctx, loginRes.Actor.GetID()) if err != nil { t.Fatalf("customer not found: %v", err) } @@ -93,14 +94,14 @@ func TestAuthFlow(t *testing.T) { } // 4. Test 'me' query - actor := &ident.Actor{ID: loginRes.Actor.ID, Type: ident.ActorType(loginRes.Actor.Type), Name: loginRes.Actor.Name} + actor := &ident.BaseActor{ID: loginRes.Actor.GetID(), Type: ident.ActorType(loginRes.Actor.GetType()), Name: loginRes.Actor.GetName()} meCtx := middleware.WithActor(ctx, actor) meRes, err := resolver.Query().Me(meCtx) if err != nil { t.Fatalf("me query failed: %v", err) } - if meRes.ID != loginRes.Actor.ID { - t.Errorf("expected ID %s, got %s", loginRes.Actor.ID, meRes.ID) + if meRes.GetID() != loginRes.Actor.GetID() { + t.Errorf("expected ID %s, got %s", loginRes.Actor.GetID(), meRes.GetID()) } }) @@ -119,7 +120,7 @@ func TestAuthFlow(t *testing.T) { }) t.Run("API Key CRUD Operations", func(t *testing.T) { - actor := &ident.Actor{ID: "act_test_key_owner", Type: ident.ActorHuman, Name: "Key Owner"} + actor := &auth.Actor{ID: "act_test_key_owner", Type: ident.ActorHuman, Name: "Key Owner"} if err := database.Create(actor).Error; err != nil { t.Fatalf("failed to seed test actor: %v", err) } @@ -160,8 +161,8 @@ func TestAuthFlow(t *testing.T) { if err != nil { t.Fatalf("failed to resolve actor by key: %v", err) } - if resolvedActor.ID != actor.ID { - t.Errorf("expected resolved actor ID %s, got %s", actor.ID, resolvedActor.ID) + if resolvedActor.GetID() != actor.ID { + t.Errorf("expected resolved actor ID %s, got %s", actor.ID, resolvedActor.GetID()) } // 5. Authorized revoke