From 82c92aa940afc0b87a7e57a3aa092b4fdb850e46 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sun, 26 Apr 2026 11:09:54 -0400 Subject: [PATCH] feat(codex): align ccsxp with native cliproxy shortcut --- docs/code-standards.md | 2 +- docs/codebase-summary.md | 4 +- docs/system-architecture/index.md | 2 +- docs/system-architecture/target-adapters.md | 4 +- src/bin/ccsxp-runtime.ts | 71 ++++++++++++++++++- src/commands/command-catalog.ts | 5 +- tests/unit/bin/ccsxp-runtime.test.ts | 14 ++-- .../targets/codex-runtime-integration.test.ts | 70 +++++++++++++++++- .../compatible-cli/codex-docs-tab.tsx | 8 ++- .../compatible-cli/codex-overview-tab.tsx | 4 +- ui/src/lib/i18n.ts | 38 +++++----- ui/src/lib/support-updates-catalog.ts | 10 +-- 12 files changed, 189 insertions(+), 43 deletions(-) diff --git a/docs/code-standards.md b/docs/code-standards.md index de84eebe..6c71122f 100644 --- a/docs/code-standards.md +++ b/docs/code-standards.md @@ -201,7 +201,7 @@ Resolves which adapter to use via `resolveTargetType()`: 2. explicit runtime entrypoint (`CCS_INTERNAL_ENTRY_TARGET`): - ccs-droid / ccsd → droid - ccs-codex / ccsx → codex - - ccsxp → codex (provider shortcut) + - ccsxp → codex (native cliproxy shortcut) ↓ 3. argv[0] detection (runtime alias pattern / custom alias map): - ccs-droid → droid diff --git a/docs/codebase-summary.md b/docs/codebase-summary.md index 986b2194..1b6b8108 100644 --- a/docs/codebase-summary.md +++ b/docs/codebase-summary.md @@ -38,7 +38,7 @@ src/ ├── bin/ # Dedicated runtime entrypoints │ ├── droid-runtime.ts # Forces droid target for ccs-droid / ccsd package bins │ ├── codex-runtime.ts # Forces codex target for ccs-codex / ccsx package bins -│ └── ccsxp-runtime.ts # Forces built-in codex profile + codex target for ccsxp +│ └── ccsxp-runtime.ts # Forces codex target + native cliproxy override for ccsxp ├── types/ # TypeScript type definitions │ ├── index.ts # Barrel export (aggregates all types) │ ├── cli.ts # CLI types (ParsedArgs, ExitCode) @@ -267,7 +267,7 @@ src/ ### Native Codex Runtime Target - Dedicated runtime entrypoints: `ccs-codex` and `ccsx` resolve through `src/bin/codex-runtime.ts`, while `ccsxp` resolves through `src/bin/ccsxp-runtime.ts`; all three set `CCS_INTERNAL_ENTRY_TARGET=codex` before delegating to `src/targets/target-resolver.ts`. -- Provider shortcut behavior: `ccsxp` also strips user-supplied `--target` overrides and rewrites argv to `ccs codex --target codex ...`, so it always lands on the built-in Codex-via-CLIProxy route. It pins `CODEX_HOME` to native `~/.codex` by default so inherited launcher state does not send history/config writes to a nonstandard Codex root; `CCSXP_CODEX_HOME` is the explicit override. +- Provider shortcut behavior: `ccsxp` strips user-supplied `--target` overrides and prepends `--config model_provider="cliproxy"` so it behaves like native Codex plus the CLIProxy provider recipe. The stricter CCS-managed bridge remains available explicitly through `ccs codex --target codex`. It pins `CODEX_HOME` to native `~/.codex` by default so inherited launcher state does not send history/config writes to a nonstandard Codex root; `CCSXP_CODEX_HOME` is the explicit override. - `argv[0]` alias mapping still exists in `src/targets/target-resolver.ts` for same-binary/custom alias scenarios, but the built-in npm bins above do not depend on that map at runtime. - Metadata boundary: `src/targets/target-metadata.ts` keeps Codex runtime-only in v1, so persisted default targets remain `claude | droid`. - Compatibility guardrails: `src/targets/target-runtime-compatibility.ts` centralizes which profile types can execute on Codex. diff --git a/docs/system-architecture/index.md b/docs/system-architecture/index.md index 0201ec3e..475718ba 100644 --- a/docs/system-architecture/index.md +++ b/docs/system-architecture/index.md @@ -101,7 +101,7 @@ ccs-droid → Target: droid (explicit alias) ccsd → Target: droid (legacy shortcut) ccs-codex → Target: codex (explicit alias) ccsx → Target: codex (short alias) -ccsxp → Target: codex (provider shortcut; rewrites argv to `ccs codex --target codex`) +ccsxp → Target: codex (native cliproxy shortcut; prepends `--config model_provider="cliproxy"`) ``` For details on the adapter architecture, see [Target Adapters](./target-adapters.md). diff --git a/docs/system-architecture/target-adapters.md b/docs/system-architecture/target-adapters.md index 8cfddf3f..aa6349d6 100644 --- a/docs/system-architecture/target-adapters.md +++ b/docs/system-architecture/target-adapters.md @@ -88,7 +88,7 @@ CCS resolves which adapter to use via priority-ordered checks: 2. Explicit runtime entrypoint (`CCS_INTERNAL_ENTRY_TARGET`) — dedicated bin shims └─ ccs-droid / ccsd → droid └─ ccs-codex / ccsx → codex - └─ ccsxp → codex, then rewrites argv to `ccs codex --target codex ...` + └─ ccsxp → codex, then prepends `--config model_provider="cliproxy"` 3. argv[0] detection (runtime alias pattern) — binary name mapping for same-binary/custom aliases └─ ccs-droid (explicit alias) → droid @@ -514,7 +514,7 @@ ccsx ccsxp → dist/bin/ccsxp-runtime.js → CCS_INTERNAL_ENTRY_TARGET=codex -→ injects built-in codex profile shortcut +→ injects native `model_provider="cliproxy"` override → pins CODEX_HOME to native `~/.codex` unless `CCSXP_CODEX_HOME` is set ``` diff --git a/src/bin/ccsxp-runtime.ts b/src/bin/ccsxp-runtime.ts index 429f8806..3e314e34 100644 --- a/src/bin/ccsxp-runtime.ts +++ b/src/bin/ccsxp-runtime.ts @@ -5,6 +5,57 @@ const { expandPath } = require('../utils/helpers'); const { fail } = require('../utils/ui'); process.env.CCS_INTERNAL_ENTRY_TARGET = 'codex'; +const CCSXP_CLIPROXY_OVERRIDE = 'model_provider="cliproxy"'; +const DISALLOWED_CCSXP_CONFIG_KEY_REGEX = + /^(model_provider|local_provider|profile)\s*=|^model_providers\./i; + +function isDisallowedCcsxpConfigOverride(value: unknown) { + return typeof value === 'string' && DISALLOWED_CCSXP_CONFIG_KEY_REGEX.test(value.trim()); +} + +function findDisallowedCcsxpFlags(args: string[]) { + const disallowed = new Set(); + + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === '--') { + break; + } + + if (arg === '-p' || arg === '--profile' || arg.startsWith('--profile=')) { + disallowed.add('--profile/-p'); + continue; + } + + if (arg === '--oss') { + disallowed.add('--oss'); + continue; + } + + if (arg === '--local-provider' || arg.startsWith('--local-provider=')) { + disallowed.add('--local-provider'); + continue; + } + + if (arg === '-c' || arg === '--config') { + const value = args[index + 1]; + if (isDisallowedCcsxpConfigOverride(value)) { + disallowed.add('--config/-c provider override'); + } + index += 1; + continue; + } + + if (arg.startsWith('--config=')) { + const value = arg.slice('--config='.length); + if (isDisallowedCcsxpConfigOverride(value)) { + disallowed.add('--config/-c provider override'); + } + } + } + + return [...disallowed]; +} function resolveCcsxpCodexHome() { const configuredHome = process.env.CCSXP_CODEX_HOME?.trim(); @@ -17,10 +68,17 @@ function resolveCcsxpCodexHome() { process.env.CODEX_HOME = resolveCcsxpCodexHome(); -// ccsxp is an opinionated shortcut for the built-in Codex-on-Codex route. -// Strip user-supplied target overrides before forcing the shortcut target. +// ccsxp is the Codex + cliproxy shortcut. Keep the native Codex history root, +// strip conflicting target overrides, and prepend the native cliproxy provider +// override so the runtime stays as close to plain Codex as possible. const forwardedArgs = (() => { try { + const disallowedFlags = findDisallowedCcsxpFlags(process.argv.slice(2)); + if (disallowedFlags.length > 0) { + throw new Error( + `ccsxp does not allow ${disallowedFlags.join(', ')} because the native cliproxy shortcut owns provider selection. Remove native Codex provider-selection flags and retry.` + ); + } return stripTargetFlag(process.argv.slice(2)); } catch (error) { const message = error instanceof Error ? error.message : String(error); @@ -29,5 +87,12 @@ const forwardedArgs = (() => { } })(); -process.argv.splice(2, process.argv.length - 2, 'codex', '--target', 'codex', ...forwardedArgs); +process.argv.splice( + 2, + process.argv.length - 2, + '--config', + CCSXP_CLIPROXY_OVERRIDE, + ...forwardedArgs +); + require('../ccs'); diff --git a/src/commands/command-catalog.ts b/src/commands/command-catalog.ts index a1ad558f..2006422e 100644 --- a/src/commands/command-catalog.ts +++ b/src/commands/command-catalog.ts @@ -225,7 +225,10 @@ export const ROOT_PROFILE_EXAMPLES: readonly ShortcutEntry[] = [ export const ROOT_COMPATIBLE_ALIAS_EXAMPLES: readonly ShortcutEntry[] = [ { name: '--target claude|droid|codex', summary: 'Route a profile to the target runtime' }, { name: 'ccs-droid / ccsd', summary: 'Explicit Droid runtime aliases' }, - { name: 'ccs-codex / ccsx / ccsxp', summary: 'Explicit Codex runtime aliases' }, + { + name: 'ccs-codex / ccsx / ccsxp', + summary: 'Codex runtime aliases plus the cliproxy shortcut', + }, ] as const; export const ROOT_COMMAND_FLAGS = [ diff --git a/tests/unit/bin/ccsxp-runtime.test.ts b/tests/unit/bin/ccsxp-runtime.test.ts index 2698007a..93c1e19d 100644 --- a/tests/unit/bin/ccsxp-runtime.test.ts +++ b/tests/unit/bin/ccsxp-runtime.test.ts @@ -39,7 +39,7 @@ describe('ccsxp runtime wrapper', () => { delete require.cache[ccsPath]; }); - it('prepends the built-in codex profile and target before loading CCS', () => { + it('prepends the cliproxy provider override before loading CCS', () => { process.argv = ['node', wrapperPath, 'fix failing tests']; require.cache[ccsPath] = { exports: {} } as NodeJS.Module; @@ -47,7 +47,11 @@ describe('ccsxp runtime wrapper', () => { expect(process.env.CCS_INTERNAL_ENTRY_TARGET).toBe('codex'); expect(process.env.CODEX_HOME).toBe(path.join(os.homedir(), '.codex')); - expect(process.argv.slice(2)).toEqual(['codex', '--target', 'codex', 'fix failing tests']); + expect(process.argv.slice(2)).toEqual([ + '--config', + 'model_provider="cliproxy"', + 'fix failing tests', + ]); }); it('pins ccsxp history to native Codex default instead of inherited CODEX_HOME', () => { @@ -71,13 +75,13 @@ describe('ccsxp runtime wrapper', () => { expect(process.env.CODEX_HOME).toBe('/tmp/explicit-ccsxp-codex-home'); }); - it('keeps flag-only invocations routed through the built-in codex profile shortcut', () => { + it('keeps flag-only invocations routed through the native cliproxy shortcut', () => { process.argv = ['node', wrapperPath, '--version']; require.cache[ccsPath] = { exports: {} } as NodeJS.Module; require(wrapperPath); - expect(process.argv.slice(2)).toEqual(['codex', '--target', 'codex', '--version']); + expect(process.argv.slice(2)).toEqual(['--config', 'model_provider="cliproxy"', '--version']); }); it('strips user-supplied target overrides before forcing the codex shortcut target', () => { @@ -86,6 +90,6 @@ describe('ccsxp runtime wrapper', () => { require(wrapperPath); - expect(process.argv.slice(2)).toEqual(['codex', '--target', 'codex', '--version']); + expect(process.argv.slice(2)).toEqual(['--config', 'model_provider="cliproxy"', '--version']); }); }); diff --git a/tests/unit/targets/codex-runtime-integration.test.ts b/tests/unit/targets/codex-runtime-integration.test.ts index 2006d868..318219c6 100644 --- a/tests/unit/targets/codex-runtime-integration.test.ts +++ b/tests/unit/targets/codex-runtime-integration.test.ts @@ -174,6 +174,7 @@ process.exit(0); CI: '1', NO_COLOR: '1', CCS_HOME: tmpHome, + CODEX_HOME: undefined, CCS_CODEX_PATH: fakeCodexPath, CCS_TEST_CODEX_ARGS_OUT: codexArgsLogPath, CCS_TEST_CODEX_ENV_OUT: codexEnvLogPath, @@ -654,7 +655,9 @@ process.exit(0); expect(result.status).toBe(0); expect(result.stdout).toContain('codex-cli 9.9.9-test'); - expect(readLoggedCodexCalls(codexArgsLogPath)).toEqual([['--version']]); + expect(readLoggedCodexCalls(codexArgsLogPath)).toEqual([ + ['--config', 'model_provider="cliproxy"', '--version'], + ]); }); it('pins ccsxp Codex history to native default instead of inherited CODEX_HOME', () => { @@ -687,6 +690,71 @@ process.exit(0); ]); }); + it('routes default ccsxp launches through native Codex with the cliproxy provider override', () => { + if (process.platform === 'win32') return; + + const result = runCcsxpAlias(['fix failing tests'], { + ...process.env, + CI: '1', + NO_COLOR: '1', + CCS_HOME: tmpHome, + CCS_CODEX_PATH: fakeCodexPath, + CCS_TEST_CODEX_ARGS_OUT: codexArgsLogPath, + CCS_TEST_CODEX_ENV_OUT: codexEnvLogPath, + }); + + expect(result.status).toBe(0); + expect(readLoggedCodexCalls(codexArgsLogPath)).toEqual([ + ['--config', 'model_provider="cliproxy"', 'fix failing tests'], + ]); + expect(readLoggedCodexEnv(codexEnvLogPath)).toEqual([ + { + CODEX_HOME: path.join(os.homedir(), '.codex'), + CODEX_CI: undefined, + CODEX_MANAGED_BY_BUN: undefined, + CODEX_THREAD_ID: undefined, + ANTHROPIC_BASE_URL: undefined, + CCS_BROWSER_USER_DATA_DIR: undefined, + CCS_BROWSER_PROFILE_DIR: undefined, + CCS_BROWSER_DEVTOOLS_WS_URL: undefined, + }, + ]); + }); + + it('rejects conflicting native provider config overrides for ccsxp', () => { + if (process.platform === 'win32') return; + + const result = runCcsxpAlias(['--config', 'model_provider="openai"', '--version'], { + ...process.env, + CI: '1', + NO_COLOR: '1', + CCS_HOME: tmpHome, + CCS_CODEX_PATH: fakeCodexPath, + CCS_TEST_CODEX_ARGS_OUT: codexArgsLogPath, + }); + + expect(result.status).toBe(1); + expect(result.stderr).toContain('ccsxp does not allow'); + expect(readLoggedCodexCalls(codexArgsLogPath)).toEqual([]); + }); + + it('rejects native profile selection flags for ccsxp', () => { + if (process.platform === 'win32') return; + + const result = runCcsxpAlias(['--profile', 'other', '--version'], { + ...process.env, + CI: '1', + NO_COLOR: '1', + CCS_HOME: tmpHome, + CCS_CODEX_PATH: fakeCodexPath, + CCS_TEST_CODEX_ARGS_OUT: codexArgsLogPath, + }); + + expect(result.status).toBe(1); + expect(result.stderr).toContain('ccsxp does not allow'); + expect(readLoggedCodexCalls(codexArgsLogPath)).toEqual([]); + }); + it('honors CCSXP_CODEX_HOME for intentionally separate ccsxp history', () => { if (process.platform === 'win32') return; diff --git a/ui/src/components/compatible-cli/codex-docs-tab.tsx b/ui/src/components/compatible-cli/codex-docs-tab.tsx index 8a88a652..a41eb937 100644 --- a/ui/src/components/compatible-cli/codex-docs-tab.tsx +++ b/ui/src/components/compatible-cli/codex-docs-tab.tsx @@ -114,13 +114,19 @@ export function CodexDocsTab({ diagnostics }: CodexDocsTabProps) {

