feat(vscode): codex 命令统一组装,模型/思考级别可在设置面板配置

新增 cc/codexCommand.ts 作为 codex 调用的唯一出口(buildCodexArgs /
buildCodexCommandString),把 exec-review / resume / interactive 三种形态
的 flag 拼装收敛到一处;模型与思考级别作为自由文本项写入全局设置并贯穿
webview 消息通道,空值则不传 -c,沿用 codex config.toml 默认。
This commit is contained in:
2026-07-13 06:43:58 +08:00
parent aff99c57f3
commit 5188c23765
11 changed files with 225 additions and 12 deletions
@@ -32,6 +32,8 @@ interface SubmitValues {
implTabPreCreateScript: string
implTabPostCloseScript: string
conflictResolutionProfilePath: string
codexModel: string
codexReasoningEffort: string
youtrackBaseUrl: string
youtrackProjectShortName: string
youtrackCloseCommand: string
@@ -72,6 +74,8 @@ export interface SettingsModalProps {
initialImplTabPreCreateScript: string
initialImplTabPostCloseScript: string
initialConflictResolutionProfilePath: string
initialCodexModel: string
initialCodexReasoningEffort: string
initialYoutrackBaseUrl: string
initialYoutrackProjectShortName: string
initialYoutrackCloseCommand: string
@@ -146,6 +150,8 @@ export function SettingsModal({
initialImplTabPreCreateScript,
initialImplTabPostCloseScript,
initialConflictResolutionProfilePath,
initialCodexModel,
initialCodexReasoningEffort,
initialYoutrackBaseUrl,
initialYoutrackProjectShortName,
initialYoutrackCloseCommand,
@@ -174,6 +180,8 @@ export function SettingsModal({
const [implTabPreCreateScript, setImplTabPreCreateScript] = useState(initialImplTabPreCreateScript)
const [implTabPostCloseScript, setImplTabPostCloseScript] = useState(initialImplTabPostCloseScript)
const [conflictResolutionProfilePath, setConflictResolutionProfilePath] = useState(initialConflictResolutionProfilePath)
const [codexModel, setCodexModel] = useState(initialCodexModel)
const [codexReasoningEffort, setCodexReasoningEffort] = useState(initialCodexReasoningEffort)
const [youtrackBaseUrl, setYoutrackBaseUrl] = useState(initialYoutrackBaseUrl)
const [youtrackProjectShortName, setYoutrackProjectShortName] = useState(initialYoutrackProjectShortName)
const [youtrackCloseCommand, setYoutrackCloseCommand] = useState(initialYoutrackCloseCommand)
@@ -204,6 +212,8 @@ export function SettingsModal({
setImplTabPreCreateScript(initialImplTabPreCreateScript)
setImplTabPostCloseScript(initialImplTabPostCloseScript)
setConflictResolutionProfilePath(initialConflictResolutionProfilePath)
setCodexModel(initialCodexModel)
setCodexReasoningEffort(initialCodexReasoningEffort)
setYoutrackBaseUrl(initialYoutrackBaseUrl)
setYoutrackProjectShortName(initialYoutrackProjectShortName)
setYoutrackCloseCommand(initialYoutrackCloseCommand)
@@ -287,6 +297,9 @@ export function SettingsModal({
implTabPostCloseScript: implTabPostCloseScript.trim(),
// 冲突解决 profile:空串 = 用 DEFAULT_PROFILE_PATH
conflictResolutionProfilePath: conflictResolutionProfilePath.trim(),
// codex 模型 / 思考级别:trim 后留空 = 用 codex config.toml 默认
codexModel: codexModel.trim(),
codexReasoningEffort: codexReasoningEffort.trim(),
youtrackBaseUrl: youtrackBaseUrl.trim(),
youtrackProjectShortName: youtrackProjectShortName.trim(),
youtrackCloseCommand: youtrackCloseCommand.trim(),
@@ -463,6 +476,49 @@ export function SettingsModal({
)}
</select>
</Field>
<Field
label="codex 模型"
hint={(
<>
使 codex
<code>-c model=</code>
codex
{' '}
<code>config.toml</code>
{' '}
</>
)}
>
<input
type="text"
value={codexModel}
onChange={e => setCodexModel(e.target.value)}
placeholder="留空用 codex 默认(如 gpt-5.6-sol"
className={inputClass}
/>
</Field>
<Field
label="codex 思考级别"
hint={(
<>
{' '}
<code>model_reasoning_effort</code>
codex
</>
)}
>
<input
type="text"
value={codexReasoningEffort}
onChange={e => setCodexReasoningEffort(e.target.value)}
placeholder="留空用 codex 默认(minimal/low/medium/high/xhigh"
className={inputClass}
/>
</Field>
</>
)}