From 4f5ea6447698de4d2da2d820b422cc1dfade3c48 Mon Sep 17 00:00:00 2001 From: Quanzheng Long Date: Thu, 17 Sep 2026 12:10:21 -0700 Subject: [PATCH] Add Databricks Snowflake and MongoDB attribute stores --- .../workflows/server-attribute-sync-ci.yml | 80 +++ .github/workflows/server-ci.yml | 34 - cli/go.mod | 116 +++- cli/go.sum | 230 +++++-- cli/internal/dev/config_test.go | 38 ++ docs/content/primitives/attribute.mdx | 6 + docs/content/production/attribute-store.mdx | 182 +++-- docs/content/production/index.mdx | 4 +- .../current/primitives/attribute.mdx | 4 + .../current/production/attribute-store.mdx | 155 +++++ .../current/production/index.mdx | 4 +- protos/codec-server/go.mod | 8 +- protos/codec-server/go.sum | 16 +- server/Makefile | 9 +- server/cmd/server/go.mod | 116 +++- server/cmd/server/go.sum | 230 +++++-- server/config/attribute_store_test.go | 131 ++++ server/config/config.go | 89 ++- server/config/development.yaml | 15 + .../mongodb-attribute-store-dependency.yml | 15 + server/go.mod | 119 +++- server/go.sum | 236 +++++-- server/integ/README.md | 27 +- server/integ/attribute_sync_integ_test.go | 106 +++ .../service/common/attributestore/manager.go | 637 ++---------------- .../attributestore/manager_integ_test.go | 125 +++- .../common/attributestore/manager_test.go | 174 ++++- .../common/attributestore/mongo_store.go | 219 ++++++ .../common/attributestore/sql_dialect.go | 545 +++++++++++++++ .../common/attributestore/sql_dialect_test.go | 393 +++++++++++ .../common/attributestore/sql_store.go | 324 +++++++++ .../common/attributestore/value_conversion.go | 284 ++++++++ web/go.mod | 6 +- web/go.sum | 12 +- 34 files changed, 3754 insertions(+), 935 deletions(-) create mode 100644 .github/workflows/server-attribute-sync-ci.yml create mode 100644 docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/attribute-store.mdx create mode 100644 server/docker-compose/mongodb-attribute-store-dependency.yml create mode 100644 server/service/common/attributestore/mongo_store.go create mode 100644 server/service/common/attributestore/sql_dialect.go create mode 100644 server/service/common/attributestore/sql_dialect_test.go create mode 100644 server/service/common/attributestore/sql_store.go create mode 100644 server/service/common/attributestore/value_conversion.go diff --git a/.github/workflows/server-attribute-sync-ci.yml b/.github/workflows/server-attribute-sync-ci.yml new file mode 100644 index 000000000..902322633 --- /dev/null +++ b/.github/workflows/server-attribute-sync-ci.yml @@ -0,0 +1,80 @@ +name: Attribute Sync CI + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + paths: + - "server/**" + - "protos/**" + - ".github/scripts/dump-docker-logs.sh" + - ".github/workflows/server-attribute-sync-ci.yml" + workflow_dispatch: + +jobs: + attribute-sync-integ: + if: github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'ci:attribute-sync') + name: Attribute Sync integration + runs-on: ${{ github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && 'linux-dind-heavy' || 'ubuntu-latest' }} + timeout-minutes: 60 + defaults: + run: + working-directory: server + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 + with: + go-version-file: server/go.mod + cache-dependency-path: server/go.sum + - name: Start MySQL and PostgreSQL + run: docker compose -f docker-compose/attribute-store-dependencies.yml up -d --wait + - name: Start Temporal and Cadence + run: docker compose -f docker-compose/ci-cadence-temporal-dependencies.yml up -d + - name: Attribute Sync integration tests + env: + GOWORK: "off" + run: make attributeSyncIntegTests integrationCoverageDir=coverage-raw + - name: Upload integration coverage data + if: always() + uses: actions/upload-artifact@v7 + with: + name: server-integration-coverage-attribute-sync + path: server/coverage-raw/ + if-no-files-found: ignore + retention-days: 1 + - name: Dump docker logs + if: always() + run: bash "$GITHUB_WORKSPACE/.github/scripts/dump-docker-logs.sh" + + mongodb-attribute-sync-integ: + if: github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'ci:attribute-sync') + name: MongoDB Attribute Sync integration + runs-on: ${{ github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && 'linux-dind-heavy' || 'ubuntu-latest' }} + timeout-minutes: 60 + defaults: + run: + working-directory: server + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 + with: + go-version-file: server/go.mod + cache-dependency-path: server/go.sum + - name: Start MongoDB + run: docker compose -f docker-compose/mongodb-attribute-store-dependency.yml up -d --wait + - name: Start Temporal and Cadence + run: docker compose -f docker-compose/ci-cadence-temporal-dependencies.yml up -d + - name: MongoDB Attribute Sync integration tests + env: + GOWORK: "off" + run: make mongodbAttributeStoreIntegTests integrationCoverageDir=coverage-raw + - name: Upload integration coverage data + if: always() + uses: actions/upload-artifact@v7 + with: + name: server-integration-coverage-mongodb-attribute-sync + path: server/coverage-raw/ + if-no-files-found: ignore + retention-days: 1 + - name: Dump docker logs + if: always() + run: bash "$GITHUB_WORKSPACE/.github/scripts/dump-docker-logs.sh" diff --git a/.github/workflows/server-ci.yml b/.github/workflows/server-ci.yml index d05d35206..02ad7ca6c 100644 --- a/.github/workflows/server-ci.yml +++ b/.github/workflows/server-ci.yml @@ -36,39 +36,6 @@ jobs: GOWORK: "off" run: make unitTests - attribute-store-integ: - name: Attribute Store integration - runs-on: ${{ github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && 'linux-dind-heavy' || 'ubuntu-latest' }} - timeout-minutes: 60 - defaults: - run: - working-directory: server - steps: - - uses: actions/checkout@v7 - - uses: actions/setup-go@v7 - with: - go-version-file: server/go.mod - cache-dependency-path: server/go.sum - - name: Start MySQL and Postgres - run: docker compose -f docker-compose/attribute-store-dependencies.yml up -d --wait - - name: Start Temporal and Cadence - run: docker compose -f docker-compose/ci-cadence-temporal-dependencies.yml up -d - - name: Attribute Store integration tests - env: - GOWORK: "off" - run: make attributeStoreIntegTests integrationCoverageDir=coverage-raw - - name: Upload integration coverage data - if: always() - uses: actions/upload-artifact@v7 - with: - name: server-integration-coverage-attribute-store - path: server/coverage-raw/ - if-no-files-found: ignore - retention-days: 1 - - name: Dump docker logs - if: always() - run: bash "$GITHUB_WORKSPACE/.github/scripts/dump-docker-logs.sh" - blob-store-integ: name: Blob Store integration runs-on: ${{ github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && 'linux-dind-heavy' || 'ubuntu-latest' }} @@ -214,7 +181,6 @@ jobs: integration-coverage: name: Integration coverage needs: - - attribute-store-integ - blob-store-integ - web-api-integ - temporal-integ diff --git a/cli/go.mod b/cli/go.mod index 9e51ca2f4..903c336e7 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -9,61 +9,103 @@ require ( github.com/superdurable/dex/protos/codec-server v0.0.0 github.com/superdurable/dex/web v0.0.0 go.temporal.io/sdk v1.47.1-superdurable.2 - golang.org/x/tools v0.44.0 + golang.org/x/tools v0.49.0 google.golang.org/grpc v1.82.1 google.golang.org/protobuf v1.36.11 ) require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/BurntSushi/toml v0.4.1 // indirect - github.com/apache/thrift v0.17.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.65 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect - github.com/aws/smithy-go v1.22.3 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/v12 v12.0.1 // indirect + github.com/apache/thrift v0.23.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.31 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect + github.com/aws/smithy-go v1.27.4 // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/coreos/go-oidc/v3 v3.5.0 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/databricks/databricks-sql-go v1.15.1 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgraph-io/ristretto/v2 v2.4.2 // indirect + github.com/dnephin/pflag v1.0.7 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/status v1.1.1 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/mock v1.7.0-rc.1 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.6 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/asmfmt v1.3.2 // indirect + github.com/klauspost/compress v1.19.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/marusama/semaphore/v2 v2.5.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect + github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect + github.com/mtibben/percent v0.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nexus-rpc/nexus-proto-annotations v0.1.0 // indirect github.com/nexus-rpc/sdk-go v0.6.0 // indirect github.com/opentracing/opentracing-go v1.1.0 // indirect github.com/pborman/uuid v1.2.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.21.1 // indirect @@ -72,6 +114,8 @@ require ( github.com/prometheus/procfs v0.16.0 // indirect github.com/redis/go-redis/v9 v9.22.0 // indirect github.com/robfig/cron v1.2.0 // indirect + github.com/rs/zerolog v1.28.0 // indirect + github.com/snowflakedb/gosnowflake/v2 v2.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/superdurable/dex/blob-cache-go v0.1.0 // indirect github.com/twmb/murmur3 v1.1.5 // indirect @@ -80,6 +124,14 @@ require ( github.com/uber-go/tally/v4 v4.1.1 // indirect github.com/uber/cadence-idl v0.0.0-20250616185004-cc6f52f87bc6 // indirect github.com/uber/tchannel-go v1.32.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.2.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/zeebo/xxh3 v1.1.0 // indirect + go.mongodb.org/mongo-driver/v2 v2.9.1 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.temporal.io/api v1.63.4 // indirect go.temporal.io/sdk/contrib/tally v0.1.0 // indirect go.temporal.io/sdk/contrib/tools/workflowcheck v0.0.0-20220331154559-fd0d1eb548eb // indirect @@ -92,21 +144,25 @@ require ( go.uber.org/thriftrw v1.29.2 // indirect go.uber.org/yarpc v1.60.0 // indirect go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect + golang.org/x/crypto v0.55.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.35.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/mod v0.40.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.11.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/gotestsum v1.8.2 // indirect honnef.co/go/tools v0.3.2 // indirect ) diff --git a/cli/go.sum b/cli/go.sum index f4c953c29..e2a809b5a 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -2626,9 +2626,23 @@ git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3p git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 h1:BWe8a+f/t+7KY7zH2mqygeUD0t8hNFXe08p1Pb3/jKE= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= @@ -2650,6 +2664,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -2678,14 +2693,19 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= @@ -2693,8 +2713,9 @@ github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlE github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/apache/thrift v0.23.0 h1:wKR6YnefQSEnxpEfmgTPuJibNG4bF0p2TK34tHLWi3s= +github.com/apache/thrift v0.23.0/go.mod h1:zPt6WxgvTOM6hF92y8C+MkEM5LMxZuk4JcQOiU4Esvs= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -2704,66 +2725,81 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= +github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= +github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= github.com/aws/aws-sdk-go-v2/config v1.18.14/go.mod h1:0pI6JQBHKwd0JnwAZS3VCapLKMO++UL2BOkWwyyzTnA= github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= +github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= +github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= github.com/aws/aws-sdk-go-v2/credentials v1.13.14/go.mod h1:85ckagDuzdIOnZRwws1eLKnymJs3ZM1QwVC1XcuNGOY= github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23/go.mod h1:mOtmAg65GT1HIL/HT/PynwPbS+UG0BgCZ6vhkPqnxWo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 h1:7ZFdtE1XEHH+58GZU4Mbhq6SO/UbColleDApOtlv3vo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5/go.mod h1:M/qt7xBBXqilBwNmrO1yiu0cywZwQx5aqtKpdJN9J2A= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30/go.mod h1:vsbq62AOBwQ1LJ/GWKFxX8beUEYeRp/Agitrxee2/qM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 h1:ugD6qzjYtB7zM5PN/ZIeaAIyefPaD82G8+SJopgvUpw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9/go.mod h1:YD0aYBWCrPENpHolhKw2XDlTIWae2GKXT1T4o6N6hiM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 h1:/90OR2XbSYfXucBMJ4U14wrjlfleq/0SB6dZDPncgmo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9/go.mod h1:dN/Of9/fNZet7UrQQ6kTDo/VSwKPIq94vjlU16bRARc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23/go.mod h1:9uPh+Hrz2Vn6oMnQYiUi/zbh3ovbnQk19YKINkQny44= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 h1:iEAeF6YC3l4FzlJPP9H3Ko1TXpdjdqWffxXjp8SY6uk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9/go.mod h1:kjsXoK23q9Z/tLBrckZLLyvjhZoS+AGrzqzUfEClvMM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 h1:Keso8lIOS+IzI2MkPZyK6G0LYcK3My2LQ+T5bxghEAY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5/go.mod h1:vADO6Jn+Rq4nDtfwNjhgR84qkZwiC6FqCaXdw/kYwjA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= github.com/aws/aws-sdk-go-v2/service/sso v1.12.3/go.mod h1:jtLIhd+V+lft6ktxpItycqHqiVXrPIRjWIsFIlzMriw= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3/go.mod h1:zVwRrfdSmbRZWkUkWjOItY7SOalnFnq/Yg2LVPqDjwc= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= github.com/aws/aws-sdk-go-v2/service/sts v1.18.4/go.mod h1:1mKZHLLpDMHTNSYPJ7qrcnCQdHCWsNQaT0xRvq2u80s= github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= +github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bazelbuild/rules_go v0.49.0/go.mod h1:Dhcz716Kqg1RHNWos+N6MlXNkjNP2EwZQ0LukRKJfMs= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -2834,13 +2870,34 @@ github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/Buvy github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= +github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/databricks/databricks-sql-go v1.15.1 h1:KUP/x8+jUTPbki8ChB4dJySB4TLhuQFhqRf2SocqnJc= +github.com/databricks/databricks-sql-go v1.15.1/go.mod h1:+aTNQK37V5esFw0jaMZPJ6GKveMcsnSNPCq3iRA3AOc= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 h1:BJzNEXT61x2k2yOq/l6XxmyI/oaVDSwA+SdqG/oc2jM= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0/go.mod h1:ceyJVgJAbNmkwc/2YMUNGuw2gd8nHZwZhP2xpN84VBg= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 h1:MWO7E0fFgSVvZLswQRYwtTchgklXWGDRWtAuxux//RE= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0/go.mod h1:Cr0N6/u4qDUvdbtqm4sVflN4ZXO8qdDcxEBhF5WB9PI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 h1:bRmxDGVuV9UURuyY6Z+dSBFHqGASWucEKWcZWb5ftBY= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0/go.mod h1:KqeZQ/C/GoKAqoGL97/KT3BwLoqsxgSl3qJjje1F7TU= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 h1:00FOtv6k45rJv/DPFlu94lRb4Bbx6TmzOdTS2nChLOI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0/go.mod h1:5/HsocwYCRUmO4sZKnLTBb/W+ItCdp3Z8lfssNdfqhM= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 h1:BAvQvVJTsavY2tlsELtDJiViDw16IuKd755nrsLndQQ= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0/go.mod h1:/1vEJKUPnrWx566kI/Ifl00GrhSyp798Ztl6rjtymCI= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 h1:zRPyxXJRhzG9w1dYqdS5SMhxq8LF1H/tARhOHPpHHSE= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0/go.mod h1:OaUVov84uK1IJz1gNk5TIoae0rj0vx+4N1qqRT88MdU= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 h1:Wb7PH5nuSCpPJNYORcomEGZ1jq1pIQaWMAY2puLFfeg= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0/go.mod h1:Z8JD951Nk66P1J8hL6YhkyMp1YAnrRzxE2JMTYRblxc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -2851,11 +2908,17 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -2908,6 +2971,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= @@ -2918,6 +2983,10 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/dejavu v0.3.2/go.mod h1:m+TzKY7ZEl09/a17t1593E4VYW8L1VaBXHzFZOIjGEY= @@ -2936,6 +3005,9 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= @@ -2985,9 +3057,14 @@ github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+Nbn github.com/goccmack/gocc v1.0.2/go.mod h1:LXX2tFVUggS/Zgx/ICPOr3MLyusuM7EcbfkPvNsjdO8= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -3003,8 +3080,10 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -3058,6 +3137,8 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= @@ -3065,6 +3146,8 @@ github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -3116,6 +3199,8 @@ github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkj github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -3185,14 +3270,22 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1ns github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -3255,18 +3348,20 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -3299,6 +3394,8 @@ github.com/marusama/semaphore/v2 v2.5.0/go.mod h1:z9nMiNUekt/LTpTUQdpp+4sJeYqUGp github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -3307,6 +3404,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -3318,7 +3417,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -3333,6 +3434,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -3348,6 +3451,7 @@ github.com/nexus-rpc/nexus-proto-annotations v0.1.0 h1:2fELd+9sqUtNu6Fg//pw8YFsx github.com/nexus-rpc/nexus-proto-annotations v0.1.0/go.mod h1:n3UjF1bPCW8llR8tHvbxJ+27yPWrhpo8w/Yg1IOuY0Y= github.com/nexus-rpc/sdk-go v0.6.0 h1:QRgnP2zTbxEbiyWG/aXH8uSC5LV/Mg1fqb19jb4DBlo= github.com/nexus-rpc/sdk-go v0.6.0/go.mod h1:FHdPfVQwRuJFZFTF0Y2GOAxCrbIBNrcPna9slkGKPYk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -3377,6 +3481,10 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -3474,7 +3582,10 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= @@ -3491,6 +3602,8 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snowflakedb/gosnowflake/v2 v2.2.0 h1:zm0fhoAknhZ+DZ9crMGbIrTxFZhS2yVlPbJ6EqjyWdE= +github.com/snowflakedb/gosnowflake/v2 v2.2.0/go.mod h1:poUMAfesYFh8piXMqKVPW304tekACzv1cfskxMdpikY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -3501,6 +3614,7 @@ github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -3568,9 +3682,19 @@ github.com/uber/tchannel-go v1.32.1 h1:0Pu5kdZceabAt7Rr4pUC4YRpMJkE/tTfReMZdlvDj github.com/uber/tchannel-go v1.32.1/go.mod h1:yT2EUp6YperZ0Tb/jwDX9gVEeiSG74r/L3CjF7zNJHs= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -3578,6 +3702,7 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= @@ -3589,6 +3714,8 @@ go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHH go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver/v2 v2.9.1 h1:jewiFs2m1/VOQp8qhFshX6hWZ+EAXDhZHXExAUMcOgQ= +go.mongodb.org/mongo-driver/v2 v2.9.1/go.mod h1:SHKN0IWkKmEVGHLjXnni6s4wPKX4v86FTgOeJJFuXcA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -3793,6 +3920,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -3841,8 +3969,9 @@ golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4 golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -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.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3869,8 +3998,9 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQz golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8= golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= @@ -3962,8 +4092,9 @@ golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -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/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -4026,6 +4157,7 @@ golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -4073,8 +4205,9 @@ golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -4100,6 +4233,7 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= @@ -4162,8 +4296,9 @@ golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -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/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -4227,12 +4362,14 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4302,8 +4439,9 @@ golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= @@ -4316,8 +4454,11 @@ golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3c golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw= golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 h1:ZUSxONxc981v7AW7QUg+I9WwZzSTTJ019ENBYr5pV/Q= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5/go.mod h1:LVehoXe41cL5SCVQilsV7Gg6BNG+Js6P9PhSbYTIUkQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -4360,6 +4501,8 @@ golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -4402,8 +4545,9 @@ golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -4496,6 +4640,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= @@ -4529,8 +4674,9 @@ golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -4543,6 +4689,7 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +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.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -5231,6 +5378,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -5255,6 +5403,10 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/gotestsum v1.8.2 h1:szU3TaSz8wMx/uG+w/A2+4JUPwH903YYaMI9yOOYAyI= +gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/cli/internal/dev/config_test.go b/cli/internal/dev/config_test.go index 0ac48b5c4..914208cae 100644 --- a/cli/internal/dev/config_test.go +++ b/cli/internal/dev/config_test.go @@ -52,6 +52,44 @@ func TestAttributeStoreConfigFlagLoadsStandardDexYAML(t *testing.T) { } } +func TestAttributeStoreConfigFlagLoadsWarehouseAndMongoDB(t *testing.T) { + configPath := filepath.Join(t.TempDir(), "attribute-store.yaml") + contents := []byte(`attributeStore: + stores: + lakehouse: + type: databricks + dsn: token:secret@workspace:443/sql/1.0/warehouses/id + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + warehouse: + type: snowflake + dsn: user:password@account/analytics/reporting + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + documents: + type: mongodb + dsn: mongodb://localhost:27017 + databaseName: analytics + collectionName: flow_attributes +`) + if err := os.WriteFile(configPath, contents, 0o600); err != nil { + t.Fatal(err) + } + cliConfig, err := parseConfig([]string{"--attribute-store-config", configPath}, &bytes.Buffer{}) + if err != nil { + t.Fatal(err) + } + attributeStore, err := cliConfig.loadAttributeStoreConfig() + if err != nil { + t.Fatal(err) + } + if attributeStore.Stores["lakehouse"].FlowIDColumn != "flow_id" || + attributeStore.Stores["warehouse"].Type != config.AttributeStoreTypeSnowflake || + attributeStore.Stores["documents"].CollectionName != "flow_attributes" { + t.Fatalf("unexpected Attribute Store config: %+v", attributeStore.Stores) + } +} + func TestAttributeStoreConfigRejectsUnknownFields(t *testing.T) { configPath := filepath.Join(t.TempDir(), "attribute-store.yaml") if err := os.WriteFile(configPath, []byte("attributeStore:\n unknown: true\n"), 0o600); err != nil { diff --git a/docs/content/primitives/attribute.mdx b/docs/content/primitives/attribute.mdx index e64d0521c..d5eefa89b 100644 --- a/docs/content/primitives/attribute.mdx +++ b/docs/content/primitives/attribute.mdx @@ -561,6 +561,12 @@ attributeStore: tableName: public.user_profiles ``` +The same configuration can target MySQL, Databricks, Snowflake, or MongoDB. +Create the destination first. Attribute Sync writes latest state asynchronously +and does not automatically backfill existing Flows. See +[Custom Attribute Store operations](/production/attribute-store) for target +contracts, type mappings, and retry behavior. + Start Dex Server with the configuration: ```bash diff --git a/docs/content/production/attribute-store.mdx b/docs/content/production/attribute-store.mdx index ebd3e8e7f..fb10a301f 100644 --- a/docs/content/production/attribute-store.mdx +++ b/docs/content/production/attribute-store.mdx @@ -4,8 +4,13 @@ title: Custom Attribute Store # Custom Attribute Store operations -Custom Attribute Store projects selected Flow Attribute writes into MySQL or -PostgreSQL. Dex never creates or migrates the destination table. +Custom Attribute Store projects selected Flow Attribute writes into PostgreSQL, +MySQL, Databricks, Snowflake, or MongoDB. Dex uses asynchronous, latest-state +writes for one Flow at a time. Delivery is attempted at least once, so every +destination write is idempotent. + +Dex never creates, migrates, or backfills a destination. Create the SQL table or +MongoDB collection before starting Dex. ## Configuration @@ -20,6 +25,21 @@ attributeStore: type: mysql dsn: user:password@tcp(host:3306)/database tableName: flow_attributes + lakehouse: + type: databricks + dsn: token:secret@workspace:443/sql/1.0/warehouses/warehouse-id + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + warehouse: + type: snowflake + dsn: user:password@account/analytics/reporting + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + documents: + type: mongodb + dsn: mongodb://user:password@host:27017 + databaseName: analytics + collectionName: flow_attributes schemaSyncInterval: 1m syncBatchSize: 100 syncAttemptTimeout: 30s @@ -31,60 +51,124 @@ attributeStore: totalDuration: 1h ``` -The Server connects, pings, and describes every configured table during startup. -One failure fails startup and closes already-opened pools. Every table must have -exactly one character-compatible primary key; Dex writes the Flow ID into the -discovered key. Any other **NOT NULL** column must have a default or generated -value so a partial insert can create a row. - -**tableName** accepts **table** or **schema.table** for PostgreSQL and **table** or -**database.table** for MySQL. Identifiers are parsed and quoted; values always use -SQL parameters. DSNs and Attribute payloads are not logged. - -## Schema refresh - -Each store refreshes independently. The one-minute default receives uniform -90–110% jitter every cycle. A successful describe atomically replaces the -immutable in-memory snapshot. A failure retains the previous snapshot and -retries after the next jittered interval. - -Adding nullable/defaulted columns is therefore discovered without restarting -Dex. Removing or changing columns may cause later mutations to be filtered or -retried, depending on whether validation or SQL execution detects the change. +Every store requires **type** and **dsn**. Dex never logs DSNs. SQL stores also +require **tableName**. MongoDB instead requires **databaseName** and +**collectionName**; SQL fields and MongoDB fields cannot be mixed. + +PostgreSQL and MySQL accept **table** or **schema.table**. Databricks and +Snowflake accept **table**, **schema.table**, or +**catalog-or-database.schema.table**. Missing parts use the connection's current +catalog or database and schema. Identifiers are parsed and quoted. Attribute +values always use driver parameters. + +## Startup contracts + +Dex connects, pings, and validates every destination during startup. One failure +fails startup and closes already-opened clients. + +For PostgreSQL and MySQL, each table must have exactly one character-compatible +primary key. Dex discovers that key and stores the Flow ID in it. This preserves +the existing configuration and behavior for these stores. + +For Databricks and Snowflake, **flowIdColumn** must name an existing, non-null, +non-generated string column. Values in that column must be logically unique. +Dex does not scan for duplicates, create a constraint, or rely on warehouse +primary-key enforcement. A SQL Warehouse must already be available for a +Databricks connection. + +Every other required SQL column must have a default or generated value. This +allows a partial insert to create a row. Attribute names match non-Flow-ID +columns exactly. + +For MongoDB, the configured collection must exist. Dex does not create the +collection, change its validator, or create indexes. + +## SQL writes and schema refresh + +PostgreSQL and MySQL retain their existing upsert statements. Databricks and +Snowflake execute one parameterized **MERGE** for each batch from one Flow. Dex +does not combine batches from different Flows and does not maintain a change +log. + +Each SQL store refreshes independently. The one-minute default receives uniform +90–110% jitter every cycle. A successful metadata query atomically replaces the +immutable in-memory schema snapshot. A failed query retains the previous +snapshot and retries after the next interval. MongoDB does not run a schema +refresh loop. + +Adding nullable or defaulted SQL columns is discovered without restarting Dex. +Removing or changing columns may cause later mutations to be filtered or +retried, depending on whether local validation or SQL execution detects the +change. + +### SQL type contract + +| Attribute value | PostgreSQL and MySQL | Databricks and Snowflake | +| --- | --- | --- | +| string | Character, varchar, or text; declared length is enforced | String, character, varchar, or text; declared length is enforced | +| int64 | Signed integer or scale-zero numeric; range and precision are enforced | Integer types or scale-zero decimal/number/fixed; range and precision are enforced | +| double | Floating or numeric | Floating types; finite values only | +| bool | PostgreSQL boolean; MySQL boolean, tinyint(1), or bit(1) | Boolean | +| SDK datetime | PostgreSQL timestamp with time zone; MySQL timestamp or datetime | Timestamp types; values are converted to UTC, including timestamps without a time zone | +| JSON object | JSON or JSONB after validation | VARIANT through the destination's native JSON parser | +| other object | PostgreSQL bytea or MySQL binary/varbinary/blob | Binary or varbinary | +| null | Nullable columns only | Nullable columns only | + +SDK datetime values may use RFC3339 strings or JSON epoch seconds. Dex rejects +oversized strings or binary values, out-of-range integers, excess decimal +precision, non-finite floating-point values, and invalid JSON. + +Missing columns, type mismatches, Flow ID writes, and nulls for required columns +are logged and filtered one field at a time. Valid fields in the same batch still +write. If every field is filtered, the Activity succeeds without executing SQL. + +## MongoDB document contract + +Each Flow maps to one document. The document **_id** is the Flow ID, and synced +Attributes are top-level fields: + +```json +{ + "_id": "customer-42", + "display_name": "Ada", + "profile": { "active": true }, + "score": 17 +} +``` -## Type contract +Dex uses an upsert with a partial field update. Attributes omitted from a batch +remain unchanged. When one batch contains the same Attribute more than once, +the last value wins. -- strings: character, varchar, or text, with declared length enforced -- **int64**: signed integer or scale-zero numeric, with range/precision enforced -- double: floating or numeric -- bool: PostgreSQL boolean; MySQL boolean, **tinyint(1)**, or **bit(1)** -- SDK datetime: RFC3339 or JSON epoch seconds; PostgreSQL timestamp with time zone, - MySQL timestamp or datetime -- JSON object: JSON/JSONB, after payload validation -- other object: PostgreSQL bytea or MySQL binary/varbinary/blob -- null: nullable columns only +Strings, 64-bit integers, finite doubles, booleans, and null use native BSON +values. JSON recursively becomes BSON documents, arrays, and scalar values; +integers that fit in 64 bits remain integers. Other encoded objects become BSON +binary values. -An Attribute name must exactly match a non-primary-key column. Missing columns, -type mismatches, primary-key writes, oversized values, and nulls for required -columns are logged and filtered without blocking valid fields in the batch. If -all fields are filtered, the Activity succeeds without SQL. +The Attribute name **_id**, names containing a period or NUL, and names beginning +with a dollar sign are logged and skipped. Other valid fields in the batch still +write. If every field is invalid, the Activity succeeds without contacting the +collection. ## Delivery and shutdown -SQL upserts are idempotent latest-state writes. Local Activity optimization is -limited to seven seconds. It uses the configured backoff intervals and -coefficient, but its attempts are bounded only by that seven-second total -window. Regular Activity attempts default to 30 seconds and a one-hour total -retry budget. Exhaustion skips that batch; there is no automatic replay or -backfill. +Attribute Sync stores latest state, not an event history. A later write may +repeat after an ambiguous failure. SQL upserts, warehouse merges, and MongoDB +upserts therefore use the Flow ID as their idempotency key. + +Local Activity optimization is limited to seven seconds. It uses the configured +backoff intervals and coefficient, but its attempts are bounded only by that +seven-second window. Regular Activity attempts default to 30 seconds and a +one-hour total retry budget. Exhaustion skips that batch. Dex does not +automatically replay old Attributes or backfill a newly configured store. Filtered writes, missing targets, and retry exhaustion emit error logs. CancelFlow and FailFlow are cooperative and may wait for active Steps, accepted -Temporal RPC Updates, and multiple one-hour batch budgets. Cancel returns a native -canceled error, so Temporal and Cadence retain the Canceled execution state. -Temporal rejects new RPC Updates after terminal finalization begins. Cadence -SetAttributes and RPC result signals accepted during cleanup are drained for their -Attribute writes; terminal processing does not start their next Steps. Terminate -and engine timeouts are hard stops and may leave the external table behind -workflow state. +Temporal RPC Updates, and multiple one-hour batch budgets. Cancel returns a +native canceled error, so Temporal and Cadence retain the Canceled execution +state. Temporal rejects new RPC Updates after terminal finalization begins. +Cadence SetAttributes and RPC result signals accepted during cleanup are drained +for their Attribute writes; terminal processing does not start their next Steps. +Terminate and engine timeouts are hard stops and may leave external storage +behind workflow state. diff --git a/docs/content/production/index.mdx b/docs/content/production/index.mdx index 8fd865b0f..417804212 100644 --- a/docs/content/production/index.mdx +++ b/docs/content/production/index.mdx @@ -15,5 +15,5 @@ Operate Dex applications and servers safely in production. configuration, storage, and Dex Web access control - [Metrics](/production/metrics) — built-in Dex Server metric catalog and Prometheus queries -- [Custom Attribute Store](/production/attribute-store) — MySQL/PostgreSQL - projection, schema contract, and retry semantics +- [Custom Attribute Store](/production/attribute-store) — SQL warehouses and + MongoDB projection, schema contracts, and retry semantics diff --git a/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/primitives/attribute.mdx b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/primitives/attribute.mdx index 5b353dfc8..42ee54332 100644 --- a/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/primitives/attribute.mdx +++ b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/primitives/attribute.mdx @@ -561,6 +561,10 @@ attributeStore: tableName: public.user_profiles ``` +同一配置也可以使用 MySQL、Databricks、Snowflake 或 MongoDB。请先创建目标。 +Attribute Sync 会异步写入最新状态,不会自动回填已有 Flow。目标契约、类型映射和 +重试行为请参阅[自定义 Attribute Store 运维](/production/attribute-store)。 + 使用这个配置启动 Dex Server: ```bash diff --git a/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/attribute-store.mdx b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/attribute-store.mdx new file mode 100644 index 000000000..7f0a34aae --- /dev/null +++ b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/attribute-store.mdx @@ -0,0 +1,155 @@ +--- +title: 自定义 Attribute Store +--- + +# 自定义 Attribute Store 运维 + +自定义 Attribute Store 会把选定的 Flow Attribute 写入 PostgreSQL、MySQL、 +Databricks、Snowflake 或 MongoDB。Dex 以异步方式逐个 Flow 写入最新状态, +并采用至少一次尝试语义,因此每种目标写入都具有幂等性。 + +Dex 不会创建、迁移或回填目标。请在启动 Dex 前创建 SQL 表或 MongoDB collection。 + +## 配置 + +```yaml +attributeStore: + stores: + reporting: + type: postgres + dsn: postgres://user:password@host/database + tableName: public.flow_attributes + operational: + type: mysql + dsn: user:password@tcp(host:3306)/database + tableName: flow_attributes + lakehouse: + type: databricks + dsn: token:secret@workspace:443/sql/1.0/warehouses/warehouse-id + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + warehouse: + type: snowflake + dsn: user:password@account/analytics/reporting + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + documents: + type: mongodb + dsn: mongodb://user:password@host:27017 + databaseName: analytics + collectionName: flow_attributes + schemaSyncInterval: 1m + syncBatchSize: 100 + syncAttemptTimeout: 30s + syncRetryPolicy: + initialInterval: 100ms + maximumInterval: 30s + backoffCoefficient: 2 + maximumAttempts: 0 + totalDuration: 1h +``` + +每个 store 都必须配置 **type** 和 **dsn**。Dex 绝不会记录 DSN。SQL store 还必须 +配置 **tableName**。MongoDB 则必须配置 **databaseName** 和 **collectionName**; +SQL 字段与 MongoDB 字段不能混用。 + +PostgreSQL 和 MySQL 接受 **table** 或 **schema.table**。Databricks 和 Snowflake +接受 **table**、**schema.table** 或 **catalog-or-database.schema.table**。省略的部分 +使用连接当前的 catalog 或 database 与 schema。Dex 会解析并引用标识符,Attribute +value 始终通过 driver 参数传递。 + +## 启动契约 + +Dex 在启动时连接、ping 并验证每个目标。任一目标失败都会导致启动失败,并关闭已经 +打开的 client。 + +对于 PostgreSQL 和 MySQL,每张表必须只有一个可存储字符串的 primary key。Dex 会 +发现该 key,并把 Flow ID 写入其中。这两类 store 的现有配置和行为保持不变。 + +对于 Databricks 和 Snowflake,**flowIdColumn** 必须指向已有、非空、非 generated +的字符串列。该列的值必须在逻辑上唯一。Dex 不会扫描重复值、创建约束,也不依赖 +warehouse 强制执行 primary key。Databricks 连接必须已有可用的 SQL Warehouse。 + +其他必填 SQL 列都必须有 default 或 generated value,这样 partial insert 才能创建 +新行。Attribute name 必须精确匹配非 Flow ID 列。 + +对于 MongoDB,配置的 collection 必须已经存在。Dex 不会创建 collection、修改 +validator 或创建 index。 + +## SQL 写入与 schema refresh + +PostgreSQL 和 MySQL 保留现有 upsert 语句。Databricks 和 Snowflake 对来自单个 Flow +的每个 batch 执行一次参数化 **MERGE**。Dex 不会合并不同 Flow 的 batch,也不维护 +change log。 + +每个 SQL store 独立 refresh。默认一分钟间隔的每轮会加入均匀的 90–110% jitter。 +metadata 查询成功后会原子替换内存中的 immutable schema snapshot;查询失败时继续 +使用旧 snapshot,并在下个间隔后重试。MongoDB 不运行 schema refresh loop。 + +新增 nullable 或有 default 的 SQL 列无需重启 Dex 即可被发现。删除或修改列后, +后续 mutation 可能在本地验证时被过滤,也可能在 SQL 执行失败后重试。 + +### SQL 类型契约 + +| Attribute value | PostgreSQL 与 MySQL | Databricks 与 Snowflake | +| --- | --- | --- | +| string | Character、varchar 或 text;检查声明长度 | String、character、varchar 或 text;检查声明长度 | +| int64 | 有符号整数或 scale 为零的 numeric;检查范围和精度 | 整数类型或 scale 为零的 decimal/number/fixed;检查范围和精度 | +| double | 浮点或 numeric | 浮点类型;只能写入有限值 | +| bool | PostgreSQL boolean;MySQL boolean、tinyint(1) 或 bit(1) | Boolean | +| SDK datetime | PostgreSQL timestamp with time zone;MySQL timestamp 或 datetime | Timestamp 类型;包括无时区 timestamp 在内都转换为 UTC | +| JSON object | 验证后的 JSON 或 JSONB | 通过目标原生 JSON parser 写入 VARIANT | +| 其他 object | PostgreSQL bytea 或 MySQL binary/varbinary/blob | Binary 或 varbinary | +| null | 仅 nullable 列 | 仅 nullable 列 | + +SDK datetime 可以使用 RFC3339 string 或 JSON epoch seconds。Dex 会拒绝过长的 string +或 binary、越界 integer、超过 decimal precision 的值、非有限浮点值和非法 JSON。 + +缺失列、类型不匹配、覆盖 Flow ID 的写入和对必填列写入 null 都会逐字段记录并过滤。 +同一 batch 中的有效字段仍会写入。如果所有字段都被过滤,Activity 成功结束且不执行 +SQL。 + +## MongoDB document 契约 + +每个 Flow 对应一个 document。document 的 **_id** 是 Flow ID,同步的 Attribute +作为顶层字段: + +```json +{ + "_id": "customer-42", + "display_name": "Ada", + "profile": { "active": true }, + "score": 17 +} +``` + +Dex 通过 upsert 执行 partial field update。batch 中未出现的 Attribute 保持不变。 +同一 batch 中多次出现同名 Attribute 时,最后一个值生效。 + +String、64-bit integer、有限 double、boolean 和 null 使用原生 BSON value。JSON 会 +递归转换为 BSON document、array 和 scalar;能够用 64-bit integer 表示的整数仍保持 +整数。其他 encoded object 保存为 BSON binary。 + +Attribute name **_id**、包含句点或 NUL 的 name,以及以美元符号开头的 name 会被 +记录并跳过。batch 中其他有效字段仍会写入。如果所有字段都无效,Activity 成功结束且 +不会访问 collection。 + +## 交付与关闭 + +Attribute Sync 保存最新状态,而不是 event history。发生不确定失败后,后续写入可能 +重复。因此 SQL upsert、warehouse merge 和 MongoDB upsert 都使用 Flow ID 作为幂等 key。 + +Local Activity 优化最多运行七秒。它使用配置的 backoff interval 和 coefficient,但 +attempt 只受七秒总窗口限制。Regular Activity 的单次 attempt 默认最多 30 秒,总重试 +预算默认一小时。预算耗尽后会跳过该 batch。Dex 不会自动重放旧 Attribute,也不会为 +新配置的 store 自动 backfill。 + +过滤写入、目标缺失和重试耗尽都会输出 error log。 + +CancelFlow 和 FailFlow 是 cooperative 操作,可能等待 active Step、已接受的 Temporal +RPC Update,以及多个一小时 batch budget。Cancel 返回原生 canceled error,因此 +Temporal 和 Cadence 都保留 Canceled execution state。terminal finalization 开始后, +Temporal 会拒绝新的 RPC Update。Cadence 在 cleanup 期间已经接受的 SetAttributes 和 +RPC result signal 会完成对应的 Attribute 写入,但 terminal processing 不会启动它们的 +next Step。Terminate 和 engine timeout 是 hard stop,可能使 external storage 落后于 +workflow state。 diff --git a/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/index.mdx b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/index.mdx index 7c399e6fe..43d2e2ad5 100644 --- a/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/index.mdx +++ b/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/production/index.mdx @@ -13,5 +13,5 @@ slug: /production Flow 代码版本控制 - [服务器运维](/production/server-operations) — 部署、配置、存储和 Dex Web 访问控制 - [指标](/production/metrics) — Dex Server 内建指标目录和 Prometheus 查询 -- [自定义 Attribute Store](/production/attribute-store) — MySQL/PostgreSQL 投影、 - schema 契约和重试语义 +- [自定义 Attribute Store](/production/attribute-store) — SQL warehouse 与 MongoDB + 投影、schema 契约和重试语义 diff --git a/protos/codec-server/go.mod b/protos/codec-server/go.mod index 00e362dad..4cc00a4b2 100644 --- a/protos/codec-server/go.mod +++ b/protos/codec-server/go.mod @@ -21,10 +21,10 @@ require ( github.com/nexus-rpc/nexus-proto-annotations v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect - golang.org/x/net v0.55.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/net v0.58.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.41.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/grpc v1.82.1 // indirect diff --git a/protos/codec-server/go.sum b/protos/codec-server/go.sum index a602cb536..a8697bc87 100644 --- a/protos/codec-server/go.sum +++ b/protos/codec-server/go.sum @@ -57,22 +57,22 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= diff --git a/server/Makefile b/server/Makefile index 358e7a16d..ec012b3aa 100644 --- a/server/Makefile +++ b/server/Makefile @@ -249,11 +249,16 @@ unitTests: @GOWORK=off go test -v ./config $$(GOWORK=off go list ./service/... | grep -v ./service/common/blobstore) @GOWORK=off go test -v ./service/common/blobstore -run '^TestDeterministicBlobObjectID' -# Requires SQL dependencies and covers both workflow backends in dedicated CI. -attributeStoreIntegTests: prepareIntegrationCoverage +# Requires MySQL, PostgreSQL, Temporal, and Cadence in label-gated CI. +attributeSyncIntegTests: prepareIntegrationCoverage @GOWORK=off go test $(integrationCoverageFlags) -v -tags=attributestore_integration ./service/common/attributestore -run '^TestMySQLAndPostgresAttributeStoreIntegration$$' -timeout 5m $(integrationCoverageArgs) @GOWORK=off go test $(integrationCoverageFlags) -v -tags=attributestore_integration ./integ -run '^TestAttributeSync' -timeout 10m -temporalHostPort=$(temporalHostPort) $(integrationCoverageArgs) +# Requires MongoDB and covers both workflow backends in label-gated CI. +mongodbAttributeStoreIntegTests: prepareIntegrationCoverage + @GOWORK=off go test $(integrationCoverageFlags) -v -tags=attributestore_integration ./service/common/attributestore -run '^TestMongoDBAttributeStoreIntegration$$' -timeout 5m $(integrationCoverageArgs) + @GOWORK=off go test $(integrationCoverageFlags) -v -tags=attributestore_integration ./integ -run '^TestMongoDBAttributeSync' -timeout 10m -temporalHostPort=$(temporalHostPort) $(integrationCoverageArgs) + blobStoreIntegTests: prepareIntegrationCoverage @GOWORK=off go test $(integrationCoverageFlags) -v ./service/common/blobstore -run '^(TestBlobStoreIntegration|TestLocalBlobStore|TestS3AttributeBlobCache)' -timeout 5m $(integrationCoverageArgs) diff --git a/server/cmd/server/go.mod b/server/cmd/server/go.mod index c5210218a..3bde113a9 100644 --- a/server/cmd/server/go.mod +++ b/server/cmd/server/go.mod @@ -12,56 +12,98 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/BurntSushi/toml v0.4.1 // indirect - github.com/apache/thrift v0.17.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.65 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect - github.com/aws/smithy-go v1.22.3 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/v12 v12.0.1 // indirect + github.com/apache/thrift v0.23.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.31 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect + github.com/aws/smithy-go v1.27.4 // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/coreos/go-oidc/v3 v3.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/databricks/databricks-sql-go v1.15.1 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgraph-io/ristretto/v2 v2.4.2 // indirect + github.com/dnephin/pflag v1.0.7 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/status v1.1.1 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/mock v1.7.0-rc.1 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.7.6 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/asmfmt v1.3.2 // indirect + github.com/klauspost/compress v1.19.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/marusama/semaphore/v2 v2.5.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect + github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect + github.com/mtibben/percent v0.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nexus-rpc/nexus-proto-annotations v0.1.0 // indirect github.com/nexus-rpc/sdk-go v0.6.0 // indirect github.com/opentracing/opentracing-go v1.1.0 // indirect github.com/pborman/uuid v1.2.1 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.21.1 // indirect @@ -70,7 +112,9 @@ require ( github.com/prometheus/procfs v0.16.0 // indirect github.com/redis/go-redis/v9 v9.22.0 // indirect github.com/robfig/cron v1.2.0 // indirect + github.com/rs/zerolog v1.28.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/snowflakedb/gosnowflake/v2 v2.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/superdurable/dex/blob-cache-go v0.1.0 // indirect github.com/twmb/murmur3 v1.1.5 // indirect @@ -79,6 +123,14 @@ require ( github.com/uber-go/tally/v4 v4.1.1 // indirect github.com/uber/cadence-idl v0.0.0-20250616185004-cc6f52f87bc6 // indirect github.com/uber/tchannel-go v1.32.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.2.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/zeebo/xxh3 v1.1.0 // indirect + go.mongodb.org/mongo-driver/v2 v2.9.1 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.temporal.io/api v1.63.4 // indirect go.temporal.io/sdk v1.47.1-superdurable.2 // indirect go.temporal.io/sdk/contrib/tally v0.1.0 // indirect @@ -92,23 +144,27 @@ require ( go.uber.org/thriftrw v1.29.2 // indirect go.uber.org/yarpc v1.60.0 // indirect go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect + golang.org/x/crypto v0.55.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.35.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/mod v0.40.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.44.0 // indirect + golang.org/x/tools v0.49.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/gotestsum v1.8.2 // indirect honnef.co/go/tools v0.3.2 // indirect ) diff --git a/server/cmd/server/go.sum b/server/cmd/server/go.sum index 7d32b2d3b..7eee46007 100644 --- a/server/cmd/server/go.sum +++ b/server/cmd/server/go.sum @@ -2626,9 +2626,23 @@ git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3p git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 h1:BWe8a+f/t+7KY7zH2mqygeUD0t8hNFXe08p1Pb3/jKE= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= @@ -2650,6 +2664,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -2678,14 +2693,19 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= @@ -2693,8 +2713,9 @@ github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlE github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/apache/thrift v0.23.0 h1:wKR6YnefQSEnxpEfmgTPuJibNG4bF0p2TK34tHLWi3s= +github.com/apache/thrift v0.23.0/go.mod h1:zPt6WxgvTOM6hF92y8C+MkEM5LMxZuk4JcQOiU4Esvs= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -2704,66 +2725,81 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= +github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= +github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= github.com/aws/aws-sdk-go-v2/config v1.18.14/go.mod h1:0pI6JQBHKwd0JnwAZS3VCapLKMO++UL2BOkWwyyzTnA= github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= +github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= +github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= github.com/aws/aws-sdk-go-v2/credentials v1.13.14/go.mod h1:85ckagDuzdIOnZRwws1eLKnymJs3ZM1QwVC1XcuNGOY= github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23/go.mod h1:mOtmAg65GT1HIL/HT/PynwPbS+UG0BgCZ6vhkPqnxWo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 h1:7ZFdtE1XEHH+58GZU4Mbhq6SO/UbColleDApOtlv3vo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5/go.mod h1:M/qt7xBBXqilBwNmrO1yiu0cywZwQx5aqtKpdJN9J2A= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30/go.mod h1:vsbq62AOBwQ1LJ/GWKFxX8beUEYeRp/Agitrxee2/qM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 h1:ugD6qzjYtB7zM5PN/ZIeaAIyefPaD82G8+SJopgvUpw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9/go.mod h1:YD0aYBWCrPENpHolhKw2XDlTIWae2GKXT1T4o6N6hiM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 h1:/90OR2XbSYfXucBMJ4U14wrjlfleq/0SB6dZDPncgmo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9/go.mod h1:dN/Of9/fNZet7UrQQ6kTDo/VSwKPIq94vjlU16bRARc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23/go.mod h1:9uPh+Hrz2Vn6oMnQYiUi/zbh3ovbnQk19YKINkQny44= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 h1:iEAeF6YC3l4FzlJPP9H3Ko1TXpdjdqWffxXjp8SY6uk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9/go.mod h1:kjsXoK23q9Z/tLBrckZLLyvjhZoS+AGrzqzUfEClvMM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 h1:Keso8lIOS+IzI2MkPZyK6G0LYcK3My2LQ+T5bxghEAY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5/go.mod h1:vADO6Jn+Rq4nDtfwNjhgR84qkZwiC6FqCaXdw/kYwjA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= github.com/aws/aws-sdk-go-v2/service/sso v1.12.3/go.mod h1:jtLIhd+V+lft6ktxpItycqHqiVXrPIRjWIsFIlzMriw= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3/go.mod h1:zVwRrfdSmbRZWkUkWjOItY7SOalnFnq/Yg2LVPqDjwc= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= github.com/aws/aws-sdk-go-v2/service/sts v1.18.4/go.mod h1:1mKZHLLpDMHTNSYPJ7qrcnCQdHCWsNQaT0xRvq2u80s= github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= +github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bazelbuild/rules_go v0.49.0/go.mod h1:Dhcz716Kqg1RHNWos+N6MlXNkjNP2EwZQ0LukRKJfMs= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -2834,15 +2870,36 @@ github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/Buvy github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= +github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/databricks/databricks-sql-go v1.15.1 h1:KUP/x8+jUTPbki8ChB4dJySB4TLhuQFhqRf2SocqnJc= +github.com/databricks/databricks-sql-go v1.15.1/go.mod h1:+aTNQK37V5esFw0jaMZPJ6GKveMcsnSNPCq3iRA3AOc= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 h1:BJzNEXT61x2k2yOq/l6XxmyI/oaVDSwA+SdqG/oc2jM= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0/go.mod h1:ceyJVgJAbNmkwc/2YMUNGuw2gd8nHZwZhP2xpN84VBg= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 h1:MWO7E0fFgSVvZLswQRYwtTchgklXWGDRWtAuxux//RE= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0/go.mod h1:Cr0N6/u4qDUvdbtqm4sVflN4ZXO8qdDcxEBhF5WB9PI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 h1:bRmxDGVuV9UURuyY6Z+dSBFHqGASWucEKWcZWb5ftBY= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0/go.mod h1:KqeZQ/C/GoKAqoGL97/KT3BwLoqsxgSl3qJjje1F7TU= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 h1:00FOtv6k45rJv/DPFlu94lRb4Bbx6TmzOdTS2nChLOI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0/go.mod h1:5/HsocwYCRUmO4sZKnLTBb/W+ItCdp3Z8lfssNdfqhM= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 h1:BAvQvVJTsavY2tlsELtDJiViDw16IuKd755nrsLndQQ= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0/go.mod h1:/1vEJKUPnrWx566kI/Ifl00GrhSyp798Ztl6rjtymCI= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 h1:zRPyxXJRhzG9w1dYqdS5SMhxq8LF1H/tARhOHPpHHSE= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0/go.mod h1:OaUVov84uK1IJz1gNk5TIoae0rj0vx+4N1qqRT88MdU= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 h1:Wb7PH5nuSCpPJNYORcomEGZ1jq1pIQaWMAY2puLFfeg= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0/go.mod h1:Z8JD951Nk66P1J8hL6YhkyMp1YAnrRzxE2JMTYRblxc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -2853,11 +2910,17 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -2910,6 +2973,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= @@ -2920,6 +2985,10 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/dejavu v0.3.2/go.mod h1:m+TzKY7ZEl09/a17t1593E4VYW8L1VaBXHzFZOIjGEY= @@ -2938,6 +3007,9 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= @@ -2987,9 +3059,14 @@ github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+Nbn github.com/goccmack/gocc v1.0.2/go.mod h1:LXX2tFVUggS/Zgx/ICPOr3MLyusuM7EcbfkPvNsjdO8= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -3005,8 +3082,10 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -3060,6 +3139,8 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= @@ -3067,6 +3148,8 @@ github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -3118,6 +3201,8 @@ github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkj github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -3187,14 +3272,22 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1ns github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -3257,18 +3350,20 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -3301,6 +3396,8 @@ github.com/marusama/semaphore/v2 v2.5.0/go.mod h1:z9nMiNUekt/LTpTUQdpp+4sJeYqUGp github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -3309,6 +3406,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -3320,7 +3419,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -3335,6 +3436,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -3350,6 +3453,7 @@ github.com/nexus-rpc/nexus-proto-annotations v0.1.0 h1:2fELd+9sqUtNu6Fg//pw8YFsx github.com/nexus-rpc/nexus-proto-annotations v0.1.0/go.mod h1:n3UjF1bPCW8llR8tHvbxJ+27yPWrhpo8w/Yg1IOuY0Y= github.com/nexus-rpc/sdk-go v0.6.0 h1:QRgnP2zTbxEbiyWG/aXH8uSC5LV/Mg1fqb19jb4DBlo= github.com/nexus-rpc/sdk-go v0.6.0/go.mod h1:FHdPfVQwRuJFZFTF0Y2GOAxCrbIBNrcPna9slkGKPYk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -3379,6 +3483,10 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -3476,7 +3584,10 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -3495,6 +3606,8 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snowflakedb/gosnowflake/v2 v2.2.0 h1:zm0fhoAknhZ+DZ9crMGbIrTxFZhS2yVlPbJ6EqjyWdE= +github.com/snowflakedb/gosnowflake/v2 v2.2.0/go.mod h1:poUMAfesYFh8piXMqKVPW304tekACzv1cfskxMdpikY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -3505,6 +3618,7 @@ github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -3574,9 +3688,19 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -3584,6 +3708,7 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= @@ -3595,6 +3720,8 @@ go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHH go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver/v2 v2.9.1 h1:jewiFs2m1/VOQp8qhFshX6hWZ+EAXDhZHXExAUMcOgQ= +go.mongodb.org/mongo-driver/v2 v2.9.1/go.mod h1:SHKN0IWkKmEVGHLjXnni6s4wPKX4v86FTgOeJJFuXcA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -3799,6 +3926,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -3847,8 +3975,9 @@ golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4 golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -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.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3875,8 +4004,9 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQz golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8= golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= @@ -3968,8 +4098,9 @@ golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -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/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -4032,6 +4163,7 @@ golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -4079,8 +4211,9 @@ golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -4106,6 +4239,7 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= @@ -4168,8 +4302,9 @@ golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -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/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -4233,12 +4368,14 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4308,8 +4445,9 @@ golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= @@ -4322,8 +4460,11 @@ golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3c golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw= golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 h1:ZUSxONxc981v7AW7QUg+I9WwZzSTTJ019ENBYr5pV/Q= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5/go.mod h1:LVehoXe41cL5SCVQilsV7Gg6BNG+Js6P9PhSbYTIUkQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -4366,6 +4507,8 @@ golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -4408,8 +4551,9 @@ golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -4502,6 +4646,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= @@ -4535,8 +4680,9 @@ golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -4549,6 +4695,7 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +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.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -5237,6 +5384,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -5261,6 +5409,10 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/gotestsum v1.8.2 h1:szU3TaSz8wMx/uG+w/A2+4JUPwH903YYaMI9yOOYAyI= +gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/server/config/attribute_store_test.go b/server/config/attribute_store_test.go index 9c673e583..cf7d393eb 100644 --- a/server/config/attribute_store_test.go +++ b/server/config/attribute_store_test.go @@ -56,6 +56,137 @@ attributeStore: require.NoError(t, cfg.AttributeStore.Validate()) } +func TestAttributeStoreConfigNewBackends(t *testing.T) { + path := writeTestConfig(t, ` +attributeStore: + stores: + lakehouse: + type: databricks + dsn: token:secret@workspace:443/sql/1.0/warehouses/id + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + warehouse: + type: snowflake + dsn: user:password@account/analytics/reporting + tableName: analytics.reporting.flow_attributes + flowIdColumn: flow_id + documents: + type: mongodb + dsn: mongodb://localhost:27017 + databaseName: analytics + collectionName: flow_attributes +`) + cfg, err := NewConfig(path) + require.NoError(t, err) + require.NoError(t, cfg.AttributeStore.Validate()) + require.Equal(t, AttributeStoreTypeDatabricks, cfg.AttributeStore.Stores["lakehouse"].Type) + require.Equal(t, "flow_id", cfg.AttributeStore.Stores["warehouse"].FlowIDColumn) + require.Equal(t, "flow_attributes", cfg.AttributeStore.Stores["documents"].CollectionName) +} + +func TestAttributeStoreConfigBackendSpecificValidation(t *testing.T) { + tests := []struct { + name string + store AttributeStoreConfigEntry + error string + }{ + { + name: "unsupported", + store: AttributeStoreConfigEntry{Type: "unknown", DSN: "dsn", TableName: "table"}, + error: "unsupported type", + }, + { + name: "missing dsn", + store: AttributeStoreConfigEntry{Type: AttributeStoreTypeSnowflake, TableName: "table", FlowIDColumn: "flow_id"}, + error: "requires dsn", + }, + { + name: "missing table", + store: AttributeStoreConfigEntry{Type: AttributeStoreTypeSnowflake, DSN: "dsn", FlowIDColumn: "flow_id"}, + error: "requires tableName", + }, + { + name: "databricks flow id", + store: AttributeStoreConfigEntry{Type: AttributeStoreTypeDatabricks, DSN: "dsn", TableName: "table"}, + error: "flowIdColumn", + }, + { + name: "mongodb target", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypeMongoDB, DSN: "dsn", DatabaseName: "database", + }, + error: "collectionName", + }, + { + name: "mongodb sql fields", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypeMongoDB, DSN: "dsn", DatabaseName: "database", + CollectionName: "collection", TableName: "table", + }, + error: "does not accept tableName", + }, + { + name: "sql mongo fields", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypePostgres, DSN: "dsn", TableName: "table", DatabaseName: "database", + }, + error: "does not accept databaseName", + }, + { + name: "postgres flow id", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypePostgres, DSN: "dsn", TableName: "table", FlowIDColumn: "flow_id", + }, + error: "only warehouses", + }, + { + name: "warehouse table has too many parts", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypeSnowflake, DSN: "dsn", + TableName: "one.two.three.four", FlowIDColumn: "flow_id", + }, + error: "at most 3", + }, + { + name: "relational table has too many parts", + store: AttributeStoreConfigEntry{ + Type: AttributeStoreTypePostgres, DSN: "dsn", TableName: "one.two.three", + }, + error: "at most 2", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := (AttributeStoreConfig{Stores: map[string]AttributeStoreConfigEntry{ + "target": test.store, + }}).Validate() + require.ErrorContains(t, err, test.error) + }) + } +} + +func TestAttributeStoreConfigQualifiedTableNames(t *testing.T) { + tests := []struct { + storeType AttributeStoreType + tableName string + }{ + {AttributeStoreTypePostgres, "flow_attributes"}, + {AttributeStoreTypeMySQL, "reporting.flow_attributes"}, + {AttributeStoreTypeDatabricks, "flow_attributes"}, + {AttributeStoreTypeSnowflake, "reporting.flow_attributes"}, + {AttributeStoreTypeDatabricks, "analytics.reporting.flow_attributes"}, + } + for _, test := range tests { + store := AttributeStoreConfigEntry{Type: test.storeType, DSN: "dsn", TableName: test.tableName} + if test.storeType.IsWarehouse() { + store.FlowIDColumn = "flow_id" + } + require.NoError(t, (AttributeStoreConfig{Stores: map[string]AttributeStoreConfigEntry{ + "target": store, + }}).Validate(), test.tableName) + } +} + func TestBlobStoreDefaults(t *testing.T) { path := writeTestConfig(t, "{}\n") cfg, err := NewConfig(path) diff --git a/server/config/config.go b/server/config/config.go index 3c0465d1c..3f46147a9 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -14,6 +14,7 @@ import ( "fmt" "log" "os" + "strings" "time" "github.com/superdurable/dex/gen/dexpb" @@ -107,8 +108,11 @@ const ( ) const ( - AttributeStoreTypeMySQL AttributeStoreType = "mysql" - AttributeStoreTypePostgres AttributeStoreType = "postgres" + AttributeStoreTypeMySQL AttributeStoreType = "mysql" + AttributeStoreTypePostgres AttributeStoreType = "postgres" + AttributeStoreTypeDatabricks AttributeStoreType = "databricks" + AttributeStoreTypeSnowflake AttributeStoreType = "snowflake" + AttributeStoreTypeMongoDB AttributeStoreType = "mongodb" ) var defaultHeadlessFailoverStatusCodes = [...]codes.Code{ @@ -238,11 +242,11 @@ type ( AttributeStoreType string AttributeStoreConfig struct { - // Stores maps FlowConfig names to immutable SQL destinations. Default empty disables Attribute synchronization. + // Stores maps FlowConfig names to immutable external destinations. Default empty disables Attribute synchronization. Stores map[string]AttributeStoreConfigEntry `yaml:"stores"` - // SchemaSyncInterval refreshes table schemas. Default 1m. Each interval receives uniform ±10% jitter. + // SchemaSyncInterval refreshes SQL table schemas. Default 1m. Each interval receives uniform ±10% jitter. SchemaSyncInterval time.Duration `yaml:"schemaSyncInterval"` - // SyncBatchSize caps contiguous items per SQL upsert. Default 100. Must be positive after defaults. + // SyncBatchSize caps contiguous items per Attribute Store upsert. Default 100. Must be positive after defaults. SyncBatchSize int `yaml:"syncBatchSize"` // SyncAttemptTimeout caps each regular Activity attempt. Default 30s. Must be positive after defaults. SyncAttemptTimeout time.Duration `yaml:"syncAttemptTimeout"` @@ -251,12 +255,18 @@ type ( } AttributeStoreConfigEntry struct { - // Type selects mysql or postgres. Default empty is invalid for a configured entry. Immutable after startup. + // Type selects mysql, postgres, databricks, snowflake, or mongodb. Default empty is invalid for a configured entry. Immutable after startup. Type AttributeStoreType `yaml:"type"` - // DSN is the driver connection string. Default empty is invalid. It may contain credentials and is never logged. + // DSN is the driver connection string or MongoDB URI. Default empty is invalid. It may contain credentials and is never logged. DSN string `yaml:"dsn"` - // TableName selects table or schema.table/database.table. Default empty is invalid. Immutable after startup. + // TableName selects the SQL target. MySQL and PostgreSQL accept up to two parts; warehouses accept up to three. Default empty is invalid for SQL stores. Immutable after startup. TableName string `yaml:"tableName"` + // FlowIDColumn stores Flow IDs in Databricks and Snowflake. Default empty is invalid for warehouse stores. Immutable after startup. + FlowIDColumn string `yaml:"flowIdColumn"` + // DatabaseName selects the MongoDB database. Default empty is invalid for MongoDB stores. Immutable after startup. + DatabaseName string `yaml:"databaseName"` + // CollectionName selects the existing MongoDB collection. Default empty is invalid for MongoDB stores. Immutable after startup. + CollectionName string `yaml:"collectionName"` } StorageStatus string @@ -828,16 +838,73 @@ func (c AttributeStoreConfig) Validate() error { if name == "" { return fmt.Errorf("attribute store name must not be empty") } - if store.Type != AttributeStoreTypeMySQL && store.Type != AttributeStoreTypePostgres { + if !store.Type.IsSupported() { return fmt.Errorf("attribute store %q has unsupported type %q", name, store.Type) } - if store.DSN == "" || store.TableName == "" { - return fmt.Errorf("attribute store %q requires dsn and tableName", name) + if store.DSN == "" { + return fmt.Errorf("attribute store %q requires dsn", name) + } + if store.Type == AttributeStoreTypeMongoDB { + if store.DatabaseName == "" || store.CollectionName == "" { + return fmt.Errorf("attribute store %q requires databaseName and collectionName", name) + } + if store.TableName != "" || store.FlowIDColumn != "" { + return fmt.Errorf("attribute store %q mongodb configuration does not accept tableName or flowIdColumn", name) + } + continue + } + if store.TableName == "" { + return fmt.Errorf("attribute store %q requires tableName", name) + } + if err := validateAttributeStoreTableName(store.Type, store.TableName); err != nil { + return fmt.Errorf("attribute store %q has invalid tableName: %w", name, err) + } + if store.DatabaseName != "" || store.CollectionName != "" { + return fmt.Errorf("attribute store %q SQL configuration does not accept databaseName or collectionName", name) + } + if store.Type.IsWarehouse() && store.FlowIDColumn == "" { + return fmt.Errorf("attribute store %q requires flowIdColumn", name) + } + if !store.Type.IsWarehouse() && store.FlowIDColumn != "" { + return fmt.Errorf("attribute store %q only warehouses accept flowIdColumn", name) + } + } + return nil +} + +func validateAttributeStoreTableName(storeType AttributeStoreType, tableName string) error { + parts := strings.Split(tableName, ".") + maximumParts := 2 + if storeType.IsWarehouse() { + maximumParts = 3 + } + if len(parts) > maximumParts { + return fmt.Errorf("must contain at most %d identifiers", maximumParts) + } + for _, part := range parts { + if part == "" || strings.IndexByte(part, 0) >= 0 { + return fmt.Errorf("contains an invalid identifier") } } return nil } +// IsSupported reports whether the Attribute Store type has a built-in backend. +func (t AttributeStoreType) IsSupported() bool { + switch t { + case AttributeStoreTypeMySQL, AttributeStoreTypePostgres, AttributeStoreTypeDatabricks, + AttributeStoreTypeSnowflake, AttributeStoreTypeMongoDB: + return true + default: + return false + } +} + +// IsWarehouse reports whether the store uses an explicitly configured Flow ID column. +func (t AttributeStoreType) IsWarehouse() bool { + return t == AttributeStoreTypeDatabricks || t == AttributeStoreTypeSnowflake +} + func (c CleanupStrategy) CronSchedule() (string, error) { strategyType := c.CleanupStrategyType if strategyType == "" { diff --git a/server/config/development.yaml b/server/config/development.yaml index ac031595d..1b078acb1 100644 --- a/server/config/development.yaml +++ b/server/config/development.yaml @@ -80,6 +80,21 @@ blobStore: # type: mysql # dsn: user:password@tcp(localhost:3306)/operational # tableName: flow_attributes +# lakehouse: +# type: databricks +# dsn: token:secret@workspace:443/sql/1.0/warehouses/warehouse-id +# tableName: analytics.reporting.flow_attributes +# flowIdColumn: flow_id +# warehouse: +# type: snowflake +# dsn: user:password@account/analytics/reporting +# tableName: analytics.reporting.flow_attributes +# flowIdColumn: flow_id +# documents: +# type: mongodb +# dsn: mongodb://user:password@localhost:27017 +# databaseName: analytics +# collectionName: flow_attributes # schemaSyncInterval: 1m # syncBatchSize: 100 # syncAttemptTimeout: 30s diff --git a/server/docker-compose/mongodb-attribute-store-dependency.yml b/server/docker-compose/mongodb-attribute-store-dependency.yml new file mode 100644 index 000000000..6aba8e8c2 --- /dev/null +++ b/server/docker-compose/mongodb-attribute-store-dependency.yml @@ -0,0 +1,15 @@ +# Copyright (c) 2026 Super Durable, Inc. +# +# Licensed under the Sustainable Use License 1.0. +# See LICENSE for details. + +services: + attribute-mongodb: + image: mongo:8.0 + ports: + - "57017:27017" + healthcheck: + test: ["CMD", "mongosh", "--quiet", "--eval", "db.runCommand({ ping: 1 }).ok"] + interval: 2s + timeout: 5s + retries: 30 diff --git a/server/go.mod b/server/go.mod index ef347d280..0fbbb3844 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,19 +5,21 @@ go 1.26.0 replace go.temporal.io/sdk => github.com/superdurable/temporal-sdk-go v1.47.1-superdurable.2 require ( - github.com/aws/aws-sdk-go-v2 v1.36.3 - github.com/aws/aws-sdk-go-v2/config v1.29.12 - github.com/aws/aws-sdk-go-v2/credentials v1.17.65 - github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 + github.com/aws/aws-sdk-go-v2 v1.43.0 + github.com/aws/aws-sdk-go-v2/config v1.32.31 + github.com/aws/aws-sdk-go-v2/credentials v1.19.30 + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 + github.com/databricks/databricks-sql-go v1.15.1 github.com/go-sql-driver/mysql v1.9.3 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.6 github.com/prometheus/client_golang v1.21.1 + github.com/snowflakedb/gosnowflake/v2 v2.2.0 github.com/stretchr/testify v1.11.1 github.com/superdurable/dex/blob-cache-go v0.1.0 github.com/uber-go/tally/v4 v4.1.1 github.com/uber/cadence-idl v0.0.0-20250616185004-cc6f52f87bc6 - github.com/urfave/cli v1.22.5 + go.mongodb.org/mongo-driver/v2 v2.9.1 go.temporal.io/sdk v1.47.1-superdurable.2 go.temporal.io/sdk/contrib/tally v0.1.0 go.temporal.io/sdk/contrib/tools/workflowcheck v0.0.0-20220331154559-fd0d1eb548eb @@ -28,56 +30,108 @@ require ( ) require ( - github.com/aws/smithy-go v1.22.3 + github.com/aws/smithy-go v1.27.4 github.com/redis/go-redis/v9 v9.22.0 go.temporal.io/api v1.63.4 - golang.org/x/sync v0.20.0 + golang.org/x/sync v0.22.0 ) require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/apache/arrow-go/v18 v18.4.0 // indirect + github.com/apache/arrow/go/v12 v12.0.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect + github.com/coreos/go-oidc/v3 v3.5.0 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 // indirect + github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 // indirect github.com/dgraph-io/ristretto/v2 v2.4.2 // indirect + github.com/dnephin/pflag v1.0.7 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/asmfmt v1.3.2 // indirect + github.com/klauspost/compress v1.19.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect + github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect + github.com/mtibben/percent v0.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nexus-rpc/nexus-proto-annotations v0.1.0 // indirect github.com/nexus-rpc/sdk-go v0.6.0 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/net v0.55.0 // indirect + github.com/rs/zerolog v1.28.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.2.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/zeebo/xxh3 v1.1.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + golang.org/x/crypto v0.55.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 // indirect + golang.org/x/term v0.45.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect + gotest.tools/gotestsum v1.8.2 // indirect ) require ( - github.com/BurntSushi/toml v0.4.1 // indirect - github.com/apache/thrift v0.17.0 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/apache/thrift v0.23.0 // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -93,7 +147,6 @@ require ( github.com/prometheus/common v0.63.0 github.com/prometheus/procfs v0.16.0 // indirect github.com/robfig/cron v1.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/twmb/murmur3 v1.1.5 // indirect github.com/uber-go/mapdecode v1.0.0 // indirect @@ -105,14 +158,14 @@ require ( go.uber.org/multierr v1.6.0 // indirect go.uber.org/net/metrics v1.3.0 // indirect go.uber.org/thriftrw v1.29.2 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.35.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/mod v0.40.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.44.0 // indirect + golang.org/x/tools v0.49.0 // indirect google.golang.org/grpc v1.82.1 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/server/go.sum b/server/go.sum index 7d32b2d3b..e2a809b5a 100644 --- a/server/go.sum +++ b/server/go.sum @@ -2626,9 +2626,23 @@ git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3p git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= git.wow.st/gmp/jni v0.0.0-20210610011705-34026c7e22d0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 h1:BWe8a+f/t+7KY7zH2mqygeUD0t8hNFXe08p1Pb3/jKE= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= @@ -2650,6 +2664,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -2678,14 +2693,19 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= @@ -2693,8 +2713,9 @@ github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlE github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/apache/thrift v0.23.0 h1:wKR6YnefQSEnxpEfmgTPuJibNG4bF0p2TK34tHLWi3s= +github.com/apache/thrift v0.23.0/go.mod h1:zPt6WxgvTOM6hF92y8C+MkEM5LMxZuk4JcQOiU4Esvs= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -2704,66 +2725,81 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= +github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= +github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= github.com/aws/aws-sdk-go-v2/config v1.18.14/go.mod h1:0pI6JQBHKwd0JnwAZS3VCapLKMO++UL2BOkWwyyzTnA= github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= +github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= +github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= github.com/aws/aws-sdk-go-v2/credentials v1.13.14/go.mod h1:85ckagDuzdIOnZRwws1eLKnymJs3ZM1QwVC1XcuNGOY= github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23/go.mod h1:mOtmAg65GT1HIL/HT/PynwPbS+UG0BgCZ6vhkPqnxWo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 h1:7ZFdtE1XEHH+58GZU4Mbhq6SO/UbColleDApOtlv3vo= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5/go.mod h1:M/qt7xBBXqilBwNmrO1yiu0cywZwQx5aqtKpdJN9J2A= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30/go.mod h1:vsbq62AOBwQ1LJ/GWKFxX8beUEYeRp/Agitrxee2/qM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9 h1:ugD6qzjYtB7zM5PN/ZIeaAIyefPaD82G8+SJopgvUpw= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.9/go.mod h1:YD0aYBWCrPENpHolhKw2XDlTIWae2GKXT1T4o6N6hiM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9 h1:/90OR2XbSYfXucBMJ4U14wrjlfleq/0SB6dZDPncgmo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.9/go.mod h1:dN/Of9/fNZet7UrQQ6kTDo/VSwKPIq94vjlU16bRARc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23/go.mod h1:9uPh+Hrz2Vn6oMnQYiUi/zbh3ovbnQk19YKINkQny44= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9 h1:iEAeF6YC3l4FzlJPP9H3Ko1TXpdjdqWffxXjp8SY6uk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.9/go.mod h1:kjsXoK23q9Z/tLBrckZLLyvjhZoS+AGrzqzUfEClvMM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5 h1:Keso8lIOS+IzI2MkPZyK6G0LYcK3My2LQ+T5bxghEAY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.5/go.mod h1:vADO6Jn+Rq4nDtfwNjhgR84qkZwiC6FqCaXdw/kYwjA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= github.com/aws/aws-sdk-go-v2/service/sso v1.12.3/go.mod h1:jtLIhd+V+lft6ktxpItycqHqiVXrPIRjWIsFIlzMriw= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3/go.mod h1:zVwRrfdSmbRZWkUkWjOItY7SOalnFnq/Yg2LVPqDjwc= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= github.com/aws/aws-sdk-go-v2/service/sts v1.18.4/go.mod h1:1mKZHLLpDMHTNSYPJ7qrcnCQdHCWsNQaT0xRvq2u80s= github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= +github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bazelbuild/rules_go v0.49.0/go.mod h1:Dhcz716Kqg1RHNWos+N6MlXNkjNP2EwZQ0LukRKJfMs= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -2834,15 +2870,34 @@ github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/Buvy github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= +github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/databricks/databricks-sql-go v1.15.1 h1:KUP/x8+jUTPbki8ChB4dJySB4TLhuQFhqRf2SocqnJc= +github.com/databricks/databricks-sql-go v1.15.1/go.mod h1:+aTNQK37V5esFw0jaMZPJ6GKveMcsnSNPCq3iRA3AOc= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0 h1:BJzNEXT61x2k2yOq/l6XxmyI/oaVDSwA+SdqG/oc2jM= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_amd64 v1.0.0/go.mod h1:ceyJVgJAbNmkwc/2YMUNGuw2gd8nHZwZhP2xpN84VBg= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0 h1:MWO7E0fFgSVvZLswQRYwtTchgklXWGDRWtAuxux//RE= +github.com/databricks/databricks-sql-kernel-bindings/lib/darwin_arm64 v1.0.0/go.mod h1:Cr0N6/u4qDUvdbtqm4sVflN4ZXO8qdDcxEBhF5WB9PI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0 h1:bRmxDGVuV9UURuyY6Z+dSBFHqGASWucEKWcZWb5ftBY= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_amd64 v1.0.0/go.mod h1:KqeZQ/C/GoKAqoGL97/KT3BwLoqsxgSl3qJjje1F7TU= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0 h1:00FOtv6k45rJv/DPFlu94lRb4Bbx6TmzOdTS2nChLOI= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm v1.0.0/go.mod h1:5/HsocwYCRUmO4sZKnLTBb/W+ItCdp3Z8lfssNdfqhM= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0 h1:BAvQvVJTsavY2tlsELtDJiViDw16IuKd755nrsLndQQ= +github.com/databricks/databricks-sql-kernel-bindings/lib/linux_arm64 v1.0.0/go.mod h1:/1vEJKUPnrWx566kI/Ifl00GrhSyp798Ztl6rjtymCI= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0 h1:zRPyxXJRhzG9w1dYqdS5SMhxq8LF1H/tARhOHPpHHSE= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_amd64 v1.0.0/go.mod h1:OaUVov84uK1IJz1gNk5TIoae0rj0vx+4N1qqRT88MdU= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0 h1:Wb7PH5nuSCpPJNYORcomEGZ1jq1pIQaWMAY2puLFfeg= +github.com/databricks/databricks-sql-kernel-bindings/lib/windows_arm64 v1.0.0/go.mod h1:Z8JD951Nk66P1J8hL6YhkyMp1YAnrRzxE2JMTYRblxc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -2853,11 +2908,17 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -2910,6 +2971,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= @@ -2920,6 +2983,10 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/dejavu v0.3.2/go.mod h1:m+TzKY7ZEl09/a17t1593E4VYW8L1VaBXHzFZOIjGEY= @@ -2938,6 +3005,9 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= @@ -2987,9 +3057,14 @@ github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+Nbn github.com/goccmack/gocc v1.0.2/go.mod h1:LXX2tFVUggS/Zgx/ICPOr3MLyusuM7EcbfkPvNsjdO8= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -3005,8 +3080,10 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -3060,6 +3137,8 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= @@ -3067,6 +3146,8 @@ github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -3118,6 +3199,8 @@ github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkj github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -3187,14 +3270,22 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1ns github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -3257,18 +3348,20 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -3301,6 +3394,8 @@ github.com/marusama/semaphore/v2 v2.5.0/go.mod h1:z9nMiNUekt/LTpTUQdpp+4sJeYqUGp github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -3309,6 +3404,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -3320,7 +3417,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -3335,6 +3434,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -3350,6 +3451,7 @@ github.com/nexus-rpc/nexus-proto-annotations v0.1.0 h1:2fELd+9sqUtNu6Fg//pw8YFsx github.com/nexus-rpc/nexus-proto-annotations v0.1.0/go.mod h1:n3UjF1bPCW8llR8tHvbxJ+27yPWrhpo8w/Yg1IOuY0Y= github.com/nexus-rpc/sdk-go v0.6.0 h1:QRgnP2zTbxEbiyWG/aXH8uSC5LV/Mg1fqb19jb4DBlo= github.com/nexus-rpc/sdk-go v0.6.0/go.mod h1:FHdPfVQwRuJFZFTF0Y2GOAxCrbIBNrcPna9slkGKPYk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -3379,6 +3481,10 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -3476,10 +3582,11 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -3495,6 +3602,8 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snowflakedb/gosnowflake/v2 v2.2.0 h1:zm0fhoAknhZ+DZ9crMGbIrTxFZhS2yVlPbJ6EqjyWdE= +github.com/snowflakedb/gosnowflake/v2 v2.2.0/go.mod h1:poUMAfesYFh8piXMqKVPW304tekACzv1cfskxMdpikY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -3505,6 +3614,7 @@ github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -3572,11 +3682,19 @@ github.com/uber/tchannel-go v1.32.1 h1:0Pu5kdZceabAt7Rr4pUC4YRpMJkE/tTfReMZdlvDj github.com/uber/tchannel-go v1.32.1/go.mod h1:yT2EUp6YperZ0Tb/jwDX9gVEeiSG74r/L3CjF7zNJHs= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= -github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -3584,6 +3702,7 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= @@ -3595,6 +3714,8 @@ go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHH go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver/v2 v2.9.1 h1:jewiFs2m1/VOQp8qhFshX6hWZ+EAXDhZHXExAUMcOgQ= +go.mongodb.org/mongo-driver/v2 v2.9.1/go.mod h1:SHKN0IWkKmEVGHLjXnni6s4wPKX4v86FTgOeJJFuXcA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -3799,6 +3920,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -3847,8 +3969,9 @@ golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4 golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -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.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3875,8 +3998,9 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQz golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8= golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= @@ -3968,8 +4092,9 @@ golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -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/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -4032,6 +4157,7 @@ golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -4079,8 +4205,9 @@ golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -4106,6 +4233,7 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= @@ -4168,8 +4296,9 @@ golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -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/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -4233,12 +4362,14 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4308,8 +4439,9 @@ golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= @@ -4322,8 +4454,11 @@ golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3c golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw= golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 h1:ZUSxONxc981v7AW7QUg+I9WwZzSTTJ019ENBYr5pV/Q= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5/go.mod h1:LVehoXe41cL5SCVQilsV7Gg6BNG+Js6P9PhSbYTIUkQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -4366,6 +4501,8 @@ golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -4408,8 +4545,9 @@ golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -4502,6 +4640,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= @@ -4535,8 +4674,9 @@ golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -4549,6 +4689,7 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +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.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -5237,6 +5378,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -5261,6 +5403,10 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/gotestsum v1.8.2 h1:szU3TaSz8wMx/uG+w/A2+4JUPwH903YYaMI9yOOYAyI= +gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= +gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/server/integ/README.md b/server/integ/README.md index fa021b55d..5eb1ee57c 100644 --- a/server/integ/README.md +++ b/server/integ/README.md @@ -5,15 +5,34 @@ This directory contains integration tests for the Dex service. * [How to run](../CONTRIBUTING.md#how-to-run-server-or-integration-test) * The integration tests are written without Dex SDKs. The workflows are implemented in REST API routes. e.g. [this basic workflow](./workflow/basic/routers.go) -Custom Attribute Store integration uses isolated MySQL and PostgreSQL services: +Attribute Sync integration uses isolated MySQL and PostgreSQL services: ```shell docker compose -f docker-compose/attribute-store-dependencies.yml up -d --wait -make attributeStoreIntegTests +make attributeSyncIntegTests ``` -The suite covers startup schema contracts, both SQL upsert dialects, filtering, -schema refresh recovery, and additive columns. +The suite covers startup schema contracts, both relational upsert dialects, +filtering, schema refresh recovery, additive SQL columns, and Attribute Sync +happy paths on both stores with Temporal and Cadence. In pull requests, the +**Attribute Sync CI** workflow runs only when the **ci:attribute-sync** label is +present. Regular **Server CI** does not start MySQL or PostgreSQL. + +MongoDB Attribute Sync runs in a separate label-gated job because its container +and workflow coverage are comparatively expensive: + +```shell +docker compose -f docker-compose/mongodb-attribute-store-dependency.yml up -d --wait +make mongodbAttributeStoreIntegTests +``` + +The MongoDB suite covers startup collection contracts, upserts, partial updates, +filtering, and Attribute Sync happy paths on Temporal and Cadence. In pull +requests, the **Attribute Sync CI** workflow runs this suite with the relational +suite when the **ci:attribute-sync** label is present. + +Databricks and Snowflake use local SQL contract tests because the suite does not +connect to cloud warehouses. In-process tests use an isolated local Blob Store with the default 1 KiB offload threshold. S3-specific tests replace it with MinIO. diff --git a/server/integ/attribute_sync_integ_test.go b/server/integ/attribute_sync_integ_test.go index da0975b76..ce4e1f665 100644 --- a/server/integ/attribute_sync_integ_test.go +++ b/server/integ/attribute_sync_integ_test.go @@ -25,6 +25,9 @@ import ( "github.com/superdurable/dex/gen/dexpb" "github.com/superdurable/dex/integ/workflow/signal" "github.com/superdurable/dex/service" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) func TestAttributeSyncTemporal(t *testing.T) { @@ -41,6 +44,20 @@ func TestAttributeSyncCadence(t *testing.T) { doTestAttributeSync(t, service.BackendTypeCadence) } +func TestMongoDBAttributeSyncTemporal(t *testing.T) { + if !*temporalIntegTest { + t.Skip() + } + doTestAttributeSyncMongoDB(t, service.BackendTypeTemporal) +} + +func TestMongoDBAttributeSyncCadence(t *testing.T) { + if !*cadenceIntegTest { + t.Skip() + } + doTestAttributeSyncMongoDB(t, service.BackendTypeCadence) +} + func TestAttributeSyncFlowTimeoutTemporal(t *testing.T) { if !*temporalIntegTest { t.Skip() @@ -287,6 +304,95 @@ func doTestAttributeSync(t *testing.T, backendType service.BackendType) { } } +func doTestAttributeSyncMongoDB(t *testing.T, backendType service.BackendType) { + ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second) + defer cancel() + + mongodbDSN := os.Getenv("DEX_ATTRIBUTE_STORE_MONGODB_DSN") + if mongodbDSN == "" { + mongodbDSN = "mongodb://127.0.0.1:57017" + } + mongodbClient, err := mongo.Connect(options.Client().ApplyURI(mongodbDSN)) + require.NoError(t, err) + require.NoError(t, mongodbClient.Ping(ctx, nil)) + t.Cleanup(func() { require.NoError(t, mongodbClient.Disconnect(context.Background())) }) + databaseName := "dex" + collectionName := "flow_attributes_" + strings.ReplaceAll(newRequestID(), "-", "") + require.NoError(t, mongodbClient.Database(databaseName).CreateCollection(ctx, collectionName)) + t.Cleanup(func() { + require.NoError(t, mongodbClient.Database(databaseName).Collection(collectionName).Drop(context.Background())) + }) + + runtime := startDexService(t, DexServiceTestConfig{ + BackendType: backendType, + S3TestThreshold: 1, + BlobCacheDirectory: t.TempDir(), + AttributeStore: config.AttributeStoreConfig{ + Stores: map[string]config.AttributeStoreConfigEntry{ + "documents": { + Type: config.AttributeStoreTypeMongoDB, + DSN: mongodbDSN, + DatabaseName: databaseName, + CollectionName: collectionName, + }, + }, + SyncBatchSize: 2, + }, + }) + workerTarget := startWorker(t, signal.NewHandler()) + flowID := "attribute-sync-mongodb-" + newRequestID() + _, err = runtime.FlowClient.StartFlow(ctx, &dexpb.StartFlowRequest{ + RequestId: newRequestID(), + FlowId: flowID, + FlowType: "attribute-sync-mongodb", + FlowTimeoutSeconds: 30, + FlowStartOptions: &dexpb.FlowStartOptions{ + Attributes: []*dexpb.AttributeWrite{ + syncedStringAttribute("message", strings.Repeat("cache-backed-string", 8)), + syncedObjectAttribute("document", `{"source":"blob-cache","sequence":1}`), + }, + FlowConfigOverride: &dexpb.FlowConfig{ + AttributeStoreNames: &dexpb.AttributeStoreNames{Names: []string{"documents"}}, + WorkerTarget: workerTarget, + }, + }, + }) + require.NoError(t, err) + _, err = runtime.FlowClient.SetAttributes(ctx, &dexpb.SetAttributesRequest{ + RequestId: newRequestID(), + FlowId: flowID, + Attributes: []*dexpb.AttributeWrite{ + syncedStringAttribute("message", "terminal-signal"), + }, + }) + require.NoError(t, err) + _, err = runtime.FlowClient.StopFlow(ctx, &dexpb.StopFlowRequest{ + FlowId: flowID, + StopType: dexpb.StopType_STOP_TYPE_CANCEL, + }) + require.NoError(t, err) + response, err := runtime.FlowClient.WaitForFlow(ctx, &dexpb.WaitForFlowRequest{FlowId: flowID}) + require.NoError(t, err) + require.Equal(t, dexpb.FlowStatus_FLOW_STATUS_CANCELED, response.GetFlowStatus()) + + collection := mongodbClient.Database(databaseName).Collection(collectionName) + require.Eventually(t, func() bool { + var document struct { + Message string `bson:"message"` + Document struct { + Source string `bson:"source"` + Sequence int64 `bson:"sequence"` + } `bson:"document"` + } + findErr := collection.FindOne(ctx, bson.D{{Key: "_id", Value: flowID}}).Decode(&document) + if findErr != nil { + return false + } + return document.Message == "terminal-signal" && + document.Document.Source == "blob-cache" && document.Document.Sequence == int64(1) + }, 5*time.Second, 20*time.Millisecond) +} + func doTestAttributeSyncFlowTimeout(t *testing.T, backendType service.BackendType) { ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second) defer cancel() diff --git a/server/service/common/attributestore/manager.go b/server/service/common/attributestore/manager.go index 650d690bd..d06dbc23a 100644 --- a/server/service/common/attributestore/manager.go +++ b/server/service/common/attributestore/manager.go @@ -10,22 +10,13 @@ package attributestore import ( "context" - "database/sql" - "encoding/json" "errors" "fmt" - "math" "math/rand" - "sort" - "strconv" "strings" "sync" - "sync/atomic" "time" - "unicode/utf8" - _ "github.com/go-sql-driver/mysql" - _ "github.com/jackc/pgx/v5/stdlib" "github.com/superdurable/dex/config" "github.com/superdurable/dex/gen/dexpb" "github.com/superdurable/dex/service/common/log" @@ -36,46 +27,23 @@ import ( type Manager struct { cfg *config.AttributeStoreConfig logger log.Logger - entries map[string]*storeEntry + entries map[string]store cancel context.CancelFunc wg sync.WaitGroup } -type storeEntry struct { - name string - cfg config.AttributeStoreConfigEntry - db *sql.DB - table tableReference - schema atomic.Pointer[tableSchema] - logger log.Logger +type store interface { + writeBatch(context.Context, string, []*dexpb.AttributeSyncItem) error + close() error } -type tableReference struct { - namespace string - table string +type schemaRefreshingStore interface { + refreshSchema(context.Context) error } -type tableSchema struct { - reference tableReference - primaryKey string - columns map[string]columnSchema -} - -type columnSchema struct { - name string - dataType string - columnType string - nullable bool - characterMaximum *int64 - numericPrecision *int64 - numericScale *int64 - hasDefault bool - generated bool -} - -type filteredValue struct { - column columnSchema - value any +type secretRedactedError struct { + source error + secret string } func NewManager( @@ -93,12 +61,12 @@ func NewManager( manager := &Manager{ cfg: cfg, logger: logger, - entries: make(map[string]*storeEntry, len(cfg.Stores)), + entries: make(map[string]store, len(cfg.Stores)), cancel: cancel, } if err := manager.openEntries(managerCtx); err != nil { cancel() - if closeErr := manager.closeDatabases(); closeErr != nil { + if closeErr := manager.closeStores(); closeErr != nil { return nil, errors.Join(err, closeErr) } return nil, err @@ -109,272 +77,80 @@ func NewManager( func (m *Manager) openEntries(ctx context.Context) error { group, groupCtx := errgroup.WithContext(ctx) - opened := make(chan *storeEntry, len(m.cfg.Stores)) + type namedStore struct { + name string + store store + } + opened := make(chan namedStore, len(m.cfg.Stores)) for name, entryCfg := range m.cfg.Stores { name := name entryCfg := entryCfg group.Go(func() error { - entry, err := openStoreEntry(groupCtx, name, entryCfg, m.logger) + entry, err := openStore(groupCtx, entryCfg, m.logger.WithTags(tag.AttributeStore(name))) if err != nil { return fmt.Errorf("initialize Attribute Store %q: %w", name, err) } - opened <- entry + opened <- namedStore{name: name, store: entry} return nil }) } err := group.Wait() close(opened) for entry := range opened { - m.entries[entry.name] = entry + m.entries[entry.name] = entry.store } return err } -func openStoreEntry( - ctx context.Context, - name string, - cfg config.AttributeStoreConfigEntry, - logger log.Logger, -) (*storeEntry, error) { - driverName := "pgx" - if cfg.Type == config.AttributeStoreTypeMySQL { - driverName = "mysql" - } - database, err := sql.Open(driverName, cfg.DSN) - if err != nil { - return nil, fmt.Errorf("open connection: %w", err) - } - entry := &storeEntry{ - name: name, - cfg: cfg, - db: database, - logger: logger.WithTags(tag.AttributeStore(name)), - } - if err := database.PingContext(ctx); err != nil { - if closeErr := database.Close(); closeErr != nil { - return nil, errors.Join(fmt.Errorf("ping database: %w", err), closeErr) - } - return nil, fmt.Errorf("ping database: %w", err) - } - reference, err := entry.resolveTableReference(ctx) - if err != nil { - if closeErr := database.Close(); closeErr != nil { - return nil, errors.Join(err, closeErr) - } - return nil, err +func openStore(ctx context.Context, cfg config.AttributeStoreConfigEntry, logger log.Logger) (store, error) { + var ( + entry store + err error + ) + if cfg.Type == config.AttributeStoreTypeMongoDB { + entry, err = openMongoStore(ctx, cfg, logger) + } else { + entry, err = openSQLStore(ctx, cfg, logger) } - entry.table = reference - snapshot, err := entry.describe(ctx) if err != nil { - if closeErr := database.Close(); closeErr != nil { - return nil, errors.Join(err, closeErr) - } - return nil, err + return nil, redactStorageSecret(err, cfg.DSN) } - entry.schema.Store(snapshot) return entry, nil } -func (e *storeEntry) resolveTableReference(ctx context.Context) (tableReference, error) { - parts := strings.Split(e.cfg.TableName, ".") - if len(parts) > 2 || len(parts) == 0 { - return tableReference{}, fmt.Errorf("tableName must be table or namespace.table") - } - for _, part := range parts { - if part == "" || strings.IndexByte(part, 0) >= 0 { - return tableReference{}, fmt.Errorf("tableName contains an invalid identifier") - } - } - if len(parts) == 2 { - return tableReference{namespace: parts[0], table: parts[1]}, nil - } - var namespace string - query := "SELECT current_schema()" - if e.cfg.Type == config.AttributeStoreTypeMySQL { - query = "SELECT DATABASE()" - } - if err := e.db.QueryRowContext(ctx, query).Scan(&namespace); err != nil { - return tableReference{}, fmt.Errorf("resolve table namespace: %w", err) - } - if namespace == "" { - return tableReference{}, fmt.Errorf("database has no active namespace") - } - return tableReference{namespace: namespace, table: parts[0]}, nil -} - -func (e *storeEntry) describe(ctx context.Context) (*tableSchema, error) { - columns, err := e.describeColumns(ctx) - if err != nil { - return nil, err - } - primaryKeys, err := e.describePrimaryKeys(ctx) - if err != nil { - return nil, err - } - if len(primaryKeys) != 1 { - return nil, fmt.Errorf("table must have exactly one primary-key column") - } - primaryKey, found := columns[primaryKeys[0]] - if !found { - return nil, fmt.Errorf("primary-key column was not described") - } - if !primaryKey.acceptsString() { - return nil, fmt.Errorf("primary-key column %q cannot store FlowID strings", primaryKey.name) - } - for name, column := range columns { - if name == primaryKey.name { - continue - } - if !column.nullable && !column.hasDefault && !column.generated { - return nil, fmt.Errorf("column %q prevents partial row inserts", name) - } - } - return &tableSchema{ - reference: e.table, - primaryKey: primaryKey.name, - columns: columns, - }, nil -} - -func (e *storeEntry) describeColumns(ctx context.Context) (map[string]columnSchema, error) { - query := `SELECT column_name, data_type, udt_name, is_nullable, -character_maximum_length, numeric_precision, numeric_scale, column_default, -is_identity, is_generated -FROM information_schema.columns -WHERE table_schema = $1 AND table_name = $2 -ORDER BY ordinal_position` - if e.cfg.Type == config.AttributeStoreTypeMySQL { - query = `SELECT column_name, data_type, column_type, is_nullable, -character_maximum_length, numeric_precision, numeric_scale, column_default, -extra, generation_expression -FROM information_schema.columns -WHERE table_schema = ? AND table_name = ? -ORDER BY ordinal_position` - } - rows, err := e.db.QueryContext(ctx, query, e.table.namespace, e.table.table) - if err != nil { - return nil, fmt.Errorf("describe columns: %w", err) - } - defer func() { - if closeErr := rows.Close(); closeErr != nil { - e.logger.Error("close Attribute Store describe rows", tag.Error(closeErr)) - } - }() - columns := map[string]columnSchema{} - for rows.Next() { - column, scanErr := scanColumn(rows, e.cfg.Type) - if scanErr != nil { - return nil, scanErr - } - columns[column.name] = column +func redactStorageSecret(err error, secret string) error { + if err == nil || secret == "" || !strings.Contains(err.Error(), secret) { + return err } - if err := rows.Err(); err != nil { - return nil, fmt.Errorf("iterate described columns: %w", err) - } - if len(columns) == 0 { - return nil, fmt.Errorf("table does not exist or has no columns") - } - return columns, nil -} - -func scanColumn(rows *sql.Rows, storeType config.AttributeStoreType) (columnSchema, error) { - var ( - column columnSchema - dataType, columnType, nullable string - characterMaximum, precision, scale sql.NullInt64 - defaultValue, generatedA, generatedB sql.NullString - ) - if err := rows.Scan( - &column.name, - &dataType, - &columnType, - &nullable, - &characterMaximum, - &precision, - &scale, - &defaultValue, - &generatedA, - &generatedB, - ); err != nil { - return columnSchema{}, fmt.Errorf("scan described column: %w", err) - } - column.dataType = strings.ToLower(dataType) - column.columnType = strings.ToLower(columnType) - column.nullable = strings.EqualFold(nullable, "YES") - column.characterMaximum = nullableInt64(characterMaximum) - column.numericPrecision = nullableInt64(precision) - column.numericScale = nullableInt64(scale) - column.hasDefault = defaultValue.Valid - if storeType == config.AttributeStoreTypePostgres { - column.generated = strings.EqualFold(generatedA.String, "YES") || - strings.EqualFold(generatedB.String, "ALWAYS") - } else { - column.generated = generatedA.String != "" || generatedB.String != "" - } - return column, nil + return &secretRedactedError{source: err, secret: secret} } -func nullableInt64(value sql.NullInt64) *int64 { - if !value.Valid { - return nil - } - return &value.Int64 +func (e *secretRedactedError) Error() string { + return strings.ReplaceAll(e.source.Error(), e.secret, "[REDACTED]") } -func (e *storeEntry) describePrimaryKeys(ctx context.Context) ([]string, error) { - query := `SELECT kcu.column_name -FROM information_schema.table_constraints tc -JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - AND tc.table_name = kcu.table_name -WHERE tc.constraint_type = 'PRIMARY KEY' - AND tc.table_schema = $1 AND tc.table_name = $2 -ORDER BY kcu.ordinal_position` - if e.cfg.Type == config.AttributeStoreTypeMySQL { - query = `SELECT column_name -FROM information_schema.key_column_usage -WHERE constraint_name = 'PRIMARY' AND table_schema = ? AND table_name = ? -ORDER BY ordinal_position` - } - rows, err := e.db.QueryContext(ctx, query, e.table.namespace, e.table.table) - if err != nil { - return nil, fmt.Errorf("describe primary key: %w", err) - } - defer func() { - if closeErr := rows.Close(); closeErr != nil { - e.logger.Error("close Attribute Store primary-key rows", tag.Error(closeErr)) - } - }() - var keys []string - for rows.Next() { - var key string - if err := rows.Scan(&key); err != nil { - return nil, fmt.Errorf("scan primary key: %w", err) - } - keys = append(keys, key) - } - if err := rows.Err(); err != nil { - return nil, fmt.Errorf("iterate primary keys: %w", err) - } - return keys, nil +func (e *secretRedactedError) Unwrap() error { + return e.source } func (m *Manager) startRefreshers(ctx context.Context) { - for _, entry := range m.entries { - entry := entry + for name, entry := range m.entries { + refresher, refreshesSchema := entry.(schemaRefreshingStore) + if !refreshesSchema { + continue + } m.wg.Add(1) go func() { defer m.wg.Done() - entry.refreshLoop(ctx, m.cfg.EffectiveSchemaSyncInterval()) + m.refreshLoop(ctx, name, refresher) }() } } -func (e *storeEntry) refreshLoop(ctx context.Context, interval time.Duration) { +func (m *Manager) refreshLoop(ctx context.Context, name string, entry schemaRefreshingStore) { random := rand.New(rand.NewSource(time.Now().UnixNano())) for { - timer := time.NewTimer(jitterInterval(interval, random.Float64())) + timer := time.NewTimer(jitterInterval(m.cfg.EffectiveSchemaSyncInterval(), random.Float64())) select { case <-ctx.Done(): if !timer.Stop() { @@ -383,12 +159,9 @@ func (e *storeEntry) refreshLoop(ctx context.Context, interval time.Duration) { return case <-timer.C: } - snapshot, err := e.describe(ctx) - if err != nil { - e.logger.Error("refresh Attribute Store schema", tag.Error(err)) - continue + if err := entry.refreshSchema(ctx); err != nil { + m.logger.Error("refresh Attribute Store schema", tag.AttributeStore(name), tag.Error(err)) } - e.schema.Store(snapshot) } } @@ -412,326 +185,16 @@ func (m *Manager) WriteBatch(ctx context.Context, input *dexpb.SyncAttributeBatc return entry.writeBatch(ctx, input.GetFlowId(), input.GetItems()) } -func (e *storeEntry) writeBatch( - ctx context.Context, - flowID string, - items []*dexpb.AttributeSyncItem, -) error { - snapshot := e.schema.Load() - if snapshot == nil { - return fmt.Errorf("Attribute Store schema is unavailable") - } - latest := make(map[string]*dexpb.Value, len(items)) - for _, item := range items { - if item == nil { - continue - } - latest[item.GetKey()] = item.GetValue() - } - filtered := make(map[string]filteredValue, len(latest)) - for name, value := range latest { - column, found := snapshot.columns[name] - if !found { - e.logger.Error("skip Attribute Store item: column does not exist", tag.AttributeName(name)) - continue - } - if name == snapshot.primaryKey { - e.logger.Error("skip Attribute Store item: primary key is immutable", tag.AttributeName(name)) - continue - } - converted, err := column.convert(value, e.cfg.Type) - if err != nil { - e.logger.Error("skip incompatible Attribute Store item", tag.AttributeName(name), tag.Error(err)) - continue - } - filtered[name] = filteredValue{column: column, value: converted} - } - if len(filtered) == 0 { - return nil - } - query, arguments := e.buildUpsert(snapshot, flowID, filtered) - if _, err := e.db.ExecContext(ctx, query, arguments...); err != nil { - return fmt.Errorf("execute Attribute Store upsert: %w", err) - } - return nil -} - -func (e *storeEntry) buildUpsert( - snapshot *tableSchema, - flowID string, - values map[string]filteredValue, -) (string, []any) { - columnNames := make([]string, 0, len(values)) - for name := range values { - columnNames = append(columnNames, name) - } - sort.Strings(columnNames) - quotedTable := e.quoteIdentifier(snapshot.reference.namespace) + "." + - e.quoteIdentifier(snapshot.reference.table) - columns := []string{e.quoteIdentifier(snapshot.primaryKey)} - placeholders := []string{e.placeholder(1)} - updates := make([]string, 0, len(columnNames)) - arguments := []any{flowID} - for index, name := range columnNames { - quoted := e.quoteIdentifier(name) - columns = append(columns, quoted) - placeholders = append(placeholders, e.placeholder(index+2)) - arguments = append(arguments, values[name].value) - if e.cfg.Type == config.AttributeStoreTypePostgres { - updates = append(updates, quoted+" = EXCLUDED."+quoted) - } else { - updates = append(updates, quoted+" = VALUES("+quoted+")") - } - } - query := "INSERT INTO " + quotedTable + " (" + strings.Join(columns, ", ") + ") VALUES (" + - strings.Join(placeholders, ", ") + ")" - if e.cfg.Type == config.AttributeStoreTypePostgres { - query += " ON CONFLICT (" + e.quoteIdentifier(snapshot.primaryKey) + ") DO UPDATE SET " + - strings.Join(updates, ", ") - } else { - query += " ON DUPLICATE KEY UPDATE " + strings.Join(updates, ", ") - } - return query, arguments -} - -func (e *storeEntry) placeholder(position int) string { - if e.cfg.Type == config.AttributeStoreTypePostgres { - return "$" + strconv.Itoa(position) - } - return "?" -} - -func (e *storeEntry) quoteIdentifier(identifier string) string { - if e.cfg.Type == config.AttributeStoreTypePostgres { - return `"` + strings.ReplaceAll(identifier, `"`, `""`) + `"` - } - return "`" + strings.ReplaceAll(identifier, "`", "``") + "`" -} - -func (c columnSchema) convert(value *dexpb.Value, storeType config.AttributeStoreType) (any, error) { - if value == nil || value.GetKind() == nil { - return nil, fmt.Errorf("value is missing") - } - switch kind := value.GetKind().(type) { - case *dexpb.Value_NullValue: - if !c.nullable { - return nil, fmt.Errorf("column is not nullable") - } - return nil, nil - case *dexpb.Value_StringValue: - if c.acceptsTemporal(storeType) { - return parseDatetime(kind.StringValue) - } - if !c.acceptsString() { - return nil, fmt.Errorf("column does not accept strings") - } - if c.characterMaximum != nil && int64(utf8.RuneCountInString(kind.StringValue)) > *c.characterMaximum { - return nil, fmt.Errorf("string exceeds column length") - } - return kind.StringValue, nil - case *dexpb.Value_IntValue: - if !c.acceptsInt(kind.IntValue, storeType) { - return nil, fmt.Errorf("column cannot store int64 value") - } - return kind.IntValue, nil - case *dexpb.Value_DoubleValue: - if !c.acceptsDouble() || math.IsNaN(kind.DoubleValue) || math.IsInf(kind.DoubleValue, 0) { - return nil, fmt.Errorf("column cannot store double value") - } - return kind.DoubleValue, nil - case *dexpb.Value_BoolValue: - if !c.acceptsBool(storeType) { - return nil, fmt.Errorf("column cannot store bool value") - } - return kind.BoolValue, nil - case *dexpb.Value_ObjValue: - return c.convertObject(kind.ObjValue, storeType) - case *dexpb.Value_InternalBlobIdForStringValue, *dexpb.Value_InternalBlobIdForObjValue: - return nil, fmt.Errorf("blob-backed value was not hydrated") - default: - return nil, fmt.Errorf("unsupported Attribute value") - } -} - -func (c columnSchema) acceptsString() bool { - switch c.dataType { - case "character", "character varying", "text", "char", "varchar", "tinytext", "mediumtext", "longtext": - return true - default: - return false - } -} - -func (c columnSchema) acceptsInt(value int64, storeType config.AttributeStoreType) bool { - unsigned := storeType == config.AttributeStoreTypeMySQL && strings.Contains(c.columnType, "unsigned") - if unsigned && value < 0 { - return false - } - switch c.dataType { - case "tinyint": - return intInRange(value, unsigned, math.MinInt8, math.MaxInt8, math.MaxUint8) - case "smallint": - return intInRange(value, unsigned, math.MinInt16, math.MaxInt16, math.MaxUint16) - case "mediumint": - return intInRange(value, unsigned, -8388608, 8388607, 16777215) - case "integer", "int": - return intInRange(value, unsigned, math.MinInt32, math.MaxInt32, math.MaxUint32) - case "bigint": - return true - case "numeric", "decimal": - if c.numericScale != nil && *c.numericScale != 0 { - return false - } - if c.numericPrecision == nil { - return true - } - digits := len(strconv.FormatInt(value, 10)) - if value < 0 { - digits-- - } - return int64(digits) <= *c.numericPrecision - default: - return false - } -} - -func intInRange(value int64, unsigned bool, signedMinimum, signedMaximum, unsignedMaximum int64) bool { - if unsigned { - return value <= unsignedMaximum - } - return value >= signedMinimum && value <= signedMaximum -} - -func (c columnSchema) acceptsDouble() bool { - switch c.dataType { - case "real", "double precision", "float", "double", "numeric", "decimal": - return true - default: - return false - } -} - -func (c columnSchema) acceptsBool(storeType config.AttributeStoreType) bool { - if storeType == config.AttributeStoreTypePostgres { - return c.dataType == "boolean" - } - return c.columnType == "tinyint(1)" || c.columnType == "bit(1)" || c.dataType == "boolean" || c.dataType == "bool" -} - -func (c columnSchema) acceptsTemporal(storeType config.AttributeStoreType) bool { - if storeType == config.AttributeStoreTypePostgres { - return c.dataType == "timestamp with time zone" - } - return c.dataType == "datetime" || c.dataType == "timestamp" -} - -func (c columnSchema) convertObject( - object *dexpb.EncodedObject, - storeType config.AttributeStoreType, -) (any, error) { - if object == nil { - return nil, fmt.Errorf("object is missing") - } - if object.GetEncoding() == "json" { - if !json.Valid(object.GetPayload()) { - return nil, fmt.Errorf("JSON payload is invalid") - } - if c.acceptsTemporal(storeType) { - return parseJSONDatetime(object.GetPayload()) - } - if c.dataType != "json" && c.dataType != "jsonb" { - return nil, fmt.Errorf("column does not accept JSON") - } - if storeType == config.AttributeStoreTypePostgres { - return string(object.GetPayload()), nil - } - return object.GetPayload(), nil - } - if !c.acceptsBinary(storeType) { - return nil, fmt.Errorf("column does not accept binary objects") - } - if c.characterMaximum != nil && int64(len(object.GetPayload())) > *c.characterMaximum { - return nil, fmt.Errorf("object exceeds column length") - } - return object.GetPayload(), nil -} - -func parseDatetime(value string) (time.Time, error) { - parsed, err := time.Parse(time.RFC3339Nano, value) - if err != nil { - return time.Time{}, fmt.Errorf("datetime must use RFC3339: %w", err) - } - return parsed, nil -} - -func parseJSONDatetime(payload []byte) (time.Time, error) { - decoder := json.NewDecoder(strings.NewReader(string(payload))) - decoder.UseNumber() - var value any - if err := decoder.Decode(&value); err != nil { - return time.Time{}, fmt.Errorf("decode JSON datetime: %w", err) - } - switch datetime := value.(type) { - case string: - return parseDatetime(datetime) - case json.Number: - return parseUnixDatetime(datetime.String()) - default: - return time.Time{}, fmt.Errorf("datetime payload must be a JSON string or epoch-seconds number") - } -} - -func parseUnixDatetime(value string) (time.Time, error) { - negative := strings.HasPrefix(value, "-") - unsigned := strings.TrimPrefix(value, "-") - parts := strings.Split(unsigned, ".") - if len(parts) > 2 || len(parts) == 0 || parts[0] == "" { - return time.Time{}, fmt.Errorf("datetime epoch seconds are invalid") - } - seconds, err := strconv.ParseInt(parts[0], 10, 64) - if err != nil { - return time.Time{}, fmt.Errorf("datetime epoch seconds are invalid: %w", err) - } - var nanoseconds int64 - if len(parts) == 2 { - if len(parts[1]) == 0 || len(parts[1]) > 9 { - return time.Time{}, fmt.Errorf("datetime epoch fraction must contain one to nine digits") - } - fraction := parts[1] + strings.Repeat("0", 9-len(parts[1])) - nanoseconds, err = strconv.ParseInt(fraction, 10, 64) - if err != nil { - return time.Time{}, fmt.Errorf("datetime epoch fraction is invalid: %w", err) - } - } - if negative { - seconds = -seconds - nanoseconds = -nanoseconds - } - return time.Unix(seconds, nanoseconds), nil -} - -func (c columnSchema) acceptsBinary(storeType config.AttributeStoreType) bool { - if storeType == config.AttributeStoreTypePostgres { - return c.dataType == "bytea" - } - switch c.dataType { - case "binary", "varbinary", "tinyblob", "blob", "mediumblob", "longblob": - return true - default: - return false - } -} - func (m *Manager) Close() error { m.cancel() m.wg.Wait() - return m.closeDatabases() + return m.closeStores() } -func (m *Manager) closeDatabases() error { +func (m *Manager) closeStores() error { var errs []error for name, entry := range m.entries { - if err := entry.db.Close(); err != nil { + if err := entry.close(); err != nil { errs = append(errs, fmt.Errorf("close Attribute Store %q: %w", name, err)) } } diff --git a/server/service/common/attributestore/manager_integ_test.go b/server/service/common/attributestore/manager_integ_test.go index feda1f7fe..cf395fe0a 100644 --- a/server/service/common/attributestore/manager_integ_test.go +++ b/server/service/common/attributestore/manager_integ_test.go @@ -24,6 +24,9 @@ import ( "github.com/superdurable/dex/config" "github.com/superdurable/dex/gen/dexpb" "github.com/superdurable/dex/service/common/log" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) func TestMySQLAndPostgresAttributeStoreIntegration(t *testing.T) { @@ -64,12 +67,13 @@ func TestMySQLAndPostgresAttributeStoreIntegration(t *testing.T) { assertIntegrationRow(t, postgres, "postgres-flow") assertIntegrationRow(t, mysql, "mysql-flow") - previousSnapshot := manager.entries["reporting"].schema.Load() + reportingStore := manager.entries["reporting"].(*sqlStore) + previousSnapshot := reportingStore.schema.Load() _, err = postgres.ExecContext(ctx, `ALTER TABLE flow_attributes RENAME TO flow_attributes_hidden`) require.NoError(t, err) require.Never(t, func() bool { return !reflect.DeepEqual( - manager.entries["reporting"].schema.Load(), + reportingStore.schema.Load(), previousSnapshot, ) }, 200*time.Millisecond, 20*time.Millisecond) @@ -78,7 +82,7 @@ func TestMySQLAndPostgresAttributeStoreIntegration(t *testing.T) { _, err = postgres.ExecContext(ctx, `ALTER TABLE flow_attributes ADD COLUMN late_column TEXT`) require.NoError(t, err) require.Eventually(t, func() bool { - return manager.entries["reporting"].schema.Load().columns["late_column"].name == "late_column" + return reportingStore.schema.Load().columns["late_column"].name == "late_column" }, 3*time.Second, 20*time.Millisecond) err = manager.WriteBatch(ctx, &dexpb.SyncAttributeBatchActivityInput{ FlowId: "postgres-flow", @@ -96,6 +100,65 @@ func TestMySQLAndPostgresAttributeStoreIntegration(t *testing.T) { require.Equal(t, "available", lateColumn) } +func TestMongoDBAttributeStoreIntegration(t *testing.T) { + ctx := context.Background() + mongodbDSN := environmentOrDefault( + "DEX_ATTRIBUTE_STORE_MONGODB_DSN", + "mongodb://127.0.0.1:57017", + ) + mongodbClient := openIntegrationMongoDB(t, mongodbDSN) + prepareIntegrationCollection(t, mongodbClient) + assertMissingCollectionFailsStartup(t, mongodbDSN) + + manager, err := NewManager(ctx, &config.AttributeStoreConfig{ + Stores: map[string]config.AttributeStoreConfigEntry{ + "documents": { + Type: config.AttributeStoreTypeMongoDB, + DSN: mongodbDSN, + DatabaseName: "dex", + CollectionName: "flow_attributes", + }, + }, + }, log.NewNoop()) + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, manager.Close()) }) + + writeIntegrationBatch(t, manager, "documents", "mongodb-flow") + assertMongoDBIntegrationDocument(t, mongodbClient, "mongodb-flow") + assertMongoDBPartialUpdateAndInvalidFieldFiltering(t, manager, mongodbClient) +} + +func openIntegrationMongoDB(t *testing.T, uri string) *mongo.Client { + t.Helper() + client, err := mongo.Connect(options.Client().ApplyURI(uri)) + require.NoError(t, err) + require.NoError(t, client.Ping(context.Background(), nil)) + t.Cleanup(func() { require.NoError(t, client.Disconnect(context.Background())) }) + return client +} + +func prepareIntegrationCollection(t *testing.T, client *mongo.Client) { + t.Helper() + database := client.Database("dex") + require.NoError(t, database.Collection("flow_attributes").Drop(context.Background())) + require.NoError(t, database.CreateCollection(context.Background(), "flow_attributes")) +} + +func assertMissingCollectionFailsStartup(t *testing.T, uri string) { + t.Helper() + _, err := NewManager(context.Background(), &config.AttributeStoreConfig{ + Stores: map[string]config.AttributeStoreConfigEntry{ + "invalid": { + Type: config.AttributeStoreTypeMongoDB, + DSN: uri, + DatabaseName: "dex", + CollectionName: "missing_collection", + }, + }, + }, log.NewNoop()) + require.ErrorContains(t, err, "does not exist") +} + func assertInvalidSchemasFailStartup(t *testing.T, dsn string, postgres *sql.DB) { t.Helper() statements := []string{ @@ -147,6 +210,7 @@ func prepareIntegrationTables(t *testing.T, postgres, mysql *sql.DB) { database *sql.DB query string }{ + {postgres, `DROP TABLE IF EXISTS flow_attributes_hidden`}, {postgres, `DROP TABLE IF EXISTS flow_attributes`}, {postgres, `CREATE TABLE flow_attributes ( flow_id TEXT PRIMARY KEY, @@ -216,6 +280,61 @@ func assertIntegrationRow(t *testing.T, database *sql.DB, flowID string) { require.False(t, nullableValue.Valid) } +func assertMongoDBIntegrationDocument(t *testing.T, client *mongo.Client, flowID string) { + t.Helper() + var document struct { + ID string `bson:"_id"` + Name string `bson:"name"` + CountValue int64 `bson:"count_value"` + Ratio float64 `bson:"ratio"` + Active bool `bson:"active"` + LoggedAt string `bson:"logged_at"` + JSONValue struct { + OK bool `bson:"ok"` + } `bson:"json_value"` + BinaryValue bson.Binary `bson:"binary_value"` + NullableValue any `bson:"nullable_value"` + } + err := client.Database("dex").Collection("flow_attributes"). + FindOne(context.Background(), bson.D{{Key: "_id", Value: flowID}}).Decode(&document) + require.NoError(t, err) + require.Equal(t, flowID, document.ID) + require.Equal(t, "latest", document.Name) + require.Equal(t, int64(42), document.CountValue) + require.Equal(t, 2.5, document.Ratio) + require.True(t, document.Active) + require.Equal(t, "2026-08-11T15:30:00Z", document.LoggedAt) + require.True(t, document.JSONValue.OK) + require.Equal(t, bson.Binary{Subtype: 0, Data: []byte("bytes")}, document.BinaryValue) + require.Nil(t, document.NullableValue) +} + +func assertMongoDBPartialUpdateAndInvalidFieldFiltering( + t *testing.T, + manager *Manager, + client *mongo.Client, +) { + t.Helper() + err := manager.WriteBatch(context.Background(), &dexpb.SyncAttributeBatchActivityInput{ + FlowId: "mongodb-flow", + ConfigName: "documents", + Items: []*dexpb.AttributeSyncItem{ + {ConfigName: "documents", Key: "name", Value: stringValue("updated")}, + {ConfigName: "documents", Key: "name", Value: stringValue("latest-update")}, + {ConfigName: "documents", Key: "_id", Value: stringValue("replacement")}, + {ConfigName: "documents", Key: "nested.path", Value: stringValue("invalid")}, + }, + }) + require.NoError(t, err) + var document bson.M + err = client.Database("dex").Collection("flow_attributes"). + FindOne(context.Background(), bson.D{{Key: "_id", Value: "mongodb-flow"}}).Decode(&document) + require.NoError(t, err) + require.Equal(t, "latest-update", document["name"]) + require.Equal(t, int64(42), document["count_value"]) + require.NotContains(t, document, "nested.path") +} + func doubleValue(value float64) *dexpb.Value { return &dexpb.Value{Kind: &dexpb.Value_DoubleValue{DoubleValue: value}} } diff --git a/server/service/common/attributestore/manager_test.go b/server/service/common/attributestore/manager_test.go index 2c1ca6791..06e512b92 100644 --- a/server/service/common/attributestore/manager_test.go +++ b/server/service/common/attributestore/manager_test.go @@ -11,12 +11,16 @@ package attributestore import ( + "context" + "fmt" + "math" "testing" "time" "github.com/stretchr/testify/require" "github.com/superdurable/dex/config" "github.com/superdurable/dex/gen/dexpb" + "go.mongodb.org/mongo-driver/v2/bson" "google.golang.org/protobuf/types/known/structpb" ) @@ -27,6 +31,14 @@ func TestJitterIntervalUsesConfiguredRange(t *testing.T) { require.Equal(t, 66*time.Second, jitterInterval(interval, 1)) } +func TestRedactStorageSecretPreservesCause(t *testing.T) { + source := fmt.Errorf("connect mongodb://user:secret@host: %w", context.Canceled) + redacted := redactStorageSecret(source, "mongodb://user:secret@host") + require.NotContains(t, redacted.Error(), "secret") + require.Contains(t, redacted.Error(), "[REDACTED]") + require.ErrorIs(t, redacted, context.Canceled) +} + func TestColumnConversionBoundaries(t *testing.T) { maximum := int64(3) textColumn := columnSchema{dataType: "varchar", characterMaximum: &maximum} @@ -97,24 +109,174 @@ func TestColumnConversionBoundaries(t *testing.T) { func TestBuildUpsertQuotesIdentifiersAndBindsValues(t *testing.T) { snapshot := &tableSchema{ - reference: tableReference{namespace: "reporting", table: "flow attributes"}, - primaryKey: "FlowID", + reference: tableReference{namespace: "reporting", table: "flow attributes"}, + flowIDColumn: "FlowID", } values := map[string]filteredValue{ "select": {value: int64(7)}, "name": {value: "flow"}, } - postgres := &storeEntry{cfg: config.AttributeStoreConfigEntry{Type: config.AttributeStoreTypePostgres}} + postgresDialect, err := newSQLDialect(config.AttributeStoreTypePostgres) + require.NoError(t, err) + postgres := &sqlStore{dialect: postgresDialect} query, arguments := postgres.buildUpsert(snapshot, "flow-id", values) require.Equal(t, `INSERT INTO "reporting"."flow attributes" ("FlowID", "name", "select") VALUES ($1, $2, $3) ON CONFLICT ("FlowID") DO UPDATE SET "name" = EXCLUDED."name", "select" = EXCLUDED."select"`, query) require.Equal(t, []any{"flow-id", "flow", int64(7)}, arguments) - mysql := &storeEntry{cfg: config.AttributeStoreConfigEntry{Type: config.AttributeStoreTypeMySQL}} + mysqlDialect, err := newSQLDialect(config.AttributeStoreTypeMySQL) + require.NoError(t, err) + mysql := &sqlStore{dialect: mysqlDialect} query, arguments = mysql.buildUpsert(snapshot, "flow-id", values) require.Equal(t, "INSERT INTO `reporting`.`flow attributes` (`FlowID`, `name`, `select`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `select` = VALUES(`select`)", query) require.Equal(t, []any{"flow-id", "flow", int64(7)}, arguments) } +func TestBuildWarehouseMergeQuotesIdentifiersAndBindsValues(t *testing.T) { + snapshot := &tableSchema{ + reference: tableReference{ + catalog: "analytics", + namespace: "reporting", + table: "flow attributes", + }, + flowIDColumn: "FlowID", + } + values := map[string]filteredValue{ + "profile": {column: columnSchema{dataType: "variant"}, value: `{"active":true}`}, + "name": {column: columnSchema{dataType: "string"}, value: "flow"}, + } + + databricksDialect, err := newSQLDialect(config.AttributeStoreTypeDatabricks) + require.NoError(t, err) + databricks := &sqlStore{dialect: databricksDialect} + query, arguments := databricks.buildUpsert(snapshot, "flow-id", values) + require.Equal(t, "MERGE INTO `analytics`.`reporting`.`flow attributes` AS target USING (SELECT CAST(? AS STRING) AS `FlowID`, ? AS `name`, PARSE_JSON(?) AS `profile`) AS source ON target.`FlowID` = source.`FlowID` WHEN MATCHED THEN UPDATE SET target.`name` = source.`name`, target.`profile` = source.`profile` WHEN NOT MATCHED THEN INSERT (`FlowID`, `name`, `profile`) VALUES (source.`FlowID`, source.`name`, source.`profile`)", query) + require.Equal(t, []any{"flow-id", "flow", `{"active":true}`}, arguments) + databricksTimestampQuery, databricksTimestampArguments := databricks.buildUpsert(snapshot, "flow-id", map[string]filteredValue{ + "logged_at": {column: columnSchema{dataType: "timestamp_ntz"}, value: "2026-08-11T15:30:00Z"}, + }) + require.Contains(t, databricksTimestampQuery, "CAST(? AS TIMESTAMP_NTZ) AS `logged_at`") + require.Equal(t, []any{"flow-id", "2026-08-11T15:30:00Z"}, databricksTimestampArguments) + + snowflakeDialect, err := newSQLDialect(config.AttributeStoreTypeSnowflake) + require.NoError(t, err) + snowflake := &sqlStore{dialect: snowflakeDialect} + query, arguments = snowflake.buildUpsert(snapshot, "flow-id", values) + require.Equal(t, `MERGE INTO "analytics"."reporting"."flow attributes" AS target USING (SELECT CAST(? AS VARCHAR) AS "FlowID", ? AS "name", PARSE_JSON(?) AS "profile") AS source ON target."FlowID" = source."FlowID" WHEN MATCHED THEN UPDATE SET target."name" = source."name", target."profile" = source."profile" WHEN NOT MATCHED THEN INSERT ("FlowID", "name", "profile") VALUES (source."FlowID", source."name", source."profile")`, query) + require.Equal(t, []any{"flow-id", "flow", `{"active":true}`}, arguments) + snowflakeTimestampQuery, snowflakeTimestampArguments := snowflake.buildUpsert(snapshot, "flow-id", map[string]filteredValue{ + "logged_at": {column: columnSchema{dataType: "timestamp_ntz"}, value: "2026-08-11T15:30:00Z"}, + }) + require.Contains(t, snowflakeTimestampQuery, `TO_TIMESTAMP_NTZ(?) AS "logged_at"`) + require.Equal(t, []any{"flow-id", "2026-08-11T15:30:00Z"}, snowflakeTimestampArguments) + snowflakeBinaryQuery, snowflakeBinaryArguments := snowflake.buildUpsert(snapshot, "flow-id", map[string]filteredValue{ + "payload": {column: columnSchema{dataType: "binary"}, value: []byte{0x01, 0xab}}, + }) + require.Contains(t, snowflakeBinaryQuery, `TO_BINARY(?, 'HEX') AS "payload"`) + require.Equal(t, []any{"flow-id", "01ab"}, snowflakeBinaryArguments) + databricksBinaryQuery, databricksBinaryArguments := databricks.buildUpsert(snapshot, "flow-id", map[string]filteredValue{ + "payload": {column: columnSchema{dataType: "binary"}, value: []byte{0x01, 0xab}}, + }) + require.Contains(t, databricksBinaryQuery, "UNHEX(?) AS `payload`") + require.Equal(t, []any{"flow-id", "01ab"}, databricksBinaryArguments) + + maliciousName := `profile"; DROP TABLE audit; --` + query, arguments = snowflake.buildUpsert(snapshot, "flow-value'; DROP TABLE flows; --", map[string]filteredValue{ + maliciousName: {column: columnSchema{dataType: "varchar"}, value: "attribute-value'; DROP TABLE values; --"}, + }) + require.Contains(t, query, `"profile""; DROP TABLE audit; --"`) + require.NotContains(t, query, "attribute-value") + require.NotContains(t, query, "flow-value") + require.Equal(t, []any{"flow-value'; DROP TABLE flows; --", "attribute-value'; DROP TABLE values; --"}, arguments) +} + +func TestWarehouseColumnConversions(t *testing.T) { + precision := int64(3) + zeroScale := int64(0) + tests := []struct { + name string + storeType config.AttributeStoreType + column columnSchema + value *dexpb.Value + expected any + }{ + {"databricks string", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "string"}, stringValue("value"), "value"}, + {"databricks byte", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "byteint"}, intValue(127), int64(127)}, + {"databricks decimal", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "decimal", numericPrecision: &precision, numericScale: &zeroScale}, intValue(999), int64(999)}, + {"databricks double", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "double"}, warehouseDoubleValue(2.5), 2.5}, + {"databricks bool", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "boolean"}, boolValue(true), true}, + {"databricks timestamp", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "timestamp_ntz"}, stringValue("2026-08-11T08:30:00-07:00"), "2026-08-11T15:30:00Z"}, + {"databricks variant", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "variant"}, objectValue("json", `{"ok":true}`), `{"ok":true}`}, + {"databricks binary", config.AttributeStoreTypeDatabricks, columnSchema{dataType: "binary"}, objectValue("proto", "bytes"), []byte("bytes")}, + {"snowflake varchar", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "varchar"}, stringValue("value"), "value"}, + {"snowflake fixed", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "fixed", numericPrecision: &precision, numericScale: &zeroScale}, intValue(999), int64(999)}, + {"snowflake float", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "float"}, warehouseDoubleValue(2.5), 2.5}, + {"snowflake bool", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "boolean"}, boolValue(true), true}, + {"snowflake timestamp", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "timestamp_tz"}, objectValue("json", `"2026-08-11T08:30:00-07:00"`), "2026-08-11T15:30:00Z"}, + {"snowflake variant", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "variant"}, objectValue("json", `[1,true]`), `[1,true]`}, + {"snowflake binary", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "binary"}, objectValue("proto", "bytes"), []byte("bytes")}, + {"nullable", config.AttributeStoreTypeSnowflake, columnSchema{dataType: "varchar", nullable: true}, nullValue(), nil}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + converted, err := test.column.convert(test.value, test.storeType) + require.NoError(t, err) + require.Equal(t, test.expected, converted) + }) + } + + decimal := columnSchema{dataType: "number", numericPrecision: &precision, numericScale: &zeroScale} + _, err := decimal.convert(intValue(1000), config.AttributeStoreTypeSnowflake) + require.ErrorContains(t, err, "int64") + _, err = (columnSchema{dataType: "float"}).convert( + warehouseDoubleValue(math.Inf(1)), config.AttributeStoreTypeSnowflake, + ) + require.ErrorContains(t, err, "double") + _, err = (columnSchema{dataType: "number"}).convert( + warehouseDoubleValue(2.5), config.AttributeStoreTypeSnowflake, + ) + require.ErrorContains(t, err, "double") +} + +func TestMongoValueConversion(t *testing.T) { + converted, err := convertMongoValue(objectValue("json", `{"count":42,"ratio":2.5,"nested":{"active":true}}`)) + require.NoError(t, err) + require.Equal(t, int64(42), converted.(bson.M)["count"]) + require.Equal(t, 2.5, converted.(bson.M)["ratio"]) + require.Equal(t, true, converted.(bson.M)["nested"].(bson.M)["active"]) + + converted, err = convertMongoValue(objectValue("proto", "bytes")) + require.NoError(t, err) + require.Equal(t, bson.Binary{Subtype: 0, Data: []byte("bytes")}, converted) + + converted, err = convertMongoValue(objectValue("json", `[1,2.5,true,null,"value"]`)) + require.NoError(t, err) + require.Equal(t, bson.A{int64(1), 2.5, true, nil, "value"}, converted) + + for _, test := range []struct { + value *dexpb.Value + expected any + }{ + {stringValue("value"), "value"}, + {intValue(42), int64(42)}, + {warehouseDoubleValue(2.5), 2.5}, + {boolValue(true), true}, + {nullValue(), nil}, + } { + converted, err = convertMongoValue(test.value) + require.NoError(t, err) + require.Equal(t, test.expected, converted) + } + _, err = convertMongoValue(objectValue("json", `{invalid`)) + require.ErrorContains(t, err, "invalid") + _, err = convertMongoValue(warehouseDoubleValue(math.NaN())) + require.ErrorContains(t, err, "non-finite") + + for _, name := range []string{"_id", "$reserved", "nested.field", "nul\x00field", ""} { + require.False(t, isValidMongoAttributeName(name), name) + } + require.True(t, isValidMongoAttributeName("display_name")) +} + func stringValue(value string) *dexpb.Value { return &dexpb.Value{Kind: &dexpb.Value_StringValue{StringValue: value}} } @@ -127,6 +289,10 @@ func boolValue(value bool) *dexpb.Value { return &dexpb.Value{Kind: &dexpb.Value_BoolValue{BoolValue: value}} } +func warehouseDoubleValue(value float64) *dexpb.Value { + return &dexpb.Value{Kind: &dexpb.Value_DoubleValue{DoubleValue: value}} +} + func objectValue(encoding, payload string) *dexpb.Value { return &dexpb.Value{Kind: &dexpb.Value_ObjValue{ObjValue: &dexpb.EncodedObject{ Encoding: encoding, diff --git a/server/service/common/attributestore/mongo_store.go b/server/service/common/attributestore/mongo_store.go new file mode 100644 index 000000000..df3796da3 --- /dev/null +++ b/server/service/common/attributestore/mongo_store.go @@ -0,0 +1,219 @@ +// Copyright (c) 2026 Super Durable, Inc. +// +// Licensed under the Sustainable Use License 1.0. +// You may not use this file except in compliance with the License. +// See the LICENSE file in the repository root. +// +// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0 + +package attributestore + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "strconv" + "strings" + "time" + + "github.com/superdurable/dex/config" + "github.com/superdurable/dex/gen/dexpb" + "github.com/superdurable/dex/service/common/log" + "github.com/superdurable/dex/service/common/log/tag" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" + "go.mongodb.org/mongo-driver/v2/mongo/readpref" +) + +const mongoDisconnectTimeout = 10 * time.Second + +type mongoStore struct { + client *mongo.Client + collection *mongo.Collection + logger log.Logger + dsn string +} + +func openMongoStore( + ctx context.Context, + cfg config.AttributeStoreConfigEntry, + logger log.Logger, +) (*mongoStore, error) { + client, err := mongo.Connect(options.Client().ApplyURI(cfg.DSN)) + if err != nil { + return nil, fmt.Errorf("open connection: %w", err) + } + if err := client.Ping(ctx, readpref.Primary()); err != nil { + return nil, disconnectMongoOnError(client, fmt.Errorf("ping database: %w", err)) + } + database := client.Database(cfg.DatabaseName) + collectionNames, err := database.ListCollectionNames(ctx, bson.D{{Key: "name", Value: cfg.CollectionName}}) + if err != nil { + return nil, disconnectMongoOnError(client, fmt.Errorf("list MongoDB collections: %w", err)) + } + if len(collectionNames) != 1 || collectionNames[0] != cfg.CollectionName { + return nil, disconnectMongoOnError(client, fmt.Errorf("MongoDB collection does not exist")) + } + return &mongoStore{ + client: client, + collection: database.Collection(cfg.CollectionName), + logger: logger, + dsn: cfg.DSN, + }, nil +} + +func disconnectMongoOnError(client *mongo.Client, sourceErr error) error { + disconnectCtx, cancel := context.WithTimeout(context.Background(), mongoDisconnectTimeout) + defer cancel() + if disconnectErr := client.Disconnect(disconnectCtx); disconnectErr != nil { + return errors.Join(sourceErr, disconnectErr) + } + return sourceErr +} + +func (s *mongoStore) writeBatch( + ctx context.Context, + flowID string, + items []*dexpb.AttributeSyncItem, +) error { + latest := make(map[string]*dexpb.Value, len(items)) + for _, item := range items { + if item == nil { + continue + } + latest[item.GetKey()] = item.GetValue() + } + updates := bson.M{} + for name, value := range latest { + if !isValidMongoAttributeName(name) { + s.logger.Error("skip Attribute Store item: invalid MongoDB field", tag.AttributeName(name)) + continue + } + converted, err := convertMongoValue(value) + if err != nil { + s.logger.Error("skip incompatible Attribute Store item", tag.AttributeName(name), tag.Error(err)) + continue + } + updates[name] = converted + } + if len(updates) == 0 { + return nil + } + _, err := s.collection.UpdateOne( + ctx, + bson.D{{Key: "_id", Value: flowID}}, + bson.D{{Key: "$set", Value: updates}}, + options.UpdateOne().SetUpsert(true), + ) + if err != nil { + return redactStorageSecret(fmt.Errorf("execute Attribute Store upsert: %w", err), s.dsn) + } + return nil +} + +func isValidMongoAttributeName(name string) bool { + return name != "" && name != "_id" && !strings.HasPrefix(name, "$") && + !strings.Contains(name, ".") && strings.IndexByte(name, 0) < 0 +} + +func convertMongoValue(value *dexpb.Value) (any, error) { + if value == nil || value.GetKind() == nil { + return nil, fmt.Errorf("value is missing") + } + switch kind := value.GetKind().(type) { + case *dexpb.Value_NullValue: + return nil, nil + case *dexpb.Value_StringValue: + return kind.StringValue, nil + case *dexpb.Value_IntValue: + return kind.IntValue, nil + case *dexpb.Value_DoubleValue: + if math.IsNaN(kind.DoubleValue) || math.IsInf(kind.DoubleValue, 0) { + return nil, fmt.Errorf("MongoDB cannot store non-finite double value") + } + return kind.DoubleValue, nil + case *dexpb.Value_BoolValue: + return kind.BoolValue, nil + case *dexpb.Value_ObjValue: + return convertMongoObject(kind.ObjValue) + case *dexpb.Value_InternalBlobIdForStringValue, *dexpb.Value_InternalBlobIdForObjValue: + return nil, fmt.Errorf("blob-backed value was not hydrated") + default: + return nil, fmt.Errorf("unsupported Attribute value") + } +} + +func convertMongoObject(object *dexpb.EncodedObject) (any, error) { + if object == nil { + return nil, fmt.Errorf("object is missing") + } + if object.GetEncoding() != "json" { + return bson.Binary{Subtype: 0, Data: object.GetPayload()}, nil + } + decoder := json.NewDecoder(bytes.NewReader(object.GetPayload())) + decoder.UseNumber() + var value any + if err := decoder.Decode(&value); err != nil { + return nil, fmt.Errorf("JSON payload is invalid: %w", err) + } + var trailing any + if err := decoder.Decode(&trailing); !errors.Is(err, io.EOF) { + if err == nil { + return nil, fmt.Errorf("JSON payload contains multiple values") + } + return nil, fmt.Errorf("JSON payload is invalid: %w", err) + } + return convertMongoJSONValue(value) +} + +func convertMongoJSONValue(value any) (any, error) { + switch typed := value.(type) { + case nil, string, bool: + return typed, nil + case json.Number: + if !strings.ContainsAny(typed.String(), ".eE") { + integer, err := strconv.ParseInt(typed.String(), 10, 64) + if err == nil { + return integer, nil + } + } + double, err := strconv.ParseFloat(typed.String(), 64) + if err != nil || math.IsInf(double, 0) || math.IsNaN(double) { + return nil, fmt.Errorf("JSON number is outside MongoDB numeric range") + } + return double, nil + case []any: + converted := make(bson.A, len(typed)) + for index, item := range typed { + value, err := convertMongoJSONValue(item) + if err != nil { + return nil, err + } + converted[index] = value + } + return converted, nil + case map[string]any: + converted := bson.M{} + for key, item := range typed { + value, err := convertMongoJSONValue(item) + if err != nil { + return nil, err + } + converted[key] = value + } + return converted, nil + default: + return nil, fmt.Errorf("unsupported JSON value %T", value) + } +} + +func (s *mongoStore) close() error { + disconnectCtx, cancel := context.WithTimeout(context.Background(), mongoDisconnectTimeout) + defer cancel() + return redactStorageSecret(s.client.Disconnect(disconnectCtx), s.dsn) +} diff --git a/server/service/common/attributestore/sql_dialect.go b/server/service/common/attributestore/sql_dialect.go new file mode 100644 index 000000000..2a3a7fbc0 --- /dev/null +++ b/server/service/common/attributestore/sql_dialect.go @@ -0,0 +1,545 @@ +// Copyright (c) 2026 Super Durable, Inc. +// +// Licensed under the Sustainable Use License 1.0. +// You may not use this file except in compliance with the License. +// See the LICENSE file in the repository root. +// +// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0 + +package attributestore + +import ( + "context" + "database/sql" + "encoding/hex" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "github.com/superdurable/dex/config" +) + +type sqlDialect interface { + driverName() string + resolveTableReference(context.Context, *sql.DB, string) (tableReference, error) + describeColumnsQuery(tableReference) (string, []any) + enrichColumns(context.Context, *sql.DB, tableReference, map[string]columnSchema) error + describePrimaryKeys(context.Context, *sql.DB, tableReference) ([]string, error) + buildUpsert(*tableSchema, string, []string, map[string]filteredValue) (string, []any) +} + +type builtInSQLDialect struct { + storeType config.AttributeStoreType +} + +func newSQLDialect(storeType config.AttributeStoreType) (sqlDialect, error) { + switch storeType { + case config.AttributeStoreTypeMySQL, config.AttributeStoreTypePostgres, + config.AttributeStoreTypeDatabricks, config.AttributeStoreTypeSnowflake: + return &builtInSQLDialect{storeType: storeType}, nil + default: + return nil, fmt.Errorf("unsupported SQL Attribute Store type %q", storeType) + } +} + +func (d *builtInSQLDialect) driverName() string { + switch d.storeType { + case config.AttributeStoreTypeMySQL: + return "mysql" + case config.AttributeStoreTypePostgres: + return "pgx" + case config.AttributeStoreTypeDatabricks: + return "databricks" + case config.AttributeStoreTypeSnowflake: + return "snowflake" + default: + panic("unsupported SQL Attribute Store type") + } +} + +func (d *builtInSQLDialect) resolveTableReference( + ctx context.Context, + database *sql.DB, + tableName string, +) (tableReference, error) { + parts := strings.Split(tableName, ".") + maximumParts := 2 + if d.storeType.IsWarehouse() { + maximumParts = 3 + } + if len(parts) == 0 || len(parts) > maximumParts { + return tableReference{}, fmt.Errorf("tableName must contain at most %d identifiers", maximumParts) + } + for _, part := range parts { + if part == "" || strings.IndexByte(part, 0) >= 0 { + return tableReference{}, fmt.Errorf("tableName contains an invalid identifier") + } + } + if !d.storeType.IsWarehouse() { + if len(parts) == 2 { + return tableReference{namespace: parts[0], table: parts[1]}, nil + } + namespace, err := d.currentNamespace(ctx, database) + if err != nil { + return tableReference{}, err + } + return tableReference{namespace: namespace, table: parts[0]}, nil + } + if len(parts) == 3 { + return tableReference{catalog: parts[0], namespace: parts[1], table: parts[2]}, nil + } + catalog, namespace, err := d.currentWarehouseNamespace(ctx, database) + if err != nil { + return tableReference{}, err + } + if len(parts) == 2 { + namespace = parts[0] + parts = parts[1:] + } + return tableReference{catalog: catalog, namespace: namespace, table: parts[0]}, nil +} + +func (d *builtInSQLDialect) currentNamespace(ctx context.Context, database *sql.DB) (string, error) { + query := "SELECT current_schema()" + if d.storeType == config.AttributeStoreTypeMySQL { + query = "SELECT DATABASE()" + } + var namespace string + if err := database.QueryRowContext(ctx, query).Scan(&namespace); err != nil { + return "", fmt.Errorf("resolve table namespace: %w", err) + } + if namespace == "" { + return "", fmt.Errorf("database has no active namespace") + } + return namespace, nil +} + +func (d *builtInSQLDialect) currentWarehouseNamespace( + ctx context.Context, + database *sql.DB, +) (string, string, error) { + query := "SELECT current_catalog(), current_schema()" + if d.storeType == config.AttributeStoreTypeSnowflake { + query = "SELECT CURRENT_DATABASE(), CURRENT_SCHEMA()" + } + var catalog, namespace string + if err := database.QueryRowContext(ctx, query).Scan(&catalog, &namespace); err != nil { + return "", "", fmt.Errorf("resolve warehouse namespace: %w", err) + } + if catalog == "" || namespace == "" { + return "", "", fmt.Errorf("warehouse has no active catalog/database and schema") + } + return catalog, namespace, nil +} + +func (d *builtInSQLDialect) describeColumnsQuery(reference tableReference) (string, []any) { + if d.storeType == config.AttributeStoreTypeMySQL { + return `SELECT column_name, data_type, column_type, is_nullable, +character_maximum_length, numeric_precision, numeric_scale, column_default, +extra, generation_expression +FROM information_schema.columns +WHERE table_schema = ? AND table_name = ? +ORDER BY ordinal_position`, []any{reference.namespace, reference.table} + } + if d.storeType == config.AttributeStoreTypePostgres { + return `SELECT column_name, data_type, udt_name, is_nullable, +character_maximum_length, numeric_precision, numeric_scale, column_default, +is_identity, is_generated +FROM information_schema.columns +WHERE table_schema = $1 AND table_name = $2 +ORDER BY ordinal_position`, []any{reference.namespace, reference.table} + } + qualifiedInformationSchema := d.quoteIdentifier(reference.catalog) + "." + + d.quoteIdentifier("information_schema") + "." + d.quoteIdentifier("columns") + if d.storeType == config.AttributeStoreTypeSnowflake { + return `SELECT column_name, data_type, COALESCE(data_type_alias, data_type), is_nullable, +character_maximum_length, numeric_precision, numeric_scale, column_default, +is_identity, expression +FROM ` + qualifiedInformationSchema + ` +WHERE table_schema = ? AND table_name = ? +ORDER BY ordinal_position`, []any{reference.namespace, reference.table} + } + return `SELECT column_name, data_type, full_data_type, is_nullable, +character_maximum_length, numeric_precision, numeric_scale, column_default, +is_identity, is_generated +FROM ` + qualifiedInformationSchema + ` +WHERE table_schema = ? AND table_name = ? +ORDER BY ordinal_position`, []any{reference.namespace, reference.table} +} + +func (d *builtInSQLDialect) enrichColumns( + ctx context.Context, + database *sql.DB, + reference tableReference, + columns map[string]columnSchema, +) error { + if d.storeType != config.AttributeStoreTypeDatabricks { + return nil + } + var createStatement string + if err := database.QueryRowContext(ctx, "SHOW CREATE TABLE "+d.qualifiedTable(reference)).Scan(&createStatement); err != nil { + return fmt.Errorf("show Databricks table definition: %w", err) + } + definitions, err := parseDatabricksColumnDefinitions(createStatement, d.qualifiedTable(reference)) + if err != nil { + return err + } + for name, column := range columns { + definition, found := definitions[name] + if !found { + return fmt.Errorf("Databricks table definition is missing column %q", name) + } + definitionKeywords := sqlOutsideQuotedValues(definition) + column.hasDefault = databricksDefaultPattern.MatchString(definitionKeywords) + column.generated = databricksGeneratedPattern.MatchString(definitionKeywords) + columns[name] = column + } + return nil +} + +var ( + databricksDefaultPattern = regexp.MustCompile(`(?i)\bDEFAULT\b`) + databricksGeneratedPattern = regexp.MustCompile(`(?i)\bGENERATED\s+(?:ALWAYS|BY\s+DEFAULT)\s+AS\b`) +) + +func parseDatabricksColumnDefinitions(createStatement, qualifiedTable string) (map[string]string, error) { + tablePosition := strings.Index(createStatement, qualifiedTable) + if tablePosition < 0 { + return nil, fmt.Errorf("Databricks table definition does not identify %s", qualifiedTable) + } + openingPosition := strings.IndexByte(createStatement[tablePosition+len(qualifiedTable):], '(') + if openingPosition < 0 { + return nil, fmt.Errorf("Databricks table definition has no column list") + } + openingPosition += tablePosition + len(qualifiedTable) + columnList, err := extractDelimitedSQL(createStatement, openingPosition) + if err != nil { + return nil, err + } + definitions := map[string]string{} + for _, definition := range splitTopLevelSQL(columnList) { + name, remainder, isColumn := parseDatabricksColumnDefinition(definition) + if isColumn { + definitions[name] = remainder + } + } + return definitions, nil +} + +func extractDelimitedSQL(statement string, openingPosition int) (string, error) { + depth := 0 + quote := byte(0) + for position := openingPosition; position < len(statement); position++ { + character := statement[position] + if quote != 0 { + if character == quote { + if position+1 < len(statement) && statement[position+1] == quote { + position++ + continue + } + quote = 0 + } + continue + } + switch character { + case '\'', '"', '`': + quote = character + case '(': + depth++ + case ')': + depth-- + if depth == 0 { + return statement[openingPosition+1 : position], nil + } + } + } + return "", fmt.Errorf("Databricks table definition has an unterminated column list") +} + +func splitTopLevelSQL(value string) []string { + parts := make([]string, 0) + start := 0 + parentheses, angles, brackets := 0, 0, 0 + quote := byte(0) + for position := 0; position < len(value); position++ { + character := value[position] + if quote != 0 { + if character == quote { + if position+1 < len(value) && value[position+1] == quote { + position++ + continue + } + quote = 0 + } + continue + } + switch character { + case '\'', '"', '`': + quote = character + case '(': + parentheses++ + case ')': + parentheses-- + case '<': + angles++ + case '>': + angles-- + case '[': + brackets++ + case ']': + brackets-- + case ',': + if parentheses == 0 && angles == 0 && brackets == 0 { + parts = append(parts, strings.TrimSpace(value[start:position])) + start = position + 1 + } + } + } + parts = append(parts, strings.TrimSpace(value[start:])) + return parts +} + +func parseDatabricksColumnDefinition(definition string) (string, string, bool) { + definition = strings.TrimSpace(definition) + if definition == "" { + return "", "", false + } + if definition[0] != '`' { + end := strings.IndexAny(definition, " \t\r\n") + if end < 0 { + return "", "", false + } + name := definition[:end] + switch strings.ToUpper(name) { + case "CONSTRAINT", "PRIMARY", "FOREIGN", "UNIQUE", "CHECK": + return "", "", false + default: + return name, strings.TrimSpace(definition[end:]), true + } + } + var name strings.Builder + for position := 1; position < len(definition); position++ { + if definition[position] != '`' { + name.WriteByte(definition[position]) + continue + } + if position+1 < len(definition) && definition[position+1] == '`' { + name.WriteByte('`') + position++ + continue + } + return name.String(), strings.TrimSpace(definition[position+1:]), true + } + return "", "", false +} + +func sqlOutsideQuotedValues(value string) string { + result := []byte(value) + quote := byte(0) + for position := 0; position < len(result); position++ { + character := result[position] + if quote == 0 { + if character == '\'' || character == '"' || character == '`' { + quote = character + result[position] = ' ' + } + continue + } + result[position] = ' ' + if character != quote { + continue + } + if position+1 < len(result) && result[position+1] == quote { + result[position+1] = ' ' + position++ + continue + } + quote = 0 + } + return string(result) +} + +func (d *builtInSQLDialect) describePrimaryKeys( + ctx context.Context, + database *sql.DB, + reference tableReference, +) (keys []string, err error) { + query := `SELECT kcu.column_name +FROM information_schema.table_constraints tc +JOIN information_schema.key_column_usage kcu + ON tc.constraint_name = kcu.constraint_name + AND tc.table_schema = kcu.table_schema + AND tc.table_name = kcu.table_name +WHERE tc.constraint_type = 'PRIMARY KEY' + AND tc.table_schema = $1 AND tc.table_name = $2 +ORDER BY kcu.ordinal_position` + if d.storeType == config.AttributeStoreTypeMySQL { + query = `SELECT column_name +FROM information_schema.key_column_usage +WHERE constraint_name = 'PRIMARY' AND table_schema = ? AND table_name = ? +ORDER BY ordinal_position` + } + rows, err := database.QueryContext(ctx, query, reference.namespace, reference.table) + if err != nil { + return nil, fmt.Errorf("describe primary key: %w", err) + } + defer func() { + if closeErr := rows.Close(); closeErr != nil { + err = errors.Join(err, fmt.Errorf("close primary-key rows: %w", closeErr)) + } + }() + for rows.Next() { + var key string + if scanErr := rows.Scan(&key); scanErr != nil { + return nil, fmt.Errorf("scan primary key: %w", scanErr) + } + keys = append(keys, key) + } + if rowsErr := rows.Err(); rowsErr != nil { + return nil, fmt.Errorf("iterate primary keys: %w", rowsErr) + } + return keys, nil +} + +func (d *builtInSQLDialect) buildUpsert( + snapshot *tableSchema, + flowID string, + columnNames []string, + values map[string]filteredValue, +) (string, []any) { + if d.storeType.IsWarehouse() { + return d.buildWarehouseMerge(snapshot, flowID, columnNames, values) + } + return d.buildRelationalUpsert(snapshot, flowID, columnNames, values) +} + +func (d *builtInSQLDialect) buildRelationalUpsert( + snapshot *tableSchema, + flowID string, + columnNames []string, + values map[string]filteredValue, +) (string, []any) { + quotedTable := d.qualifiedTable(snapshot.reference) + columns := []string{d.quoteIdentifier(snapshot.flowIDColumn)} + placeholders := []string{d.placeholder(1)} + updates := make([]string, 0, len(columnNames)) + arguments := []any{flowID} + for index, name := range columnNames { + quoted := d.quoteIdentifier(name) + columns = append(columns, quoted) + placeholders = append(placeholders, d.valueExpression(d.placeholder(index+2), values[name].column)) + arguments = append(arguments, d.argumentValue(values[name].column, values[name].value)) + if d.storeType == config.AttributeStoreTypePostgres { + updates = append(updates, quoted+" = EXCLUDED."+quoted) + } else { + updates = append(updates, quoted+" = VALUES("+quoted+")") + } + } + query := "INSERT INTO " + quotedTable + " (" + strings.Join(columns, ", ") + ") VALUES (" + + strings.Join(placeholders, ", ") + ")" + if d.storeType == config.AttributeStoreTypePostgres { + query += " ON CONFLICT (" + d.quoteIdentifier(snapshot.flowIDColumn) + ") DO UPDATE SET " + + strings.Join(updates, ", ") + } else { + query += " ON DUPLICATE KEY UPDATE " + strings.Join(updates, ", ") + } + return query, arguments +} + +func (d *builtInSQLDialect) buildWarehouseMerge( + snapshot *tableSchema, + flowID string, + columnNames []string, + values map[string]filteredValue, +) (string, []any) { + flowIDColumn := d.quoteIdentifier(snapshot.flowIDColumn) + sourceExpressions := []string{d.flowIDExpression("?") + " AS " + flowIDColumn} + insertColumns := []string{flowIDColumn} + insertValues := []string{"source." + flowIDColumn} + updates := make([]string, 0, len(columnNames)) + arguments := []any{flowID} + for _, name := range columnNames { + quoted := d.quoteIdentifier(name) + sourceExpressions = append(sourceExpressions, d.valueExpression("?", values[name].column)+" AS "+quoted) + insertColumns = append(insertColumns, quoted) + insertValues = append(insertValues, "source."+quoted) + updates = append(updates, "target."+quoted+" = source."+quoted) + arguments = append(arguments, d.argumentValue(values[name].column, values[name].value)) + } + query := "MERGE INTO " + d.qualifiedTable(snapshot.reference) + " AS target USING (SELECT " + + strings.Join(sourceExpressions, ", ") + ") AS source ON target." + flowIDColumn + " = source." + + flowIDColumn + " WHEN MATCHED THEN UPDATE SET " + strings.Join(updates, ", ") + + " WHEN NOT MATCHED THEN INSERT (" + strings.Join(insertColumns, ", ") + ") VALUES (" + + strings.Join(insertValues, ", ") + ")" + return query, arguments +} + +func (d *builtInSQLDialect) flowIDExpression(placeholder string) string { + if d.storeType == config.AttributeStoreTypeDatabricks { + return "CAST(" + placeholder + " AS STRING)" + } + return "CAST(" + placeholder + " AS VARCHAR)" +} + +func (d *builtInSQLDialect) valueExpression(placeholder string, column columnSchema) string { + if column.acceptsBinary(d.storeType) && d.storeType == config.AttributeStoreTypeDatabricks { + return "UNHEX(" + placeholder + ")" + } + if column.acceptsBinary(d.storeType) && d.storeType == config.AttributeStoreTypeSnowflake { + return "TO_BINARY(" + placeholder + ", 'HEX')" + } + if column.dataType == "variant" && d.storeType.IsWarehouse() { + return "PARSE_JSON(" + placeholder + ")" + } + if !column.acceptsTemporal(d.storeType) || !d.storeType.IsWarehouse() { + return placeholder + } + if d.storeType == config.AttributeStoreTypeDatabricks { + if column.dataType == "timestamp_ntz" || column.dataType == "timestamp without time zone" { + return "CAST(" + placeholder + " AS TIMESTAMP_NTZ)" + } + return "CAST(" + placeholder + " AS TIMESTAMP)" + } + switch column.dataType { + case "timestamp with time zone", "timestamp_tz": + return "TO_TIMESTAMP_TZ(" + placeholder + ")" + case "timestamp with local time zone", "timestamp_ltz": + return "TO_TIMESTAMP_LTZ(" + placeholder + ")" + default: + return "TO_TIMESTAMP_NTZ(" + placeholder + ")" + } +} + +func (d *builtInSQLDialect) argumentValue(column columnSchema, value any) any { + if d.storeType.IsWarehouse() && column.acceptsBinary(d.storeType) { + if binaryValue, isBinary := value.([]byte); isBinary { + return hex.EncodeToString(binaryValue) + } + } + return value +} + +func (d *builtInSQLDialect) placeholder(position int) string { + if d.storeType == config.AttributeStoreTypePostgres { + return "$" + strconv.Itoa(position) + } + return "?" +} + +func (d *builtInSQLDialect) qualifiedTable(reference tableReference) string { + parts := make([]string, 0, 3) + if reference.catalog != "" { + parts = append(parts, d.quoteIdentifier(reference.catalog)) + } + parts = append(parts, d.quoteIdentifier(reference.namespace), d.quoteIdentifier(reference.table)) + return strings.Join(parts, ".") +} + +func (d *builtInSQLDialect) quoteIdentifier(identifier string) string { + if d.storeType == config.AttributeStoreTypeMySQL || d.storeType == config.AttributeStoreTypeDatabricks { + return "`" + strings.ReplaceAll(identifier, "`", "``") + "`" + } + return `"` + strings.ReplaceAll(identifier, `"`, `""`) + `"` +} diff --git a/server/service/common/attributestore/sql_dialect_test.go b/server/service/common/attributestore/sql_dialect_test.go new file mode 100644 index 000000000..9e882a2ea --- /dev/null +++ b/server/service/common/attributestore/sql_dialect_test.go @@ -0,0 +1,393 @@ +// Copyright (c) 2026 Super Durable, Inc. +// +// Licensed under the Sustainable Use License 1.0. +// You may not use this file except in compliance with the License. +// See the LICENSE file in the repository root. +// +// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0 + +package attributestore + +import ( + "context" + "database/sql" + "database/sql/driver" + "errors" + "fmt" + "io" + "strings" + "sync" + "testing" + + "github.com/stretchr/testify/require" + "github.com/superdurable/dex/config" + "github.com/superdurable/dex/gen/dexpb" + "github.com/superdurable/dex/service/common/log" +) + +type warehouseMetadataConnector struct { + catalog string + namespace string +} + +type warehouseMetadataConnection struct { + catalog string + namespace string +} + +type warehouseMetadataRows struct { + values []driver.Value + wasRead bool +} + +type warehouseContractConnector struct { + mu sync.Mutex + metadataRows [][]driver.Value + queryErr error + pingCount int + execQueries []string + execArgs [][]driver.NamedValue + isClosed bool +} + +type warehouseContractConnection struct { + connector *warehouseContractConnector +} + +type warehouseContractRows struct { + columns []string + values [][]driver.Value + index int +} + +func TestWarehouseTableReferenceResolution(t *testing.T) { + database := sql.OpenDB(&warehouseMetadataConnector{catalog: "analytics", namespace: "reporting"}) + t.Cleanup(func() { require.NoError(t, database.Close()) }) + + for _, storeType := range []config.AttributeStoreType{ + config.AttributeStoreTypeDatabricks, + config.AttributeStoreTypeSnowflake, + } { + dialect, err := newSQLDialect(storeType) + require.NoError(t, err) + + reference, err := dialect.resolveTableReference(context.Background(), database, "flow_attributes") + require.NoError(t, err) + require.Equal(t, tableReference{catalog: "analytics", namespace: "reporting", table: "flow_attributes"}, reference) + + reference, err = dialect.resolveTableReference(context.Background(), database, "audit.flow_attributes") + require.NoError(t, err) + require.Equal(t, tableReference{catalog: "analytics", namespace: "audit", table: "flow_attributes"}, reference) + + reference, err = dialect.resolveTableReference(context.Background(), database, "other.audit.flow_attributes") + require.NoError(t, err) + require.Equal(t, tableReference{catalog: "other", namespace: "audit", table: "flow_attributes"}, reference) + + _, err = dialect.resolveTableReference(context.Background(), database, "too.many.name.parts") + require.ErrorContains(t, err, "at most 3") + } +} + +func TestWarehouseFlowIDColumnValidation(t *testing.T) { + store := &sqlStore{cfg: config.AttributeStoreConfigEntry{ + Type: config.AttributeStoreTypeSnowflake, FlowIDColumn: "flow_id", + }} + columns := map[string]columnSchema{ + "flow_id": {name: "flow_id", dataType: "text"}, + } + flowIDColumn, err := store.resolveFlowIDColumn(context.Background(), columns) + require.NoError(t, err) + require.Equal(t, "flow_id", flowIDColumn) + + columns["flow_id"] = columnSchema{name: "flow_id", dataType: "text", nullable: true} + _, err = store.resolveFlowIDColumn(context.Background(), columns) + require.ErrorContains(t, err, "non-null") + + delete(columns, "flow_id") + _, err = store.resolveFlowIDColumn(context.Background(), columns) + require.ErrorContains(t, err, "does not exist") +} + +func TestWarehouseDescribeColumnsQueries(t *testing.T) { + reference := tableReference{catalog: "analytics", namespace: "reporting", table: "flow_attributes"} + + databricks, err := newSQLDialect(config.AttributeStoreTypeDatabricks) + require.NoError(t, err) + query, arguments := databricks.describeColumnsQuery(reference) + require.Contains(t, query, "FROM `analytics`.`information_schema`.`columns`") + require.Contains(t, query, "full_data_type") + require.Equal(t, []any{"reporting", "flow_attributes"}, arguments) + + snowflake, err := newSQLDialect(config.AttributeStoreTypeSnowflake) + require.NoError(t, err) + query, arguments = snowflake.describeColumnsQuery(reference) + require.Contains(t, query, `FROM "analytics"."information_schema"."columns"`) + require.Contains(t, query, "data_type_alias") + require.Contains(t, query, "expression") + require.Equal(t, []any{"reporting", "flow_attributes"}, arguments) +} + +func TestParseDatabricksColumnDefinitions(t *testing.T) { + definitions, err := parseDatabricksColumnDefinitions(`CREATE TABLE `+"`analytics`.`reporting`.`flow attributes`"+` ( + `+"`flow``id`"+` STRING NOT NULL, + `+"`profile`"+` STRUCT>, + `+"`created_at`"+` TIMESTAMP DEFAULT current_timestamp(), + `+"`derived`"+` STRING GENERATED ALWAYS AS (concat(`+"`flow``id`"+`, ',')) +) USING delta`, "`analytics`.`reporting`.`flow attributes`") + require.NoError(t, err) + require.Equal(t, "STRING NOT NULL", definitions["flow`id"]) + require.Contains(t, definitions["profile"], "STRUCT>") + require.True(t, databricksDefaultPattern.MatchString(definitions["created_at"])) + require.True(t, databricksGeneratedPattern.MatchString(definitions["derived"])) + require.False(t, databricksDefaultPattern.MatchString(sqlOutsideQuotedValues("STRING COMMENT 'DEFAULT value'"))) + require.False(t, databricksGeneratedPattern.MatchString(sqlOutsideQuotedValues("STRING COMMENT 'GENERATED ALWAYS AS'"))) +} + +func TestWarehouseSQLStoreContract(t *testing.T) { + for _, storeType := range []config.AttributeStoreType{ + config.AttributeStoreTypeDatabricks, + config.AttributeStoreTypeSnowflake, + } { + t.Run(string(storeType), func(t *testing.T) { + connector := &warehouseContractConnector{metadataRows: warehouseContractMetadata(storeType)} + database := sql.OpenDB(connector) + dialect, err := newSQLDialect(storeType) + require.NoError(t, err) + store, err := initializeSQLStore(context.Background(), config.AttributeStoreConfigEntry{ + Type: storeType, + TableName: "analytics.reporting.flow_attributes", + FlowIDColumn: "flow_id", + }, log.NewNoop(), dialect, database) + require.NoError(t, err) + require.Equal(t, 1, connector.pingCount) + require.Equal(t, "flow_id", store.schema.Load().flowIDColumn) + + err = store.writeBatch(context.Background(), "flow-1", []*dexpb.AttributeSyncItem{ + {Key: "name", Value: stringValue("first")}, + {Key: "profile", Value: objectValue("json", `{"active":true}`)}, + {Key: "name", Value: stringValue("latest")}, + }) + require.NoError(t, err) + connector.mu.Lock() + execQueries := append([]string(nil), connector.execQueries...) + execArguments := append([][]driver.NamedValue(nil), connector.execArgs...) + connector.metadataRows = append(connector.metadataRows, warehouseMetadataColumn( + storeType, "late_column", warehouseStringType(storeType), warehouseStringType(storeType), "YES", + )) + connector.mu.Unlock() + require.Len(t, execQueries, 1) + require.Contains(t, execQueries[0], "MERGE INTO") + require.NotContains(t, execQueries[0], "latest") + require.Equal(t, "flow-1", execArguments[0][0].Value) + require.Equal(t, "latest", execArguments[0][1].Value) + require.Equal(t, `{"active":true}`, execArguments[0][2].Value) + + require.NoError(t, store.refreshSchema(context.Background())) + require.Contains(t, store.schema.Load().columns, "late_column") + retainedSnapshot := store.schema.Load() + connector.mu.Lock() + connector.queryErr = errors.New("metadata unavailable") + connector.mu.Unlock() + require.ErrorContains(t, store.refreshSchema(context.Background()), "metadata unavailable") + require.Same(t, retainedSnapshot, store.schema.Load()) + + connector.mu.Lock() + connector.queryErr = nil + executionCount := len(connector.execQueries) + connector.mu.Unlock() + err = store.writeBatch(context.Background(), "flow-1", []*dexpb.AttributeSyncItem{ + {Key: "flow_id", Value: stringValue("replacement")}, + {Key: "missing", Value: stringValue("ignored")}, + {Key: "profile", Value: objectValue("json", `{invalid`)}, + }) + require.NoError(t, err) + connector.mu.Lock() + actualExecutionCount := len(connector.execQueries) + connector.mu.Unlock() + require.Equal(t, executionCount, actualExecutionCount) + + require.NoError(t, store.close()) + connector.mu.Lock() + isClosed := connector.isClosed + connector.mu.Unlock() + require.True(t, isClosed) + }) + } +} + +func warehouseContractMetadata(storeType config.AttributeStoreType) [][]driver.Value { + return [][]driver.Value{ + warehouseMetadataColumn(storeType, "flow_id", warehouseStringType(storeType), warehouseStringType(storeType), "NO"), + warehouseMetadataColumn(storeType, "name", warehouseStringType(storeType), warehouseStringType(storeType), "YES"), + warehouseMetadataColumn(storeType, "profile", "variant", "variant", "YES"), + } +} + +func warehouseStringType(storeType config.AttributeStoreType) string { + if storeType == config.AttributeStoreTypeDatabricks { + return "string" + } + return "varchar" +} + +func warehouseMetadataColumn( + storeType config.AttributeStoreType, + name, dataType, columnType, nullable string, +) []driver.Value { + return []driver.Value{name, dataType, columnType, nullable, nil, nil, nil, nil, "NO", nil} +} + +func (c *warehouseMetadataConnector) Connect(context.Context) (driver.Conn, error) { + return &warehouseMetadataConnection{catalog: c.catalog, namespace: c.namespace}, nil +} + +func (c *warehouseMetadataConnector) Driver() driver.Driver { + return warehouseMetadataDriver{} +} + +type warehouseMetadataDriver struct{} + +func (warehouseMetadataDriver) Open(string) (driver.Conn, error) { + return nil, errors.New("use connector") +} + +func (c *warehouseMetadataConnection) QueryContext( + context.Context, + string, + []driver.NamedValue, +) (driver.Rows, error) { + return &warehouseMetadataRows{values: []driver.Value{c.catalog, c.namespace}}, nil +} + +func (c *warehouseMetadataConnection) Prepare(string) (driver.Stmt, error) { + return nil, errors.New("prepare is unsupported") +} + +func (c *warehouseMetadataConnection) Close() error { + return nil +} + +func (c *warehouseMetadataConnection) Begin() (driver.Tx, error) { + return nil, errors.New("transactions are unsupported") +} + +func (r *warehouseMetadataRows) Columns() []string { + return []string{"catalog", "namespace"} +} + +func (r *warehouseMetadataRows) Close() error { + return nil +} + +func (r *warehouseMetadataRows) Next(destination []driver.Value) error { + if r.wasRead { + return io.EOF + } + copy(destination, r.values) + r.wasRead = true + return nil +} + +func (c *warehouseContractConnector) Connect(context.Context) (driver.Conn, error) { + return &warehouseContractConnection{connector: c}, nil +} + +func (c *warehouseContractConnector) Driver() driver.Driver { + return warehouseMetadataDriver{} +} + +func (c *warehouseContractConnection) Ping(context.Context) error { + c.connector.mu.Lock() + defer c.connector.mu.Unlock() + c.connector.pingCount++ + return nil +} + +func (c *warehouseContractConnection) QueryContext( + _ context.Context, + query string, + _ []driver.NamedValue, +) (driver.Rows, error) { + c.connector.mu.Lock() + defer c.connector.mu.Unlock() + if c.connector.queryErr != nil { + return nil, c.connector.queryErr + } + if strings.Contains(strings.ToLower(query), "information_schema") { + values := make([][]driver.Value, len(c.connector.metadataRows)) + for index, row := range c.connector.metadataRows { + values[index] = append([]driver.Value(nil), row...) + } + return &warehouseContractRows{ + columns: []string{"column_name", "data_type", "column_type", "is_nullable", "character_maximum_length", "numeric_precision", "numeric_scale", "column_default", "is_identity", "is_generated"}, + values: values, + }, nil + } + if strings.HasPrefix(strings.ToUpper(query), "SHOW CREATE TABLE") { + return &warehouseContractRows{ + columns: []string{"createtab_stmt"}, + values: [][]driver.Value{{c.databricksCreateStatement()}}, + }, nil + } + return &warehouseContractRows{ + columns: []string{"catalog", "namespace"}, + values: [][]driver.Value{{"analytics", "reporting"}}, + }, nil +} + +func (c *warehouseContractConnection) databricksCreateStatement() string { + definitions := make([]string, 0, len(c.connector.metadataRows)) + for _, row := range c.connector.metadataRows { + name := strings.ReplaceAll(row[0].(string), "`", "``") + definition := fmt.Sprintf("`%s` %s", name, row[1].(string)) + if row[3] == "NO" { + definition += " NOT NULL" + } + definitions = append(definitions, definition) + } + return "CREATE TABLE `analytics`.`reporting`.`flow_attributes` (" + strings.Join(definitions, ", ") + ") USING delta" +} + +func (c *warehouseContractConnection) ExecContext( + _ context.Context, + query string, + arguments []driver.NamedValue, +) (driver.Result, error) { + c.connector.mu.Lock() + defer c.connector.mu.Unlock() + c.connector.execQueries = append(c.connector.execQueries, query) + c.connector.execArgs = append(c.connector.execArgs, append([]driver.NamedValue(nil), arguments...)) + return driver.RowsAffected(1), nil +} + +func (c *warehouseContractConnection) Prepare(string) (driver.Stmt, error) { + return nil, errors.New("prepare is unsupported") +} + +func (c *warehouseContractConnection) Close() error { + c.connector.mu.Lock() + defer c.connector.mu.Unlock() + c.connector.isClosed = true + return nil +} + +func (c *warehouseContractConnection) Begin() (driver.Tx, error) { + return nil, errors.New("transactions are unsupported") +} + +func (r *warehouseContractRows) Columns() []string { + return r.columns +} + +func (r *warehouseContractRows) Close() error { + return nil +} + +func (r *warehouseContractRows) Next(destination []driver.Value) error { + if r.index >= len(r.values) { + return io.EOF + } + copy(destination, r.values[r.index]) + r.index++ + return nil +} diff --git a/server/service/common/attributestore/sql_store.go b/server/service/common/attributestore/sql_store.go new file mode 100644 index 000000000..0568f3241 --- /dev/null +++ b/server/service/common/attributestore/sql_store.go @@ -0,0 +1,324 @@ +// Copyright (c) 2026 Super Durable, Inc. +// +// Licensed under the Sustainable Use License 1.0. +// You may not use this file except in compliance with the License. +// See the LICENSE file in the repository root. +// +// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0 + +package attributestore + +import ( + "context" + "database/sql" + "errors" + "fmt" + "sort" + "strings" + "sync/atomic" + + _ "github.com/databricks/databricks-sql-go" + _ "github.com/go-sql-driver/mysql" + _ "github.com/jackc/pgx/v5/stdlib" + _ "github.com/snowflakedb/gosnowflake/v2" + "github.com/superdurable/dex/config" + "github.com/superdurable/dex/gen/dexpb" + "github.com/superdurable/dex/service/common/log" + "github.com/superdurable/dex/service/common/log/tag" +) + +type sqlStore struct { + cfg config.AttributeStoreConfigEntry + dialect sqlDialect + db *sql.DB + table tableReference + schema atomic.Pointer[tableSchema] + logger log.Logger +} + +type tableReference struct { + catalog string + namespace string + table string +} + +type tableSchema struct { + reference tableReference + flowIDColumn string + columns map[string]columnSchema +} + +type columnSchema struct { + name string + dataType string + columnType string + nullable bool + characterMaximum *int64 + numericPrecision *int64 + numericScale *int64 + hasDefault bool + generated bool +} + +type filteredValue struct { + column columnSchema + value any +} + +func openSQLStore( + ctx context.Context, + cfg config.AttributeStoreConfigEntry, + logger log.Logger, +) (*sqlStore, error) { + dialect, err := newSQLDialect(cfg.Type) + if err != nil { + return nil, err + } + database, err := sql.Open(dialect.driverName(), cfg.DSN) + if err != nil { + return nil, fmt.Errorf("open connection: %w", err) + } + entry, err := initializeSQLStore(ctx, cfg, logger, dialect, database) + if err != nil { + return nil, closeSQLStoreOnError(database, err) + } + return entry, nil +} + +func initializeSQLStore( + ctx context.Context, + cfg config.AttributeStoreConfigEntry, + logger log.Logger, + dialect sqlDialect, + database *sql.DB, +) (*sqlStore, error) { + entry := &sqlStore{cfg: cfg, dialect: dialect, db: database, logger: logger} + if err := database.PingContext(ctx); err != nil { + return nil, fmt.Errorf("ping database: %w", err) + } + reference, err := dialect.resolveTableReference(ctx, database, cfg.TableName) + if err != nil { + return nil, err + } + entry.table = reference + snapshot, err := entry.describe(ctx) + if err != nil { + return nil, err + } + entry.schema.Store(snapshot) + return entry, nil +} + +func closeSQLStoreOnError(database *sql.DB, sourceErr error) error { + if closeErr := database.Close(); closeErr != nil { + return errors.Join(sourceErr, closeErr) + } + return sourceErr +} + +func (s *sqlStore) describe(ctx context.Context) (*tableSchema, error) { + columns, err := s.describeColumns(ctx) + if err != nil { + return nil, err + } + flowIDColumn, err := s.resolveFlowIDColumn(ctx, columns) + if err != nil { + return nil, err + } + for name, column := range columns { + if name == flowIDColumn { + continue + } + if !column.nullable && !column.hasDefault && !column.generated { + return nil, fmt.Errorf("column %q prevents partial row inserts", name) + } + } + return &tableSchema{ + reference: s.table, + flowIDColumn: flowIDColumn, + columns: columns, + }, nil +} + +func (s *sqlStore) resolveFlowIDColumn( + ctx context.Context, + columns map[string]columnSchema, +) (string, error) { + if s.cfg.Type.IsWarehouse() { + column, found := columns[s.cfg.FlowIDColumn] + if !found { + return "", fmt.Errorf("flowIdColumn %q does not exist", s.cfg.FlowIDColumn) + } + if !column.acceptsString() || column.nullable || column.generated { + return "", fmt.Errorf("flowIdColumn %q must be a non-null, non-generated string column", column.name) + } + return column.name, nil + } + primaryKeys, err := s.dialect.describePrimaryKeys(ctx, s.db, s.table) + if err != nil { + return "", err + } + if len(primaryKeys) != 1 { + return "", fmt.Errorf("table must have exactly one primary-key column") + } + primaryKey, found := columns[primaryKeys[0]] + if !found { + return "", fmt.Errorf("primary-key column was not described") + } + if !primaryKey.acceptsString() { + return "", fmt.Errorf("primary-key column %q cannot store FlowID strings", primaryKey.name) + } + return primaryKey.name, nil +} + +func (s *sqlStore) describeColumns(ctx context.Context) (map[string]columnSchema, error) { + query, arguments := s.dialect.describeColumnsQuery(s.table) + rows, err := s.db.QueryContext(ctx, query, arguments...) + if err != nil { + return nil, fmt.Errorf("describe columns: %w", err) + } + defer func() { + if closeErr := rows.Close(); closeErr != nil { + s.logger.Error("close Attribute Store describe rows", tag.Error(closeErr)) + } + }() + columns := map[string]columnSchema{} + for rows.Next() { + column, scanErr := scanColumn(rows, s.cfg.Type) + if scanErr != nil { + return nil, scanErr + } + columns[column.name] = column + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterate described columns: %w", err) + } + if len(columns) == 0 { + return nil, fmt.Errorf("table does not exist or has no columns") + } + if err := s.dialect.enrichColumns(ctx, s.db, s.table, columns); err != nil { + return nil, err + } + return columns, nil +} + +func scanColumn(rows *sql.Rows, storeType config.AttributeStoreType) (columnSchema, error) { + var ( + column columnSchema + dataType, columnType, nullable string + characterMaximum, precision, scale sql.NullInt64 + defaultValue, generatedA, generatedB sql.NullString + ) + if err := rows.Scan( + &column.name, + &dataType, + &columnType, + &nullable, + &characterMaximum, + &precision, + &scale, + &defaultValue, + &generatedA, + &generatedB, + ); err != nil { + return columnSchema{}, fmt.Errorf("scan described column: %w", err) + } + column.dataType = strings.ToLower(dataType) + column.columnType = strings.ToLower(columnType) + column.nullable = strings.EqualFold(nullable, "YES") + column.characterMaximum = nullableInt64(characterMaximum) + column.numericPrecision = nullableInt64(precision) + column.numericScale = nullableInt64(scale) + column.hasDefault = defaultValue.Valid + column.generated = isGeneratedColumn(storeType, generatedA.String, generatedB.String) + return column, nil +} + +func nullableInt64(value sql.NullInt64) *int64 { + if !value.Valid { + return nil + } + return &value.Int64 +} + +func isGeneratedColumn(storeType config.AttributeStoreType, generatedA, generatedB string) bool { + switch storeType { + case config.AttributeStoreTypeSnowflake: + return strings.EqualFold(generatedA, "YES") || generatedB != "" + case config.AttributeStoreTypePostgres, config.AttributeStoreTypeDatabricks: + return strings.EqualFold(generatedA, "YES") || strings.EqualFold(generatedA, "ALWAYS") || + strings.EqualFold(generatedB, "YES") || strings.EqualFold(generatedB, "ALWAYS") + default: + return generatedA != "" || generatedB != "" + } +} + +func (s *sqlStore) refreshSchema(ctx context.Context) error { + snapshot, err := s.describe(ctx) + if err != nil { + return redactStorageSecret(err, s.cfg.DSN) + } + s.schema.Store(snapshot) + return nil +} + +func (s *sqlStore) writeBatch( + ctx context.Context, + flowID string, + items []*dexpb.AttributeSyncItem, +) error { + snapshot := s.schema.Load() + if snapshot == nil { + return fmt.Errorf("Attribute Store schema is unavailable") + } + latest := make(map[string]*dexpb.Value, len(items)) + for _, item := range items { + if item == nil { + continue + } + latest[item.GetKey()] = item.GetValue() + } + filtered := make(map[string]filteredValue, len(latest)) + for name, value := range latest { + column, found := snapshot.columns[name] + if !found { + s.logger.Error("skip Attribute Store item: column does not exist", tag.AttributeName(name)) + continue + } + if name == snapshot.flowIDColumn { + s.logger.Error("skip Attribute Store item: Flow ID column is immutable", tag.AttributeName(name)) + continue + } + converted, err := column.convert(value, s.cfg.Type) + if err != nil { + s.logger.Error("skip incompatible Attribute Store item", tag.AttributeName(name), tag.Error(err)) + continue + } + filtered[name] = filteredValue{column: column, value: converted} + } + if len(filtered) == 0 { + return nil + } + query, arguments := s.buildUpsert(snapshot, flowID, filtered) + if _, err := s.db.ExecContext(ctx, query, arguments...); err != nil { + return redactStorageSecret(fmt.Errorf("execute Attribute Store upsert: %w", err), s.cfg.DSN) + } + return nil +} + +func (s *sqlStore) buildUpsert( + snapshot *tableSchema, + flowID string, + values map[string]filteredValue, +) (string, []any) { + columnNames := make([]string, 0, len(values)) + for name := range values { + columnNames = append(columnNames, name) + } + sort.Strings(columnNames) + return s.dialect.buildUpsert(snapshot, flowID, columnNames, values) +} + +func (s *sqlStore) close() error { + return redactStorageSecret(s.db.Close(), s.cfg.DSN) +} diff --git a/server/service/common/attributestore/value_conversion.go b/server/service/common/attributestore/value_conversion.go new file mode 100644 index 000000000..51d351758 --- /dev/null +++ b/server/service/common/attributestore/value_conversion.go @@ -0,0 +1,284 @@ +// Copyright (c) 2026 Super Durable, Inc. +// +// Licensed under the Sustainable Use License 1.0. +// You may not use this file except in compliance with the License. +// See the LICENSE file in the repository root. +// +// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0 + +package attributestore + +import ( + "encoding/json" + "fmt" + "math" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/superdurable/dex/config" + "github.com/superdurable/dex/gen/dexpb" +) + +func (c columnSchema) convert(value *dexpb.Value, storeType config.AttributeStoreType) (any, error) { + if value == nil || value.GetKind() == nil { + return nil, fmt.Errorf("value is missing") + } + switch kind := value.GetKind().(type) { + case *dexpb.Value_NullValue: + if !c.nullable { + return nil, fmt.Errorf("column is not nullable") + } + return nil, nil + case *dexpb.Value_StringValue: + if c.acceptsTemporal(storeType) { + return c.convertDatetime(kind.StringValue, storeType) + } + if !c.acceptsString() { + return nil, fmt.Errorf("column does not accept strings") + } + if c.characterMaximum != nil && int64(utf8.RuneCountInString(kind.StringValue)) > *c.characterMaximum { + return nil, fmt.Errorf("string exceeds column length") + } + return kind.StringValue, nil + case *dexpb.Value_IntValue: + if !c.acceptsInt(kind.IntValue, storeType) { + return nil, fmt.Errorf("column cannot store int64 value") + } + return kind.IntValue, nil + case *dexpb.Value_DoubleValue: + if !c.acceptsDouble(storeType) || math.IsNaN(kind.DoubleValue) || math.IsInf(kind.DoubleValue, 0) { + return nil, fmt.Errorf("column cannot store double value") + } + return kind.DoubleValue, nil + case *dexpb.Value_BoolValue: + if !c.acceptsBool(storeType) { + return nil, fmt.Errorf("column cannot store bool value") + } + return kind.BoolValue, nil + case *dexpb.Value_ObjValue: + return c.convertObject(kind.ObjValue, storeType) + case *dexpb.Value_InternalBlobIdForStringValue, *dexpb.Value_InternalBlobIdForObjValue: + return nil, fmt.Errorf("blob-backed value was not hydrated") + default: + return nil, fmt.Errorf("unsupported Attribute value") + } +} + +func (c columnSchema) acceptsString() bool { + switch c.dataType { + case "character", "character varying", "text", "char", "varchar", "tinytext", "mediumtext", + "longtext", "string": + return true + default: + return false + } +} + +func (c columnSchema) acceptsInt(value int64, storeType config.AttributeStoreType) bool { + unsigned := storeType == config.AttributeStoreTypeMySQL && strings.Contains(c.columnType, "unsigned") + if unsigned && value < 0 { + return false + } + switch c.dataType { + case "tinyint", "byteint": + return intInRange(value, unsigned, math.MinInt8, math.MaxInt8, math.MaxUint8) + case "smallint": + return intInRange(value, unsigned, math.MinInt16, math.MaxInt16, math.MaxUint16) + case "mediumint": + return intInRange(value, unsigned, -8388608, 8388607, 16777215) + case "integer", "int": + return intInRange(value, unsigned, math.MinInt32, math.MaxInt32, math.MaxUint32) + case "bigint": + return true + case "number", "numeric", "decimal", "fixed": + if c.numericScale != nil && *c.numericScale != 0 { + return false + } + if c.numericPrecision == nil { + return true + } + digits := len(strconv.FormatInt(value, 10)) + if value < 0 { + digits-- + } + return int64(digits) <= *c.numericPrecision + default: + return false + } +} + +func intInRange(value int64, unsigned bool, signedMinimum, signedMaximum, unsignedMaximum int64) bool { + if unsigned { + return value <= unsignedMaximum + } + return value >= signedMinimum && value <= signedMaximum +} + +func (c columnSchema) acceptsDouble(storeType config.AttributeStoreType) bool { + if storeType.IsWarehouse() { + switch c.dataType { + case "real", "double precision", "float", "float4", "float8", "double": + return true + default: + return false + } + } + switch c.dataType { + case "real", "double precision", "float", "float4", "float8", "double", "number", "numeric", + "decimal", "fixed": + return true + default: + return false + } +} + +func (c columnSchema) acceptsBool(storeType config.AttributeStoreType) bool { + if storeType != config.AttributeStoreTypeMySQL { + return c.dataType == "boolean" || c.dataType == "bool" + } + return c.columnType == "tinyint(1)" || c.columnType == "bit(1)" || + c.dataType == "boolean" || c.dataType == "bool" +} + +func (c columnSchema) acceptsTemporal(storeType config.AttributeStoreType) bool { + switch storeType { + case config.AttributeStoreTypePostgres: + return c.dataType == "timestamp with time zone" + case config.AttributeStoreTypeMySQL: + return c.dataType == "datetime" || c.dataType == "timestamp" + case config.AttributeStoreTypeDatabricks: + return c.dataType == "timestamp" || c.dataType == "timestamp_ntz" || + c.dataType == "timestamp without time zone" + case config.AttributeStoreTypeSnowflake: + return strings.HasPrefix(c.dataType, "timestamp") + default: + return false + } +} + +func (c columnSchema) convertDatetime(value string, storeType config.AttributeStoreType) (any, error) { + datetime, err := parseDatetime(value) + if err != nil { + return nil, err + } + if storeType.IsWarehouse() { + return datetime.UTC().Format(time.RFC3339Nano), nil + } + return datetime, nil +} + +func (c columnSchema) convertObject( + object *dexpb.EncodedObject, + storeType config.AttributeStoreType, +) (any, error) { + if object == nil { + return nil, fmt.Errorf("object is missing") + } + if object.GetEncoding() == "json" { + if !json.Valid(object.GetPayload()) { + return nil, fmt.Errorf("JSON payload is invalid") + } + if c.acceptsTemporal(storeType) { + datetime, err := parseJSONDatetime(object.GetPayload()) + if err != nil { + return nil, err + } + if storeType.IsWarehouse() { + return datetime.UTC().Format(time.RFC3339Nano), nil + } + return datetime, nil + } + if !c.acceptsJSON(storeType) { + return nil, fmt.Errorf("column does not accept JSON") + } + if storeType == config.AttributeStoreTypeMySQL { + return object.GetPayload(), nil + } + return string(object.GetPayload()), nil + } + if !c.acceptsBinary(storeType) { + return nil, fmt.Errorf("column does not accept binary objects") + } + if c.characterMaximum != nil && int64(len(object.GetPayload())) > *c.characterMaximum { + return nil, fmt.Errorf("object exceeds column length") + } + return object.GetPayload(), nil +} + +func (c columnSchema) acceptsJSON(storeType config.AttributeStoreType) bool { + if storeType.IsWarehouse() { + return c.dataType == "variant" + } + return c.dataType == "json" || c.dataType == "jsonb" +} + +func parseDatetime(value string) (time.Time, error) { + parsed, err := time.Parse(time.RFC3339Nano, value) + if err != nil { + return time.Time{}, fmt.Errorf("datetime must use RFC3339: %w", err) + } + return parsed, nil +} + +func parseJSONDatetime(payload []byte) (time.Time, error) { + decoder := json.NewDecoder(strings.NewReader(string(payload))) + decoder.UseNumber() + var value any + if err := decoder.Decode(&value); err != nil { + return time.Time{}, fmt.Errorf("decode JSON datetime: %w", err) + } + switch datetime := value.(type) { + case string: + return parseDatetime(datetime) + case json.Number: + return parseUnixDatetime(datetime.String()) + default: + return time.Time{}, fmt.Errorf("datetime payload must be a JSON string or epoch-seconds number") + } +} + +func parseUnixDatetime(value string) (time.Time, error) { + negative := strings.HasPrefix(value, "-") + unsigned := strings.TrimPrefix(value, "-") + parts := strings.Split(unsigned, ".") + if len(parts) > 2 || len(parts) == 0 || parts[0] == "" { + return time.Time{}, fmt.Errorf("datetime epoch seconds are invalid") + } + seconds, err := strconv.ParseInt(parts[0], 10, 64) + if err != nil { + return time.Time{}, fmt.Errorf("datetime epoch seconds are invalid: %w", err) + } + var nanoseconds int64 + if len(parts) == 2 { + if len(parts[1]) == 0 || len(parts[1]) > 9 { + return time.Time{}, fmt.Errorf("datetime epoch fraction must contain one to nine digits") + } + fraction := parts[1] + strings.Repeat("0", 9-len(parts[1])) + nanoseconds, err = strconv.ParseInt(fraction, 10, 64) + if err != nil { + return time.Time{}, fmt.Errorf("datetime epoch fraction is invalid: %w", err) + } + } + if negative { + seconds = -seconds + nanoseconds = -nanoseconds + } + return time.Unix(seconds, nanoseconds), nil +} + +func (c columnSchema) acceptsBinary(storeType config.AttributeStoreType) bool { + if storeType == config.AttributeStoreTypePostgres { + return c.dataType == "bytea" + } + if storeType.IsWarehouse() { + return c.dataType == "binary" || c.dataType == "varbinary" + } + switch c.dataType { + case "binary", "varbinary", "tinyblob", "blob", "mediumblob", "longblob": + return true + default: + return false + } +} diff --git a/web/go.mod b/web/go.mod index e6b51b590..89f626903 100644 --- a/web/go.mod +++ b/web/go.mod @@ -10,9 +10,9 @@ require ( ) require ( - golang.org/x/net v0.55.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/net v0.58.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.41.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect ) diff --git a/web/go.sum b/web/go.sum index b01b2822e..b5ea3ab2d 100644 --- a/web/go.sum +++ b/web/go.sum @@ -22,12 +22,12 @@ go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfC go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= -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/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=