From 5d57a3884238de098f5f211e770ea1d93310ea35 Mon Sep 17 00:00:00 2001 From: gubin-dev Date: Thu, 8 Oct 2026 21:37:34 +0300 Subject: [PATCH] feat(codex): add opt-in WebSocket settings UI (#1963) --- webview-ui/playwright/roo-code-types.ts | 1 + webview-ui/playwright/vite.config.ts | 1 + .../SettingsView.unsaved-changes.spec.tsx | 40 ++++++++++++++++++ .../settings/providers/OpenAICodex.tsx | 5 +++ .../providers/OpenAICodexWebSocketToggle.tsx | 25 +++++++++++ .../providers/__tests__/OpenAICodex.spec.tsx | 24 +++++++++++ .../__tests__/OpenAICodex.visual.fixture.tsx | 6 +++ .../__tests__/OpenAICodex.visual.tsx | 8 +++- ...penai-codex-speed-selector-states-dark.png | Bin 7318 -> 19690 bytes ...enai-codex-speed-selector-states-light.png | Bin 7347 -> 20202 bytes webview-ui/src/i18n/locales/ca/settings.json | 4 ++ webview-ui/src/i18n/locales/de/settings.json | 4 ++ webview-ui/src/i18n/locales/en/settings.json | 4 ++ webview-ui/src/i18n/locales/es/settings.json | 4 ++ webview-ui/src/i18n/locales/fr/settings.json | 4 ++ webview-ui/src/i18n/locales/hi/settings.json | 4 ++ webview-ui/src/i18n/locales/id/settings.json | 4 ++ webview-ui/src/i18n/locales/it/settings.json | 4 ++ webview-ui/src/i18n/locales/ja/settings.json | 4 ++ webview-ui/src/i18n/locales/ko/settings.json | 4 ++ webview-ui/src/i18n/locales/nl/settings.json | 4 ++ webview-ui/src/i18n/locales/pl/settings.json | 4 ++ .../src/i18n/locales/pt-BR/settings.json | 4 ++ webview-ui/src/i18n/locales/ru/settings.json | 4 ++ webview-ui/src/i18n/locales/tr/settings.json | 4 ++ webview-ui/src/i18n/locales/vi/settings.json | 4 ++ .../src/i18n/locales/zh-CN/settings.json | 4 ++ .../src/i18n/locales/zh-TW/settings.json | 4 ++ 28 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 webview-ui/src/components/settings/providers/OpenAICodexWebSocketToggle.tsx diff --git a/webview-ui/playwright/roo-code-types.ts b/webview-ui/playwright/roo-code-types.ts index 5d0c0bbf15..3748a0b09c 100644 --- a/webview-ui/playwright/roo-code-types.ts +++ b/webview-ui/playwright/roo-code-types.ts @@ -1,4 +1,5 @@ export { DEFAULT_MODES } from "../../packages/types/src/mode" +export { DEFAULT_OPEN_AI_CODEX_USE_WEBSOCKET } from "../../packages/types/src/provider-settings/openai-codex" export const DEFAULT_AUTO_CLOSE_ZOO_OPENED_FILES = false export const DEFAULT_AUTO_CLOSE_ZOO_OPENED_FILES_AFTER_USER_EDITED = false diff --git a/webview-ui/playwright/vite.config.ts b/webview-ui/playwright/vite.config.ts index 6a25d792f5..01a0b4b548 100644 --- a/webview-ui/playwright/vite.config.ts +++ b/webview-ui/playwright/vite.config.ts @@ -13,6 +13,7 @@ const rooCodeTypesShimImporters = [ "/webview-ui/src/components/chat/CodeIndexPopover.tsx", "/webview-ui/src/components/chat/ModeSelector.tsx", "/webview-ui/src/components/settings/UISettings.tsx", + "/webview-ui/src/components/settings/providers/OpenAICodexWebSocketToggle.tsx", ] export default defineConfig({ diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx index 575da5a833..1a02f5750a 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.unsaved-changes.spec.tsx @@ -8,6 +8,7 @@ import React from "react" import SettingsView from "../SettingsView" import { vscode } from "@src/utils/vscode" +import { OpenAICodexWebSocketToggle } from "../providers/OpenAICodexWebSocketToggle" const postMessage = vi.spyOn(vscode, "postMessage").mockImplementation(() => {}) @@ -684,6 +685,45 @@ describe("SettingsView - Unsaved Changes Detection", () => { }) }) + it.each([true, false, undefined])( + "buffers Codex WebSocket edits from %s until Save despite a live refresh", + async (enabled) => { + const configuration: ProviderSettings = { + apiProvider: providerIdentifiers.openaiCodex, + apiModelId: "gpt-5.6-sol", + openAiCodexUseWebSocket: enabled, + } + vi.mocked(useExtensionState, { partial: true }).mockReturnValue({ + ...defaultExtensionState, + apiConfiguration: configuration, + }) + vi.mocked(ApiOptions).mockImplementation(({ apiConfiguration, setApiConfigurationField }) => ( + setApiConfigurationField("openAiCodexUseWebSocket", value)} + /> + )) + const view = renderWithExtensionState(, { queryClient }) + fireEvent.click(await screen.findByRole("checkbox", { name: "settings:openAiCodexWebSocket.label" })) + vi.mocked(useExtensionState, { partial: true }).mockReturnValue({ + ...defaultExtensionState, + apiConfiguration: { ...configuration }, + }) + view.rerender() + const checkbox = screen.getByRole("checkbox", { name: "settings:openAiCodexWebSocket.label" }) + if (enabled) expect(checkbox).not.toBeChecked() + else expect(checkbox).toBeChecked() + expect(configuration.openAiCodexUseWebSocket).toBe(enabled) + expect(postMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "upsertApiConfiguration" })) + fireEvent.click(screen.getByTestId("save-button")) + expect(postMessage).toHaveBeenCalledWith({ + type: "upsertApiConfiguration", + text: "default", + apiConfiguration: { ...configuration, openAiCodexUseWebSocket: !enabled }, + }) + }, + ) + it("keeps OpenAI-compatible reasoning edits cached until Save despite a live state refresh", async () => { const configuration: ProviderSettings = { apiProvider: providerIdentifiers.openai, diff --git a/webview-ui/src/components/settings/providers/OpenAICodex.tsx b/webview-ui/src/components/settings/providers/OpenAICodex.tsx index ee2abf0e2b..26ed874817 100644 --- a/webview-ui/src/components/settings/providers/OpenAICodex.tsx +++ b/webview-ui/src/components/settings/providers/OpenAICodex.tsx @@ -14,6 +14,7 @@ import { vscode } from "@src/utils/vscode" import { ModelPicker } from "../ModelPicker" import { OpenAICodexRateLimitDashboard } from "./OpenAICodexRateLimitDashboard" import { OpenAICodexSpeedSelector } from "./OpenAICodexSpeedSelector" +import { OpenAICodexWebSocketToggle } from "./OpenAICodexWebSocketToggle" interface OpenAICodexProps { apiConfiguration: ProviderSettings @@ -77,6 +78,10 @@ export const OpenAICodex: React.FC = ({ value={apiConfiguration[OPEN_AI_CODEX_SERVICE_TIER_KEY]} onValueChange={(value) => setApiConfigurationField(OPEN_AI_CODEX_SERVICE_TIER_KEY, value)} /> + setApiConfigurationField("openAiCodexUseWebSocket", value)} + /> ) } diff --git a/webview-ui/src/components/settings/providers/OpenAICodexWebSocketToggle.tsx b/webview-ui/src/components/settings/providers/OpenAICodexWebSocketToggle.tsx new file mode 100644 index 0000000000..8e985774da --- /dev/null +++ b/webview-ui/src/components/settings/providers/OpenAICodexWebSocketToggle.tsx @@ -0,0 +1,25 @@ +import { Checkbox } from "vscrui" +import { DEFAULT_OPEN_AI_CODEX_USE_WEBSOCKET } from "@roo-code/types" + +import { useAppTranslation } from "@src/i18n/TranslationContext" + +interface OpenAICodexWebSocketToggleProps { + value?: boolean + onChange: (enabled: boolean) => void +} + +export function OpenAICodexWebSocketToggle({ value, onChange }: OpenAICodexWebSocketToggleProps) { + const { t } = useAppTranslation() + return ( +
+ onChange(checked === true)}> + {t("settings:openAiCodexWebSocket.label")} + +

