refactor(frontend): merge Codex image bridge and tool policy into one four-state control

Replace the two adjacent account-level controls (3-state injection bridge
+ 2-state explicit tool policy) in EditAccountModal with a single
four-state selector: follow channel / force inject / no injection /
block all. The four states map onto the existing extra keys
(codex_image_generation_bridge, codex_image_generation_explicit_tool_policy)
with no backend change; strip already disables the bridge upstream, so
the effective decision space is exactly these four states.

- load: strip takes precedence and reads as "block all"; legacy
  bridge_enabled key still recognized and cleaned up on save
- save: block writes policy=strip and drops the bridge override;
  inherit clears both keys
- semantic accent colors per state (sky/emerald/amber/rose) with dark
  mode support; state badge follows the same palette
- replace account-scope i18n keys in zh/en (channel-scope keys untouched)
- rewrite specs to cover all four states (25/25 passing)
This commit is contained in:
shaw
2026-07-04 09:49:37 +08:00
parent dfdb838ce4
commit be297b90ce
4 changed files with 126 additions and 159 deletions
+15 -19
View File
@@ -3557,25 +3557,21 @@ export default {
codexCLIOnlyAppServer: 'Allow Codex app-server clients',
codexCLIOnlyAppServerDesc:
"Effective only when the switch above is on. When enabled, this account also allows third-party clients that embed the Codex engine over the app-server protocol (e.g. Claude Code's codex plugin); they still pass the global engine-fingerprint gate. OR-combined with the global app-server toggle.",
codexImageGenerationBridge: 'Codex image-generation bridge',
codexImageGenerationBridgeDesc:
'Account policy takes precedence over channel and global settings. Only controls whether Codex requests through the /responses text endpoint receive the image_generation tool; standalone image-generation endpoints are unaffected.',
codexImageGenerationBridgeInherit: 'Follow channel',
codexImageGenerationBridgeInheritDesc: 'Do not write an account override; use the channel or global policy.',
codexImageGenerationBridgeEnabled: 'Force on',
codexImageGenerationBridgeEnabledDesc: 'Allow image tool injection for Codex /responses requests.',
codexImageGenerationBridgeDisabled: 'Force off',
codexImageGenerationBridgeDisabledDesc: 'Block image tool injection for Codex /responses requests.',
codexImageGenerationBridgeBadgeInherit: 'Channel policy',
codexImageGenerationBridgeBadgeEnabled: 'Account on',
codexImageGenerationBridgeBadgeDisabled: 'Account off',
codexImageToolPolicy: 'Codex image tool forwarding',
codexImageToolPolicyDesc:
'Only applies to client-provided image_generation tools in Codex /responses text requests; standalone image-generation endpoints are unaffected.',
codexImageToolPolicyAllow: 'Allow',
codexImageToolPolicyAllowDesc: 'Default behavior. Keep client-provided image_generation tools.',
codexImageToolPolicyStrip: 'Remove',
codexImageToolPolicyStripDesc: 'Delete image_generation tools and matching tool_choice before forwarding.',
codexImageTool: 'Codex image tool',
codexImageToolDesc:
'One policy for the image_generation tool on Codex /responses text requests: whether it is auto-injected, and whether client-provided tools pass through. Account policy takes precedence over channel and global settings; standalone image-generation endpoints are unaffected.',
codexImageToolInherit: 'Follow channel',
codexImageToolInheritDesc: 'No account override; injection follows the channel or global policy, and client-provided image tools pass through.',
codexImageToolEnabled: 'Force inject',
codexImageToolEnabledDesc: 'Always inject the image tool for Codex /responses requests.',
codexImageToolDisabled: 'No injection',
codexImageToolDisabledDesc: 'Never auto-inject; client-provided image tools still pass through.',
codexImageToolBlock: 'Block all',
codexImageToolBlockDesc: 'No injection, and client-provided image tools plus matching tool_choice are removed.',
codexImageToolBadgeInherit: 'Channel policy',
codexImageToolBadgeEnabled: 'Force inject',
codexImageToolBadgeDisabled: 'No injection',
codexImageToolBadgeBlock: 'Blocked',
compactMode: 'Compact mode',
compactModeDesc:
'Controls how this account participates in /responses/compact routing. Auto follows probe results, Force On always allows, Force Off always excludes.',
+15 -18
View File
@@ -3730,24 +3730,21 @@ export default {
codexCLIOnlyDesc: '仅对 OpenAI OAuth 生效。开启后仅允许 Codex 官方客户端家族访问;关闭后完全绕过并保持原逻辑。',
codexCLIOnlyAppServer: '允许 Codex app-server 客户端',
codexCLIOnlyAppServerDesc: '仅在上方开关开启时生效。开启后本账号额外放行内嵌 Codex 引擎、经 app-server 协议接入的第三方客户端(如 Claude Code 的 codex 插件),仍需通过全局引擎指纹门;与全局 app-server 开关取 OR(任一开即放行)。',
codexImageGenerationBridge: 'Codex 图片生成桥接',
codexImageGenerationBridgeDesc:
'账号级策略优先于渠道和全局配置。仅控制 Codex 走 /responses 文本端点时是否注入 image_generation 工具;不影响独立图片生成接口。',
codexImageGenerationBridgeInherit: '跟随渠道',
codexImageGenerationBridgeInheritDesc: '不写入账号覆盖,继续使用渠道或全局策略。',
codexImageGenerationBridgeEnabled: '强制开启',
codexImageGenerationBridgeEnabledDesc: '允许 Codex /responses 请求获得图片工具注入。',
codexImageGenerationBridgeDisabled: '强制关闭',
codexImageGenerationBridgeDisabledDesc: '阻断 Codex /responses 的图片工具注入。',
codexImageGenerationBridgeBadgeInherit: '渠道策略',
codexImageGenerationBridgeBadgeEnabled: '账号开启',
codexImageGenerationBridgeBadgeDisabled: '账号关闭',
codexImageToolPolicy: 'Codex 图片工具传递策略',
codexImageToolPolicyDesc: '仅作用于 Codex /responses 文本端点中客户端显式携带的 image_generation tool;不影响独立图片生成接口。',
codexImageToolPolicyAllow: '放行',
codexImageToolPolicyAllowDesc: '默认行为,保留客户端显式发送的 image_generation tool。',
codexImageToolPolicyStrip: '移除',
codexImageToolPolicyStripDesc: '转发前删除 image_generation tool 和指向它的 tool_choice。',
codexImageTool: 'Codex 图片工具',
codexImageToolDesc:
'统一控制 Codex /responses 文本请求的 image_generation 图片工具:是否自动注入,以及客户端自带该工具时是否放行。账号级策略优先于渠道和全局配置,不影响独立图片生成接口。',
codexImageToolInherit: '跟随渠道',
codexImageToolInheritDesc: '不写入账号覆盖,是否注入由渠道或全局策略决定;客户端自带的图片工具照常放行。',
codexImageToolEnabled: '强制注入',
codexImageToolEnabledDesc: '始终为 Codex /responses 请求注入图片工具。',
codexImageToolDisabled: '关闭注入',
codexImageToolDisabledDesc: '不自动注入;客户端自带的图片工具仍会放行。',
codexImageToolBlock: '完全阻断',
codexImageToolBlockDesc: '不注入,并移除客户端自带的图片工具及指向它的 tool_choice。',
codexImageToolBadgeInherit: '渠道策略',
codexImageToolBadgeEnabled: '强制注入',
codexImageToolBadgeDisabled: '关闭注入',
codexImageToolBadgeBlock: '完全阻断',
compactMode: 'Compact 模式',
compactModeDesc:
'控制本账号在 /responses/compact 调度中的参与方式。Auto 跟随探测结果,Force On 强制允许,Force Off 强制排除。',