diff --git a/src/web-server/services/compatible-cli-types.ts b/src/web-server/services/compatible-cli-types.ts index 6493f783..bb9898e2 100644 --- a/src/web-server/services/compatible-cli-types.ts +++ b/src/web-server/services/compatible-cli-types.ts @@ -48,7 +48,7 @@ export interface DroidDashboardDiagnostics { binary: DroidBinaryDiagnostics; files: { settings: DroidConfigFileDiagnostics; - globalConfig: DroidConfigFileDiagnostics; + legacyConfig: DroidConfigFileDiagnostics; }; byok: DroidByokDiagnostics; warnings: string[]; diff --git a/src/web-server/services/droid-dashboard-service.ts b/src/web-server/services/droid-dashboard-service.ts index 050bffd9..d342c875 100644 --- a/src/web-server/services/droid-dashboard-service.ts +++ b/src/web-server/services/droid-dashboard-service.ts @@ -14,8 +14,8 @@ import type { interface DroidConfigPaths { settingsPath: string; settingsDisplayPath: string; - globalConfigPath: string; - globalConfigDisplayPath: string; + legacyConfigPath: string; + legacyConfigDisplayPath: string; } interface JsonFileProbe { @@ -57,25 +57,18 @@ export function resolveDroidConfigPaths( homeDir?: string; } = {} ): DroidConfigPaths { - const platform = options.platform ?? process.platform; const env = options.env ?? process.env; const homeDir = options.homeDir ?? os.homedir(); const byokBase = env.CCS_HOME || homeDir; const settingsPath = path.join(byokBase, '.factory', 'settings.json'); - - const globalConfigRoot = - platform === 'win32' - ? env.APPDATA || path.join(homeDir, 'AppData', 'Roaming') - : env.XDG_CONFIG_HOME || path.join(homeDir, '.config'); - const globalConfigPath = path.join(globalConfigRoot, 'factory', 'config.json'); + const legacyConfigPath = path.join(byokBase, '.factory', 'config.json'); return { settingsPath, settingsDisplayPath: '~/.factory/settings.json', - globalConfigPath, - globalConfigDisplayPath: - platform === 'win32' ? '%APPDATA%/factory/config.json' : '~/.config/factory/config.json', + legacyConfigPath, + legacyConfigDisplayPath: '~/.factory/config.json', }; } @@ -225,10 +218,10 @@ export function getDroidDashboardDiagnostics(): DroidDashboardDiagnostics { 'BYOK settings', paths.settingsDisplayPath ); - const globalConfigProbe = readJsonFileProbe( - paths.globalConfigPath, - 'Global config', - paths.globalConfigDisplayPath + const legacyConfigProbe = readJsonFileProbe( + paths.legacyConfigPath, + 'Legacy config', + paths.legacyConfigDisplayPath ); const byok = summarizeDroidCustomModels(settingsProbe.json?.customModels); @@ -242,8 +235,8 @@ export function getDroidDashboardDiagnostics(): DroidDashboardDiagnostics { if (byok.invalidModelEntryCount > 0) { warnings.push(`${byok.invalidModelEntryCount} customModels entries are malformed.`); } - if (globalConfigProbe.diagnostics.parseError) { - warnings.push('Global Droid config JSON is invalid.'); + if (legacyConfigProbe.diagnostics.parseError) { + warnings.push('Legacy Droid config (~/.factory/config.json) JSON is invalid.'); } return { @@ -257,7 +250,7 @@ export function getDroidDashboardDiagnostics(): DroidDashboardDiagnostics { }, files: { settings: settingsProbe.diagnostics, - globalConfig: globalConfigProbe.diagnostics, + legacyConfig: legacyConfigProbe.diagnostics, }, byok, warnings, @@ -271,6 +264,7 @@ export function getDroidDashboardDiagnostics(): DroidDashboardDiagnostics { ], notes: [ 'BYOK custom models are read from ~/.factory/settings.json customModels[]', + 'Factory docs mention legacy support for ~/.factory/config.json', 'Interactive model selection uses settings.model (custom:)', 'droid exec supports --model for one-off execution mode', ], diff --git a/tests/unit/web-server/droid-dashboard-service.test.ts b/tests/unit/web-server/droid-dashboard-service.test.ts index 23249fe3..f1f388a7 100644 --- a/tests/unit/web-server/droid-dashboard-service.test.ts +++ b/tests/unit/web-server/droid-dashboard-service.test.ts @@ -29,31 +29,26 @@ describe('droid-dashboard-service', () => { platform: 'darwin', env: { CCS_HOME: '/tmp/ccs-home', - XDG_CONFIG_HOME: '/tmp/xdg', } as NodeJS.ProcessEnv, homeDir: '/Users/tester', }); expect(resolved.settingsPath).toBe('/tmp/ccs-home/.factory/settings.json'); - expect(resolved.globalConfigPath).toBe('/tmp/xdg/factory/config.json'); + expect(resolved.legacyConfigPath).toBe('/tmp/ccs-home/.factory/config.json'); expect(resolved.settingsDisplayPath).toBe('~/.factory/settings.json'); - expect(resolved.globalConfigDisplayPath).toBe('~/.config/factory/config.json'); + expect(resolved.legacyConfigDisplayPath).toBe('~/.factory/config.json'); }); it('resolves droid config paths on windows platforms', () => { const resolved = resolveDroidConfigPaths({ platform: 'win32', - env: { - APPDATA: 'C:/Users/test/AppData/Roaming', - } as NodeJS.ProcessEnv, + env: {} as NodeJS.ProcessEnv, homeDir: 'C:/Users/test', }); expect(resolved.settingsPath).toBe(path.join('C:/Users/test', '.factory', 'settings.json')); - expect(resolved.globalConfigPath).toBe( - path.join('C:/Users/test/AppData/Roaming', 'factory', 'config.json') - ); - expect(resolved.globalConfigDisplayPath).toBe('%APPDATA%/factory/config.json'); + expect(resolved.legacyConfigPath).toBe(path.join('C:/Users/test', '.factory', 'config.json')); + expect(resolved.legacyConfigDisplayPath).toBe('~/.factory/config.json'); }); it('masks api key preview with only suffix', () => { diff --git a/ui/src/hooks/use-droid.ts b/ui/src/hooks/use-droid.ts index ec939b50..2a647f6c 100644 --- a/ui/src/hooks/use-droid.ts +++ b/ui/src/hooks/use-droid.ts @@ -40,7 +40,7 @@ export interface DroidDashboardDiagnostics { binary: DroidBinaryDiagnostics; files: { settings: DroidConfigFileDiagnostics; - globalConfig: DroidConfigFileDiagnostics; + legacyConfig: DroidConfigFileDiagnostics; }; byok: { activeModelSelector: string | null; diff --git a/ui/src/pages/droid.tsx b/ui/src/pages/droid.tsx index 5792ef09..3f111297 100644 --- a/ui/src/pages/droid.tsx +++ b/ui/src/pages/droid.tsx @@ -147,7 +147,7 @@ export function DroidPage() { - {[diagnostics.files.settings, diagnostics.files.globalConfig].map((file) => ( + {[diagnostics.files.settings, diagnostics.files.legacyConfig].map((file) => (
{file.label}