+ {t("settings:openAiCodexWebSocket.description")} +

+
+ ) +} diff --git a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.spec.tsx b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.spec.tsx index d73120ada3..4a82a1a4c8 100644 --- a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.spec.tsx +++ b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.spec.tsx @@ -17,6 +17,7 @@ vi.mock("@src/i18n/TranslationContext", () => ({ t: (key: string) => ({ "settings:openAiCodexSpeed.label": "Speed", + "settings:openAiCodexWebSocket.label": "Use WebSocket", "settings:openAiCodexSpeed.tooltip": "Fast uses Codex priority processing for about 1.5x speed and consumes more subscription quota.", "settings:openAiCodexSpeed.standard": "Standard", @@ -95,3 +96,26 @@ describe("OpenAICodex speed selector", () => { expect(postMessage).not.toHaveBeenCalled() }) }) + +describe("OpenAICodex WebSocket preference", () => { + it.each([undefined, false, true])( + "renders saved preference %s and edits through the cached settings callback", + (enabled) => { + const setApiConfigurationField = vi.fn() + const configuration: ProviderSettings = { + apiProvider: providerIdentifiers.openaiCodex, + openAiCodexUseWebSocket: enabled, + } + render() + const checkbox = screen.getByRole("checkbox", { name: "Use WebSocket" }) + if (enabled) expect(checkbox).toBeChecked() + else expect(checkbox).not.toBeChecked() + fireEvent.click(checkbox) + expect(setApiConfigurationField).toHaveBeenLastCalledWith("openAiCodexUseWebSocket", !enabled) + expect(configuration.openAiCodexUseWebSocket).toBe(enabled) + expect(vscode.postMessage).not.toHaveBeenCalledWith( + expect.objectContaining({ type: "upsertApiConfiguration" }), + ) + }, + ) +}) diff --git a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.fixture.tsx b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.fixture.tsx index 2061f00614..2030599d3e 100644 --- a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.fixture.tsx +++ b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.fixture.tsx @@ -6,9 +6,13 @@ import { OpenAiCodexServiceTier } from "@roo-code/types/model" import { TranslationContext } from "@src/i18n/TranslationContext" import { TooltipProvider } from "@src/components/ui/tooltip" import { OpenAICodexSpeedSelector } from "../OpenAICodexSpeedSelector" +import { OpenAICodexWebSocketToggle } from "../OpenAICodexWebSocketToggle" const translations: Record = { "settings:common.select": "Select", + "settings:openAiCodexWebSocket.label": "Use WebSocket", + "settings:openAiCodexWebSocket.description": + "Keeps the ChatGPT connection open between requests. Uses HTTP if a WebSocket connection cannot be established.", "settings:openAiCodexSpeed.label": "Speed", "settings:openAiCodexSpeed.tooltip": "Fast uses Codex priority processing for about 1.5x speed and consumes more subscription quota.", @@ -25,7 +29,9 @@ export const OpenAICodexFixture = () => (
{}} /> + {}} /> {}} /> + {}} />
diff --git a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.tsx b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.tsx index a0fcafdf93..30d3912264 100644 --- a/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.tsx +++ b/webview-ui/src/components/settings/providers/__tests__/OpenAICodex.visual.tsx @@ -21,7 +21,9 @@ const themes = [ ] as const for (const theme of themes) { - test(`renders both OpenAI Codex speeds in the VS Code ${theme.name} theme`, async ({ mount }) => { + test(`renders OpenAI Codex speed and WebSocket preferences in the VS Code ${theme.name} theme`, async ({ + mount, + }) => { const component = mountedStory(await mount("openai-codex")) const selectors = component.getByTestId("openai-codex-service-tier") const comboboxes = component.getByRole("combobox", { name: "Speed" }) @@ -29,6 +31,10 @@ for (const theme of themes) { await expect(selectors).toHaveCount(2) await expect(comboboxes).toHaveCount(2) + const checkboxes = component.getByRole("checkbox", { name: "Use WebSocket" }) + await expect(checkboxes).toHaveCount(2) + await expect(checkboxes.first()).not.toBeChecked() + await expect(checkboxes.last()).toBeChecked() await selector.evaluate((element, { bodyClass, themeId }) => { const { document } = element.ownerDocument.defaultView! diff --git a/webview-ui/src/components/settings/providers/__tests__/__screenshots__/openai-codex-speed-selector-states-dark.png b/webview-ui/src/components/settings/providers/__tests__/__screenshots__/openai-codex-speed-selector-states-dark.png index a168e8656ee47ef0fa9b624d78520e78d348ffdf..1c03f9c4275f234cab35ab0ca53722b069e6d7e9 100644 GIT binary patch literal 19690 zcmcJ%WmI0#mMutdcMa|m+%34fOMqa(f(3U7?oMzg1W0gq2@b&m3GVLh_BQv9>K^^N ztLxUQs*I5z*g5Chd#}0HnscrbuA(H3g7_K{0s;a>Rz^Y%0^-#Q_)i263BD7zb&?AK zfes-nA*$h?d64Cmsr={Zc{WR$Z|D>nb_Bl~(Kzrq&b)lD?`y}l4<6If#|3`@d-(`iOKViTU!;r3r&}tBQ^l546%0qL&8LfyR`u7ymOQ0n7zaNhk%W1tirrgK zEb=BI-yIvrQc@K=HXpK#E@DkpBNqq!QN(}lk0=ygQMI}UH-2ME@B34%!_EKm!#5J8 zxi%)_%RQ#ST`5)U%>?q&+%{F}YO%np(}t;mg*K1HzQdNp1T{tH-UzO8oAE~9=&;4% zEtc70hBCS#YB4%U#iXal`~IGupx|I)0oQ}WhGik|o614;C7ASt`sbYGR3)H7YEZV#;WQa<~n)mvO11kanitFy#I;B%>*I8}&&f(x z8iz$h*&$D*TA|$O>1m;S3XP&)Y;@^Ft(C%B^{v2@#`cLCO7q+CB}Rhh(?0BBbEWwz zPsz2nW$9Y8t(LL;{MeH8J3%I*_Ve|&Hz%uyb9Letw{BelFuS|YMWL3=uOI(t8xr$7 z?=)>^uTP2vBfh;qsM#LNA?5lwHJC^nibAM0@RL~Qs|-ed+*vA{>E3jOVf6>uZFS1w zzuzq}d1#*c>l~QP&L6_Dw(XT}W2Gr=ulp9inUqz>gIz1k#flJFpA<;~%g<~46Z)c7 z^M@8D2?2rZKm^X4tzT(QYdzt~OnThbf02hh?=E)xV@Y%PT|R1PXta4=KEQI@&T&#x z!#HdoC(*0N*@L^9nB=P^s*l}32lw~XeZ;|A-=7!|%+4Ijf;k(e2S@W+l1?r;E$y~M z@^r0Nz0SD%!5ziAm%l z;W2w(9q5|sPD;lR@%h|wRtq?8$Sh+sXcVvTuyS)>3C~7+GGjcyIsH|P$fioeH}XL} zI~8%_*{uj14Ei1D!!;4T`C6;VCMS#986CqW)3HzeF~n!|E#ACI;4#C7P1gIO5fBg# zpiPJg32tF91(=J%;ahxHi}{l-tL-xM?8 z3Ep~MOezbHFjKUfdruyan&X5Cd-jB3l$4a{)!WS0Sj6sE?Y3ZH#w;)9YnClWK0Qjt zI1M6jSllhBwrWLcX~tA!WEbC+f)Eth>7eTAh$@V#m_<$Fb285n@?ni|pg3OcSias$ z=dwPUs~e6F5QyWHPog7V9y^zIw=vxhWvICfWr)bvzuVYUZj;RIh4bk;c`Uh3UJMUa zr@Say0zXRMC={vD3tPSgtH6qf|CUi!HK_v<=BSbiL~944C&|BySR0!qVi>rRk+@9y zjjVXLPBP#(hk7>`nw-+o(g+9$ij;FkYgs)cmf$(x>3>roaK3%GJ@?c3T2yq;7q9dJ zLzIk+3Zn`!5fN*z3xzx{=)T)JDmG^BW)jLJGZGLI%4etY3}Ee*{ss$Rh*+iAo5cNB zKvv}=ADuAI#!vta+~#n~He~nG3&JMrP=-q~p^^xu5(aW|zZ-veBtj;azsD!};C_ifFsLi#6!Z3Zo_`cCJg zSpw6gx|85s|EOrcTj>fk=>QoE8uc%gSkPzQpTj9Ev6SSWG)1{7DJcUV2W7^=fi-hj zqUaX@!TzqnE-O3R_h5$Yi6SNS`i8%}aV_G{4{iIo+TEMeb)8wNFty{kx*zt-?V+f| zKX;CnJN%+wa|zvUB-+l`zr9%rB;>Y{k(c*c@rMf&GVMcVkAf~(kvJuM%=S7W=f@L% zyqJvUS#n==nO00?^%q=lnKpO;&s_$N074WdwOlUkOa}-%*A=rAgOIAQ^eg~Xoz5p0 zYeZ5*3alWdpq^Yu+P9v<{(Y0ZEaY=XmW71N*qOZuwhP3mo8G6fOg^VkolIT_NFMlf z=Bu;snm;z`Y6k8$Qw)`uj9}0Rxuf{S7BYD3nPUeS_^Xl`b$`Bu#@1Ml-$Fom%($RDU zsic|H*fmKq0@$W*Iw|9Vf&#WQ>IG&GDJj_YcyNgGE3c6IdcOEvy!E;okesbH!@|Pa zOviqy9T0FQ%qA?GM6#$^=^*ixGjd^G_cCe}tHgN4e*p*9pydhxcvIh#L9M0gCYm)?12XdUdG>>6s@0<<#!pT>P9a zQte_lhcX}%(EUeGxrwkF@jl^3rdAv4G&!0%Sg*j>6E7EUuk}X8YhOWBG;O7qs&!Kc zd7M$1^G@Fcf>eQH_u*+jDTpMhbLg$svI7u!T?t7^AH-n%QCBY}Sg$AoBR&^EjM=Y% zlUu*(J5SFzKwh}!(fKOYTBjbmCKPjxugYggjBG+T^y881`-m)S?yaDt>JuWU?r`p~$~oBCQHgltXoXt`GS=x? zbI^$Ssg6*;p}I1G*xq#a17!ikp!Z9W_KHdQod4e8gpFtinj01<=MapAxa?+_){p&-g zKNL7!k_g$k21GNXuU_{q;D+UaB0K+PbL~FY;#aEb4=twqWxV(9c>oz{sIvW@ZUN#A zyMSO7zS}AI8H_aC0gl)X0I6jikk|1A-75tiLI~~LM@&Gt#0s9ts3a=JQ%IVRW)ci! zf$Gw3B0m`1(!oL2786{v?tPo5qt9X8bpEJfI%m9}^>q2;`IsN z8mZ6&IHML^Cp!hP=|~VY6J-rcAHf#tyHCUTOI+>!`2oQDfD=5Kw)ZR>8ykQzFni2eS*a3l!|^j-W7>Pi7=Xq!E_7kY{P*bUm19^SXWw z&V}%4ISfE*;=X0n2Wyt zLiSs)acOR*=hIlf+;xyY#qW-rwn@UnTF>ybVX-=)&;&cV-gz7?@HwA1@0YJnfHZ7S z_wh^BRIK(PX*Z2V_`@PcO+*1j~+*!((&k%Ma}eB{?}U zV^FzLW}E$TY9*i&@HpEbv~R`uVqw==1B!+iP;Hu6cAO2pp%Zd5IZ4Pd8%};{!yd1f zQ!+przhY^>S-W2Lvv@7y=TW>78k>rS%dFpMHA(Yy_`7fzj@0`EAm?g?=n(iL8Sb!z z1Rh7y@EFR-FkQdJT4#q(4KaC~^<(!(Y8=$g`Z7n22e#Bz27P zk`NpPWows8@6X;GBgSKiCdbVKY}Q2iFATjf*(eCBYZtqd3n5YY(^yO=<|{S?Y$nis zF5m;os@pAf`1$GR;A`>m%-BVPL-t!IBgp$=N?n=!ae<5!<9bx!xVC{!T}=(FuH0XJ zZ+|ItaD=R$Bb6bpVes}DD?go5qLB#Vr)?=wxoix?&wdTL&ju)6vnOnT0$3*K#8~9>ra~8#(pbAbj5D>icwwSr0sg?4Oj(p z^DQ*thfh1>ka0{K`n3(PWkkCxeG18K z0%Z_IP#SD32W(x{15+d(i&Rnyvq6MuI(p_VuO?NO@8jKS!zv_PZP^XTXzf8&+PE6f z56CwPP^|>=-2L`6xlv)SXJr%>CG{Lo*5jy&o?)5SdwL`w;|(s-J3%>jb+kx0pWLY| z{D^H>DImJgK5!bz(oXl>em*L&KV6Z-Y8>z&?~IMxf%um*#zyUEq5y7M#>w5CR|t!O zqUWsiXt5>IGykXhHwBFKlrqT$8afuKxBl*8D&Cn>eREb;T=DDGWE%?XI9$%laS~e-cI-383^b~22AW96)e<7=C{KccaO})SykF%{n>xQ~-{) zgp^cYUthX+k@N0vyv-)Obd}LS5v- zev`d6-sH5sv9WR7@hn6`6S6?^*3)?~f!aUwp_exzEKH}_nSL5Xh0jPj7eP@UKS~+s ztIoGZoE8j=l!(u`-H!B^I{~Y+=&_weEuTyk8s)GT?VSz*lJ%S5FWO(sgDap7upM2D zo|zgJ#7qszT)4Fk$CdK_D1nOr_OTI-6NhW=1#N&JMHqN4EXkP<#)z+7pIA^@^)o@O z1sETvQ;=@Rz0YvX6_};rAxF@SB*?}=?a(=X$~0k-<3od2O#7%9gMgrFc#dV3{tI@1{aavw_(!>&Yeax`6ODe=Bz;nMOQ(ZDeTw&_H<1% zj_3XL@v`BP|4&NLoJCK_!6g)=$&#w4c!5NI4*0!0^W(iA6;dLbD{Y3px53K2h|Hi& z#bvV{%w#$4YQFrd*F+#rSnxRxEWvxXMHfLBCy06f4v=d6TT>#{1~L$Qs+9M~%9AN6 z_+1YMFr((k;sNZ~y!sx=mlFye>KvpCP#1htHwjng!>7F9+e5jeMZ}hlJ)_8^D9^rE2VX|8&2@E06|67`~H zFW!Boxqwd*%KRX0)j}1|U<*Fmc>@L$v_=>*^dD@R=Yxkn zuql%96uu;jgx$jF!{h7um@F%ki#iB98C4(@e)L9E zg7a1>3{ugw)@C-LL#^rI@NZd0>*$xR!8!k<$SPU94;cOmmG#8JzJeH5bM)%p!btK0 zHLxyk=Bz7Jn=EsV*+%GSG^Ik536^vM_duo5FMSHiD^{B@CBvet+hP#<5?^l*iGDA& zCssa=iqPOdr-*WW7(oC2o(40@dM;yWjNcj%hmuU=ZXwW$))iY}n>x&&2rpN7-_4;! z>cisnilX9IVbLn}JhB5m6ZigN7u1;IrH*Ia(%5l@bda{C-3ADvG{w|+xc*0;G8neH)R87t(v--jzCWt&oS@SQcn?0FYM@+2fr zB{CUmA-fHQ@;!Hzobf&J_M+_L^5Z>VS<1HT@JwCa!J43`qw<86FOq0=U}%HB z7fc^-EKX_`H&CPy*vDRlLFVxW2MW2RTj$v7%a$>wscN9eBqk_nSPz?h?ynBM#LN}B zVH$An<5%eqV}_F`e{6@eee$-*g_={=*VsVm!0}_V#g9G{((RAb@5PKqYCU`?+&t+Z z9Bz~Er=Zseaj>i2JR4@|ujl$3kx-JVByNbU%_#p9G$6yaCaUbJ^L+h1SpJlzVJ$7$ zO^H(jP|tSr^&_X|P=pMmXhL|%N`l;}e>A>Po*o<u@^cB zt2c`0N>Z~~mAqo$xR=@xO`YfD&lh(yK~A(-ulQ#$C%_T>I%Rex9x}}Q_&z4_>9m8jog;Bqy#60RWjd6 zNs+`!;W-r4)uWJ72{Wg&9`7IlznSk_$=zt^xMPRcOxiFgz_ycIiW7BtWR6@4aszpt z+p-T2q1Xi*e~}HODmgM;dPrY&*$)B^a}{*vuwD`Kp`uu`KRGPS{lx9&8-w1kMM>kLhAeX;xp1D>9;t>1Sv^pg?2>9e$;n~wM|HG zwuL3IYZ^b5Vl`FT*Nan)8;qUZeY)l8{%H?uiF6;HhI`cG)VdrJ#`!~l~Wnx)ObgYS3f9ys?_7IE$&8OE2E=GjOD98 zy94&p`;lSi9e2*0%KMhHXzIrV&3>7#zYf#F?J$UHe;~W#dh;nAnrqu+EdxZo$7$Rv zovO(3eKycvxo|>TRo8VFf4J6JB2|1G=-IWy6RIwdZ}`fDU(ZP6TVr(Bg(#J4Rw)A) zCm=f_G_X|PErXtsPLFap`d!#iU+f`0E0xa@1*UtlzhjDVU)Qv3vc$o&j5jMXB)B+l&jS(#E?_5ycL5~Bv4ZDyYeook~5J0MeD^D zp4@GS1;2F4IWz0~s=J80W2MLOHq#w4zL1&w37H;GHPHi?Xol!Wo52uU$Je-9m9DS7 z#Xtu!w-Q_H*GDM|UnU2oJ6rX>>M3N@w;rOzFcy$;^Oh_ah78i4ufr!lB7gYZ^PXGF z6or^yV~^+>o?uKHaYH#ACz=#jT0$0pIC)l%Js!&Cj14mOx3t7_BNi*BSf zbXei;)eEeBJJ-BDR+w|L@23^XLI?>=Sy$payCqR497-KS@qi)%my~bV;p@!K2!klO zsbZjtdxiJiG3aQg+yWEZ#fWvifJbYLW{mOoAxrJ*SMwb;1x6O4FzlXe`p32Q94U#s zID9F1b>eouj1mb>KT_(D8$?$IolL`>g(^X*~^DKHB#~Ch1hM560H`cs9vYd4@z_e#24p} z79k&MI_a7%G4u-o1ShC1SX^tZce{AW49N1(V%#6kQ5cCm#k1`Lwh4bhpSjp1N)KFZ z%~Y8xw#RMXq7nRZMSk;5ClRStorqe8IT;$EsVjM8A;u!iSA2sDE7sJ zKx0qDdCHoJY+PIg?h7f2$?K_;@E_>f6-ds2a^B!E=;MD@i5Wdb1+>CZ!2xJNChM%V z6Q^&qf-?Zg0Yt$$p06_T6o5|)t7`XUws>mZovkTa|4@Ap9v!_YDy5p_od*G5TSjKu z7j-(vBE8Y5lgM(TC8=UFS34+RarFi~PTqq`uS4ng`yI^==~I)DGJ_T^U;PdsYdqdx zx5Q4mWM=#d_TfASN)?>UBX+~TaRDf=F97*g^z|#J{Zgyz;hZ2K*i?N}c9aA&knx!H z@rUDk023;)Qk3KSu3W!Kg#CcdN=iyftG~Bdxy%LcFHa~R$$=iAy_df?-tGMWDzUsK zIyE`D=n~?p&_~^{$jC(XyhjpTq5=AO1!UW~+B|bdZvxO%ddQ4Jj_9}${n!)o{Bt8< z&CAY?xtPXk3`y}K*8p1XpARkQdZ2S}X}*liX}6#=x_7wLCeR!r)`T@i(@oXxcKn_% znpH?Bn+`PDXjI)t3Fa>PrT0_s+>8&^mmf$Z_IYPgw(qoH$OV(`C#)SQAP;#z&OQ!n zbcDieyAQdlsbRw8074kFEg76vYw@P|IGYtBE0vru#H##r0Vg> zEMH&v&_N&qcstJt0caS1SK4gFkXM26gAiOByMu#+bOvMut|^>9aspdkmPTt-Bk4on z+ZnvHa=ixTNm%t@pHErq#b(!f2M^!U*6HURjnMaOO2vP^=C-i}%{Cq&)32+(9~Edv zchrPPss)ST`YK;uzU7&VIEUt!%@fT2eiDitXv+1#s2Tj zvF}l+h&%ds`9~GGg`_#=E8Y9Yah+m!__AN^jIyHY>ep^0S|6xjvHo*m*Qe%6mHO)w zQ8tVWTNq^0E+n%Exjs^98tY3lwK(An7&y2}+F&?EVf+c>86 zuzvo%@2yz@-4ILxM5g)nX+hfgdE-oguUuU|ooHVF3#Z|Z{aDiQAB69J-InqnlKK*< zkTUM4hz^Q+oY6m2t8AQu1{L0B)_Upv-20=KFc}TFA!>1duODt7f?*HW?MvdDyw01W z=iO+j3)6QZaIE!ba~&REW3;4<7*?xlz5^0PkP37<9SHf@@NfhqB*1*m020*a=EOL$ zs1?v5W5Ul5OKo1y0=$Ctq75y2l4TjfUYFUN(n)K7^qeE@z0G?sW(i|6UldxHY!&Zu zP#vED7YwP_K~eL+FJwD0|1nsNeLy-bNR2{*)9HFPdtN#TcOAFOC-P0m%aR2ze!?Em-73 zr7V8H%iIH<74Y%cdh_;1g>qlk*4O1zm=)8XNCCB>-g!@=eeKO;s3nd>Bj^ zEs{zu)108PQ+SBAUe_Pmy2YX$UCulsjg^`^if&QteP>1qHcd{H7TdqC$e#|hZVo?# z5O%D7Xq8b3va=_|;k?lT4fu9XI2PdBZT^-LBwqqbAeK~E$YpN|2v$JqxJ3c5ZY3v& zxHh^BT2!)Sa92Pg6w(xBpCTZ}hFkw(VD6hPi1!fW`yzm}k)jTmyr)Q&Bt{O7bM;7| zI=bzQ8xO>h%gV~W5c`x~4WEGa@#T#+vsS528oSwh&s}N+L68t(* z)JMm=3#$)qfT3=u2hvoRy^)R0fnPPw>X6RX>3W(fj!C|PWBTAXK{lNH=VK*sFu>N# z_4?P>0~QAuYAma&+8z6|S7V3;Hq>2jKhXiT1|y{xFl|_vm@^1H{M^aV>uB^qXI$9TdEfnk&o>y=HNh9 z0tJV90P=>?hop;cG~tC-j~Z`{?;0fz>wQ&k0d@CNF@qa}-Sc7xPQWrBy=W?MFT*YSPGrdQ zR`pUBgy83KKiM!p0(k<%8e(>*tzSSLF~VM#0CGUb@d(gU7V4~1C}G^ltdi+e#oBYW zV^3!K{-SA`@1p_EwdrDTIL9+mBogf|VD(=8n5hK|tw?G|xeZ6MiE~ii-@F06;~cDl zF*EBw3J^aS#06tn5UqYV7lQw;k8W^SJ(z+q0+$I;mB!3x+i~DGlOl%!0m%*oO?Gyr z9HA^L@AsZC7J{BmEQK zBp*)_qb@r)cd{UxeH`tSZXsBJ4s4T*2zuL6w}jj&M-^YYfiEzMs6#0%V=y6YfQeRR ztdhcvd`Bec&dLL8UCxcLIfG(j@uC#pd}gJHO|8U}&Q-ODy7j&>1_&)DDv?P7f`&5> zGhbv_07^3p*aNFYC8{ODF=?oPrhN6rBioZ3T-Fh~q$gjJTk#|av*=~VMl;#KvdBS@ zrM6dGAZ6xu^pbZ-A#7yK*tg$)JI?q4*!L&kVoL9{9MA0n^zDK6_?_eP<8`9a$B*A1 zK;$d~JJ$hF>@G8aQqxLVv4z}dwPbp(*ZqVd^&ViUFBZV`T*d7!ph zYUOi!23CeeQcx4MfIR~NZa&8yp#~w!O)%HxOUZ}rk9w;|`HLJ7wSey>!2?>${nflZ zLR3UVL~Lw@S|Ot21F*=D3c901)%-s!Gn*Md0q6K)Icf6U$qTIqO0LhnD{TF8|LV1a zHe4cpYft(!cRK+FMH_+j=G@NF43q9Lj7K%I#kk)c)zqESqL z08%4J7s=Xx^j-dFeh5^HJG|VVo+JXLsfuTm7 zA(YnjXd%tkE?d$AfLy93H&7WPft=<6Fj-3V3`46HnTLR^owbi(;x`}EtJx@^v1#Q7 zUWvk)i3)TQcezU$1GM$(Cw5!uXH6c>7WBY0>;YH?bZV>LhP9R$Qm5dsTmv9_(0-4E zldqHmV(t<=#-Ypv&W`72&c^! zxsf5l@!g1*j`|}e;|c^}pkT{SMId8^rLUBVQ~)71;umlQ8R)`jRlFx|_yzLbxHVPZ z2YH}U#~U$+Efq+kdG_s06b!loPhHd{uJl=yd0sECIN)C;T>#A=u|JZ*qi&@vbW7C$ z#6K^(OOTVz3@JK4ZkxL~GX!Bif`bI|WK3kFlf6`;@<*w1j2$4}#v^TUkVwQ+<4!}L zVW>l%MMH&VCR#uqw;ZV#VA0fCP6YftBMdu?s*A*7tpARX3all+r0Vg& zVn%af1(3P|(UkFg@Cu~b&Ec4hv{I8L6H1OpmBA@iT%JiTU2ys)blsehjrWM4(mJRx zSJn{zd}GP3b>A;*U`JVle8*4V&dpR`s>_` z(#fj46RQEpSr*2^z;|Q^GgaaWMl0d?TZ=7j{iUW4lu0voQGU|c8&Dir)7&HwjxpcJ zhJp&{*_p`GYZ3XnlFUm+7br0X1s!*J&}&}z2L!EP@w_sv$W~FV9n`_0yM5)rs}hY3 zcbRgRXLnent__4}o>$r}%R5P7{PE}{AC5=N(XyR6?@EfYO|rZ1%+>OEC}+XxVW}gB zvl`qwEH`MGtFyia{U(p?T+%*>oKm@018*r})Q9Qhgeb%zRFnNAvko0FctyjD&}&6F zf_hYq0^kJhfDC3fGAc!y;ID(;I0z|^1xLN__DfuA-?!j=9B5!^pS$M7ENm4&6wlWS zf1^t_1b~K*5|W+ha&M_)wb#CQBF3d zaYU2BkYPlpdf4#eZ#$%Hr6LbtS|O@}EOqUem{4C{uU(*lNUMc9#37P=S_wp>N(4@X zmwH;aXXRvdf>925cYlia4);(^RT_5#>p@&A@Vn4wsNwHJyk4eG%HJSte@&duPnkjf z;7VnQ7YbjCfZ!Yv%qNa<+p?8z9aTr%qe4aWrE9fw9H&WCbFu&65uiWgwv+b|;JNAT z^aYW1#;fV12n1aAsD8(8hPg!1Chgfx7027_KlL7o*Q+=^V8TaR^1pH53`Ww>i`svw zlpdKe^jn)LrDHaJ+LK|%deE%}*I5c9jg@MMtr$JL_qqJjN4!v8^lw}MdnWK9GQ76! zo;-DvC&LMzH)!`HFsi$cR*GIV=pv#)hik?^i(xcAm*X8JLikYllcb_5IaDF&_qVSh zKY}b|xrVZAPS(`??hhN%=r`pBbiV|=mrjw9lVgu?WD`m9Yk(KcivHtomLp6TP@l{8 zX`z5qgf+fWHr`!|{*5ztkB+n7-fs@gKFNzH@E`!GLR}Gp8evlW7QeQ}qG2}Oz zUDczyZf^-N5$9`P{0&4|Do}&((iq7Q{h6t;P+qB1Z+5o2dWEWc!qO7y4vX%&hgf!P zU}lP!NZKE@#}gO+%J}Ru54Z^kmYpkw?{d>h-UvcnHRvvU3Un{Dg?#xqO^In_8B7>a z4*VenRmI|a{#g*qYLU-MF`4ObWF=+RVo{1Ov_)Ue65>4t?zXCxh=x#qX+0tBlXjcL7orwdw>&4O)LP z>FMpAKme{Aoy`wi*DIVw(=eCB_>!lnrJ`(FVxPu?DaQNG9@g}xpbkM%Sq+y%do(iM z{uz7inr*|F+%HQU7$7SkD8g5X&Zfo1wROCEO8GSlKvDV-AlS?^7AW5pgy^MzaF{zG z`gkMuk6->7CbE5&ald-B90(25j>Aqa%**{!v3vZRMRCF28t#!xfTvL#bilw{MqrNo zYft!zis!f*v;_2Y|F=a^?0z&PLlE84)Mw-hjFGGz8SNQOvx9%dH8lf2hN~aB@gJ45)vCkY?PGi zpmy*$d-n>o935mJx$i}teJd*3b}y2-1?=aGwG2~Gw1u}a3yL$Mi3wdCnAIguhha`d z`+Ix;6suBpX8ey@72~fV4S>xZxGM~jc>4a!rp1jaBnk$Gk2~Xez->5RWg0q2Eb{?4 zSH5dkj4G`I`n5NO7z=B%M4cA6^Ax5)2;EEF?iS_D)!V+AhF{(q$%x+tO(LtFzU!=6 z$J5=LRq&M!Fwudc0|czBkgc1dx3_n92ufmNBJdJ91M9*taF+pA0i?X>DsL`Q-Z=cjv6duQmM{~y~K?HN;s|BG%$^iAqY z5GLXw$i_cKDu96QwE0DQPM1M7zi0XBs^Mi)=K_ob0nycMsnz2Ha(I96Pwaqnj@e)7 zT>As@l;9KfhPGl`W;OwDP>#=4+8`1j0|JVHKN7LGKQJ>pd#O~HL&E9*nkHiS+k7~V zeshsx=nE{3)-Nu8pcdOMG-7ly8MX^TDmGUA+5p{G`TI70dU}Ll+sSXy?#XOpr{-}7 z8-t0!U@xVS-Slb&Ez)xUj$Pb)Xaouk>QxxO= z(uc0{?4cXAL>IKJa&@&&R1=c;>?_A!jmCN=0=x0xf{uYG~yC`WOuf zsheRNcE0Qs7)D-OC&tBQd+yPH%^}>NTw4O>q$_T7;57j;J(!LT^V(MIjqcO)NjKVq z9xxv#P2slZiu@1S9{>NXj(IJ-OTc{w%zUQ))%{$62xwUHe8a`{2O7;+=W1x<{!_7_ z-K!~545~*k69Isg9gc|KIV>_L2$&7?Kc^M~J*JDu^=k-B^j!WxYG}JmMLs5?j6na5MB=AchG{AE7fcvH4G)mi9E;e&LVJ%>M*aBgR$7f!H zF@`XT&e@<^AQi+qx#G~5%bna|2J9qZXJGopK>;g(gSaSyYNou0<#RobAvnt^ ztXD$;5ubBj<&@}~n&(><|DnzCUb~jJ(W&P1<#=T#F*N{t7gN9Xx{q9*_X$P6FFZUP znxbWg%OCJwhl?#d^-TVtIi+tmatmnmiC@Pv^j3ZH+0JsCsm=V~Y><5}qg*fuXlVTw zViG|**}ceAd*O)6Y3!0whV{4(8M&?am(XhnqNfgOgw{wHs(pWHpvSoA35Tgjf#HTE z0bt$wwE181^PXPO|Ca@FLoPSEj%~n|Xx`4(9#tY2hS338xm26cOaR^bUHcKuR;3~! zGTaX5%*0@NKWwA#xYDx?LOd2eYD^BWT#^H2BA`HenKjMlg`b0q4&J}Ha!8iNW7x1p1+zVLq8JwqygJix z?hAB#2m8<}AgcyYSo-(*eWwir!oddAofJs+|H8QHCMMp_&W+NqUC*n7 zw79rRVB&yS#|49dfDQ)+7ywZHC|cPY9vNx9(0B^C>&@kx8}|^AY@#$) z5I|t0>uA1VOsAh!5DYK@+Ny28yd}y-p*)kI$>ZGI11+Ao8pw=**vW0(-QAs`gH8xL zjtvrUJIc(=e0XtO_4LHe7f8o4>sC|61)AYYgGpELfj93!j8y2>(5z4CgdTEQjvE1R zkGbEUDiL4W0)w!GIsn80O;-b0`i(d?rM7rwEC^thF04GGX)QhZk{c;jz9j2D%+xSG zgC_$l5dyX9mUWZB?G7AP9jASSJM@|hfaC|U2ZN92FZEF}cefop)z|JUU>*bm1|U5o z2!ZAK1_r?*BDKoix$KPl+f@N(DHh%YOc_XEaOdLDxLu2jtV64ga|`eVtAIwQVdhRC5R-SfhUjM79_i5*TU5aUhK@- zs1p3se3uE9@7aWw=D)@O#fHCsIS;g!qz1i_9O30`_fv)eBuxO@EYb((VSmf?OlyDp zZ)_<4?w{HOiTTPKG;i&*EkMe}P~n^21vzh3y(%CQn?68NL63cV*jmf3?NZCGZ@iC= z>?@#)rVZSPmAi;KU004l+e=pAlZSn__Qvp_JGbV?W>^^D^sAu@xMir=*f8`y@0pBl z=K*O)5KQcW+G00JXH5gO58fxnQ~WVpOaf7CQ$-S(-a@HHDI2jSVXXt$)vOq?WpWS# z!@NDggQ=@(K-Nh&JbM#J#?j0Sqs3bx;j{*ejGb3 zL4duM0Y;y;6gIKzZ&2#Y{d!-VVp}!KfxouhAD<4~Os5+EsTLy*qdJ7Ax?33XU-X6k4K{s@u~pD43a)LO3|%FC5`bL0u`;Z7=<9=`@pkb_ic0Vajh3Y zuR<1$OQ#{^&RN5&ibZp+!oh0_Qe79@eY~#Zqz@+r!kIH%qIAm5!X;v9xeWce{n`_T zULDdhGn|DiM|7leM@e}YIX`7K`F`H-Rhz%iIW ztXLFtt}nYXg7^2+WqP47J)hXM<|mGP35f>+6|5G_4ef&K1s~y7weTzFf zW@kJLzk6f$X8+xhb2UruhA3=}0Q1i-h-3rY0~1}ZCI<_s#}^ODWdu^_&Z zSy$M+#-Pq$ZH(?^EEl;$aJxGMD;yVSgJ@a0mw@D^e?Rh}eTIHufA+x~YDP*bwvt*` zq!n<#?Y=n9Oc~0ybQK1-eF?sU-%Y<7?Kkd|E)~Q`=(0WwJY8 z$oguYlV~$> z3=zWkm-nIcn6Mi0sS(=<%&>Igrfz&K7sX1VfR=$MMh2^r|2d86IZuLo}S zDIS>J&`3#Exb}h2zg559|30Br&i=}a$=oteF7g<5p02RQW)u|Hu7Rf+#Dwn7ALIGW zV)6&;P}HVex0N*`;R4%(JG75#IYEOig2~l2M}K&{3$N`4Ucy z3U9@>x@Nr!Az8&GqxEgky2>K=T5#~dy-KgrNL?G2W`y5(v^cZunC-j`#Ob5KaV2Wg zUJ9|n>pw1XW>|K^h0=o2YO>^ng^nIp>wK&B@K+egiG3^pDx>?cZ!{8en8k({v3JI; z0ZIN9cJj{%-4U6d3hGhW4%;D}+f{DATExtYfxj4T;;ctXkHK)_e z$jY;In0h+g$@p_&B^r>6;_aFJFO{~Ifd&}~G6OmsnL!Gh47ZGg>w`qnr{6DcfiQQO zE~6WqAW$Hyr z)8z(=@7MKk>|jxe!1R;VavV^~1sz7Vm2I7I;vIK}XR~>X(_2@Ef!QK&3kG0hXKF)kc9+8+Pz&6JthcOkw98 z^p{TA3e12)4ptU?1)ZF3);2H;E*R)66K%Pld4dTDpC4;rgb4WhnKVU{08!v!8+*^_ zP0q}$6mxj(mF`7WA!=k|Ir$BRD{+1PJ77h`f$y*H`}%_Q_3TXFvhhiLeEiO65CRr@ zy!lA_NcP)#pQWaCqkAwBJ7=+dZ=MUPSI1QF#-GIrF6^N!cWwfjQ!r69?2l+cvL+qgz5e>Ce{f%Lx`6?HHE$vIeIgcyWxwvtQ32FL_Ez?~HF`oq z0^JRGLyl6m;Otjftk}%NA9Q{&FMh

7$w|w*3W*Les`@{}3D+@}u)nVz~MH5r{bp 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%0A6F}DCP+>YQTz+@Jo9|zPS+x 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 diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 71cd18cecb..9484e259cc 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Limitar el nombre màxim de tokens en la resposta", "maxOutputTokensLabel": "Tokens màxims de sortida", "maxTokensGenerateDescription": "Tokens màxims a generar en la resposta", + "openAiCodexWebSocket": { + "label": "Utilitza WebSocket", + "description": "Manté oberta la connexió amb ChatGPT entre peticions. Utilitza HTTP si no es pot establir una connexió WebSocket." + }, "openAiCodexSpeed": { "label": "Velocitat", "tooltip": "El mode ràpid utilitza el processament prioritari de Codex per oferir aproximadament 1,5 vegades més velocitat i consumeix més quota de subscripció.", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 4403a19dbb..8cc033910e 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Begrenze die maximale Anzahl von Tokens in der Antwort", "maxOutputTokensLabel": "Maximale Ausgabe-Tokens", "maxTokensGenerateDescription": "Maximale Tokens, die in der Antwort generiert werden", + "openAiCodexWebSocket": { + "label": "WebSocket verwenden", + "description": "Hält die Verbindung zu ChatGPT zwischen Anfragen offen. Verwendet HTTP, wenn keine WebSocket-Verbindung hergestellt werden kann." + }, "openAiCodexSpeed": { "label": "Geschwindigkeit", "tooltip": "Der schnelle Modus nutzt die priorisierte Codex-Verarbeitung für etwa 1,5-fache Geschwindigkeit und verbraucht mehr von deinem Abonnementkontingent.", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 2e4ff9298d..abdda9a994 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -1179,6 +1179,10 @@ "limitMaxTokensDescription": "Limit the maximum number of tokens in the response", "maxOutputTokensLabel": "Max output tokens", "maxTokensGenerateDescription": "Maximum tokens to generate in response", + "openAiCodexWebSocket": { + "label": "Use WebSocket", + "description": "Keeps the ChatGPT connection open between requests. Uses HTTP if a WebSocket connection cannot be established." + }, "openAiCodexSpeed": { "label": "Speed", "tooltip": "Fast uses Codex priority processing for about 1.5x speed and consumes more subscription quota.", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 22788f89f9..f952d0be41 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Limitar el número máximo de tokens en la respuesta", "maxOutputTokensLabel": "Tokens máximos de salida", "maxTokensGenerateDescription": "Tokens máximos a generar en la respuesta", + "openAiCodexWebSocket": { + "label": "Usar WebSocket", + "description": "Mantiene abierta la conexión con ChatGPT entre solicitudes. Usa HTTP si no se puede establecer una conexión WebSocket." + }, "openAiCodexSpeed": { "label": "Velocidad", "tooltip": "El modo rápido usa el procesamiento prioritario de Codex para ofrecer aproximadamente 1,5 veces más velocidad y consume más cuota de suscripción.", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index f57562ebf2..f633874c0b 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Limiter le nombre maximum de tokens dans la réponse", "maxOutputTokensLabel": "Tokens de sortie maximum", "maxTokensGenerateDescription": "Tokens maximum à générer dans la réponse", + "openAiCodexWebSocket": { + "label": "Utiliser WebSocket", + "description": "Garde la connexion à ChatGPT ouverte entre les requêtes. Utilise HTTP si une connexion WebSocket ne peut pas être établie." + }, "openAiCodexSpeed": { "label": "Vitesse", "tooltip": "Le mode rapide utilise le traitement prioritaire de Codex pour une vitesse environ 1,5 fois supérieure et consomme davantage de quota d'abonnement.", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 52a29ff287..4e8b5ada5b 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "प्रतिक्रिया में टोकन की अधिकतम संख्या सीमित करें", "maxOutputTokensLabel": "अधिकतम आउटपुट टोकन", "maxTokensGenerateDescription": "प्रतिक्रिया में उत्पन्न करने के लिए अधिकतम टोकन", + "openAiCodexWebSocket": { + "label": "WebSocket का उपयोग करो", + "description": "अनुरोधों के बीच ChatGPT का कनेक्शन खुला रखता है। WebSocket कनेक्शन स्थापित न हो पाने पर HTTP का उपयोग करता है।" + }, "openAiCodexSpeed": { "label": "गति", "tooltip": "तेज़ मोड लगभग 1.5 गुना गति के लिए Codex की प्राथमिकता प्रोसेसिंग का उपयोग करता है और अधिक सदस्यता कोटा खर्च करता है।", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index e3ae8c18fc..1c4e8279f2 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Batasi jumlah maksimum token dalam respons", "maxOutputTokensLabel": "Token output maksimum", "maxTokensGenerateDescription": "Token maksimum untuk dihasilkan dalam respons", + "openAiCodexWebSocket": { + "label": "Gunakan WebSocket", + "description": "Menjaga koneksi ChatGPT tetap terbuka di antara permintaan. Menggunakan HTTP jika koneksi WebSocket tidak dapat dibuat." + }, "openAiCodexSpeed": { "label": "Kecepatan", "tooltip": "Mode Cepat menggunakan pemrosesan prioritas Codex untuk kecepatan sekitar 1,5x dan memakai lebih banyak kuota langganan.", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index c6ddf94a03..72463c3812 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Limita il numero massimo di token nella risposta", "maxOutputTokensLabel": "Token di output massimi", "maxTokensGenerateDescription": "Token massimi da generare nella risposta", + "openAiCodexWebSocket": { + "label": "Usa WebSocket", + "description": "Mantiene aperta la connessione a ChatGPT tra le richieste. Usa HTTP se non è possibile stabilire una connessione WebSocket." + }, "openAiCodexSpeed": { "label": "Velocità", "tooltip": "La modalità veloce usa l'elaborazione prioritaria di Codex per una velocità circa 1,5 volte superiore e consuma più quota dell'abbonamento.", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index e07b01c510..69e796ac7f 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "レスポンスの最大トークン数を制限する", "maxOutputTokensLabel": "最大出力トークン", "maxTokensGenerateDescription": "レスポンスで生成する最大トークン数", + "openAiCodexWebSocket": { + "label": "WebSocket を使用", + "description": "リクエスト間で ChatGPT への接続を維持する。WebSocket 接続を確立できない場合は HTTP を使用する。" + }, "openAiCodexSpeed": { "label": "速度", "tooltip": "高速モードは Codex の優先処理を使用して約1.5倍の速度を実現し、サブスクリプションの利用枠をより多く消費します。", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 49efb31701..5955e24983 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "응답에서 최대 토큰 수 제한", "maxOutputTokensLabel": "최대 출력 토큰", "maxTokensGenerateDescription": "응답에서 생성할 최대 토큰 수", + "openAiCodexWebSocket": { + "label": "WebSocket 사용", + "description": "요청 사이에도 ChatGPT 연결을 유지해요. WebSocket 연결을 설정할 수 없으면 HTTP를 사용해요." + }, "openAiCodexSpeed": { "label": "속도", "tooltip": "빠른 모드는 Codex 우선 처리를 사용하여 약 1.5배 빠른 속도를 제공하며 구독 할당량을 더 많이 사용합니다.", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 54e76a1a00..97c68a2b12 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Beperk het maximale aantal tokens in het antwoord", "maxOutputTokensLabel": "Maximale output tokens", "maxTokensGenerateDescription": "Maximale tokens om te genereren in het antwoord", + "openAiCodexWebSocket": { + "label": "WebSocket gebruiken", + "description": "Houdt de verbinding met ChatGPT open tussen verzoeken. Gebruikt HTTP als er geen WebSocket-verbinding kan worden gemaakt." + }, "openAiCodexSpeed": { "label": "Snelheid", "tooltip": "De snelle modus gebruikt prioriteitsverwerking van Codex voor ongeveer 1,5 keer hogere snelheid en verbruikt meer abonnementquotum.", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 411362c9b6..d9112df467 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Ogranicz maksymalną liczbę tokenów w odpowiedzi", "maxOutputTokensLabel": "Maksymalne tokeny wyjściowe", "maxTokensGenerateDescription": "Maksymalne tokeny do wygenerowania w odpowiedzi", + "openAiCodexWebSocket": { + "label": "Używaj WebSocket", + "description": "Utrzymuje połączenie z ChatGPT między żądaniami. Używa HTTP, jeśli nie można nawiązać połączenia WebSocket." + }, "openAiCodexSpeed": { "label": "Szybkość", "tooltip": "Tryb szybki korzysta z priorytetowego przetwarzania Codex, zapewniając około 1,5 raza większą szybkość i zużywając więcej limitu subskrypcji.", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index a65d642a68..03e195324e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Limitar o número máximo de tokens na resposta", "maxOutputTokensLabel": "Tokens máximos de saída", "maxTokensGenerateDescription": "Tokens máximos para gerar na resposta", + "openAiCodexWebSocket": { + "label": "Usar WebSocket", + "description": "Mantém a conexão com o ChatGPT aberta entre as solicitações. Usa HTTP se não for possível estabelecer uma conexão WebSocket." + }, "openAiCodexSpeed": { "label": "Velocidade", "tooltip": "O modo rápido usa o processamento prioritário do Codex para oferecer cerca de 1,5 vez mais velocidade e consome mais cota da assinatura.", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 177aaa870e..690d714ee4 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Ограничить максимальное количество токенов в ответе", "maxOutputTokensLabel": "Максимальные выходные токены", "maxTokensGenerateDescription": "Максимальные токены для генерации в ответе", + "openAiCodexWebSocket": { + "label": "Использовать WebSocket", + "description": "Сохраняет соединение с ChatGPT между запросами. Если WebSocket-соединение установить не удалось, используется HTTP." + }, "openAiCodexSpeed": { "label": "Скорость", "tooltip": "Быстрый режим использует приоритетную обработку Codex, обеспечивая примерно 1,5-кратную скорость и расходуя больше квоты подписки.", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index a3bbceb764..2eda61c38c 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Yanıttaki maksimum token sayısını sınırla", "maxOutputTokensLabel": "Maksimum çıktı tokenları", "maxTokensGenerateDescription": "Yanıtta oluşturulacak maksimum token sayısı", + "openAiCodexWebSocket": { + "label": "WebSocket kullan", + "description": "İstekler arasında ChatGPT bağlantısını açık tutar. WebSocket bağlantısı kurulamazsa HTTP kullanır." + }, "openAiCodexSpeed": { "label": "Hız", "tooltip": "Hızlı mod, yaklaşık 1,5 kat hız için Codex öncelikli işlemeyi kullanır ve daha fazla abonelik kotası tüketir.", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 4f25fcceb6..cc30749afb 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "Giới hạn số lượng token tối đa trong phản hồi", "maxOutputTokensLabel": "Token đầu ra tối đa", "maxTokensGenerateDescription": "Token tối đa để tạo trong phản hồi", + "openAiCodexWebSocket": { + "label": "Dùng WebSocket", + "description": "Giữ kết nối với ChatGPT mở giữa các yêu cầu. Dùng HTTP nếu không thể thiết lập kết nối WebSocket." + }, "openAiCodexSpeed": { "label": "Tốc độ", "tooltip": "Chế độ Nhanh sử dụng xử lý ưu tiên của Codex để đạt tốc độ nhanh hơn khoảng 1,5 lần và tiêu tốn nhiều hạn mức đăng ký hơn.", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index fee64e4f54..2a6bf76b54 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -1099,6 +1099,10 @@ "limitMaxTokensDescription": "限制响应中的最大 Token 数量", "maxOutputTokensLabel": "最大输出 Token 数", "maxTokensGenerateDescription": "响应中生成的最大 Token 数", + "openAiCodexWebSocket": { + "label": "使用 WebSocket", + "description": "在请求之间保持与 ChatGPT 的连接。如果无法建立 WebSocket 连接,则使用 HTTP。" + }, "openAiCodexSpeed": { "label": "速度", "tooltip": "快速模式使用 Codex 优先处理,速度约为 1.5 倍,但会消耗更多订阅配额。", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index eefd6012cf..ee914e6a5f 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -1126,6 +1126,10 @@ "limitMaxTokensDescription": "限制回應中的最大 Token 數量", "maxOutputTokensLabel": "最大輸出 Token 數", "maxTokensGenerateDescription": "回應中產生的最大 Token 數", + "openAiCodexWebSocket": { + "label": "使用 WebSocket", + "description": "在請求之間保持與 ChatGPT 的連線。如果無法建立 WebSocket 連線,則使用 HTTP。" + }, "openAiCodexSpeed": { "label": "速度", "tooltip": "快速模式使用 Codex 優先處理,速度約為 1.5 倍,但會消耗更多訂閱配額。",