agent_patch
runs/2026-02-21__03-36-16__gpt-5-1-codex-mini/flux-pr-1169/flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/agent-logs/agent.patch
12557 bytes
diff --git a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_rule_field_selection_merging.go b/app/v2/pkg/astvalidation/operation_rule_field_selection_merging.go
index a5f80a3..22ae0fa 100644
--- a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_rule_field_selection_merging.go
+++ b/app/v2/pkg/astvalidation/operation_rule_field_selection_merging.go
@@ -97,7 +97,7 @@ func (f *fieldSelectionMergingVisitor) EnterField(ref int) {
definition, ok := f.definition.NodeFieldDefinitionByName(f.EnclosingTypeDefinition, fieldName)
if !ok {
enclosingTypeName := f.definition.NodeNameBytes(f.EnclosingTypeDefinition)
- f.StopWithExternalErr(operationreport.ErrFieldUndefinedOnType(fieldName, enclosingTypeName))
+ f.StopWithExternalErr(operationreport.ErrFieldUndefinedOnType(fieldName, enclosingTypeName, f.operation.Fields[ref].Position))
return
}
diff --git a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_rule_validate_field_selections.go b/app/v2/pkg/astvalidation/operation_rule_validate_field_selections.go
index 5e07ca7..95a29fd 100644
--- a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_rule_validate_field_selections.go
+++ b/app/v2/pkg/astvalidation/operation_rule_validate_field_selections.go
@@ -3,7 +3,6 @@ package astvalidation
import (
"bytes"
"fmt"
- "github.com/wundergraph/graphql-go-tools/v2/pkg/apollocompatibility"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
@@ -15,8 +14,7 @@ import (
func FieldSelections(options OperationValidatorOptions) Rule {
return func(walker *astvisitor.Walker) {
fieldDefined := fieldDefined{
- Walker: walker,
- apolloCompatibilityFlags: options.ApolloCompatibilityFlags,
+ Walker: walker,
}
walker.RegisterEnterDocumentVisitor(&fieldDefined)
walker.RegisterEnterFieldVisitor(&fieldDefined)
@@ -27,7 +25,6 @@ type fieldDefined struct {
*astvisitor.Walker
operation *ast.Document
definition *ast.Document
- apolloCompatibilityFlags apollocompatibility.Flags
}
func (f *fieldDefined) EnterDocument(operation, definition *ast.Document) {
@@ -41,7 +38,7 @@ func (f *fieldDefined) ValidateUnionField(ref int, enclosingTypeDefinition ast.N
}
fieldName := f.operation.FieldNameBytes(ref)
unionName := f.definition.NodeNameBytes(enclosingTypeDefinition)
- f.StopWithExternalErr(operationreport.ErrFieldSelectionOnUnion(fieldName, unionName))
+ f.StopWithExternalErr(operationreport.ErrFieldSelectionOnUnion(fieldName, unionName, f.operation.Fields[ref].Position))
}
func (f *fieldDefined) ValidateInterfaceOrObjectTypeField(ref int, enclosingTypeDefinition ast.Node) {
@@ -59,24 +56,20 @@ func (f *fieldDefined) ValidateInterfaceOrObjectTypeField(ref int, enclosingType
fieldDefinitionTypeKind := f.definition.FieldDefinitionTypeNode(i).Kind
switch {
case hasSelections && fieldDefinitionTypeKind == ast.NodeKindScalarTypeDefinition:
- f.StopWithExternalErr(operationreport.ErrFieldSelectionOnScalar(fieldName, definitionName))
+ f.StopWithExternalErr(operationreport.ErrFieldSelectionOnScalar(fieldName, definitionName, f.operation.Fields[ref].Position))
case !hasSelections && (fieldDefinitionTypeKind != ast.NodeKindScalarTypeDefinition && fieldDefinitionTypeKind != ast.NodeKindEnumTypeDefinition):
- f.StopWithExternalErr(operationreport.ErrMissingFieldSelectionOnNonScalar(fieldName, typeName))
+ f.StopWithExternalErr(operationreport.ErrMissingFieldSelectionOnNonScalar(fieldName, typeName, f.operation.Fields[ref].Position))
}
return
}
}
- if f.apolloCompatibilityFlags.ReplaceUndefinedOpFieldError {
- f.StopWithExternalErr(operationreport.ErrApolloCompatibleFieldUndefinedOnType(fieldName, typeName))
- return
- }
- f.StopWithExternalErr(operationreport.ErrFieldUndefinedOnType(fieldName, typeName))
+ f.StopWithExternalErr(operationreport.ErrFieldUndefinedOnType(fieldName, typeName, f.operation.Fields[ref].Position))
}
func (f *fieldDefined) ValidateScalarField(ref int, enclosingTypeDefinition ast.Node) {
fieldName := f.operation.FieldNameBytes(ref)
scalarTypeName := f.operation.NodeNameBytes(enclosingTypeDefinition)
- f.StopWithExternalErr(operationreport.ErrFieldSelectionOnScalar(fieldName, scalarTypeName))
+ f.StopWithExternalErr(operationreport.ErrFieldSelectionOnScalar(fieldName, scalarTypeName, f.operation.Fields[ref].Position))
}
func (f *fieldDefined) EnterField(ref int) {
diff --git a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_validation.go b/app/v2/pkg/astvalidation/operation_validation.go
index b33c80b..2aacb96 100644
--- a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_validation.go
+++ b/app/v2/pkg/astvalidation/operation_validation.go
@@ -2,9 +2,12 @@
package astvalidation
import (
+ "net/http"
+
"github.com/wundergraph/graphql-go-tools/v2/pkg/apollocompatibility"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
+ "github.com/wundergraph/graphql-go-tools/v2/pkg/errorcodes"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
@@ -27,7 +30,8 @@ func DefaultOperationValidator(options ...Option) *OperationValidator {
opt(&opts)
}
validator := OperationValidator{
- walker: astvisitor.NewWalker(48),
+ walker: astvisitor.NewWalker(48),
+ options: opts,
}
validator.RegisterRule(AllVariablesUsed())
@@ -54,7 +58,8 @@ func DefaultOperationValidator(options ...Option) *OperationValidator {
func NewOperationValidator(rules []Rule) *OperationValidator {
validator := OperationValidator{
- walker: astvisitor.NewWalker(48),
+ walker: astvisitor.NewWalker(48),
+ options: OperationValidatorOptions{},
}
for _, rule := range rules {
@@ -67,6 +72,7 @@ func NewOperationValidator(rules []Rule) *OperationValidator {
// OperationValidator orchestrates the validation process of Operations
type OperationValidator struct {
walker astvisitor.Walker
+ options OperationValidatorOptions
}
// RegisterRule registers a rule to the OperationValidator
@@ -84,6 +90,12 @@ func (o *OperationValidator) Validate(operation, definition *ast.Document, repor
o.walker.Walk(operation, definition, report)
if report.HasErrors() {
+ if o.options.ApolloCompatibilityFlags.ReplaceUndefinedOpFieldError {
+ for i := range report.ExternalErrors {
+ report.ExternalErrors[i].ExtensionCode = errorcodes.GraphQLValidationFailed
+ report.ExternalErrors[i].StatusCode = http.StatusBadRequest
+ }
+ }
return Invalid
}
return Valid
diff --git a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_validation_test.go b/app/v2/pkg/astvalidation/operation_validation_test.go
index 6885ceb..0a8e6d7 100644
--- a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/astvalidation/operation_validation_test.go
+++ b/app/v2/pkg/astvalidation/operation_validation_test.go
@@ -2,6 +2,7 @@ package astvalidation
import (
"fmt"
+ "net/http"
"testing"
"github.com/wundergraph/graphql-go-tools/v2/pkg/apollocompatibility"
@@ -4690,10 +4691,12 @@ func TestWithApolloCompatibilityFlags(t *testing.T) {
require.Len(t, report.ExternalErrors, 1)
expectedError := operationreport.ExternalError{
ExtensionCode: errorcodes.GraphQLValidationFailed,
- Message: `Cannot query "age" on type "Query".`,
+ Message: `Cannot query field "age" on type "Query".`,
}
assert.Equal(t, expectedError.ExtensionCode, report.ExternalErrors[0].ExtensionCode)
assert.Equal(t, expectedError.Message, report.ExternalErrors[0].Message)
+ assert.Equal(t, http.StatusBadRequest, report.ExternalErrors[0].StatusCode)
+ require.Len(t, report.ExternalErrors[0].Locations, 1)
})
t.Run("With propagated false flag", func(t *testing.T) {
operationValidator := DefaultOperationValidator(WithApolloCompatibilityFlags(
@@ -4707,7 +4710,7 @@ func TestWithApolloCompatibilityFlags(t *testing.T) {
assert.True(t, report.HasErrors())
require.Len(t, report.ExternalErrors, 1)
expectedError := operationreport.ExternalError{
- Message: `field: age not defined on type: Query`,
+ Message: `Cannot query field "age" on type "Query".`,
}
assert.Equal(t, expectedError.Message, report.ExternalErrors[0].Message)
assert.Equal(t, "", report.ExternalErrors[0].ExtensionCode)
@@ -4720,7 +4723,7 @@ func TestWithApolloCompatibilityFlags(t *testing.T) {
assert.True(t, report.HasErrors())
require.Len(t, report.ExternalErrors, 1)
expectedError := operationreport.ExternalError{
- Message: `field: age not defined on type: Query`,
+ Message: `Cannot query field "age" on type "Query".`,
}
assert.Equal(t, expectedError.Message, report.ExternalErrors[0].Message)
assert.Equal(t, "", report.ExternalErrors[0].ExtensionCode)
diff --git a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/operationreport/externalerror.go b/app/v2/pkg/operationreport/externalerror.go
index 250918e..e61ca91 100644
--- a/tmp/agent-patch-flux-pr-1169.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/operationreport/externalerror.go
+++ b/app/v2/pkg/operationreport/externalerror.go
@@ -3,9 +3,7 @@ package operationreport
import (
"fmt"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
- "github.com/wundergraph/graphql-go-tools/v2/pkg/errorcodes"
"github.com/wundergraph/graphql-go-tools/v2/pkg/lexer/position"
- "net/http"
)
const (
@@ -53,15 +51,9 @@ func ErrDocumentDoesntContainExecutableOperation() (err ExternalError) {
return
}
-func ErrFieldUndefinedOnType(fieldName, typeName ast.ByteSlice) (err ExternalError) {
- err.Message = fmt.Sprintf("field: %s not defined on type: %s", fieldName, typeName)
- return err
-}
-
-func ErrApolloCompatibleFieldUndefinedOnType(fieldName, typeName ast.ByteSlice) (err ExternalError) {
- err.Message = fmt.Sprintf(`Cannot query "%s" on type "%s".`, fieldName, typeName)
- err.ExtensionCode = errorcodes.GraphQLValidationFailed
- err.StatusCode = http.StatusBadRequest
+func ErrFieldUndefinedOnType(fieldName, typeName ast.ByteSlice, pos position.Position) (err ExternalError) {
+ err.Message = fmt.Sprintf(`Cannot query field "%s" on type "%s".`, fieldName, typeName)
+ err.Locations = LocationsFromPosition(pos)
return err
}
@@ -140,10 +132,8 @@ func ErrSubscriptionMustOnlyHaveOneRootSelection(subscriptionName ast.ByteSlice)
return err
}
-func ErrFieldSelectionOnUnion(fieldName, unionName ast.ByteSlice) (err ExternalError) {
-
- err.Message = fmt.Sprintf("cannot select field: %s on union: %s", fieldName, unionName)
- return err
+func ErrFieldSelectionOnUnion(fieldName, unionName ast.ByteSlice, pos position.Position) (err ExternalError) {
+ return ErrFieldUndefinedOnType(fieldName, unionName, pos)
}
func ErrFieldsConflict(objectName, leftType, rightType ast.ByteSlice) (err ExternalError) {
@@ -166,13 +156,15 @@ func ErrDifferingFieldsOnPotentiallySameType(objectName ast.ByteSlice) (err Exte
return err
}
-func ErrFieldSelectionOnScalar(fieldName, scalarTypeName ast.ByteSlice) (err ExternalError) {
- err.Message = fmt.Sprintf("cannot select field: %s on scalar %s", fieldName, scalarTypeName)
+func ErrFieldSelectionOnScalar(fieldName, scalarTypeName ast.ByteSlice, pos position.Position) (err ExternalError) {
+ err.Message = fmt.Sprintf(`Field "%s" must not have a selection since type "%s" has no subfields.`, fieldName, scalarTypeName)
+ err.Locations = LocationsFromPosition(pos)
return err
}
-func ErrMissingFieldSelectionOnNonScalar(fieldName, enclosingTypeName ast.ByteSlice) (err ExternalError) {
- err.Message = fmt.Sprintf("non scalar field: %s on type: %s must have selections", fieldName, enclosingTypeName)
+func ErrMissingFieldSelectionOnNonScalar(fieldName, enclosingTypeName ast.ByteSlice, pos position.Position) (err ExternalError) {
+ err.Message = fmt.Sprintf(`Field "%s" of type "%s" must have a selection of subfields. Did you mean "%s { ... }"?`, fieldName, enclosingTypeName, fieldName)
+ err.Locations = LocationsFromPosition(pos)
return err
}