From 9b2a599e1004401229c60a336d9fea810939761d Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 14:02:52 +0900 Subject: [PATCH 01/12] feat(codex): select account models alongside pooled native entries --- .../account-model-picker-desktop.png | Bin 0 -> 180920 bytes .../pr-assets/account-model-picker-mobile.png | Bin 0 -> 135147 bytes .../260910_account_model_picker/000_plan.md | 19 + .../content/docs/guides/codex-app-models.md | 15 + .../docs/reference/configuration/providers.md | 19 + .../content/docs/reference/management-api.md | 16 +- .../components/CodexAccountPickerSetting.tsx | 412 +++++++++++++++--- gui/src/i18n/de.ts | 13 + gui/src/i18n/en.ts | 13 + gui/src/i18n/fr.ts | 13 + gui/src/i18n/ja.ts | 13 + gui/src/i18n/ko.ts | 13 + gui/src/i18n/ru.ts | 13 + gui/src/i18n/tr.ts | 13 + gui/src/i18n/zh-TW.ts | 13 + gui/src/i18n/zh.ts | 13 + gui/src/styles.css | 34 ++ .../codex-account-picker-setting.test.tsx | 220 ++++++++++ src/codex/catalog/metadata.ts | 9 +- src/codex/catalog/sync.ts | 16 +- src/codex/convergence.ts | 1 + src/config.ts | 17 + src/config/codex-account-picker.ts | 11 + src/server/management/config-routes.ts | 34 ++ src/types/config.ts | 3 + structure/03_catalog-and-subagents.md | 12 +- tests/codex-integration/codex-catalog.test.ts | 37 ++ .../native-model-toggle.test.ts | 20 + tests/config/settings-stream-mode.test.ts | 64 ++- 29 files changed, 1010 insertions(+), 66 deletions(-) create mode 100644 .github/pr-assets/account-model-picker-desktop.png create mode 100644 .github/pr-assets/account-model-picker-mobile.png create mode 100644 devlog/_plan/260910_account_model_picker/000_plan.md create mode 100644 src/config/codex-account-picker.ts diff --git a/.github/pr-assets/account-model-picker-desktop.png b/.github/pr-assets/account-model-picker-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..6d92c5b72f5efd170d34639cd01ca2c17c533428 GIT binary patch literal 180920 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 z zfBVGO<8@6;Rs_tb65f4`h1?+-i&U-@}C-_ZucXR*9-UD-h17;?R~sI*F4hv!Q9J+D9)GKbFaT7CQ77 z1Ks+`Fop02Y$F;0NwU(Y$!TC^2fZ*@$oH+oC=T<&<80)m+vHG zQP2XyQ%p`6s`G5L!>q#>d-Ynpc=p~gA~{8T(@J0Fpzg9{Q_NTI-Z6ub^)qrmOzAbp zFrBTQD@f*~=n%bPLZ4}w{{4MBLls>LtLX)CX3>((y+s%7Pnl_1?MU=1Ba4D2tjW>3 zMA)#04RRYJgJ`(n0)hKZW`ZO_D>k*cH$z^bu9f1QJE3)Hw;Hy;3|-ZhYY3OfatBtjGAaEwad;;CR-?*{HIN z!pagH{&pYM98)K@4Yt&a)cJ?| z(~x?y9x#3e;{sH+Z%a5%a9@f^lX1RA$)BhbE?VYgioSKIsT1TO1)~@ z)fxB{sazeNKG%}e{?Vez%CGaRM}K`1*a79PCifvVfFdLT2AvRVKUm7?llf=&F!e|G7 z6Ohv;S%yijpi;l?w1s!S&)W1I#$zkbC9r>7S`cG8(qG;M7O=RyJb5{y z0<$iGmqqU}%kng%Bpcq!@0Ecv#;mMUydeh-m%I<^U-4I~_ecWux7`(*Ph1yGZsFIn zkGSMgLKe{2(on2dX@gl;CzEqh14(;2w_>4{nz`1_RUTuuTC!?*K+c()?uOS_FfRuC zDxbtU%occg?UoRR zllaMqg-ZmQXyF}$0l($TwkH#XiS)i{$6uJ>x%kY>UR1nNB=*geWcho^IAe#~O_YX} z`|{93pp1_OG=he^Ptu+{GT??v%6Wv6eGX~;3b}==@<32qW=8pQZ^O&3x+oFO6WkYXFLK45rX|gR+ zI~(vMhQQ7*D^X2e9rPEx;LQe|8Q~9f9ccP-udyUoq^~uB-+xH0Dj=rmW-~6~z_!Op zR{sjG8h*aDWeU&yws&9#K5*lMdQDrabLPu@U6SSK{5t{9lJD|A`vg9RPj}R@5KhIV zc%FQI>GnjYE)+B%wu=Rq>gV9pd z;W_BlwZaD^0`n-i1V&!JOqO)lRLBcdkom*W3d#dtFhaylwy?k{V-<2gStdh<&tJ3+ zu?V0;LQBjLS3Q;>Kk93!OfOH~CdfG4k^N?r&Nwe$Vpv6wyHV<4+#sv!jr%d9&;m8S0Uw%jnDtQcClXXrTNjXpOvNhs(U|F$>;8B+!z5%I*i&fikyGr!RFK=KX@< zr#`n4V!fI>@0`aE1>++%xt2YXIugL~@MyOP%q2(s|!=B1gSV zmiauMlii@uFePQ7nHibtQ;*u?_oHndMc~1@~yO+vLyzcFH7_SBube$K+Xr8s+uw_LKKA9eM>+ z*gq0$cz*pvONHgf`Pvfyxk+siS5Q$c@gc*vgu&qhcfzT>n&`l27TZMok_Gyz5A%d1 z{?40ZJmmE^I&xt6sQyV3Npk==b=!Bv6dArXB{B=iEcydAvK{`{4LN0MZU8NfR6B{{ zn9Oaevo2q~hhyC1Km!S%2Wb+O*7e-uY6-7*lGGr6lnfDB6+R-cOdzq(#a80|P?)P~ zi)RERQ@O|xg3FUGaRa(qK-oG3zUwOOY21s}1%Tw9n!E_<3~GpG=Yc3HU&)`G%XQc& z&roSLveyubJ7+Xb6tL@utOx3a!*~2tbe_qA%AjPKp11Uo`5LA4*0d1I>kT?ev z@z~+RI!i{r>%cpMAsfe`4v5*L}0(B+PLm zb~bej#!??e19l2SP(N@v)r%0@260OE!^cKef*lT`g zSrD`M4@AB;rD(m%xK~jSP-$jAMPG6EC(1}OkX2+lSzR=SAjt;|!YGW|;Dr&;h=R+c z@rl9YCiH+jk}=&ruN!9{%S~htd<*(dKg-Z%n^o;ZKwC@2X?lrx0W1$?$QjLFRi%gAA!5In zaRnw4)oMXn0m@@m?j98^a9(khg>d-lFBb`bFDc1~UZa|fR;IY=d4b0Qw8J^3)Kx#Z z|I8Eo)gKd9;EC-;c4oX>eNyJGNng5+vo$(+=t42i>okgaT*Ty<|LhuH(EAJQ zhixAqVw?E;h>?&5&<=|shiA=4W#3n-$ihv1#Lf9ou411w>{gxWnfX zhhYK;UJ~-tx7w;B#LMGd{>g17sMG9$1nM2K2zpCIE0^DQe+Lg9;d##7z{lsh{Xm^Q zY@JdZRXpo{xiy*{U$59mZl>$ptX97hF=d>PP1d&1coC_be)$a+uY9M|OB!_9QW8nM zU?yBBJU>;`qdo}JQ~L={$mgR+$Z)~-$1co7KI({+=Y-l|3At#D3?Q{EfT3Rw1kppf z+xngwp<{a=yUY=kqraA362xBXow}eWW%V?AJ@E*XSkH(clqr`^jMQ@J=B1AtMP`t1k(Pb(67_0^MoPPcS89+{F);WowkDKL?y#k)oF=0%9l^l}BnpG3Yr^)??o zhUZUR__3UKQNey7zp?tW@ibI;2i?&%CVZcafX#FOAVu6@UZKR!JPYz-6v@dWruy|B zL769L|AY0#9H{5M2Rwxx7tfttIL>&I}4vV%X5 z{`O(KMtms@?7i=j4O%Ps65ohEoy{_OHm$3Y9pCHwYmjN`U%ZuY?z71Io-K@jW&vN# zl0Zm;hm+UfY&{!XmnWQzxJ9PFJ$Iu;wN3h&V;s$j)^K}v_~KkDg~&RZGnBFA^C zLm!@aLw?Un_m^Z{Re~vO$5Z&ANvZk}`K8lqin9HKDsnO6$<^we+kf9T5re2pcNmv3 z;Wey0<*#>)@v741JG1MB%XB(e&WI(e#-d@h>gPzAFgvXwMG02gVvh!Aoj(a(G37ne z#qnQ#Ay)c>by6hU$;CcAU z?<(!AYjI8@Q^p;wN3fQCPL5ek%IZaR>Elgk8hJ3!ex`n&IkN@sw{KpVIJIHNt?BMt zwlNefcg&m%bY9gOZ2hc~CoOaNNA@idjK6ggm9gtuZnShP%Bh{ek6U$!!EH`|n^5~Z zy%wjNp3x!Bgw7pZerhjM{9~1jAC?o655~{z@hhXNuo(;5VecZfPlgAL4O$ng5^d^l z{{7I{!iS%lDuvkrK|Iq#Ks;y|fxfUep`Arn*9}qr8TInJxMtBd4R%JV+uBB{kGMWl z`1o^S;gw%8Ww#iF4Zd!u+bK=dFyn?eG%k$SY(~jhsHAzUr_1SEOci+l0&wDE?E8Ch zAIg7x&wU7>*iDoEPyqEpzU5#rfAZjo><anq4-q*a0#0Zgp+{_;{`8dmF+|} zyaA+KB>d{sD((gcx)oi@^9s8nOkgUXrJ(*_gjw_>1|g^Q6p-g__;Gsv`~l>Y;0D@b z$J_*Y13=~(EB?k!ZiQ(786@W{Jc4YjAn3G}Cz|CVD5w4i9k9I+aB@D_AIeG2> zg0(id#pmMIt?PiQy8|I!07)i&c742rpASjPCxK78nj)8m|3FNsPhh{jpg}a4*bx-H zed!U)?gp2Z#pZLl556xSFwsqt#m}z#!%m?}CIs~RkRnZAfo%{6D6H4`0h0|_S#L`p zthC>NYu51mND;NwxdBpO1MU#W>h6#Azbt^@L;&kH_q~Cy>Hl*ZYrG_-wW_80HaN`#;_BN^qF;kf+-o@ zN@QF)L(^+~k^^>3rhd<7^0UPHC1@U64zmsA{f)QWO?W0p-eg_x* zU}9u?8#+kFQFPzGnil;`z9t*{6nz}>^>azf0lw`s-2R3^bIa_MrPWJM->EJJl-*52DzDq+0bCNS0A1AtqQ(M$|1Vl>1cJLLv@I*t9vZRgnfm;Z@ z=>isaU~@o1WdK$VPon=mHUrQk;2r&ELUgC$6$eE+Jpv?(_6u+U>FJ~LGKa})Vpf}R z{Q+c>+U))S&wG6M^`3*h2E?t-bRw3uy<2jd?q$YS!P8-9cuJ&SfW3hqR0PYZo#Ed8 zNoTUlx^4{vZ)AmtiI6&Lqh(M*8<|@s5^fbQ1%{o`;nc(>AGdzf6R~#pHioareQkx* z00r+^GV}GBT#9is2&z!1&baZ!KCocA2VQ^X-yrWv!0Jnd0DVC7GXC=y>{cDiRRA|@ zW77QiFD&;90L3QH`~Wn)3{=&IfCU1)@=+KL17Oj$!DtY1+~*byCMF+1D<1Ok6d+*` zAf}~bk<9f?Tin)eukaeMO45!X6)@!Z4!*(`e?UY*`uc~tnBb}Q&U}5H`q!Vo!H0m{ z;s9g~u+&N4L0m1!Q4bIzIgV-oA(6T6o+J_rWKsEShuwh`YTfZiqjx9nb+@O>UP4#teC5E4jv2>}w~anO;3 zyCzKnQ97lDbA54?c^xn=aA@60;h5k|WQM_=IOoz~skiTO#1x+$Ex5!2TCM;{rtb7H&(n`3C6y}n&>R{pDz0YGn9))AR zUebF|QRjC;kpJq3N$3ICTFlr(`~onCLPbE7`T?A)qA+7gqRw?Pdr0a)=bTx<`F-xy zM`bQf?jqG@SkPWwr##^g5l80>?t>sebBS3EsZT}x$c9qo_w?GJmY0rs@fPA8y;BiV zyo55uD=xCQe+rq3v;+7YIBmQ=0sek?sM5DhK@7X#q#3+;gE_^QoxweFFNaVoJ?%!JAc&zXW?qhs(#f?FF>#4TdGI#LwY;pDocw&2 zP!Z-Q(;^552}30mt6z=R90mg{=`&U}yZxLTlyAnCa>>&L2QIX75dryeah!Dcri_5r zoD{ULXkkdL^0gcnwr}I2!ms9eY z?IEBUAiyZ=tX8fZn!SMB25b($_2l>D=Pg*Yh}#JRBa<=~_z1`(h|9^Te$*AiYPHdP zXl1mV?EvE$i~^><@2f&L{MAqgu17HqiUdbrP5l~^i#4LO8x<0Rb;#4cJxap;_2F_O zC0e!Htf#ee_6FYUdgEkyIe%~>78x;nvRR*}$WaR1N}sAo=wN@?;PacVyJCAxhDoxX zG7Tact*xd#q#h?G^}_ZUwjqY&M8lD0^#KoujHh6@JWY6`vTz21I+Cuwqj`5+1G1^I0-qqqUm7?wP4GaOdBKv5_Xgqe%Na;sRP@8kc=E zS75agAAAe$)>`@H?~SgmaJDz=D$*p9tf)Q~^lvMO^{~$sl6%7|k3$%*DUNd(`yt&)9KmMaCJD((kiX+Aci- zmhpqe}AehQ2s4=|hFAp)*L@51ce|nDS-&!~xAzvMrhme(m0UdCbvd`FE!7w5koSCZp?hw7xVJ3Vy)&!&`ymk&io;!#KN%Xj*JeZFW9X z-lJ(2VTx?NkdUs*p=ZfkOjXSG?$x+B-w0M}dU7}FCF9vH+>r7sfn73GB732qNDNPI z*j!lC_6ZoX8qy|6-cc}iovW1xg;)u~$_$!T@%sfMB?~NDi5ob;ydN%0pjmRrO)#ZSVkX z$!4YL%(!;>a7-Su^Z9x;YO+#6M=&#D!;~0`P9idr7``mp`PQHE$eilm3my| zs;7Ik^rG|f9<{#%+k;?CNBi3;E7}rNaW$Wc(4Y#a9(^R3YJ94-$LH|FFPJ3O?;}kd z@+M2P{%lm7jJar-0l30Ho}4@)Mn_oke67J`1WE&`QvGlGg(}}2YiJY|%#%bst$XB# z=TUjQfD{-H6T}G0CDU!JXda_qVTC#dGsQk%r5EA8Ujk_+@TghviP#STM8>tKzf;&z z1neheP$p*OX-egHU@TO<0P$(^4I*wre_at=soy}sbbWn*Yg$?<5wm(1hK-cWi>ONq zikV7G+9{l4%B$}9tG(h(-UYF$IVU+W zZ%DceCpoMw?`G6>6I)GKo>+)+Wk_>dZfPaF78v!{zvBthFQn)3P}anJYEz5jr@GWzW9cNPXbLZGf!1U=4QL*~a(ymyfVoAS1dG*Aj zwp2O0#*^b1~Yxek2O_s;j&4KvTydDG9XJu#mh}wxm2oFq2+nx zP}$_09nVCO8lJm?r6Yq0nW`nR>#0>I{|jP|HHY~V@O69Ww$v#(@YolwHaxhOPU(S2tz;~V360f8t^ zEmzz+`6wbs`*Sa;;>;51Rx-QmK1Y6HBU9ZHPCx7y_@H_ZX&oD6#^u9>#dqoD=~Xps zK3Y}b)!$988l^pknM9%sVyI2S%!z%LBfh~_=>ZP zFp}S{K{zG8Jc`~qSsy4VLADTiO1Yob9+qSO2}Ni)$g>jf)F_P?-ff}CBY0r2Qs+d$ zD#t8E40ZtARFPUBav7?C%Z`_&=hT}$wY3B>z?I5S6xr_&Wa+D#$4thEy0ufkF>K{^ z&3Idu>EklSaDZVH6TZIl2cQ0YtWozLS@C#(&VcGq#C_~?fc?vxu+f>tAWSyvDV>%w zVd^k+;58xES%!tPqIzLAx&Gwn5#;@x0z}ad#2~lOcIrUBU8|&Umpx+Q^A(9iw`vK^ z8rxqp$%21At(jce=fgH4e5#<~8}b~DeU~*quGqi=OKLk`Nn#>;KylIPH;V%iBQS9b zfR7w>8(gf&dds+b)Jq=Xgc$o=_lL2rabJ2R$98kPx>6FBx%Sb*XvH%j#;cHzs6UzZ z&=lf+J+X80_RMVBBK#T+!yL`$J|yESP_8>8C&aIy)P=cVd^|9JOu-RtoRQoPpnjo9vZnN z(t9dug%>mG(7%!@F`I9?M9`@A)|OXxP%3HdT0s+_+jdw?RC)21dM4+bnA&EMNIOtxD=YCPob#=8M#-_HoI zKZC-NW%gQZOT3in0CPm|S(41_LHsJ)xFoWERiZp}JuFE7Tk*sy%LTqkR#p85jA1AY z;J1UFDx^F>Gf|-=QA6g{L~sU%a#|sm*To5~Q%_3WLn){ko7@CS=-55;_}fN68pdy6 zB%KL=Fu^|;q?~Fi229ZIK}jtBR8e-Ec}voNxH32nI^QC{Q449!lX)W$7IVCgDitkG zc!oPoScrF4e%GHc;H3W&!13=@Y}+)cU3mVcKzz84D*yVXhA{;GD#^y=#y~~XP zJ^gnu009s1ow@V8p5bkj|9>!0_vwz?N&4i-f+vgbfyl#*=@=Myh8Vq|Ln=Q{Qd4RL zALwjSMa{N#MQ_FSFNZKVObtEWmBLHG4?O^5HNmxa7fhg+9*v@1vqTm*Ma+M_9lUGu z0$hidTL++MheuY#=MLm}DonbH>vS->SMi}6=6|%UHE1t*m0^AWZOZfvAVQT6fKiGs zXxywMpS(oZ#5oSWWYQW3ALi~0MeLMo3naBnqWHe_)D5mDtH=WcG_S@QC&wcvsXSwc z;66ZsRu(qM-pWC0GHHIx!CkKDx8m`A+VV6N%KJ*t6NsYWwE<3l7^-HS#^83$(D5xB6-74F*p;r`#GJdiiVE$L! z{la}p)Uo0k{VK$Pg;U6TDS?li?4#Z@C{hnXKc@+p;`MD2)YLHEEvlkJn_)ZB8@P~( z_aCC0#k3N4H{_~_Hk5e{A%wF0iJUW(&GluEoR%x&@>@(<%3Qu_OgDns^hJX63KlZ7 znh&R(DiOs#K1ynHUHC+Nrc=7s9jL676op{!^9mvqxyv zuSX6xcz5L1CCh{n6VnFPHb5usYJ3KO0*D@tKm>u1IdfD>IOsPda7^o|}=TF&PF=0@sr(*M`cam zvdxSGU^Wp(^j}wy{eOa3R@=GK14}K0-%IV8umbsm-E@oC3isojNZT{#UDk9>T#Ms; zRbR}?9pfB_Mt7Mu)>aYTQqhk^uy53d8Ea6w8H_w+ETIy4wS``4o}ERcv0QqNN&6_y z=;akXQ~h7#^YCzIm77b;zibZ`+>#C_)_5bN@l=wl#s@HA&aI%py+o3~c$3~tAm(T? zQba5IwbuI}X;}ED&)>>eR)m=^1FY{a&!mok7~=d$NxN+c)xps|~3sc4HDh%OcJ^zF1||w5q3BwyU^;MRsN8vdDDzhh%uI2P2Tn?Yb=!8uOk`TnvjI56YF2oY6%I+q@rH# z?yISFg>mYc^`qXI%MpHblgw=&;E;QlP>aKAqT-uh!M@>RP4STM$z)`&KVk1>N>6+D zU+fmWQ8AOjXNW?I2R@(YiC(0GHShdgp?>{w>iHOWwIX^l?e;G{>n+r z!q~NrNgd#iDOdKtN2NUL7@)OrKEfi7|0BW!N}x6iX}hiNLG z#qW|jlr>804p1Z?yhw2kp0(igCk*V`{L>)xI)@3bT*V?Tl+4MbN?-!yuh0B6icS{0IT5m4*q32*3(7eE%mVPJ-XW|#tq%OG zZ4-JV_a?V}qQed?f8+3%b~$d4SHz9&G8n~!BkUBobAJbxhd`laumX@80YLg(HSF}M z0!m0w#nrb#S-z+*h3+A77Jy4YySAibnGSh9w;YyNK&nGvtOWVTu7S{8764+<6{nd3 zfRpCF#bpabXF=Xnf1xB)@H2nxn*jQ^=%lxoAl=g)=yVU4ntwqCjuBc{c}c1NbKd(8b`wsOxnpyr!Uu@cCZ{OK2AWG$;Vr1=-vV??Lk95_s1UurkcIVF=2b4I0~#%a zi9ro4cmgzD>qAq<`_;&Q!4LTr$TlH#c@m}A4=|GA&jB*=AKZhvO=bmDci*L>iJs}j z{N(v(?dM14MjfaJaxz~C*DCE$EDeb%rSbQv~h`|ha|VfQ}>t4{Wi!H zXj~6OnPeM&0sW-F<=L#v#s&m~@4%!80NJ8=06u`WI@-bOsCi8KTHa1{fNMSv#NH)J zd~pF(1po698Xzw9J$Vlps({2G}mF$8^rtq!vX`Ines1=B7I)XlDY=yu=%kPAcv~ z#loPwh)h29sCb+c=aWXPl5|TVkEbgdr0dW+2Lqx92x&evZ96Dd!v{W2J7BEU(u4aB z)W(|!4*+|SI3#`!HE?N6_vziBU@1+<@3qYK(DXnv+5H6+Z(~NkPXTm7_V3PJfie5) zcIy>Xbl7DrKr(XYs>+mRo*QmE6BVDdO2VY-8q}!nr^id&ZFo(2S8`}+gDtx*Qc2`y z7kaKAP18d{El(O@CnzJh;e+Etxux;fUHI4hZ=j9^os(2qosOgn=nwt?2=A-wYD5ha z1Xs4W0S+H0SYI!JL-ir`_|mT69?aZ$XQnrnhV9yQ4hm$os}4RFJbm)M8+0E)DR26b zDrMaV#AURBUa0H-Tpo8FOuvu^9{_Ux2Y6=vy#|U4&>i2*O#mWsDpq`;d>)d5r|r@O zu+oC8S2EwoZh+#3h{rMO-$TG1G2~Ze`LGSMyqbWA9-xNZW}6$$qUqf6u^>hMlJAp} zp=q_p+u@d}uqW~@ zcUw^qVjAR_6MCA}$$UCB$=Z(!F=xP;2)T4OEw#S?`*<%1s2k8!K(G;zY=!~6`ZKx< zNUN8iOQ-O}t6!A~=sH<+BS`wlpOr{OUOiBU@DfivseU;G#a&Ch`QI=Ni2-x;9Zn5jmtmt_{~zB@ z2~xdZYi9^8bB+ZI9Ae-h`N?YQ`e@`OM9c%kxZB(_!!5CxkhT&WV;XWVvTb^g@VAeqa%w2}_7po_{zvF=~zLf;I<9 zp4hyFHYVQUwZcsOd)})DIn|d8DaFIy`LBA)ZpA#0bN;X#__$9_Fig+>Td_^U#*>wz zajq^Z%1^J))F4D2V{jwZF+|>6%!e8t9!8KCz5=mt9k10 zUkLjNsRfACtFup=9w*oSC-E{uz9dx+>|ay17b02q2s1NV6cZNMAdcTZLF6ERPN#I# zqe~YBAo@RHq&n7)ugLtUknulwDX_9r9iX8KsXUKsROi)vZXz@M|2~oeBSqImP(4y1 zOrY}A#F2eUzDfc*@J`5t698DP`$7%!WK8zRGtKxRbS!#1{avJ<91YCJQXy`}p`+YH zn>3!zpEpSS4a>jP$!e~zn5E<@{dZ&qr!Fp4K{rsErTVvtqhpMFTx28sE1@vlQ#RA4 zPsby&i8R&9(XqSLNCYX-j&zqi&6%sd?#Bo3$;F4nsmV;@6g8BmxuPa5 zSj+)>X)uX)1w^<1u8~;6Udch_!3#qu*Dq_QXbiPqzly6n7$6F!Z%eUB$VWo-jjGbD z_-MCZ+Xhc=O$QrA@K|Gsu8`ELyHyOPNq0TjB6;x@Hnvx%&YWn-d~RP~A0p~^b9M9! zBrZxQH2=QTBHne$V~KT+XW~Jff~|)f#`{Vu_*QBq%O^ZwBu{9V`lYn|nd24zcuby1 zj1PO5)4bQo;5QnDpnxm+?^Go`mT$O^NbSLV9N)flcIo1UDCAplc;Y8)Jc5+2ey~#VU@{Kt z$d?UoPc;94Z}HkcxC5KjJS%n5;$h(RxAV348~-nplE)+5EO~AdX`8vN`clcx(LHT? zw~H=!iQ)*)zR&%h+L-#{@G?c~2U8;m03f-hk#FSmGZytX#j`hjcJ(D6Ij`{(K|Z$D zS=tZ%qJEekZcXol)29IdZ5yHIFaLY-^0T}=v?2-{98QDHN2g?wyW%;HYMpduM}-i9 zN@DO@(EqmaXli|8aw}2#uFW`jF?BwLA?xI3ngCsW@Z|yT(SahlW1FIB?Alu`v)n6% z-(ZSA82slBAa&UPeIrC^BGMoW@#wUTuPjezof$LPp(1eD4}4r3CRbBWRR@(@9B*J= z;md}lmH+A|>nTtoj!z{WYEI)cw&m*0Z5r#kJ&<;Of#fIQb>U{?#{H5mN@sV!WV5*m zn11vFEQ8x9M|t}HJ1u00Jnrk$VCf0`q}OQ8rgqR-C1q3c&$E0Uj2ZT zWGHLs_{*79MgR^#5V6Q1+CoOYiXZR*t&=c7xlV2oq?Nkq1U7AI|HWrk!wvwInwb#S zU4v-y=Z??Iv|jN(tXX1en!+ zobtD|=yiUv=0;`NFa}3iuTJ38rlwwKn#-zDx2JNt7V9EoLZ%f5VGVuYmYcQs?n!Q0|HOpur|Ao+$t{I74NXPV! z%5x1m^Y+hEcI%A!Z&XzAM8)(-@U)3WrL+<>_NaJ!EyML%Ct99vQg^dV|%qb?( zVGB1$3t1+Zn4rG4oxnsUC~xaFta2BlSc=S3bz(a2m+s*7ct=Q}3gFWk;?UBdkiJxr z@h=DCaXIvY*ROLl9E?3y(EL-2Tgh1kcQTH(pL0C&eWg&+h1fA^1o6@fL}K6JBQJ`q z6wbY`JuKN0xkJ@(VUn1WN^%6LO1HtP$*TizGaX?Q%w7~I%xaMbX*vUtp~%In|bo4K+?Zn z`JeA5o|crbP<>;Um(K7or*5}L#+Q%JbF<~HCsplFDx+>!EGi~dA++f;>FU{zN{Wf+ zr#D=pVGM<6nB?!nZyH(&`V#BPK_lb+n=iF3R|*N`-QJm4Y6C5^C?sx*>GPQDg~lTwK zdH--mj-oB%C_Uksdw^8B%r77}M&Pefp0Z3qyN#eZ(5ovb6ZA~L%mnwg&_JX z93f$2qD`lZ`msx5mFHygS%2kCP}wQPXB^L8_^4xiL%}zjCs7O%{H7VLU#ZZdsi#D@$h1}NY|7}PrT z@ga2gb6ew9{M4TW9Dnh!~gk#>j&En`g`sLkY6)wK_8q=0oJcQoy7;5bx z@`tcOxSQ)TM__uN`vd&eW=ECA@WinQH=QJ2OYybePq}D;?w!3vgxq^Y!&s}dXhy8m z__@(P63?qc@Xc_hn`w-sGJ8k}Ft6Y|->_RM)js{h-Cjs+m8z}~(YNbEXErR)RLbgi8c+DNZ*cBA3~PeNoYSRmohw9WK+qQVL+36w zYFToT_7gkad$Ok7{3U*PxQ9j4Drm>;{Mm;M^9n}sH2wH%�cJn)>-q-?si21JkM| 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 literal 0 HcmV?d00001 diff --git a/.github/pr-assets/account-model-picker-mobile.png b/.github/pr-assets/account-model-picker-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..31a1348053bac8040fbf1507119f7238e49da8bb GIT binary patch literal 135147 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

