STET

agent_patch

runs/2026-02-28__13-38-10__gpt-5-1-codex-mini/flux-pr-1001/flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/agent-logs/agent.patch

9672 bytes

Back to adjudication
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go b/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
index 3d7adb6..582f6cc 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
+++ b/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
@@ -70,6 +70,8 @@ type responseContextKey struct{}
 
 type ResponseContext struct {
 	StatusCode int
+	Request    TraceHTTPRequest
+	Response   TraceHTTPResponse
 }
 
 func InjectResponseContext(ctx context.Context) (context.Context, *ResponseContext) {
@@ -77,12 +79,40 @@ func InjectResponseContext(ctx context.Context) (context.Context, *ResponseConte
 	return context.WithValue(ctx, responseContextKey{}, value), value
 }
 
-func setResponseStatusCode(ctx context.Context, statusCode int) {
+func responseContextFromContext(ctx context.Context) *ResponseContext {
 	if value, ok := ctx.Value(responseContextKey{}).(*ResponseContext); ok {
+		return value
+	}
+	return nil
+}
+
+func setResponseStatusCode(ctx context.Context, statusCode int) {
+	if value := responseContextFromContext(ctx); value != nil {
 		value.StatusCode = statusCode
 	}
 }
 
+func setResponseRequest(ctx context.Context, request *http.Request) {
+	if value := responseContextFromContext(ctx); value != nil {
+		value.Request = TraceHTTPRequest{
+			Method:  request.Method,
+			URL:     request.URL.String(),
+			Headers: redactHeaders(request.Header),
+		}
+	}
+}
+
+func setResponseData(ctx context.Context, response *http.Response, bodySize int) {
+	if value := responseContextFromContext(ctx); value != nil {
+		value.Response = TraceHTTPResponse{
+			StatusCode: response.StatusCode,
+			Status:     response.Status,
+			Headers:    redactHeaders(response.Header),
+			BodySize:   bodySize,
+		}
+	}
+}
+
 var headersToRedact = []string{
 	"authorization",
 	"www-authenticate",
@@ -185,6 +215,8 @@ func makeHTTPRequest(client *http.Client, ctx context.Context, url, method, head
 	request.Header.Set(AcceptEncodingHeader, EncodingGzip)
 	request.Header.Add(AcceptEncodingHeader, EncodingDeflate)
 
+	setResponseRequest(ctx, request)
+
 	response, err := client.Do(request)
 	if err != nil {
 		return err
@@ -204,14 +236,19 @@ func makeHTTPRequest(client *http.Client, ctx context.Context, url, method, head
 		} else {
 			out.Grow(1024 * 4)
 		}
-		_, err = out.ReadFrom(respReader)
-		return
+		n, err := out.ReadFrom(respReader)
+		if err != nil {
+			return err
+		}
+		setResponseData(ctx, response, int(n))
+		return nil
 	}
 
 	data, err := io.ReadAll(respReader)
 	if err != nil {
 		return err
 	}
+	setResponseData(ctx, response, len(data))
 	responseTrace := TraceHTTP{
 		Request: TraceHTTPRequest{
 			Method:  request.Method,
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go b/app/v2/pkg/engine/resolve/loader.go
index 18788ee..e1effaf 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go
+++ b/app/v2/pkg/engine/resolve/loader.go
@@ -36,8 +36,9 @@ const (
 type LoaderHooks interface {
 	// OnLoad is called before the fetch is executed
 	OnLoad(ctx context.Context, ds DataSourceInfo) context.Context
-	// OnFinished is called after the fetch has been executed and the response has been processed and merged
-	OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, err error)
+	// OnFinished is called after the fetch has been executed and the response has been processed and merged.
+	// The responseContext exposes the upstream HTTP request/response metadata when available.
+	OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, responseContext *httpclient.ResponseContext, err error)
 }
 
 func IsIntrospectionDataSource(dataSourceID string) bool {
@@ -118,7 +119,13 @@ func (l *Loader) resolveParallel(nodes []*FetchTreeNode) error {
 			for j := range results[i].nestedMergeItems {
 				err = l.mergeResult(nodes[i].Item, results[i].nestedMergeItems[j], itemsItems[i][j:j+1])
 				if l.ctx.LoaderHooks != nil && results[i].nestedMergeItems[j].loaderHookContext != nil {
-					l.ctx.LoaderHooks.OnFinished(results[i].nestedMergeItems[j].loaderHookContext, results[i].nestedMergeItems[j].statusCode, results[i].nestedMergeItems[j].ds, goerrors.Join(results[i].nestedMergeItems[j].err, l.ctx.subgraphErrors))
+					l.ctx.LoaderHooks.OnFinished(
+						results[i].nestedMergeItems[j].loaderHookContext,
+						results[i].nestedMergeItems[j].statusCode,
+						results[i].nestedMergeItems[j].ds,
+						results[i].nestedMergeItems[j].responseContext,
+						goerrors.Join(results[i].nestedMergeItems[j].err, l.ctx.subgraphErrors),
+					)
 				}
 				if err != nil {
 					return errors.WithStack(err)
@@ -127,7 +134,13 @@ func (l *Loader) resolveParallel(nodes []*FetchTreeNode) error {
 		} else {
 			err = l.mergeResult(nodes[i].Item, results[i], itemsItems[i])
 			if l.ctx.LoaderHooks != nil && results[i].loaderHookContext != nil {
-				l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
+				l.ctx.LoaderHooks.OnFinished(
+					results[i].loaderHookContext,
+					results[i].statusCode,
+					results[i].ds,
+					results[i].responseContext,
+					goerrors.Join(results[i].err, l.ctx.subgraphErrors),
+				)
 			}
 			if err != nil {
 				return errors.WithStack(err)
@@ -163,7 +176,13 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
 		}
 		err = l.mergeResult(item, res, items)
 		if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
-			l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+			l.ctx.LoaderHooks.OnFinished(
+				res.loaderHookContext,
+				res.statusCode,
+				res.ds,
+				res.responseContext,
+				goerrors.Join(res.err, l.ctx.subgraphErrors),
+			)
 		}
 		return err
 	case *BatchEntityFetch:
@@ -176,7 +195,13 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
 		}
 		err = l.mergeResult(item, res, items)
 		if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
-			l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+			l.ctx.LoaderHooks.OnFinished(
+				res.loaderHookContext,
+				res.statusCode,
+				res.ds,
+				res.responseContext,
+				goerrors.Join(res.err, l.ctx.subgraphErrors),
+			)
 		}
 		return err
 	case *EntityFetch:
@@ -189,7 +214,13 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
 		}
 		err = l.mergeResult(item, res, items)
 		if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
-			l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+			l.ctx.LoaderHooks.OnFinished(
+				res.loaderHookContext,
+				res.statusCode,
+				res.ds,
+				res.responseContext,
+				goerrors.Join(res.err, l.ctx.subgraphErrors),
+			)
 		}
 		return err
 	case *ParallelListItemFetch:
@@ -222,7 +253,13 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
 		for i := range results {
 			err = l.mergeResult(item, results[i], items[i:i+1])
 			if l.ctx.LoaderHooks != nil && results[i].loaderHookContext != nil {
-				l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
+				l.ctx.LoaderHooks.OnFinished(
+					results[i].loaderHookContext,
+					results[i].statusCode,
+					results[i].ds,
+					results[i].responseContext,
+					goerrors.Join(results[i].err, l.ctx.subgraphErrors),
+				)
 			}
 			if err != nil {
 				return errors.WithStack(err)
@@ -539,9 +576,10 @@ type result struct {
 	fetchSkipped     bool
 	nestedMergeItems []*result
 
-	statusCode int
-	err        error
-	ds         DataSourceInfo
+	statusCode      int
+	responseContext *httpclient.ResponseContext
+	err             error
+	ds              DataSourceInfo
 
 	authorizationRejected        bool
 	authorizationRejectedReasons []string
@@ -1517,6 +1555,7 @@ func (l *Loader) executeSourceLoad(ctx context.Context, fetchItem *FetchItem, so
 	}
 	var responseContext *httpclient.ResponseContext
 	ctx, responseContext = httpclient.InjectResponseContext(ctx)
+	res.responseContext = responseContext
 
 	if l.ctx.LoaderHooks != nil {
 		res.loaderHookContext = l.ctx.LoaderHooks.OnLoad(ctx, res.ds)
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader_hooks_test.go b/app/v2/pkg/engine/resolve/loader_hooks_test.go
index d77c614..4657c56 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader_hooks_test.go
+++ b/app/v2/pkg/engine/resolve/loader_hooks_test.go
@@ -11,6 +11,7 @@ import (
 	"github.com/golang/mock/gomock"
 	"github.com/stretchr/testify/assert"
 	"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
+	"github.com/wundergraph/graphql-go-tools/v2/pkg/engine/datasource/httpclient"
 )
 
 type TestLoaderHooks struct {
@@ -35,7 +36,7 @@ func (f *TestLoaderHooks) OnLoad(ctx context.Context, ds DataSourceInfo) context
 	return ctx
 }
 
-func (f *TestLoaderHooks) OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, err error) {
+func (f *TestLoaderHooks) OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, _ *httpclient.ResponseContext, err error) {
 	f.postFetchCalls.Add(1)
 
 	f.mu.Lock()