mirror of
https://github.com/tiennm99/ccs.git
synced 2026-08-23 12:23:35 +00:00
fix: honor browser eval env override in attach config (#1368)
This commit is contained in:
@@ -232,6 +232,8 @@ export function getEffectiveClaudeBrowserAttachConfig(
|
|||||||
resolveBrowserUserDataDir(config.claude.user_data_dir) ?? getRecommendedBrowserUserDataDir();
|
resolveBrowserUserDataDir(config.claude.user_data_dir) ?? getRecommendedBrowserUserDataDir();
|
||||||
const configPort = normalizeDevtoolsPort(config.claude.devtools_port);
|
const configPort = normalizeDevtoolsPort(config.claude.devtools_port);
|
||||||
const configEvalMode = config.claude.eval_mode ?? 'readonly';
|
const configEvalMode = config.claude.eval_mode ?? 'readonly';
|
||||||
|
const envEvalMode = parseBrowserEvalMode(env.CCS_BROWSER_EVAL_MODE);
|
||||||
|
const effectiveEvalMode = envEvalMode ?? configEvalMode;
|
||||||
|
|
||||||
if (override.userDataDir) {
|
if (override.userDataDir) {
|
||||||
return {
|
return {
|
||||||
@@ -241,7 +243,7 @@ export function getEffectiveClaudeBrowserAttachConfig(
|
|||||||
userDataDir: override.userDataDir,
|
userDataDir: override.userDataDir,
|
||||||
devtoolsPort: override.devtoolsPort ?? configPort,
|
devtoolsPort: override.devtoolsPort ?? configPort,
|
||||||
hasExplicitDevtoolsPort: override.devtoolsPort !== undefined,
|
hasExplicitDevtoolsPort: override.devtoolsPort !== undefined,
|
||||||
evalMode: configEvalMode,
|
evalMode: effectiveEvalMode,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ export function getEffectiveClaudeBrowserAttachConfig(
|
|||||||
userDataDir: configUserDataDir,
|
userDataDir: configUserDataDir,
|
||||||
devtoolsPort: configPort,
|
devtoolsPort: configPort,
|
||||||
hasExplicitDevtoolsPort: true,
|
hasExplicitDevtoolsPort: true,
|
||||||
evalMode: configEvalMode,
|
evalMode: effectiveEvalMode,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,6 +306,15 @@ function parseDevtoolsPort(value?: string): number | undefined {
|
|||||||
return normalizeDevtoolsPort(Number.parseInt(value.trim(), 10));
|
return normalizeDevtoolsPort(Number.parseInt(value.trim(), 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseBrowserEvalMode(value?: string): BrowserEvalMode | undefined {
|
||||||
|
const trimmed = value?.trim();
|
||||||
|
if (trimmed === 'disabled' || trimmed === 'readonly' || trimmed === 'readwrite') {
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeDevtoolsPort(value: number | undefined): number {
|
function normalizeDevtoolsPort(value: number | undefined): number {
|
||||||
if (!Number.isFinite(value)) {
|
if (!Number.isFinite(value)) {
|
||||||
return 9222;
|
return 9222;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ describe('browser status', () => {
|
|||||||
let originalBrowserUserDataDir: string | undefined;
|
let originalBrowserUserDataDir: string | undefined;
|
||||||
let originalBrowserProfileDir: string | undefined;
|
let originalBrowserProfileDir: string | undefined;
|
||||||
let originalBrowserDevtoolsPort: string | undefined;
|
let originalBrowserDevtoolsPort: string | undefined;
|
||||||
|
let originalBrowserEvalMode: string | undefined;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
tempHome = mkdtempSync(join(tmpdir(), 'ccs-browser-status-'));
|
tempHome = mkdtempSync(join(tmpdir(), 'ccs-browser-status-'));
|
||||||
@@ -29,11 +30,13 @@ describe('browser status', () => {
|
|||||||
originalBrowserUserDataDir = process.env.CCS_BROWSER_USER_DATA_DIR;
|
originalBrowserUserDataDir = process.env.CCS_BROWSER_USER_DATA_DIR;
|
||||||
originalBrowserProfileDir = process.env.CCS_BROWSER_PROFILE_DIR;
|
originalBrowserProfileDir = process.env.CCS_BROWSER_PROFILE_DIR;
|
||||||
originalBrowserDevtoolsPort = process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
originalBrowserDevtoolsPort = process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
||||||
|
originalBrowserEvalMode = process.env.CCS_BROWSER_EVAL_MODE;
|
||||||
|
|
||||||
process.env.CCS_HOME = tempHome;
|
process.env.CCS_HOME = tempHome;
|
||||||
delete process.env.CCS_BROWSER_USER_DATA_DIR;
|
delete process.env.CCS_BROWSER_USER_DATA_DIR;
|
||||||
delete process.env.CCS_BROWSER_PROFILE_DIR;
|
delete process.env.CCS_BROWSER_PROFILE_DIR;
|
||||||
delete process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
delete process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
||||||
|
delete process.env.CCS_BROWSER_EVAL_MODE;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@@ -60,6 +63,11 @@ describe('browser status', () => {
|
|||||||
} else {
|
} else {
|
||||||
delete process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
delete process.env.CCS_BROWSER_DEVTOOLS_PORT;
|
||||||
}
|
}
|
||||||
|
if (originalBrowserEvalMode !== undefined) {
|
||||||
|
process.env.CCS_BROWSER_EVAL_MODE = originalBrowserEvalMode;
|
||||||
|
} else {
|
||||||
|
delete process.env.CCS_BROWSER_EVAL_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
rmSync(tempHome, { recursive: true, force: true });
|
rmSync(tempHome, { recursive: true, force: true });
|
||||||
});
|
});
|
||||||
@@ -290,6 +298,29 @@ describe('browser status', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('honors CCS_BROWSER_EVAL_MODE over configured eval_mode', () => {
|
||||||
|
mutateUnifiedConfig((config) => {
|
||||||
|
config.browser = {
|
||||||
|
claude: {
|
||||||
|
enabled: true,
|
||||||
|
policy: 'manual',
|
||||||
|
user_data_dir: '/config-browser',
|
||||||
|
devtools_port: 9333,
|
||||||
|
eval_mode: 'readonly',
|
||||||
|
},
|
||||||
|
codex: {
|
||||||
|
enabled: false,
|
||||||
|
policy: 'manual',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
process.env.CCS_BROWSER_EVAL_MODE = 'disabled';
|
||||||
|
|
||||||
|
const effective = getEffectiveClaudeBrowserAttachConfig(getBrowserConfig());
|
||||||
|
|
||||||
|
expect(effective.evalMode).toBe('disabled');
|
||||||
|
});
|
||||||
|
|
||||||
it('returns the same managed attach warning when the configured DevTools port is unreachable', async () => {
|
it('returns the same managed attach warning when the configured DevTools port is unreachable', async () => {
|
||||||
const managedDir = join(tempHome, '.ccs', 'browser', 'chrome-user-data');
|
const managedDir = join(tempHome, '.ccs', 'browser', 'chrome-user-data');
|
||||||
mkdirSync(managedDir, { recursive: true });
|
mkdirSync(managedDir, { recursive: true });
|
||||||
|
|||||||
Reference in New Issue
Block a user