From 25f1b766242c3bf4ee4ca958584c6642d0896dae Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Tue, 24 Jun 2025 21:44:52 +0100 Subject: [PATCH 1/5] fix: handle empty strings for Select component (#18553) resolve #18361 Its possible for a dynamic parameter option value to be an empty string which will cause the following error in the Radix Select component. The solution is to handle empty strings so that they are not set directly in the component. `Uncaught Error: A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.` ``` data "coder_parameter" "radio" { name = "radio" display_name = "An example of a radio input" description = "The next parameter supports a single value." type = "string" form_type = "dropdown" order = 1 default = "" option { name = "Empty" value = "" } } ``` --- .../DynamicParameter/DynamicParameter.tsx | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx index 3680b7f5e88c5..fa72142d52837 100644 --- a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx +++ b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx @@ -379,11 +379,17 @@ const ParameterField: FC = ({ id, }) => { switch (parameter.form_type) { - case "dropdown": + case "dropdown": { + const EMPTY_VALUE_PLACEHOLDER = "__EMPTY_STRING__"; + const selectValue = value === "" ? EMPTY_VALUE_PLACEHOLDER : value; + const handleSelectChange = (newValue: string) => { + onChange(newValue === EMPTY_VALUE_PLACEHOLDER ? "" : newValue); + }; + return ( ); + } case "multi-select": { const parsedValues = parseStringArrayValue(value ?? ""); From fe22b2cc92447252edb18be49f0dca49c5ab2d5e Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 24 Jun 2025 15:46:50 -0500 Subject: [PATCH 2/5] chore: update coder/preview dependency to v1.0.1 (#18550) --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 9d445ff693885..12deb9bab3745 100644 --- a/go.mod +++ b/go.mod @@ -104,7 +104,7 @@ require ( github.com/coder/quartz v0.2.1 github.com/coder/retry v1.5.1 github.com/coder/serpent v0.10.0 - github.com/coder/terraform-provider-coder/v2 v2.7.0 + github.com/coder/terraform-provider-coder/v2 v2.8.0 github.com/coder/websocket v1.8.13 github.com/coder/wgtunnel v0.1.13-0.20240522110300-ade90dfb2da0 github.com/coreos/go-oidc/v3 v3.14.1 @@ -483,7 +483,7 @@ require ( require ( github.com/anthropics/anthropic-sdk-go v0.2.0-beta.3 github.com/coder/agentapi-sdk-go v0.0.0-20250505131810-560d1d88d225 - github.com/coder/preview v0.0.2-0.20250611164554-2e5caa65a54a + github.com/coder/preview v1.0.1 github.com/fsnotify/fsnotify v1.9.0 github.com/kylecarbs/aisdk-go v0.0.8 github.com/mark3labs/mcp-go v0.32.0 diff --git a/go.sum b/go.sum index 0ef90205bceef..7a996d81c6348 100644 --- a/go.sum +++ b/go.sum @@ -914,8 +914,8 @@ github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048 h1:3jzYUlGH7ZELIH4XggX github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs= github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc= -github.com/coder/preview v0.0.2-0.20250611164554-2e5caa65a54a h1:rArAOPl5zHB7lhT2sy+jfcmyLeDlm6tXDoGkGdWNq7g= -github.com/coder/preview v0.0.2-0.20250611164554-2e5caa65a54a/go.mod h1:nXz3bBwbU8/9NYI4OISUsoLDFlEREtTozYhJq6FAE8E= +github.com/coder/preview v1.0.1 h1:f6q+RjNelwnkyXfGbmVlb4dcUOQ0z4mPsb2kuQpFHuU= +github.com/coder/preview v1.0.1/go.mod h1:efDWGlO/PZPrvdt5QiDhMtTUTkPxejXo9c0wmYYLLjM= github.com/coder/quartz v0.2.1 h1:QgQ2Vc1+mvzewg2uD/nj8MJ9p9gE+QhGJm+Z+NGnrSE= github.com/coder/quartz v0.2.1/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA= github.com/coder/retry v1.5.1 h1:iWu8YnD8YqHs3XwqrqsjoBTAVqT9ml6z9ViJ2wlMiqc= From a8e2c75239b8d98ad87b06225c4dfe4bc403ccae Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Tue, 24 Jun 2025 17:15:05 -0400 Subject: [PATCH 3/5] chore: update Coder icons to reflect new branding (#18517) Addresses part of the frontend changes needed for https://github.com/coder/coder/issues/18516 --- site/src/components/Icons/CoderIcon.tsx | 19 ++++++------------ site/static/favicon.ico | Bin 4286 -> 9662 bytes site/static/favicons/favicon-dark.png | Bin 1901 -> 1510 bytes site/static/favicons/favicon-dark.svg | 7 +------ site/static/favicons/favicon-error-dark.png | Bin 2579 -> 2250 bytes site/static/favicons/favicon-error-dark.svg | 4 ++-- site/static/favicons/favicon-error-light.png | Bin 2547 -> 1948 bytes site/static/favicons/favicon-error-light.svg | 4 ++-- site/static/favicons/favicon-light.png | Bin 2742 -> 1215 bytes site/static/favicons/favicon-light.svg | 7 +------ site/static/favicons/favicon-running-dark.png | Bin 2487 -> 2207 bytes site/static/favicons/favicon-running-dark.svg | 4 ++-- .../static/favicons/favicon-running-light.png | Bin 2516 -> 1893 bytes .../static/favicons/favicon-running-light.svg | 4 ++-- site/static/favicons/favicon-success-dark.png | Bin 2460 -> 2177 bytes site/static/favicons/favicon-success-dark.svg | 4 ++-- .../static/favicons/favicon-success-light.png | Bin 2481 -> 1849 bytes .../static/favicons/favicon-success-light.svg | 4 ++-- site/static/favicons/favicon-warning-dark.png | Bin 2503 -> 2185 bytes site/static/favicons/favicon-warning-dark.svg | 4 ++-- .../static/favicons/favicon-warning-light.png | Bin 2459 -> 1853 bytes .../static/favicons/favicon-warning-light.svg | 4 ++-- site/static/icon/coder.svg | 9 ++------- site/static/open-in-coder.svg | 17 ++++++---------- 24 files changed, 32 insertions(+), 59 deletions(-) diff --git a/site/src/components/Icons/CoderIcon.tsx b/site/src/components/Icons/CoderIcon.tsx index 7dd2a7625734d..7053ffe8d255d 100644 --- a/site/src/components/Icons/CoderIcon.tsx +++ b/site/src/components/Icons/CoderIcon.tsx @@ -1,4 +1,4 @@ -import SvgIcon, { type SvgIconProps } from "@mui/material/SvgIcon"; +import type { SvgIconProps } from "@mui/material/SvgIcon"; import type { FC } from "react"; import { cn } from "utils/cn"; @@ -7,23 +7,16 @@ import { cn } from "utils/cn"; * contain additional aspects, like the word 'Coder'. */ export const CoderIcon: FC = ({ className, ...props }) => ( - Codestin Search App - - - - - - - - - + + ); diff --git a/site/static/favicon.ico b/site/static/favicon.ico index 2e20e00e1a1dcb5779342ed92cb5bf133a3b041b..dfa915be64f249a14c15e09189f0ddc05ccda3c5 100644 GIT binary patch literal 9662 zcmeHKL2lbH5L_RENF)XLlv9EF5}-#vAVBkkyrA$40zaT=^n|=1=bZ8c!!Pg?0>2>0 zv4oxKJ6+K@QT@leYZahRAZWzy3Rv;^o z703!?1+oHJfviB70#aVAr7X8fl`l$(1K&4Bd*l08Da8}!EcpsS#XKpCO^oL9*I|R( zfUn7Y^q$wbQ>wUi;bOcfiq%|P*L>Sgk3E~WjnC_Nw6S$R75}OdcgzDZF{^C32WA<7q@mO_YMn)8^I zQvUG0Z^uzg{?OCsdy2bWPg$1tKAh#USn0Vj`SY1xd;Gp?pCOiUoaYwK28|JuKl|Ld z_+xF_XNX0vhG0eJ@6^oByQwvFyyOOXZMRhM+Ws6%7(5AffhhOzS*?_qzKpN~7gJN!Kpn?Lqo zs(vx{4P5cfbAI=XxeaPV;G0(p{=lEH2In`!5T)Y6MG6TBkTz4MRFOU#=mNfhm=i=dFacjcH;~J8$_==|9zaJ}-9RZ_ z1YzEjIKhBfiIQCf(KFu8aOTZtxwf4f;YY;r>Ap^!d+VHg4a2H!gU%*STM8P?;ttR9lQq-<; z{1OufdIZEumO6okScAITW*<2`1m+IpJ)MH>8%_z4djxgXDr*-e#+-t?@EkR8#4=AE z>A_PFBvq^L>P?I}h3a-1IASB>s`W=SHmuq{2U(*rT7|wpV^a+d*oc_c`+>X-H8`lY z_Wt&}^r#bX2OYK&GPaIBs=?i|52sCQ!b^oT109O~JFmi0=;CLrNK zjnirz?*5&rwR!b-IZu7e8V^e}pz2D?x+$m-I99{_Qj@Tf&x~6g{WYkN>~NnASZaA* zfdZEJf`IKGOF=#hEO)oPsck^XwujX`dr~jpF>qg7!`gUEoa6Vf)YUkz^kMq0=(E6? zJJ(R&ncbyFv7Nodd6mg|79Iy%YjZV!0>M4F24m(NR={)NA$;!q+6?v%1LTeh59cNG z1M2xLJXqeXAT~tao5I6+$^2;QziHEK8(42x?uXQ0|9=>}1dkBw{ylsF6;n7(LCvYP z`}6PhQY=uQ^VPCv4g6-RS9?xf*;f$gi(Wj}5FpUGYKOj0tq=18Mv(W%UOiYtfI#PN z;LmFX*Zlu;18E4`n{jGKH>q_G;Ot%Zl=*WuhJV}rn7Ntz6kfTu{V>`-xpDi;eQcBa Z+@+AZltPy}@}W!L!8V~6xJ|d^xZhhaYyAKK diff --git a/site/static/favicons/favicon-dark.png b/site/static/favicons/favicon-dark.png index e71c650d80ce0a00520df88403dfda0fe7a6296e..7fd4583ad0a70d55c07a2c8022f1f21fc4c9c945 100644 GIT binary patch delta 1443 zcmaKseLT|%0LFEU@_KnMQs;fMyym3lJ!E-r$h>xjV)7Q}t()e2I3>*6l{2#}e$x<< zoxE43Y4Q@SVTl{XCYF~?T(LJuzc3WpYjQ+G-J$P;C`u53_0xX% zRBWz9I}>b+$&xiV9Sw@Vi(bm~+UV`-2?E?dX+nta<-W!Uf7YCd zQ0u3pc$1p5@)s1cKwAK8U}T%kJVkG|Y`6!FL!&k4hSn=_AcRDL-86^8$s`|HAiz^M zs=wZRym!8F#j5g!C?h};wvi6#A4S z0L9k^XCm>$&d1ju#EhO@!emP>`ag3%2sVYODt9txK9tz^@q?nRicrv^15Il@o~>{0 zNlW3e&DwLWi&$Tq9$F1BcKVe@Eu3zTpPpBMh~u+Yoner<5ELR<0QP8m^KQwi>q?I! zV<4yhl}AyG8L3{0V805fzo)H#Yg?ohpTA5{g0i$on`%PyGPvQ#1THwug2+CI)l z^yKHEG7p!Z>FJ_cw;pOxmzBI+p=(|sH;mPi-v)@Bs86~UJ;k6yhE`8Pl4$YmscB_D zx^c97SQtj8Q;J2o6d2_oG?_l2VrJ64o-g=y#LY&VAbn2*5xNc2l>ydR!8^h6N9FF` zQ@2`5#9eQ|Vv=$o9?h>{iDe|v!(`7wVKj+BD;u;`)`O)Rbh}a#X$cb~tIjV8BO1p|&>1#tKQ2CPx;9_eZ zGh-YYZie*ljB7>I;RAYY{oGSUo3voU!p_X*qrBZbDJE0B7|a+as|wV}hLNc(7gS$+ z^6{a{CiB$C6QO_|4a+d+KgVq1f(#pQl$l9psDyRy7GTMfDx`VJ$}f|0lu~QygTs++ z3Eb_%H9F&K@u~!@9#-;0zj=Q-wL#OZETqtw@tIbOBDaw4gt&J^zI2HR5G^cI<$|fg z)xySrqKSGRy$e9t#JVj}-nw;}m*rDcx+q^1_HfX*o*tWw%j(12IJ{4inf<7z#I!Yj z-)@TZD({0(_H}Q?OcXdf5s?xIbrT%>Cs9U;-mo!K0bii+!MhfGKksTFH>-FMKGPA; zVno~;n0>}%fkuh`!{g$lKo^B)8&8eHXf{Z@1&bE1H(MoVFXGx^es7ob(^(F+17$Gv z6?>!tE4wF(fid5t4n>II-1WLPr{^W*buyu8r<0GJhrKW!I@O0PI2i2Rl65*yvj8XM z5z7BYko!>ZP78&PY@6lzy3KMl6++y+!?fRk!&Xjc*lGD!jCJ6TU;0q9Z?K!+Nmh=b m=mbId9KMZ9Q!Bcf5*Q7 delta 1837 zcmV+|2h#ZF3+)b&ReuKpNkl)4tt(`&I`i zilQirq9}@@D2k#eilQirq9}@@D2k#eisAv2+vD8Ux&4;gHh;I93R|LojvDI3&n|O2 z&+Q>*P6B%~ZUnYO|1^oZZ-2o)pawJI7;-VkBx-5bxh*gQ4BFkGF^Woim)i;xr;DIt z6txt#RbTr7;)hSH!TjJu@f^0>5fQtn2E(+nSh$x*Ebx&epdW#3QN$=`xs0F4(FxQ0EP?2 zqs5+i1RFh)1|%jy3fYBkF`g&-JILp(&WvH6>Iz+MCODq0x@}Wkb?;GbVG zFmo0)#Y7pSsAlKyx6lF9d&DlPfn7^XV5cqSz%djxgB>Arka7hTIyyM-T%moAFYPD9 zzrda%(0?jTOf8jSavQ}Nx(Cc37M2y|NrLAFvShan0>*L2OoHyYy>+&R`}8FhmYt#< zso)%=YpE-QABiqu9~@>KG_B@jaBq1xkgpC+8oF4vpqrjeoJSjo6tb3TFao+{9!x=4 zNlFVvO%OS23@2!53k=I6$m;tN5wpVZg3`DOWPdOm_aLuxIaP})V=_S;f|kbA%b{*i z*IjWmy5;45!F^{wtkI6E+@8QDNAn3kD(n>2jWIaiCW^$ehU#A_$_tE~735FiCEN!H z2J$&3?G1)=!`#)@Wx#l_r5?dAbY%uMPJ5@QG|3>}XUdkDLXLrb7>wXM8`!AR3I1Q_ zU4IJ&y#)tB268CuH?Z~hN&+jG&nZfZZW#EDP_e8v!oEdi33;6lw$v^p=oWMjC1{C3 zn9yU07j4jEt{`t1-bAHqy#&17r2Q7*lLTSvS=M!d?p+w&Z(A?dSyWd34DfbS4w-2< z|JSf{we5~QMLjPA*O}+Pi+1>U*~bzsVSlC9fR~$4W$T*rH$Ba!=DWsoJrCKhMIEI` zcfWZPwd=6kwQ{E7{JdG)hVL8Hv-VWaI=hBU*tV_o-JUJbf=j^5Mb}lbE&$;2KpE6y zJk-<0*kWBHRHwqSd7ti$(+yfg#8RO1g?15i=~#}z@YhmWQy*U<4d_3I2Y;48 z=L@V8lLMHfp$=Qe@(kQ~TAcd^VXw_)J}X^%bKWmhH5_M?rrR@+!%Aeh-2{A$+ej0$ z1pdHn)?XbDiaNM(5AIQ)1hyYKL3MWG@s1Jcw1q1`AEQ1Vox=V7gS@Amd_p2Pcz#U5z7bt*;!8qpSV|J+m*W>r>@&K~pDlJg)0{tC+SeRri0| z$e0T!=ox)E)&$uXHA6GH%gf^0Rb}XzeNkPKi&a$HPk!ontgD;$#=fYGw{B~W=Vx=B zpYFo3hl{8jB_C=8TrgUYIw8f*Y{XeW6FyB3(_ zcE9-F?~uPFxldTn4E9v{z8-Cf z!o)d4Ji@we?jlk_S@xfZBwx4>3~X>=2yuB%b_1?r5(;`DEPn+LI}>_Oit<1L`y}5- zcrw_fGtLvGzhcFE`%lGZ - - - - - - + diff --git a/site/static/favicons/favicon-error-dark.png b/site/static/favicons/favicon-error-dark.png index bfa8e566e018d96e89d4f94dda5f76137b5b18b4..f2fa4eb4d1d023ffc40889320f28117ead7bbbd4 100644 GIT binary patch delta 2189 zcmaKt`9Bkk1Ar-WZ47gtQN$d1-Q;G?QLdOH$C5@EW$`*<%$((j2}_v!rZOQ$Br3#Q z!<73f#sWo9TpQ_p&rMaSUhPD)4ZaMexUd>3qc(KS!u5 z_6A6U^FQv(R=gP8ufGk56EH^bxR@XTe<{XN4$2{W&kS!PctQaWfIT)o8^6Ur%C+$R zX*>KBGI)#<4z#wo246dKXI2IE{*Ww z+`cV-7UfUM=rL%Lrbj6|?&f&)ZcBK^pvBP6LBb?K_FPaP`ElYRjY@qB*9aXiFXNR!ymDyu7Rvz#P_ zj*sdd#1gH}38e3tL|;B9QQR`1ka`0(>A0bDS>6u(gW4m*A|M>Z$?2yxrOLOh+C>iA z%lzOCx<4B927EguUx9Jsk$kr#%{ZCWb6H(JXLCu$@fB!ZNAskFe>)s$11w#v95e5; zE}{|?bI|nZ#N%Ci;NN=A&RlszevnOjw~5oZNa=KW}|!@aJA zSh*Go(EmH*653-^U*O83N}i{=H1~|NbCldUS-ltOjU~w?E>fV(xu04}3J^_lrASdX z6Q4YBHo7VKR&^kf@HaQ3c{>QJAC$B*;Rtf*X4>^?0a)Q_k-f>sO#7rrJe&1^ImsLQ z4I>0f_Ly4k$yhO|Hm^=;(FK=Qv04wfkg_&3KSChNL!>X$mv_FHipQ%6V&-Aq9TlR) zulnTX3{iO(zmu(uCj0=0m{+XfkUn`oQQkjR(vUM$;ql3x&v>~NV~tKszO<>(=q7%F z+b;hlo7U#7^zYoqGi`Jvu%~RMkqt|n=X$`5Db78dgd2eu{-`N14vZnv<>2em!nTHV z*b_OPJkt^XEZg&|Zw^sZW8e=5(lrkxxt{l`&Fg~5EOXu}C?E3Xw;XC|v$cJ9jU#%- z%$5)O!rWTNI}Yy7S(ad`54|($)6Du+gsw0*2^vH05e%P~1M;8S{pGP8i`_7r+F|-m zw!~1*zcxz)S)A|DBb)SZT}4#6+(K`1!uxjUHJUErQfQqc*MCx;esOXe$DWVyCe7(s z`Sx7jE7L!a8iBEA_w^RJ-$1)Y|A1VR?N2EyK-rPt zl3jL-B_2SH_ScKVDhb~lEIjAtgPA-=h45^oqI0b#X`F3@<+Q(I7~iWTe8UHsi4!^< z<}iz&6gwWSuRH5JoyA<)tnnyc+@kPQnvF|1i`ShTj~2DAwWjeWj23IHvl(z{1h=K% z{e8WWO%#cb;YTjT48A1eX8_@%>2;qj4uSpvznZpFETl->z5XlM`5oaQiRYDBQpVM1 z%#3l1S?SA>%<*hQJ3Z##5$aGo>hSz7gYHs{=ZjL2e4HLJr2=^je#sN6$~1KNPYCyr z-z%BUZBMaJ;CC|P{y*TY(G8x4v&lWQN0b2JjP!_u-L*mF!xFow7!orhTn%I!cqQs+ z_dxO39{kWmne2{TK7`*&OVR4XA=JW=Qu<+sm#ptpLLt!CFL_h-v`4gyW~nqEs%Nq@ zGS<ASy|P zHVv%r@MZg5lqU*;3R#D?#{to)_&KY)z_ZxvsnysYz}%lGBBwrvx;b$puh8)oJ{&hE z2~`>2)}+PaL_WK5?hmGr4oSyQoa;tnYEa4YHR7?At9y(+i+a6E5!6;f0r{u_UDq}o z|3wvxbz1<}ekXJd({0P!FaD{7Op%l>D3A36e5C!JPBAq+OgpD@e$rj(Div5Sr^|t` zXalgSzrj=_I28`LuM$Skpsrj@b%d|<;y!&Q8$6YpTM11q#6@fqw0%N?bG8Dd7im&| zid$X1C$7F3)d3zHHQ`~fhTKkOGBfg~d>;QAo=2f|I6IKBI?1>=P7<-wO6xbTwOdbVTA02mT!0}G9URKj3h-tr( zQuX(m%2PM%YC9z(q!e2-VFu|I3VJ)`g? zEGY0VJNLrx>S+Tfv@*noo?*{98Sh`&JZ+N|^yenXtnsWqfkXp0U8;1Os7LFiEt2mF z>@K9Q7n~l35eb9JR6%+#rej%hId!`hd)jGu#1Y_clNk)lZnYGW2r)a_&`rEeTD9=z zD-BnadY8IPi$@)zfU0d{4F-oYNzWQ-YJJs-C=QKj&Ov(X$-y)U%k(-a&EC#24e=Yc z^z*Ke(zvdfo0#5?A)~Xp)&{D8N?vlf#QlppY~oS{Ao-KY#$ld)G7Xl@v}LBoE{3P9 uEtJg*sjQu~GY!7I@~{A<_MgWG?HQ@F)LHo|eK2GCAC@py8}kNJB<^1eks4J1 delta 2520 zcmV;}2`Bc-5t9^!JIcWD|6BZ?b zKsV4J8f5>fUTHK0fkuCL53gT0Fo4J7@pwEQkH_Qjcsw4D$A9DTcsw4D$K&yMJf23t zrR_^QlJ*~ILuq1(b+LL_PMhenV`=xL-Nc3yKy`*Nur5|lo~SR{DbxkZu|ZsbxtL87 zHL=Ii_OJnP6ziZSib@ts>tW3)BWM#vO@uYR*S63M=!)goJm{kM0P41*O%p`rsK?7( zVMp45$rqX+YJY&u^wLFcnQYtyQTO1X@EhoE+!RmUbm-ptd)7 z$~aXQ3b~QywsfB&uP#~`c!F|J5xhEdZJ{?iNUtyZ4?5F ziW8w6!oogMSvOHl`3P&sx`kg4n&+v}f+cXM5PBJ&8Lo>;V>!xbDNNG+vW@~m<8WQn zLsUmHt;Jy<%4+YUCN@1$3Q&!xL)6G7i%LU^2huLWK7T`vY`UlRv4%8NRKD=@2tI*& zjwXo8p?~HQ1E^sOPuYeW02p`C-qojnv^<4g8exIe+(M+LJqu6ZhnNsmz+ zpnSpn=G>zB{!EJJ9A=B%2B@fx+jIhyU)!5yN6;U>^bPmjM=|;a$7r0V_E3E$+Ld-q z+Plb~&55Azc>-p$Lu(I(Sn?pTLZd6*XdP{Z^nYR2ZjJ^}X63;;2y3#Wh1wjzagI=r zpo^WfhkAJjW^H~1hv}hSK@+2OMjZ8V3Fd81hH6f&m<-^Cpo!7a%ep$K>{D?`#OW^X zw2qYzM<_-p?GDu9Xu87L+^#@{F)Gd%sUp$7>bk#@C=bwZdN98dkD;F+aF~xV>kh;8 zRDWBUgz+U$Wv~y0G7eRzeSO|&B7*sIrsSD@n8Tqi25#`30aVrLBA##aqE!V&3rd1G z%pqalgKEE30w}?34pI6j2Z!AX747Q?)xJfg3-dO=+msCVP zhB@Eo$mYmWJG1OD%!DoKrSS{4hXNb}R!%yrky!-*oePR18*ZVUIz}F=TcNsQxPNcz zCt9l<;MtSu90e+3eW3J-mJzh8xgU=D&m}pZyU@e5p#K3Z&;?4LWY)>kfIG-(!%%a7 z9QjbVyFWj+?Q==ahmxi}=n+6g!C0eB^tsmaLRl3ha%l>C9Oh6XB0PHt_yV3)nrM~4 zmw2}7FN@3bHt28(`c1H)Go{f?V=h6a7)xWpxX*XiPEB)j7h7UiyXjG>Mp4hGGuftOh$=>x zr1zo>X`<@hPd~v1^7U_jjaR=D^47=>w%VP?@+P?tYs|!@s?^^2#(ysv3R1>Xi&jq> z35DBJ8E)H?smyc4y;xd7&&-2E-FEJdZ(L<`OjG>Ju{0T}&fSq&$RoSnxdg#zsQ7Ob zn0!wYH9|gi(zJ#^Ay?ivS!atvBMY!91g>=2oexbzahj+Pkk7`5`v2gkXvvTZA@0de zHjjm+nO#J8$GdN9e}5xQR4OJ6GrmKgZN&JLiV3f5ougVocO@ZrX+vhmKG40trin@k z&@R#o`p5InB5VMoS4W83Q{H0i&!`tFLs1*F60>EAQY7sSC;@NJZ5M6}`W7rgUfP~+ zvG%mnhZ}X}oz7OLr{k@8uLlTW{rxW^|vbgx+|&>QP#&zs(&calpswqBn!=Lka};LPf0mD zXDk@|GVAju{#me}K~+@fz4~QmW>Q6^fgq?N#e~jM+0`SmFSw>wltNTEdn8(C^v?+s zP6jes*`K+R)6qg${fu|7Qr|prZfGMgeC^R^Z)9!aR}(HlI;oIW<=>hs24i8~CSKGf zOsC(Ixql|An4Gcq^EUFLE@3A;!B)F75)iHkE0Z@i*a`m`F>& zJ;rzo)%D*jJBU;cYZ1h47ZC4N_bB#$Z7B^ z`iHmMabJ1{t>Q1+mox92p8e#`P8gONLU~b3vLJ4+C2&plD2HCZ&ZZBgXO3igeK?(- zJ5ekvW`Y;hB2RD3R?Y|X+MO1|n^G_?mE(-5*9ee+^5>E4^phAOlv8{EJO7W*LwGzM ikH_Qjcsw4DC*cQGwbKKQ)u&hh0000 - - + + diff --git a/site/static/favicons/favicon-error-light.png b/site/static/favicons/favicon-error-light.png index 4905ae236cc995dec165562cf5349b16bada6fa6..177454532e1eed9a3cbbcb84a0899f0bbcb5c306 100644 GIT binary patch delta 1934 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 diff --git a/site/static/favicons/favicon-error-light.svg b/site/static/favicons/favicon-error-light.svg index 7737cfd357f97..d3627d99e8706 100644 --- a/site/static/favicons/favicon-error-light.svg +++ b/site/static/favicons/favicon-error-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/site/static/favicons/favicon-light.png b/site/static/favicons/favicon-light.png index 048d4e974ccec7f77964cb6cc1b141bb49437fe5..05342c103d7b84ae1ee37db09ecd24a763cb2300 100644 GIT binary patch delta 1195 zcmdlcx}S4`NU}oXkrghb7(7*O7r?V?Xzw zL{=a-#M8wwq=ND7o!_BX97NbY@b~}k7PSad2uoPuu=c=Krj1M+nBF!7G)6UMvnH@g zTOZ&$R(;lG8iQxqJC)hTzgwsKiA+2DI8E&{kAsU#y$e2|T;9M~`JO+uSmctir{0po zYqz|$TB4Lw@44&Je|Z_1n8tTks{>Rg%*=`NzVue`(nW>r1bvmYswY^5CMVk;_c-}; zU;T&j7mYDI>a)uy`4yOd|C*}%(#g-vU8zV;PFeN&&xHCnlh{n3oC=<@vnZa+bAAv@ z`9(+G^QX>F3X|w}y0md=#JsEk`GX$kemCcsNrXF0oxEk@W9y@bT%KQekHkU+Lz#k>PND!UUP=VGHyG-`7X=z0{ob z-SD=WFWYRJQio89s^2XY?faYsZCqoUeleO&lFKz^32#@sDWuke`FKD*SF%63HfOh9x%yyCsk`8!KaOBHhQm^aw3IIg?Dyu;$1^;h##kW_mX6TJg??`kqlwK)xGW3dNXgCM?BY}m2Km{GPXZz?7vpOZtgF6L*rb>zr7XH z`nt~@%IIDF_r}86k?W3UYS-;ooY&Ws@?!o{ml>(Ndv#Y-sYmx`%pxRs5lC+q$>=drmj{^+|93t5+MDtk>wp`vhEdVZL3N7?Qfmu~*8U zSN~*1_sf#aFAL?)Z{-Y5kK%itFQ#DK6W(~DK~HOWUhT$xm2WKDX5N=}zP(6)`Xpy< z&$yk7oz~ep{|s7FU#qRMmw#{KMX{N|+13|hc2BC$I(Iib-?!0d#`(33b2p_}ZasHj z=XHI1ow!n_s>ktK{UG+DK;K!hxvUYvR~HJbezoDk#sJ=DQ%e;;J3rZR-XO^Lv@<*B ztJ*(jO+=#1EHnTB literal 2742 zcmb`Ji8~Vx1IK5!Vb10#N8)wmOc)_H8e(S4CQ(04lp|NkonyKjF-OF#43W)MXd z2js0GJ_D-@c;vyY4}l6kaat090-kCKz6P(rEBzV@bO_o-9;0dk6o_W zH)g*+ww_M^$->u4sF8}kpJ51@Iaz22!3a3bQm`EjnawDh`F3r;Z? z%jF>k3KCoUbjo;~h=qxhpf*2H4Fo6a8Ve`3^jL*R(kS%kevfX)!zuwnc%v>c@a3_k zrWPq&E;COKvXWa%8U-9U^tm>N5#YVWauBQF0T(SQb}!h(Uiks)5TVcM=z9-{p?m92@-_+DrRxz!7^j=Vq*RoN!F0 zs9c)xPm2-`u?4;Mn&z6ugGrI1CN(oeD>e@EFL)`LcsoaJ3N+NdP8w*;W$i|@e%I|b zs@&Vp&QTZ^QwKzF#Q>3s68&+T4>Z~&0{5KGGH3kXdg8F{pfTyd5gFQ*qkn<4O15eM z=|_RvK7j`rNG|U27Um9HQY#QviAv<#IPOn}{ETbjr=~E~J?Ib#08ovloV9--_ z)chSSqLnB7%M5{&IReqe@%xiMN~N9p zFpUW{ih1bXU`;K9mZ}}PZ4`w5YQr)k?Ykw-Kz;2jrFSu$pC^KV%e zhvT$Axig}ti>I8ry3tU?Nxyv&uY+}55H$q6)jobKf+?@f(_fFTnnQ`YF2+O^)}4r` z(`^Px2{3ZUKDYaQU`Mo~YXzA0*pTcf1eDRCNH_KIq0JFrUp)<1-c)eT?hWSSyLf2h z=xXUx$j3AAy)yXb{3_}UtLL-1i{YJ%wh(1n^zr#Q(meB<55lxmzp_C6*T|;~;Iy6( zy{~Xrg>M3R>!h)xPQ5RK8CY=xJn(j$dS!xtI=ya2of(-xeBhaG;pvKcsuY!7K*GEo3OZUILu{iND4$%?i_;kVLKYqWhm1h_Cx$!uN%&Pa^{G) z$aGvpWzxO2+L{DN;HA?744&l7M>S91;Ee4@^w+Wv9bJOVim`=mm7Dd?dR#pD@zq^K z5nvrehAd7l{&Ez>E$LQ`Ih6we=$IRXCkYakb}tR(F;L{Df8O6QG%$KSGp~F;hOXre ze)O`&8`;CA+fXVDy(M?#H#4u`9i#cQAIP%V4J!wAYHF^7a)U`{CuC8%k_6$7<&^uw z{q_^>X~s(ytPSyd*rK^@4eiu zCtVf~_*tmCdGlnx;V0sq%IhWp?|Z6(1zG%&)mQRW;(c2)o-U^_Zn@I*De$}!%EGp_ z)sA)CSw@y`4H3t3v?PC2m&XMR%r$2h8(XC0OxR*394+AfVBBFUfrs5kw(1km$WQU$ zoX@hYWrM;>mI?>i)+eRDZ+b6HgoHTYn2K%no{r;lct`ygOTRMU1F9T)rM%5ceVBn- zX~VbYGZk|kLN8*`Y?jr9>BBg$JnN4Pew=7GXSHNcB)!SA$*1?pkRAsmE zRrD{*%#kpEJXMI<;)#*;pMeC6sQw^)FA7rKi8Td}!3vNcGR&?AF1}_mdC&F4hau*{nmf(#t2OV5rO8uczhfPkzqjn`&*#xf9Nq;6bb&Qz zdrN;F?l4K+$vjxv-0f8KFRQx&TrJ(qJ(wVA$2Pfj$|g1j*G`G(Hdjm3R{TUY8rrps zPl~hMUAtiy4u}}7uQ#%~dO8QE`>Jox_ovRt<7nO>S%K1nQu2R=d zIb)lK?;#6Y!9x@t7MY3AmVcNcL~o8x?q2@Ue82xh7yk>P#_kL_JfmplT4;$iGb)1A z&4R^PbYC{9w~7`$CCwH;vf7)q0rg%CWxo8P|3)J6oC8c$OPWB%@R5~_{HibL*QDGX5QAU zsgMUr_XeW8K(1yuO8M_M1~9({&#Uk)j|O3U@*sh??z9WKNU|WmY^USBaR00jIZTgb z)U}R%%UQqk%D^Jzi&mQ$aHf9~Ht*lMY&L#f92Th*_r)j%B(7r0=OjudcU2MNo{+-#b`dAeKe7&|w8o zZc{J-1*BP;*_ diff --git a/site/static/favicons/favicon-light.svg b/site/static/favicons/favicon-light.svg index 03949d61e9dcf..f8f77a51a8b90 100644 --- a/site/static/favicons/favicon-light.svg +++ b/site/static/favicons/favicon-light.svg @@ -1,8 +1,3 @@ - - - - - - + diff --git a/site/static/favicons/favicon-running-dark.png b/site/static/favicons/favicon-running-dark.png index 97698d87d5ed07962fcc38a70f67c88846f84474..8f97541b588addc997b2a38c67abc94807b01d54 100644 GIT binary patch delta 2145 zcmaiqXE+;*0zhlTsx1_y8e35sTDjUp6SQU}gxZZ!d-ujB_O2PN89TMrOtsXCRiiPg zRZ8uVqOmXDb??vj=Y8*d=hyiTiLZz!-4w^7s;dP@2h!~n*ci{50S7;4*G`ki@wLVF z0FZow1-y@qUL|ac&k+#G&qz?8@@H}eQ1~%s5f<=iezK@CB%@;Pg=D@UNb)>*kpp=AFt%2rZ^=g`({GAr`86ap3>2e8lREudMc4a~ zF9Hu;f;_F~wh4Vk**p2ry=reW?bJMrmzOUJ;`;O3cP6ysw)vCH`= zevFeoP6{4NC5(t^QCKaLMM`rVo%FHRCqTeaj{?*Hfs9&$l|=Nds|VA=21o;5H=4{3 z>FRfPcT+Kmxx?p%>&S>Ortx)I#p@P?N38dhGV zCVc;0bK;WxL-~2p`T0LFkG99wBXw3ViobCoEy-Z8!z;^a+5@)tuf)kTqt@?mE;?<4 zFoBktmtc3BZ3w^8@{LVfEfD9Pm)9|tQHm)VezPp0D3uy}_GEUh@h>^7~#7D;fVEUeH2aUd`fK9kJvy!pbSoU)RsP!ox6R6O7uD z)LTvfc=_f^K!LP(sk&JnoT19?CTEsv28ClP-|y+OPUck#-ahS4DZx<#6aM;M4$+91 zEkQ7qbK2#9D%L(1NJ?t|QeO=Lr^=7aV3wg)J}mpke7QSd!|g8Sd_h??Cn5Zy>g)ch z%cxt3P08CtV&s>+Q<~4}#!kM8U!$mg*P!3Zgw6QXIzEHYn6KVFzKi8sdSF7M7~+Za zzz=$jXYAL^Gu5fTl5kbtNxhR+owFXSa-ZQm1sZK=brC0cjRZp>uw&E6U(gM|;IcbE ze!g3$u^SpFuwxha_P~ZL#|=4rzia0lpeVc8dS$=25_NsLkig05Z8isftl7ZDRvaHb zKiC`A)0nL#O5ee$QnSxHB62)DJh4MlkFrcy{unyxcXb7whhs(_;T{$WSll<*YW=uk+5K)e+3-X#YkYJ47 zO9!q11M25|L!Yu2p%cs|IuFc%g))QVCFtpi4hkJMREFKiP$}f}Z0Gt|8LTqO%ndRu z=BWQNF_s=zAk6en;sdYLJF zF#WCOUXQ9O7IB%oF(D}yaRWAhmsxEb7r)(K+9HX|crR>Ny9BDCk9JH`6ZSWRXiqh1 z{K0NiNRcu6=C0aC;{cMj$I~2qU4@vj0NZ!2$J+~rMqmp>N3R=~)HTafwVa3op*}OV z!_h?M>m8d6=pWX?99zd)HIx3TT*gP>E{;wmBovzROiebtu$`b6 z^cZ(Rte_$V(h0jO^!wZ`L++WBDZihp=J60H$vC4RhCj8LLl{cppXyWi{3;tJRdDad z#o~n9%#+?0YE~Fbu1vG2DU5Xs&4JHS zUOIS2PLbaf5v`M}lQx3j>*cUfuA*=u+!m^|73|V_oyp$9gi$xPa&hsF#o(yK#_7SY zQ=M_oT3Sl&v4GNYL4O6a!_MTU-G^1ukl>zl0Z@&Wxr0VXm*^SiD`b&XMWbJ3WK9v? z9OM+tS*k5X6Y@|~_$+B2TUS^?w1DgCBEm@DS6>orfKrmxd5U zmQg*WW;)b8s)T~0JJdtLw|jmaJ`p7+&}z?HQy0q&IT%aFW(uC$uUU@NiMlGK+yBbA z{rp!KfX5-DF9-l`#@`8wN#8_>*hHMz6Dv~K`;`B;wd$7)a^&a$&^jaim4DIIexg;6 Hz(oB6n|2CA delta 2427 zcmV->3552a5w{bNReuRgNklcVM0a=q{yhL=9smeDK-z4PfFL4}m`Z7Q%g|rbioF;bAps>+`xB58yT->Ty@vp|snX<^Q*C zID&m9`&(odqF(e7*bq3JH=PDBU1&5~?0^@bvPY%~iH%?kvlE}8KUeg1n9o_Y=*v7+ z7lzzeb6ei0=+$)-13#k~Oyak4OV~6~Bbd=7Oxp+>&+<_W1%GvhAKa#s<M=GrM(;dzg!V_GLunVKy@=}7 zoEZ9^m%wawXyajsr3WQzG+yyWb+j!qhFQA>dVfHZ%7aZ1)}*9`Z4Ti$6Lcf!awi?2 zTV8-!o4Y%1i#pMxaxV+OYDjz1O zMpu!lF^L4UF+*eokSBi2AJ!b^-EAa^W0|Wu{IcC>km`}Ae88ANN zseb|N!%!xm^0bdEh^LA!5J8N$5H4|!@+LNrUdwkr#-?ZA=+uDO>r51>qa>%qFx1%w0~%#;`l?Tx!P>W-l_P`5!!7tkH3$4*m&8; z5H(?=CxDesSY?xv<5ykHqU5{6ayyIco2-qdm_GexP1L5tZr#R-6~||1%__bxP|n0s zJIm}2%!IA$rHfN`fEpYDR!+LCk!1-0oeN5!9ATlII!2Gx%}`x1+&BA)waOt*o_|ai zsF4vH1C39#iJ(Kx{Rnh_F8TSq4LwW~`X9jpL!j|VmYqB&++jrTLt`=^c79RZc{JMFpJHA-bWp1~~qFznbq$s6ci)MdtK=RAuL zcu?HNq7Gpu=n(BNg210ytd}|)Fp%^UJ84n);k~a?&5w_h=(W1(;|D1kIx|_Wvt~Gz_A=UK z3jH~s$&{u!xtRC&0_+~2m4Bkj5%NM>U^N9L9&%OH- z!hiqHKlf!seFyVBImJmvH3TI>?qi6-9tT6r7@ZGq-a`|LMAf~YeuXXMe>Z={AOHME zAn%LUFdtBetFVO%++}S{oOM%72^3vnWpJA7!7#*arS}mzf_SyXg&dOCXhE8?>fOs|HH3v?rhh zyq?*!a9hx)V3E{IcXwrCVRtOMRG@qI<^6S}S%2Z&()w(G8V1~%VxO)p(YF?aV~ zf;%t_^VV0o7{5tV8lLb4*kX`+=?HES;Lkzjs@SH@Q$K+cwtrD#BwcMuS5tN_!Zmh+ zE8&N~m2R?W?4i&ky0sV|(&UyM}- zMP-TR!=f&rme5>{V~c?E>eSdS^Q`=s%jY~cgaF@~~L?6QM5xQX=WuSHGwWx&eGtf(VdQ$ozY78zG z>o4BhqU}Li6E-5FG(|hYio*X@%NH(-8kc?8r;HMp1i8qN7n<8(#l0z2)!jAYB>AE2 z<39c@*nglhD$k?&%1p7Siy)D+LDu8yl*+E3q@?cGEy`dp)&v#;~%# zw35@wR=Yq}7sN*v-J042m_@HX_C(nxzM60qizJcO=5Ni_C92xMi@J(O<}}wtP146R zD)6GNAT6N2Ke#KC=dK9L!P_)?Z9lHs(2H8e?mUrJSw6BRVjV9fUepp&Z=LVR6y^P{ zOJeDzV}BhlC0^7DqRWrV5$DcfhhaG3vE_*OW8E+KDUBxC6ldL!U6600%a8rn_tSNIfx+%r`g8`X_?z}+>YbcI$x(NsDU=trAxq+p z(&BGbE3DJ6+45mR0S_^lA2t;;$BSx_ta3iYf`#BaPfE`dQZ#Y$f)6QR5=h|!xdOC^ tWbc0;T|N`R - - + + diff --git a/site/static/favicons/favicon-running-light.png b/site/static/favicons/favicon-running-light.png index 5cd57da4d814ad515acdb8bec87b6c3abecebead..32850641803e930424dd66d5a24f1f41b676bb75 100644 GIT binary patch delta 1878 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 diff --git a/site/static/favicons/favicon-running-light.svg b/site/static/favicons/favicon-running-light.svg index 92e70c99444e9..f4149682cfe4e 100644 --- a/site/static/favicons/favicon-running-light.svg +++ b/site/static/favicons/favicon-running-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/site/static/favicons/favicon-success-dark.png b/site/static/favicons/favicon-success-dark.png index dcb8a3784440043aef7b7813ce18a067c0d03539..c267c991823c38b8ab74e326870805c071180e3a 100644 GIT binary patch delta 2115 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 diff --git a/site/static/favicons/favicon-success-dark.svg b/site/static/favicons/favicon-success-dark.svg index 7b146d31c9fe1..d86e54adab35f 100644 --- a/site/static/favicons/favicon-success-dark.svg +++ b/site/static/favicons/favicon-success-dark.svg @@ -1,4 +1,4 @@ - - + + diff --git a/site/static/favicons/favicon-success-light.png b/site/static/favicons/favicon-success-light.png index 45ee20c2ef0593d532638c2a7a526e1657c10d60..b4d4a46af94b1a97d16a78aaaf95eb9cc3198f10 100644 GIT binary patch delta 1834 zcmV+_2i5qo6S)qMB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1pojB&PhZ;RCodH+}m;6Mid6%AF}1wC>3N~fvpNcO$vxzLFl(kk{Qbt zSgIiOOdj%Px&k`|WJpzDxdI^-n0fU@>vMpmOu`@u>;(kH|9_iVadZPn9_;;q01*)p z5fKp)5fKp)5fKp)5fKp)5fKp)5fKp)5fKp)^<0JyS!<8v;h`%(NHMM)EtEwwS916G zPRgZzpJmx4s8;fzN+1XF@Us+se2927$QsyJQl=8*9FfU$e~F%w*ZXAU?~s7J8Acv{ zk#dS}YhNl;DSxlz#f}k)ybg<=lGnL1c2R@sYUOj3wQ^f>Dd#bQyVpT=edV80hUkx6 z%1KDGysJSyKp=VDPvzkX{R*fuQm*9rJ;$E$uBone>Kk^7{u@hqCKvat%|Go`^Xmpe zuMu}No0^W0Pul#$-ZZ~1pcCv?K-HknQaBIpyXinl=b{E-bd~3{?X;rGHJdt$%@JmZ zTWVvwY=6ru`U+t*pl66ko|g`w-ooEZp40bOe~w!_r5Pa1ICeml+j={Pza!hA3Eo9b zg8CF;Lf-gIbZQdPoDXmdtqrQXl0)W+;}rXxbFP1W1%JD?fYQjOnmRz3l(lp&Bm?3* z+(Mgz`Xl^ZrmUq4rtp)ayAAwK-QDne1AkrR5PxYCtf?J&yV3)}mkrwuIm3>#@n|rk<#O2#6=qZOtIdLe zpMTC)Yve^%HyrX6e_H*yHhIsG)(a_Tp}SLyHsv&L3hICG7qW2Cm@Ri}Oy$Q0&7_`7 zuS}geo#5yL@F=^M_bJ2tHO!mkGQB6mrM&HL62WBI>x32wgmPuH+zhkgbBk!c>?wezEu4SgFSX-|%!$C8W0tooBCiw|Rjd1(`DM%%A<2!x2;r;e+A=znh$ zJiKFzF3cbvy+|f{?7ClW465rFrtoK^ytaV}XEk0Tu$D$%o(qD4MYtQu>}6wgNp6SBEp=e&B6B&eZPMUB<|dhv&ig6e8(=$l}qOl-hP zlPyfiuMM zq{+EkjDDAnr_HX^($EadRt_`VpHFuhFX-z?SYG2}l=Ifm{?VWuKmMQH%HJ z-ptk3S?m2&ca=ZE?$K7DaX?$RSp4S0b?^Yr*U@KpZm&&p7g%kIcV#0yRY29!TsJ%D zX3e|KwL7?v?%3Jx)HmF@gVI^_%9nB<-Q@TB&}rCl zmNt_xU;M^)GmTlr=$9xtN`LNN84Ygi3B9izWpg`>xsO?==J>H!&e|x>9WC+9)!HGp z8{8b_obi6@Ex$gCo=sQ@u8xwYNNb+=d*XsQMu%$Fw6{5UEY6)Qo6z-RV=eaU=Qe1W zFDUq$f6%06;^|=RGGPZG8CxT3P_n{Qe1dBC=XMJrDKqrW7D-)S%Bz%^q*lo&s$adw zY9eE(a@w11qX$e<>o{oCg(%7=KZlOLAnSi+ztq|LC+iY>|<@fF9e%h+$7 z`9STtoTZqVg+&crbqfZA+Mz%G#Yk#b(1(rbph)}cb+=tGs2y{)_6%sX>Qu~qC77e& z8>A?mn_C$z1`>n^wsI?Du`ytAX%BFrD@AQ?Wh5dZA|fIpA|oOqA|fIpA|fIpBBFiw Y1;|9jdG(31-T(jq07*qoM6N<$g2z~tFaQ7m delta 2471 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 diff --git a/site/static/favicons/favicon-success-light.svg b/site/static/favicons/favicon-success-light.svg index 45254597e3d9e..142d47a90914f 100644 --- a/site/static/favicons/favicon-success-light.svg +++ b/site/static/favicons/favicon-success-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/site/static/favicons/favicon-warning-dark.png b/site/static/favicons/favicon-warning-dark.png index e15e126acc3b19a82230510fe848c88f17f1298b..8aed49de34072fa1cbd221094a506227ae6f10ba 100644 GIT binary patch delta 2123 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 KP6b4+LSTZ-Z>Vel diff --git a/site/static/favicons/favicon-warning-dark.svg b/site/static/favicons/favicon-warning-dark.svg index 18dcf60cf13e3..535c3045f9769 100644 --- a/site/static/favicons/favicon-warning-dark.svg +++ b/site/static/favicons/favicon-warning-dark.svg @@ -1,4 +1,4 @@ - - + + diff --git a/site/static/favicons/favicon-warning-light.png b/site/static/favicons/favicon-warning-light.png index 240a4629b9bad0225e31c86466251b8fda646a7e..ce6cf44ee22c44f6dc3ddce986db1f56b475f61f 100644 GIT binary patch delta 1838 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 - - + + diff --git a/site/static/icon/coder.svg b/site/static/icon/coder.svg index f77e5cbb92ced..18db594d4fae5 100644 --- a/site/static/icon/coder.svg +++ b/site/static/icon/coder.svg @@ -1,8 +1,3 @@ - - - - - - - + + diff --git a/site/static/open-in-coder.svg b/site/static/open-in-coder.svg index 43b51615b68c5..933258e1b73a1 100644 --- a/site/static/open-in-coder.svg +++ b/site/static/open-in-coder.svg @@ -1,16 +1,11 @@ - - - - - - - - + + + - - - + + + From 288ec7709ddc5c500967cd645086397bcbf84267 Mon Sep 17 00:00:00 2001 From: Asher Date: Tue, 24 Jun 2025 13:17:12 -0800 Subject: [PATCH 4/5] feat: add workspace build status to task page (#18520) While a workspace is starting, display the build status and a progress bar. --- site/src/pages/TaskPage/TaskPage.stories.tsx | 12 +++++ site/src/pages/TaskPage/TaskPage.tsx | 41 ++++++++++++--- .../WorkspacePage/WorkspaceBuildProgress.tsx | 51 +++++++++++++------ 3 files changed, 81 insertions(+), 23 deletions(-) diff --git a/site/src/pages/TaskPage/TaskPage.stories.tsx b/site/src/pages/TaskPage/TaskPage.stories.tsx index a24968d483e38..03f8cfe739d89 100644 --- a/site/src/pages/TaskPage/TaskPage.stories.tsx +++ b/site/src/pages/TaskPage/TaskPage.stories.tsx @@ -1,5 +1,6 @@ import type { Meta, StoryObj } from "@storybook/react"; import { expect, spyOn, within } from "@storybook/test"; +import { API } from "api/api"; import type { Workspace, WorkspaceApp, @@ -9,6 +10,7 @@ import { MockFailedWorkspace, MockStartingWorkspace, MockStoppedWorkspace, + MockTemplate, MockWorkspace, MockWorkspaceAgent, MockWorkspaceApp, @@ -59,6 +61,16 @@ export const WaitingOnBuild: Story = { }, }; +export const WaitingOnBuildWithTemplate: Story = { + beforeEach: () => { + spyOn(API, "getTemplate").mockResolvedValue(MockTemplate); + spyOn(data, "fetchTask").mockResolvedValue({ + prompt: "Create competitors page", + workspace: MockStartingWorkspace, + }); + }, +}; + export const WaitingOnStatus: Story = { beforeEach: () => { spyOn(data, "fetchTask").mockResolvedValue({ diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index a46e0f09c7cc9..c340a96cfef11 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -1,10 +1,12 @@ import { API } from "api/api"; import { getErrorDetail, getErrorMessage } from "api/errors"; +import { template as templateQueryOptions } from "api/queries/templates"; import type { Workspace, WorkspaceStatus } from "api/typesGenerated"; import { Button } from "components/Button/Button"; import { Loader } from "components/Loader/Loader"; import { Margins } from "components/Margins/Margins"; import { Spinner } from "components/Spinner/Spinner"; +import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs"; import { ArrowLeftIcon, RotateCcwIcon } from "lucide-react"; import { AI_PROMPT_PARAMETER_NAME, type Task } from "modules/tasks/tasks"; import type { ReactNode } from "react"; @@ -14,6 +16,10 @@ import { useParams } from "react-router-dom"; import { Link as RouterLink } from "react-router-dom"; import { ellipsizeText } from "utils/ellipsizeText"; import { pageTitle } from "utils/page"; +import { + ActiveTransition, + WorkspaceBuildProgress, +} from "../WorkspacePage/WorkspaceBuildProgress"; import { TaskApps } from "./TaskApps"; import { TaskSidebar } from "./TaskSidebar"; @@ -32,6 +38,19 @@ const TaskPage = () => { refetchInterval: 5_000, }); + const { data: template } = useQuery({ + ...templateQueryOptions(task?.workspace.template_id ?? ""), + enabled: Boolean(task), + }); + + const waitingStatuses: WorkspaceStatus[] = ["starting", "pending"]; + const shouldStreamBuildLogs = + task && waitingStatuses.includes(task.workspace.latest_build.status); + const buildLogs = useWorkspaceBuildLogs( + task?.workspace.latest_build.id ?? "", + shouldStreamBuildLogs, + ); + if (error) { return ( <> @@ -77,7 +96,6 @@ const TaskPage = () => { } let content: ReactNode = null; - const waitingStatuses: WorkspaceStatus[] = ["starting", "pending"]; const terminatedStatuses: WorkspaceStatus[] = [ "canceled", "canceling", @@ -88,16 +106,25 @@ const TaskPage = () => { ]; if (waitingStatuses.includes(task.workspace.latest_build.status)) { + // If no template yet, use an indeterminate progress bar. + const transition = (template && + ActiveTransition(template, task.workspace)) || { P50: 0, P95: null }; + const lastStage = + buildLogs?.[buildLogs.length - 1]?.stage || "Waiting for build status"; content = ( -
-
- +
+

Starting your workspace

- - This should take a few minutes - +
{lastStage}
+
+
+
); diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx index 715ceb136c262..306da719be0ca 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.tsx @@ -62,11 +62,18 @@ const estimateFinish = ( interface WorkspaceBuildProgressProps { workspace: Workspace; transitionStats: TransitionStats; + // variant changes how the progress bar is displayed: with the workspace + // variant the workspace transition and time remaining are displayed under the + // bar aligned to the left and right respectively. With the task variant the + // workspace transition is not displayed and the time remaining is displayed + // centered above the bar, and the bar's border radius is removed. + variant?: "workspace" | "task"; } export const WorkspaceBuildProgress: FC = ({ workspace, transitionStats, + variant, }) => { const job = workspace.latest_build.job; const [progressValue, setProgressValue] = useState(0); @@ -114,6 +121,13 @@ export const WorkspaceBuildProgress: FC = ({ } return (
+ {variant === "task" && ( +
+
+ {progressText} +
+
+ )} = ({ ? "determinate" : "indeterminate" } - // If a transition is set, there is a moment on new load where the - // bar accelerates to progressValue and then rapidly decelerates, which - // is not indicative of true progress. - classes={{ bar: classNames.bar }} + classes={{ + // If a transition is set, there is a moment on new load where the bar + // accelerates to progressValue and then rapidly decelerates, which is + // not indicative of true progress. + bar: classNames.bar, + // With the "task" variant, the progress bar is fullscreen, so remove + // the border radius. + root: variant === "task" ? classNames.root : undefined, + }} /> -
-
- {capitalize(workspace.latest_build.status)} workspace... -
-
- {progressText} + {variant !== "task" && ( +
+
+ {capitalize(workspace.latest_build.status)} workspace... +
+
+ {progressText} +
-
+ )}
); }; @@ -146,6 +167,9 @@ export const WorkspaceBuildProgress: FC = ({ const classNames = { bar: css` transition: none; + `, + root: css` + border-radius: 0; `, }; @@ -154,11 +178,6 @@ const styles = { paddingLeft: 2, paddingRight: 2, }, - barHelpers: { - display: "flex", - justifyContent: "space-between", - marginTop: 4, - }, label: (theme) => ({ fontSize: 12, display: "block", From 79c666bf08f820c3d78967bf6de91eff22405d5b Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:27:35 +1000 Subject: [PATCH 5/5] fix(vpn): avoid setting session token header twice (#18524) `coderd` currently does not handle a session token header value of the form `token1, token2`. However, it does handle multiple instances of the token header by simply taking the first. This is the default behaviour of `http.Header.Get`. So, setting the token header twice causes issues when Coder is behind a proxy that merges duplicate headers, such as [Apache](https://httpd.apache.org/docs/2.4/mod/mod_headers.html#:~:text=list%20of%20values.-,When%20a%20new%20value%20is%20merged%20onto%20an%20existing%20header,format%20specifiers%20have%20been%20processed). This PR ensures we don't set it twice by not sharing one slice between the `HTTPClient` and the `websocket.DialerOptions`. It also adds a regression test. --- codersdk/client.go | 2 +- vpn/client.go | 7 ++++--- vpn/client_test.go | 7 +++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/codersdk/client.go b/codersdk/client.go index b0fb4d9764b3c..2097225ff489c 100644 --- a/codersdk/client.go +++ b/codersdk/client.go @@ -354,7 +354,7 @@ func (c *Client) Dial(ctx context.Context, path string, opts *websocket.DialOpti if opts.HTTPHeader == nil { opts.HTTPHeader = http.Header{} } - if opts.HTTPHeader.Get("tokenHeader") == "" { + if opts.HTTPHeader.Get(tokenHeader) == "" { opts.HTTPHeader.Set(tokenHeader, c.SessionToken()) } diff --git a/vpn/client.go b/vpn/client.go index e3f3e767fc477..d52718e7fa7ab 100644 --- a/vpn/client.go +++ b/vpn/client.go @@ -92,7 +92,7 @@ func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string sdk.SetSessionToken(token) sdk.HTTPClient.Transport = &codersdk.HeaderTransport{ Transport: http.DefaultTransport, - Header: headers, + Header: headers.Clone(), } // New context, separate from initCtx. We don't want to cancel the @@ -129,17 +129,18 @@ func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string headers.Set(codersdk.SessionTokenHeader, token) dialer := workspacesdk.NewWebsocketDialer(options.Logger, rpcURL, &websocket.DialOptions{ HTTPClient: sdk.HTTPClient, - HTTPHeader: headers, + HTTPHeader: headers.Clone(), CompressionMode: websocket.CompressionDisabled, }, workspacesdk.WithWorkspaceUpdates(&proto.WorkspaceUpdatesRequest{ WorkspaceOwnerId: tailnet.UUIDToByteSlice(me.ID), })) + clonedHeaders := headers.Clone() ip := tailnet.CoderServicePrefix.RandomAddr() conn, err := tailnet.NewConn(&tailnet.Options{ Addresses: []netip.Prefix{netip.PrefixFrom(ip, 128)}, DERPMap: connInfo.DERPMap, - DERPHeader: &headers, + DERPHeader: &clonedHeaders, DERPForceWebSockets: connInfo.DERPForceWebSockets, Logger: options.Logger, BlockEndpoints: connInfo.DisableDirectConnections, diff --git a/vpn/client_test.go b/vpn/client_test.go index 4b05bf108e8e4..de13b2349d5d4 100644 --- a/vpn/client_test.go +++ b/vpn/client_test.go @@ -90,6 +90,8 @@ func TestClient_WorkspaceUpdates(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/api/v2/users/me": + values := r.Header.Values(codersdk.SessionTokenHeader) + assert.Len(t, values, 1, "expected exactly one session token header value") httpapi.Write(ctx, w, http.StatusOK, codersdk.User{ ReducedUser: codersdk.ReducedUser{ MinimalUser: codersdk.MinimalUser{ @@ -101,6 +103,8 @@ func TestClient_WorkspaceUpdates(t *testing.T) { user <- struct{}{} case "/api/v2/workspaceagents/connection": + values := r.Header.Values(codersdk.SessionTokenHeader) + assert.Len(t, values, 1, "expected exactly one session token header value") httpapi.Write(ctx, w, http.StatusOK, tc.agentConnectionInfo) connInfo <- struct{}{} @@ -109,6 +113,9 @@ func TestClient_WorkspaceUpdates(t *testing.T) { cVer := r.URL.Query().Get("version") assert.Equal(t, "2.3", cVer) + values := r.Header.Values(codersdk.SessionTokenHeader) + assert.Len(t, values, 1, "expected exactly one session token header value") + sws, err := websocket.Accept(w, r, nil) if !assert.NoError(t, err) { return