diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b289ef..e40ab06 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,6 @@ jobs: - uses: actions/setup-go@v6 with: go-version-file: go.mod - - run: go build ./... - - run: go test ./... -v -race -count=1 - - run: go vet ./... + - run: GOWORK=off go build ./... + - run: GOWORK=off go test ./... -v -race -count=1 + - run: GOWORK=off go vet ./... diff --git a/.goreleaser.yaml b/.goreleaser.yaml index e565c7c..e603928 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -3,7 +3,7 @@ version: 2 before: hooks: - go mod tidy - - "sed -i.bak 's/\"version\": \".*\"/\"version\": \"{{ .Version }}\"/' plugin.json && rm -f plugin.json.bak" + - "sed -i.bak -e 's/\"version\": \".*\"/\"version\": \"{{ .Version }}\"/' -e 's#/releases/download/v[^/]*/#/releases/download/v{{ .Version }}/#g' plugin.json && rm -f plugin.json.bak" builds: - id: workflow-plugin-audit @@ -26,6 +26,7 @@ archives: name_template: "{{ .ProjectName }}-{{ .Os }}-{{ .Arch }}" files: - plugin.json + - plugin.contracts.json - LICENSE checksum: diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..75e7be0 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +.PHONY: build test install clean + +BINARY_NAME = workflow-plugin-audit +INSTALL_DIR ?= data/plugins/$(BINARY_NAME) +INSTALL_PATH = $(if $(DESTDIR),$(DESTDIR)/$(INSTALL_DIR),$(INSTALL_DIR)) +GO_ENV = GOWORK=off GOPRIVATE=github.com/GoCodeAlone/* +VERSION ?= $(shell jq -r .version plugin.json) +LDFLAGS = -X github.com/GoCodeAlone/workflow-plugin-audit/internal.Version=$(VERSION) + +build: + $(GO_ENV) go build -ldflags "$(LDFLAGS)" -o bin/$(BINARY_NAME) ./cmd/$(BINARY_NAME) + +test: + $(GO_ENV) go test ./... -v -race + +install: build + mkdir -p $(INSTALL_PATH) + cp bin/$(BINARY_NAME) $(INSTALL_PATH)/ + cp plugin.json $(INSTALL_PATH)/ + cp plugin.contracts.json $(INSTALL_PATH)/ + +clean: + rm -rf bin/ diff --git a/go.mod b/go.mod index 25d05ac..b57b53e 100644 --- a/go.mod +++ b/go.mod @@ -3,33 +3,34 @@ module github.com/GoCodeAlone/workflow-plugin-audit go 1.26.0 require ( - github.com/GoCodeAlone/workflow v0.3.56 + github.com/GoCodeAlone/workflow v0.19.0 github.com/aws/aws-sdk-go-v2 v1.41.5 github.com/aws/aws-sdk-go-v2/config v1.32.14 github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 github.com/google/uuid v1.6.0 + google.golang.org/protobuf v1.36.11 ) require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth v0.19.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.60.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 // indirect github.com/BurntSushi/toml v1.6.0 // indirect - github.com/DataDog/datadog-go/v5 v5.4.0 // indirect - github.com/GoCodeAlone/go-plugin v0.0.0-20260220090904-b4c35f0e4271 // indirect - github.com/GoCodeAlone/modular v1.12.3 // indirect - github.com/GoCodeAlone/modular/modules/auth v1.14.0 // indirect - github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.7.0 // indirect - github.com/GoCodeAlone/yaegi v0.17.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/DataDog/datadog-go/v5 v5.8.3 // indirect + github.com/GoCodeAlone/go-plugin v1.7.0 // indirect + github.com/GoCodeAlone/modular v1.13.0 // indirect + github.com/GoCodeAlone/modular/modules/auth v1.15.0 // indirect + github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0 // indirect + github.com/GoCodeAlone/yaegi v0.17.2 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/IBM/sarama v1.47.0 // indirect @@ -42,17 +43,17 @@ require ( github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8 // indirect - github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.11 // indirect - github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.10 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.289.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.72.0 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.80.0 // indirect + github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13 // indirect + github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.81.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect - github.com/aws/aws-sdk-go-v2/service/kinesis v1.38.0 // indirect - github.com/aws/aws-sdk-go-v2/service/route53 v1.62.2 // indirect + github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4 // indirect + github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect @@ -63,13 +64,14 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudevents/sdk-go/v2 v2.16.2 // indirect - github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/danieljoos/wincred v1.2.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/digitalocean/godo v1.175.0 // indirect + github.com/digitalocean/godo v1.178.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/go-connections v0.6.0 // indirect @@ -77,20 +79,22 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect - github.com/fatih/color v1.18.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/expr-lang/expr v1.17.8 // indirect + github.com/fatih/color v1.19.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golobby/cast v1.3.3 // indirect - github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-querystring v1.2.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.12 // indirect - github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -102,14 +106,15 @@ require ( github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect - github.com/hashicorp/vault/api v1.22.0 // indirect + github.com/hashicorp/vault/api v1.23.0 // indirect github.com/hashicorp/yamux v0.1.2 // indirect github.com/itchyny/gojq v0.12.18 // indirect github.com/itchyny/timefmt-go v0.1.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.5 // indirect + github.com/jackc/pgx/v5 v5.9.1 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect @@ -117,7 +122,7 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect - github.com/klauspost/compress v1.18.4 // indirect + github.com/klauspost/compress v1.18.5 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -130,20 +135,20 @@ require ( github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/morikuni/aec v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nats-io/nats.go v1.49.0 // indirect + github.com/nats-io/nats.go v1.50.0 // indirect github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/oklog/run v1.2.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/pierrec/lz4/v4 v4.1.25 // indirect + github.com/pierrec/lz4/v4 v4.1.26 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.66.1 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/redis/go-redis/v9 v9.18.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect @@ -152,39 +157,38 @@ require ( 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/zalando/go-keyring v0.2.8 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.66.0 // indirect - go.opentelemetry.io/otel v1.42.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.42.0 // indirect - go.opentelemetry.io/otel/sdk v1.41.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.41.0 // indirect - go.opentelemetry.io/otel/trace v1.42.0 // indirect - go.opentelemetry.io/proto/otlp v1.9.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect - go.yaml.in/yaml/v2 v2.4.3 // indirect - golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect - golang.org/x/net v0.51.0 // indirect - golang.org/x/oauth2 v0.35.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.41.0 // indirect - golang.org/x/text v0.34.0 // indirect - golang.org/x/time v0.14.0 // indirect - google.golang.org/api v0.269.0 // indirect - google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/grpc v1.79.3 // indirect - google.golang.org/protobuf v1.36.11 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.272.0 // indirect + google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect + google.golang.org/grpc v1.80.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.67.6 // indirect + modernc.org/libc v1.70.0 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.45.0 // indirect + modernc.org/sqlite v1.47.0 // indirect ) diff --git a/go.sum b/go.sum index a08da5f..891588e 100644 --- a/go.sum +++ b/go.sum @@ -2,26 +2,26 @@ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= -cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth v0.19.0 h1:DGYwtbcsGsT1ywuxsIoWi1u/vlks0moIblQHgSDgQkQ= +cloud.google.com/go/auth v0.19.0/go.mod h1:2Aph7BT2KnaSFOM0JDPyiYgNh6PL9vGMiP8CUIXZ+IY= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= -cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= -cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= +cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.60.0 h1:oBfZrSOCimggVNz9Y/bXY35uUcts7OViubeddTTVzQ8= -cloud.google.com/go/storage v1.60.0/go.mod h1:q+5196hXfejkctrnx+VYU8RKQr/L3c0cBIlrjmiAKE0= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= @@ -36,22 +36,22 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgv github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/DataDog/datadog-go/v5 v5.4.0 h1:Ea3eXUVwrVV28F/fo3Dr3aa+TL/Z7Xi6SUPKW8L99aI= -github.com/DataDog/datadog-go/v5 v5.4.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/GoCodeAlone/go-plugin v0.0.0-20260220090904-b4c35f0e4271 h1:/oxxpYJ41BuK+/5Gp9c+0PHybyNFWeBHyCzkSVLCoMk= -github.com/GoCodeAlone/go-plugin v0.0.0-20260220090904-b4c35f0e4271/go.mod h1:HbGQRZUIa+jbDfjsaZIMJYvrz+LnxL0mJpggfynSTMk= -github.com/GoCodeAlone/modular v1.12.3 h1:WcNqc1ZG+Lv/xzF8wTDavGIOeAvlV4wEd5HO2mVTUwE= -github.com/GoCodeAlone/modular v1.12.3/go.mod h1:nDdyW/eJu4gDFNueb6vWwLvti3bPHSZJHkWGiwEmi2I= -github.com/GoCodeAlone/modular/modules/auth v1.14.0 h1:Y+p4/HIcxkajlcNhcPlqpwAt1SCHjB4AaDMEys50E3I= -github.com/GoCodeAlone/modular/modules/auth v1.14.0/go.mod h1:fkwPn2svDsCHBI19gtUHxo064SL+EudjB+o7VjL9ug8= -github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.7.0 h1:clGAyaOfyDc9iY63ONfZiHReVccVhK/yH19QEb14SSI= -github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.7.0/go.mod h1:0AnfWGVmrqyv91rduc6mrPqW6WQchDAa2WtM0Qmw/WA= -github.com/GoCodeAlone/workflow v0.3.56 h1:jsJmVwCRLz7XOTLQNoyE7POBDW3SmqbG/18VnAzbaEc= -github.com/GoCodeAlone/workflow v0.3.56/go.mod h1:uATRqpqPubm+g2jJtYoaMTMmjlUaXnLsSdZk5of+jW0= -github.com/GoCodeAlone/yaegi v0.17.1 h1:aPAwU29L9cGceRAff02c5pjQcT5KapDB4fWFZK9tElE= -github.com/GoCodeAlone/yaegi v0.17.1/go.mod h1:z5Pr6Wse6QJcQvpgxTxzMAevFarH0N37TG88Y9dprx0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/DataDog/datadog-go/v5 v5.8.3 h1:s58CUJ9s8lezjhTNJO/SxkPBv2qZjS3ktpRSqGF5n0s= +github.com/DataDog/datadog-go/v5 v5.8.3/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/GoCodeAlone/go-plugin v1.7.0 h1:EwnhqPlXiNmp85S+MXnKKvm3YlfA6O4NzBb4+GSlEVY= +github.com/GoCodeAlone/go-plugin v1.7.0/go.mod h1:HbGQRZUIa+jbDfjsaZIMJYvrz+LnxL0mJpggfynSTMk= +github.com/GoCodeAlone/modular v1.13.0 h1:UfsegfAmPWcPYQOqYZFsw/LNySBmMDcthiOQe5bscqE= +github.com/GoCodeAlone/modular v1.13.0/go.mod h1:b06Pvgcc8HsGxvl30iO39zGH2jIWz467QEj2+OQL2Do= +github.com/GoCodeAlone/modular/modules/auth v1.15.0 h1:pBSkPSf4k4GLSbUQFLuPa+nFbfoJXGzSz9q89VoapZk= +github.com/GoCodeAlone/modular/modules/auth v1.15.0/go.mod h1:vmIm/LQrcURS2p02YwaELb+CZoHPtT0XB0v1i+sj9i4= +github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0 h1:buYs0TGNbAZgtTq1Qb+dfmTv3+ZOBIN0HbvVBLyNqxE= +github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0/go.mod h1:329flAKmwrPq2JEwu9iltWv6A83H/Di82Xze+kvdKDw= +github.com/GoCodeAlone/workflow v0.19.0 h1:OFjLqHnyi19nkyAhpuMNVjrDEO4ST8GVCVsZsRFCWgY= +github.com/GoCodeAlone/workflow v0.19.0/go.mod h1:ypkCqXTwnIPqNjS8h38KZfwzdVsgwgkS1d6Dq0lXyQQ= +github.com/GoCodeAlone/yaegi v0.17.2 h1:WK6Y6e0t1a6U7r+S2dN3CGWW1PizYD3zO0zneToZPxM= +github.com/GoCodeAlone/yaegi v0.17.2/go.mod h1:z5Pr6Wse6QJcQvpgxTxzMAevFarH0N37TG88Y9dprx0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= @@ -87,16 +87,16 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOq github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y= github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8 h1:I0AMtyv5tqQ/VNDDalbbujALCWl64TP3F61bBw4U8Qs= github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8/go.mod h1:qnrKR+Jzg9NbZqy+YusE7frSZUaYQ7EPJvki4+SwS3U= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.11 h1:sHMyvjsgVzzYNGdy5OdlYYQsNeEk1N+aui9R8JhP9HE= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.11/go.mod h1:Aa0zlfmZPQJnR3M1Kn7pGXKJ9qMR5zpNHBmXcjTh8Kc= -github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.10 h1:f8Umf89E6+QciH5Fk4J23EFgcukyX/FkVu7urYUcW/k= -github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.10/go.mod h1:AqtqfJs5i0n0/SBo3/FD9rs3vnubrigU5B8iz+5YVHU= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.289.1 h1:wcrNo0Fn5z1CvdyiZ9ep+JWrCFg8ImRFSf1mcxJnx6w= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.289.1/go.mod h1:Uy+C+Sc58jozdoL1McQr8bDsEvNFx+/nBY+vpO1HVUY= -github.com/aws/aws-sdk-go-v2/service/ecs v1.72.0 h1:hggRKpv26DpYMOik3wWo1Ty5MkANoXhNobjfWpC3G4M= -github.com/aws/aws-sdk-go-v2/service/ecs v1.72.0/go.mod h1:pMlGFDpHoLTJOIZHGdJOAWmi+xeIlQXuFTuQxs1epYE= -github.com/aws/aws-sdk-go-v2/service/eks v1.80.0 h1:moQGV8cPbVTN7r2Xte1Mybku35QDePSJEd3onYVmBtY= -github.com/aws/aws-sdk-go-v2/service/eks v1.80.0/go.mod h1:Qg678m+87sCuJhcsZojenz8mblYG+Tq86V4m3hjVz0s= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13 h1:juPaAcploym78WhVwleVHNLPmgURO6gkObC442Hal1s= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13/go.mod h1:HjgDVqI6lGR0azGz1GKmZTzGHkXuzhKzRUfG/p5Ug8s= +github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12 h1:lQTVEv/YAk8Rw1Yf4XZS/jNNxF9klCN10WcSR3xlMtU= +github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12/go.mod h1:yoa0R6Xku788EmJYkFiARzJBxt4A3hgFjQPRmMAttr0= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0 h1:98Miqj16un1WLNyM1RjVDhXYumhqZrQfAeG8i4jPG6o= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0/go.mod h1:T6ndRfdhnXLIY5oKBHjYZDVj706los2zGdpThppquvA= +github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0 h1:a5G/TgJNrpuCjZBTf8/PTN0C2B0do/ylaYVynxPSbUQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0/go.mod h1:QkWmubOYmjj3cHn7A4CoUU7BKJhVeo39Gp6NH7IyhZw= +github.com/aws/aws-sdk-go-v2/service/eks v1.81.2 h1:6c/Jkyx1gYLiZGl6VPjApViaoPiYo7TDWXCMk/ZBq6c= +github.com/aws/aws-sdk-go-v2/service/eks v1.81.2/go.mod h1:xdUh6tdF9A8hc+PE84kmHbF/zsVPNiKnc6oLgulq1Eo= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= @@ -105,10 +105,10 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3x github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.38.0 h1:8acX21qNMUs/QTHB3iNpixJViYsu7sSWSmZVzdriRcw= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.38.0/go.mod h1:No5RhgJ+mKYZKCSrJQOdDtyz+8dAfNaeYwMnTJBJV/Q= -github.com/aws/aws-sdk-go-v2/service/route53 v1.62.2 h1:zoD/SoiVQi8l8tuQn//VexrXS2yorg/+717JNA4Ble8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.62.2/go.mod h1:Ll1DCasPTBFtHK5t/U5WIwGIyRuY3xY+x8/LmqIlqpM= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4 h1:3m9iJtMtLq75jKRAfw0kapoHUlbzi0CRVigysBN/FHA= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4/go.mod h1:O2L6vGm4xacEuN2otHFMgn7yXXlgzFKzxrba0fy/yk8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5 h1:Z+/OLsb85Kpq7TVLCspskqePaf68Tdv6GfmJP4kH6i0= +github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5/go.mod h1:TmxGowuBYwjmHFOsEDxaZdsQE62JJzOmtiWafTi/czg= github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 h1:foqo/ocQ7WqKwy3FojGtZQJo0FR4vto9qnz9VaumbCo= github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= @@ -137,8 +137,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudevents/sdk-go/v2 v2.16.2 h1:ZYDFrYke4FD+jM8TZTJJO6JhKHzOQl2oqpFK1D+NnQM= github.com/cloudevents/sdk-go/v2 v2.16.2/go.mod h1:laOcGImm4nVJEU+PHnUrKL56CKmRL65RlQF0kRmW/kg= -github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= -github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -152,14 +152,16 @@ github.com/cucumber/godog v0.15.1 h1:rb/6oHDdvVZKS66hrhpjFQFHjthFSrQBCOI1LwshNTI github.com/cucumber/godog v0.15.1/go.mod h1:qju+SQDewOljHuq9NSM66s0xEhogx0q30flfxL4WUk8= github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= +github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs= 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= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/digitalocean/godo v1.175.0 h1:tpfwJFkBzpePxvvFazOn69TXctdxuFlOs7DMVXsI7oU= -github.com/digitalocean/godo v1.175.0/go.mod h1:xQsWpVCCbkDrWisHA72hPzPlnC+4W5w/McZY5ij9uvU= +github.com/digitalocean/godo v1.178.0 h1:+B4xGOaoFwwwpM7TKhoyGHdmFg5eF9zDB1YfOLvNJ2E= +github.com/digitalocean/godo v1.178.0/go.mod h1:xQsWpVCCbkDrWisHA72hPzPlnC+4W5w/McZY5ij9uvU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= @@ -176,23 +178,25 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= -github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= +github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= -github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/expr-lang/expr v1.17.8 h1:W1loDTT+0PQf5YteHSTpju2qfUfNoBt4yw9+wOEU9VM= +github.com/expr-lang/expr v1.17.8/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -200,8 +204,10 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= +github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -209,11 +215,11 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golobby/cast v1.3.3 h1:s2Lawb9RMz7YyYf8IrfMQY4IFmA1R/lgfmj97Vc6fig= github.com/golobby/cast v1.3.3/go.mod h1:0oDO5IT84HTXcbLDf1YXuk0xtg/cRDrxhbpWKxwtJCY= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= +github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -225,10 +231,10 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.12 h1:Fg+zsqzYEs1ZnvmcztTYxhgCBsx3eEhEwQ1W/lHq/sQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.12/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= -github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= +github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= @@ -242,8 +248,8 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1 github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= -github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= +github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= @@ -265,8 +271,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= -github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0= -github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM= +github.com/hashicorp/vault/api v1.23.0 h1:gXgluBsSECfRWTSW9niY2jwg2e9mMJc4WoHNv4g3h6A= +github.com/hashicorp/vault/api v1.23.0/go.mod h1:zransKiB9ftp+kgY8ydjnvCU7Wk8i9L0DYWpXeMj9ko= github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/itchyny/gojq v0.12.18 h1:gFGHyt/MLbG9n6dqnvlliiya2TaMMh6FFaR2b1H6Drc= @@ -277,8 +283,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= -github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/pgx/v5 v5.9.1 h1:uwrxJXBnx76nyISkhr33kQLlUqjv7et7b9FjCen/tdc= +github.com/jackc/pgx/v5 v5.9.1/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -297,8 +303,8 @@ github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+ github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -348,8 +354,8 @@ github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.12.4 h1:ZnT10v2LU2Xcoiy8ek9X6Se4YG8EuMfIfvAEuFVx1Ts= github.com/nats-io/nats-server/v2 v2.12.4/go.mod h1:5MCp/pqm5SEfsvVZ31ll1088ZTwEUdvRX1Hmh/mTTDg= -github.com/nats-io/nats.go v1.49.0 h1:yh/WvY59gXqYpgl33ZI+XoVPKyut/IcEaqtsiuTJpoE= -github.com/nats-io/nats.go v1.49.0/go.mod h1:fDCn3mN5cY8HooHwE2ukiLb4p4G4ImmzvXyJt+tGwdw= +github.com/nats-io/nats.go v1.50.0 h1:5zAeQrTvyrKrWLJ0fu02W3br8ym57qf7csDzgLOpcds= +github.com/nats-io/nats.go v1.50.0/go.mod h1:26HypzazeOkyO3/mqd1zZd53STJN0EjCYF9Uy2ZOBno= github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= @@ -362,8 +368,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= -github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= +github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= +github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -378,10 +384,10 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= @@ -393,6 +399,8 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -427,34 +435,36 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/zalando/go-keyring v0.2.8 h1:6sD/Ucpl7jNq10rM2pgqTs0sZ9V3qMrqfIIy5YPccHs= +github.com/zalando/go-keyring v0.2.8/go.mod h1:tsMo+VpRq5NGyKfxoBVjCuMrG47yj8cmakZDO5QGii0= github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= -go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.66.0 h1:PnV4kVnw0zOmwwFkAzCN5O07fw1YOIQor120zrh0AVo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.66.0/go.mod h1:ofAwF4uinaf8SXdVzzbL4OsxJ3VfeEg3f/F6CeF49/Y= -go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= -go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 h1:wVZXIWjQSeSmMoxF74LzAnpVQOAFDo3pPji9Y4SOFKc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0/go.mod h1:khvBS2IggMFNwZK/6lEeHg/W57h/IX6J4URh57fuI40= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI= -go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= -go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= -go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= -go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= -go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= -go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= -go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= -go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= -go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= -go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +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= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -465,20 +475,18 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= -go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= -golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -487,10 +495,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= -golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= -golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= -golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -513,8 +521,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -523,32 +531,31 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= 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.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= -golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.269.0 h1:qDrTOxKUQ/P0MveH6a7vZ+DNHxJQjtGm/uvdbdGXCQg= -google.golang.org/api v0.269.0/go.mod h1:N8Wpcu23Tlccl0zSHEkcAZQKDLdquxK+l9r2LkwAauE= -google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= -google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= -google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= +google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= +google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0= +google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I= +google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d h1:/aDRtSZJjyLQzm75d+a1wOJaqyKBMvIAfeQmoa3ORiI= +google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:etfGUgejTiadZAUaEP14NP97xi1RGeawqkjDARA/UOs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1:wT2n40TBqFY6wiwazVK9/iTWbsQrgk5ZfCSVFLO9LQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -562,18 +569,18 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= -modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM= -modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= -modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= +modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE= -modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.67.6 h1:eVOQvpModVLKOdT+LvBPjdQqfrZq+pC39BygcT+E7OI= -modernc.org/libc v1.67.6/go.mod h1:JAhxUVlolfYDErnwiqaLvUqc8nfb2r6S6slAgZOnaiE= +modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw= +modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -582,8 +589,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.45.0 h1:r51cSGzKpbptxnby+EIIz5fop4VuE4qFoVEjNvWoObs= -modernc.org/sqlite v1.45.0/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA= +modernc.org/sqlite v1.47.0 h1:R1XyaNpoW4Et9yly+I2EeX7pBza/w+pmYee/0HJDyKk= +modernc.org/sqlite v1.47.0/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/contracts/audit.pb.go b/internal/contracts/audit.pb.go new file mode 100644 index 0000000..4ec5400 --- /dev/null +++ b/internal/contracts/audit.pb.go @@ -0,0 +1,1474 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v7.34.1 +// source: internal/contracts/audit.proto + +package contracts + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type CollectorConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Topics []string `protobuf:"bytes,1,rep,name=topics,proto3" json:"topics,omitempty"` + FlushInterval int32 `protobuf:"varint,2,opt,name=flush_interval,json=flushInterval,proto3" json:"flush_interval,omitempty"` + BufferSize int32 `protobuf:"varint,3,opt,name=buffer_size,json=bufferSize,proto3" json:"buffer_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CollectorConfig) Reset() { + *x = CollectorConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CollectorConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectorConfig) ProtoMessage() {} + +func (x *CollectorConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CollectorConfig.ProtoReflect.Descriptor instead. +func (*CollectorConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{0} +} + +func (x *CollectorConfig) GetTopics() []string { + if x != nil { + return x.Topics + } + return nil +} + +func (x *CollectorConfig) GetFlushInterval() int32 { + if x != nil { + return x.FlushInterval + } + return 0 +} + +func (x *CollectorConfig) GetBufferSize() int32 { + if x != nil { + return x.BufferSize + } + return 0 +} + +type S3SinkConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *S3SinkConfig) Reset() { + *x = S3SinkConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *S3SinkConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*S3SinkConfig) ProtoMessage() {} + +func (x *S3SinkConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use S3SinkConfig.ProtoReflect.Descriptor instead. +func (*S3SinkConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{1} +} + +func (x *S3SinkConfig) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *S3SinkConfig) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *S3SinkConfig) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +type DBSinkConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + TableName string `protobuf:"bytes,1,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DBSinkConfig) Reset() { + *x = DBSinkConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DBSinkConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DBSinkConfig) ProtoMessage() {} + +func (x *DBSinkConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DBSinkConfig.ProtoReflect.Descriptor instead. +func (*DBSinkConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{2} +} + +func (x *DBSinkConfig) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + +type AuditQueryConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Since string `protobuf:"bytes,1,opt,name=since,proto3" json:"since,omitempty"` + Until string `protobuf:"bytes,2,opt,name=until,proto3" json:"until,omitempty"` + EventType string `protobuf:"bytes,3,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + WorkflowId string `protobuf:"bytes,4,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + CorrelationId string `protobuf:"bytes,5,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` + Limit *int32 `protobuf:"varint,6,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditQueryConfig) Reset() { + *x = AuditQueryConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditQueryConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditQueryConfig) ProtoMessage() {} + +func (x *AuditQueryConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditQueryConfig.ProtoReflect.Descriptor instead. +func (*AuditQueryConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{3} +} + +func (x *AuditQueryConfig) GetSince() string { + if x != nil { + return x.Since + } + return "" +} + +func (x *AuditQueryConfig) GetUntil() string { + if x != nil { + return x.Until + } + return "" +} + +func (x *AuditQueryConfig) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *AuditQueryConfig) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *AuditQueryConfig) GetCorrelationId() string { + if x != nil { + return x.CorrelationId + } + return "" +} + +func (x *AuditQueryConfig) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +type AuditQueryInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Since string `protobuf:"bytes,1,opt,name=since,proto3" json:"since,omitempty"` + Until string `protobuf:"bytes,2,opt,name=until,proto3" json:"until,omitempty"` + EventType string `protobuf:"bytes,3,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + WorkflowId string `protobuf:"bytes,4,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + CorrelationId string `protobuf:"bytes,5,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` + Limit *int32 `protobuf:"varint,6,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditQueryInput) Reset() { + *x = AuditQueryInput{} + mi := &file_internal_contracts_audit_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditQueryInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditQueryInput) ProtoMessage() {} + +func (x *AuditQueryInput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditQueryInput.ProtoReflect.Descriptor instead. +func (*AuditQueryInput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{4} +} + +func (x *AuditQueryInput) GetSince() string { + if x != nil { + return x.Since + } + return "" +} + +func (x *AuditQueryInput) GetUntil() string { + if x != nil { + return x.Until + } + return "" +} + +func (x *AuditQueryInput) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *AuditQueryInput) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *AuditQueryInput) GetCorrelationId() string { + if x != nil { + return x.CorrelationId + } + return "" +} + +func (x *AuditQueryInput) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +type AuditExportConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditExportConfig) Reset() { + *x = AuditExportConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditExportConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditExportConfig) ProtoMessage() {} + +func (x *AuditExportConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditExportConfig.ProtoReflect.Descriptor instead. +func (*AuditExportConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{5} +} + +func (x *AuditExportConfig) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *AuditExportConfig) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *AuditExportConfig) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +type AuditExportInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Events []*AuditEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` + Region string `protobuf:"bytes,4,opt,name=region,proto3" json:"region,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditExportInput) Reset() { + *x = AuditExportInput{} + mi := &file_internal_contracts_audit_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditExportInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditExportInput) ProtoMessage() {} + +func (x *AuditExportInput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditExportInput.ProtoReflect.Descriptor instead. +func (*AuditExportInput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{6} +} + +func (x *AuditExportInput) GetEvents() []*AuditEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *AuditExportInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *AuditExportInput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *AuditExportInput) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +type AuditAnnotateConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + Annotations map[string]string `protobuf:"bytes,1,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditAnnotateConfig) Reset() { + *x = AuditAnnotateConfig{} + mi := &file_internal_contracts_audit_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditAnnotateConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditAnnotateConfig) ProtoMessage() {} + +func (x *AuditAnnotateConfig) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditAnnotateConfig.ProtoReflect.Descriptor instead. +func (*AuditAnnotateConfig) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{7} +} + +func (x *AuditAnnotateConfig) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +func (x *AuditAnnotateConfig) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AuditAnnotateConfig) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +type AuditAnnotateInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Annotations map[string]string `protobuf:"bytes,1,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditAnnotateInput) Reset() { + *x = AuditAnnotateInput{} + mi := &file_internal_contracts_audit_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditAnnotateInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditAnnotateInput) ProtoMessage() {} + +func (x *AuditAnnotateInput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditAnnotateInput.ProtoReflect.Descriptor instead. +func (*AuditAnnotateInput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{8} +} + +func (x *AuditAnnotateInput) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +func (x *AuditAnnotateInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AuditAnnotateInput) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +type QueryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Since string `protobuf:"bytes,1,opt,name=since,proto3" json:"since,omitempty"` + Until string `protobuf:"bytes,2,opt,name=until,proto3" json:"until,omitempty"` + EventType string `protobuf:"bytes,3,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + WorkflowId string `protobuf:"bytes,4,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + CorrelationId string `protobuf:"bytes,5,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` + Limit *int32 `protobuf:"varint,6,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryRequest) Reset() { + *x = QueryRequest{} + mi := &file_internal_contracts_audit_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryRequest) ProtoMessage() {} + +func (x *QueryRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead. +func (*QueryRequest) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{9} +} + +func (x *QueryRequest) GetSince() string { + if x != nil { + return x.Since + } + return "" +} + +func (x *QueryRequest) GetUntil() string { + if x != nil { + return x.Until + } + return "" +} + +func (x *QueryRequest) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *QueryRequest) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *QueryRequest) GetCorrelationId() string { + if x != nil { + return x.CorrelationId + } + return "" +} + +func (x *QueryRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +type StatsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StatsRequest) Reset() { + *x = StatsRequest{} + mi := &file_internal_contracts_audit_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StatsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatsRequest) ProtoMessage() {} + +func (x *StatsRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatsRequest.ProtoReflect.Descriptor instead. +func (*StatsRequest) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{10} +} + +type InfoRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InfoRequest) Reset() { + *x = InfoRequest{} + mi := &file_internal_contracts_audit_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InfoRequest) ProtoMessage() {} + +func (x *InfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InfoRequest.ProtoReflect.Descriptor instead. +func (*InfoRequest) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{11} +} + +type AuditEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Timestamp string `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + EventType string `protobuf:"bytes,3,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` + WorkflowId string `protobuf:"bytes,4,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + PipelineId string `protobuf:"bytes,5,opt,name=pipeline_id,json=pipelineId,proto3" json:"pipeline_id,omitempty"` + StepName string `protobuf:"bytes,6,opt,name=step_name,json=stepName,proto3" json:"step_name,omitempty"` + Actor string `protobuf:"bytes,7,opt,name=actor,proto3" json:"actor,omitempty"` + CorrelationId string `protobuf:"bytes,8,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` + Data *structpb.Struct `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` + Annotations map[string]string `protobuf:"bytes,10,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditEvent) Reset() { + *x = AuditEvent{} + mi := &file_internal_contracts_audit_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditEvent) ProtoMessage() {} + +func (x *AuditEvent) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditEvent.ProtoReflect.Descriptor instead. +func (*AuditEvent) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{12} +} + +func (x *AuditEvent) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AuditEvent) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (x *AuditEvent) GetEventType() string { + if x != nil { + return x.EventType + } + return "" +} + +func (x *AuditEvent) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *AuditEvent) GetPipelineId() string { + if x != nil { + return x.PipelineId + } + return "" +} + +func (x *AuditEvent) GetStepName() string { + if x != nil { + return x.StepName + } + return "" +} + +func (x *AuditEvent) GetActor() string { + if x != nil { + return x.Actor + } + return "" +} + +func (x *AuditEvent) GetCorrelationId() string { + if x != nil { + return x.CorrelationId + } + return "" +} + +func (x *AuditEvent) GetData() *structpb.Struct { + if x != nil { + return x.Data + } + return nil +} + +func (x *AuditEvent) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +type AuditQueryOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Events []*AuditEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditQueryOutput) Reset() { + *x = AuditQueryOutput{} + mi := &file_internal_contracts_audit_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditQueryOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditQueryOutput) ProtoMessage() {} + +func (x *AuditQueryOutput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditQueryOutput.ProtoReflect.Descriptor instead. +func (*AuditQueryOutput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{13} +} + +func (x *AuditQueryOutput) GetEvents() []*AuditEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *AuditQueryOutput) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *AuditQueryOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type AuditExportOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Exported int32 `protobuf:"varint,1,opt,name=exported,proto3" json:"exported,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + BytesTotal int32 `protobuf:"varint,4,opt,name=bytes_total,json=bytesTotal,proto3" json:"bytes_total,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditExportOutput) Reset() { + *x = AuditExportOutput{} + mi := &file_internal_contracts_audit_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditExportOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditExportOutput) ProtoMessage() {} + +func (x *AuditExportOutput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditExportOutput.ProtoReflect.Descriptor instead. +func (*AuditExportOutput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{14} +} + +func (x *AuditExportOutput) GetExported() int32 { + if x != nil { + return x.Exported + } + return 0 +} + +func (x *AuditExportOutput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *AuditExportOutput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AuditExportOutput) GetBytesTotal() int32 { + if x != nil { + return x.BytesTotal + } + return 0 +} + +func (x *AuditExportOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type AuditAnnotateOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Annotations map[string]string `protobuf:"bytes,1,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AuditAnnotateOutput) Reset() { + *x = AuditAnnotateOutput{} + mi := &file_internal_contracts_audit_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuditAnnotateOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuditAnnotateOutput) ProtoMessage() {} + +func (x *AuditAnnotateOutput) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuditAnnotateOutput.ProtoReflect.Descriptor instead. +func (*AuditAnnotateOutput) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{15} +} + +func (x *AuditAnnotateOutput) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +func (x *AuditAnnotateOutput) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *AuditAnnotateOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type QueryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Events []*AuditEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryResponse) Reset() { + *x = QueryResponse{} + mi := &file_internal_contracts_audit_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryResponse) ProtoMessage() {} + +func (x *QueryResponse) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryResponse.ProtoReflect.Descriptor instead. +func (*QueryResponse) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{16} +} + +func (x *QueryResponse) GetEvents() []*AuditEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *QueryResponse) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *QueryResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type StatsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Dropped int64 `protobuf:"varint,1,opt,name=dropped,proto3" json:"dropped,omitempty"` + Buffered int32 `protobuf:"varint,2,opt,name=buffered,proto3" json:"buffered,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StatsResponse) Reset() { + *x = StatsResponse{} + mi := &file_internal_contracts_audit_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StatsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatsResponse) ProtoMessage() {} + +func (x *StatsResponse) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatsResponse.ProtoReflect.Descriptor instead. +func (*StatsResponse) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{17} +} + +func (x *StatsResponse) GetDropped() int64 { + if x != nil { + return x.Dropped + } + return 0 +} + +func (x *StatsResponse) GetBuffered() int32 { + if x != nil { + return x.Buffered + } + return 0 +} + +func (x *StatsResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type SinkInfoResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` + TableName string `protobuf:"bytes,4,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + Error string `protobuf:"bytes,100,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SinkInfoResponse) Reset() { + *x = SinkInfoResponse{} + mi := &file_internal_contracts_audit_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SinkInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SinkInfoResponse) ProtoMessage() {} + +func (x *SinkInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_internal_contracts_audit_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SinkInfoResponse.ProtoReflect.Descriptor instead. +func (*SinkInfoResponse) Descriptor() ([]byte, []int) { + return file_internal_contracts_audit_proto_rawDescGZIP(), []int{18} +} + +func (x *SinkInfoResponse) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *SinkInfoResponse) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *SinkInfoResponse) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *SinkInfoResponse) GetTableName() string { + if x != nil { + return x.TableName + } + return "" +} + +func (x *SinkInfoResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +var File_internal_contracts_audit_proto protoreflect.FileDescriptor + +const file_internal_contracts_audit_proto_rawDesc = "" + + "\n" + + "\x1einternal/contracts/audit.proto\x12\x19workflow.plugins.audit.v1\x1a\x1cgoogle/protobuf/struct.proto\"q\n" + + "\x0fCollectorConfig\x12\x16\n" + + "\x06topics\x18\x01 \x03(\tR\x06topics\x12%\n" + + "\x0eflush_interval\x18\x02 \x01(\x05R\rflushInterval\x12\x1f\n" + + "\vbuffer_size\x18\x03 \x01(\x05R\n" + + "bufferSize\"V\n" + + "\fS3SinkConfig\x12\x16\n" + + "\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x16\n" + + "\x06prefix\x18\x02 \x01(\tR\x06prefix\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\"-\n" + + "\fDBSinkConfig\x12\x1d\n" + + "\n" + + "table_name\x18\x01 \x01(\tR\ttableName\"\xca\x01\n" + + "\x10AuditQueryConfig\x12\x14\n" + + "\x05since\x18\x01 \x01(\tR\x05since\x12\x14\n" + + "\x05until\x18\x02 \x01(\tR\x05until\x12\x1d\n" + + "\n" + + "event_type\x18\x03 \x01(\tR\teventType\x12\x1f\n" + + "\vworkflow_id\x18\x04 \x01(\tR\n" + + "workflowId\x12%\n" + + "\x0ecorrelation_id\x18\x05 \x01(\tR\rcorrelationId\x12\x19\n" + + "\x05limit\x18\x06 \x01(\x05H\x00R\x05limit\x88\x01\x01B\b\n" + + "\x06_limit\"\xc9\x01\n" + + "\x0fAuditQueryInput\x12\x14\n" + + "\x05since\x18\x01 \x01(\tR\x05since\x12\x14\n" + + "\x05until\x18\x02 \x01(\tR\x05until\x12\x1d\n" + + "\n" + + "event_type\x18\x03 \x01(\tR\teventType\x12\x1f\n" + + "\vworkflow_id\x18\x04 \x01(\tR\n" + + "workflowId\x12%\n" + + "\x0ecorrelation_id\x18\x05 \x01(\tR\rcorrelationId\x12\x19\n" + + "\x05limit\x18\x06 \x01(\x05H\x00R\x05limit\x88\x01\x01B\b\n" + + "\x06_limit\"[\n" + + "\x11AuditExportConfig\x12\x16\n" + + "\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x16\n" + + "\x06prefix\x18\x02 \x01(\tR\x06prefix\x12\x16\n" + + "\x06region\x18\x03 \x01(\tR\x06region\"\x99\x01\n" + + "\x10AuditExportInput\x12=\n" + + "\x06events\x18\x01 \x03(\v2%.workflow.plugins.audit.v1.AuditEventR\x06events\x12\x16\n" + + "\x06bucket\x18\x02 \x01(\tR\x06bucket\x12\x16\n" + + "\x06prefix\x18\x03 \x01(\tR\x06prefix\x12\x16\n" + + "\x06region\x18\x04 \x01(\tR\x06region\"\xe0\x01\n" + + "\x13AuditAnnotateConfig\x12a\n" + + "\vannotations\x18\x01 \x03(\v2?.workflow.plugins.audit.v1.AuditAnnotateConfig.AnnotationsEntryR\vannotations\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x03 \x01(\tR\x05value\x1a>\n" + + "\x10AnnotationsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xde\x01\n" + + "\x12AuditAnnotateInput\x12`\n" + + "\vannotations\x18\x01 \x03(\v2>.workflow.plugins.audit.v1.AuditAnnotateInput.AnnotationsEntryR\vannotations\x12\x10\n" + + "\x03key\x18\x02 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x03 \x01(\tR\x05value\x1a>\n" + + "\x10AnnotationsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc6\x01\n" + + "\fQueryRequest\x12\x14\n" + + "\x05since\x18\x01 \x01(\tR\x05since\x12\x14\n" + + "\x05until\x18\x02 \x01(\tR\x05until\x12\x1d\n" + + "\n" + + "event_type\x18\x03 \x01(\tR\teventType\x12\x1f\n" + + "\vworkflow_id\x18\x04 \x01(\tR\n" + + "workflowId\x12%\n" + + "\x0ecorrelation_id\x18\x05 \x01(\tR\rcorrelationId\x12\x19\n" + + "\x05limit\x18\x06 \x01(\x05H\x00R\x05limit\x88\x01\x01B\b\n" + + "\x06_limit\"\x0e\n" + + "\fStatsRequest\"\r\n" + + "\vInfoRequest\"\xbc\x03\n" + + "\n" + + "AuditEvent\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1c\n" + + "\ttimestamp\x18\x02 \x01(\tR\ttimestamp\x12\x1d\n" + + "\n" + + "event_type\x18\x03 \x01(\tR\teventType\x12\x1f\n" + + "\vworkflow_id\x18\x04 \x01(\tR\n" + + "workflowId\x12\x1f\n" + + "\vpipeline_id\x18\x05 \x01(\tR\n" + + "pipelineId\x12\x1b\n" + + "\tstep_name\x18\x06 \x01(\tR\bstepName\x12\x14\n" + + "\x05actor\x18\a \x01(\tR\x05actor\x12%\n" + + "\x0ecorrelation_id\x18\b \x01(\tR\rcorrelationId\x12+\n" + + "\x04data\x18\t \x01(\v2\x17.google.protobuf.StructR\x04data\x12X\n" + + "\vannotations\x18\n" + + " \x03(\v26.workflow.plugins.audit.v1.AuditEvent.AnnotationsEntryR\vannotations\x1a>\n" + + "\x10AnnotationsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"}\n" + + "\x10AuditQueryOutput\x12=\n" + + "\x06events\x18\x01 \x03(\v2%.workflow.plugins.audit.v1.AuditEventR\x06events\x12\x14\n" + + "\x05count\x18\x02 \x01(\x05R\x05count\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05error\"\x90\x01\n" + + "\x11AuditExportOutput\x12\x1a\n" + + "\bexported\x18\x01 \x01(\x05R\bexported\x12\x16\n" + + "\x06bucket\x18\x02 \x01(\tR\x06bucket\x12\x10\n" + + "\x03key\x18\x03 \x01(\tR\x03key\x12\x1f\n" + + "\vbytes_total\x18\x04 \x01(\x05R\n" + + "bytesTotal\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05error\"\xe4\x01\n" + + "\x13AuditAnnotateOutput\x12a\n" + + "\vannotations\x18\x01 \x03(\v2?.workflow.plugins.audit.v1.AuditAnnotateOutput.AnnotationsEntryR\vannotations\x12\x14\n" + + "\x05count\x18\x02 \x01(\x05R\x05count\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05error\x1a>\n" + + "\x10AnnotationsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"z\n" + + "\rQueryResponse\x12=\n" + + "\x06events\x18\x01 \x03(\v2%.workflow.plugins.audit.v1.AuditEventR\x06events\x12\x14\n" + + "\x05count\x18\x02 \x01(\x05R\x05count\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05error\"[\n" + + "\rStatsResponse\x12\x18\n" + + "\adropped\x18\x01 \x01(\x03R\adropped\x12\x1a\n" + + "\bbuffered\x18\x02 \x01(\x05R\bbuffered\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05error\"\x8b\x01\n" + + "\x10SinkInfoResponse\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12\x16\n" + + "\x06bucket\x18\x02 \x01(\tR\x06bucket\x12\x16\n" + + "\x06prefix\x18\x03 \x01(\tR\x06prefix\x12\x1d\n" + + "\n" + + "table_name\x18\x04 \x01(\tR\ttableName\x12\x14\n" + + "\x05error\x18d \x01(\tR\x05errorBKZIgithub.com/GoCodeAlone/workflow-plugin-audit/internal/contracts;contractsb\x06proto3" + +var ( + file_internal_contracts_audit_proto_rawDescOnce sync.Once + file_internal_contracts_audit_proto_rawDescData []byte +) + +func file_internal_contracts_audit_proto_rawDescGZIP() []byte { + file_internal_contracts_audit_proto_rawDescOnce.Do(func() { + file_internal_contracts_audit_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_internal_contracts_audit_proto_rawDesc), len(file_internal_contracts_audit_proto_rawDesc))) + }) + return file_internal_contracts_audit_proto_rawDescData +} + +var file_internal_contracts_audit_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_internal_contracts_audit_proto_goTypes = []any{ + (*CollectorConfig)(nil), // 0: workflow.plugins.audit.v1.CollectorConfig + (*S3SinkConfig)(nil), // 1: workflow.plugins.audit.v1.S3SinkConfig + (*DBSinkConfig)(nil), // 2: workflow.plugins.audit.v1.DBSinkConfig + (*AuditQueryConfig)(nil), // 3: workflow.plugins.audit.v1.AuditQueryConfig + (*AuditQueryInput)(nil), // 4: workflow.plugins.audit.v1.AuditQueryInput + (*AuditExportConfig)(nil), // 5: workflow.plugins.audit.v1.AuditExportConfig + (*AuditExportInput)(nil), // 6: workflow.plugins.audit.v1.AuditExportInput + (*AuditAnnotateConfig)(nil), // 7: workflow.plugins.audit.v1.AuditAnnotateConfig + (*AuditAnnotateInput)(nil), // 8: workflow.plugins.audit.v1.AuditAnnotateInput + (*QueryRequest)(nil), // 9: workflow.plugins.audit.v1.QueryRequest + (*StatsRequest)(nil), // 10: workflow.plugins.audit.v1.StatsRequest + (*InfoRequest)(nil), // 11: workflow.plugins.audit.v1.InfoRequest + (*AuditEvent)(nil), // 12: workflow.plugins.audit.v1.AuditEvent + (*AuditQueryOutput)(nil), // 13: workflow.plugins.audit.v1.AuditQueryOutput + (*AuditExportOutput)(nil), // 14: workflow.plugins.audit.v1.AuditExportOutput + (*AuditAnnotateOutput)(nil), // 15: workflow.plugins.audit.v1.AuditAnnotateOutput + (*QueryResponse)(nil), // 16: workflow.plugins.audit.v1.QueryResponse + (*StatsResponse)(nil), // 17: workflow.plugins.audit.v1.StatsResponse + (*SinkInfoResponse)(nil), // 18: workflow.plugins.audit.v1.SinkInfoResponse + nil, // 19: workflow.plugins.audit.v1.AuditAnnotateConfig.AnnotationsEntry + nil, // 20: workflow.plugins.audit.v1.AuditAnnotateInput.AnnotationsEntry + nil, // 21: workflow.plugins.audit.v1.AuditEvent.AnnotationsEntry + nil, // 22: workflow.plugins.audit.v1.AuditAnnotateOutput.AnnotationsEntry + (*structpb.Struct)(nil), // 23: google.protobuf.Struct +} +var file_internal_contracts_audit_proto_depIdxs = []int32{ + 12, // 0: workflow.plugins.audit.v1.AuditExportInput.events:type_name -> workflow.plugins.audit.v1.AuditEvent + 19, // 1: workflow.plugins.audit.v1.AuditAnnotateConfig.annotations:type_name -> workflow.plugins.audit.v1.AuditAnnotateConfig.AnnotationsEntry + 20, // 2: workflow.plugins.audit.v1.AuditAnnotateInput.annotations:type_name -> workflow.plugins.audit.v1.AuditAnnotateInput.AnnotationsEntry + 23, // 3: workflow.plugins.audit.v1.AuditEvent.data:type_name -> google.protobuf.Struct + 21, // 4: workflow.plugins.audit.v1.AuditEvent.annotations:type_name -> workflow.plugins.audit.v1.AuditEvent.AnnotationsEntry + 12, // 5: workflow.plugins.audit.v1.AuditQueryOutput.events:type_name -> workflow.plugins.audit.v1.AuditEvent + 22, // 6: workflow.plugins.audit.v1.AuditAnnotateOutput.annotations:type_name -> workflow.plugins.audit.v1.AuditAnnotateOutput.AnnotationsEntry + 12, // 7: workflow.plugins.audit.v1.QueryResponse.events:type_name -> workflow.plugins.audit.v1.AuditEvent + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_internal_contracts_audit_proto_init() } +func file_internal_contracts_audit_proto_init() { + if File_internal_contracts_audit_proto != nil { + return + } + file_internal_contracts_audit_proto_msgTypes[3].OneofWrappers = []any{} + file_internal_contracts_audit_proto_msgTypes[4].OneofWrappers = []any{} + file_internal_contracts_audit_proto_msgTypes[9].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_contracts_audit_proto_rawDesc), len(file_internal_contracts_audit_proto_rawDesc)), + NumEnums: 0, + NumMessages: 23, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_internal_contracts_audit_proto_goTypes, + DependencyIndexes: file_internal_contracts_audit_proto_depIdxs, + MessageInfos: file_internal_contracts_audit_proto_msgTypes, + }.Build() + File_internal_contracts_audit_proto = out.File + file_internal_contracts_audit_proto_goTypes = nil + file_internal_contracts_audit_proto_depIdxs = nil +} diff --git a/internal/contracts/audit.proto b/internal/contracts/audit.proto new file mode 100644 index 0000000..17b312a --- /dev/null +++ b/internal/contracts/audit.proto @@ -0,0 +1,132 @@ +syntax = "proto3"; + +package workflow.plugins.audit.v1; + +import "google/protobuf/struct.proto"; + +option go_package = "github.com/GoCodeAlone/workflow-plugin-audit/internal/contracts;contracts"; + +message CollectorConfig { + repeated string topics = 1; + int32 flush_interval = 2; + int32 buffer_size = 3; +} + +message S3SinkConfig { + string bucket = 1; + string prefix = 2; + string region = 3; +} + +message DBSinkConfig { + string table_name = 1; +} + +message AuditQueryConfig { + string since = 1; + string until = 2; + string event_type = 3; + string workflow_id = 4; + string correlation_id = 5; + optional int32 limit = 6; +} + +message AuditQueryInput { + string since = 1; + string until = 2; + string event_type = 3; + string workflow_id = 4; + string correlation_id = 5; + optional int32 limit = 6; +} + +message AuditExportConfig { + string bucket = 1; + string prefix = 2; + string region = 3; +} + +message AuditExportInput { + repeated AuditEvent events = 1; + string bucket = 2; + string prefix = 3; + string region = 4; +} + +message AuditAnnotateConfig { + map annotations = 1; + string key = 2; + string value = 3; +} + +message AuditAnnotateInput { + map annotations = 1; + string key = 2; + string value = 3; +} + +message QueryRequest { + string since = 1; + string until = 2; + string event_type = 3; + string workflow_id = 4; + string correlation_id = 5; + optional int32 limit = 6; +} + +message StatsRequest {} + +message InfoRequest {} + +message AuditEvent { + string id = 1; + string timestamp = 2; + string event_type = 3; + string workflow_id = 4; + string pipeline_id = 5; + string step_name = 6; + string actor = 7; + string correlation_id = 8; + google.protobuf.Struct data = 9; + map annotations = 10; +} + +message AuditQueryOutput { + repeated AuditEvent events = 1; + int32 count = 2; + string error = 100; +} + +message AuditExportOutput { + int32 exported = 1; + string bucket = 2; + string key = 3; + int32 bytes_total = 4; + string error = 100; +} + +message AuditAnnotateOutput { + map annotations = 1; + int32 count = 2; + string error = 100; +} + +message QueryResponse { + repeated AuditEvent events = 1; + int32 count = 2; + string error = 100; +} + +message StatsResponse { + int64 dropped = 1; + int32 buffered = 2; + string error = 100; +} + +message SinkInfoResponse { + string type = 1; + string bucket = 2; + string prefix = 3; + string table_name = 4; + string error = 100; +} diff --git a/internal/module_collector.go b/internal/module_collector.go index a1a3623..1ddf466 100644 --- a/internal/module_collector.go +++ b/internal/module_collector.go @@ -229,12 +229,12 @@ func (c *CollectorModule) InvokeMethod(method string, args map[string]any) (map[ func parseQueryArgs(args map[string]any) AuditQuery { q := AuditQuery{Limit: 100} if v, ok := args["since"].(string); ok { - if t, err := time.Parse(time.RFC3339, v); err == nil { + if t, err := time.Parse(time.RFC3339Nano, v); err == nil { q.Since = t } } if v, ok := args["until"].(string); ok { - if t, err := time.Parse(time.RFC3339, v); err == nil { + if t, err := time.Parse(time.RFC3339Nano, v); err == nil { q.Until = t } } diff --git a/internal/plugin.go b/internal/plugin.go index bfa4446..943f8c1 100644 --- a/internal/plugin.go +++ b/internal/plugin.go @@ -1,12 +1,22 @@ package internal import ( + "fmt" + + "github.com/GoCodeAlone/workflow-plugin-audit/internal/contracts" + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" sdk "github.com/GoCodeAlone/workflow/plugin/external/sdk" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/types/descriptorpb" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/structpb" ) // Version is set at build time via -ldflags -// "-X github.com/GoCodeAlone/workflow-plugin-audit/internal.Version=X.Y.Z" -var Version = "dev" +// "-X github.com/GoCodeAlone/workflow-plugin-audit/internal.Version=X.Y.Z". +// Default is a bare semver so plugin loaders that validate semver accept +// unreleased dev builds; goreleaser overrides with the real release tag. +var Version = "0.0.0" var Manifest = sdk.PluginManifest{ Name: "workflow-plugin-audit", @@ -24,7 +34,9 @@ func NewPlugin() sdk.PluginProvider { return &plugin{} } func (p *plugin) Manifest() sdk.PluginManifest { return Manifest } -func (p *plugin) ModuleTypes() []string { return moduleTypes } +func (p *plugin) ModuleTypes() []string { return append([]string(nil), moduleTypes...) } + +func (p *plugin) TypedModuleTypes() []string { return append([]string(nil), moduleTypes...) } func (p *plugin) CreateModule(typeName, name string, config map[string]any) (sdk.ModuleInstance, error) { switch typeName { @@ -35,11 +47,39 @@ func (p *plugin) CreateModule(typeName, name string, config map[string]any) (sdk case "audit.sink.db": return NewDBSinkModule(name, config), nil default: - return nil, nil + return nil, fmt.Errorf("audit plugin: unknown module type %q", typeName) + } +} + +func (p *plugin) CreateTypedModule(typeName, name string, config *anypb.Any) (sdk.ModuleInstance, error) { + switch typeName { + case "audit.collector": + factory := sdk.NewTypedModuleFactory(typeName, &contracts.CollectorConfig{}, func(name string, cfg *contracts.CollectorConfig) (sdk.ModuleInstance, error) { + config, err := collectorConfigToMap(cfg) + if err != nil { + return nil, err + } + return NewCollectorModule(name, config), nil + }) + return factory.CreateTypedModule(typeName, name, config) + case "audit.sink.s3": + factory := sdk.NewTypedModuleFactory(typeName, &contracts.S3SinkConfig{}, func(name string, cfg *contracts.S3SinkConfig) (sdk.ModuleInstance, error) { + return NewS3SinkModule(name, s3ConfigToMap(cfg)), nil + }) + return factory.CreateTypedModule(typeName, name, config) + case "audit.sink.db": + factory := sdk.NewTypedModuleFactory(typeName, &contracts.DBSinkConfig{}, func(name string, cfg *contracts.DBSinkConfig) (sdk.ModuleInstance, error) { + return NewDBSinkModule(name, dbConfigToMap(cfg)), nil + }) + return factory.CreateTypedModule(typeName, name, config) + default: + return nil, fmt.Errorf("audit plugin: unknown module type %q", typeName) } } -func (p *plugin) StepTypes() []string { return stepTypes } +func (p *plugin) StepTypes() []string { return append([]string(nil), stepTypes...) } + +func (p *plugin) TypedStepTypes() []string { return append([]string(nil), stepTypes...) } func (p *plugin) CreateStep(typeName, name string, config map[string]any) (sdk.StepInstance, error) { switch typeName { @@ -50,6 +90,78 @@ func (p *plugin) CreateStep(typeName, name string, config map[string]any) (sdk.S case "step.audit_annotate": return NewAuditAnnotateStep(name, config), nil default: - return nil, nil + return nil, fmt.Errorf("audit plugin: unknown step type %q", typeName) + } +} + +func (p *plugin) CreateTypedStep(typeName, name string, config *anypb.Any) (sdk.StepInstance, error) { + switch typeName { + case "step.audit_query": + factory := sdk.NewTypedStepFactory(typeName, &contracts.AuditQueryConfig{}, &contracts.AuditQueryInput{}, typedAuditQuery()) + return factory.CreateTypedStep(typeName, name, config) + case "step.audit_export": + factory := sdk.NewTypedStepFactory(typeName, &contracts.AuditExportConfig{}, &contracts.AuditExportInput{}, typedAuditExport()) + return factory.CreateTypedStep(typeName, name, config) + case "step.audit_annotate": + factory := sdk.NewTypedStepFactory(typeName, &contracts.AuditAnnotateConfig{}, &contracts.AuditAnnotateInput{}, typedAuditAnnotate()) + return factory.CreateTypedStep(typeName, name, config) + default: + return nil, fmt.Errorf("audit plugin: unknown step type %q", typeName) + } +} + +func (p *plugin) ContractRegistry() *pb.ContractRegistry { + return &pb.ContractRegistry{ + FileDescriptorSet: &descriptorpb.FileDescriptorSet{File: []*descriptorpb.FileDescriptorProto{ + protodesc.ToFileDescriptorProto(structpb.File_google_protobuf_struct_proto), + protodesc.ToFileDescriptorProto(contracts.File_internal_contracts_audit_proto), + }}, + Contracts: []*pb.ContractDescriptor{ + moduleContract("audit.collector", "CollectorConfig"), + moduleContract("audit.sink.s3", "S3SinkConfig"), + moduleContract("audit.sink.db", "DBSinkConfig"), + stepContract("step.audit_query", "AuditQueryConfig", "AuditQueryInput", "AuditQueryOutput"), + stepContract("step.audit_export", "AuditExportConfig", "AuditExportInput", "AuditExportOutput"), + stepContract("step.audit_annotate", "AuditAnnotateConfig", "AuditAnnotateInput", "AuditAnnotateOutput"), + serviceContract("audit.collector", "query", "QueryRequest", "QueryResponse"), + serviceContract("audit.collector", "stats", "StatsRequest", "StatsResponse"), + serviceContract("audit.sink.s3", "info", "InfoRequest", "SinkInfoResponse"), + serviceContract("audit.sink.db", "info", "InfoRequest", "SinkInfoResponse"), + }, + } +} + +func moduleContract(moduleType, configMessage string) *pb.ContractDescriptor { + const pkg = "workflow.plugins.audit.v1." + return &pb.ContractDescriptor{ + Kind: pb.ContractKind_CONTRACT_KIND_MODULE, + ModuleType: moduleType, + ConfigMessage: pkg + configMessage, + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + } +} + +func stepContract(stepType, configMessage, inputMessage, outputMessage string) *pb.ContractDescriptor { + const pkg = "workflow.plugins.audit.v1." + return &pb.ContractDescriptor{ + Kind: pb.ContractKind_CONTRACT_KIND_STEP, + StepType: stepType, + ConfigMessage: pkg + configMessage, + InputMessage: pkg + inputMessage, + OutputMessage: pkg + outputMessage, + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + } +} + +func serviceContract(moduleType, method, inputMessage, outputMessage string) *pb.ContractDescriptor { + const pkg = "workflow.plugins.audit.v1." + return &pb.ContractDescriptor{ + Kind: pb.ContractKind_CONTRACT_KIND_SERVICE, + ModuleType: moduleType, + ServiceName: moduleType, + Method: method, + InputMessage: pkg + inputMessage, + OutputMessage: pkg + outputMessage, + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, } } diff --git a/internal/plugin_contracts_test.go b/internal/plugin_contracts_test.go new file mode 100644 index 0000000..47846ad --- /dev/null +++ b/internal/plugin_contracts_test.go @@ -0,0 +1,397 @@ +package internal + +import ( + "context" + "encoding/json" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/GoCodeAlone/workflow-plugin-audit/internal/contracts" + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" + sdk "github.com/GoCodeAlone/workflow/plugin/external/sdk" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/anypb" +) + +func TestPluginImplementsStrictContractProviders(t *testing.T) { + provider := NewPlugin() + if _, ok := provider.(sdk.TypedModuleProvider); !ok { + t.Fatal("expected TypedModuleProvider") + } + if _, ok := provider.(sdk.TypedStepProvider); !ok { + t.Fatal("expected TypedStepProvider") + } + if _, ok := provider.(sdk.ContractProvider); !ok { + t.Fatal("expected ContractProvider") + } +} + +func TestContractRegistryDeclaresStrictModuleStepAndServiceContracts(t *testing.T) { + provider := NewPlugin().(sdk.ContractProvider) + registry := provider.ContractRegistry() + if registry == nil { + t.Fatal("expected contract registry") + } + if registry.FileDescriptorSet == nil || len(registry.FileDescriptorSet.File) == 0 { + t.Fatal("expected file descriptor set") + } + files, err := protodesc.NewFiles(registry.FileDescriptorSet) + if err != nil { + t.Fatalf("descriptor set: %v", err) + } + + manifestContracts := loadManifestContracts(t) + contractsByKey := make(map[string]*pb.ContractDescriptor, len(registry.Contracts)) + for _, contract := range registry.Contracts { + if contract.Mode != pb.ContractMode_CONTRACT_MODE_STRICT_PROTO { + t.Fatalf("%s mode = %s, want strict proto", contractKey(contract), contract.Mode) + } + for _, name := range []string{contract.ConfigMessage, contract.InputMessage, contract.OutputMessage} { + if name == "" { + continue + } + if _, err := files.FindDescriptorByName(protoreflect.FullName(name)); err != nil { + t.Fatalf("%s references unknown message %s: %v", contractKey(contract), name, err) + } + } + key := contractKey(contract) + if _, exists := contractsByKey[key]; exists { + t.Fatalf("duplicate runtime contract %q", key) + } + contractsByKey[key] = contract + want, ok := manifestContracts[key] + if !ok { + t.Fatalf("%s missing from plugin.contracts.json", key) + } + if want.ConfigMessage != contract.ConfigMessage || want.InputMessage != contract.InputMessage || want.OutputMessage != contract.OutputMessage { + t.Fatalf("%s manifest contract = %#v, runtime = %#v", key, want, contract) + } + } + if len(contractsByKey) != len(manifestContracts) { + t.Fatalf("runtime contract count = %d, manifest = %d", len(contractsByKey), len(manifestContracts)) + } + + wantKeys := []string{ + "module:audit.collector", + "module:audit.sink.s3", + "module:audit.sink.db", + "step:step.audit_query", + "step:step.audit_export", + "step:step.audit_annotate", + "service:audit.collector/query", + "service:audit.collector/stats", + "service:audit.sink.s3/info", + "service:audit.sink.db/info", + } + for _, key := range wantKeys { + if _, ok := contractsByKey[key]; !ok { + t.Fatalf("missing runtime contract %q", key) + } + } +} + +func TestTypeListsAreDefensiveCopies(t *testing.T) { + provider := NewPlugin() + moduleProvider := provider.(sdk.ModuleProvider) + typedModuleProvider := provider.(sdk.TypedModuleProvider) + stepProvider := provider.(sdk.StepProvider) + typedStepProvider := provider.(sdk.TypedStepProvider) + + moduleTypes := moduleProvider.ModuleTypes() + moduleTypes[0] = "mutated" + if got := moduleProvider.ModuleTypes()[0]; got == "mutated" { + t.Fatal("ModuleTypes exposed mutable package-level slice") + } + + typedModuleTypes := typedModuleProvider.TypedModuleTypes() + typedModuleTypes[0] = "mutated" + if got := typedModuleProvider.TypedModuleTypes()[0]; got == "mutated" { + t.Fatal("TypedModuleTypes exposed mutable package-level slice") + } + + stepTypes := stepProvider.StepTypes() + stepTypes[0] = "mutated" + if got := stepProvider.StepTypes()[0]; got == "mutated" { + t.Fatal("StepTypes exposed mutable package-level slice") + } + + typedStepTypes := typedStepProvider.TypedStepTypes() + typedStepTypes[0] = "mutated" + if got := typedStepProvider.TypedStepTypes()[0]; got == "mutated" { + t.Fatal("TypedStepTypes exposed mutable package-level slice") + } +} + +func TestTypedAuditModuleProviderValidatesConfigAndServices(t *testing.T) { + provider := NewPlugin().(sdk.TypedModuleProvider) + config, err := anypb.New(&contracts.CollectorConfig{Topics: []string{"workflow.*"}, FlushInterval: 1, BufferSize: 10}) + if err != nil { + t.Fatalf("pack config: %v", err) + } + module, err := provider.CreateTypedModule("audit.collector", "collector", config) + if err != nil { + t.Fatalf("CreateTypedModule: %v", err) + } + invoker, ok := module.(sdk.TypedServiceInvoker) + if !ok { + t.Fatal("expected TypedServiceInvoker") + } + statsInput, err := anypb.New(&contracts.StatsRequest{}) + if err != nil { + t.Fatalf("pack stats input: %v", err) + } + statsOutput, err := invoker.InvokeTypedMethod("stats", statsInput) + if err != nil { + t.Fatalf("InvokeTypedMethod(stats): %v", err) + } + var stats contracts.StatsResponse + if err := statsOutput.UnmarshalTo(&stats); err != nil { + t.Fatalf("unpack stats output: %v", err) + } + if stats.GetBuffered() != 0 || stats.GetDropped() != 0 { + t.Fatalf("stats = buffered %d dropped %d, want zeroes", stats.GetBuffered(), stats.GetDropped()) + } + + wrongConfig, err := anypb.New(&contracts.S3SinkConfig{Bucket: "audit"}) + if err != nil { + t.Fatalf("pack wrong config: %v", err) + } + if _, err := provider.CreateTypedModule("audit.collector", "collector", wrongConfig); err == nil { + t.Fatal("CreateTypedModule accepted wrong typed config") + } + + negativeBuffer, err := anypb.New(&contracts.CollectorConfig{BufferSize: -1}) + if err != nil { + t.Fatalf("pack negative buffer config: %v", err) + } + if _, err := provider.CreateTypedModule("audit.collector", "collector", negativeBuffer); err == nil { + t.Fatal("CreateTypedModule accepted negative buffer_size") + } + + negativeFlush, err := anypb.New(&contracts.CollectorConfig{FlushInterval: -1}) + if err != nil { + t.Fatalf("pack negative flush config: %v", err) + } + if _, err := provider.CreateTypedModule("audit.collector", "collector", negativeFlush); err == nil { + t.Fatal("CreateTypedModule accepted negative flush_interval") + } +} + +func TestTypedAuditAnnotateStepMergesConfigAndInput(t *testing.T) { + result, err := typedAuditAnnotate()(context.Background(), sdk.TypedStepRequest[*contracts.AuditAnnotateConfig, *contracts.AuditAnnotateInput]{ + Config: &contracts.AuditAnnotateConfig{ + Annotations: map[string]string{"compliance": "SOC2"}, + }, + Input: &contracts.AuditAnnotateInput{ + Key: "region", + Value: "us-east-1", + }, + Metadata: map[string]any{}, + }) + if err != nil { + t.Fatalf("typedAuditAnnotate: %v", err) + } + if result == nil || result.Output == nil { + t.Fatal("expected typed output") + } + if result.Output.GetCount() != 2 { + t.Fatalf("count = %d, want 2", result.Output.GetCount()) + } + if got := result.Output.GetAnnotations()["compliance"]; got != "SOC2" { + t.Fatalf("compliance = %q, want SOC2", got) + } + if got := result.Output.GetAnnotations()["region"]; got != "us-east-1" { + t.Fatalf("region = %q, want us-east-1", got) + } +} + +func TestTypedAuditExportRejectsInvalidEventTimestamp(t *testing.T) { + _, err := typedAuditExport()(context.Background(), sdk.TypedStepRequest[*contracts.AuditExportConfig, *contracts.AuditExportInput]{ + Input: &contracts.AuditExportInput{ + Events: []*contracts.AuditEvent{{ + Id: "event-1", + Timestamp: "not-a-timestamp", + EventType: "workflow.started", + }}, + }, + }) + if err == nil { + t.Fatal("typedAuditExport accepted invalid event timestamp") + } +} + +func TestTypedAuditQueryRejectsInvalidTimeBounds(t *testing.T) { + negativeLimit := int32(-1) + _, err := typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{Since: "not-a-timestamp"}, + Input: &contracts.AuditQueryInput{Since: "2026-04-27T10:00:00Z"}, + }) + if err != nil { + t.Fatalf("typedAuditQuery rejected invalid config since overridden by input: %v", err) + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{Since: "not-a-timestamp"}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted invalid config since timestamp") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Input: &contracts.AuditQueryInput{Until: "not-a-timestamp"}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted invalid input until timestamp") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{ + Since: "2026-04-27T12:00:00Z", + Until: "2026-04-27T11:00:00Z", + }, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted since timestamp after until timestamp") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{Since: "2026-04-27T12:00:00Z"}, + Input: &contracts.AuditQueryInput{Until: "2026-04-27T11:00:00Z"}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted merged since timestamp after until timestamp") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{Since: "2026-04-27T10:00:00Z"}, + Input: &contracts.AuditQueryInput{Until: "2026-04-27T11:00:00Z"}, + Current: map[string]any{"since": "not-a-timestamp"}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted current override with invalid since timestamp") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{Since: "2026-04-27T10:00:00Z"}, + Input: &contracts.AuditQueryInput{}, + Current: map[string]any{"until": "2026-04-27T09:00:00Z"}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted current override that made since after until") + } + + _, err = typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Input: &contracts.AuditQueryInput{Limit: &negativeLimit}, + }) + if err == nil { + t.Fatal("typedAuditQuery accepted negative limit") + } +} + +func TestTypedAuditQueryPreservesExplicitZeroLimit(t *testing.T) { + zero := int32(0) + ten := int32(10) + config, err := queryConfigToMap(&contracts.AuditQueryConfig{Limit: &ten}) + if err != nil { + t.Fatalf("queryConfigToMap: %v", err) + } + input, err := queryInputToMap(&contracts.AuditQueryInput{Limit: &zero}) + if err != nil { + t.Fatalf("queryInputToMap: %v", err) + } + merged := mergeConfigs(config, input) + if got, ok := merged["limit"].(float64); !ok || got != 0 { + t.Fatalf("merged limit = %#v, want explicit zero", merged["limit"]) + } +} + +func TestTypedAuditQueryAcceptsFractionalSecondBounds(t *testing.T) { + _, err := typedAuditQuery()(context.Background(), sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]{ + Config: &contracts.AuditQueryConfig{ + Since: "2026-04-27T10:00:00.123456789Z", + Until: "2026-04-27T10:00:01.123456789Z", + }, + }) + if err != nil { + t.Fatalf("typedAuditQuery rejected RFC3339Nano bounds: %v", err) + } +} + +func TestQueryResponseFromMapRejectsMalformedEvents(t *testing.T) { + if _, err := queryResponseFromMap(map[string]any{"events": "not-json"}); err == nil { + t.Fatal("queryResponseFromMap accepted malformed events JSON") + } +} + +type manifestContract struct { + Mode string `json:"mode"` + ConfigMessage string `json:"config"` + InputMessage string `json:"input"` + OutputMessage string `json:"output"` +} + +func loadManifestContracts(t *testing.T) map[string]manifestContract { + t.Helper() + _, file, _, ok := runtime.Caller(0) + if !ok { + t.Fatal("runtime.Caller failed") + } + data, err := os.ReadFile(filepath.Join(filepath.Dir(file), "..", "plugin.contracts.json")) + if err != nil { + t.Fatalf("read plugin.contracts.json: %v", err) + } + var manifest struct { + Version string `json:"version"` + Contracts []struct { + Kind string `json:"kind"` + Type string `json:"type"` + ServiceName string `json:"serviceName"` + Method string `json:"method"` + manifestContract + } `json:"contracts"` + } + if err := json.Unmarshal(data, &manifest); err != nil { + t.Fatalf("parse plugin.contracts.json: %v", err) + } + if manifest.Version != "v1" { + t.Fatalf("plugin.contracts.json version = %q, want v1", manifest.Version) + } + contracts := make(map[string]manifestContract, len(manifest.Contracts)) + for _, contract := range manifest.Contracts { + if contract.Mode != "strict" { + t.Fatalf("%s mode = %q, want strict", contract.Type, contract.Mode) + } + var key string + switch contract.Kind { + case "module": + key = "module:" + contract.Type + case "step": + key = "step:" + contract.Type + case "service_method": + key = "service:" + contract.ServiceName + "/" + contract.Method + default: + t.Fatalf("unexpected contract kind %q in plugin.contracts.json", contract.Kind) + } + if _, exists := contracts[key]; exists { + t.Fatalf("duplicate contract %q in plugin.contracts.json", key) + } + contracts[key] = contract.manifestContract + } + return contracts +} + +func contractKey(contract *pb.ContractDescriptor) string { + switch contract.Kind { + case pb.ContractKind_CONTRACT_KIND_MODULE: + return "module:" + contract.ModuleType + case pb.ContractKind_CONTRACT_KIND_STEP: + return "step:" + contract.StepType + case pb.ContractKind_CONTRACT_KIND_SERVICE: + return "service:" + contract.ServiceName + "/" + contract.Method + default: + return contract.Kind.String() + } +} diff --git a/internal/step_query.go b/internal/step_query.go index 7cdce06..edd9691 100644 --- a/internal/step_query.go +++ b/internal/step_query.go @@ -32,12 +32,12 @@ func (s *AuditQueryStep) Execute( merged := mergeConfigs(s.config, config, current) if v, ok := merged["since"].(string); ok { - if t, err := time.Parse(time.RFC3339, v); err == nil { + if t, err := time.Parse(time.RFC3339Nano, v); err == nil { q.Since = t } } if v, ok := merged["until"].(string); ok { - if t, err := time.Parse(time.RFC3339, v); err == nil { + if t, err := time.Parse(time.RFC3339Nano, v); err == nil { q.Until = t } } diff --git a/internal/typed.go b/internal/typed.go new file mode 100644 index 0000000..73c95f8 --- /dev/null +++ b/internal/typed.go @@ -0,0 +1,509 @@ +package internal + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/GoCodeAlone/workflow-plugin-audit/internal/contracts" + sdk "github.com/GoCodeAlone/workflow/plugin/external/sdk" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/structpb" +) + +func typedAuditQuery() sdk.TypedStepHandler[*contracts.AuditQueryConfig, *contracts.AuditQueryInput, *contracts.AuditQueryOutput] { + return func(ctx context.Context, req sdk.TypedStepRequest[*contracts.AuditQueryConfig, *contracts.AuditQueryInput]) (*sdk.TypedStepResult[*contracts.AuditQueryOutput], error) { + config, err := queryConfigToMap(req.Config) + if err != nil { + return nil, err + } + input, err := queryInputToMap(req.Input) + if err != nil { + return nil, err + } + merged := mergeConfigs(config, input, req.Current) + if err := validateQueryMap(merged); err != nil { + return nil, err + } + step := NewAuditQueryStep("", config) + result, err := step.Execute(ctx, req.TriggerData, req.StepOutputs, req.Current, req.Metadata, input) + if err != nil { + return nil, err + } + output, err := auditQueryOutputFromMap(result.Output) + if err != nil { + return nil, err + } + return &sdk.TypedStepResult[*contracts.AuditQueryOutput]{Output: output, StopPipeline: result.StopPipeline}, nil + } +} + +func typedAuditExport() sdk.TypedStepHandler[*contracts.AuditExportConfig, *contracts.AuditExportInput, *contracts.AuditExportOutput] { + return func(ctx context.Context, req sdk.TypedStepRequest[*contracts.AuditExportConfig, *contracts.AuditExportInput]) (*sdk.TypedStepResult[*contracts.AuditExportOutput], error) { + config := exportConfigToMap(req.Config) + input, err := exportInputToMap(req.Input) + if err != nil { + return nil, err + } + step := NewAuditExportStep("", config) + result, err := step.Execute(ctx, req.TriggerData, req.StepOutputs, req.Current, req.Metadata, input) + if err != nil { + return nil, err + } + return &sdk.TypedStepResult[*contracts.AuditExportOutput]{Output: auditExportOutputFromMap(result.Output), StopPipeline: result.StopPipeline}, nil + } +} + +func typedAuditAnnotate() sdk.TypedStepHandler[*contracts.AuditAnnotateConfig, *contracts.AuditAnnotateInput, *contracts.AuditAnnotateOutput] { + return func(ctx context.Context, req sdk.TypedStepRequest[*contracts.AuditAnnotateConfig, *contracts.AuditAnnotateInput]) (*sdk.TypedStepResult[*contracts.AuditAnnotateOutput], error) { + step := NewAuditAnnotateStep("", annotateConfigToMap(req.Config)) + result, err := step.Execute(ctx, req.TriggerData, req.StepOutputs, req.Current, req.Metadata, annotateInputToMap(req.Input)) + if err != nil { + return nil, err + } + return &sdk.TypedStepResult[*contracts.AuditAnnotateOutput]{Output: auditAnnotateOutputFromMap(result.Output), StopPipeline: result.StopPipeline}, nil + } +} + +func (c *CollectorModule) InvokeTypedMethod(method string, input *anypb.Any) (*anypb.Any, error) { + switch method { + case "query": + req, err := unpackTypedArgs(input, &contracts.QueryRequest{}) + if err != nil { + return nil, err + } + args, err := queryRequestToMap(req) + if err != nil { + return nil, err + } + out, err := c.InvokeMethod(method, args) + if err != nil { + return nil, err + } + response, err := queryResponseFromMap(out) + if err != nil { + return nil, err + } + return anypb.New(response) + case "stats": + if _, err := unpackTypedArgs(input, &contracts.StatsRequest{}); err != nil { + return nil, err + } + out, err := c.InvokeMethod(method, nil) + if err != nil { + return nil, err + } + return anypb.New(statsResponseFromMap(out)) + default: + return nil, fmt.Errorf("unknown method: %s", method) + } +} + +func (m *S3SinkModule) InvokeTypedMethod(method string, input *anypb.Any) (*anypb.Any, error) { + if method != "info" { + return nil, fmt.Errorf("unknown method: %s", method) + } + if _, err := unpackTypedArgs(input, &contracts.InfoRequest{}); err != nil { + return nil, err + } + out, err := m.InvokeMethod(method, nil) + if err != nil { + return nil, err + } + return anypb.New(sinkInfoResponseFromMap(out)) +} + +func (m *DBSinkModule) InvokeTypedMethod(method string, input *anypb.Any) (*anypb.Any, error) { + if method != "info" { + return nil, fmt.Errorf("unknown method: %s", method) + } + if _, err := unpackTypedArgs(input, &contracts.InfoRequest{}); err != nil { + return nil, err + } + out, err := m.InvokeMethod(method, nil) + if err != nil { + return nil, err + } + return anypb.New(sinkInfoResponseFromMap(out)) +} + +func unpackTypedArgs[T proto.Message](input *anypb.Any, target T) (T, error) { + if input == nil { + var zero T + return zero, fmt.Errorf("typed input is required") + } + if input.MessageName() != target.ProtoReflect().Descriptor().FullName() { + var zero T + return zero, fmt.Errorf("typed input type mismatch: expected %s, got %s", target.ProtoReflect().Descriptor().FullName(), input.MessageName()) + } + if err := input.UnmarshalTo(target); err != nil { + var zero T + return zero, err + } + return target, nil +} + +func collectorConfigToMap(cfg *contracts.CollectorConfig) (map[string]any, error) { + if cfg == nil { + return nil, nil + } + if cfg.GetFlushInterval() < 0 { + return nil, fmt.Errorf("flush_interval must be positive when set") + } + if cfg.GetBufferSize() < 0 { + return nil, fmt.Errorf("buffer_size must be positive when set") + } + out := map[string]any{} + if len(cfg.GetTopics()) > 0 { + out["topics"] = stringsToAny(cfg.GetTopics()) + } + if cfg.GetFlushInterval() != 0 { + out["flushInterval"] = float64(cfg.GetFlushInterval()) + } + if cfg.GetBufferSize() != 0 { + out["bufferSize"] = float64(cfg.GetBufferSize()) + } + return out, nil +} + +func s3ConfigToMap(cfg *contracts.S3SinkConfig) map[string]any { + if cfg == nil { + return nil + } + return compactMap(map[string]any{"bucket": cfg.GetBucket(), "prefix": cfg.GetPrefix(), "region": cfg.GetRegion()}) +} + +func dbConfigToMap(cfg *contracts.DBSinkConfig) map[string]any { + if cfg == nil { + return nil + } + return compactMap(map[string]any{"tableName": cfg.GetTableName()}) +} + +func queryConfigToMap(cfg *contracts.AuditQueryConfig) (map[string]any, error) { + if cfg == nil { + return nil, nil + } + return queryFieldsToMap(cfg.GetSince(), cfg.GetUntil(), cfg.GetEventType(), cfg.GetWorkflowId(), cfg.GetCorrelationId(), cfg.Limit), nil +} + +func queryInputToMap(input *contracts.AuditQueryInput) (map[string]any, error) { + if input == nil { + return nil, nil + } + return queryFieldsToMap(input.GetSince(), input.GetUntil(), input.GetEventType(), input.GetWorkflowId(), input.GetCorrelationId(), input.Limit), nil +} + +func queryRequestToMap(req *contracts.QueryRequest) (map[string]any, error) { + if req == nil { + return nil, nil + } + if err := validateQueryFields(req.GetSince(), req.GetUntil(), req.Limit); err != nil { + return nil, err + } + return queryFieldsToMap(req.GetSince(), req.GetUntil(), req.GetEventType(), req.GetWorkflowId(), req.GetCorrelationId(), req.Limit), nil +} + +func queryFieldsToMap(since, until, eventType, workflowID, correlationID string, limit *int32) map[string]any { + values := compactMap(map[string]any{ + "since": since, + "until": until, + "eventType": eventType, + "workflowId": workflowID, + "correlationId": correlationID, + }) + if limit != nil { + values["limit"] = float64(*limit) + } + return values +} + +func validateQueryMap(values map[string]any) error { + if values == nil { + return nil + } + return validateQueryFields(strVal(values, "since"), strVal(values, "until"), queryLimitFromMap(values)) +} + +func queryLimitFromMap(values map[string]any) *int32 { + if _, ok := values["limit"]; !ok { + return nil + } + limit := int32(toInt(values["limit"])) + return &limit +} + +func validateQueryFields(since, until string, limit *int32) error { + if limit != nil && *limit < 0 { + return fmt.Errorf("limit must be non-negative") + } + parsedSince, err := parseOptionalQueryTimestamp("since", since) + if err != nil { + return err + } + parsedUntil, err := parseOptionalQueryTimestamp("until", until) + if err != nil { + return err + } + if parsedSince != nil && parsedUntil != nil && parsedSince.After(*parsedUntil) { + return fmt.Errorf("since timestamp must be before or equal to until timestamp") + } + return nil +} + +func parseOptionalQueryTimestamp(name, raw string) (*time.Time, error) { + if raw == "" { + return nil, nil + } + parsed, err := time.Parse(time.RFC3339Nano, raw) + if err != nil { + return nil, fmt.Errorf("%s timestamp %q: %w", name, raw, err) + } + return &parsed, nil +} + +func exportConfigToMap(cfg *contracts.AuditExportConfig) map[string]any { + if cfg == nil { + return nil + } + return compactMap(map[string]any{"bucket": cfg.GetBucket(), "prefix": cfg.GetPrefix(), "region": cfg.GetRegion()}) +} + +func exportInputToMap(input *contracts.AuditExportInput) (map[string]any, error) { + if input == nil { + return nil, nil + } + events := make([]AuditEvent, 0, len(input.GetEvents())) + for _, event := range input.GetEvents() { + auditEvent, err := protoToAuditEvent(event) + if err != nil { + return nil, err + } + events = append(events, auditEvent) + } + raw, err := json.Marshal(events) + if err != nil { + return nil, err + } + return compactMap(map[string]any{ + "events": string(raw), + "bucket": input.GetBucket(), + "prefix": input.GetPrefix(), + "region": input.GetRegion(), + }), nil +} + +func annotateConfigToMap(cfg *contracts.AuditAnnotateConfig) map[string]any { + if cfg == nil { + return nil + } + return compactMap(map[string]any{"annotations": cfg.GetAnnotations(), "key": cfg.GetKey(), "value": cfg.GetValue()}) +} + +func annotateInputToMap(input *contracts.AuditAnnotateInput) map[string]any { + if input == nil { + return nil + } + return compactMap(map[string]any{"annotations": input.GetAnnotations(), "key": input.GetKey(), "value": input.GetValue()}) +} + +func auditQueryOutputFromMap(out map[string]any) (*contracts.AuditQueryOutput, error) { + response, err := queryResponseFromMap(out) + if err != nil { + return nil, err + } + return &contracts.AuditQueryOutput{Events: response.Events, Count: response.Count, Error: response.Error}, nil +} + +func queryResponseFromMap(out map[string]any) (*contracts.QueryResponse, error) { + response := &contracts.QueryResponse{Count: int32(toInt(out["count"])), Error: strVal(out, "error")} + if raw, ok := out["events"].(string); ok && raw != "" { + var events []AuditEvent + if err := json.Unmarshal([]byte(raw), &events); err != nil { + return nil, fmt.Errorf("query response events: %w", err) + } + for i := range events { + response.Events = append(response.Events, auditEventToProto(events[i])) + } + } + return response, nil +} + +func auditExportOutputFromMap(out map[string]any) *contracts.AuditExportOutput { + return &contracts.AuditExportOutput{ + Exported: int32(toInt(out["exported"])), + Bucket: strVal(out, "bucket"), + Key: strVal(out, "key"), + BytesTotal: int32(toInt(out["bytesTotal"])), + Error: strVal(out, "error"), + } +} + +func auditAnnotateOutputFromMap(out map[string]any) *contracts.AuditAnnotateOutput { + return &contracts.AuditAnnotateOutput{ + Annotations: mapStringString(out["annotations"]), + Count: int32(toInt(out["count"])), + Error: strVal(out, "error"), + } +} + +func statsResponseFromMap(out map[string]any) *contracts.StatsResponse { + return &contracts.StatsResponse{ + Dropped: int64(toInt(out["dropped"])), + Buffered: int32(toInt(out["buffered"])), + Error: strVal(out, "error"), + } +} + +func sinkInfoResponseFromMap(out map[string]any) *contracts.SinkInfoResponse { + return &contracts.SinkInfoResponse{ + Type: strVal(out, "type"), + Bucket: strVal(out, "bucket"), + Prefix: strVal(out, "prefix"), + TableName: strVal(out, "tableName"), + Error: strVal(out, "error"), + } +} + +func auditEventToProto(event AuditEvent) *contracts.AuditEvent { + return &contracts.AuditEvent{ + Id: event.ID, + Timestamp: event.Timestamp.Format(time.RFC3339Nano), + EventType: event.EventType, + WorkflowId: event.WorkflowID, + PipelineId: event.PipelineID, + StepName: event.StepName, + Actor: event.Actor, + CorrelationId: event.CorrelationID, + Data: structFromMap(event.Data), + Annotations: event.Annotations, + } +} + +func protoToAuditEvent(event *contracts.AuditEvent) (AuditEvent, error) { + if event == nil { + return AuditEvent{}, nil + } + var timestamp time.Time + if raw := event.GetTimestamp(); raw != "" { + parsed, err := time.Parse(time.RFC3339Nano, raw) + if err != nil { + return AuditEvent{}, fmt.Errorf("audit event %q timestamp %q: %w", event.GetId(), raw, err) + } + timestamp = parsed + } + return AuditEvent{ + ID: event.GetId(), + Timestamp: timestamp, + EventType: event.GetEventType(), + WorkflowID: event.GetWorkflowId(), + PipelineID: event.GetPipelineId(), + StepName: event.GetStepName(), + Actor: event.GetActor(), + CorrelationID: event.GetCorrelationId(), + Data: structToMap(event.GetData()), + Annotations: event.GetAnnotations(), + }, nil +} + +func structFromMap(values map[string]any) *structpb.Struct { + if len(values) == 0 { + return nil + } + out, err := structpb.NewStruct(values) + if err != nil { + return nil + } + return out +} + +func structToMap(value *structpb.Struct) map[string]any { + if value == nil { + return nil + } + return value.AsMap() +} + +func stringsToAny(values []string) []any { + out := make([]any, 0, len(values)) + for _, value := range values { + out = append(out, value) + } + return out +} + +func mapStringString(value any) map[string]string { + out := map[string]string{} + switch v := value.(type) { + case map[string]string: + for key, item := range v { + out[key] = item + } + case map[string]any: + for key, item := range v { + if str, ok := item.(string); ok { + out[key] = str + } + } + } + return out +} + +func strVal(values map[string]any, key string) string { + if values == nil { + return "" + } + if value, ok := values[key].(string); ok { + return value + } + return "" +} + +func toInt(value any) int { + switch v := value.(type) { + case int: + return v + case int32: + return int(v) + case int64: + return int(v) + case float64: + return int(v) + case float32: + return int(v) + default: + return 0 + } +} + +func compactMap(values map[string]any) map[string]any { + out := map[string]any{} + for key, value := range values { + if isZeroTypedValue(value) { + continue + } + out[key] = value + } + return out +} + +func isZeroTypedValue(value any) bool { + switch v := value.(type) { + case string: + return v == "" + case float64: + return v == 0 + case int32: + return v == 0 + case []AuditEvent: + return len(v) == 0 + case map[string]string: + return len(v) == 0 + case nil: + return true + default: + return false + } +} diff --git a/plugin.contracts.json b/plugin.contracts.json new file mode 100644 index 0000000..9fd2cd8 --- /dev/null +++ b/plugin.contracts.json @@ -0,0 +1,79 @@ +{ + "version": "v1", + "contracts": [ + { + "kind": "module", + "type": "audit.collector", + "mode": "strict", + "config": "workflow.plugins.audit.v1.CollectorConfig" + }, + { + "kind": "module", + "type": "audit.sink.s3", + "mode": "strict", + "config": "workflow.plugins.audit.v1.S3SinkConfig" + }, + { + "kind": "module", + "type": "audit.sink.db", + "mode": "strict", + "config": "workflow.plugins.audit.v1.DBSinkConfig" + }, + { + "kind": "step", + "type": "step.audit_query", + "mode": "strict", + "config": "workflow.plugins.audit.v1.AuditQueryConfig", + "input": "workflow.plugins.audit.v1.AuditQueryInput", + "output": "workflow.plugins.audit.v1.AuditQueryOutput" + }, + { + "kind": "step", + "type": "step.audit_export", + "mode": "strict", + "config": "workflow.plugins.audit.v1.AuditExportConfig", + "input": "workflow.plugins.audit.v1.AuditExportInput", + "output": "workflow.plugins.audit.v1.AuditExportOutput" + }, + { + "kind": "step", + "type": "step.audit_annotate", + "mode": "strict", + "config": "workflow.plugins.audit.v1.AuditAnnotateConfig", + "input": "workflow.plugins.audit.v1.AuditAnnotateInput", + "output": "workflow.plugins.audit.v1.AuditAnnotateOutput" + }, + { + "kind": "service_method", + "serviceName": "audit.collector", + "method": "query", + "mode": "strict", + "input": "workflow.plugins.audit.v1.QueryRequest", + "output": "workflow.plugins.audit.v1.QueryResponse" + }, + { + "kind": "service_method", + "serviceName": "audit.collector", + "method": "stats", + "mode": "strict", + "input": "workflow.plugins.audit.v1.StatsRequest", + "output": "workflow.plugins.audit.v1.StatsResponse" + }, + { + "kind": "service_method", + "serviceName": "audit.sink.s3", + "method": "info", + "mode": "strict", + "input": "workflow.plugins.audit.v1.InfoRequest", + "output": "workflow.plugins.audit.v1.SinkInfoResponse" + }, + { + "kind": "service_method", + "serviceName": "audit.sink.db", + "method": "info", + "mode": "strict", + "input": "workflow.plugins.audit.v1.InfoRequest", + "output": "workflow.plugins.audit.v1.SinkInfoResponse" + } + ] +} diff --git a/plugin.json b/plugin.json index 5829948..85c8668 100644 --- a/plugin.json +++ b/plugin.json @@ -1,20 +1,58 @@ { "name": "workflow-plugin-audit", - "version": "0.1.0", + "version": "0.1.2", "description": "Compliance audit logging (EventBus → S3/DB sinks)", "author": "GoCodeAlone", "license": "MIT", "type": "external", "tier": "community", "private": false, - "minEngineVersion": "0.3.55", + "minEngineVersion": "0.19.0", "keywords": [], "homepage": "https://github.com/GoCodeAlone/workflow-plugin-audit", "repository": "https://github.com/GoCodeAlone/workflow-plugin-audit", + "downloads": [ + { + "os": "linux", + "arch": "amd64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-linux-amd64.tar.gz" + }, + { + "os": "linux", + "arch": "arm64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-linux-arm64.tar.gz" + }, + { + "os": "darwin", + "arch": "amd64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-darwin-amd64.tar.gz" + }, + { + "os": "darwin", + "arch": "arm64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-darwin-arm64.tar.gz" + }, + { + "os": "windows", + "arch": "amd64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-windows-amd64.tar.gz" + }, + { + "os": "windows", + "arch": "arm64", + "url": "https://github.com/GoCodeAlone/workflow-plugin-audit/releases/download/v0.1.2/workflow-plugin-audit-windows-arm64.tar.gz" + } + ], "capabilities": { "configProvider": false, "moduleTypes": ["audit.collector", "audit.sink.s3", "audit.sink.db"], "stepTypes": ["step.audit_query", "step.audit_export", "step.audit_annotate"], + "serviceMethods": [ + "audit.collector/query", + "audit.collector/stats", + "audit.sink.s3/info", + "audit.sink.db/info" + ], "triggerTypes": [] } }