vx 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

  • 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 selects bare native model IDs per +public `codexAccountNamespaces` selector. With this field present, selected account entries +are added alongside common native picker rows. An empty object adds none. Omit the field +to retain the legacy all-account projection. `codexAccountPickerEnabled: false` still hides +all generated entries. This preference never changes exact-account routing or entitlements. + +```json +{ + "codexAccountNamespaces": { "main": "@main" }, + "codexAccountPickerEnabled": true, + "codexAccountPickerModels": { "main": ["gpt-daybreak-blue-latest"] } +} +``` + +A selected gated model appears only when the existing account entitlement checks admit it. diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index b7fdbf072f..130dfaa49f 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -398,7 +398,7 @@ whether to star the repository. `GET /api/settings` reports the effective `codexAccountPickerEnabled` boolean. A `PUT` containing that strict boolean initializes privacy-safe account selectors when enabling an empty map, preserves existing selector labels when disabling or re-enabling, persists first, and then requests one bounded -catalog convergence only when effective picker visibility changed. The successful response includes +catalog convergence only when effective picker visibility or the selected account models changed. The successful response includes `catalogRefreshPending`: `false` means the catalog commit completed (or no refresh was needed), while `true` means the setting was saved but `POST /api/sync` should be used to retry the catalog refresh. Persistence or selector-allocation failure rolls the in-memory settings back and does not run @@ -478,3 +478,17 @@ Direct HTTP is most useful for integrations that need the exact endpoint contrac ## Remote sessions and data-key rotation `POST /api/keys/rotate {id}` starts a ten-minute overlap and returns the new data secret once. `POST /api/keys/rotate/commit {id,rotationId}` commits it; `DELETE /api/keys/rotate {id,rotationId}` aborts it. All require management authentication; data keys cannot call them. `POST /api/session/logout` requires the current `gui-session`, matching Origin, and CSRF. An admin token receives 403 and can never mint or exchange into a consent session. + + +### Selective Codex account models + +`GET /api/settings` also returns `codexAccountPickerModels` (a public-selector-to-model-array +map, or `null` for legacy mode) and `codexAccountPickerOptions` (objects with `selector` +and `models`, containing the known candidate model IDs for editing). Candidate choices are +not proof of upstream permission; catalog entitlement checks still apply. + +`PUT /api/settings` accepts `codexAccountPickerModels` alone or with the existing switch. +An object enables selective mode, `{}` selects none, and `null` removes the preference to +restore legacy behavior. Invalid keys, non-array values, non-native model IDs, and unknown +account selectors return 400 before writing. Saving converges the catalog when the preference +changes; failure rolls the in-memory preference back. No credential fields are returned. diff --git a/gui/src/components/CodexAccountPickerSetting.tsx b/gui/src/components/CodexAccountPickerSetting.tsx index 4988b715f3..e6f48af885 100644 --- a/gui/src/components/CodexAccountPickerSetting.tsx +++ b/gui/src/components/CodexAccountPickerSetting.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { readJsonOrThrow } from "../fetch-json"; import { startVisibilityPoll } from "../visibility-poll"; import { createBoundedFetch } from "../bounded-fetch"; @@ -6,6 +6,39 @@ import { useT } from "../i18n/shared"; import type { NoticeTone } from "../ui"; type Feedback = { tone: NoticeTone; message: string } | null; +type ModelsMap = Record; +type AccountModelOption = { selector: string; models: string[] }; +type AccountFieldsPayload = { codexAccountPickerModels?: unknown; codexAccountPickerOptions?: unknown }; + +function isStringArray(value: unknown): value is string[] { + return Array.isArray(value) && value.every(item => typeof item === "string"); +} + +function isModelsMap(value: unknown): value is ModelsMap { + return !!value && typeof value === "object" && !Array.isArray(value) + && Object.values(value as Record).every(isStringArray); +} + +function isAccountOptions(value: unknown): value is AccountModelOption[] { + return Array.isArray(value) && value.every(entry => !!entry && typeof entry === "object" + && typeof (entry as { selector?: unknown }).selector === "string" + && isStringArray((entry as { models?: unknown }).models)); +} + +/** Order-insensitive equality for the per-account model draft vs. the last confirmed map. */ +function sameModelsMap(a: ModelsMap, b: ModelsMap): boolean { + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + if (aKeys.length !== bKeys.length) return false; + for (const key of aKeys) { + const av = a[key] ?? []; + const bv = b[key]; + if (!bv || av.length !== bv.length) return false; + const bset = new Set(bv); + if (!av.every(model => bset.has(model))) return false; + } + return true; +} /** Opt-in control for account-qualified Codex model-picker entries. */ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string }) { @@ -19,28 +52,82 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string const savingRef = useRef(false); const loadGenerationRef = useRef(0); + // Second, independent opt-in: restrict which models show under each account selector. + // Backend-gated (older /api/settings responses omit codexAccountPickerOptions). The main + // enable switch above never reads or writes codexAccountPickerModels -- flipping it on/off + // must not touch this field at all. With customize OFF (the default), enabling the picker + // keeps the exact legacy behavior: account-qualified entries fully replace the plain rows + // for those accounts. Turning customize ON does not change that replacement; it only narrows + // which models appear under each account entry, while common pool models keep appearing + // alongside those account entries instead of being hidden by them. + const [customizeSupported, setCustomizeSupported] = useState(false); + const [customize, setCustomize] = useState(false); + const [customizeSaving, setCustomizeSaving] = useState(false); + const [options, setOptions] = useState([]); + const [savedModels, setSavedModels] = useState({}); + const [draft, setDraft] = useState({}); + const [modelsSaving, setModelsSaving] = useState(false); + const [modelsFeedback, setModelsFeedback] = useState(null); + const [query, setQuery] = useState>({}); + const customizeRef = useRef(false); + const customizeSavingRef = useRef(false); + const modelsSavingRef = useRef(false); + const dirty = useMemo(() => !sameModelsMap(draft, savedModels), [draft, savedModels]); + const dirtyRef = useRef(false); + useEffect(() => { dirtyRef.current = dirty; }, [dirty]); + // Any in-flight mutation blocks every other mutating control, so a customize toggle cannot + // race a model-list save (or vice versa) and leave the confirmed state ambiguous. + const busy = saving || customizeSaving || modelsSaving; + const anyMutationInFlight = () => savingRef.current || customizeSavingRef.current || modelsSavingRef.current; + + // Applies the account-selector fields from any /api/settings response (GET or PUT). Live + // selector labels are only (re)initialized on the enable-picker PUT and the customize/save + // PUTs, not on a plain GET, so this runs after every one of those responses too, not only + // after the background poll. + const applyAccountFields = useCallback((payload: AccountFieldsPayload) => { + const rawModels = payload.codexAccountPickerModels; + const rawOptions = payload.codexAccountPickerOptions; + const supported = isAccountOptions(rawOptions) && (rawModels === null || isModelsMap(rawModels)); + setCustomizeSupported(supported); + if (!supported) return; + setOptions(rawOptions as AccountModelOption[]); + if (dirtyRef.current) return; // never clobber an unsaved draft mid-edit. + const models = rawModels as ModelsMap | null; + customizeRef.current = models !== null; + setCustomize(models !== null); + if (models !== null) { + setSavedModels(models); + setDraft(models); + } + }, []); + const load = useCallback(async () => { - if (savingRef.current) return; + if (anyMutationInFlight() || dirtyRef.current) return; const generation = ++loadGenerationRef.current; const bounded = createBoundedFetch(15_000); try { const response = await fetch(`${apiBase}/api/settings`, { signal: bounded.signal }); if (!response.ok) throw new Error("load"); - const payload = await response.json() as { codexAccountPickerEnabled?: unknown }; - if (savingRef.current || generation !== loadGenerationRef.current) return; + const payload = await response.json() as { + codexAccountPickerEnabled?: unknown; + codexAccountPickerModels?: unknown; + codexAccountPickerOptions?: unknown; + }; + if (anyMutationInFlight() || dirtyRef.current || generation !== loadGenerationRef.current) return; if (typeof payload.codexAccountPickerEnabled !== "boolean") throw new Error("shape"); enabledRef.current = payload.codexAccountPickerEnabled; setEnabled(payload.codexAccountPickerEnabled); + applyAccountFields(payload); setHydrated(true); setLoadError(false); } catch { - if (!savingRef.current && generation === loadGenerationRef.current) { + if (!anyMutationInFlight() && !dirtyRef.current && generation === loadGenerationRef.current) { setLoadError(true); } } finally { bounded.clear(); } - }, [apiBase]); + }, [apiBase, applyAccountFields]); useEffect(() => { const timeout = window.setTimeout(() => { void load(); }, 0); @@ -52,7 +139,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string }, [load]); const toggle = useCallback(async () => { - if (savingRef.current || !hydrated) return; + if (anyMutationInFlight() || !hydrated) return; const previous = enabledRef.current; const requested = !previous; enabledRef.current = requested; @@ -70,6 +157,8 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string const payload = (await readJsonOrThrow<{ ok?: unknown; codexAccountPickerEnabled?: unknown; + codexAccountPickerModels?: unknown; + codexAccountPickerOptions?: unknown; catalogRefreshPending?: unknown; }>(response)) ?? {}; if (payload.ok !== true || typeof payload.codexAccountPickerEnabled !== "boolean") { @@ -77,6 +166,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string } enabledRef.current = payload.codexAccountPickerEnabled; setEnabled(payload.codexAccountPickerEnabled); + applyAccountFields(payload); setHydrated(true); setLoadError(false); setFeedback(payload.catalogRefreshPending === true @@ -90,67 +180,273 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string savingRef.current = false; setSaving(false); } - }, [apiBase, hydrated, t]); + }, [apiBase, hydrated, applyAccountFields, t]); + + const toggleCustomize = useCallback(async () => { + if (anyMutationInFlight() || !hydrated || !customizeSupported) return; + const previous = customizeRef.current; + const requested = !previous; + const nextModels: ModelsMap | null = requested ? draft : null; + customizeRef.current = requested; + setCustomize(requested); + customizeSavingRef.current = true; + setCustomizeSaving(true); + setModelsFeedback(null); + loadGenerationRef.current += 1; + try { + const response = await fetch(`${apiBase}/api/settings`, { + method: "PUT", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ codexAccountPickerModels: nextModels }), + }); + const payload = (await readJsonOrThrow<{ + ok?: unknown; + codexAccountPickerModels?: unknown; + codexAccountPickerOptions?: unknown; + catalogRefreshPending?: unknown; + }>(response)) ?? {}; + const confirmed = payload.codexAccountPickerModels; + // The server always returns this field on a settings PUT; a missing field is treated as + // any other malformed response instead of being silently coerced to null. + if (payload.ok !== true || !(confirmed === null || isModelsMap(confirmed))) { + throw new Error("unconfirmed"); + } + const isOn = confirmed !== null; + customizeRef.current = isOn; + setCustomize(isOn); + if (isOn) { + setSavedModels(confirmed); + setDraft(confirmed); + } + if (isAccountOptions(payload.codexAccountPickerOptions)) { + setOptions(payload.codexAccountPickerOptions); + } + setModelsFeedback(payload.catalogRefreshPending === true + ? { tone: "warn", message: t("codexAuth.catalogRefreshPending") } + : { tone: "ok", message: t("codexAuth.accountPickerCustomizeUpdated") }); + } catch { + customizeRef.current = previous; + setCustomize(previous); + setModelsFeedback({ tone: "err", message: t("codexAuth.accountPickerCustomizeUpdateFailed") }); + } finally { + customizeSavingRef.current = false; + setCustomizeSaving(false); + } + }, [apiBase, hydrated, customizeSupported, draft, t]); + + const toggleModel = useCallback((selector: string, model: string) => { + setDraft(prev => { + const current = prev[selector] ?? []; + const has = current.includes(model); + const nextList = has ? current.filter(m => m !== model) : [...current, model]; + return { ...prev, [selector]: nextList }; + }); + }, []); + + const saveModels = useCallback(async () => { + if (anyMutationInFlight() || !customize || !dirty) return; + modelsSavingRef.current = true; + loadGenerationRef.current += 1; + setModelsSaving(true); + setModelsFeedback(null); + try { + const response = await fetch(`${apiBase}/api/settings`, { + method: "PUT", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ codexAccountPickerModels: draft }), + }); + const payload = (await readJsonOrThrow<{ + ok?: unknown; + codexAccountPickerModels?: unknown; + codexAccountPickerOptions?: unknown; + catalogRefreshPending?: unknown; + }>(response)) ?? {}; + const confirmed = payload.codexAccountPickerModels; + if (payload.ok !== true || !isModelsMap(confirmed)) throw new Error("unconfirmed"); + setSavedModels(confirmed); + setDraft(confirmed); + if (isAccountOptions(payload.codexAccountPickerOptions)) { + setOptions(payload.codexAccountPickerOptions); + } + setModelsFeedback(payload.catalogRefreshPending === true + ? { tone: "warn", message: t("codexAuth.catalogRefreshPending") } + : { tone: "ok", message: t("codexAuth.accountPickerModelsSaved") }); + } catch { + setModelsFeedback({ tone: "err", message: t("codexAuth.accountPickerModelsSaveFailed") }); + } finally { + modelsSavingRef.current = false; + setModelsSaving(false); + } + }, [apiBase, customize, dirty, draft, t]); const initialLoadFailed = loadError && !hydrated; return ( -
    -
    - {t("codexAuth.accountPickerTitle")} -
    - {initialLoadFailed - ? t("codexAuth.accountPickerLoadFailed") - : !hydrated - ? t("common.loading") - : t(enabled - ? "codexAuth.accountPickerOnDesc" - : "codexAuth.accountPickerOffDesc")} -
    - {hydrated && enabled && ( -
    {t("codexAuth.accountPickerCompatibility")}
    - )} - {hydrated && loadError && ( -
    - {t("codexAuth.accountPickerRefreshFailed")} +
    +
    +
    + {t("codexAuth.accountPickerTitle")} +
    + {initialLoadFailed + ? t("codexAuth.accountPickerLoadFailed") + : !hydrated + ? t("common.loading") + : t(!enabled + ? "codexAuth.accountPickerOffDesc" + : customize + ? "codexAuth.accountPickerOnDescCustomized" + : "codexAuth.accountPickerOnDesc")}
    - )} -
    -
    - {loadError && ( - - )} - {hydrated && ( -
    +
    + {loadError && ( + + )} + {hydrated && ( + + )} +
    + {feedback && ( +
    - - + {feedback.message} +
    )}
    - {feedback && ( + + {hydrated && enabled && customizeSupported && (
    - {feedback.message} +
    + {t("codexAuth.accountPickerCustomizeTitle")} +
    + {t(customize + ? "codexAuth.accountPickerCustomizeOnDesc" + : "codexAuth.accountPickerCustomizeOffDesc")} +
    +
    +
    + +
    + {modelsFeedback && ( +
    + {modelsFeedback.message} +
    + )} +
    + )} + + {hydrated && enabled && customizeSupported && customize && ( +
    +
    + {t("codexAuth.accountPickerModelsCommonNote")} +
    + {options.length === 0 && ( +
    {t("codexAuth.accountPickerModelsNoAccounts")}
    + )} + {options.map(option => { + const selected = new Set(draft[option.selector] ?? []); + const rowQuery = query[option.selector] ?? ""; + const filtered = rowQuery + ? option.models.filter(model => model.toLowerCase().includes(rowQuery.toLowerCase())) + : option.models; + return ( +
    +
    + {option.selector} + + {t("codexAuth.accountPickerModelsSelectedCount", { n: selected.size })} + +
    + setQuery(prev => ({ ...prev, [option.selector]: e.target.value }))} + placeholder={t("codexAuth.accountPickerModelsSearchPlaceholder")} + aria-label={t("codexAuth.accountPickerModelsSearchPlaceholder")} + disabled={busy} + /> +
    + {filtered.length === 0 && ( +
    {t("codexAuth.accountPickerModelsNoMatch")}
    + )} + {filtered.map(model => ( + + ))} +
    +
    + ); + })} +
    + +
    )}
    diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 3b45878d57..b2bc71bba5 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -1381,6 +1381,19 @@ export const de: Record = { "codexAuth.accountPickerUpdateFailed": "Die Kontozielauswahl konnte nicht aktualisiert werden. Die zuletzt bestätigte Einstellung wird angezeigt.", "codexAuth.accountPickerLoadFailed": "Die Einstellung für die Kontozielauswahl konnte nicht geladen werden.", "codexAuth.accountPickerRefreshFailed": "Diese Einstellung konnte nicht aktualisiert werden. Der zuletzt bestätigte Wert wird weiterhin angezeigt.", + "codexAuth.accountPickerCustomizeTitle": "Modelle je Konto anpassen", + "codexAuth.accountPickerCustomizeOffDesc": "Jeder Kontoselektor zeigt derzeit alle verfügbaren Modelle, genau wie vor dieser Einstellung.", + "codexAuth.accountPickerCustomizeOnDesc": "Wähle unten aus, welche Modelle unter jedem Kontoselektor erscheinen. Modelle aus dem gemeinsamen Pool bleiben überall sichtbar.", + "codexAuth.accountPickerCustomizeUpdated": "Modellanpassung je Konto aktualisiert.", + "codexAuth.accountPickerCustomizeUpdateFailed": "Die Modellanpassung je Konto konnte nicht aktualisiert werden. Die zuletzt bestätigte Einstellung wird angezeigt.", + "codexAuth.accountPickerModelsCommonNote": "Modelle aus dem gemeinsamen Pool bleiben in der Auswahl sichtbar, unabhängig von der Auswahl unten.", + "codexAuth.accountPickerModelsSearchPlaceholder": "Modelle suchen…", + "codexAuth.accountPickerModelsNoMatch": "Keine Modelle entsprechen deiner Suche.", + "codexAuth.accountPickerModelsSelectedCount": "{n} ausgewählt", + "codexAuth.accountPickerModelsSaved": "Modellauswahl gespeichert.", + "codexAuth.accountPickerModelsSaveFailed": "Die Modellauswahl konnte nicht gespeichert werden. Bitte erneut versuchen.", + "codexAuth.accountPickerModelsNoAccounts": "Noch keine Kontoselektoren verfügbar.", + "codexAuth.accountPickerOnDescCustomized": "Jeder Selektor ist eine öffentliche Bezeichnung für ein gespeichertes Konto. Seine Auswahl bindet die Unterhaltung an dieses Konto: keine Pool-Rotation, kein Fallback und keine Änderung des aktiven Pool-Kontos. Modelle aus dem gemeinsamen Pool erscheinen weiterhin neben deinen unten ausgewählten kontospezifischen Modellen.", "codexAuth.advancedSettings": "Erweiterte Einstellungen", "codexAuth.advancedSettingsAria": "Erweiterte Codex-Auth-Einstellungen ein- oder ausblenden", "codexAuth.catalogRefreshPending": "Die Änderung wurde gespeichert, aber die Aktualisierung des Codex-Modellkatalogs steht noch aus. Führe ocx sync aus, um es erneut zu versuchen.", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 00bfdf3a0f..7011a53413 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -1953,6 +1953,19 @@ export const en = { "codexAuth.accountPickerUpdateFailed": "Could not update account targeting. The last confirmed setting is shown.", "codexAuth.accountPickerLoadFailed": "Could not load the account-targeting setting.", "codexAuth.accountPickerRefreshFailed": "Could not refresh this setting. The last confirmed value is still shown.", + "codexAuth.accountPickerCustomizeTitle": "Customize models per account", + "codexAuth.accountPickerCustomizeOffDesc": "Every account selector currently shows every available model, the same as before this setting existed.", + "codexAuth.accountPickerCustomizeOnDesc": "Choose which models appear under each account selector below. Common pool models keep showing everywhere.", + "codexAuth.accountPickerCustomizeUpdated": "Per-account model customization updated.", + "codexAuth.accountPickerCustomizeUpdateFailed": "Could not update per-account model customization. The last confirmed setting is shown.", + "codexAuth.accountPickerModelsCommonNote": "Common pool models remain visible in the picker regardless of the selections below.", + "codexAuth.accountPickerModelsSearchPlaceholder": "Search models…", + "codexAuth.accountPickerModelsNoMatch": "No models match your search.", + "codexAuth.accountPickerModelsSelectedCount": "{n} selected", + "codexAuth.accountPickerModelsSaved": "Model selection saved.", + "codexAuth.accountPickerModelsSaveFailed": "Could not save the model selection. Try again.", + "codexAuth.accountPickerModelsNoAccounts": "No account selectors are available yet.", + "codexAuth.accountPickerOnDescCustomized": "Each selector is a public label for one stored account. Choosing it locks that conversation to the mapped account: it never rotates or falls back, and it does not change the active Pool account. Common pool models keep appearing alongside your selected per-account models below.", "codexAuth.advancedSettings": "Advanced settings", "codexAuth.advancedSettingsAria": "Show or hide advanced Codex Auth settings", "codexAuth.catalogRefreshPending": "The change was saved, but the Codex model catalog refresh is pending. Run ocx sync to retry.", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 64005501c8..4ddb861643 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -1885,6 +1885,19 @@ export const fr: Record = { "codexAuth.accountPickerUpdateFailed": "Impossible de mettre à jour le ciblage des comptes. Le dernier paramètre confirmé est affiché.", "codexAuth.accountPickerLoadFailed": "Impossible de charger le paramètre de ciblage des comptes.", "codexAuth.accountPickerRefreshFailed": "Impossible d’actualiser ce paramètre. La dernière valeur confirmée reste affichée.", + "codexAuth.accountPickerCustomizeTitle": "Personnaliser les modèles par compte", + "codexAuth.accountPickerCustomizeOffDesc": "Chaque sélecteur de compte affiche actuellement tous les modèles disponibles, comme avant l’existence de ce paramètre.", + "codexAuth.accountPickerCustomizeOnDesc": "Choisissez ci-dessous les modèles qui apparaissent sous chaque sélecteur de compte. Les modèles du groupe commun restent visibles partout.", + "codexAuth.accountPickerCustomizeUpdated": "Personnalisation des modèles par compte mise à jour.", + "codexAuth.accountPickerCustomizeUpdateFailed": "Impossible de mettre à jour la personnalisation des modèles par compte. Le dernier paramètre confirmé est affiché.", + "codexAuth.accountPickerModelsCommonNote": "Les modèles du groupe commun restent visibles dans le sélecteur, quelle que soit la sélection ci-dessous.", + "codexAuth.accountPickerModelsSearchPlaceholder": "Rechercher des modèles…", + "codexAuth.accountPickerModelsNoMatch": "Aucun modèle ne correspond à votre recherche.", + "codexAuth.accountPickerModelsSelectedCount": "{n} sélectionné(s)", + "codexAuth.accountPickerModelsSaved": "Sélection de modèles enregistrée.", + "codexAuth.accountPickerModelsSaveFailed": "Impossible d’enregistrer la sélection de modèles. Réessayez.", + "codexAuth.accountPickerModelsNoAccounts": "Aucun sélecteur de compte n’est encore disponible.", + "codexAuth.accountPickerOnDescCustomized": "Chaque sélecteur est un libellé public associé à un compte stocké. Le choisir verrouille la conversation sur le compte correspondant : elle n’alterne jamais et ne bascule pas vers un compte de secours, sans modifier le compte Groupe actif. Les modèles du groupe commun continuent d’apparaître à côté des modèles par compte sélectionnés ci-dessous.", "codexAuth.advancedSettings": "Paramètres avancés", "codexAuth.advancedSettingsAria": "Afficher ou masquer les paramètres avancés de l’authentification Codex", "codexAuth.catalogRefreshPending": "La modification a été enregistrée, mais l’actualisation du catalogue de modèles Codex est en attente. Exécutez ocx sync pour réessayer.", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 729ecdbcde..506540d6e5 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -1811,6 +1811,19 @@ export const ja: Record = { "codexAuth.accountPickerUpdateFailed": "アカウント指定を更新できませんでした。最後に確認された設定を表示しています。", "codexAuth.accountPickerLoadFailed": "アカウント指定の設定を読み込めませんでした。", "codexAuth.accountPickerRefreshFailed": "この設定を更新できませんでした。最後に確認された値を引き続き表示しています。", + "codexAuth.accountPickerCustomizeTitle": "アカウントごとにモデルをカスタマイズ", + "codexAuth.accountPickerCustomizeOffDesc": "各アカウントセレクターには、この設定が導入される前と同様に、利用可能なすべてのモデルが表示されます。", + "codexAuth.accountPickerCustomizeOnDesc": "以下で各アカウントセレクターに表示するモデルを選択できます。共通プールのモデルは引き続きどこでも表示されます。", + "codexAuth.accountPickerCustomizeUpdated": "アカウントごとのモデルカスタマイズを更新しました。", + "codexAuth.accountPickerCustomizeUpdateFailed": "アカウントごとのモデルカスタマイズを更新できませんでした。最後に確認された設定を表示しています。", + "codexAuth.accountPickerModelsCommonNote": "以下の選択に関わらず、共通プールのモデルはピッカーに表示され続けます。", + "codexAuth.accountPickerModelsSearchPlaceholder": "モデルを検索…", + "codexAuth.accountPickerModelsNoMatch": "検索条件に一致するモデルがありません。", + "codexAuth.accountPickerModelsSelectedCount": "{n} 件選択中", + "codexAuth.accountPickerModelsSaved": "モデルの選択を保存しました。", + "codexAuth.accountPickerModelsSaveFailed": "モデルの選択を保存できませんでした。もう一度お試しください。", + "codexAuth.accountPickerModelsNoAccounts": "利用できるアカウントセレクターはまだありません。", + "codexAuth.accountPickerOnDescCustomized": "各セレクターは保存済みアカウント1つに対応する公開ラベルです。選択した会話はそのアカウントに固定され、Poolのローテーションやフォールバックは行われず、現在のPoolアカウントも変更されません。共通プールのモデルは、以下で選択したアカウントごとのモデルと並んで引き続き表示されます。", "codexAuth.advancedSettings": "詳細設定", "codexAuth.advancedSettingsAria": "高度な Codex 認証設定を表示または非表示", "codexAuth.catalogRefreshPending": "変更は保存されましたが、Codex モデルカタログの更新が保留中です。ocx sync を実行して再試行してください。", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index f8e500f747..8913b8214b 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -1417,6 +1417,19 @@ export const ko: Record = { "codexAuth.accountPickerUpdateFailed": "계정 지정 설정을 업데이트하지 못했습니다. 마지막으로 확인된 설정을 표시합니다.", "codexAuth.accountPickerLoadFailed": "계정 지정 설정을 불러오지 못했습니다.", "codexAuth.accountPickerRefreshFailed": "이 설정을 새로 고치지 못했습니다. 마지막으로 확인된 값을 계속 표시합니다.", + "codexAuth.accountPickerCustomizeTitle": "계정별 세부 설정", + "codexAuth.accountPickerCustomizeOffDesc": "이 설정이 생기기 전과 마찬가지로 모든 계정 선택기에 사용 가능한 모든 모델이 표시됩니다.", + "codexAuth.accountPickerCustomizeOnDesc": "아래에서 각 계정 선택기에 표시할 모델을 선택하세요. 공통 풀 모델은 계속 모든 곳에 표시됩니다.", + "codexAuth.accountPickerCustomizeUpdated": "계정별 모델 사용자 지정을 업데이트했습니다.", + "codexAuth.accountPickerCustomizeUpdateFailed": "계정별 모델 사용자 지정을 업데이트하지 못했습니다. 마지막으로 확인된 설정을 표시합니다.", + "codexAuth.accountPickerModelsCommonNote": "아래 선택과 관계없이 공통 풀 모델은 선택기에 계속 표시됩니다.", + "codexAuth.accountPickerModelsSearchPlaceholder": "모델 검색…", + "codexAuth.accountPickerModelsNoMatch": "검색과 일치하는 모델이 없습니다.", + "codexAuth.accountPickerModelsSelectedCount": "{n}개 선택됨", + "codexAuth.accountPickerModelsSaved": "모델 선택을 저장했습니다.", + "codexAuth.accountPickerModelsSaveFailed": "모델 선택을 저장하지 못했습니다. 다시 시도하세요.", + "codexAuth.accountPickerModelsNoAccounts": "아직 사용할 수 있는 계정 선택기가 없습니다.", + "codexAuth.accountPickerOnDescCustomized": "각 선택기는 저장된 계정 하나를 나타내는 공개 레이블입니다. 선택하면 해당 대화가 그 계정에 고정되며 Pool 순환이나 대체가 일어나지 않고 활성 Pool 계정도 바뀌지 않습니다. 공통 풀 모델은 아래에서 선택한 계정별 모델과 함께 계속 표시됩니다.", "codexAuth.advancedSettings": "고급 설정", "codexAuth.advancedSettingsAria": "고급 Codex 인증 설정 표시 또는 숨기기", "codexAuth.catalogRefreshPending": "변경 사항은 저장되었지만 Codex 모델 카탈로그 새로 고침이 보류 중입니다. ocx sync를 실행해 다시 시도하세요.", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index fe654314a1..3a83464edc 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -1881,6 +1881,19 @@ export const ru: Record = { "codexAuth.accountPickerUpdateFailed": "Не удалось обновить выбор целевого аккаунта. Показана последняя подтверждённая настройка.", "codexAuth.accountPickerLoadFailed": "Не удалось загрузить настройку выбора аккаунта.", "codexAuth.accountPickerRefreshFailed": "Не удалось обновить эту настройку. По-прежнему показано последнее подтверждённое значение.", + "codexAuth.accountPickerCustomizeTitle": "Настроить модели для каждого аккаунта", + "codexAuth.accountPickerCustomizeOffDesc": "Сейчас каждый селектор аккаунта показывает все доступные модели, как и до появления этой настройки.", + "codexAuth.accountPickerCustomizeOnDesc": "Выберите ниже, какие модели показывать под каждым селектором аккаунта. Модели общего пула по-прежнему видны везде.", + "codexAuth.accountPickerCustomizeUpdated": "Настройка моделей для каждого аккаунта обновлена.", + "codexAuth.accountPickerCustomizeUpdateFailed": "Не удалось обновить настройку моделей для каждого аккаунта. Показана последняя подтверждённая настройка.", + "codexAuth.accountPickerModelsCommonNote": "Независимо от выбора ниже, модели общего пула остаются видны в списке.", + "codexAuth.accountPickerModelsSearchPlaceholder": "Поиск моделей…", + "codexAuth.accountPickerModelsNoMatch": "Нет моделей, соответствующих поиску.", + "codexAuth.accountPickerModelsSelectedCount": "Выбрано: {n}", + "codexAuth.accountPickerModelsSaved": "Выбор моделей сохранён.", + "codexAuth.accountPickerModelsSaveFailed": "Не удалось сохранить выбор моделей. Попробуйте снова.", + "codexAuth.accountPickerModelsNoAccounts": "Пока нет доступных селекторов аккаунтов.", + "codexAuth.accountPickerOnDescCustomized": "Каждый селектор — публичная метка одного сохранённого аккаунта. Выбор закрепляет разговор за этим аккаунтом: без ротации и перехода на другой аккаунт, а активный аккаунт Pool не меняется. Модели общего пула по-прежнему отображаются рядом с выбранными ниже моделями для конкретного аккаунта.", "codexAuth.advancedSettings": "Дополнительные настройки", "codexAuth.advancedSettingsAria": "Показать или скрыть дополнительные настройки Codex Auth", "codexAuth.catalogRefreshPending": "Изменение сохранено, но обновление каталога моделей Codex ещё не завершено. Выполните ocx sync, чтобы повторить попытку.", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index d6d37d1469..aab01c13ef 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -1800,6 +1800,19 @@ export const tr: Record = { "codexAuth.accountPickerUpdateFailed": "Hesap hedefleme güncellenemedi. Son doğrulanan ayar gösteriliyor.", "codexAuth.accountPickerLoadFailed": "Hesap hedefleme ayarı yüklenemedi.", "codexAuth.accountPickerRefreshFailed": "Bu ayar yenilenemedi. Son doğrulanan değer hâlâ gösteriliyor.", + "codexAuth.accountPickerCustomizeTitle": "Hesap başına modelleri özelleştir", + "codexAuth.accountPickerCustomizeOffDesc": "Her hesap seçicisi şu anda, bu ayar var olmadan önceki gibi, kullanılabilir tüm modelleri gösterir.", + "codexAuth.accountPickerCustomizeOnDesc": "Aşağıda her hesap seçicisi altında hangi modellerin görüneceğini seçin. Ortak havuz modelleri her yerde görünmeye devam eder.", + "codexAuth.accountPickerCustomizeUpdated": "Hesap başına model özelleştirmesi güncellendi.", + "codexAuth.accountPickerCustomizeUpdateFailed": "Hesap başına model özelleştirmesi güncellenemedi. Son doğrulanan ayar gösteriliyor.", + "codexAuth.accountPickerModelsCommonNote": "Aşağıdaki seçimden bağımsız olarak ortak havuz modelleri seçicide görünmeye devam eder.", + "codexAuth.accountPickerModelsSearchPlaceholder": "Modelleri ara…", + "codexAuth.accountPickerModelsNoMatch": "Aramanızla eşleşen model yok.", + "codexAuth.accountPickerModelsSelectedCount": "{n} seçildi", + "codexAuth.accountPickerModelsSaved": "Model seçimi kaydedildi.", + "codexAuth.accountPickerModelsSaveFailed": "Model seçimi kaydedilemedi. Tekrar deneyin.", + "codexAuth.accountPickerModelsNoAccounts": "Henüz kullanılabilir hesap seçicisi yok.", + "codexAuth.accountPickerOnDescCustomized": "Her seçici, kayıtlı bir hesap için genel bir etikettir. Bunu seçmek, konuşmayı eşlenen hesaba kilitler: asla dönmez veya yedek hesaba geçmez ve aktif Havuz hesabını değiştirmez. Ortak havuz modelleri, aşağıda seçtiğiniz hesaba özgü modellerin yanında görünmeye devam eder.", "codexAuth.advancedSettings": "Gelişmiş ayarlar", "codexAuth.advancedSettingsAria": "Gelişmiş Codex Auth ayarlarını göster veya gizle", "codexAuth.catalogRefreshPending": "Değişiklik kaydedildi ancak Codex model kataloğunun yenilenmesi bekleniyor. Yeniden denemek için ocx sync çalıştırın.", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index c1675c4a24..fd15de81b6 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -2384,6 +2384,19 @@ export const zhTW: Record = { "codexAuth.accountPickerUpdateFailed": "無法更新帳號指定設定。目前顯示的是最後一次確認的設定。", "codexAuth.accountPickerLoadFailed": "無法載入帳號指定設定。", "codexAuth.accountPickerRefreshFailed": "無法重新整理此設定。目前仍顯示最後一次確認的值。", + "codexAuth.accountPickerCustomizeTitle": "依帳號自訂模型", + "codexAuth.accountPickerCustomizeOffDesc": "目前每個帳號選擇器都會顯示所有可用模型,與此設定出現之前相同。", + "codexAuth.accountPickerCustomizeOnDesc": "在下方選擇每個帳號選擇器要顯示的模型。共用池模型仍會在所有地方顯示。", + "codexAuth.accountPickerCustomizeUpdated": "已更新依帳號的模型自訂設定。", + "codexAuth.accountPickerCustomizeUpdateFailed": "無法更新依帳號的模型自訂設定。目前顯示的是最後一次確認的設定。", + "codexAuth.accountPickerModelsCommonNote": "無論下方如何選擇,共用池模型都會繼續顯示在選擇器中。", + "codexAuth.accountPickerModelsSearchPlaceholder": "搜尋模型…", + "codexAuth.accountPickerModelsNoMatch": "沒有符合搜尋的模型。", + "codexAuth.accountPickerModelsSelectedCount": "已選擇 {n} 個", + "codexAuth.accountPickerModelsSaved": "模型選擇已儲存。", + "codexAuth.accountPickerModelsSaveFailed": "無法儲存模型選擇,請再試一次。", + "codexAuth.accountPickerModelsNoAccounts": "尚無可用的帳號選擇器。", + "codexAuth.accountPickerOnDescCustomized": "每個選擇器都是某個已儲存帳號的公開標籤。選擇後,該對話會鎖定到對應的帳號:永遠不會輪換或容錯移轉,也不會改變目前 Pool 的帳號。共用池模型仍會與下方選擇的帳號專屬模型一併顯示。", "codexAuth.advancedSettings": "進階設定", "codexAuth.advancedSettingsAria": "顯示或隱藏進階 Codex 認證設定", "codexAuth.catalogRefreshPending": "變更已儲存,但 Codex 模型目錄仍在等待重新整理。請執行 ocx sync 重試。", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 06dceef46f..3aa7a0b22d 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -1398,6 +1398,19 @@ export const zh: Record = { "codexAuth.accountPickerUpdateFailed": "无法更新账号指定设置。当前显示的是最后一次确认的设置。", "codexAuth.accountPickerLoadFailed": "无法加载账号指定设置。", "codexAuth.accountPickerRefreshFailed": "无法刷新此设置。当前仍显示最后一次确认的值。", + "codexAuth.accountPickerCustomizeTitle": "按账号自定义模型", + "codexAuth.accountPickerCustomizeOffDesc": "目前每个账号选择器都会显示所有可用模型,与该设置出现之前一致。", + "codexAuth.accountPickerCustomizeOnDesc": "在下方选择每个账号选择器下要显示的模型。公共池模型仍会在所有地方显示。", + "codexAuth.accountPickerCustomizeUpdated": "按账号的模型自定义设置已更新。", + "codexAuth.accountPickerCustomizeUpdateFailed": "无法更新按账号的模型自定义设置。当前显示的是最后一次确认的设置。", + "codexAuth.accountPickerModelsCommonNote": "无论下方如何选择,公共池模型都会继续显示在选择器中。", + "codexAuth.accountPickerModelsSearchPlaceholder": "搜索模型…", + "codexAuth.accountPickerModelsNoMatch": "没有与搜索匹配的模型。", + "codexAuth.accountPickerModelsSelectedCount": "已选择 {n} 个", + "codexAuth.accountPickerModelsSaved": "模型选择已保存。", + "codexAuth.accountPickerModelsSaveFailed": "无法保存模型选择,请重试。", + "codexAuth.accountPickerModelsNoAccounts": "暂无可用的账号选择器。", + "codexAuth.accountPickerOnDescCustomized": "每个选择器都是一个已存储账号的公开标签。选择后,该对话会锁定到对应账号,不会参与 Pool 轮换或故障转移,也不会更改当前的 Pool 账号。公共池模型仍会与下方选择的账号专属模型一起显示。", "codexAuth.advancedSettings": "高级设置", "codexAuth.advancedSettingsAria": "显示或隐藏高级 Codex 认证设置", "codexAuth.catalogRefreshPending": "更改已保存,但 Codex 模型目录仍待刷新。请运行 ocx sync 重试。", diff --git a/gui/src/styles.css b/gui/src/styles.css index 1a51a2f40e..d488deda96 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -1673,6 +1673,40 @@ dialog.modal-overlay::backdrop { .codex-account-picker-feedback.is-ok { color: var(--green); } .codex-account-picker-feedback.is-warn { color: var(--amber); } .codex-account-picker-feedback.is-err { color: var(--red); } + +.codex-account-picker-wrap { display: block; } +.codex-account-picker-customize-card { gap: 16px; flex-wrap: wrap; margin-top: 8px; } +.codex-account-picker-models { + margin-top: 8px; + padding: 12px 16px; + border: 1px solid var(--border); + border-radius: var(--radius-md, 8px); + display: flex; + flex-direction: column; + gap: 12px; +} +.codex-account-picker-models-note { padding: 0; } +.codex-account-picker-account-row { display: flex; flex-direction: column; gap: 6px; } +.codex-account-picker-account-row-head { display: flex; align-items: center; gap: 8px; justify-content: space-between; } +.codex-account-picker-search { width: 100%; padding: 4px 8px; font-size: var(--text-label); height: var(--control-sm); } +.codex-account-picker-model-list { + display: flex; + flex-wrap: wrap; + gap: 6px 14px; + max-height: 8.5rem; + overflow-y: auto; + padding: 4px 2px; +} +.codex-account-picker-model-option { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: var(--text-label); + cursor: pointer; +} +.codex-account-picker-model-option input[type="checkbox"] { cursor: pointer; } +.codex-account-picker-models-actions { display: flex; justify-content: flex-end; } + /* The toggle now lives in the slot below, which carries the auto margin itself. */ /* Toggle slot: matches the height of the threshold compound so the 20px toggle centres against diff --git a/gui/tests/codex-account-picker-setting.test.tsx b/gui/tests/codex-account-picker-setting.test.tsx index d4590fb672..2b1d4d6ee4 100644 --- a/gui/tests/codex-account-picker-setting.test.tsx +++ b/gui/tests/codex-account-picker-setting.test.tsx @@ -277,4 +277,224 @@ describe("CodexAccountPickerSetting", () => { }); expect(toggle(host).getAttribute("aria-pressed")).toBe("true"); }); + + function toggles(host: ParentNode): HTMLButtonElement[] { + return Array.from(host.querySelectorAll("button.toggle")); + } + + test("hides the customize section entirely when the backend omits account options", async () => { + const host = await mount((async () => response({ codexAccountPickerEnabled: true })) as typeof fetch); + expect(toggles(host)).toHaveLength(1); + expect(host.querySelector(".codex-account-picker-customize-card")).toBeNull(); + expect(host.querySelector(".codex-account-picker-models")).toBeNull(); + }); + + test("reveals per-account model checkboxes only after the customize toggle is turned on", async () => { + const options = [{ selector: "main", models: ["gpt-5.1", "gpt-5.1-codex"] }]; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + return response({ + ok: true, + codexAccountPickerModels: {}, + codexAccountPickerOptions: options, + }); + } + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: null, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + expect(toggles(host)).toHaveLength(2); + const [mainToggle, customizeToggle] = toggles(host); + expect(mainToggle.getAttribute("aria-pressed")).toBe("true"); + expect(customizeToggle.getAttribute("aria-pressed")).toBe("false"); + expect(host.querySelector(".codex-account-picker-models")).toBeNull(); + + await act(async () => { + customizeToggle.click(); + await flush(); + }); + + expect(toggles(host)[1]?.getAttribute("aria-pressed")).toBe("true"); + const list = host.querySelector(".codex-account-picker-models"); + expect(list).not.toBeNull(); + expect(list?.querySelectorAll('input[type="checkbox"]')).toHaveLength(2); + expect(list?.textContent).toContain("gpt-5.1"); + expect(list?.textContent).toContain("gpt-5.1-codex"); + }); + + test("checking boxes never fetches; an explicit Save sends one batched PUT", async () => { + const options = [{ selector: "main", models: ["gpt-5.1", "gpt-5.1-codex"] }]; + let putCount = 0; + let lastPutBody: unknown = null; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + putCount += 1; + lastPutBody = init.body ? JSON.parse(String(init.body)) : null; + const body = lastPutBody as { codexAccountPickerModels?: Record | null }; + return response({ + ok: true, + codexAccountPickerModels: body.codexAccountPickerModels ?? {}, + codexAccountPickerOptions: options, + }); + } + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: {}, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + expect(toggles(host)[1]?.getAttribute("aria-pressed")).toBe("true"); + const checkboxes = Array.from(host.querySelectorAll('.codex-account-picker-models input[type="checkbox"]')); + expect(checkboxes).toHaveLength(2); + const saveButton = Array.from(host.querySelectorAll("button")).find(b => b.textContent === "Save"); + expect(saveButton?.disabled).toBe(true); + + act(() => { checkboxes[0]?.click(); }); + act(() => { checkboxes[1]?.click(); }); + expect(putCount).toBe(0); + expect(saveButton?.disabled).toBe(false); + + await act(async () => { + saveButton?.click(); + await flush(); + }); + + expect(putCount).toBe(1); + expect(lastPutBody).toEqual({ codexAccountPickerModels: { main: ["gpt-5.1", "gpt-5.1-codex"] } }); + expect(saveButton?.disabled).toBe(true); + }); + + test("turning customize off sends null and restores the prior draft if turned back on without reload", async () => { + const options = [{ selector: "main", models: ["gpt-5.1", "gpt-5.1-codex"] }]; + const puts: unknown[] = []; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + const body = JSON.parse(String(init.body)) as { codexAccountPickerModels?: Record | null }; + puts.push(body.codexAccountPickerModels); + return response({ + ok: true, + codexAccountPickerModels: body.codexAccountPickerModels ?? null, + codexAccountPickerOptions: options, + }); + } + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: { main: ["gpt-5.1"] }, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + const customizeToggle = () => toggles(host)[1]!; + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + + await act(async () => { + customizeToggle().click(); + await flush(); + }); + expect(customizeToggle().getAttribute("aria-pressed")).toBe("false"); + expect(puts.at(-1)).toBeNull(); + expect(host.querySelector(".codex-account-picker-models")).toBeNull(); + + await act(async () => { + customizeToggle().click(); + await flush(); + }); + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + expect(puts.at(-1)).toEqual({ main: ["gpt-5.1"] }); + const list = host.querySelector(".codex-account-picker-models"); + const checked = Array.from(list?.querySelectorAll('input[type="checkbox"]') ?? []).filter(i => i.checked); + expect(checked).toHaveLength(1); + }); + + test("a shared busy flag disables every mutating control while any save is in flight", async () => { + const options = [{ selector: "main", models: ["gpt-5.1"] }]; + const pendingPut = deferred(); + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") return pendingPut.promise; + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: {}, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + const [mainToggle, customizeToggle] = toggles(host); + const checkbox = host.querySelector('.codex-account-picker-models input[type="checkbox"]'); + act(() => { checkbox?.click(); }); + const saveButton = Array.from(host.querySelectorAll("button")).find(b => b.textContent === "Save" || b.textContent === "Saving…"); + + act(() => { saveButton?.click(); }); + + expect(mainToggle?.disabled).toBe(true); + expect(customizeToggle?.disabled).toBe(true); + expect(host.querySelector('.codex-account-picker-models input[type="checkbox"]')?.disabled).toBe(true); + + await act(async () => { + pendingPut.resolve(response({ + ok: true, + codexAccountPickerModels: { main: ["gpt-5.1"] }, + codexAccountPickerOptions: options, + })); + await flush(); + }); + expect(mainToggle?.disabled).toBe(false); + }); + + test("an amber pending-refresh notice also surfaces for a customize-toggle save", async () => { + const options = [{ selector: "main", models: ["gpt-5.1"] }]; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + return response({ + ok: true, + codexAccountPickerModels: {}, + codexAccountPickerOptions: options, + catalogRefreshPending: true, + }); + } + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: null, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + await act(async () => { + toggles(host)[1]?.click(); + await flush(); + }); + const warning = host.querySelector(".codex-account-picker-feedback.is-warn"); + expect(warning).not.toBeNull(); + }); + + test("a pre-save poll cannot replace the confirmed model selection", async () => { + const stalePoll = deferred(); + let getCount = 0; + let pollCallback: (() => void) | null = null; + const originalSetInterval = testWindow.setInterval.bind(testWindow); + testWindow.setInterval = ((callback: TimerHandler, ms?: number, ...args: unknown[]) => { + if (typeof callback === "function") pollCallback = callback as () => void; + return originalSetInterval(callback, ms, ...args) as number; + }) as typeof testWindow.setInterval; + const options = [{ selector: "main", models: ["gpt-5.5"] }]; + const initial = { codexAccountPickerEnabled: true, codexAccountPickerModels: {}, codexAccountPickerOptions: options }; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") return response({ ...initial, ok: true, codexAccountPickerModels: { main: ["gpt-5.5"] } }); + return ++getCount === 1 ? response(initial) : stalePoll.promise; + }) as typeof fetch); + await act(async () => { pollCallback?.(); await flush(); }); + const checkbox = () => host.querySelector('input[type="checkbox"]')!; + await act(async () => { checkbox().click(); await flush(); }); + await act(async () => { + Array.from(host.querySelectorAll("button")).find(button => button.textContent === "Save")!.click(); + await flush(); + }); + expect(checkbox().checked).toBe(true); + await act(async () => { stalePoll.resolve(response(initial)); await flush(); }); + expect(checkbox().checked).toBe(true); + }); + }); diff --git a/src/codex/catalog/metadata.ts b/src/codex/catalog/metadata.ts index f239ce48b1..69e25a1eb4 100644 --- a/src/codex/catalog/metadata.ts +++ b/src/codex/catalog/metadata.ts @@ -454,7 +454,7 @@ export function shouldIncludeNativeOpenAi(config: Pick): type AccountSelectorConfig = Pick< OcxConfig, - "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled" + "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled" | "codexAccountPickerModels" >; function mainAccountSelectors(config: AccountSelectorConfig): string[] { @@ -466,7 +466,7 @@ function mainAccountSelectors(config: AccountSelectorConfig): string[] { /** Native slugs exposed to Claude Desktop show/export/apply (opt-out via claudeCode.desktopNativeModels). */ export function desktopVisibleNativeSlugs( config: Pick, + | "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled" | "codexAccountPickerModels">, ): string[] { if (config.claudeCode?.desktopNativeModels === false) return []; const visible = visibleNativeSlugs(config); @@ -821,7 +821,10 @@ export function accountBoundNativeOpenAiSlugsBySelector( if (rows) rows.add(slug); } } - return new Map([...result.entries()].map(([selector, slugs]) => [selector, [...slugs]])); + return new Map([...result.entries()].map(([selector, slugs]) => [selector, + [...slugs].filter(slug => config.codexAccountPickerModels === undefined + || config.codexAccountPickerModels[selector]?.includes(slug)), + ])); } /** Unknown native ids observed from Codex, excluding the static release set. */ diff --git a/src/codex/catalog/sync.ts b/src/codex/catalog/sync.ts index 972b6d74c6..633d4bb896 100644 --- a/src/codex/catalog/sync.ts +++ b/src/codex/catalog/sync.ts @@ -879,6 +879,7 @@ export interface ObservedCatalogMergeInput { readonly hasPhysicalComboProvider: boolean; readonly includeNativeOpenAi: boolean; readonly accountBoundEntries: readonly RawEntry[]; + readonly keepBareNative?: boolean; readonly suppressedBareNativeSlugs?: ReadonlySet; readonly policy: ObservedCatalogMergePolicy; readonly openaiContextCap?: NativeContextLimitsInput; @@ -915,6 +916,7 @@ export function mergeCatalogEntriesFromObservedState({ hasPhysicalComboProvider, includeNativeOpenAi, accountBoundEntries, + keepBareNative = false, suppressedBareNativeSlugs = new Set(), policy, openaiContextCap, @@ -1273,7 +1275,7 @@ export function mergeCatalogEntriesFromObservedState({ // clobber a hide flag back to list. Bare ids disable every account clone; qualified ids disable // only their generated account row. const versionedEntries = applyMultiAgentMode( - applyNativeVisibility(mergedEntries, disabledModels, alignedAccountBoundEntries.length > 0, observedNativeSlugs), + applyNativeVisibility(mergedEntries, disabledModels, !keepBareNative && alignedAccountBoundEntries.length > 0, observedNativeSlugs), multiAgentMode, multiAgentV2Enabled, { keepNativeChatGptOnV1, preserveDefaultMultiAgentVersion: isReserveCatalogProjection }, @@ -1361,6 +1363,7 @@ export function mergeCatalogEntriesForSync( hasPhysicalComboProvider, includeNativeOpenAi, accountBoundEntries, + suppressedBareNativeSlugs, openaiContextCap, policy: { @@ -1894,7 +1897,15 @@ function writeRetainedCatalogSync({ accountNativeSlugs, accountNativeSlugsBySelector, reserve, - }).filter(entry => trustedAccountBoundNativeCatalogSlug(entry) !== undefined) + }).filter(entry => { + // Reserve is appended outside the ordinary per-selector roster above, so it also needs + // the display preference here. This is not an entitlement or routing gate. + const native = trustedAccountBoundNativeCatalogSlug(entry); + if (native === undefined) return false; + const selector = String(entry.slug).split("/")[0]!; + return config.codexAccountPickerModels === undefined + || config.codexAccountPickerModels[selector]?.includes(native); + }) : []; catalog.models = mergeCatalogEntriesFromObservedState({ modelPickerOrder, @@ -1919,6 +1930,7 @@ function writeRetainedCatalogSync({ hasPhysicalComboProvider, includeNativeOpenAi, accountBoundEntries, + keepBareNative: config.codexAccountPickerModels !== undefined, suppressedBareNativeSlugs, openaiContextCap, nativeDisplayNames: config.providers[OPENAI_CODEX_PROVIDER_ID]?.modelDisplayNames, diff --git a/src/codex/convergence.ts b/src/codex/convergence.ts index 2b8a8512c6..e6f97e1117 100644 --- a/src/codex/convergence.ts +++ b/src/codex/convergence.ts @@ -370,6 +370,7 @@ function prepareCatalog( hasPhysicalComboProvider, includeNativeOpenAi, accountBoundEntries, + keepBareNative: config.codexAccountPickerModels !== undefined, suppressedBareNativeSlugs, openaiContextCap, nativeDisplayNames: config.providers[OPENAI_CODEX_PROVIDER_ID]?.modelDisplayNames, diff --git a/src/config.ts b/src/config.ts index 4311e54eef..bf553b29d4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,6 +3,7 @@ import { chmodSync, constants as fsConstants, copyFileSync, existsSync, linkSync import { dirname, join } from "node:path"; import { Database } from "bun:sqlite"; import * as z from "zod/v4"; +import { isCodexAccountPickerModels } from "./config/codex-account-picker"; import { isValidProviderName, hasOwnProvider } from "./config/provider-name"; import { DEFAULT_SUBAGENT_MODELS, SUBAGENT_MODELS_VERSION } from "./config/subagent-models"; export { DEFAULT_SUBAGENT_MODELS } from "./config/subagent-models"; @@ -1260,6 +1261,7 @@ const configSchema = z.object({ // A malformed hand edit must degrade to false without discarding providers, accounts, // or the exact selector map. Live writes remain strict. codexAccountPickerEnabled: z.boolean().optional().catch(false), + codexAccountPickerModels: z.custom>(isCodexAccountPickerModels).optional().catch(undefined), // Same degrade-not-reject rule: a malformed hand edit hides Spark rather than discarding the // whole config. Hidden is also the default, so `catch(false)` and the default agree. showCodexSparkQuota: z.boolean().optional().catch(false), @@ -2203,6 +2205,10 @@ function malformedNativeSubagentFieldWarning(field: NativeSubagentPersistedField function malformedCodexAccountPickerWarning(rawParsed: unknown): string | null { const raw = rawConfigRecord(rawParsed); + if (raw && Object.hasOwn(raw, "codexAccountPickerModels") + && raw.codexAccountPickerModels !== undefined && !isCodexAccountPickerModels(raw.codexAccountPickerModels)) { + return "codexAccountPickerModels ignored: expected account selectors mapped to native model arrays"; + } if (!raw || !Object.hasOwn(raw, "codexAccountPickerEnabled")) return null; if (typeof raw.codexAccountPickerEnabled === "boolean") return null; return "codexAccountPickerEnabled ignored: expected a boolean"; @@ -2724,6 +2730,16 @@ function googleAntigravityStaticCatalogVersionError(value: unknown): string | nu return "schema_invalid: googleAntigravityStaticCatalogVersion: must be 1, 2, or omitted"; } +function codexAccountPickerModelsError(value: unknown): string | null { + const raw = rawConfigRecord(value); + if (!raw) return null; + const descriptor = Object.getOwnPropertyDescriptor(raw, "codexAccountPickerModels"); + if (!descriptor && !("codexAccountPickerModels" in raw)) return null; + if (descriptor && "value" in descriptor + && (descriptor.value === undefined || isCodexAccountPickerModels(descriptor.value))) return null; + return "schema_invalid: codexAccountPickerModels: expected an own account-selector model map or omitted"; +} + function codexAccountPickerEnabledError(value: unknown): string | null { const raw = rawConfigRecord(value); if (!raw) return null; @@ -2854,6 +2870,7 @@ export function validateConfigCandidate(value: unknown): { ok: true; config: Ocx ?? codexAccountPrioritiesError(value) ?? codexQuotaAutoRefreshError(value) ?? codexAccountPickerEnabledError(value) + ?? codexAccountPickerModelsError(value) ?? emptyCompletionRetryError(value) ?? oauthOpenBrowserError(value) ?? runtimeRoleError(value) diff --git a/src/config/codex-account-picker.ts b/src/config/codex-account-picker.ts new file mode 100644 index 0000000000..7a8830e80f --- /dev/null +++ b/src/config/codex-account-picker.ts @@ -0,0 +1,11 @@ +import { isValidProviderName } from "./provider-name"; + +/** Display preferences only: exact routing and provider entitlements remain authoritative. */ +export function isCodexAccountPickerModels(value: unknown): value is Record { + if (!value || typeof value !== "object" || Array.isArray(value) + || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) return false; + return Object.entries(value).every(([selector, models]) => + isValidProviderName(selector) && Array.isArray(models) + && models.every(model => typeof model === "string" + && /^(?:gpt-|codex-)[A-Za-z0-9._-]+$/.test(model))); +} diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 527178ba0f..2ecdd92de0 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -1,3 +1,5 @@ +import { isCodexAccountPickerModels } from "../../config/codex-account-picker"; +import { accountBoundNativeOpenAiSlugsBySelector } from "../../codex/catalog/metadata"; import type { IntegrationClientId } from "../../integrations/registry"; import { randomUUID } from "node:crypto"; import { readFileSync } from "node:fs"; @@ -178,6 +180,16 @@ interface ClientIntegrationSyncOutcome { * does not fail the sync: Codex is the one that matters for routing, and a broken Grok file * should surface as a warning, not as a 500 on a command that did its main job. */ +function accountPickerSettings(config: OcxConfig) { + const choices = { ...config, codexAccountPickerEnabled: true }; + delete choices.codexAccountPickerModels; + return { + codexAccountPickerModels: config.codexAccountPickerModels ?? null, + codexAccountPickerOptions: [...accountBoundNativeOpenAiSlugsBySelector(choices)] + .map(([selector, models]) => ({ selector, models })), + }; +} + export async function syncEnabledClientIntegrations( port: number | undefined, config: OcxConfig, @@ -315,6 +327,7 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise option.selector)); + if (Object.keys(body.codexAccountPickerModels as Record).some(selector => !available.has(selector))) { + return jsonResponse({ error: "Unknown Codex account selector" }, 400); + } + } if (body.showCodexSparkQuota !== undefined && typeof body.showCodexSparkQuota !== "boolean") { return jsonResponse({ error: "showCodexSparkQuota boolean is required" }, 400); } @@ -504,6 +528,7 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise); + } if (typeof body.oauthOpenBrowser === "boolean") { config.oauthOpenBrowser = body.oauthOpenBrowser; } @@ -586,6 +616,8 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise; /** * Show the GPT-5.3-Codex-Spark 5-hour and weekly windows on Codex quota surfaces. Default false. * diff --git a/structure/03_catalog-and-subagents.md b/structure/03_catalog-and-subagents.md index 9769012e1d..6cf4b6b794 100644 --- a/structure/03_catalog-and-subagents.md +++ b/structure/03_catalog-and-subagents.md @@ -204,7 +204,7 @@ Pool mode routes across main plus added Codex credentials. Key rules: routing-profile selector prefixes are exact-case (`src/codex/account-namespaces.ts`, `src/codex/account-namespace-match.ts`, `src/routing/profile-namespace.ts`). - **Selector labels carry no account-role semantics.** When at least one selector is advertisable, - the Codex catalog clones each supported native row per selector and hides the bare picker rows; + the legacy Codex catalog clones each supported native row per selector and hides the bare picker rows; bare ids remain routable and stay in raw `/v1/models` unless explicitly disabled. Missing stored account targets are not advertised, and private account ids never become catalog labels. `codexAccountPickerEnabled: false` hides generated rows without deleting exact routing bindings; @@ -541,3 +541,13 @@ Claude ModelInfo ordering receives optional `{ modelPickerOrder, featured }` aft It orders routed output groups after alias deduplication, preserving the collision winner and base/1M/Fast siblings. Native groups and explicit Desktop profile ownership are unchanged. Native Codex advertisements still follow display priority; private guidance ranks do not freeze them. + + +### Selective account picker + +An optional `codexAccountPickerModels` map filters generated account rows per public selector. +Absent preserves legacy projection; an empty map selects none. In selective mode, catalog sync +keeps common native rows visible, subject to existing disabled-model and provider gates. +The Advanced settings secondary customization toggle owns this opt-in. Settings updates use +the existing persistence rollback and catalog convergence flow. Exact routing and credential +selection remain independent of this display preference. diff --git a/tests/codex-integration/codex-catalog.test.ts b/tests/codex-integration/codex-catalog.test.ts index 38f362c81b..c6893f71a8 100644 --- a/tests/codex-integration/codex-catalog.test.ts +++ b/tests/codex-integration/codex-catalog.test.ts @@ -3172,6 +3172,21 @@ test.each(["retained", "convergence"] as const)("%s persists and restores native expect((await write({ "gpt-5.6-sol": "Changed Sol" })).find(row => row.slug === "gpt-5.6-sol")?.display_name) .toBe("Changed Sol"); expect(await write()).toEqual(original); + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerEnabled = true; + config.codexAccountPickerModels = { main: ["gpt-5.5"] }; + const selective = await write(); + expect(selective.filter(row => row.opencodex_catalog_kind === "account-selector-v1").map(row => row.slug)) + .toEqual(["main/gpt-5.5"]); + expect(selective.find(row => row.slug === "gpt-5.5")?.visibility).toBe("list"); + config.codexAccountPickerModels = {}; + const empty = await write(); + expect(empty.filter(row => row.opencodex_catalog_kind === "account-selector-v1")).toEqual([]); + expect(empty.find(row => row.slug === "gpt-5.5")?.visibility).toBe("list"); + delete config.codexAccountPickerModels; + const legacy = await write(); + expect(legacy.find(row => row.slug === "main/gpt-5.5")?.visibility).toBe("list"); + expect(legacy.find(row => row.slug === "gpt-5.5")?.visibility).toBe("hide"); expect(fetchCalls).toBe(0); } finally { try { @@ -7454,3 +7469,25 @@ describe("Codex 0.151 catalog contract fields", () => { }); }); }); + + +test("selective account projection preserves common pool models alongside selected rows", () => { + const native = nativeTemplate(); + const account = { ...native, slug: "main/gpt-5.5", opencodex_catalog_kind: "account-selector-v1" }; + const selected = mergeObservedForTest({ + catalogModels: [{ ...native, visibility: "hide" }], routedEntries: [], + accountBoundEntries: [account], keepBareNative: true, + }); + expect(selected.find(row => row.slug === "gpt-5.5")?.visibility).toBe("list"); + expect(selected.find(row => row.slug === "main/gpt-5.5")?.visibility).toBe("list"); + const legacy = mergeObservedForTest({ + catalogModels: [native], routedEntries: [], accountBoundEntries: [account], + }); + expect(legacy.find(row => row.slug === "gpt-5.5")?.visibility).toBe("hide"); + const disabled = mergeObservedForTest({ + catalogModels: [native], routedEntries: [], accountBoundEntries: [account], keepBareNative: true, + disabledModels: new Set(["gpt-5.5"]), + }); + expect(disabled.find(row => row.slug === "gpt-5.5")?.visibility).toBe("hide"); + expect(disabled.find(row => row.slug === "main/gpt-5.5")?.visibility).toBe("hide"); +}); diff --git a/tests/codex-integration/native-model-toggle.test.ts b/tests/codex-integration/native-model-toggle.test.ts index 0ac18f1ad2..7d48bce31b 100644 --- a/tests/codex-integration/native-model-toggle.test.ts +++ b/tests/codex-integration/native-model-toggle.test.ts @@ -1,3 +1,4 @@ +import { accountBoundNativeOpenAiSlugsBySelector } from "../../src/codex/catalog/metadata"; import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; @@ -899,3 +900,22 @@ describe("#2574 a stale on-disk row is what a subagent reads", () => { expect(row.context_window).toBe(300_000); }); }); + + +test("selective account catalog lists only chosen pairs and preserves legacy omission", () => { + const config: OcxConfig = makeConfig({ + codexAccountPickerEnabled: true, + codexAccountNamespaces: { main: "@main", side: "stored-side" }, + codexAccounts: [{ id: "stored-side", email: "side@example.test" }], + codexAccountPickerModels: { main: ["gpt-5.5"], side: ["gpt-6-astra"] }, + }); + const selected = accountBoundNativeOpenAiSlugsBySelector(config, []); + expect(selected.get("main")).toEqual(["gpt-5.5"]); + expect(selected.get("side")).toEqual(["gpt-6-astra"]); + config.codexAccountPickerModels = {}; + expect([...accountBoundNativeOpenAiSlugsBySelector(config, []).values()].flat()).toEqual([]); + delete config.codexAccountPickerModels; + expect(accountBoundNativeOpenAiSlugsBySelector(config, []).get("main")!.length).toBeGreaterThan(1); + config.codexAccountPickerEnabled = false; + expect(accountBoundNativeOpenAiSlugsBySelector(config, []).size).toBe(0); +}); diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index 514ba6110a..eecde2feaf 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -11,7 +11,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { getConfigPath, loadConfig, saveConfig } from "../../src/config"; +import { getConfigPath, loadConfig, saveConfig, validateConfigCandidate } from "../../src/config"; import { handleManagementAPI, type ManagementApiDeps } from "../../src/server/management-api"; import { invalidateStartupHealthCache } from "../../src/server/startup-health-cache"; import { USAGE_RANGES, USAGE_SURFACES } from "../../src/usage/summary"; @@ -640,3 +640,65 @@ describe("config.json schema resilience", () => { }); }); import { ManagementRequest as Request } from "../helpers/management-auth"; + + +describe("selective account model settings", () => { + test("saves selected models, converges, and null restores legacy mode", async () => { + const config = baseConfig(); + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerEnabled = true; + let convergences = 0; + const deps: ManagementApiDeps = { + saveConfigPreservingClaudeCode: saveConfig, + createManagementConvergeCodex: catalogConvergenceFactory(() => { convergences++; }), + }; + const selected = { main: ["gpt-5.5"] }; + const saved = await putSettings(config, { codexAccountPickerModels: selected }, deps); + expect(saved!.status).toBe(200); + expect(await saved!.json()).toMatchObject({ codexAccountPickerModels: selected }); + expect(loadConfig().codexAccountPickerModels).toEqual(selected); + expect(convergences).toBe(1); + const loaded = await (await getSettings(config))!.json(); + expect(loaded.codexAccountPickerOptions.find((option: { selector: string }) => option.selector === "main").models).toContain("gpt-5.5"); + await putSettings(config, { codexAccountPickerModels: selected }, deps); + expect(convergences).toBe(1); + await putSettings(config, { codexAccountPickerModels: null }, deps); + expect(config.codexAccountPickerModels).toBeUndefined(); + expect(loadConfig().codexAccountPickerModels).toBeUndefined(); + expect(convergences).toBe(2); + }); + + test.each([[], "all", { main: "gpt-5.5" }, { main: ["other/gpt-5.5"] }, { missing: ["gpt-5.5"] }, JSON.parse('{"__proto__":[]}')])( + "rejects malformed or unknown selections without persisting (%j)", async value => { + let writes = 0; + const response = await putSettings(baseConfig(), { codexAccountPickerModels: value }, { + saveConfigPreservingClaudeCode: () => { writes++; }, + }); + expect(response!.status).toBe(400); + expect(writes).toBe(0); + }, + ); + + test("failed persistence restores selection and original switch state", async () => { + const config = baseConfig(); + const previous = { main: ["gpt-5.5"] }; + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerModels = previous; + await expect(putSettings(config, { codexAccountPickerModels: {}, codexAccountPickerEnabled: true }, { + saveConfigPreservingClaudeCode: () => { throw new Error("disk full"); }, + })).rejects.toThrow("disk full"); + expect(config.codexAccountPickerModels).toBe(previous); + expect(config.codexAccountPickerEnabled).toBeUndefined(); + }); +}); + + +test("malformed stored account model preferences preserve providers and reject live writes", () => { + const config = baseConfig(); + saveConfig(config); + writeFileSync(getConfigPath(), JSON.stringify({ ...config, codexAccountPickerModels: "invalid" })); + const loaded = loadConfig(); + expect(loaded.providers.openai).toEqual(config.providers.openai); + expect(loaded.codexAccountPickerModels).toBeUndefined(); + expect(validateConfigCandidate({ ...config, codexAccountPickerModels: "invalid" })).toMatchObject({ ok: false }); +}); From 30f9818706f9724a55e5daf24c9ca1c70d2b96ed Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 14:17:22 +0900 Subject: [PATCH 02/12] fix(gui): declare shared mutation guard dependencies --- gui/src/components/CodexAccountPickerSetting.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gui/src/components/CodexAccountPickerSetting.tsx b/gui/src/components/CodexAccountPickerSetting.tsx index e6f48af885..e396de646c 100644 --- a/gui/src/components/CodexAccountPickerSetting.tsx +++ b/gui/src/components/CodexAccountPickerSetting.tsx @@ -78,7 +78,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string // Any in-flight mutation blocks every other mutating control, so a customize toggle cannot // race a model-list save (or vice versa) and leave the confirmed state ambiguous. const busy = saving || customizeSaving || modelsSaving; - const anyMutationInFlight = () => savingRef.current || customizeSavingRef.current || modelsSavingRef.current; + const anyMutationInFlight = useCallback(() => savingRef.current || customizeSavingRef.current || modelsSavingRef.current, []); // Applies the account-selector fields from any /api/settings response (GET or PUT). Live // selector labels are only (re)initialized on the enable-picker PUT and the customize/save @@ -127,7 +127,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string } finally { bounded.clear(); } - }, [apiBase, applyAccountFields]); + }, [apiBase, applyAccountFields, anyMutationInFlight]); useEffect(() => { const timeout = window.setTimeout(() => { void load(); }, 0); @@ -180,7 +180,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string savingRef.current = false; setSaving(false); } - }, [apiBase, hydrated, applyAccountFields, t]); + }, [apiBase, hydrated, applyAccountFields, anyMutationInFlight, t]); const toggleCustomize = useCallback(async () => { if (anyMutationInFlight() || !hydrated || !customizeSupported) return; @@ -232,7 +232,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string customizeSavingRef.current = false; setCustomizeSaving(false); } - }, [apiBase, hydrated, customizeSupported, draft, t]); + }, [apiBase, hydrated, customizeSupported, draft, anyMutationInFlight, t]); const toggleModel = useCallback((selector: string, model: string) => { setDraft(prev => { @@ -277,7 +277,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string modelsSavingRef.current = false; setModelsSaving(false); } - }, [apiBase, customize, dirty, draft, t]); + }, [apiBase, customize, dirty, draft, anyMutationInFlight, t]); const initialLoadFailed = loadError && !hydrated; From f2037b1be5493f10b230b22a0cc0811bdde569a7 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 15:08:27 +0900 Subject: [PATCH 03/12] fix(codex): reject unavailable account picker models --- gui/src/i18n/ru.ts | 2 +- src/server/management/config-routes.ts | 7 ++++++- tests/config/settings-stream-mode.test.ts | 25 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 1666b1be99..de617e2563 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -1889,7 +1889,7 @@ export const ru: Record = { "codexAuth.accountPickerRefreshFailed": "Не удалось обновить эту настройку. По-прежнему показано последнее подтверждённое значение.", "codexAuth.accountPickerCustomizeTitle": "Настроить модели для каждого аккаунта", "codexAuth.accountPickerCustomizeOffDesc": "Сейчас каждый селектор аккаунта показывает все доступные модели, как и до появления этой настройки.", - "codexAuth.accountPickerCustomizeOnDesc": "Выберите ниже, какие модели показывать под каждым селектором аккаунта. Модели общего пула по-прежнему видны везде.", + "codexAuth.accountPickerCustomizeOnDesc": "Выберите ниже, какие модели показывать под каждым селектором аккаунта. Модели общего пула по-прежнему видны в списке моделей.", "codexAuth.accountPickerCustomizeUpdated": "Настройка моделей для каждого аккаунта обновлена.", "codexAuth.accountPickerCustomizeUpdateFailed": "Не удалось обновить настройку моделей для каждого аккаунта. Показана последняя подтверждённая настройка.", "codexAuth.accountPickerModelsCommonNote": "Независимо от выбора ниже, модели общего пула остаются видны в списке.", diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 2ecdd92de0..7fbff2a1ef 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -468,10 +468,15 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise option.selector)); + const available = new Map(accountPickerSettings(config).codexAccountPickerOptions + .map(option => [option.selector, new Set(option.models)])); if (Object.keys(body.codexAccountPickerModels as Record).some(selector => !available.has(selector))) { return jsonResponse({ error: "Unknown Codex account selector" }, 400); } + if (Object.entries(body.codexAccountPickerModels as Record) + .some(([selector, models]) => models.some(model => !available.get(selector)?.has(model)))) { + return jsonResponse({ error: "Model is not available for this Codex account selector" }, 400); + } } if (body.showCodexSparkQuota !== undefined && typeof body.showCodexSparkQuota !== "boolean") { return jsonResponse({ error: "showCodexSparkQuota boolean is required" }, 400); diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index eecde2feaf..cad1ef2b54 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -679,6 +679,31 @@ describe("selective account model settings", () => { }, ); + test("rejects an unavailable model on a known selector before any mutation", async () => { + const config = baseConfig(); + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerEnabled = true; + config.codexAccountPickerModels = { main: ["gpt-5.5"] }; + saveConfig(config); + const stored = readFileSync(getConfigPath(), "utf-8"); + let writes = 0; + let convergences = 0; + const response = await putSettings(config, { + codexAccountPickerModels: { main: ["gpt-5.5", "gpt-not-real"] }, + codexAccountPickerEnabled: false, + }, { + saveConfigPreservingClaudeCode: () => { writes++; }, + createManagementConvergeCodex: catalogConvergenceFactory(() => { convergences++; }), + }); + expect(response!.status).toBe(400); + expect(await response!.json()).toEqual({ error: "Model is not available for this Codex account selector" }); + expect(writes).toBe(0); + expect(convergences).toBe(0); + expect(config.codexAccountPickerModels).toEqual({ main: ["gpt-5.5"] }); + expect(config.codexAccountPickerEnabled).toBe(true); + expect(readFileSync(getConfigPath(), "utf-8")).toBe(stored); + }); + test("failed persistence restores selection and original switch state", async () => { const config = baseConfig(); const previous = { main: ["gpt-5.5"] }; From 28f01c0aab724b065ccc8384e00255c8311ca37f Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 15:33:19 +0900 Subject: [PATCH 04/12] fix(codex): accept o-series account model selections --- .../codex-account-picker-setting.test.tsx | 75 +++++++++++++++++++ src/config/codex-account-picker.ts | 2 +- src/server/management/config-routes.ts | 1 + .../native-model-toggle.test.ts | 11 +++ tests/config/settings-stream-mode.test.ts | 8 ++ 5 files changed, 96 insertions(+), 1 deletion(-) diff --git a/gui/tests/codex-account-picker-setting.test.tsx b/gui/tests/codex-account-picker-setting.test.tsx index 2b1d4d6ee4..918babc461 100644 --- a/gui/tests/codex-account-picker-setting.test.tsx +++ b/gui/tests/codex-account-picker-setting.test.tsx @@ -497,4 +497,79 @@ describe("CodexAccountPickerSetting", () => { expect(checkbox().checked).toBe(true); }); + test("Save sends the full multi-account map, preserving selections for accounts left untouched", async () => { + const options = [ + { selector: "main", models: ["gpt-5.1", "gpt-5.1-codex"] }, + { selector: "work", models: ["gpt-5.2", "gpt-5.2-fast"] }, + ]; + const initialModels = { main: ["gpt-5.1"], work: ["gpt-5.2"] }; + let lastPutBody: { codexAccountPickerModels?: Record } | null = null; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + lastPutBody = JSON.parse(String(init.body)) as { codexAccountPickerModels?: Record }; + return response({ ok: true, codexAccountPickerModels: lastPutBody.codexAccountPickerModels, codexAccountPickerOptions: options }); + } + return response({ codexAccountPickerEnabled: true, codexAccountPickerModels: initialModels, codexAccountPickerOptions: options }); + }) as typeof fetch); + + const rows = Array.from(host.querySelectorAll(".codex-account-picker-account-row")); + expect(rows).toHaveLength(2); + const workRow = rows.find(row => row.textContent?.includes("work"))!; + const workExtraCheckbox = Array.from(workRow.querySelectorAll('input[type="checkbox"]')) + .find(box => !box.checked)!; + expect(workExtraCheckbox).toBeTruthy(); + + act(() => { workExtraCheckbox.click(); }); + await act(async () => { + Array.from(host.querySelectorAll("button")).find(b => b.textContent === "Save")!.click(); + await flush(); + }); + + expect(lastPutBody).not.toBeNull(); + expect(lastPutBody?.codexAccountPickerModels).toEqual({ + main: ["gpt-5.1"], + work: ["gpt-5.2", "gpt-5.2-fast"], + }); + + const mainRow = rows.find(row => row.textContent?.includes("main"))!; + const mainChecked = Array.from(mainRow.querySelectorAll('input[type="checkbox"]')).filter(b => b.checked); + expect(mainChecked).toHaveLength(1); + expect(mainChecked[0]?.parentElement?.textContent).toContain("gpt-5.1"); + const workChecked = Array.from(workRow.querySelectorAll('input[type="checkbox"]')).filter(b => b.checked); + expect(workChecked).toHaveLength(2); + }); + + test("a failed PUT while turning customize off restores the toggle and keeps the prior draft intact", async () => { + const options = [{ selector: "main", models: ["gpt-5.1", "gpt-5.1-codex"] }]; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") return response({ error: "private server path" }, 500); + return response({ + codexAccountPickerEnabled: true, + codexAccountPickerModels: { main: ["gpt-5.1"] }, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + const customizeToggle = () => Array.from(host.querySelectorAll("button.toggle"))[1]!; + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + const checkboxBefore = host.querySelector('input[type="checkbox"]'); + expect(checkboxBefore?.checked).toBe(true); + act(() => { host.querySelectorAll('input[type="checkbox"]')[1]!.click(); }); + + await act(async () => { + customizeToggle().click(); + await flush(); + }); + + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + expect(host.querySelector(".codex-account-picker-models")).not.toBeNull(); + const checkboxAfter = host.querySelector('input[type="checkbox"]'); + expect(checkboxAfter?.checked).toBe(true); + expect(host.querySelectorAll('input[type="checkbox"]')[1]!.checked).toBe(true); + const errorNotice = host.querySelector(".codex-account-picker-feedback.is-err"); + expect(errorNotice).not.toBeNull(); + expect(errorNotice?.textContent).toContain("Could not update per-account model customization"); + expect(errorNotice?.textContent).not.toContain("private server path"); + }); + }); diff --git a/src/config/codex-account-picker.ts b/src/config/codex-account-picker.ts index 7a8830e80f..fec721f00c 100644 --- a/src/config/codex-account-picker.ts +++ b/src/config/codex-account-picker.ts @@ -7,5 +7,5 @@ export function isCodexAccountPickerModels(value: unknown): value is Record isValidProviderName(selector) && Array.isArray(models) && models.every(model => typeof model === "string" - && /^(?:gpt-|codex-)[A-Za-z0-9._-]+$/.test(model))); + && /^(?:(?:gpt-|codex-|o[134]-)[A-Za-z0-9._-]+|o[134])$/.test(model))); } diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 7fbff2a1ef..bf83c426ba 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -183,6 +183,7 @@ interface ClientIntegrationSyncOutcome { function accountPickerSettings(config: OcxConfig) { const choices = { ...config, codexAccountPickerEnabled: true }; delete choices.codexAccountPickerModels; + // Catalog candidates are display choices, not proof of upstream account entitlement. return { codexAccountPickerModels: config.codexAccountPickerModels ?? null, codexAccountPickerOptions: [...accountBoundNativeOpenAiSlugsBySelector(choices)] diff --git a/tests/codex-integration/native-model-toggle.test.ts b/tests/codex-integration/native-model-toggle.test.ts index 7d48bce31b..30d1a1f2bf 100644 --- a/tests/codex-integration/native-model-toggle.test.ts +++ b/tests/codex-integration/native-model-toggle.test.ts @@ -1,3 +1,4 @@ +import { isCodexAccountPickerModels } from "../../src/config/codex-account-picker"; import { accountBoundNativeOpenAiSlugsBySelector } from "../../src/codex/catalog/metadata"; import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; @@ -919,3 +920,13 @@ test("selective account catalog lists only chosen pairs and preserves legacy omi config.codexAccountPickerEnabled = false; expect(accountBoundNativeOpenAiSlugsBySelector(config, []).size).toBe(0); }); + + +test("account picker validation accepts observed o-series catalog choices", () => { + const models = ["o1-mini", "o3-mini", "o4-mini"]; + const config = makeConfig({ codexAccountPickerEnabled: true, codexAccountNamespaces: { main: "@main" } }); + const observed = models.map(slug => ({ ...nativeTemplate(), slug, visibility: "list", supported_in_api: true })); + const choices = accountBoundNativeOpenAiSlugsBySelector(config, observed).get("main")!; + for (const model of models) expect(choices).toContain(model); + expect(isCodexAccountPickerModels({ main: [...choices] })).toBe(true); +}); diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index cad1ef2b54..5b792d8d25 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -727,3 +727,11 @@ test("malformed stored account model preferences preserve providers and reject l expect(loaded.codexAccountPickerModels).toBeUndefined(); expect(validateConfigCandidate({ ...config, codexAccountPickerModels: "invalid" })).toMatchObject({ ok: false }); }); + + +test("o-series account model preferences survive config validation and persistence", () => { + const config = { ...baseConfig(), codexAccountPickerModels: { main: ["o1", "o3", "o1-mini", "o3-mini", "o4-mini"] } }; + expect(validateConfigCandidate(config)).toMatchObject({ ok: true }); + saveConfig(config); + expect(loadConfig().codexAccountPickerModels).toEqual(config.codexAccountPickerModels); +}); From 3cf258e76f6288fbf4121dd914a4cad9198664f6 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:08:01 +0900 Subject: [PATCH 05/12] fix(codex): preserve routing and account selection lifecycle --- .../content/docs/reference/management-api.md | 5 ++- src/server/fast-row.ts | 9 +++- src/server/management/config-routes.ts | 34 ++++++++++---- tests/codex-integration/fast-row.test.ts | 16 +++++++ tests/config/settings-stream-mode.test.ts | 44 +++++++++++++++++++ 5 files changed, 96 insertions(+), 12 deletions(-) diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index 130dfaa49f..2ef2b5c564 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -490,5 +490,8 @@ not proof of upstream permission; catalog entitlement checks still apply. `PUT /api/settings` accepts `codexAccountPickerModels` alone or with the existing switch. An object enables selective mode, `{}` selects none, and `null` removes the preference to restore legacy behavior. Invalid keys, non-array values, non-native model IDs, and unknown -account selectors return 400 before writing. Saving converges the catalog when the preference +account selectors return 400 before writing. An atomic enable-and-select request validates +against the newly initialized selectors and persists those same bindings. Choices for retained +bindings whose accounts are no longer selectable are discarded on save, so stale drafts do not +block editing remaining accounts. Saving converges the catalog when the preference changes; failure rolls the in-memory preference back. No credential fields are returned. diff --git a/src/server/fast-row.ts b/src/server/fast-row.ts index f07bb25b70..a2fd0ef735 100644 --- a/src/server/fast-row.ts +++ b/src/server/fast-row.ts @@ -151,8 +151,13 @@ export function fastRowBases(config: OcxConfig): (id: string) => boolean { if (shouldIncludeAccountBoundNativeOpenAi(config)) { // An EMPTY observed-entry list on purpose: the default argument reads the Codex models // cache and catalog from disk. The empty form still seeds every selector with the native - // model set, and anything publishable is in UPSTREAM_NATIVE_ENTRIES anyway. - for (const [selector, slugs] of accountBoundNativeOpenAiSlugsBySelector(config, [])) { + // model set, and anything publishable is in UPSTREAM_NATIVE_ENTRIES anyway. The picker + // selection is display-only: exact account routing still accepts every native base, so it + // must not make a previously-issued `/--fast` selector unparsable. + for (const [selector, slugs] of accountBoundNativeOpenAiSlugsBySelector({ + ...config, + codexAccountPickerModels: undefined, + }, [])) { for (const slug of slugs) bases.add(`${selector}/${slug}`); } } diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index bf83c426ba..71c69bfcd7 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -468,15 +468,30 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise | undefined; + let initializedPickerNamespaces: OcxConfig["codexAccountNamespaces"]; if (body.codexAccountPickerModels !== undefined && body.codexAccountPickerModels !== null) { - const available = new Map(accountPickerSettings(config).codexAccountPickerOptions - .map(option => [option.selector, new Set(option.models)])); - if (Object.keys(body.codexAccountPickerModels as Record).some(selector => !available.has(selector))) { - return jsonResponse({ error: "Unknown Codex account selector" }, 400); + const choices = { ...config }; + if (body.codexAccountPickerEnabled === true) { + choices.codexAccountPickerEnabled = true; + if (initializeDefaultCodexAccountNamespaces(choices)) { + initializedPickerNamespaces = choices.codexAccountNamespaces; + } } - if (Object.entries(body.codexAccountPickerModels as Record) - .some(([selector, models]) => models.some(model => !available.get(selector)?.has(model)))) { - return jsonResponse({ error: "Model is not available for this Codex account selector" }, 400); + const available = new Map(accountPickerSettings(choices).codexAccountPickerOptions + .map(option => [option.selector, new Set(option.models)])); + selectedAccountModels = {}; + for (const [selector, models] of Object.entries(body.codexAccountPickerModels as Record)) { + const candidates = available.get(selector); + if (!candidates) { + // Deleted accounts retain their bindings; discard stale display choices on save. + if (Object.hasOwn(choices.codexAccountNamespaces ?? {}, selector)) continue; + return jsonResponse({ error: "Unknown Codex account selector" }, 400); + } + if (models.some(model => !candidates.has(model))) { + return jsonResponse({ error: "Model is not available for this Codex account selector" }, 400); + } + selectedAccountModels[selector] = models; } } if (body.showCodexSparkQuota !== undefined && typeof body.showCodexSparkQuota !== "boolean") { @@ -570,14 +585,15 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise); + config.codexAccountPickerModels = structuredClone(selectedAccountModels!); } if (typeof body.oauthOpenBrowser === "boolean") { config.oauthOpenBrowser = body.oauthOpenBrowser; diff --git a/tests/codex-integration/fast-row.test.ts b/tests/codex-integration/fast-row.test.ts index a8e9525e49..a433c7ff8e 100644 --- a/tests/codex-integration/fast-row.test.ts +++ b/tests/codex-integration/fast-row.test.ts @@ -247,6 +247,22 @@ describe("publication and parsing agree", () => { expect(parseFastRowId("desktop/gpt-5.6-sol--fast", config, new Set(), bases)) .toEqual({ baseId: "desktop/gpt-5.6-sol" }); }); + + test("a selective picker filter cannot make an exact-account fast base unparsable", () => { + // `codexAccountPickerModels` filters catalog display only. The underlying exact-account + // route remains valid, and the Fast parser must keep stripping its synthetic suffix even + // when this base is deliberately absent from the account's picker rows. + const config = configWith({ + openai: provider({ authMode: "forward", baseUrl: "https://chatgpt.com/backend-api/codex" }), + }, { + codexAccountNamespaces: { side: "@main" }, + codexAccountPickerModels: { side: ["gpt-daybreak-blue-latest"] }, + } as Partial); + const bases = fastRowBases(config); + expect(bases("side/gpt-5.6-sol")).toBe(true); + expect(parseFastRowId("side/gpt-5.6-sol--fast", config, new Set(), bases)) + .toEqual({ baseId: "side/gpt-5.6-sol" }); + }); }); describe("routable bases do not depend on the live-model cache", () => { diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index 5b792d8d25..3171a5eee0 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -735,3 +735,47 @@ test("o-series account model preferences survive config validation and persisten saveConfig(config); expect(loadConfig().codexAccountPickerModels).toEqual(config.codexAccountPickerModels); }); + + +test("first enable and selected models save atomically with generated selectors", async () => { + const config = baseConfig(); + const response = await putSettings(config, { codexAccountPickerEnabled: true, codexAccountPickerModels: { main: ["gpt-5.5"] } }, { + saveConfigPreservingClaudeCode: saveConfig, + createManagementConvergeCodex: catalogConvergenceFactory(() => {}), + }); + expect(response!.status).toBe(200); + expect(config.codexAccountNamespaces).toEqual({ main: "@main" }); + expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-5.5"] }); +}); + +test("invalid atomic selection does not initialize selectors or write settings", async () => { + const config = baseConfig(); + const before = structuredClone(config); + let writes = 0; + const response = await putSettings(config, { codexAccountPickerEnabled: true, codexAccountPickerModels: { main: ["gpt-not-real"] } }, { + saveConfigPreservingClaudeCode: () => { writes++; }, + }); + expect(response!.status).toBe(400); + expect(config).toEqual(before); + expect(writes).toBe(0); +}); + +test("saving after account removal prunes stale choices, including a restored draft", async () => { + const config = baseConfig(); + config.codexAccountPickerEnabled = true; + config.codexAccountNamespaces = { main: "@main", removed: "deleted-pool" }; + config.codexAccounts = []; + const draft = { main: ["gpt-5.5"], removed: ["gpt-5.5"] }; + config.codexAccountPickerModels = structuredClone(draft); + const deps: ManagementApiDeps = { saveConfigPreservingClaudeCode: saveConfig, createManagementConvergeCodex: catalogConvergenceFactory(() => {}) }; + for (const restore of [false, true]) { + if (restore) await putSettings(config, { codexAccountPickerModels: null }, deps); + const response = await putSettings(config, { codexAccountPickerModels: draft }, deps); + expect(response!.status).toBe(200); + expect(config.codexAccountPickerModels).toEqual({ main: ["gpt-5.5"] }); + expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-5.5"] }); + expect(config.codexAccountNamespaces.removed).toBe("deleted-pool"); + } + const response = await putSettings(config, { codexAccountPickerModels: { unknown: ["gpt-5.5"] } }, deps); + expect(response!.status).toBe(400); +}); From 7625872f04d30fcb12d946e0c7cf0940787ef752 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:23:32 +0900 Subject: [PATCH 06/12] docs(api): clarify retained account selector handling --- docs-site/src/content/docs/reference/management-api.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index 2ef2b5c564..423d59476c 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -489,8 +489,9 @@ not proof of upstream permission; catalog entitlement checks still apply. `PUT /api/settings` accepts `codexAccountPickerModels` alone or with the existing switch. An object enables selective mode, `{}` selects none, and `null` removes the preference to -restore legacy behavior. Invalid keys, non-array values, non-native model IDs, and unknown -account selectors return 400 before writing. An atomic enable-and-select request validates +restore legacy behavior. Invalid keys, non-array values, and non-native model IDs return 400 before writing. +An account selector returns 400 only if it is neither a current candidate nor a retained +`codexAccountNamespaces` binding. An atomic enable-and-select request validates against the newly initialized selectors and persists those same bindings. Choices for retained bindings whose accounts are no longer selectable are discarded on save, so stale drafts do not block editing remaining accounts. Saving converges the catalog when the preference From c17c0ac153efdce2c5547e3176a0791fa795853b Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:38:14 +0900 Subject: [PATCH 07/12] fix(codex): preserve live pooled models and expose eligible Reserve --- .../docs/fr/guides/codex-app-models.md | 10 +++-- .../content/docs/guides/codex-app-models.md | 10 +++-- .../docs/ja/guides/codex-app-models.md | 4 +- .../docs/ko/guides/codex-app-models.md | 9 ++-- .../docs/ru/guides/codex-app-models.md | 11 ++--- .../docs/tr/guides/codex-app-models.md | 12 ++--- .../docs/zh-cn/guides/codex-app-models.md | 4 +- .../docs/zh-tw/guides/codex-app-models.md | 8 ++-- src/server/index.ts | 2 +- src/server/management/config-routes.ts | 14 +++++- tests/config/settings-stream-mode.test.ts | 22 ++++++++++ tests/server/server-auth.test.ts | 44 +++++++++++++++++++ 12 files changed, 118 insertions(+), 32 deletions(-) diff --git a/docs-site/src/content/docs/fr/guides/codex-app-models.md b/docs-site/src/content/docs/fr/guides/codex-app-models.md index fb81b9597e..ba03189e24 100644 --- a/docs-site/src/content/docs/fr/guides/codex-app-models.md +++ b/docs-site/src/content/docs/fr/guides/codex-app-models.md @@ -12,9 +12,11 @@ Les entrées OpenAI utilisent deux routes d'identification : la connexion Codex clé API avec espace de noms `openai-apikey/`. Le simple passage de `codexAccountMode` entre Pool et Direct ne change pas les identifiants du sélecteur. Toutefois, lorsque les lignes qualifiées par compte sont activées avec `codexAccountPickerEnabled` et que `codexAccountNamespaces` contient des sélecteurs admissibles -dont les comptes associés existent toujours, opencodex ajoute une ligne -`/` distincte pour chaque compte associé et masque les lignes natives non -qualifiées du sélecteur Codex. Les libellés des sélecteurs sont des noms publics choisis par l'utilisateur et +dont les comptes associés existent toujours, le résultat dépend de `codexAccountPickerModels`. Lorsque cette +table est omise, le comportement historique ajoute une ligne `/` pour chaque +modèle pris en charge et masque les lignes natives non qualifiées du sélecteur Codex. Lorsque la table est +présente, les modèles natifs du groupe commun restent visibles sous forme de lignes non qualifiées, et seules +les paires de modèles et de comptes sélectionnées reçoivent des lignes qualifiées. Les libellés des sélecteurs sont des noms publics choisis par l'utilisateur et n'ont aucune signification intégrée quant au rôle du compte. Choisir une ligne qualifiée utilise exclusivement le compte associé, ne change pas le compte Pool actif et échoue de façon fermée au lieu de changer de compte si la cible n'est pas disponible. Si le catalogue Codex propre à un compte contient un identifiant visible de @@ -139,7 +141,7 @@ approximation fondée sur un ancien modèle d'entrée. | Route | Identifiants du sélecteur et métadonnées du catalogue | | --- | --- | | Connexion Codex (lignes qualifiées par compte désactivées) | Identifiants natifs non qualifiés comme `gpt-5.6-sol`, `gpt-5.6-terra` et `gpt-5.6-luna` ; Pool ou Direct est choisi avec `codexAccountMode`. Les lignes GPT-5.6 utilisent une fenêtre de catalogue de 372 000 jetons. | -| Connexion Codex (lignes qualifiées par compte activées avec des sélecteurs admissibles) | Une ligne `/` par sélecteur admissible et modèle natif pris en charge ; chaque ligne utilise exclusivement le compte associé, et les lignes natives non qualifiées sont masquées dans le sélecteur. Les métadonnées natives et les fenêtres de contexte sont préservées. | +| Connexion Codex (lignes qualifiées par compte activées avec des sélecteurs admissibles) | Lorsque `codexAccountPickerModels` est omis, chaque sélecteur admissible reçoit tous les modèles natifs pris en charge et les lignes natives non qualifiées sont masquées. Lorsque la table est présente, les modèles natifs du groupe commun restent visibles sous forme de lignes non qualifiées et seules les paires de modèles et de sélecteurs choisies reçoivent des lignes qualifiées. Chaque ligne qualifiée utilise exclusivement le compte associé. Les métadonnées natives et les fenêtres de contexte sont préservées. | | Connexion Codex (ligne Daybreak transférée explicitement) | `openai/gpt-daybreak-blue-latest` uniquement lorsque l'entrée `customModels` exacte est configurée sur le fournisseur canonique `openai`. Elle conserve l'identifiant Daybreak transmis et utilise l'instantané de capacités Sol épinglé (contexte de 372 000 jetons ; compactage automatique à 334 800 jetons). | | OpenAI (clé API) | Exactement dix lignes avec espace de noms : `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, les trois identifiants virtuels `*-pro` et les deux alias Daybreak (contexte de 1 050 000 jetons ; entrée maximale de 922 000 jetons pour les dix) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1 050 000) | diff --git a/docs-site/src/content/docs/guides/codex-app-models.md b/docs-site/src/content/docs/guides/codex-app-models.md index f2807c9e2d..923b60ee7f 100644 --- a/docs-site/src/content/docs/guides/codex-app-models.md +++ b/docs-site/src/content/docs/guides/codex-app-models.md @@ -11,9 +11,11 @@ OpenAI entries use two credential routes: native Codex login and the namespaced `openai-apikey/` API-key transport. Changing `codexAccountMode` between Pool and Direct by itself does not change picker ids. When account-qualified picker rows are enabled by `codexAccountPickerEnabled` and `codexAccountNamespaces` has eligible selectors whose -mapped accounts still exist, however, -opencodex adds separate `/` rows for the mapped accounts and hides -the bare native rows from the Codex picker. Selector labels are user-chosen public names with no +mapped accounts still exist, the result depends on `codexAccountPickerModels`. When that map is +omitted, legacy behavior adds separate `/` rows for every supported +model and hides the bare native rows from the Codex picker. When the map is present, common pooled +native models remain visible as bare rows, and only the selected model and account pairs receive +qualified rows. Selector labels are user-chosen public names with no built-in account-role meaning. Selecting a qualified row uses only its mapped account, does not change the active Pool account, and fails closed instead of switching accounts when the target is unavailable. If Codex's account-scoped catalog contains a visible, API-supported OpenAI-family id @@ -197,7 +199,7 @@ metadata instead of an older-template approximation. | Route | Picker ids and catalog metadata | | --- | --- | | Codex login (account-qualified rows disabled) | Bare native ids such as `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`; Pool or Direct is selected through `codexAccountMode`. GPT-5.6 rows use a 922,000-token catalog window. | -| Codex login (account-qualified rows enabled with eligible selectors) | One `/` row per eligible selector and supported native model; each row uses only its mapped account, and bare native rows are hidden from the picker. Native metadata and context windows are preserved. | +| Codex login (account-qualified rows enabled with eligible selectors) | With `codexAccountPickerModels` omitted, every eligible selector receives every supported native model and bare native rows are hidden. With the map present, common pooled native models remain visible as bare rows and only selected model and selector pairs receive qualified rows. Each qualified row uses only its mapped account. Native metadata and context windows are preserved. | | Codex login (explicit Daybreak forward row) | `openai/gpt-daybreak-blue-latest` only when the exact `customModels` row is configured on the canonical `openai` provider. It keeps the Daybreak wire id and uses the pinned Sol capability snapshot (922,000 context; 829,800 automatic compaction). | | OpenAI (API key) | Exactly ten namespaced rows: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, the three `*-pro` virtual ids, and the two Daybreak aliases (1,050,000 context; 922,000 max input for all ten) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (922,000) | diff --git a/docs-site/src/content/docs/ja/guides/codex-app-models.md b/docs-site/src/content/docs/ja/guides/codex-app-models.md index 93385300ec..8ef69dbd07 100644 --- a/docs-site/src/content/docs/ja/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ja/guides/codex-app-models.md @@ -8,7 +8,7 @@ opencodex は Codex アプリにパッチを適用しません。Codex CLI/TUI リリースは renderer 側で追加の remote allowlist を適用し、routed row を picker から除外する ことがあります。明示的な `nativeAlias: true` combo が、この上流不具合向けの互換モードです。 -OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountPickerEnabled` によって account-qualified picker 行が有効で、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、opencodex は対応するアカウントごとに `/` 行を追加し、ピッカーでは bare native 行を非表示にします。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。 +OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountPickerEnabled` によって account-qualified picker 行が有効で、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、結果は `codexAccountPickerModels` によって変わります。この map を省略すると、従来の動作として、すべての対応モデルに `/` 行が追加され、ピッカーの bare native 行は非表示になります。map が存在する場合、共通プールの native model は bare 行として表示されたままで、選択したモデルとアカウントの組み合わせだけに qualified 行が追加されます。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。 `codexAccountNamespaces` map が空の場合、account-qualified picker 行は off です。空でない map で `codexAccountPickerEnabled` を省略すると、後方互換性のため有効として扱われます。`false` にすると、mapping を削除せず、明示的な `/` routing も無効にせずに、生成された qualified 行を非表示にして picker の bare native 行を復元します。 @@ -53,7 +53,7 @@ visibility = "list" |ルート |ピッカー ID とカタログのメタデータ | | --- | --- | | Codex ログイン (account-qualified 行が無効) | `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna` などの bare native id を表示し、`codexAccountMode` に従って Pool または Direct を使用します。GPT-5.6 行のカタログ ウィンドウは 922,000 トークンです。 | -| Codex ログイン (account-qualified 行が有効で、有効な selector あり) | 有効な selector とサポート対象 native model の各組み合わせに `/` 行を表示します。各行は対応付けられたアカウントだけを使用し、bare native 行はピッカーで非表示になります。Native metadata と context window は保持されます。 | +| Codex ログイン (account-qualified 行が有効で、有効な selector あり) | `codexAccountPickerModels` を省略すると、各 selector にすべての対応 native model の行が追加され、bare native 行は非表示になります。map が存在する場合、共通プールの native model は bare 行として表示されたままで、選択したモデルと selector の組み合わせだけに qualified 行が追加されます。各 qualified 行は対応付けられたアカウントだけを使用します。Native metadata と context window は保持されます。 | | OpenAI (API キー) |正確に 8 つの名前空間行: `gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、および 3 つの `*-pro` 仮想 ID (コンテキスト 922,000、8 つすべての最大入力 922,000) | |オープンルーター | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna` (922,000) | | Cursor | 静的フォールバックには `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna` (1,000,000) と、Grok 4.5 / 4.6 の通常・Fast 行 (500,000) が含まれます。4.6 は `xhigh` も公開し、ライブアカウントの検出によって表示される行が決まります。 | diff --git a/docs-site/src/content/docs/ko/guides/codex-app-models.md b/docs-site/src/content/docs/ko/guides/codex-app-models.md index 0642712082..121a06940c 100644 --- a/docs-site/src/content/docs/ko/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ko/guides/codex-app-models.md @@ -11,9 +11,10 @@ allowlist를 적용해 routed row를 picker에서 제거할 수 있습니다. OpenAI 항목에는 네이티브 Codex 로그인과 네임스페이스가 붙은 `openai-apikey/` API key 경로라는 두 가지 credential 경로가 있습니다. `codexAccountMode`만 Pool과 Direct 사이에서 바꾸는 것은 선택기 id를 바꾸지 않습니다. 하지만 `codexAccountPickerEnabled`로 계정 한정 선택기 행이 활성화되어 있고 -`codexAccountNamespaces`에 대상 계정이 존재하는 selector가 있으면, -opencodex는 매핑된 계정별로 `/` 행을 추가하고 선택기에서 bare native 행을 -숨깁니다. Selector 이름은 사용자가 정하는 공개 label이며 내장된 계정 역할 의미가 없습니다. `selector`가 +`codexAccountNamespaces`에 대상 계정이 존재하는 selector가 있으면 결과는 `codexAccountPickerModels`에 따라 +달라집니다. 이 map을 생략하면 기존 동작대로 모든 지원 모델에 `/` 행을 추가하고 +선택기에서 bare native 행을 숨깁니다. map이 있으면 공통 풀 native model은 bare 행으로 계속 표시되고, 선택한 +모델과 계정 조합에만 qualified 행을 추가합니다. Selector 이름은 사용자가 정하는 공개 label이며 내장된 계정 역할 의미가 없습니다. `selector`가 붙은 행을 선택하면 매핑된 계정만 사용하고 활성 Pool 계정은 바뀌지 않습니다. 대상 계정을 사용할 수 없으면 다른 계정으로 전환하지 않고 요청이 실패합니다. 자세한 내용은 [명시적 Codex 계정 selector](/reference/configuration/routing/#exact-codex-account-selectors)를 참고하세요. @@ -106,7 +107,7 @@ GPT-5.6에만 사용합니다. 오래된 템플릿으로 근사하지 않고 모 | 경로 | 선택기 id와 카탈로그 메타데이터 | | --- | --- | | Codex 로그인(계정 한정 선택기 행 비활성) | `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna` 같은 bare native id를 표시하고 `codexAccountMode`에 따라 Pool 또는 Direct를 사용합니다. GPT-5.6 행의 카탈로그 창은 922,000토큰입니다. | -| Codex 로그인(계정 한정 선택기 행 활성, 유효한 selector 있음) | 유효한 selector와 지원되는 native model의 각 조합마다 `/` 행을 표시합니다. 각 행은 매핑된 계정만 사용하며 bare native 행은 선택기에서 숨깁니다. Native metadata와 context window는 보존됩니다. | +| Codex 로그인(계정 한정 선택기 행 활성, 유효한 selector 있음) | `codexAccountPickerModels`를 생략하면 각 유효한 selector에 모든 지원 native model 행을 추가하고 bare native 행을 숨깁니다. map이 있으면 공통 풀 native model은 bare 행으로 계속 표시되고 선택한 모델과 selector 조합에만 qualified 행을 추가합니다. 각 qualified 행은 매핑된 계정만 사용합니다. Native metadata와 context window는 보존됩니다. | | Codex 로그인(명시적 Daybreak forward 행) | canonical `openai` provider에 정확한 `customModels` 항목이 있을 때만 `openai/gpt-daybreak-blue-latest`를 표시합니다. Daybreak wire id를 유지하고 고정된 Sol capability snapshot(컨텍스트 922,000; 자동 압축점 922,000)을 사용합니다. | | OpenAI(API key) | 정확히 열 개의 네임스페이스 행: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, 세 개의 `*-pro` 가상 id, 두 Daybreak 별칭 (모두 컨텍스트 922,000; 최대 입력 922,000) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (922,000) | diff --git a/docs-site/src/content/docs/ru/guides/codex-app-models.md b/docs-site/src/content/docs/ru/guides/codex-app-models.md index e208ab4b0b..a49086d709 100644 --- a/docs-site/src/content/docs/ru/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ru/guides/codex-app-models.md @@ -11,10 +11,11 @@ Codex Desktop применяют в renderer дополнительный remote Записи OpenAI используют два credential-транспорта: нативный вход Codex и namespaced-транспорт API-ключа `openai-apikey/`. Само по себе переключение `codexAccountMode` между Pool и Direct не меняет id в picker'е. Однако если `codexAccountPickerEnabled` включает строки picker'а с -указанием аккаунта и в -`codexAccountNamespaces` есть подходящие селекторы, -opencodex добавляет для сопоставленных аккаунтов отдельные строки -`/` и скрывает bare native-строки из picker'а. Имена селекторов — +указанием аккаунта и в `codexAccountNamespaces` есть подходящие селекторы, результат зависит от +`codexAccountPickerModels`. Если эта map не задана, прежнее поведение добавляет для каждой +поддерживаемой модели отдельные строки `/` и скрывает bare +native-строки из picker'а. Если map задана, нативные модели общего пула остаются видимыми как bare +строки, а qualified-строки создаются только для выбранных пар модели и аккаунта. Имена селекторов — это публичные метки, которые выбирает пользователь; встроенного смысла роли аккаунта у них нет. Выбор строки с селектором использует только сопоставленный аккаунт, не меняет активный аккаунт Pool и при недоступности цели завершается ошибкой без переключения на другой аккаунт. Подробнее см. @@ -86,7 +87,7 @@ per-model identity и метаданные вместо приближения | Маршрут | Id в селекторе и метаданные каталога | | --- | --- | | Вход Codex (строки с указанием аккаунта выключены) | Bare native-id, например `gpt-5.6-sol`, `gpt-5.6-terra` и `gpt-5.6-luna`; Pool или Direct выбирается через `codexAccountMode`. У строк GPT-5.6 окно каталога 922 000 токенов. | -| Вход Codex (строки с указанием аккаунта включены и есть подходящие селекторы) | По одной строке `/` для каждой пары подходящего селектора и поддерживаемой нативной модели; каждая строка использует только сопоставленный аккаунт, а bare native-строки скрыты из picker'а. Нативные метаданные и окна контекста сохраняются. | +| Вход Codex (строки с указанием аккаунта включены и есть подходящие селекторы) | Если `codexAccountPickerModels` не задана, каждый подходящий селектор получает все поддерживаемые нативные модели, а bare native-строки скрыты. Если map задана, нативные модели общего пула остаются видимыми как bare строки, а qualified-строки создаются только для выбранных пар модели и селектора. Каждая qualified-строка использует только сопоставленный аккаунт. Нативные метаданные и окна контекста сохраняются. | | OpenAI (API key) | Ровно восемь namespaced-строк: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna и три виртуальных id `*-pro` (контекст 922,000; максимум входа 922,000 у всех восьми) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (922,000) | | Cursor | Статический fallback включает `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra` и `cursor/gpt-5.6-luna` (1,000,000), а также обычные/Fast-строки Grok 4.5 и 4.6 (500,000). Для 4.6 доступен ещё `xhigh`; какие строки останутся видимыми, решает live-discovery аккаунта. | diff --git a/docs-site/src/content/docs/tr/guides/codex-app-models.md b/docs-site/src/content/docs/tr/guides/codex-app-models.md index 2ddd5bd63a..2def98addf 100644 --- a/docs-site/src/content/docs/tr/guides/codex-app-models.md +++ b/docs-site/src/content/docs/tr/guides/codex-app-models.md @@ -14,9 +14,12 @@ alanlı `openai-apikey/` API anahtarı aktarımı. `codexAccountMode`'u P ve Direct arasında değiştirmek tek başına seçici kimliklerini değiştirmez. Bununla birlikte, hesap nitelikli seçici satırları `codexAccountPickerEnabled` tarafından etkinleştirildiğinde ve `codexAccountNamespaces`, eşlenen hesapları -hala mevcut olan uygun seçicilere sahip olduğunda, opencodex eşlenen hesaplar -için ayrı `/` satırları ekler ve yalın yerel -satırları Codex seçicisinden gizler. Seçici etiketleri, yerleşik bir hesap rolü +hala mevcut olan uygun seçicilere sahip olduğunda sonuç `codexAccountPickerModels` +ayarına bağlıdır. Bu harita atlanırsa eski davranış, desteklenen her model için +`/` satırları ekler ve yalın yerel satırları Codex +seçicisinden gizler. Harita mevcutsa ortak havuzdaki yerel modeller yalın satırlar +olarak görünmeye devam eder ve yalnızca seçilen model ve hesap çiftlerine nitelikli +satırlar eklenir. Seçici etiketleri, yerleşik bir hesap rolü anlamı olmayan, kullanıcı tarafından seçilen genel adlardır. Nitelikli bir satırı seçmek yalnızca eşlenen hesabını kullanır, aktif Havuz hesabını değiştirmez ve hedef kullanılamadığında hesap değiştirmek yerine kapalı olarak @@ -154,7 +157,7 @@ meta verileri sağladığı GPT-5.6 için kullanılır. | Rota | Seçici kimlikleri ve katalog meta verileri | | --- | --- | | Codex girişi (hesap nitelikli satırlar devre dışı) | `gpt-5.6-sol`, `gpt-5.6-terra` ve `gpt-5.6-luna` gibi yalın yerel kimlikler; Pool veya Direct `codexAccountMode` aracılığıyla seçilir. GPT-5.6 satırları 922.000 tokenlik bir katalog penceresi kullanır. | -| Codex girişi (uygun seçicilerle hesap nitelikli satırlar etkin) | Uygun seçici ve desteklenen yerel model başına bir `/` satırı; her satır yalnızca eşlenen hesabını kullanır ve yalın yerel satırlar seçiciden gizlenir. Yerel meta veriler ve bağlam pencereleri korunur. | +| Codex girişi (uygun seçicilerle hesap nitelikli satırlar etkin) | `codexAccountPickerModels` atlanırsa her uygun seçici desteklenen tüm yerel modelleri alır ve yalın yerel satırlar gizlenir. Harita mevcutsa ortak havuzdaki yerel modeller yalın satırlar olarak görünmeye devam eder ve yalnızca seçilen model ve seçici çiftlerine nitelikli satırlar eklenir. Her nitelikli satır yalnızca eşlenen hesabını kullanır. Yerel meta veriler ve bağlam pencereleri korunur. | | Codex girişi (açık Daybreak iletme satırı) | Yalnızca tam `customModels` satırı kurallı `openai` sağlayıcısında yapılandırıldığında `openai/gpt-daybreak-blue-latest`. Daybreak hat kimliğini korur ve sabitlenmiş Sol yetenek anlık görüntüsünü kullanır (922.000 bağlam; 829.800 otomatik sıkıştırma). | | OpenAI (API anahtarı) | Tam olarak on ad alanlı satır: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, üç `*-pro` sanal kimliği ve iki Daybreak takma adı (onunun tümü için 922.000 bağlam; 922.000 maksimum girdi) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (922.000) | @@ -314,4 +317,3 @@ ocx sync opencodex, katalog görünürlüğü, önceliği veya meta verileri her değiştiğinde `models_cache.json` dosyasını kasıtlı olarak eski bir önbellek sarmalayıcısıyla yeniden yazar, böylece bir sonraki Codex model yenilemesi yeni kataloğu okur. - diff --git a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md index 241b812252..201691490a 100644 --- a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md @@ -7,7 +7,7 @@ opencodex 不会修改 Codex App。它会写入 Codex CLI/TUI 使用的同一套 app-server 会读取这份共享状态,但部分 Codex Desktop 版本还会在 renderer 中应用第二层远程 allowlist,因此仍可能从选择器里删掉路由模型。 -OpenAI 条目有两种凭据通道:原生 Codex 登录,以及命名空间化的 `openai-apikey/` API key 通道。仅在 Pool 与 Direct 之间切换 `codexAccountMode` 不会改变选择器 id。但当 `codexAccountPickerEnabled` 启用了账户限定的选择器行,且 `codexAccountNamespaces` 中有目标账户存在的 selector 时,opencodex 会为映射账户添加独立的 `/` 行,并在选择器中隐藏裸原生行。Selector 名称是用户自定义的公开标签,没有内置的账户角色含义。选择带 `selector` 的行只会使用映射账户,不会更改当前 Pool 账户;目标不可用时,请求会直接失败,不会切换到其他账户。详情请参阅[精确 Codex 账户选择器](/reference/configuration/routing/#exact-codex-account-selectors)。 +OpenAI 条目有两种凭据通道:原生 Codex 登录,以及命名空间化的 `openai-apikey/` API key 通道。仅在 Pool 与 Direct 之间切换 `codexAccountMode` 不会改变选择器 id。但当 `codexAccountPickerEnabled` 启用了账户限定的选择器行,且 `codexAccountNamespaces` 中有目标账户存在的 selector 时,结果取决于 `codexAccountPickerModels`。省略该映射时,系统沿用旧行为:为每个受支持模型添加独立的 `/` 行,并在选择器中隐藏裸原生行。提供该映射时,公共池原生模型仍以裸行显示,只有所选的模型和账户组合会添加限定行。Selector 名称是用户自定义的公开标签,没有内置的账户角色含义。选择带 `selector` 的行只会使用映射账户,不会更改当前 Pool 账户;目标不可用时,请求会直接失败,不会切换到其他账户。详情请参阅[精确 Codex 账户选择器](/reference/configuration/routing/#exact-codex-account-selectors)。 `codexAccountNamespaces` 映射为空时,账户限定的选择器行处于关闭状态。非空映射中省略 `codexAccountPickerEnabled` 时,为保持向后兼容会视为已启用。设为 `false` 会隐藏生成的账户限定行并恢复选择器中的裸原生行,但不会删除映射,也不会禁用精确的 `/` 路由。 @@ -66,7 +66,7 @@ visibility = "list" | 路由 | 选择器 id 与目录元数据 | | --- | --- | | Codex 登录(账户限定的选择器行未启用) | 显示 `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna` 等裸原生 id,并按 `codexAccountMode` 使用 Pool 或 Direct。GPT-5.6 行使用 922,000-token 目录窗口。 | -| Codex 登录(账户限定的选择器行已启用且存在有效 selector) | 为每个有效 selector 与受支持原生模型的组合显示 `/` 行。每行只使用映射账户,裸原生行会从选择器中隐藏。原生 metadata 与 context window 会保留。 | +| Codex 登录(账户限定的选择器行已启用且存在有效 selector) | 省略 `codexAccountPickerModels` 时,每个有效 selector 都会获得所有受支持原生模型的行,裸原生行会被隐藏。提供该映射时,公共池原生模型仍以裸行显示,只有所选的模型和 selector 组合会添加限定行。每个限定行只使用映射账户。原生 metadata 与 context window 会保留。 | | OpenAI(API key) | 恰好八个命名空间行:`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna,以及三个 `*-pro` 虚拟 id(八个条目均为 1,050,000 context / 922,000 max input) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna`(922,000) | | Cursor | 静态回退包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 Grok 4.5/4.6 的普通和 Fast 条目(500,000)。4.6 还提供 `xhigh`;实时账户发现会决定最终哪些条目仍然可见。 | diff --git a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md index 260ab7ad36..abf697a5b2 100644 --- a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md @@ -10,8 +10,10 @@ Codex 的 app-server 會讀取這份共享狀態,但部分 Codex Desktop 版 OpenAI 條目使用兩條憑證路線:原生 Codex 登入,以及帶名稱空間的 `openai-apikey/` API key 傳輸。僅在 Pool 與 Direct 之間切換 `codexAccountMode` 本身不會改變選擇器 id。不過, 當 `codexAccountPickerEnabled` 啟用帳號限定選擇器列,且 `codexAccountNamespaces` 中仍有對應 -帳號存在的合格選擇器時,opencodex 會為這些對應帳號新增獨立的 `/` -列,並從 Codex 選擇器中隱藏裸的原生列。選擇器標籤是使用者自訂的公開名稱,本身沒有帳號角色 +帳號存在的合格選擇器時,結果取決於 `codexAccountPickerModels`。省略這份對應表時,系統沿用舊行為: +為每個受支援模型新增獨立的 `/` 列,並從 Codex 選擇器中隱藏裸的 +原生列。提供這份對應表時,共用池原生模型仍以裸列顯示,只有選取的模型與帳號組合會新增限定列。 +選擇器標籤是使用者自訂的公開名稱,本身沒有帳號角色 的語意。選擇限定列只會使用其對應的帳號,不會改變目前 Pool 帳號;當目標不可用時會失敗關閉 (fails closed),而不是切換帳號。參見 [精確 Codex 帳號選擇器](/zh-tw/reference/configuration/routing/#精確-codex-帳號選擇器)。 @@ -88,7 +90,7 @@ GPT-5.6,以便提供每個模型真實的身份和後設資料,而不是套 | 路由 | 選擇器 id 與目錄後設資料 | | --- | --- | | Codex 登入(停用帳號限定列) | 裸原生 id,例如 `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna`;透過 `codexAccountMode` 選擇 Pool 或 Direct。GPT-5.6 列使用 922,000 token 的目錄視窗。 | -| Codex 登入(啟用帳號限定列且有合格選擇器) | 每個合格選擇器與受支援的原生模型各有一列 `/`;每列只使用其對應帳號,且裸原生列會從選擇器中隱藏。原生後設資料與 context 視窗保持不變。 | +| Codex 登入(啟用帳號限定列且有合格選擇器) | 省略 `codexAccountPickerModels` 時,每個合格選擇器都會取得所有受支援原生模型的列,裸原生列會被隱藏。提供這份對應表時,共用池原生模型仍以裸列顯示,只有選取的模型與選擇器組合會新增限定列。每個限定列只使用其對應帳號。原生後設資料與 context 視窗保持不變。 | | OpenAI(API key) | 恰好八個帶名稱空間的列:`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna 與三個 `*-pro` 虛擬 id(全部八個都是 1,050,000 context;922,000 max input) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna`(922,000) | | Cursor | 靜態回退目錄包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 Grok 4.5/4.6 的一般與 Fast 項目(500,000)。4.6 還提供 `xhigh`;帳號的即時發現結果決定最終顯示哪些模型。 | diff --git a/src/server/index.ts b/src/server/index.ts index dc3bc2561d..737748f59f 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1592,7 +1592,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server 0, + accountSelectors.length > 0 && config.codexAccountPickerModels === undefined, new Set(accountNativeSlugs), ), }, 200, req, policy); diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 71c69bfcd7..5e8b81a383 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -1,3 +1,6 @@ +import { isEffectiveCodexDesktopAuthless } from "../../codex/loopback-target"; +import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "../../codex/account-namespaces"; +import { NATIVE_RESERVE_MODEL } from "../../codex/catalog/native-models"; import { isCodexAccountPickerModels } from "../../config/codex-account-picker"; import { accountBoundNativeOpenAiSlugsBySelector } from "../../codex/catalog/metadata"; import type { IntegrationClientId } from "../../integrations/registry"; @@ -184,10 +187,16 @@ function accountPickerSettings(config: OcxConfig) { const choices = { ...config, codexAccountPickerEnabled: true }; delete choices.codexAccountPickerModels; // Catalog candidates are display choices, not proof of upstream account entitlement. + const targets = new Map(codexAccountNamespaceEntries(choices)); return { codexAccountPickerModels: config.codexAccountPickerModels ?? null, codexAccountPickerOptions: [...accountBoundNativeOpenAiSlugsBySelector(choices)] - .map(([selector, models]) => ({ selector, models })), + .map(([selector, models]) => ({ + selector, + models: isEffectiveCodexDesktopAuthless(choices) && isMainCodexAccountTarget(targets.get(selector) ?? "") + ? [...models, NATIVE_RESERVE_MODEL] + : models, + })), }; } @@ -450,7 +459,7 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise { const config = baseConfig(); const res = await putSettings(config, {}); expect(res!.status).toBe(400); + expect((await res!.json()).error).toContain("codexAccountPickerModels"); }); test.each([[null], [[]], ["settings"], [42]] as const)( @@ -779,3 +780,24 @@ test("saving after account removal prunes stale choices, including a restored dr const response = await putSettings(config, { codexAccountPickerModels: { unknown: ["gpt-5.5"] } }, deps); expect(response!.status).toBe(400); }); + + +test("eligible Reserve is selectable only for main-account bindings", async () => { + const config = baseConfig(); + config.codexAccountPickerEnabled = true; + config.codexDesktopAuthless = true; + config.codexAccountNamespaces = { main: "@main", side: "pool-side" }; + config.codexAccounts = [{ id: "pool-side", email: "side@example.test" }]; + const options = (await (await getSettings(config))!.json()).codexAccountPickerOptions; + expect(options.find((row: { selector: string }) => row.selector === "main").models).toContain("gpt-reserve"); + expect(options.find((row: { selector: string }) => row.selector === "side").models).not.toContain("gpt-reserve"); + const deps: ManagementApiDeps = { saveConfigPreservingClaudeCode: saveConfig, createManagementConvergeCodex: catalogConvergenceFactory(() => {}) }; + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(200); + expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-reserve"] }); + expect((await putSettings(config, { codexAccountPickerModels: { side: ["gpt-reserve"] } }, deps))!.status).toBe(400); + config.codexDesktopAuthless = false; + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(400); + expect((await putSettings(config, { codexDesktopAuthless: true, codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(200); + config.runtimeRole = "client"; + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(400); +}); diff --git a/tests/server/server-auth.test.ts b/tests/server/server-auth.test.ts index cc5eb8f1fd..6011c8e99e 100644 --- a/tests/server/server-auth.test.ts +++ b/tests/server/server-auth.test.ts @@ -244,6 +244,7 @@ async function startPoolRetryHarness( omitCredentialAccountIds?: string[]; combos?: OcxConfig["combos"]; modelRosterByAccount?: Record; + codexAccountPickerModels?: Record; } = {}, ): Promise { await removeTestDirBestEffort(TEST_DIR); @@ -306,6 +307,7 @@ async function startPoolRetryHarness( ], activeCodexAccountId: options.activeAccountId ?? "pool-a", ...(options.accountNamespaces ? { codexAccountNamespaces: options.accountNamespaces } : {}), + ...(options.codexAccountPickerModels ? { codexAccountPickerModels: options.codexAccountPickerModels } : {}), ...(options.pausedAccountIds ? { pausedCodexAccountIds: options.pausedAccountIds } : {}), ...(options.visionSidecarModel ? { visionSidecar: { model: options.visionSidecarModel } } : {}), ...(options.websockets ? { websockets: true } : {}), @@ -4583,4 +4585,46 @@ describe("POST /opencodex-session pairing body bound", () => { await server.stop(true); } }); + +}); + +describe("GET /v1/models Codex client-version account-picker projection", () => { + test("keeps common native rows for both specific and empty selective maps", async () => { + const commonModel = "gpt-5.6-sol"; + const selectedModel = "gpt-5.5"; + for (const codexAccountPickerModels of [ + { side: [selectedModel] }, + {}, + ]) { + const harness = await startPoolRetryHarness( + () => Response.json({ id: "unused", status: "completed", output: [] }), + { + accountNamespaces: { side: "pool-a" }, + codexAccountPickerModels, + modelRosterByAccount: { + "acct-pool-a": [commonModel, selectedModel], + "acct-pool-b": [commonModel], + }, + }, + ); + try { + const response = await originalGlobalFetch( + new URL("/v1/models?client_version=0.150.0", harness.server.url), + { headers: { authorization: "Bearer inbound-token" } }, + ); + expect(response.status).toBe(200); + const payload = await response.json() as { models: Array<{ slug: string }> }; + const slugs = payload.models.map(model => model.slug); + expect(slugs).toContain(commonModel); + expect(slugs).not.toContain("side/" + commonModel); + if (Object.keys(codexAccountPickerModels).length > 0) { + expect(slugs).toContain("side/" + selectedModel); + } else { + expect(slugs).not.toContain("side/" + selectedModel); + } + } finally { + await stopPoolRetryHarness(harness); + } + } + }); }); From 74f535ec584dc89b76f036e034ed7e0009a86e6a Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:04:16 +0900 Subject: [PATCH 08/12] fix(codex): converge Reserve and prune stale picker selections --- .../content/docs/reference/management-api.md | 3 +- .../components/CodexAccountPickerSetting.tsx | 24 +++++- .../codex-account-picker-setting.test.tsx | 78 +++++++++++++++++++ src/codex/convergence.ts | 51 +++++++++++- src/server/management/config-routes.ts | 6 +- ...odex-convergence-account-selectors.test.ts | 56 ++++++++++++- tests/config/settings-stream-mode.test.ts | 19 +++++ 7 files changed, 228 insertions(+), 9 deletions(-) diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index 423d59476c..7691a94f90 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -494,5 +494,6 @@ An account selector returns 400 only if it is neither a current candidate nor a `codexAccountNamespaces` binding. An atomic enable-and-select request validates against the newly initialized selectors and persists those same bindings. Choices for retained bindings whose accounts are no longer selectable are discarded on save, so stale drafts do not -block editing remaining accounts. Saving converges the catalog when the preference +block editing remaining accounts. Previously saved model choices that are no longer eligible +are also discarded on the next save; newly added unavailable model IDs still return 400. Saving converges the catalog when the preference changes; failure rolls the in-memory preference back. No credential fields are returned. diff --git a/gui/src/components/CodexAccountPickerSetting.tsx b/gui/src/components/CodexAccountPickerSetting.tsx index e396de646c..2f7e38c383 100644 --- a/gui/src/components/CodexAccountPickerSetting.tsx +++ b/gui/src/components/CodexAccountPickerSetting.tsx @@ -40,6 +40,21 @@ function sameModelsMap(a: ModelsMap, b: ModelsMap): boolean { return true; } +/** Prune unavailable models before save or restoring customization; the server handles removed selectors. */ +function pruneDraftToOptions(map: ModelsMap, currentOptions: AccountModelOption[]): ModelsMap { + const bySelector = new Map(currentOptions.map(option => [option.selector, new Set(option.models)])); + let changed = false; + const next: ModelsMap = {}; + for (const [selector, models] of Object.entries(map)) { + const available = bySelector.get(selector); + if (!available) { next[selector] = models; continue; } + const kept = models.filter(model => available.has(model)); + if (kept.length !== models.length) changed = true; + next[selector] = kept; + } + return changed ? next : map; +} + /** Opt-in control for account-qualified Codex model-picker entries. */ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string }) { const t = useT(); @@ -186,7 +201,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string if (anyMutationInFlight() || !hydrated || !customizeSupported) return; const previous = customizeRef.current; const requested = !previous; - const nextModels: ModelsMap | null = requested ? draft : null; + const nextModels: ModelsMap | null = requested ? pruneDraftToOptions(draft, options) : null; customizeRef.current = requested; setCustomize(requested); customizeSavingRef.current = true; @@ -232,7 +247,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string customizeSavingRef.current = false; setCustomizeSaving(false); } - }, [apiBase, hydrated, customizeSupported, draft, anyMutationInFlight, t]); + }, [apiBase, hydrated, customizeSupported, draft, options, anyMutationInFlight, t]); const toggleModel = useCallback((selector: string, model: string) => { setDraft(prev => { @@ -245,6 +260,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string const saveModels = useCallback(async () => { if (anyMutationInFlight() || !customize || !dirty) return; + const nextModels = pruneDraftToOptions(draft, options); modelsSavingRef.current = true; loadGenerationRef.current += 1; setModelsSaving(true); @@ -253,7 +269,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string const response = await fetch(`${apiBase}/api/settings`, { method: "PUT", headers: { "content-type": "application/json" }, - body: JSON.stringify({ codexAccountPickerModels: draft }), + body: JSON.stringify({ codexAccountPickerModels: nextModels }), }); const payload = (await readJsonOrThrow<{ ok?: unknown; @@ -277,7 +293,7 @@ export default function CodexAccountPickerSetting({ apiBase }: { apiBase: string modelsSavingRef.current = false; setModelsSaving(false); } - }, [apiBase, customize, dirty, draft, anyMutationInFlight, t]); + }, [apiBase, customize, dirty, draft, options, anyMutationInFlight, t]); const initialLoadFailed = loadError && !hydrated; diff --git a/gui/tests/codex-account-picker-setting.test.tsx b/gui/tests/codex-account-picker-setting.test.tsx index 918babc461..12f41691b3 100644 --- a/gui/tests/codex-account-picker-setting.test.tsx +++ b/gui/tests/codex-account-picker-setting.test.tsx @@ -572,4 +572,82 @@ describe("CodexAccountPickerSetting", () => { expect(errorNotice?.textContent).not.toContain("private server path"); }); + test("turning customize off and back on prunes a stale unavailable model instead of resubmitting it", async () => { + const options = [{ selector: "main", models: ["gpt-5.1"] }]; + const puts: unknown[] = []; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + const body = JSON.parse(String(init.body)) as { codexAccountPickerModels?: Record | null }; + puts.push(body.codexAccountPickerModels); + return response({ + ok: true, + codexAccountPickerModels: body.codexAccountPickerModels ?? null, + codexAccountPickerOptions: options, + }); + } + return response({ + codexAccountPickerEnabled: true, + // "gpt-reserve" was saved earlier (e.g. codexDesktopAuthless was on) and no longer + // appears among this selector's current options. + codexAccountPickerModels: { main: ["gpt-5.1", "gpt-reserve"] }, + codexAccountPickerOptions: options, + }); + }) as typeof fetch); + + const customizeToggle = () => toggles(host)[1]!; + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + + await act(async () => { + customizeToggle().click(); // off -> null deletes the persisted map + await flush(); + }); + expect(puts.at(-1)).toBeNull(); + + await act(async () => { + customizeToggle().click(); // on -> resubmits the draft, pruned to current options + await flush(); + }); + expect(customizeToggle().getAttribute("aria-pressed")).toBe("true"); + expect(puts.at(-1)).toEqual({ main: ["gpt-5.1"] }); + const list = host.querySelector(".codex-account-picker-models"); + const checked = Array.from(list?.querySelectorAll('input[type="checkbox"]') ?? []).filter(i => i.checked); + expect(checked).toHaveLength(1); + }); + + test("Save prunes a stale unavailable model from an untouched selector while preserving other accounts", async () => { + const options = [ + { selector: "main", models: ["gpt-5.1"] }, + { selector: "work", models: ["gpt-5.2", "gpt-5.2-fast"] }, + ]; + // "main" still carries "gpt-reserve" from an earlier save; it is no longer among main's + // current options. "work" is untouched aside from the checkbox click below. + const initialModels = { main: ["gpt-5.1", "gpt-reserve"], work: ["gpt-5.2"] }; + let lastPutBody: { codexAccountPickerModels?: Record } | null = null; + const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { + if (init?.method === "PUT") { + lastPutBody = JSON.parse(String(init.body)) as { codexAccountPickerModels?: Record }; + return response({ ok: true, codexAccountPickerModels: lastPutBody.codexAccountPickerModels, codexAccountPickerOptions: options }); + } + return response({ codexAccountPickerEnabled: true, codexAccountPickerModels: initialModels, codexAccountPickerOptions: options }); + }) as typeof fetch); + + const rows = Array.from(host.querySelectorAll(".codex-account-picker-account-row")); + const workRow = rows.find(row => row.textContent?.includes("work"))!; + const workExtraCheckbox = Array.from(workRow.querySelectorAll('input[type="checkbox"]')) + .find(box => !box.checked)!; + expect(workExtraCheckbox).toBeTruthy(); + act(() => { workExtraCheckbox.click(); }); + + await act(async () => { + Array.from(host.querySelectorAll("button")).find(b => b.textContent === "Save")!.click(); + await flush(); + }); + + expect(lastPutBody).not.toBeNull(); + expect(lastPutBody?.codexAccountPickerModels).toEqual({ + main: ["gpt-5.1"], + work: ["gpt-5.2", "gpt-5.2-fast"], + }); + }); + }); diff --git a/src/codex/convergence.ts b/src/codex/convergence.ts index e6f97e1117..13c564584f 100644 --- a/src/codex/convergence.ts +++ b/src/codex/convergence.ts @@ -44,6 +44,7 @@ import { buildCatalogEntriesFromObservedState, CANONICAL_NATIVE_CATALOG_CONTENT_POLICY, finalizeAutoReviewModelOverride, + finishUpstreamNativeEntry, mergeCatalogEntriesFromObservedState, mergeCatalogModelsWithNativeRecovery, orderForSubagents, @@ -60,11 +61,19 @@ import { nativeContextLimits, shouldIncludeAccountBoundNativeOpenAi, shouldIncludeNativeOpenAi, + observedReserveCatalogSource, + upstreamNativeEntry, } from "./catalog/metadata"; import { trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors, } from "./catalog/account-models"; +import { + createReserveCatalogProjection, + RESERVE_LUNA_METADATA_SOURCE, + RESERVE_SOURCE_CATALOG_FIELD, +} from "./catalog/reserve"; +import { NATIVE_RESERVE_MODEL } from "./catalog/native-models"; import { clampCatalogModelsToObservedCodexSupport, supportedCodexReasoningEffortsFromObservedCatalog, @@ -300,6 +309,37 @@ function prepareCatalog( const observedNativeSlugs: string[] = []; const disabledNative = disabledNativeSlugs(config); const openaiContextCap = nativeContextLimits(config); + // Same Reserve projection writeRetainedCatalogSync applies on disk: without it, a settings PUT + // that selects gpt-reserve reports success but the row is missing from the in-memory candidate + // until the next retained sync or restart. + const reserveMainSelectors = accountSelectors.filter(selector => + isMainCodexAccountTarget(accountTargets.get(selector) ?? "")); + const reserveObservations = [ + ...(active?.models ?? []), + ...observedAccountNativeEntries, + ...(catalog.models ?? []), + ]; + const retainedReserve = active?.[RESERVE_SOURCE_CATALOG_FIELD]; + const retainedReserveSource = retainedReserve && typeof retainedReserve === "object" && !Array.isArray(retainedReserve) + ? observedReserveCatalogSource([retainedReserve as RawEntry], []) + : null; + const observedReserveSource = observedReserveCatalogSource( + // Cache invalidation carries historical bare observations alongside emitted models. + // Only unmarked observations are fresh enough to supersede the retained source. + reserveObservations.filter(entry => entry.slug === NATIVE_RESERVE_MODEL + && entry.opencodex_account_observed_native === undefined), reserveMainSelectors, + ) ?? retainedReserveSource ?? observedReserveCatalogSource(reserveObservations, reserveMainSelectors); + // This root is read only by OCX; retain it on the candidate so a later retained sync (or this + // same candidate if committed) keeps the genuine source metadata instead of falling back to Luna. + if (observedReserveSource) catalog[RESERVE_SOURCE_CATALOG_FIELD] = structuredClone(observedReserveSource); + else delete catalog[RESERVE_SOURCE_CATALOG_FIELD]; + const lunaSource = upstreamNativeEntry(RESERVE_LUNA_METADATA_SOURCE); + const reserve = createReserveCatalogProjection( + config, + reserveMainSelectors, + observedReserveSource, + lunaSource ? finishUpstreamNativeEntry(lunaSource, 9, openaiContextCap) : null, + ); const nativeCatalogModels = mergeCatalogModelsWithNativeRecovery( active?.models ?? catalog.models ?? [], [catalog.models ?? [], ...nativeRecoverySources], @@ -338,7 +378,16 @@ function prepareCatalog( openaiContextCap, accountNativeSlugs, accountNativeSlugsBySelector, - }).filter(entry => trustedAccountBoundNativeCatalogSlug(entry) !== undefined); + reserve, + }).filter(entry => { + // Reserve is appended outside the ordinary per-selector roster above, so it also needs + // the selective picker filter here: the same gate writeRetainedCatalogSync applies. + const native = trustedAccountBoundNativeCatalogSlug(entry); + if (native === undefined) return false; + const selector = String(entry.slug).split("/")[0]!; + return config.codexAccountPickerModels === undefined + || config.codexAccountPickerModels[selector]?.includes(native); + }); const gatheredProviderNames = new Set(enabledProviders.map(([name]) => name)); const selectedModelsByProvider = new Map>( enabledProviders.flatMap(([name, provider]) => ( diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 5e8b81a383..99ed0be4c4 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -498,10 +498,12 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise !candidates.has(model))) { + const previous = new Set(config.codexAccountPickerModels?.[selector] ?? []); + if (models.some(model => !candidates.has(model) && !previous.has(model))) { return jsonResponse({ error: "Model is not available for this Codex account selector" }, 400); } - selectedAccountModels[selector] = models; + // Eligibility can change after a selection was saved; drop unchanged stale choices. + selectedAccountModels[selector] = models.filter(model => candidates.has(model)); } } if (body.showCodexSparkQuota !== undefined && typeof body.showCodexSparkQuota !== "boolean") { diff --git a/tests/codex-integration/codex-convergence-account-selectors.test.ts b/tests/codex-integration/codex-convergence-account-selectors.test.ts index 9602e91309..157d809ce3 100644 --- a/tests/codex-integration/codex-convergence-account-selectors.test.ts +++ b/tests/codex-integration/codex-convergence-account-selectors.test.ts @@ -1,3 +1,7 @@ +import { handleManagementAPI } from "../../src/server/management-api"; +import { createManagementConvergeCodex } from "../../src/codex/management-convergence"; +import { ManagementRequest } from "../helpers/management-auth"; +import { startupHealthFixture } from "../helpers/startup-health"; import { afterEach, beforeEach, expect, setDefaultTimeout, spyOn, test } from "bun:test"; import { chmodSync, @@ -46,7 +50,8 @@ import { import { markModelsFetchFailure } from "../../src/codex/model-cache"; import { legacyCustomModelCatalogSlugs } from "../../src/codex/custom-model-catalog-migration"; import { resetCodexModelEntitlementCacheForTests } from "../../src/codex/model-entitlements"; -import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "../../src/codex/catalog/native-models"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS, NATIVE_RESERVE_MODEL } from "../../src/codex/catalog/native-models"; +import { RESERVE_LUNA_METADATA_SOURCE, RESERVE_METADATA_SOURCE_FIELD } from "../../src/codex/catalog/reserve"; import { removeCodexAccountCredential, saveCodexAccountCredential } from "../../src/codex/account-store"; import { removeTreeWithRetry } from "../helpers/remove-tree"; @@ -1234,3 +1239,52 @@ test("both writers restore pristine native priorities after featured-model trans expect(finalModels.find(entry => entry.slug === "gpt-5.6-sol")?.priority).toBe(41); expect(finalModels.find(entry => entry.slug === "gpt-5.5")?.priority).toBe(57); }); + +test("convergence projects a main-account Reserve row immediately, and the selective filter still gates it", async () => { + // Regression for the P2 finding: prepareCatalog (used by convergeCodexCatalog) lacked the + // same ReserveCatalogProjection logic writeRetainedCatalogSync already applies, so a settings + // PUT that selected gpt-reserve reported refresh success while main/gpt-reserve was actually + // missing from the live catalog until the next retained sync or restart. + writeCatalog([nativeEntry()]); + const selectiveConfig: OcxConfig = { + ...config(true), + codexDesktopAuthless: true, + codexAccountPickerModels: { desktop: [NATIVE_RESERVE_MODEL] }, + }; + + const settingsConfig = { ...selectiveConfig, codexAccountPickerModels: {} }; + saveConfig(settingsConfig); + const request = new ManagementRequest("http://127.0.0.1/api/settings", { + method: "PUT", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ codexAccountPickerModels: selectiveConfig.codexAccountPickerModels }), + }); + const response = await handleManagementAPI(request, new URL(request.url), settingsConfig, { + saveConfigPreservingClaudeCode: saveConfig, + createManagementConvergeCodex, + getCachedStartupHealth: async () => startupHealthFixture(), + }); + expect(response!.status).toBe(200); + expect((await response!.json()).catalogRefreshPending).toBe(false); + const withReserveSelected = JSON.parse(readFileSync(catalogPath, "utf8")) as RawCatalog; + const reserveSlug = `desktop/${NATIVE_RESERVE_MODEL}`; + const reserveEntry = withReserveSelected.models?.find(entry => entry.slug === reserveSlug); + // The projection is present on the very first convergence pass, with no prior retained sync + // and no restart in between. + expect(reserveEntry).toBeDefined(); + expect(reserveEntry?.opencodex_catalog_kind).toBe(CODEX_ACCOUNT_BOUND_CATALOG_KIND); + // No account observation of the reserve model exists yet, so the projection is built from the + // genuine pinned Luna source (never a fabricated row) — the same fallback writeRetainedCatalogSync uses. + expect(reserveEntry?.[RESERVE_METADATA_SOURCE_FIELD]).toBe(RESERVE_LUNA_METADATA_SOURCE); + // The side selector was never granted the main account, so it must never receive a Reserve row. + expect(withReserveSelected.models?.some(entry => entry.slug === `team/${NATIVE_RESERVE_MODEL}`)).toBe(false); + // A selected-but-unrelated bare native model stays off the projected selector row: Reserve is + // additive, not a blanket unlock of every account-native model for that selector. + expect(withReserveSelected.models?.some(entry => entry.slug === "desktop/gpt-5.6-sol")).toBe(false); + + // Turning the map to an empty selection (customize on, nothing chosen yet) must still gate the + // final projected Reserve entry through the same selective filter as any other account row. + const emptySelectionConfig: OcxConfig = { ...selectiveConfig, codexAccountPickerModels: {} }; + const withNoneSelected = await convergeCatalog(emptySelectionConfig); + expect(withNoneSelected.models?.some(entry => entry.slug === reserveSlug)).toBe(false); +}); diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index 99912c103b..75bebb08cb 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -796,8 +796,27 @@ test("eligible Reserve is selectable only for main-account bindings", async () = expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-reserve"] }); expect((await putSettings(config, { codexAccountPickerModels: { side: ["gpt-reserve"] } }, deps))!.status).toBe(400); config.codexDesktopAuthless = false; + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(200); + expect(config.codexAccountPickerModels).toEqual({ main: [] }); expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(400); expect((await putSettings(config, { codexDesktopAuthless: true, codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(200); config.runtimeRole = "client"; + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(200); + expect(config.codexAccountPickerModels).toEqual({ main: [] }); expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve"] } }, deps))!.status).toBe(400); }); + + +test("an eligibility change does not let unchanged stale selections block the next edit", async () => { + const config = baseConfig(); + config.codexAccountPickerEnabled = true; + config.codexDesktopAuthless = true; + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerModels = { main: ["gpt-reserve", "gpt-5.5"] }; + const deps: ManagementApiDeps = { saveConfigPreservingClaudeCode: saveConfig, createManagementConvergeCodex: catalogConvergenceFactory(() => {}) }; + expect((await putSettings(config, { codexDesktopAuthless: false }, deps))!.status).toBe(200); + const response = await putSettings(config, { codexAccountPickerModels: { main: ["gpt-reserve", "gpt-5.5", "gpt-5.6-sol"] } }, deps); + expect(response!.status).toBe(200); + expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-5.5", "gpt-5.6-sol"] }); + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-not-real"] } }, deps))!.status).toBe(400); +}); From 48485caf8cd882c58c362c2752627790fe1a051a Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:16:54 +0900 Subject: [PATCH 09/12] fix(codex): include selected Reserve in live model discovery --- .../docs/fr/guides/codex-app-models.md | 2 + .../docs/ja/guides/codex-app-models.md | 2 + .../docs/ko/guides/codex-app-models.md | 2 + .../docs/ru/guides/codex-app-models.md | 2 + .../docs/tr/guides/codex-app-models.md | 2 + .../docs/zh-cn/guides/codex-app-models.md | 2 + .../docs/zh-tw/guides/codex-app-models.md | 2 + src/server/index.ts | 62 +++++++++++++++++++ tests/server/server-auth.test.ts | 36 +++++++++++ 9 files changed, 112 insertions(+) diff --git a/docs-site/src/content/docs/fr/guides/codex-app-models.md b/docs-site/src/content/docs/fr/guides/codex-app-models.md index ba03189e24..f0d1ae198c 100644 --- a/docs-site/src/content/docs/fr/guides/codex-app-models.md +++ b/docs-site/src/content/docs/fr/guides/codex-app-models.md @@ -28,6 +28,8 @@ filtre les entrées mal formées ; cela ne prouve pas que l'identifiant provient cache appartient à l'utilisateur. Consultez les [sélecteurs exacts de compte Codex](/fr/reference/configuration/routing/#sélecteurs-exacts-de-comptes-codex). +Pour activer cette option, choisir les modèles, enregistrer ou revenir au mode précédent, consultez les [étapes de configuration en anglais](/guides/codex-app-models/#select-only-particular-account-models). + `gpt-daybreak-blue-latest` suit cette règle d'observation uniquement pour les lignes qualifiées par compte et n'est pas ajouté à la liste d'autorisation native non qualifiée. Une entrée `customModels` distincte et explicite peut exposer le même identifiant transmis comme `openai/gpt-daybreak-blue-latest` par diff --git a/docs-site/src/content/docs/ja/guides/codex-app-models.md b/docs-site/src/content/docs/ja/guides/codex-app-models.md index 8ef69dbd07..c95269e1e5 100644 --- a/docs-site/src/content/docs/ja/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ja/guides/codex-app-models.md @@ -10,6 +10,8 @@ opencodex は Codex アプリにパッチを適用しません。Codex CLI/TUI OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountPickerEnabled` によって account-qualified picker 行が有効で、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、結果は `codexAccountPickerModels` によって変わります。この map を省略すると、従来の動作として、すべての対応モデルに `/` 行が追加され、ピッカーの bare native 行は非表示になります。map が存在する場合、共通プールの native model は bare 行として表示されたままで、選択したモデルとアカウントの組み合わせだけに qualified 行が追加されます。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。 +有効化、モデルの選択と保存、元のモードへの戻し方は、[英語版の設定手順](/guides/codex-app-models/#select-only-particular-account-models)を参照してください。 + `codexAccountNamespaces` map が空の場合、account-qualified picker 行は off です。空でない map で `codexAccountPickerEnabled` を省略すると、後方互換性のため有効として扱われます。`false` にすると、mapping を削除せず、明示的な `/` routing も無効にせずに、生成された qualified 行を非表示にして picker の bare native 行を復元します。 API GPT-5.6 エントリは 922,000 コンテキスト / 922,000 最大入力を使用し、`*-pro` ピッカー ID は `reasoning.mode: "pro"` のベース ワイヤ モデルに解決されますが、ログ、使用状況、およびピッカー状態は仮想 ID を保持します。 API カタログは、`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、およびそれらの 3 つの Pro 仮想 ID の 8 つの ID に固定されています。汎用の `gpt-5.6-pro` エイリアスはありません。コンパクト リクエストは、選択された層を保持しますが、推論オブジェクトなしで基本モデルを送信します。 diff --git a/docs-site/src/content/docs/ko/guides/codex-app-models.md b/docs-site/src/content/docs/ko/guides/codex-app-models.md index 121a06940c..6d0a75d952 100644 --- a/docs-site/src/content/docs/ko/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ko/guides/codex-app-models.md @@ -19,6 +19,8 @@ OpenAI 항목에는 네이티브 Codex 로그인과 네임스페이스가 붙은 다른 계정으로 전환하지 않고 요청이 실패합니다. 자세한 내용은 [명시적 Codex 계정 selector](/reference/configuration/routing/#exact-codex-account-selectors)를 참고하세요. +활성화, 모델 선택·저장, 기존 모드로 되돌리는 방법은 [영문 설정 절차](/guides/codex-app-models/#select-only-particular-account-models)를 참고하세요. + 계정 한정 행에서 `gpt-daybreak-blue-latest`는 계정 카탈로그에 관측됐을 때만 보존되며 bare native allowlist에는 추가되지 않습니다. 이와 별개로 canonical Codex 로그인 forward provider에 다음과 같은 명시적 `customModels` 항목을 두면 같은 wire id를 `openai/gpt-daybreak-blue-latest`로 노출할 수 있습니다. diff --git a/docs-site/src/content/docs/ru/guides/codex-app-models.md b/docs-site/src/content/docs/ru/guides/codex-app-models.md index a49086d709..77a79c515d 100644 --- a/docs-site/src/content/docs/ru/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ru/guides/codex-app-models.md @@ -21,6 +21,8 @@ native-строки из picker'а. Если map задана, нативные и при недоступности цели завершается ошибкой без переключения на другой аккаунт. Подробнее см. в разделе [Точные селекторы аккаунтов Codex](/reference/configuration/routing/#exact-codex-account-selectors). +Порядок включения, выбора и сохранения моделей, а также возврата к прежнему режиму описан в [инструкции на английском](/guides/codex-app-models/#select-only-particular-account-models). + Если map `codexAccountNamespaces` пуста, строки picker'а с указанием аккаунта выключены. Если при непустой map поле `codexAccountPickerEnabled` не задано, они считаются включёнными для обратной совместимости. Значение `false` скрывает созданные account-qualified строки и возвращает bare diff --git a/docs-site/src/content/docs/tr/guides/codex-app-models.md b/docs-site/src/content/docs/tr/guides/codex-app-models.md index 2def98addf..76befa3394 100644 --- a/docs-site/src/content/docs/tr/guides/codex-app-models.md +++ b/docs-site/src/content/docs/tr/guides/codex-app-models.md @@ -33,6 +33,8 @@ listesine eklenmez. Satır, gerçek bir katalog satırının sahip olduğu alan yanıtından geldiğini kanıtlamaz. Bkz. [Tam Codex hesap seçicileri](/tr/reference/configuration/routing/#exact-codex-account-selectors). +Etkinleştirme, model seçme ve kaydetme ile önceki moda dönme adımları için [İngilizce kurulum yönergelerine](/guides/codex-app-models/#select-only-particular-account-models) bakın. + `gpt-daybreak-blue-latest`, hesap nitelikli satırlar için bu yalnızca gözlem kuralını takip eder ve yalın yerel izin listesine eklenmez. Ayrı, açık bir `customModels` girdisi, kurallı Codex girişi iletme sağlayıcısı aracılığıyla diff --git a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md index 201691490a..c282fc2a83 100644 --- a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md @@ -9,6 +9,8 @@ allowlist,因此仍可能从选择器里删掉路由模型。 OpenAI 条目有两种凭据通道:原生 Codex 登录,以及命名空间化的 `openai-apikey/` API key 通道。仅在 Pool 与 Direct 之间切换 `codexAccountMode` 不会改变选择器 id。但当 `codexAccountPickerEnabled` 启用了账户限定的选择器行,且 `codexAccountNamespaces` 中有目标账户存在的 selector 时,结果取决于 `codexAccountPickerModels`。省略该映射时,系统沿用旧行为:为每个受支持模型添加独立的 `/` 行,并在选择器中隐藏裸原生行。提供该映射时,公共池原生模型仍以裸行显示,只有所选的模型和账户组合会添加限定行。Selector 名称是用户自定义的公开标签,没有内置的账户角色含义。选择带 `selector` 的行只会使用映射账户,不会更改当前 Pool 账户;目标不可用时,请求会直接失败,不会切换到其他账户。详情请参阅[精确 Codex 账户选择器](/reference/configuration/routing/#exact-codex-account-selectors)。 +启用、选择并保存模型以及恢复原有模式的步骤,请参阅[英文设置说明](/guides/codex-app-models/#select-only-particular-account-models)。 + `codexAccountNamespaces` 映射为空时,账户限定的选择器行处于关闭状态。非空映射中省略 `codexAccountPickerEnabled` 时,为保持向后兼容会视为已启用。设为 `false` 会隐藏生成的账户限定行并恢复选择器中的裸原生行,但不会删除映射,也不会禁用精确的 `/` 路由。 API GPT-5.6 条目使用 1,050,000 context / 922,000 max input,而 `*-pro` 选择器 id 会解析到基础线协议模型,并在日志、用量和选择器状态中保留虚拟 id,同时带上 `reasoning.mode: "pro"`。API 目录固定为恰好八个 id:`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna,以及它们三个 Pro 虚拟 id;不存在通用的 `gpt-5.6-pro` 别名。Compact 请求会保留所选 tier,但发送基础模型且不带 reasoning 对象。 diff --git a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md index abf697a5b2..d4fe2abfb1 100644 --- a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md @@ -18,6 +18,8 @@ API key 傳輸。僅在 Pool 與 Direct 之間切換 `codexAccountMode` 本身 (fails closed),而不是切換帳號。參見 [精確 Codex 帳號選擇器](/zh-tw/reference/configuration/routing/#精確-codex-帳號選擇器)。 +啟用、選擇並儲存模型及恢復原有模式的步驟,請參閱[英文設定說明](/guides/codex-app-models/#select-only-particular-account-models)。 + 當 `codexAccountNamespaces` 對應表為空時,帳號限定選擇器列是關閉的。若省略 `codexAccountPickerEnabled` 但對應表非空,基於向後相容會被視為啟用。將其設為 `false` 可以 隱藏生成的限定列並恢復選擇器中的裸原生列,同時不必刪除對應或停用精確的 diff --git a/src/server/index.ts b/src/server/index.ts index 737748f59f..44aaedb8e1 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1588,6 +1588,68 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server + isMainCodexAccountTarget(accountTargets.get(selector) ?? "")); + if (reserveMainSelectors.length > 0) { + const { isEffectiveCodexDesktopAuthless } = await import("../codex/loopback-target"); + if (isEffectiveCodexDesktopAuthless(config)) { + const { NATIVE_RESERVE_MODEL } = await import("../codex/catalog/native-models"); + const { applyFullModelPickerOrder, buildCatalogEntriesFromObservedState, finishUpstreamNativeEntry } = await import("../codex/catalog/sync"); + const { isMultiAgentV2Enabled } = await import("../codex/features"); + const { createReserveCatalogProjection, isReserveCatalogProjection, RESERVE_LUNA_METADATA_SOURCE, RESERVE_SOURCE_CATALOG_FIELD } = await import("../codex/catalog/reserve"); + const { observedReserveCatalogSource, upstreamNativeEntry } = await import("../codex/catalog/metadata"); + const { readCurrentCodexCatalog, readCurrentCodexModelsCache } = await import("../codex/catalog/bundled"); + const onDiskCatalog = readCurrentCodexCatalog(); + const reserveObservations = [ + ...(onDiskCatalog?.models ?? []), + ...(readCurrentCodexModelsCache()?.models ?? []), + ]; + const retainedReserve = onDiskCatalog?.[RESERVE_SOURCE_CATALOG_FIELD]; + const retainedReserveSource = retainedReserve && typeof retainedReserve === "object" && !Array.isArray(retainedReserve) + ? observedReserveCatalogSource([retainedReserve as Record], []) + : null; + const observedReserveSource = observedReserveCatalogSource( + reserveObservations.filter(entry => entry.slug === NATIVE_RESERVE_MODEL + && entry.opencodex_account_observed_native === undefined), + reserveMainSelectors, + ) ?? retainedReserveSource ?? observedReserveCatalogSource(reserveObservations, reserveMainSelectors); + const lunaSource = upstreamNativeEntry(RESERVE_LUNA_METADATA_SOURCE); + const reserve = createReserveCatalogProjection( + config, + reserveMainSelectors, + observedReserveSource, + lunaSource ? finishUpstreamNativeEntry(lunaSource, 9, nativeContextLimits(config)) : null, + ); + if (reserve) { + const reserveEntries = buildCatalogEntriesFromObservedState({ + template: loadCatalogTemplate(), + gptSlugs: [], + goModels: [], + featured: config.subagentModels, + modelPickerOrder: config.modelPickerOrder, + wsEnabled: websocketsEnabled(config), + multiAgentMode: maMode as "v1" | "default" | "v2", + exactComboSlugs, + accountSelectors, + suppressedBareNativeSlugs, + disabledNativeAccountSlugs: new Set(), + multiAgentV2Enabled: isMultiAgentV2Enabled(), + openaiContextCap: nativeContextLimits(config), + accountNativeSlugs: [], + accountNativeSlugsBySelector: new Map(), + keepNativeChatGptOnV1: config.keepNativeChatGptOnV1 === true, + reserve, + }).filter(entry => { + if (!isReserveCatalogProjection(entry)) return false; + const selector = String(entry.slug).split("/")[0]; + return config.codexAccountPickerModels === undefined + || config.codexAccountPickerModels[selector]?.includes(NATIVE_RESERVE_MODEL); + }); + entries.push(...reserveEntries); + applyFullModelPickerOrder(entries, config.modelPickerOrder ?? []); + } + } + } return jsonResponse({ models: applyNativeVisibility( entries, diff --git a/tests/server/server-auth.test.ts b/tests/server/server-auth.test.ts index 6011c8e99e..34987f254d 100644 --- a/tests/server/server-auth.test.ts +++ b/tests/server/server-auth.test.ts @@ -245,6 +245,7 @@ async function startPoolRetryHarness( combos?: OcxConfig["combos"]; modelRosterByAccount?: Record; codexAccountPickerModels?: Record; + codexDesktopAuthless?: boolean; } = {}, ): Promise { await removeTestDirBestEffort(TEST_DIR); @@ -308,6 +309,7 @@ async function startPoolRetryHarness( activeCodexAccountId: options.activeAccountId ?? "pool-a", ...(options.accountNamespaces ? { codexAccountNamespaces: options.accountNamespaces } : {}), ...(options.codexAccountPickerModels ? { codexAccountPickerModels: options.codexAccountPickerModels } : {}), + ...(options.codexDesktopAuthless ? { codexDesktopAuthless: true } : {}), ...(options.pausedAccountIds ? { pausedCodexAccountIds: options.pausedAccountIds } : {}), ...(options.visionSidecarModel ? { visionSidecar: { model: options.visionSidecarModel } } : {}), ...(options.websockets ? { websockets: true } : {}), @@ -4627,4 +4629,38 @@ describe("GET /v1/models Codex client-version account-picker projection", () => } } }); + + test("projects Reserve only for the selected authless main selector", async () => { + const reserveModel = "gpt-reserve"; + for (const [codexDesktopAuthless, codexAccountPickerModels, expected] of [ + [true, { main: [reserveModel] }, true], + [true, { main: [] }, false], + [true, {}, false], + [true, { side: [reserveModel] }, false], + [false, { main: [reserveModel] }, false], + ] as const) { + const harness = await startPoolRetryHarness( + () => Response.json({ id: "unused", status: "completed", output: [] }), + { + accountNamespaces: { main: "@main", side: "pool-a" }, + codexDesktopAuthless, + codexAccountPickerModels, + }, + ); + try { + const response = await originalGlobalFetch( + new URL("/v1/models?client_version=0.150.0", harness.server.url), + { headers: { authorization: "Bearer inbound-token" } }, + ); + expect(response.status).toBe(200); + const payload = await response.json() as { models: Array<{ slug: string }> }; + const slugs = payload.models.map(model => model.slug); + expect(slugs.includes(`main/${reserveModel}`)).toBe(expected); + expect(slugs).not.toContain(`side/${reserveModel}`); + expect(slugs).not.toContain(reserveModel); + } finally { + await stopPoolRetryHarness(harness); + } + } + }); }); From 59c4f5a939564902c14fbd7c58a4bc3dfdc14a3d Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:22:19 +0900 Subject: [PATCH 10/12] fix(codex): honor disabled Reserve models in live discovery --- src/server/index.ts | 4 +++- tests/server/server-auth.test.ts | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/server/index.ts b/src/server/index.ts index 44aaedb8e1..c7b426e5fb 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1588,6 +1588,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server isMainCodexAccountTarget(accountTargets.get(selector) ?? "")); if (reserveMainSelectors.length > 0) { @@ -1646,6 +1647,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server 0) liveObservedNativeSlugs.add(NATIVE_RESERVE_MODEL); applyFullModelPickerOrder(entries, config.modelPickerOrder ?? []); } } @@ -1655,7 +1657,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server 0 && config.codexAccountPickerModels === undefined, - new Set(accountNativeSlugs), + liveObservedNativeSlugs, ), }, 200, req, policy); } diff --git a/tests/server/server-auth.test.ts b/tests/server/server-auth.test.ts index 34987f254d..6ead5b24de 100644 --- a/tests/server/server-auth.test.ts +++ b/tests/server/server-auth.test.ts @@ -245,6 +245,7 @@ async function startPoolRetryHarness( combos?: OcxConfig["combos"]; modelRosterByAccount?: Record; codexAccountPickerModels?: Record; + disabledModels?: string[]; codexDesktopAuthless?: boolean; } = {}, ): Promise { @@ -309,6 +310,7 @@ async function startPoolRetryHarness( activeCodexAccountId: options.activeAccountId ?? "pool-a", ...(options.accountNamespaces ? { codexAccountNamespaces: options.accountNamespaces } : {}), ...(options.codexAccountPickerModels ? { codexAccountPickerModels: options.codexAccountPickerModels } : {}), + ...(options.disabledModels ? { disabledModels: options.disabledModels } : {}), ...(options.codexDesktopAuthless ? { codexDesktopAuthless: true } : {}), ...(options.pausedAccountIds ? { pausedCodexAccountIds: options.pausedAccountIds } : {}), ...(options.visionSidecarModel ? { visionSidecar: { model: options.visionSidecarModel } } : {}), @@ -4632,12 +4634,14 @@ describe("GET /v1/models Codex client-version account-picker projection", () => test("projects Reserve only for the selected authless main selector", async () => { const reserveModel = "gpt-reserve"; - for (const [codexDesktopAuthless, codexAccountPickerModels, expected] of [ - [true, { main: [reserveModel] }, true], - [true, { main: [] }, false], - [true, {}, false], - [true, { side: [reserveModel] }, false], - [false, { main: [reserveModel] }, false], + for (const [codexDesktopAuthless, codexAccountPickerModels, expected, disabledModels] of [ + [true, { main: [reserveModel] }, true, []], + [true, { main: [reserveModel] }, false, [reserveModel]], + [true, { main: [reserveModel] }, false, [`main/${reserveModel}`]], + [true, { main: [] }, false, []], + [true, {}, false, []], + [true, { side: [reserveModel] }, false, []], + [false, { main: [reserveModel] }, false, []], ] as const) { const harness = await startPoolRetryHarness( () => Response.json({ id: "unused", status: "completed", output: [] }), @@ -4645,6 +4649,7 @@ describe("GET /v1/models Codex client-version account-picker projection", () => accountNamespaces: { main: "@main", side: "pool-a" }, codexDesktopAuthless, codexAccountPickerModels, + disabledModels: [...disabledModels], }, ); try { @@ -4653,9 +4658,10 @@ describe("GET /v1/models Codex client-version account-picker projection", () => { headers: { authorization: "Bearer inbound-token" } }, ); expect(response.status).toBe(200); - const payload = await response.json() as { models: Array<{ slug: string }> }; + const payload = await response.json() as { models: Array<{ slug: string; visibility?: string }> }; const slugs = payload.models.map(model => model.slug); - expect(slugs.includes(`main/${reserveModel}`)).toBe(expected); + const reserve = payload.models.find(model => model.slug === `main/${reserveModel}`); + expect(reserve !== undefined && reserve.visibility !== "hide").toBe(expected); expect(slugs).not.toContain(`side/${reserveModel}`); expect(slugs).not.toContain(reserveModel); } finally { From 10b39ef8bf040e94ca21ddf88a176719a3ebe182 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:31:04 +0900 Subject: [PATCH 11/12] test(codex): assert disabled Reserve rows remain hidden --- tests/server/server-auth.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/server/server-auth.test.ts b/tests/server/server-auth.test.ts index 6ead5b24de..04169bf95f 100644 --- a/tests/server/server-auth.test.ts +++ b/tests/server/server-auth.test.ts @@ -4662,6 +4662,10 @@ describe("GET /v1/models Codex client-version account-picker projection", () => const slugs = payload.models.map(model => model.slug); const reserve = payload.models.find(model => model.slug === `main/${reserveModel}`); expect(reserve !== undefined && reserve.visibility !== "hide").toBe(expected); + if (disabledModels.length > 0) { + expect(reserve).toBeDefined(); + expect(reserve!.visibility).toBe("hide"); + } expect(slugs).not.toContain(`side/${reserveModel}`); expect(slugs).not.toContain(reserveModel); } finally { From 6b6a3c690787eaea692a034374a2d3499a696ea6 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Thu, 10 Sep 2026 17:42:35 +0900 Subject: [PATCH 12/12] fix(codex): prune selections for removed account namespaces --- .../src/content/docs/reference/management-api.md | 7 ++++--- gui/src/components/CodexAccountPickerSetting.tsx | 4 ++-- gui/tests/codex-account-picker-setting.test.tsx | 4 ++-- src/server/management/config-routes.ts | 5 +++-- tests/config/settings-stream-mode.test.ts | 13 +++++++++++++ 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index 7691a94f90..a13bf91ef8 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -490,10 +490,11 @@ not proof of upstream permission; catalog entitlement checks still apply. `PUT /api/settings` accepts `codexAccountPickerModels` alone or with the existing switch. An object enables selective mode, `{}` selects none, and `null` removes the preference to restore legacy behavior. Invalid keys, non-array values, and non-native model IDs return 400 before writing. -An account selector returns 400 only if it is neither a current candidate nor a retained -`codexAccountNamespaces` binding. An atomic enable-and-select request validates +An account selector returns 400 only if it is not a current candidate, a retained +`codexAccountNamespaces` binding, or a key in the previously saved selection map. An atomic enable-and-select request validates against the newly initialized selectors and persists those same bindings. Choices for retained -bindings whose accounts are no longer selectable are discarded on save, so stale drafts do not +bindings whose accounts are no longer selectable, and saved choices for removed or renamed +bindings, are discarded on save, so stale drafts do not block editing remaining accounts. Previously saved model choices that are no longer eligible are also discarded on the next save; newly added unavailable model IDs still return 400. Saving converges the catalog when the preference changes; failure rolls the in-memory preference back. No credential fields are returned. diff --git a/gui/src/components/CodexAccountPickerSetting.tsx b/gui/src/components/CodexAccountPickerSetting.tsx index 2f7e38c383..8224def9eb 100644 --- a/gui/src/components/CodexAccountPickerSetting.tsx +++ b/gui/src/components/CodexAccountPickerSetting.tsx @@ -40,14 +40,14 @@ function sameModelsMap(a: ModelsMap, b: ModelsMap): boolean { return true; } -/** Prune unavailable models before save or restoring customization; the server handles removed selectors. */ +/** Prune unavailable models and removed selectors before saving or restoring customization. */ function pruneDraftToOptions(map: ModelsMap, currentOptions: AccountModelOption[]): ModelsMap { const bySelector = new Map(currentOptions.map(option => [option.selector, new Set(option.models)])); let changed = false; const next: ModelsMap = {}; for (const [selector, models] of Object.entries(map)) { const available = bySelector.get(selector); - if (!available) { next[selector] = models; continue; } + if (!available) { changed = true; continue; } const kept = models.filter(model => available.has(model)); if (kept.length !== models.length) changed = true; next[selector] = kept; diff --git a/gui/tests/codex-account-picker-setting.test.tsx b/gui/tests/codex-account-picker-setting.test.tsx index 12f41691b3..52509b6182 100644 --- a/gui/tests/codex-account-picker-setting.test.tsx +++ b/gui/tests/codex-account-picker-setting.test.tsx @@ -589,7 +589,7 @@ describe("CodexAccountPickerSetting", () => { codexAccountPickerEnabled: true, // "gpt-reserve" was saved earlier (e.g. codexDesktopAuthless was on) and no longer // appears among this selector's current options. - codexAccountPickerModels: { main: ["gpt-5.1", "gpt-reserve"] }, + codexAccountPickerModels: { main: ["gpt-5.1", "gpt-reserve"], former: ["gpt-5.1"] }, codexAccountPickerOptions: options, }); }) as typeof fetch); @@ -621,7 +621,7 @@ describe("CodexAccountPickerSetting", () => { ]; // "main" still carries "gpt-reserve" from an earlier save; it is no longer among main's // current options. "work" is untouched aside from the checkbox click below. - const initialModels = { main: ["gpt-5.1", "gpt-reserve"], work: ["gpt-5.2"] }; + const initialModels = { main: ["gpt-5.1", "gpt-reserve"], work: ["gpt-5.2"], former: ["gpt-5.1"] }; let lastPutBody: { codexAccountPickerModels?: Record } | null = null; const host = await mount((async (_input: RequestInfo | URL, init?: RequestInit) => { if (init?.method === "PUT") { diff --git a/src/server/management/config-routes.ts b/src/server/management/config-routes.ts index 99ed0be4c4..17f1d26c5d 100644 --- a/src/server/management/config-routes.ts +++ b/src/server/management/config-routes.ts @@ -494,8 +494,9 @@ export async function handleConfigRoutes(ctx: ManagementContext): Promise)) { const candidates = available.get(selector); if (!candidates) { - // Deleted accounts retain their bindings; discard stale display choices on save. - if (Object.hasOwn(choices.codexAccountNamespaces ?? {}, selector)) continue; + // Discard saved display choices for deleted accounts or removed/renamed bindings. + if (Object.hasOwn(choices.codexAccountNamespaces ?? {}, selector) + || Object.hasOwn(config.codexAccountPickerModels ?? {}, selector)) continue; return jsonResponse({ error: "Unknown Codex account selector" }, 400); } const previous = new Set(config.codexAccountPickerModels?.[selector] ?? []); diff --git a/tests/config/settings-stream-mode.test.ts b/tests/config/settings-stream-mode.test.ts index 75bebb08cb..4a0f916531 100644 --- a/tests/config/settings-stream-mode.test.ts +++ b/tests/config/settings-stream-mode.test.ts @@ -820,3 +820,16 @@ test("an eligibility change does not let unchanged stale selections block the ne expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-5.5", "gpt-5.6-sol"] }); expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-not-real"] } }, deps))!.status).toBe(400); }); + + +test("a removed namespace is pruned from saved selections but a new unknown key is rejected", async () => { + const config = baseConfig(); + config.codexAccountPickerEnabled = true; + config.codexAccountNamespaces = { main: "@main" }; + config.codexAccountPickerModels = { main: ["gpt-5.5"], former: ["gpt-5.5"] }; + const deps: ManagementApiDeps = { saveConfigPreservingClaudeCode: saveConfig, createManagementConvergeCodex: catalogConvergenceFactory(() => {}) }; + const response = await putSettings(config, { codexAccountPickerModels: { main: ["gpt-5.6-sol"], former: ["gpt-5.5"] } }, deps); + expect(response!.status).toBe(200); + expect(loadConfig().codexAccountPickerModels).toEqual({ main: ["gpt-5.6-sol"] }); + expect((await putSettings(config, { codexAccountPickerModels: { main: ["gpt-5.6-sol"], unknown: ["gpt-5.5"] } }, deps))!.status).toBe(400); +});