From 25791290287161e6102903e87b9931fea71ab74d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:24:40 +0000 Subject: [PATCH 1/3] Initial plan From 68ce376fa518e47fb1e9d6b3e0895dd877ca4e92 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:31:52 +0000 Subject: [PATCH 2/3] refactor: use JSON as single source of truth for provider env constants --- containers/api-proxy/Dockerfile | 2 +- .../api-proxy/provider-env-constants.js | 45 ++--------------- .../api-proxy/provider-env-constants.json | 27 ++++++++++ src/api-proxy-env-constants-sync.test.ts | 2 +- src/api-proxy-env-constants.ts | 50 ++++++++----------- 5 files changed, 52 insertions(+), 74 deletions(-) create mode 100644 containers/api-proxy/provider-env-constants.json diff --git a/containers/api-proxy/Dockerfile b/containers/api-proxy/Dockerfile index 53a3fbba7..521446842 100644 --- a/containers/api-proxy/Dockerfile +++ b/containers/api-proxy/Dockerfile @@ -31,7 +31,7 @@ COPY server.js logging.js metrics.js rate-limiter.js rate-limiter-window.js \ upstream-log.js upstream-retry.js upstream-token.js \ anthropic-cache.js otel.js otel-exporters.js otel-serialization.js \ token-budget-log.js blocked-request-diagnostics.js \ - provider-env-constants.js provider-names.js \ + provider-env-constants.js provider-env-constants.json provider-names.js \ model-api-mapping.js model-api-mapping.json ./ COPY guards/ ./guards/ COPY providers/ ./providers/ diff --git a/containers/api-proxy/provider-env-constants.js b/containers/api-proxy/provider-env-constants.js index d22430e87..25632b3b0 100644 --- a/containers/api-proxy/provider-env-constants.js +++ b/containers/api-proxy/provider-env-constants.js @@ -3,46 +3,7 @@ /** * Environment variable name constants for the API proxy provider adapters. * - * The TypeScript equivalent lives in src/api-proxy-env-constants.ts. - * Keep both files in sync; src/api-proxy-env-constants-sync.test.ts enforces parity. + * Single source of truth: provider-env-constants.json + * The TypeScript host re-exports from the same JSON via src/api-proxy-env-constants.ts. */ - -/** Environment variable names for the OpenAI provider adapter. */ -const OPENAI_ENV = /** @type {const} */ ({ - KEY: 'OPENAI_API_KEY', - TARGET: 'OPENAI_API_TARGET', - BASE_PATH: 'OPENAI_API_BASE_PATH', - AUTH_HEADER: 'AWF_OPENAI_AUTH_HEADER', -}); - -/** Environment variable names for the Anthropic provider adapter. */ -const ANTHROPIC_ENV = /** @type {const} */ ({ - KEY: 'ANTHROPIC_API_KEY', - TARGET: 'ANTHROPIC_API_TARGET', - BASE_PATH: 'ANTHROPIC_API_BASE_PATH', - AUTH_HEADER: 'AWF_ANTHROPIC_AUTH_HEADER', -}); - -/** Environment variable names for the Gemini provider adapter. */ -const GEMINI_ENV = /** @type {const} */ ({ - KEY: 'GEMINI_API_KEY', - TARGET: 'GEMINI_API_TARGET', - BASE_PATH: 'GEMINI_API_BASE_PATH', -}); - -/** Environment variable names for the Copilot provider adapter. */ -const COPILOT_ENV = /** @type {const} */ ({ - GITHUB_TOKEN: 'COPILOT_GITHUB_TOKEN', - PROVIDER_API_KEY: 'COPILOT_PROVIDER_API_KEY', - PROVIDER_TYPE: 'COPILOT_PROVIDER_TYPE', - PROVIDER_BASE_URL: 'COPILOT_PROVIDER_BASE_URL', - API_TARGET: 'COPILOT_API_TARGET', - API_BASE_PATH: 'COPILOT_API_BASE_PATH', -}); - -module.exports = { - OPENAI_ENV, - ANTHROPIC_ENV, - GEMINI_ENV, - COPILOT_ENV, -}; +module.exports = require('./provider-env-constants.json'); diff --git a/containers/api-proxy/provider-env-constants.json b/containers/api-proxy/provider-env-constants.json new file mode 100644 index 000000000..6fe198606 --- /dev/null +++ b/containers/api-proxy/provider-env-constants.json @@ -0,0 +1,27 @@ +{ + "OPENAI_ENV": { + "KEY": "OPENAI_API_KEY", + "TARGET": "OPENAI_API_TARGET", + "BASE_PATH": "OPENAI_API_BASE_PATH", + "AUTH_HEADER": "AWF_OPENAI_AUTH_HEADER" + }, + "ANTHROPIC_ENV": { + "KEY": "ANTHROPIC_API_KEY", + "TARGET": "ANTHROPIC_API_TARGET", + "BASE_PATH": "ANTHROPIC_API_BASE_PATH", + "AUTH_HEADER": "AWF_ANTHROPIC_AUTH_HEADER" + }, + "GEMINI_ENV": { + "KEY": "GEMINI_API_KEY", + "TARGET": "GEMINI_API_TARGET", + "BASE_PATH": "GEMINI_API_BASE_PATH" + }, + "COPILOT_ENV": { + "GITHUB_TOKEN": "COPILOT_GITHUB_TOKEN", + "PROVIDER_API_KEY": "COPILOT_PROVIDER_API_KEY", + "PROVIDER_TYPE": "COPILOT_PROVIDER_TYPE", + "PROVIDER_BASE_URL": "COPILOT_PROVIDER_BASE_URL", + "API_TARGET": "COPILOT_API_TARGET", + "API_BASE_PATH": "COPILOT_API_BASE_PATH" + } +} diff --git a/src/api-proxy-env-constants-sync.test.ts b/src/api-proxy-env-constants-sync.test.ts index 2d41906af..d8318df8d 100644 --- a/src/api-proxy-env-constants-sync.test.ts +++ b/src/api-proxy-env-constants-sync.test.ts @@ -9,7 +9,7 @@ const providerEnvConstants = require('../containers/api-proxy/provider-env-const }; describe('API proxy provider env constants', () => { - it('stays in sync between TypeScript host code and JS sidecar code', () => { + it('TypeScript host and JS sidecar both load from the same JSON source', () => { expect(providerEnvConstants.OPENAI_ENV).toEqual(OPENAI_ENV); expect(providerEnvConstants.ANTHROPIC_ENV).toEqual(ANTHROPIC_ENV); expect(providerEnvConstants.GEMINI_ENV).toEqual(GEMINI_ENV); diff --git a/src/api-proxy-env-constants.ts b/src/api-proxy-env-constants.ts index e9c3fb72f..50741d215 100644 --- a/src/api-proxy-env-constants.ts +++ b/src/api-proxy-env-constants.ts @@ -1,42 +1,32 @@ /** * Environment variable name constants for the API proxy provider adapters. * - * The CommonJS equivalent lives in containers/api-proxy/provider-env-constants.js. - * Keep both files in sync; src/api-proxy-env-constants-sync.test.ts enforces parity. + * Single source of truth: containers/api-proxy/provider-env-constants.json + * The CommonJS sidecar loads the same JSON via containers/api-proxy/provider-env-constants.js. */ +// eslint-disable-next-line @typescript-eslint/no-require-imports +const _providerEnvConstants = require('../containers/api-proxy/provider-env-constants.json') as { + OPENAI_ENV: { KEY: string; TARGET: string; BASE_PATH: string; AUTH_HEADER: string }; + ANTHROPIC_ENV: { KEY: string; TARGET: string; BASE_PATH: string; AUTH_HEADER: string }; + GEMINI_ENV: { KEY: string; TARGET: string; BASE_PATH: string }; + COPILOT_ENV: { + GITHUB_TOKEN: string; + PROVIDER_API_KEY: string; + PROVIDER_TYPE: string; + PROVIDER_BASE_URL: string; + API_TARGET: string; + API_BASE_PATH: string; + }; +}; /** Environment variable names for the OpenAI provider adapter. */ -export const OPENAI_ENV = { - KEY: 'OPENAI_API_KEY', - TARGET: 'OPENAI_API_TARGET', - BASE_PATH: 'OPENAI_API_BASE_PATH', - AUTH_HEADER: 'AWF_OPENAI_AUTH_HEADER', -} as const; - +export const OPENAI_ENV = _providerEnvConstants.OPENAI_ENV; /** Environment variable names for the Anthropic provider adapter. */ -export const ANTHROPIC_ENV = { - KEY: 'ANTHROPIC_API_KEY', - TARGET: 'ANTHROPIC_API_TARGET', - BASE_PATH: 'ANTHROPIC_API_BASE_PATH', - AUTH_HEADER: 'AWF_ANTHROPIC_AUTH_HEADER', -} as const; - +export const ANTHROPIC_ENV = _providerEnvConstants.ANTHROPIC_ENV; /** Environment variable names for the Gemini provider adapter. */ -export const GEMINI_ENV = { - KEY: 'GEMINI_API_KEY', - TARGET: 'GEMINI_API_TARGET', - BASE_PATH: 'GEMINI_API_BASE_PATH', -} as const; - +export const GEMINI_ENV = _providerEnvConstants.GEMINI_ENV; /** Environment variable names for the Copilot provider adapter. */ -export const COPILOT_ENV = { - GITHUB_TOKEN: 'COPILOT_GITHUB_TOKEN', - PROVIDER_API_KEY: 'COPILOT_PROVIDER_API_KEY', - PROVIDER_TYPE: 'COPILOT_PROVIDER_TYPE', - PROVIDER_BASE_URL: 'COPILOT_PROVIDER_BASE_URL', - API_TARGET: 'COPILOT_API_TARGET', - API_BASE_PATH: 'COPILOT_API_BASE_PATH', -} as const; +export const COPILOT_ENV = _providerEnvConstants.COPILOT_ENV; /** * OIDC authentication env var mappings. From a4691a2908a83c328a38d253a169ff09c23879ef Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:20:26 +0000 Subject: [PATCH 3/3] fix: use typed JSON import for provider env constants --- src/api-proxy-env-constants.ts | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/api-proxy-env-constants.ts b/src/api-proxy-env-constants.ts index 50741d215..8932daf37 100644 --- a/src/api-proxy-env-constants.ts +++ b/src/api-proxy-env-constants.ts @@ -4,29 +4,16 @@ * Single source of truth: containers/api-proxy/provider-env-constants.json * The CommonJS sidecar loads the same JSON via containers/api-proxy/provider-env-constants.js. */ -// eslint-disable-next-line @typescript-eslint/no-require-imports -const _providerEnvConstants = require('../containers/api-proxy/provider-env-constants.json') as { - OPENAI_ENV: { KEY: string; TARGET: string; BASE_PATH: string; AUTH_HEADER: string }; - ANTHROPIC_ENV: { KEY: string; TARGET: string; BASE_PATH: string; AUTH_HEADER: string }; - GEMINI_ENV: { KEY: string; TARGET: string; BASE_PATH: string }; - COPILOT_ENV: { - GITHUB_TOKEN: string; - PROVIDER_API_KEY: string; - PROVIDER_TYPE: string; - PROVIDER_BASE_URL: string; - API_TARGET: string; - API_BASE_PATH: string; - }; -}; +import providerEnvConstants from '../containers/api-proxy/provider-env-constants.json'; /** Environment variable names for the OpenAI provider adapter. */ -export const OPENAI_ENV = _providerEnvConstants.OPENAI_ENV; +export const OPENAI_ENV = providerEnvConstants.OPENAI_ENV; /** Environment variable names for the Anthropic provider adapter. */ -export const ANTHROPIC_ENV = _providerEnvConstants.ANTHROPIC_ENV; +export const ANTHROPIC_ENV = providerEnvConstants.ANTHROPIC_ENV; /** Environment variable names for the Gemini provider adapter. */ -export const GEMINI_ENV = _providerEnvConstants.GEMINI_ENV; +export const GEMINI_ENV = providerEnvConstants.GEMINI_ENV; /** Environment variable names for the Copilot provider adapter. */ -export const COPILOT_ENV = _providerEnvConstants.COPILOT_ENV; +export const COPILOT_ENV = providerEnvConstants.COPILOT_ENV; /** * OIDC authentication env var mappings.