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