agent_patch
runs/2026-02-28__13-38-10__gpt-5-4/flux-pr-1128/flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/agent-logs/agent.patch
5330 bytes
diff --git a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/configuration_visitor.go b/app/v2/pkg/engine/plan/configuration_visitor.go
index e4eedb8..56f8841 100644
--- a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/configuration_visitor.go
+++ b/app/v2/pkg/engine/plan/configuration_visitor.go
@@ -400,6 +400,11 @@ func (c *configurationVisitor) EnterField(fieldRef int) {
if root.Kind != ast.NodeKindOperationDefinition {
return
}
+
+ if c.isStaticRootOperationTypeNameField(typeName, fieldName) {
+ return
+ }
+
isSubscription := c.isSubscription(root.Ref, currentPath)
suggestions := c.nodeSuggestions.SuggestionsForPath(typeName, fieldName, currentPath)
@@ -429,6 +434,16 @@ func (c *configurationVisitor) EnterField(fieldRef int) {
}
}
+func (c *configurationVisitor) isStaticRootOperationTypeNameField(typeName, fieldName string) bool {
+ return fieldName == typeNameField && c.isRootOperationType(typeName)
+}
+
+func (c *configurationVisitor) isRootOperationType(typeName string) bool {
+ return typeName == c.definition.Index.QueryTypeName.String() ||
+ typeName == c.definition.Index.MutationTypeName.String() ||
+ typeName == c.definition.Index.SubscriptionTypeName.String()
+}
+
func (c *configurationVisitor) handlePlanningField(fieldRef int, typeName, fieldName, currentPath, parentPath, precedingParentPath string, isSubscription bool, suggestion *NodeSuggestion, ds DataSource, shareable bool) {
plannedOnPlannerIds := c.fieldsPlannedOn[fieldRef]
diff --git a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/planner_test.go b/app/v2/pkg/engine/plan/planner_test.go
index e9e1f88..138aa50 100644
--- a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/planner_test.go
+++ b/app/v2/pkg/engine/plan/planner_test.go
@@ -174,6 +174,58 @@ func TestPlanner_Plan(t *testing.T) {
DataSources: []DataSource{testDefinitionDSConfiguration},
}))
+ t.Run("Root operation __typename is resolved statically", test(`
+ schema {
+ query: RootQuery
+ }
+
+ type RootQuery {
+ hero: String
+ }
+ `, `
+ query RootTypename {
+ aliased: __typename
+ }
+ `, "RootTypename", &SynchronousResponsePlan{
+ Response: &resolve.GraphQLResponse{
+ Data: &resolve.Object{
+ Nullable: false,
+ Fields: []*resolve.Field{
+ {
+ Name: []byte("aliased"),
+ Value: &resolve.StaticString{
+ Path: []string{"aliased"},
+ Value: "RenamedRootQuery",
+ },
+ },
+ },
+ },
+ },
+ }, Configuration{
+ DisableResolveFieldPositions: true,
+ DisableIncludeInfo: true,
+ Types: TypeConfigurations{
+ {
+ TypeName: "RootQuery",
+ RenameTo: "RenamedRootQuery",
+ },
+ },
+ DataSources: []DataSource{
+ dsb().
+ Schema(`
+ schema {
+ query: RootQuery
+ }
+
+ type RootQuery {
+ hero: String
+ }
+ `).
+ RootNode("RootQuery", "hero").
+ DS(),
+ },
+ }))
+
t.Run("Merging duplicate fields in response should not happen", func(t *testing.T) {
t.Run("Interface response type with type fragments and shared field", test(testDefinition, `
query Hero {
diff --git a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/visitor.go b/app/v2/pkg/engine/plan/visitor.go
index 261d475..3892c9b 100644
--- a/tmp/agent-patch-flux-pr-1128.1-of-1.2026-02-28__13-38-10__gpt-5-4/app/v2/pkg/engine/plan/visitor.go
+++ b/app/v2/pkg/engine/plan/visitor.go
@@ -336,12 +336,19 @@ func (v *Visitor) EnterField(ref int) {
}
if bytes.Equal(fieldName, literal.TYPENAME) {
- str := &resolve.String{
- Nullable: false,
- Path: []string{v.Operation.FieldAliasOrNameString(ref)},
- IsTypeName: true,
+ if v.isStaticRootOperationTypeNameField(ref) {
+ v.currentField.Value = &resolve.StaticString{
+ Path: []string{v.Operation.FieldAliasOrNameString(ref)},
+ Value: v.rootOperationTypeName(),
+ }
+ } else {
+ str := &resolve.String{
+ Nullable: false,
+ Path: []string{v.Operation.FieldAliasOrNameString(ref)},
+ IsTypeName: true,
+ }
+ v.currentField.Value = str
}
- v.currentField.Value = str
} else {
path := v.resolveFieldPath(ref)
v.currentField.Value = v.resolveFieldValue(ref, fieldDefinitionTypeRef, true, path)
@@ -353,6 +360,21 @@ func (v *Visitor) EnterField(ref int) {
v.mapFieldConfig(ref)
}
+func (v *Visitor) isStaticRootOperationTypeNameField(ref int) bool {
+ return bytes.Equal(v.Operation.FieldNameBytes(ref), literal.TYPENAME) &&
+ v.isRootOperationType(v.Walker.EnclosingTypeDefinition.NameString(v.Definition))
+}
+
+func (v *Visitor) isRootOperationType(typeName string) bool {
+ return typeName == v.Definition.Index.QueryTypeName.String() ||
+ typeName == v.Definition.Index.MutationTypeName.String() ||
+ typeName == v.Definition.Index.SubscriptionTypeName.String()
+}
+
+func (v *Visitor) rootOperationTypeName() string {
+ return v.Config.Types.RenameTypeNameOnMatchStr(v.Walker.EnclosingTypeDefinition.NameString(v.Definition))
+}
+
func (v *Visitor) mapFieldConfig(ref int) {
typeName := v.Walker.EnclosingTypeDefinition.NameString(v.Definition)
fieldNameStr := v.Operation.FieldNameString(ref)