From 2a9b2937214a20a49f0a5eb8916c518c6d090e59 Mon Sep 17 00:00:00 2001 From: Kohei Hisakuni Date: Tue, 11 Aug 2026 14:20:45 -0700 Subject: [PATCH 1/3] Use the EmitDefaultValues field for the namespace capacity get command --- go.mod | 3 + go.sum | 2 - .../commands.namespace.capacity.go | 2 +- .../commands.namespace.capacity_test.go | 2 + temporalcloudcli/commands.testing.go | 7 +- temporalcloudcli/internal/printer/printer.go | 92 +++++++++++++------ .../internal/printer/printer_test.go | 42 +++++++++ 7 files changed, 118 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index 69215ff..413235e 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,9 @@ require ( google.golang.org/grpc v1.81.1 ) +// TODO: Remove. +replace go.temporal.io/api => ../api-go + require ( github.com/BurntSushi/toml v1.6.0 // indirect github.com/brunoga/deep v1.3.1 // indirect diff --git a/go.sum b/go.sum index 1169c40..855e90e 100644 --- a/go.sum +++ b/go.sum @@ -152,8 +152,6 @@ go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfC go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -go.temporal.io/api v1.62.13 h1:xMa8Nt5oAMX+LvlCJA44wjTCc1H09i2rG9poB1/xvH4= -go.temporal.io/api v1.62.13/go.mod h1:0k75tRljEuELWGeXjEZZO7zYqBln4+1FrG6+IMOMy7Q= go.temporal.io/cloud-sdk v0.16.0 h1:8EgFMyc3M1XV2+OIOOuKeyhUI8Kjy7YCCbmGYlRw1No= go.temporal.io/cloud-sdk v0.16.0/go.mod h1:W2O9t9tvo3Q/LhGgYdj8JijWbN5C84os+cz/BadIHYI= go.temporal.io/sdk v1.44.1 h1:Mt2OZLZpqkzDIdg9YyQzO0Rb/HqCDnnqHlIAGAJ5gqM= diff --git a/temporalcloudcli/commands.namespace.capacity.go b/temporalcloudcli/commands.namespace.capacity.go index da4a673..0e85b6f 100644 --- a/temporalcloudcli/commands.namespace.capacity.go +++ b/temporalcloudcli/commands.namespace.capacity.go @@ -26,7 +26,7 @@ func (c *CloudNamespaceCapacityGetCommand) run(cctx *CommandContext, _ []string) if err != nil { return err } - return cctx.Printer.PrintResource(res.CapacityInfo, printer.PrintResourceOptions{}) + return cctx.Printer.PrintResource(res.CapacityInfo, printer.PrintResourceOptions{EmitDefaultValues: true}) } func (c *CloudNamespaceCapacityUpdateCommand) run(cctx *CommandContext, _ []string) error { diff --git a/temporalcloudcli/commands.namespace.capacity_test.go b/temporalcloudcli/commands.namespace.capacity_test.go index 3da2b44..92e131c 100644 --- a/temporalcloudcli/commands.namespace.capacity_test.go +++ b/temporalcloudcli/commands.namespace.capacity_test.go @@ -60,6 +60,8 @@ func TestCapacityGet(t *testing.T) { JSONOutput: true, ExpectedError: tt.expectedErr, ExpectedOutputJson: tt.expectedJsonOutput, + // The get command prints with EmitDefaultValues, so zero-valued fields appear in the output. + ExpectedOutputJsonEmitDefaults: true, }) }) } diff --git a/temporalcloudcli/commands.testing.go b/temporalcloudcli/commands.testing.go index 2afbff6..97a1b4c 100644 --- a/temporalcloudcli/commands.testing.go +++ b/temporalcloudcli/commands.testing.go @@ -63,6 +63,9 @@ type ( ExpectedError string ExpectedOutput string ExpectedOutputJson any + // ExpectedOutputJsonEmitDefaults marshals ExpectedOutputJson with default values emitted. Set this for + // commands that print with printer.PrintResourceOptions{EmitDefaultValues: true}. + ExpectedOutputJsonEmitDefaults bool } ) @@ -199,7 +202,9 @@ func TestCommand(t *testing.T, command CommandIfc, opts TestCommandOptions) { var js []byte var err error if protoMessage, ok := opts.ExpectedOutputJson.(proto.Message); ok { - js, err = protojson.Marshal(protoMessage) + js, err = protojson.MarshalOptions{ + EmitDefaultValues: opts.ExpectedOutputJsonEmitDefaults, + }.Marshal(protoMessage) } else { js, err = json.Marshal(opts.ExpectedOutputJson) } diff --git a/temporalcloudcli/internal/printer/printer.go b/temporalcloudcli/internal/printer/printer.go index c4ad60a..f024689 100644 --- a/temporalcloudcli/internal/printer/printer.go +++ b/temporalcloudcli/internal/printer/printer.go @@ -14,8 +14,8 @@ import ( "github.com/fatih/color" "github.com/kylelemons/godebug/diff" - "github.com/olekukonko/tablewriter/tw" "github.com/olekukonko/tablewriter/pkg/twwidth" + "github.com/olekukonko/tablewriter/tw" "go.temporal.io/api/common/v1" "go.temporal.io/api/temporalproto" "google.golang.org/protobuf/proto" @@ -126,6 +126,9 @@ type StructuredOptions struct { OverrideJSONPayloadShorthand *bool // Indent this many additional times when printing non-JSON NonJSONExtraIndent int + // If true, fields holding their default value (e.g. 0, false, "") are printed instead of omitted. + // Unset pointer fields remain omitted. + EmitDefaultValues bool } type Align tw.Align @@ -155,7 +158,7 @@ func (p *Printer) PrintStructured(v any, options StructuredOptions) error { // Get data cols := options.toPredefinedCols() - cols, rows, err := p.tableData(cols, v) + cols, rows, err := p.tableData(cols, v, options.EmitDefaultValues) if err != nil { return err } @@ -203,7 +206,7 @@ func (p *Printer) PrintStructuredTableIter( if v == nil || err != nil { return err } - row, err := p.tableRowData(cols, v) + row, err := p.tableRowData(cols, v, options.EmitDefaultValues) if err != nil { return err } @@ -248,7 +251,7 @@ func (p *Printer) printJSON(v any, options StructuredOptions) error { if options.OverrideJSONPayloadShorthand != nil { shorthandPayloads = *options.OverrideJSONPayloadShorthand } - if b, err := p.jsonVal(v, p.JSONIndent, shorthandPayloads); err != nil { + if b, err := p.jsonVal(v, p.JSONIndent, shorthandPayloads, options.EmitDefaultValues); err != nil { return err } else if _, err := p.Output.Write(b); err != nil { return err @@ -263,10 +266,10 @@ func (p *Printer) printJSON(v any, options StructuredOptions) error { return nil } -func (p *Printer) jsonVal(v any, indent string, shorthandPayloads bool) ([]byte, error) { +func (p *Printer) jsonVal(v any, indent string, shorthandPayloads, emitDefaultValues bool) ([]byte, error) { // Use proto JSON if a proto message if protoMessage, ok := v.(proto.Message); ok { - opts := temporalproto.CustomJSONMarshalOptions{Indent: indent} + opts := temporalproto.CustomJSONMarshalOptions{Indent: indent, EmitDefaultValues: emitDefaultValues} if shorthandPayloads { opts.Metadata = map[string]any{common.EnablePayloadShorthandMetadataKey: true} } @@ -443,7 +446,7 @@ func (p *Printer) applyConverters(v any) (string, bool) { return "", false } -func (p *Printer) textVal(v any) string { +func (p *Printer) textVal(v any, emitDefaultValues bool) string { // Check converters first if ifv, ok := p.applyConverters(v); ok { return ifv @@ -460,7 +463,7 @@ func (p *Printer) textVal(v any) string { } return p.FormatTime(ref.Interface().(time.Time)) } else if (ref.Kind() == reflect.Struct && ref.CanInterface()) || ref.Type().Implements(jsonMarshalerType) { - b, err := p.jsonVal(v, "", true) + b, err := p.jsonVal(v, "", true, emitDefaultValues) if err != nil { return fmt.Sprintf("", err) } @@ -477,7 +480,7 @@ func (p *Printer) textVal(v any) string { if i > 0 { sb.WriteString(", ") } - sb.WriteString(p.textVal(ref.Index(i).Interface())) + sb.WriteString(p.textVal(ref.Index(i).Interface(), emitDefaultValues)) } sb.WriteString("]") return sb.String() @@ -489,7 +492,11 @@ func (p *Printer) textVal(v any) string { return fmt.Sprintf("%v", v) } -func (p *Printer) tableData(predefinedCols []*col, v any) (cols []*col, rows []map[string]colVal, err error) { +func (p *Printer) tableData( + predefinedCols []*col, + v any, + emitDefaultValues bool, +) (cols []*col, rows []map[string]colVal, err error) { singleItemType := reflect.TypeOf(v) if singleItemType.Kind() == reflect.Slice { singleItemType = singleItemType.Elem() @@ -520,7 +527,7 @@ func (p *Printer) tableData(predefinedCols []*col, v any) (cols []*col, rows []m row := make(map[string]colVal, len(cols)) for _, col := range cols { colVal := colVal{val: colValGetter(col, itemVal)} - colVal.text = p.textVal(colVal.val) + colVal.text = p.textVal(colVal.val, emitDefaultValues) row[col.name] = colVal } rows[i] = row @@ -528,7 +535,7 @@ func (p *Printer) tableData(predefinedCols []*col, v any) (cols []*col, rows []m return } -func (p *Printer) tableRowData(cols []*col, v any) (map[string]colVal, error) { +func (p *Printer) tableRowData(cols []*col, v any, emitDefaultValues bool) (map[string]colVal, error) { colValGetter, err := colValGetterForType(reflect.TypeOf(v)) if err != nil { return nil, err @@ -537,7 +544,7 @@ func (p *Printer) tableRowData(cols []*col, v any) (map[string]colVal, error) { itemVal := reflect.ValueOf(v) for _, col := range cols { colVal := colVal{val: colValGetter(col, itemVal)} - colVal.text = p.textVal(colVal.val) + colVal.text = p.textVal(colVal.val, emitDefaultValues) row[col.name] = colVal } return row, nil @@ -668,11 +675,11 @@ func (p *Printer) PrintDiff(a, b any, options DiffOptions) error { // Each value is marshaled individually so proto messages are handled correctly, // then embedded as RawMessage to preserve field order in the outer object. if p.JSON { - beforeJSON, err := p.jsonVal(a, "", p.JSONPayloadShorthand) + beforeJSON, err := p.jsonVal(a, "", p.JSONPayloadShorthand, false) if err != nil { return fmt.Errorf("unable to convert before value for diff: %w", err) } - afterJSON, err := p.jsonVal(b, "", p.JSONPayloadShorthand) + afterJSON, err := p.jsonVal(b, "", p.JSONPayloadShorthand, false) if err != nil { return fmt.Errorf("unable to convert after value for diff: %w", err) } @@ -683,11 +690,11 @@ func (p *Printer) PrintDiff(a, b any, options DiffOptions) error { } var atext, btext []byte - atext, err := p.jsonVal(a, " ", true) + atext, err := p.jsonVal(a, " ", true, false) if err != nil { return fmt.Errorf("unable to convert a to text for diff: %w", err) } - btext, err = p.jsonVal(b, " ", true) + btext, err = p.jsonVal(b, " ", true, false) if err != nil { return fmt.Errorf("unable to convert b to text for diff: %w", err) } @@ -721,11 +728,14 @@ type PrintResourceOptions struct { Fields []string // SpecFields is a list of fields to print from the "Spec" sub-object, if empty all fields are printed. This is ignored for JSON output. SpecFields []string + // EmitDefaultValues prints fields holding their default value (e.g. 0, false, "") instead of omitting them. + // Unset pointer fields (proto messages and presence-sensing scalars) remain omitted in both output modes. + EmitDefaultValues bool } func (p *Printer) PrintResponseWithAsyncOperation(resource any, options PrintResourceOptions) error { if p.JSON { - return p.PrintStructured(resource, StructuredOptions{}) + return p.PrintStructured(resource, StructuredOptions{EmitDefaultValues: options.EmitDefaultValues}) } resourceVal := reflect.ValueOf(resource) if resourceVal.Kind() == reflect.Pointer { @@ -736,11 +746,17 @@ func (p *Printer) PrintResponseWithAsyncOperation(resource any, options PrintRes } // print all top-level fields except "Spec" - cols, row := p.parseFields(resourceVal, options.Fields, []string{"AsyncOperation"}, 1) + cols, row := p.parseFields(resourceVal, options.Fields, []string{"AsyncOperation"}, 1, options.EmitDefaultValues) p.printCard(cols, row) // now print "Spec" fields if present - specCols, specRow := p.parseFields(resourceVal.FieldByName("AsyncOperation"), options.SpecFields, nil, 2) + specCols, specRow := p.parseFields( + resourceVal.FieldByName("AsyncOperation"), + options.SpecFields, + nil, + 2, + options.EmitDefaultValues, + ) if len(specCols) > 0 { p.writeStr(NonJSONIndent) p.writeStr("AsyncOperation:\n") @@ -752,7 +768,7 @@ func (p *Printer) PrintResponseWithAsyncOperation(resource any, options PrintRes func (p *Printer) PrintResource(resource any, options PrintResourceOptions) error { // For JSON we can just print the whole thing, ignoring the field options if p.JSON { - return p.PrintStructured(resource, StructuredOptions{}) + return p.PrintStructured(resource, StructuredOptions{EmitDefaultValues: options.EmitDefaultValues}) } // For text we want to print "metadata" fields at the top level, and then "spec" fields below that with an indent. We can achieve this by printing two separate cards. @@ -765,11 +781,17 @@ func (p *Printer) PrintResource(resource any, options PrintResourceOptions) erro } // print all top-level fields except "Spec" - cols, row := p.parseFields(resourceVal, options.Fields, []string{"Spec"}, 1) + cols, row := p.parseFields(resourceVal, options.Fields, []string{"Spec"}, 1, options.EmitDefaultValues) p.printCard(cols, row) // now print "Spec" fields if present - specCols, specRow := p.parseFields(resourceVal.FieldByName("Spec"), options.SpecFields, nil, 2) + specCols, specRow := p.parseFields( + resourceVal.FieldByName("Spec"), + options.SpecFields, + nil, + 2, + options.EmitDefaultValues, + ) if len(specCols) > 0 { p.writeStr(NonJSONIndent) p.writeStr("Spec:\n") @@ -783,6 +805,7 @@ func (p *Printer) parseFields( allowList []string, excludeList []string, indent int, + emitDefaultValues bool, ) (cols []*col, row map[string]colVal) { if !v.IsValid() { return @@ -806,11 +829,18 @@ func (p *Printer) parseFields( if slices.Contains(excludeList, field.Name) { continue } - if isZero(v.Field(i).Interface()) { + if emitDefaultValues { + if v.Field(i).Kind() == reflect.Pointer && v.Field(i).IsNil() { + continue + } + } else if isZero(v.Field(i).Interface()) { continue } cols = append(cols, &col{name: field.Name, indentAmount: indent}) - row[field.Name] = colVal{val: v.Field(i).Interface(), text: p.textVal(v.Field(i).Interface())} + row[field.Name] = colVal{ + val: v.Field(i).Interface(), + text: p.textVal(v.Field(i).Interface(), emitDefaultValues), + } } return } @@ -863,7 +893,7 @@ func (p *Printer) PrintResourceList( tableOptions TableOptions, ) error { if p.JSON { - return p.PrintStructured(resourceListResp, StructuredOptions{}) + return p.PrintStructured(resourceListResp, StructuredOptions{EmitDefaultValues: options.EmitDefaultValues}) } v := reflect.ValueOf(resourceListResp) @@ -918,8 +948,14 @@ func (p *Printer) PrintResourceList( if resourceVal.Kind() == reflect.Pointer { resourceVal = resourceVal.Elem() } - _, row := p.parseFields(resourceVal, options.Fields, []string{"Spec"}, 1) - _, specRow := p.parseFields(resourceVal.FieldByName("Spec"), options.SpecFields, nil, 1) + _, row := p.parseFields(resourceVal, options.Fields, []string{"Spec"}, 1, options.EmitDefaultValues) + _, specRow := p.parseFields( + resourceVal.FieldByName("Spec"), + options.SpecFields, + nil, + 1, + options.EmitDefaultValues, + ) maps.Copy(row, specRow) rows = append(rows, row) } diff --git a/temporalcloudcli/internal/printer/printer_test.go b/temporalcloudcli/internal/printer/printer_test.go index d99412d..f7b898e 100644 --- a/temporalcloudcli/internal/printer/printer_test.go +++ b/temporalcloudcli/internal/printer/printer_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + namespacev1 "go.temporal.io/cloud-sdk/api/namespace/v1" "go.temporal.io/cloud-sdk/api/operation/v1" "go.temporal.io/cloud-sdk/api/resource/v1" ) @@ -828,6 +829,47 @@ func TestPrinter_OverrideJSONPayloadShorthand(t *testing.T) { require.Contains(t, buf.String(), "key") } +func TestPrinter_EmitDefaultValues(t *testing.T) { + // A proto with a zero scalar (HasLegacyLimits), a nested message holding only zero scalars (Stats) and an + // unset message field (CurrentCapacity). + info := &namespacev1.NamespaceCapacityInfo{ + Namespace: "my-ns", + Stats: &namespacev1.NamespaceCapacityInfo_Stats{ + Aps: &namespacev1.NamespaceCapacityInfo_Stats_Summary{}, + }, + } + + t.Run("JSON", func(t *testing.T) { + var buf bytes.Buffer + p := Printer{Output: &buf, JSON: true} + require.NoError(t, p.PrintResource(info, PrintResourceOptions{})) + require.NotContains(t, buf.String(), "hasLegacyLimits") + require.NotContains(t, buf.String(), "p99") + + buf.Reset() + require.NoError(t, p.PrintResource(info, PrintResourceOptions{EmitDefaultValues: true})) + require.Contains(t, buf.String(), `"hasLegacyLimits":false`) + require.Contains(t, buf.String(), `"p99":0`) + // Unset message fields stay omitted even when emitting defaults + require.NotContains(t, buf.String(), "currentCapacity") + }) + + t.Run("Text", func(t *testing.T) { + var buf bytes.Buffer + p := Printer{Output: &buf} + require.NoError(t, p.PrintResource(info, PrintResourceOptions{})) + require.NotContains(t, buf.String(), "HasLegacyLimits") + require.NotContains(t, buf.String(), "p99") + + buf.Reset() + require.NoError(t, p.PrintResource(info, PrintResourceOptions{EmitDefaultValues: true})) + require.Contains(t, buf.String(), "HasLegacyLimits") + require.Contains(t, buf.String(), "false") + require.Contains(t, buf.String(), `"p99":0`) + require.NotContains(t, buf.String(), "CurrentCapacity") + }) +} + func TestConverters_ResourceState(t *testing.T) { var buf bytes.Buffer p := Printer{Output: &buf, JSON: true, JSONPayloadShorthand: true} From fd1f32706241b2717e96bab2f1a11a784a7a9c91 Mon Sep 17 00:00:00 2001 From: Kohei Hisakuni Date: Tue, 11 Aug 2026 14:22:52 -0700 Subject: [PATCH 2/3] Cleanup comments --- temporalcloudcli/commands.testing.go | 20 +++++++++----------- temporalcloudcli/internal/printer/printer.go | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/temporalcloudcli/commands.testing.go b/temporalcloudcli/commands.testing.go index 97a1b4c..4bca38f 100644 --- a/temporalcloudcli/commands.testing.go +++ b/temporalcloudcli/commands.testing.go @@ -54,17 +54,15 @@ type ( } TestCommandOptions struct { - Args []string - CloudClientExpectations func(cloudClient *cloudmock.MockCloudServiceClient) - AsyncPollerOptions TestAsyncPollerOptions - PromptOptions TestPromptOptions - EditorOptions TestEditorOptions - JSONOutput bool - ExpectedError string - ExpectedOutput string - ExpectedOutputJson any - // ExpectedOutputJsonEmitDefaults marshals ExpectedOutputJson with default values emitted. Set this for - // commands that print with printer.PrintResourceOptions{EmitDefaultValues: true}. + Args []string + CloudClientExpectations func(cloudClient *cloudmock.MockCloudServiceClient) + AsyncPollerOptions TestAsyncPollerOptions + PromptOptions TestPromptOptions + EditorOptions TestEditorOptions + JSONOutput bool + ExpectedError string + ExpectedOutput string + ExpectedOutputJson any ExpectedOutputJsonEmitDefaults bool } ) diff --git a/temporalcloudcli/internal/printer/printer.go b/temporalcloudcli/internal/printer/printer.go index f024689..54e00ca 100644 --- a/temporalcloudcli/internal/printer/printer.go +++ b/temporalcloudcli/internal/printer/printer.go @@ -126,7 +126,7 @@ type StructuredOptions struct { OverrideJSONPayloadShorthand *bool // Indent this many additional times when printing non-JSON NonJSONExtraIndent int - // If true, fields holding their default value (e.g. 0, false, "") are printed instead of omitted. + // EmitDefaultValues when set to true, fields holding their default value (e.g. 0, false, "") are printed instead of omitted. // Unset pointer fields remain omitted. EmitDefaultValues bool } From 3251c8e461b3d9fd998b5786a23a161816f37fb3 Mon Sep 17 00:00:00 2001 From: Kohei Hisakuni Date: Tue, 11 Aug 2026 17:20:28 -0700 Subject: [PATCH 3/3] Use new version of api --- go.mod | 5 +---- go.sum | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 413235e..ecd36b2 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 github.com/temporalio/cli/cliext v0.0.0-20260602200703-8bb57b77ad55 - go.temporal.io/api v1.62.13 + go.temporal.io/api v1.63.6-0.20260811224032-89570b10e9e2 go.temporal.io/cloud-sdk v0.16.0 go.temporal.io/sdk v1.44.1 go.temporal.io/sdk/contrib/envconfig v1.0.0 @@ -22,9 +22,6 @@ require ( google.golang.org/grpc v1.81.1 ) -// TODO: Remove. -replace go.temporal.io/api => ../api-go - require ( github.com/BurntSushi/toml v1.6.0 // indirect github.com/brunoga/deep v1.3.1 // indirect diff --git a/go.sum b/go.sum index 855e90e..50f7abc 100644 --- a/go.sum +++ b/go.sum @@ -152,6 +152,8 @@ go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfC go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.temporal.io/api v1.63.6-0.20260811224032-89570b10e9e2 h1:VeNTxlOHETym01zX6kSXHIVw4nc2RrX/KVgepQ/dr/8= +go.temporal.io/api v1.63.6-0.20260811224032-89570b10e9e2/go.mod h1:SrlW2JMwVlDP4nRWSNznUFqnSHd+YeMDS1BkYo63HCQ= go.temporal.io/cloud-sdk v0.16.0 h1:8EgFMyc3M1XV2+OIOOuKeyhUI8Kjy7YCCbmGYlRw1No= go.temporal.io/cloud-sdk v0.16.0/go.mod h1:W2O9t9tvo3Q/LhGgYdj8JijWbN5C84os+cz/BadIHYI= go.temporal.io/sdk v1.44.1 h1:Mt2OZLZpqkzDIdg9YyQzO0Rb/HqCDnnqHlIAGAJ5gqM=