agent_patch
runs/2026-02-21__03-36-16__gpt-5-1-codex-mini/flux-pr-870/flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/agent-logs/agent.patch
12099 bytes
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/execution/engine/config_factory_federation.go b/app/execution/engine/config_factory_federation.go
index 3cb4562..7bf39f5 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/execution/engine/config_factory_federation.go
+++ b/app/execution/engine/config_factory_federation.go
@@ -191,7 +191,7 @@ func (f *FederationEngineConfigFactory) createPlannerConfiguration(routerConfig
)
// attach field usage information to the plan
engineConfig := routerConfig.EngineConfig
- // outConfig.IncludeInfo = l.includeInfo
+ outConfig.IncludeInfo = true
outConfig.DefaultFlushIntervalMillis = engineConfig.DefaultFlushInterval
for _, configuration := range engineConfig.FieldConfigurations {
var args []plan.ArgumentConfiguration
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/execution/engine/testdata/complex_nesting_query_with_art.json b/app/execution/engine/testdata/complex_nesting_query_with_art.json
index 6447982..a2e46a8 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/execution/engine/testdata/complex_nesting_query_with_art.json
+++ b/app/execution/engine/testdata/complex_nesting_query_with_art.json
@@ -164,6 +164,7 @@
}
}
},
+ "data_source_id": "0",
"duration_since_start_nanoseconds": 1,
"duration_since_start_pretty": "1ns",
"duration_load_nanoseconds": 1,
@@ -302,6 +303,7 @@
}
}
},
+ "data_source_id": "1",
"duration_since_start_nanoseconds": 1,
"duration_since_start_pretty": "1ns",
"duration_load_nanoseconds": 1,
@@ -429,7 +431,6 @@
{
"__typename": "Question",
"upc": "top-1",
- "__typename": "Question",
"body": "How do I turn it on?"
}
]
@@ -440,7 +441,6 @@
{
"__typename": "Rating",
"upc": "top-2",
- "__typename": "Rating",
"body": "The best hat I have ever bought in my life."
},
{
@@ -488,6 +488,7 @@
}
}
},
+ "data_source_id": "2",
"duration_since_start_nanoseconds": 1,
"duration_since_start_pretty": "1ns",
"duration_load_nanoseconds": 1,
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/extensions_test.go b/app/v2/pkg/engine/resolve/extensions_test.go
index 6d16e3e..c0fca71 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/extensions_test.go
+++ b/app/v2/pkg/engine/resolve/extensions_test.go
@@ -120,7 +120,7 @@ func TestExtensions(t *testing.T) {
ctx.ctx = SetTraceStart(ctx.ctx, true)
return res, ctx,
- `{"errors":[{"message":"Unauthorized request to Subgraph 'users' at Path 'query', Reason: test."},{"message":"Failed to fetch from Subgraph 'reviews' at Path 'query.me'.","extensions":{"errors":[{"message":"Failed to render Fetch Input","path":["me"]}]}},{"message":"Failed to fetch from Subgraph 'products' at Path 'query.me.reviews.@.product'.","extensions":{"errors":[{"message":"Failed to render Fetch Input","path":["me","reviews","@","product"]}]}}],"data":{"me":null},"extensions":{"authorization":{"missingScopes":[["read:users"]]},"rateLimit":{"Policy":"policy","Allowed":0,"Used":0},"trace":{"version":"1","info":{"trace_start_time":"","trace_start_unix":0,"parse_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"normalize_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"validate_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"planner_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""}},"fetches":{"kind":"Sequence","children":[{"kind":"Single","fetch":{"kind":"Single","path":"query","trace":{"raw_input_data":{},"single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}},{"kind":"Single","fetch":{"kind":"Single","path":"query.me","trace":{"single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}},{"kind":"Single","fetch":{"kind":"Single","path":"query.me.reviews.@.product","trace":{"single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}}]}}}}`,
+ `{"errors":[{"message":"Unauthorized request to Subgraph 'users' at Path 'query', Reason: test."},{"message":"Failed to fetch from Subgraph 'reviews' at Path 'query.me'.","extensions":{"errors":[{"message":"Failed to render Fetch Input","path":["me"]}]}},{"message":"Failed to fetch from Subgraph 'products' at Path 'query.me.reviews.@.product'.","extensions":{"errors":[{"message":"Failed to render Fetch Input","path":["me","reviews","@","product"]}]}}],"data":{"me":null},"extensions":{"authorization":{"missingScopes":[["read:users"]]},"rateLimit":{"Policy":"policy","Allowed":0,"Used":0},"trace":{"version":"1","info":{"trace_start_time":"","trace_start_unix":0,"parse_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"normalize_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"validate_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""},"planner_stats":{"duration_nanoseconds":0,"duration_pretty":"","duration_since_start_nanoseconds":0,"duration_since_start_pretty":""}},"fetches":{"kind":"Sequence","children":[{"kind":"Single","fetch":{"kind":"Single","path":"query","trace":{"raw_input_data":{},"data_source_id":"users","single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}},{"kind":"Single","fetch":{"kind":"Single","path":"query.me","trace":{"data_source_id":"reviews","single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}},{"kind":"Single","fetch":{"kind":"Single","path":"query.me.reviews.@.product","trace":{"data_source_id":"products","single_flight_used":false,"single_flight_shared_response":false,"load_skipped":false}}}]}}}}`,
func(t *testing.T) {}
}))
}
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/fetch.go b/app/v2/pkg/engine/resolve/fetch.go
index 138664e..7a6a5f6 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/fetch.go
+++ b/app/v2/pkg/engine/resolve/fetch.go
@@ -280,6 +280,7 @@ type DataSourceLoadTrace struct {
Input json.RawMessage `json:"input,omitempty"`
Output json.RawMessage `json:"output,omitempty"`
LoadError string `json:"error,omitempty"`
+ DataSourceID string `json:"data_source_id,omitempty"`
DurationSinceStartNano int64 `json:"duration_since_start_nanoseconds,omitempty"`
DurationSinceStartPretty string `json:"duration_since_start_pretty,omitempty"`
DurationLoadNano int64 `json:"duration_load_nanoseconds,omitempty"`
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go b/app/v2/pkg/engine/resolve/loader.go
index 0957b3f..500ec97 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go
+++ b/app/v2/pkg/engine/resolve/loader.go
@@ -941,6 +941,7 @@ func (l *Loader) loadSingleFetch(ctx context.Context, fetch *SingleFetch, fetchI
l.itemsData(items, buf.input)
if l.ctx.TracingOptions.Enable {
fetch.Trace = &DataSourceLoadTrace{}
+ l.setTraceDataSourceID(fetch.Trace, fetch.Info)
if !l.ctx.TracingOptions.ExcludeRawInputData {
inputCopy := make([]byte, buf.input.Len())
copy(inputCopy, buf.input.Bytes())
@@ -1000,6 +1001,7 @@ func (l *Loader) loadEntityFetch(ctx context.Context, fetchItem *FetchItem, fetc
if l.ctx.TracingOptions.Enable {
fetch.Trace = &DataSourceLoadTrace{}
+ l.setTraceDataSourceID(fetch.Trace, fetch.Info)
if !l.ctx.TracingOptions.ExcludeRawInputData {
itemDataCopy := make([]byte, buf.itemData.Len())
copy(itemDataCopy, buf.itemData.Bytes())
@@ -1110,6 +1112,7 @@ func (l *Loader) loadBatchEntityFetch(ctx context.Context, fetchItem *FetchItem,
if l.ctx.TracingOptions.Enable {
fetch.Trace = &DataSourceLoadTrace{}
+ l.setTraceDataSourceID(fetch.Trace, fetch.Info)
if !l.ctx.TracingOptions.ExcludeRawInputData {
buf := &bytes.Buffer{}
l.itemsData(items, buf)
@@ -1290,6 +1293,13 @@ func (l *Loader) setTracingInput(fetchItem *FetchItem, input []byte, trace *Data
}
}
+func (l *Loader) setTraceDataSourceID(trace *DataSourceLoadTrace, info *FetchInfo) {
+ if trace == nil || info == nil {
+ return
+ }
+ trace.DataSourceID = info.DataSourceID
+}
+
func (l *Loader) loadByContext(ctx context.Context, source DataSource, input []byte, res *result) error {
if l.ctx.Files != nil {
return source.LoadWithFiles(ctx, input, l.ctx.Files, res.out)
diff --git a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/resolvable.go b/app/v2/pkg/engine/resolve/resolvable.go
index c4d0830..e6503f5 100644
--- a/tmp/agent-patch-flux-pr-870.1-of-1.2026-03-05__17-48-26__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/resolvable.go
+++ b/app/v2/pkg/engine/resolve/resolvable.go
@@ -274,6 +274,7 @@ func (r *Resolvable) printTraceExtension(ctx context.Context, fetchTree *FetchTr
if err != nil {
return err
}
+ content = compactTraceJSON(content)
r.printBytes(quote)
r.printBytes(literalTrace)
r.printBytes(quote)
@@ -282,6 +283,54 @@ func (r *Resolvable) printTraceExtension(ctx context.Context, fetchTree *FetchTr
return nil
}
+func compactTraceJSON(input []byte) []byte {
+ value, err := fastjson.ParseBytes(input)
+ if err != nil {
+ return input
+ }
+ var arena fastjson.Arena
+ deduped := deduplicateFastjsonValue(&arena, value)
+ return deduped.MarshalTo(nil)
+}
+
+func deduplicateFastjsonValue(arena *fastjson.Arena, value *fastjson.Value) *fastjson.Value {
+ if value == nil {
+ return value
+ }
+ switch value.Type() {
+ case fastjson.TypeObject:
+ obj, err := value.Object()
+ if err != nil {
+ return value
+ }
+ result := arena.NewObject()
+ seen := make(map[string]struct{})
+ obj.Visit(func(key []byte, v *fastjson.Value) {
+ keyStr := string(key)
+ if _, ok := seen[keyStr]; ok {
+ return
+ }
+ seen[keyStr] = struct{}{}
+ result.Set(keyStr, deduplicateFastjsonValue(arena, v))
+ })
+ return result
+ case fastjson.TypeArray:
+ arrVals, err := value.Array()
+ if err != nil {
+ return value
+ }
+ result := arena.NewArray()
+ idx := 0
+ for _, v := range arrVals {
+ result.SetArrayItem(idx, deduplicateFastjsonValue(arena, v))
+ idx++
+ }
+ return result
+ default:
+ return value
+ }
+}
+
func (r *Resolvable) hasExtensions() bool {
if r.ctx.authorizer != nil && r.ctx.authorizer.HasResponseExtensionData(r.ctx) {
return true