From d5c43eed517d60a919ab2d7b4cd48d7c6df72ca9 Mon Sep 17 00:00:00 2001 From: deepfeature Date: Tue, 16 Jun 2026 11:12:10 +0800 Subject: [PATCH] feat(client): send User-Agent header on all API requests Add a `User-Agent: gmgn-cli/` header (version read from package.json) to both authExistRequest and authSignedRequest, so upstream can identify CLI traffic and gateways that reject empty/default UAs do not block requests. Co-Authored-By: Claude Opus 4.8 --- src/client/OpenApiClient.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/client/OpenApiClient.ts b/src/client/OpenApiClient.ts index 7075372..29c8ce8 100644 --- a/src/client/OpenApiClient.ts +++ b/src/client/OpenApiClient.ts @@ -6,11 +6,16 @@ * Signed (swap and order routes): X-APIKEY + timestamp + client_id + X-Signature (private key signature) */ +import { createRequire } from "node:module"; + import { buildAuthQuery, buildMessage, detectAlgorithm, sign } from "./signer.js"; const RATE_LIMIT_RETRY_BUFFER_MS = 1000; const DEFAULT_RATE_LIMIT_AUTO_RETRY_MAX_WAIT_MS = 5000; +const { version: CLI_VERSION } = createRequire(import.meta.url)("../../package.json") as { version: string }; +const USER_AGENT = `gmgn-cli/${CLI_VERSION}`; + interface PreparedRequest { method: string; subPath: string; @@ -530,6 +535,7 @@ export class OpenApiClient { const headers: Record = { "X-APIKEY": this.apiKey, "Content-Type": "application/json", + "User-Agent": USER_AGENT, }; const bodyStr = body !== null ? JSON.stringify(body) : null; return { @@ -565,6 +571,7 @@ export class OpenApiClient { "X-APIKEY": this.apiKey, "X-Signature": signature, "Content-Type": "application/json", + "User-Agent": USER_AGENT, }; return { method,