From 9dcfdf2c9c3c11ebc9cae441f0002aea80350e9f Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 12 Feb 2026 18:00:19 +0000 Subject: [PATCH] Return `OfflineFeatures` for CCR --- lib/analyze-action.js | 6 +++++- lib/autobuild-action.js | 10 +++++++++- lib/init-action-post.js | 6 +++++- lib/init-action.js | 6 +++++- lib/setup-codeql-action.js | 10 +++++++++- lib/start-proxy-action.js | 10 +++++++++- lib/upload-sarif-action.js | 6 +++++- src/feature-flags.test.ts | 17 +++++++++++++++++ src/feature-flags.ts | 7 ++++++- 9 files changed, 70 insertions(+), 8 deletions(-) diff --git a/lib/analyze-action.js b/lib/analyze-action.js index 27ba24565..4f2ed9eef 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -108115,7 +108115,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/diff-informed-analysis-utils.ts diff --git a/lib/autobuild-action.js b/lib/autobuild-action.js index 431e447de..4743c0498 100644 --- a/lib/autobuild-action.js +++ b/lib/autobuild-action.js @@ -103130,6 +103130,10 @@ function getWorkflowRunAttempt() { function isSelfHostedRunner() { return process.env.RUNNER_ENVIRONMENT === "self-hosted"; } +var CCR_KEY_PREFIX = "dynamic/copilot-pull-request-reviewer"; +function isCCR() { + return process.env["CODEQL_ACTION_ANALYSIS_KEY" /* ANALYSIS_KEY */]?.startsWith(CCR_KEY_PREFIX) || false; +} function prettyPrintInvocation(cmd, args) { return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" "); } @@ -104448,7 +104452,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/trap-caching.ts diff --git a/lib/init-action-post.js b/lib/init-action-post.js index ebb0a79d4..2eff72317 100644 --- a/lib/init-action-post.js +++ b/lib/init-action-post.js @@ -165441,7 +165441,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/diff-informed-analysis-utils.ts diff --git a/lib/init-action.js b/lib/init-action.js index 978f09d8a..239d55a4f 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -105648,7 +105648,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/diff-informed-analysis-utils.ts diff --git a/lib/setup-codeql-action.js b/lib/setup-codeql-action.js index 3b25f23a5..25d848f75 100644 --- a/lib/setup-codeql-action.js +++ b/lib/setup-codeql-action.js @@ -103247,6 +103247,10 @@ function isSelfHostedRunner() { function isDynamicWorkflow() { return getWorkflowEventName() === "dynamic"; } +var CCR_KEY_PREFIX = "dynamic/copilot-pull-request-reviewer"; +function isCCR() { + return process.env["CODEQL_ACTION_ANALYSIS_KEY" /* ANALYSIS_KEY */]?.startsWith(CCR_KEY_PREFIX) || false; +} function prettyPrintInvocation(cmd, args) { return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" "); } @@ -104349,7 +104353,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/init.ts diff --git a/lib/start-proxy-action.js b/lib/start-proxy-action.js index aa396d061..b9f24e951 100644 --- a/lib/start-proxy-action.js +++ b/lib/start-proxy-action.js @@ -120267,6 +120267,10 @@ function getWorkflowRunAttempt() { function isSelfHostedRunner() { return process.env.RUNNER_ENVIRONMENT === "self-hosted"; } +var CCR_KEY_PREFIX = "dynamic/copilot-pull-request-reviewer"; +function isCCR() { + return process.env["CODEQL_ACTION_ANALYSIS_KEY" /* ANALYSIS_KEY */]?.startsWith(CCR_KEY_PREFIX) || false; +} var persistedInputsKey = "persisted_inputs"; var persistInputs = function() { const inputEnvironmentVariables = Object.entries(process.env).filter( @@ -121142,7 +121146,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/start-proxy.ts diff --git a/lib/upload-sarif-action.js b/lib/upload-sarif-action.js index ad5168403..4f8773ed1 100644 --- a/lib/upload-sarif-action.js +++ b/lib/upload-sarif-action.js @@ -107303,7 +107303,11 @@ function supportsFeatureFlags(githubVariant) { return githubVariant === "GitHub.com" /* DOTCOM */ || githubVariant === "GitHub Enterprise Cloud with data residency" /* GHEC_DR */; } function initFeatures(gitHubVersion, repositoryNwo, tempDir, logger) { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } } // src/status-report.ts diff --git a/src/feature-flags.test.ts b/src/feature-flags.test.ts index 37253d121..2cbb74a9c 100644 --- a/src/feature-flags.test.ts +++ b/src/feature-flags.test.ts @@ -4,6 +4,7 @@ import * as path from "path"; import test, { ExecutionContext } from "ava"; import * as defaults from "./defaults.json"; +import { EnvVar } from "./environment"; import { Feature, featureConfig, @@ -542,6 +543,22 @@ test("non-legacy feature flags should not start with codeql_action_", async (t) } }); +test("initFeatures returns a `Features` instance by default", async (t) => { + await withTmpDir(async (tmpDir) => { + const features = setUpFeatureFlagTests(tmpDir); + t.is("Features", features.constructor.name); + }); +}); + +test("initFeatures returns an `OfflineFeatures` instance in CCR", async (t) => { + await withTmpDir(async (tmpDir) => { + process.env.GITHUB_EVENT_NAME = "dynamic"; + process.env[EnvVar.ANALYSIS_KEY] = "dynamic/copilot-pull-request-reviewer"; + const features = setUpFeatureFlagTests(tmpDir); + t.is("OfflineFeatures", features.constructor.name); + }); +}); + function assertAllFeaturesUndefinedInApi( t: ExecutionContext, loggedMessages: LoggedMessage[], diff --git a/src/feature-flags.ts b/src/feature-flags.ts index e0d6d1acc..793fb0cbb 100644 --- a/src/feature-flags.ts +++ b/src/feature-flags.ts @@ -3,6 +3,7 @@ import * as path from "path"; import * as semver from "semver"; +import { isCCR } from "./actions-util"; import { getApiClient } from "./api-client"; import type { CodeQL } from "./codeql"; import * as defaults from "./defaults.json"; @@ -809,5 +810,9 @@ export function initFeatures( tempDir: string, logger: Logger, ): FeatureEnablement { - return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + if (isCCR()) { + return new OfflineFeatures(logger); + } else { + return new Features(gitHubVersion, repositoryNwo, tempDir, logger); + } }