From 795546115e03f014f2f7592e480a4d07d3d41877 Mon Sep 17 00:00:00 2001 From: Travis Gilbert <1travisgilbert@gmail.com> Date: Sun, 9 Aug 2026 18:38:09 -0400 Subject: [PATCH] fix(console): use anonymous GraphQL for rustyWebSearch Named ConsoleRustyWebSearch operations return HTTP 400 with an empty body on some commonplace-api builds, which made indexer/web research look unreachable. Also pass method/path/body into credentialHeaders so signed-request custody can sign the GraphQL POST. --- apps/console/src/lib/server/web-research.ts | 34 +++++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/apps/console/src/lib/server/web-research.ts b/apps/console/src/lib/server/web-research.ts index 7ddfc0ca..d96281b9 100644 --- a/apps/console/src/lib/server/web-research.ts +++ b/apps/console/src/lib/server/web-research.ts @@ -41,8 +41,10 @@ export type LoadWebResearchOptions = { readonly emptyOk?: boolean; }; +// Anonymous operation: some commonplace-api builds return HTTP 400 with an empty +// body for named operations (e.g. ConsoleRustyWebSearch) on this field. const RUSTY_WEB_SEARCH_QUERY = ` - query ConsoleRustyWebSearch($query: String!, $limit: Int, $providers: [String!]) { + query ($query: String!, $limit: Int, $providers: [String!]) { rustyWebSearch(query: $query, limit: $limit, providers: $providers) } `; @@ -79,23 +81,35 @@ export async function loadWebResearch( } const timeout = startHarnessRequestTimeout(); + const graphqlPath = (() => { + try { + return new URL(endpoint).pathname || '/graphql'; + } catch { + return '/graphql'; + } + })(); + const body = JSON.stringify({ + query: RUSTY_WEB_SEARCH_QUERY, + variables: { + query, + limit, + providers: [...RUSTYWEB_LIVE_SEARCH_PROVIDERS], + }, + }); let upstream: Response; try { upstream = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', - ...credentialHeaders(credential.credential), + ...credentialHeaders(credential.credential, { + method: 'POST', + path: graphqlPath, + body, + }), ...principalTenantHeaders(principal), }, - body: JSON.stringify({ - query: RUSTY_WEB_SEARCH_QUERY, - variables: { - query, - limit, - providers: [...RUSTYWEB_LIVE_SEARCH_PROVIDERS], - }, - }), + body, cache: 'no-store', signal: AbortSignal.any([request.signal, timeout.signal]), });