{/* TODO i18n: missing key codex.builtInLabel */} - Built-in: Use ccsxp for the CCS provider shortcut. + Built-in: Use ccsxp for native Codex with the{' '} + cliproxy provider shortcut.

{/* TODO i18n: missing key codex.nativeLabelRecipe */} Native: Configure the recipe below to use CLIProxy directly with{' '} codex.

+

+ {/* TODO i18n: missing key codex.managedBridgeLabel */} + Managed bridge: Use ccs codex --target codex when you + want the stricter CCS-managed route explicitly. +

               {CLIPROXY_NATIVE_CODEX_RECIPE}
diff --git a/ui/src/components/compatible-cli/codex-overview-tab.tsx b/ui/src/components/compatible-cli/codex-overview-tab.tsx
index 1b66f8b0..12e0f310 100644
--- a/ui/src/components/compatible-cli/codex-overview-tab.tsx
+++ b/ui/src/components/compatible-cli/codex-overview-tab.tsx
@@ -361,9 +361,7 @@ export function CodexOverviewTab({ diagnostics }: CodexOverviewTabProps) {
                       ccs codex --target codex
                     
                   
-                  
-                    {t('codex.usesTransientOverrides')}
-                  
+                  

{t('codex.transientOverridesDesc')}

) : (

{t('codex.unavailableNoConfig')}

diff --git a/ui/src/lib/i18n.ts b/ui/src/lib/i18n.ts index 53f26f36..cc2d916e 100644 --- a/ui/src/lib/i18n.ts +++ b/ui/src/lib/i18n.ts @@ -1911,7 +1911,7 @@ const resources = { overview: 'Overview', docs: 'Docs', nativeCodexRuntime: 'Native Codex Runtime', - ccsCodexProvider: 'CCS Codex provider / bridge', + ccsCodexProvider: 'Cliproxy shortcut / managed bridge', codexDocs: 'Codex docs', howCodexWorks: 'How Codex works in CCS', supportedFlows: 'Supported flows', @@ -1922,7 +1922,7 @@ const resources = { nativeConfigDesc: 'ccs-codex and ccsx launch native Codex using your saved defaults.', transientOverridesLabel: 'Transient overrides:', transientOverridesDesc: - 'ccsxp (or ccs codex --target codex) uses the CCS provider shortcut.', + 'ccsxp stays on native Codex and prepends the cliproxy provider override; ccs codex --target codex remains the explicit CCS-managed bridge.', cliproxyDefaultLabel: 'CLIProxy default:', cliproxyDefaultDesc: 'To make plain codex use CLIProxy, set model_provider = "cliproxy" and add the recipe below.', @@ -1936,13 +1936,13 @@ const resources = { installDirectory: 'Install directory', versionLabel: 'Version', nativeAliases: 'Native aliases', - ccsProviderShortcut: 'CCS provider shortcut', + ccsProviderShortcut: 'Cliproxy shortcut', configOverrideSupport: '--config override support', available: 'Available', missing: 'Missing', cliproxyNativeCodex: 'CLIProxy-backed native Codex', builtInLabel: 'Built-in:', - builtInCcsxpDesc: 'Use ccsxp for the CCS provider shortcut.', + builtInCcsxpDesc: 'Use ccsxp for native Codex with the cliproxy provider shortcut.', nativeRecipeLabel: 'Native:', nativeRecipeDesc: 'Configure the recipe below to use CLIProxy directly with codex.', saveProviderNamedCliproxy: @@ -1951,7 +1951,7 @@ const resources = { exportCliproxyApiKey: 'Export CLIPROXY_API_KEY in your shell before launching native Codex.', noConfigOverrides: - 'This Codex build can still use the native path, but CCS-backed Codex routing via ccsxp or ccs codex --target codex stays unavailable until the detected Codex binary exposes --config overrides.', + 'This Codex build can still use the plain native path, but ccsxp and the explicit CCS-managed Codex bridge stay unavailable until the detected Codex binary exposes --config overrides.', configFile: 'Config file', path: 'Path', resolved: 'Resolved', @@ -1972,12 +1972,12 @@ const resources = { officialChannels: 'Official Channels', codexCli: 'Codex CLI', openNativeCodex: 'Open native Codex', - runBuiltInCodex: 'Run built-in Codex on Codex', - runBuiltInCodexExplicit: 'Run built-in Codex on Codex (explicit)', + runBuiltInCodex: 'Run native Codex with the cliproxy shortcut', + runBuiltInCodexExplicit: 'Run the CCS-managed Codex bridge explicitly', openCodexDashboard: 'Open Codex dashboard', nativeShortAlias: 'Native short alias', - ccsCodexShortcut: 'CCS Codex shortcut', - explicitProviderRoute: 'Explicit provider route', + ccsCodexShortcut: 'Cliproxy shortcut', + explicitProviderRoute: 'Managed bridge route', status: 'Status', profiles: 'Profiles', createNewProfile: 'Create new profile', @@ -4459,7 +4459,8 @@ const resources = { nativeConfigLabel: '原生配置:', nativeConfigDesc: 'ccs-codex 和 ccsx 会使用你保存的默认值启动原生 Codex。', transientOverridesLabel: '临时覆盖:', - transientOverridesDesc: 'ccsxp(或 ccs codex --target codex)会使用 CCS 提供商快捷方式。', + transientOverridesDesc: + 'ccsxp 会保持原生 Codex,只额外加上 cliproxy provider 覆盖;ccs codex --target codex 仍然是显式的 CCS 托管桥接。', cliproxyDefaultLabel: 'CLIProxy 默认:', cliproxyDefaultDesc: '如果你想让普通的 codex 走 CLIProxy,请设置 model_provider = "cliproxy",并加入下面的配方。', @@ -4477,7 +4478,7 @@ const resources = { missing: '缺失', cliproxyNativeCodex: '由 CLIProxy 支持的原生 Codex', builtInLabel: '内置:', - builtInCcsxpDesc: '使用 ccsxp 作为 CCS 提供商快捷方式。', + builtInCcsxpDesc: '使用 ccsxp 通过 cliproxy provider 快捷方式启动原生 Codex。', nativeRecipeLabel: '原生:', nativeRecipeDesc: '按下面的配方配置,即可让 codex 直接走 CLIProxy。', saveProviderNamedCliproxy: @@ -4485,7 +4486,7 @@ const resources = { inTopLevelSetDefault: '在顶层设置中,将 Default provider 设为 cliproxy。', exportCliproxyApiKey: '在启动原生 Codex 之前,在 shell 中导出 CLIPROXY_API_KEY。', noConfigOverrides: - '这个 Codex 版本仍然可以走原生路径,但在检测到的二进制支持 --config 覆盖之前,ccsxp 或 ccs codex --target codex 这样的 CCS 路由不可用。', + '这个 Codex 版本仍然可以走纯原生路径,但在检测到的二进制支持 --config 覆盖之前,ccsxp 和显式的 CCS 托管 Codex 桥接都不可用。', configFile: '配置文件', path: '路径', resolved: '已解析', @@ -6993,7 +6994,7 @@ const resources = { nativeConfigDesc: 'ccs-codex và ccsx khởi chạy Codex gốc bằng các mặc định bạn đã lưu.', transientOverridesLabel: 'Ghi đè tạm thời:', transientOverridesDesc: - 'ccsxp (hoặc ccs codex --target codex) dùng đường tắt nhà cung cấp CCS.', + 'ccsxp vẫn chạy Codex gốc và chỉ thêm ghi đè provider cliproxy; ccs codex --target codex vẫn là cầu nối CCS được quản lý rõ ràng.', cliproxyDefaultLabel: 'Mặc định CLIProxy:', cliproxyDefaultDesc: 'Để lệnh codex thông thường đi qua CLIProxy, hãy đặt model_provider = "cliproxy" và dùng công thức bên dưới.', @@ -7011,14 +7012,14 @@ const resources = { missing: 'Thiếu', cliproxyNativeCodex: 'Codex gốc dùng CLIProxy', builtInLabel: 'Tích hợp:', - builtInCcsxpDesc: 'Dùng ccsxp cho lối tắt nhà cung cấp CCS.', + builtInCcsxpDesc: 'Dùng ccsxp để chạy Codex gốc với lối tắt provider cliproxy.', nativeRecipeLabel: 'Gốc:', nativeRecipeDesc: 'Cấu hình công thức bên dưới để dùng CLIProxy trực tiếp với codex.', saveProviderNamedCliproxy: 'Lưu một provider tên cliproxy với base URL và env key ở trên.', inTopLevelSetDefault: 'Trong Top-level settings, đặt Default provider là cliproxy.', exportCliproxyApiKey: 'Xuất CLIPROXY_API_KEY trong shell trước khi chạy Codex gốc.', noConfigOverrides: - 'Bản Codex này vẫn có thể dùng đường gốc, nhưng định tuyến Codex qua CCS như ccsxp hoặc ccs codex --target codex sẽ không hoạt động cho đến khi binary hỗ trợ ghi đè --config.', + 'Bản Codex này vẫn có thể dùng đường gốc thuần, nhưng ccsxp và cầu nối Codex do CCS quản lý rõ ràng sẽ chưa dùng được cho đến khi binary hỗ trợ ghi đè --config.', configFile: 'Tệp cấu hình', path: 'Đường dẫn', resolved: 'Đã phân giải', @@ -9287,7 +9288,7 @@ const resources = { nativeConfigDesc: 'ccs-codex と ccsx は保存済みデフォルトでネイティブ Codex を起動します。', transientOverridesLabel: '一時オーバーライド:', transientOverridesDesc: - 'ccsxp(または ccs codex --target codex)は CCS プロバイダーのショートカットを使います。', + 'ccsxp はネイティブ Codex のまま cliproxy プロバイダー上書きだけを追加し、ccs codex --target codex は明示的な CCS 管理ブリッジのままです。', cliproxyDefaultLabel: 'CLIProxy デフォルト:', cliproxyDefaultDesc: '通常の codex を CLIProxy 経由にするには、model_provider = "cliproxy" を設定し、下のレシピを追加します。', @@ -9305,7 +9306,8 @@ const resources = { missing: '不足', cliproxyNativeCodex: 'CLIProxy 経由のネイティブ Codex', builtInLabel: '内蔵:', - builtInCcsxpDesc: 'CCS プロバイダーショートカットとして ccsxp を使用します。', + builtInCcsxpDesc: + 'ccsxp を使うと、cliproxy プロバイダーショートカット付きでネイティブ Codex を起動します。', nativeRecipeLabel: 'ネイティブ:', nativeRecipeDesc: '下のレシピを設定すると codex を直接 CLIProxy 経由で利用できます。', saveProviderNamedCliproxy: @@ -9314,7 +9316,7 @@ const resources = { exportCliproxyApiKey: 'ネイティブ Codex を起動する前に shell で CLIPROXY_API_KEY を export してください。', noConfigOverrides: - 'この Codex ビルドでもネイティブパスは使えますが、ccsxp や ccs codex --target codex などの CCS 側ルーティングは、検出された Codex バイナリが --config オーバーライドに対応するまで利用できません。', + 'この Codex ビルドでも純粋なネイティブパスは使えますが、検出された Codex バイナリが --config オーバーライドに対応するまで、ccsxp と明示的な CCS 管理 Codex ブリッジは利用できません。', configFile: '設定ファイル', path: 'パス', resolved: '解決先', diff --git a/ui/src/lib/support-updates-catalog.ts b/ui/src/lib/support-updates-catalog.ts index e52be324..0be97bf0 100644 --- a/ui/src/lib/support-updates-catalog.ts +++ b/ui/src/lib/support-updates-catalog.ts @@ -70,8 +70,8 @@ const BASE_SUPPORT_NOTICES: SupportNotice[] = [ entryIds: ['codex-target', 'codex-cliproxy'], highlights: [ 'Use ccs-codex or ccsx for native Codex runs.', - 'Use ccsxp for the built-in CCS Codex provider shortcut on native Codex.', - 'Built-in Codex and Codex bridge profiles can run on native Codex with --target codex.', + 'Use ccsxp for native Codex with the cliproxy provider shortcut.', + 'Use ccs codex --target codex when you want the explicit CCS-managed Codex bridge.', 'Saved default targets for API profiles and variants can now be claude, droid, or codex.', ], actions: [ @@ -84,8 +84,8 @@ const BASE_SUPPORT_NOTICES: SupportNotice[] = [ }, { id: 'copy-codex-provider-command', - label: 'Run built-in Codex on Codex', - description: 'Use the built-in Codex provider shortcut on native Codex.', + label: 'Run native Codex with cliproxy', + description: 'Use the native Codex cliproxy shortcut through CCS.', type: 'command', command: 'ccsxp "your prompt"', }, @@ -283,7 +283,7 @@ const BASE_CLI_SUPPORT_ENTRIES: CliSupportEntry[] = [ 'ccs api create codex-api --cliproxy-provider codex', ], notes: - 'Use ccsxp when you want the built-in Codex provider on native Codex without retyping --target codex.', + 'Use ccsxp when you want native Codex with the cliproxy shortcut; use ccs codex --target codex for the explicit managed bridge.', }, { id: 'gemini-cliproxy',