feat(cliproxy): wire composite variant into main execution flow

- Detect composite variants in ProfileDetector with tier metadata
- Pass isComposite/compositeTiers/compositeDefaultTier through ccs.ts
- Handle composite in loadConfigSafe() legacy adapter
- Add validateCompositeVariants() for provider string validation
- Display 'composite' label in API profile listing

Refs #506
This commit is contained in:
Tam Nhu Tran
2026-02-12 04:09:19 +07:00
parent 4926c200f2
commit 07bef9f50e
5 changed files with 101 additions and 14 deletions
+24 -7
View File
@@ -1,7 +1,14 @@
import * as fs from 'fs';
import * as path from 'path';
import * as os from 'os';
import { Config, isConfig, Settings, isSettings, CLIProxyVariantsConfig } from '../types';
import {
Config,
isConfig,
Settings,
isSettings,
CLIProxyVariantsConfig,
CLIProxyVariantConfig,
} from '../types';
import { expandPath, error } from './helpers';
import { info } from './ui';
import { isUnifiedMode, loadOrCreateUnifiedConfig } from '../config/unified-config-loader';
@@ -191,12 +198,22 @@ export function loadConfigSafe(): Config {
if (unifiedConfig.cliproxy?.variants) {
cliproxy = {};
for (const [name, variant] of Object.entries(unifiedConfig.cliproxy.variants)) {
cliproxy[name] = {
provider: variant.provider,
settings: variant.settings,
account: variant.account,
port: variant.port,
};
if ('type' in variant && variant.type === 'composite') {
// Composite variants: use default tier's provider
cliproxy[name] = {
provider: variant.tiers[variant.default_tier].provider,
settings: variant.settings,
port: variant.port,
};
} else {
const single = variant as CLIProxyVariantConfig;
cliproxy[name] = {
provider: single.provider,
settings: single.settings,
account: single.account,
port: single.port,
};
}
}
}