Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ export interface SubagentDelegationSectionProps {
onUltraModeSave: (patch: UltraModePatch) => void;
ultraLoadFailed: boolean;
onUltraModeRetry: () => void;
fallback: string[];
fallbackPollMs: number;
fallbackPollError?: string;
fallbackBusy: boolean;
availableModels: string[];
onFallbackChange: (models: string[]) => void;
onFallbackPollMsChange: (pollMs: number) => void;
onFallbackSave: () => void;
}

export default function SubagentDelegationSection({
Expand All @@ -44,6 +52,7 @@ export default function SubagentDelegationSection({
onUltraModeSave,
ultraLoadFailed,
onUltraModeRetry,
fallback, fallbackPollMs, fallbackPollError, fallbackBusy, availableModels, onFallbackChange, onFallbackPollMsChange, onFallbackSave,
}: SubagentDelegationSectionProps) {
const t = useT();
// A present empty/whitespace hint is an upstream override that suppresses the
Expand Down Expand Up @@ -97,6 +106,32 @@ export default function SubagentDelegationSection({
</div>
</div>

<div className="swi-delegation-row swi-fallback-editor">
<div className="setting-copy">
<div className="font-semibold">{t("sub.fallbackLabel")}</div>
<div className="muted setting-hint">{t("sub.fallbackHint")}</div>
</div>
<div className="swi-fallback-controls">
{fallback.map((modelName, index) => (
<div key={modelName} className="swi-fallback-row">
<span>{index + 1}. {modelName}</span>
<button type="button" className="btn btn-ghost btn-sm" onClick={() => { const next = [...fallback]; if (index > 0) [next[index - 1], next[index]] = [next[index], next[index - 1]]; onFallbackChange(next); }} disabled={fallbackBusy || index === 0} aria-label={t("sub.moveUp", { m: modelName })}>↑</button>
<button type="button" className="btn btn-ghost btn-sm" onClick={() => { const next = [...fallback]; if (index < next.length - 1) [next[index], next[index + 1]] = [next[index + 1], next[index]]; onFallbackChange(next); }} disabled={fallbackBusy || index === fallback.length - 1} aria-label={t("sub.moveDown", { m: modelName })}>↓</button>
<button type="button" className="btn btn-ghost btn-sm" onClick={() => onFallbackChange(fallback.filter(item => item !== modelName))} disabled={fallbackBusy} aria-label={t("sub.removeAria", { m: modelName })}>×</button>
</div>
))}
<select className="input" value="" onChange={e => { if (e.target.value && !fallback.includes(e.target.value)) onFallbackChange([...fallback, e.target.value]); }} disabled={fallbackBusy}>
<option value="">{t("sub.fallbackAdd")}</option>
{availableModels.filter(modelName => !fallback.includes(modelName)).map(modelName => <option key={modelName} value={modelName}>{modelName}</option>)}
</select>
<label className="setting-hint">{t("sub.fallbackPoll")}
<input className="input" type="number" min={5000} max={600000} step={1000} value={fallbackPollMs} onChange={e => onFallbackPollMsChange(Number(e.target.value))} disabled={fallbackBusy} aria-invalid={Boolean(fallbackPollError)} aria-describedby={fallbackPollError ? "subagent-fallback-poll-error" : undefined} /> {t("sub.fallbackPollUnit")}
</label>
{fallbackPollError && <div id="subagent-fallback-poll-error" className="muted setting-hint" role="alert">{fallbackPollError}</div>}
<button type="button" className="btn btn-primary btn-sm" onClick={onFallbackSave} disabled={fallbackBusy}>{t("common.save")}</button>
</div>
</div>

<div className="swi-delegation-row">
<div className="setting-copy">
<div className="font-semibold">{t("dash.syncCodexSubagentDefaults")}</div>
Expand Down
16 changes: 16 additions & 0 deletions gui/src/components/subagents-workspace/SubagentsWorkspace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ export interface SubagentsWorkspaceProps {
onToggle: (m: string) => void;
onMove: (i: number, dir: -1 | 1) => void;
onSave: () => void;
fallback: string[];
fallbackPollMs: number;
fallbackPollError?: string;
fallbackBusy: boolean;
onFallbackChange: (models: string[]) => void;
onFallbackPollMsChange: (pollMs: number) => void;
onFallbackSave: () => void;
delegation: {
model: string;
effort: string;
Expand All @@ -63,6 +70,7 @@ export default function SubagentsWorkspace({
onToggle,
onMove,
onSave,
fallback, fallbackPollMs, fallbackPollError, fallbackBusy, onFallbackChange, onFallbackPollMsChange, onFallbackSave,
delegation,
}: SubagentsWorkspaceProps) {
const t = useT();
Expand Down Expand Up @@ -237,6 +245,14 @@ export default function SubagentsWorkspace({
onUltraModeSave={delegation.onUltraModeSave}
ultraLoadFailed={delegation.ultraLoadFailed}
onUltraModeRetry={delegation.onUltraModeRetry}
fallback={fallback}
fallbackPollMs={fallbackPollMs}
fallbackPollError={fallbackPollError}
fallbackBusy={fallbackBusy}
availableModels={available}
onFallbackChange={onFallbackChange}
onFallbackPollMsChange={onFallbackPollMsChange}
onFallbackSave={onFallbackSave}
/>
</section>
</div>
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,14 @@ export const de: Record<TKey, string> = {
"sub.ultraModeLoadFail": "Ultra-Modus-Einstellungen konnten nicht geladen werden — läuft der Proxy?",
"sub.ultraModeSaveFail": "Ultra-Modus-Einstellungen konnten nicht gespeichert werden",
"sub.ultraModeSaved": "Ultra-Modus gespeichert. Gilt für neue Codex-Sitzungen.",
"sub.fallbackLabel": "Fallback-Kette für Sub-Agenten",
"sub.fallbackHint": "Geordnete Modelle, die versucht werden, wenn ein Sub-Agent-Modell nicht verfügbar ist oder fehlschlägt.",
"sub.fallbackAdd": "Fallback-Modell hinzufügen…",
"sub.fallbackPoll": "Intervall der Verfügbarkeitsprüfung",
"sub.fallbackPollUnit": "ms",
"sub.fallbackPollInvalid": "Geben Sie eine ganze Zahl von {min} bis {max} Millisekunden ein.",
"sub.fallbackSaved": "Fallback-Einstellungen für Sub-Agenten gespeichert.",
"sub.fallbackSaveFailed": "Fallback-Einstellungen konnten nicht gespeichert werden",
"logs.title": "Anfrage-Protokolle",
"logs.tabLogs": "Protokolle",
"logs.tabDebug": "Diagnose",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,14 @@ export const en = {
"dash.visionTimeout": "Timeout",
"dash.visionTimeoutInvalid": "Enter an integer from {min} to {max} milliseconds.",
"dash.visionAdvancedPopover": "Advanced vision settings",
"sub.fallbackLabel": "Sub-agent fallback chain",
"sub.fallbackHint": "Ordered models tried when a sub-agent model is unavailable or fails.",
"sub.fallbackAdd": "Add fallback model…",
"sub.fallbackPoll": "Availability check interval",
"sub.fallbackPollUnit": "ms",
"sub.fallbackPollInvalid": "Enter a whole number from {min} to {max} milliseconds.",
"sub.fallbackSaved": "Sub-agent fallback settings saved.",
"sub.fallbackSaveFailed": "Failed to save fallback settings",
"dash.shadowCallIntercept": "Shadow Call Intercept",
"dash.shadowCallInterceptHint": "Intercepts Codex App's background helper calls ({models}) for title generation and commit messages and redirects them to your chosen model.",
"dash.shadowCallWarning": "⚠ When enabled, ALL requests for {models} will be replaced with the selected model.",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,14 @@ export const fr: Record<TKey, string> = {
"dash.visionTimeout": "Délai d’expiration",
"dash.visionTimeoutInvalid": "Saisissez un entier compris entre {min} et {max} millisecondes.",
"dash.visionAdvancedPopover": "Paramètres de vision avancés",
"sub.fallbackLabel": "Chaîne de secours des sous-agents",
"sub.fallbackHint": "Modèles essayés dans l’ordre lorsqu’un modèle de sous-agent est indisponible ou échoue.",
"sub.fallbackAdd": "Ajouter un modèle de secours…",
"sub.fallbackPoll": "Intervalle de vérification de disponibilité",
"sub.fallbackPollUnit": "ms",
"sub.fallbackPollInvalid": "Saisissez un nombre entier compris entre {min} et {max} millisecondes.",
"sub.fallbackSaved": "Paramètres de secours des sous-agents enregistrés.",
"sub.fallbackSaveFailed": "Échec de l’enregistrement des paramètres de secours",
"dash.shadowCallIntercept": "Interception des appels fantômes",
"dash.shadowCallInterceptHint": "Intercepte les appels auxiliaires en arrière-plan de l’application Codex ({models}) pour générer les titres et les messages de commit, puis les redirige vers le modèle choisi.",
"dash.shadowCallWarning": "⚠ Lorsque cette option est activée, TOUTES les requêtes destinées à {models} sont remplacées par le modèle sélectionné.",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,14 @@ export const ja: Record<TKey, string> = {
"sub.ultraModeLoadFail": "ウルトラモード設定を読み込めませんでした — プロキシは実行中ですか?",
"sub.ultraModeSaveFail": "ウルトラモード設定の保存に失敗しました",
"sub.ultraModeSaved": "ウルトラモードを保存しました。新しい Codex セッションから適用されます。",
"sub.fallbackLabel": "サブエージェントのフォールバックチェーン",
"sub.fallbackHint": "サブエージェントモデルが利用できないか失敗した場合に順番に試すモデルです。",
"sub.fallbackAdd": "フォールバックモデルを追加…",
"sub.fallbackPoll": "利用可能性チェック間隔",
"sub.fallbackPollUnit": "ミリ秒",
"sub.fallbackPollInvalid": "{min} から {max} ミリ秒までの整数を入力してください。",
"sub.fallbackSaved": "サブエージェントのフォールバック設定を保存しました。",
"sub.fallbackSaveFailed": "フォールバック設定の保存に失敗しました",

// logs
"logs.title": "リクエストログ",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,14 @@ export const ko: Record<TKey, string> = {
"sub.ultraModeLoadFail": "울트라 모드 설정을 불러오지 못했습니다 — 프록시가 실행 중인가요?",
"sub.ultraModeSaveFail": "울트라 모드 설정 저장에 실패했습니다",
"sub.ultraModeSaved": "울트라 모드가 저장되었습니다. 새 Codex 세션부터 적용됩니다.",
"sub.fallbackLabel": "서브에이전트 폴백 체인",
"sub.fallbackHint": "서브에이전트 모델을 사용할 수 없거나 실패할 때 순서대로 시도할 모델입니다.",
"sub.fallbackAdd": "폴백 모델 추가…",
"sub.fallbackPoll": "가용성 확인 간격",
"sub.fallbackPollUnit": "밀리초",
"sub.fallbackPollInvalid": "{min}에서 {max} 밀리초 사이의 정수를 입력하세요.",
"sub.fallbackSaved": "서브에이전트 폴백 설정을 저장했습니다.",
"sub.fallbackSaveFailed": "폴백 설정을 저장하지 못했습니다",

// logs
"logs.title": "요청 로그",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,14 @@ export const ru: Record<TKey, string> = {
"sub.ultraModeLoadFail": "Не удалось загрузить настройки ультра-режима — работает ли прокси?",
"sub.ultraModeSaveFail": "Не удалось сохранить настройки ультра-режима",
"sub.ultraModeSaved": "Ультра-режим сохранён. Применяется к новым сеансам Codex.",
"sub.fallbackLabel": "Цепочка резервных моделей субагента",
"sub.fallbackHint": "Модели, которые последовательно пробуются, если модель субагента недоступна или завершается ошибкой.",
"sub.fallbackAdd": "Добавить резервную модель…",
"sub.fallbackPoll": "Интервал проверки доступности",
"sub.fallbackPollUnit": "мс",
"sub.fallbackPollInvalid": "Введите целое число от {min} до {max} миллисекунд.",
"sub.fallbackSaved": "Настройки резервных моделей субагента сохранены.",
"sub.fallbackSaveFailed": "Не удалось сохранить настройки резервных моделей",

// logs
"logs.title": "Журнал запросов",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/tr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,14 @@ export const tr: Record<TKey, string> = {
"sub.ultraModeLoadFail": "Ultra modu ayarları yüklenemedi — proxy çalışıyor mu?",
"sub.ultraModeSaveFail": "Ultra modu ayarları kaydedilemedi",
"sub.ultraModeSaved": "Ultra modu kaydedildi. Yeni Codex oturumlarına uygulanır.",
"sub.fallbackLabel": "Alt ajan yedek zinciri",
"sub.fallbackHint": "Alt ajan modeli kullanılamadığında veya başarısız olduğunda sırayla denenecek modeller.",
"sub.fallbackAdd": "Yedek model ekle…",
"sub.fallbackPoll": "Kullanılabilirlik kontrol aralığı",
"sub.fallbackPollUnit": "ms",
"sub.fallbackPollInvalid": "{min} ile {max} milisaniye arasında tam sayı girin.",
"sub.fallbackSaved": "Alt ajan yedek ayarları kaydedildi.",
"sub.fallbackSaveFailed": "Yedek ayarlar kaydedilemedi",

// logs
"logs.title": "İstek Günlükleri",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/zh-TW.ts
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,14 @@ export const zhTW: Record<TKey, string> = {
"sub.ultraModeLoadFail": "無法載入超級模式設定 — 代理是否在執行?",
"sub.ultraModeSaveFail": "儲存超級模式設定失敗",
"sub.ultraModeSaved": "超級模式已儲存。適用於新的 Codex 會話。",
"sub.fallbackLabel": "子代理備援鏈",
"sub.fallbackHint": "子代理模型無法使用或失敗時,依序嘗試的模型。",
"sub.fallbackAdd": "新增備援模型…",
"sub.fallbackPoll": "可用性檢查間隔",
"sub.fallbackPollUnit": "毫秒",
"sub.fallbackPollInvalid": "請輸入介於 {min} 與 {max} 毫秒之間的整數。",
"sub.fallbackSaved": "子代理備援設定已儲存。",
"sub.fallbackSaveFailed": "備援設定儲存失敗",
"logs.title": "請求日誌",
"logs.tabLogs": "日誌",
"logs.tabDebug": "除錯",
Expand Down
8 changes: 8 additions & 0 deletions gui/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,14 @@ export const zh: Record<TKey, string> = {
"sub.ultraModeLoadFail": "无法加载超级模式设置 — 代理是否在运行?",
"sub.ultraModeSaveFail": "保存超级模式设置失败",
"sub.ultraModeSaved": "超级模式已保存。适用于新的 Codex 会话。",
"sub.fallbackLabel": "子代理回退链",
"sub.fallbackHint": "子代理模型不可用或失败时按顺序尝试的模型。",
"sub.fallbackAdd": "添加回退模型…",
"sub.fallbackPoll": "可用性检查间隔",
"sub.fallbackPollUnit": "毫秒",
"sub.fallbackPollInvalid": "请输入 {min} 到 {max} 毫秒之间的整数。",
"sub.fallbackSaved": "子代理回退设置已保存。",
"sub.fallbackSaveFailed": "保存回退设置失败",

// logs
"logs.title": "请求日志",
Expand Down
Loading
Loading