From 082ab08e0b151a2de6bc1d307b4d99b0df74db5d Mon Sep 17 00:00:00 2001 From: Yaowei Zheng Date: Thu, 6 Aug 2026 20:36:50 +0800 Subject: [PATCH] feat(desktop,server,web): app icons, completion notifications, single-user mode, bundled penguin CLI (#226) Co-authored-by: Claude Fable 5 --- packages/desktop/build/icon.png | Bin 0 -> 112289 bytes packages/desktop/build/icons/128x128.png | Bin 0 -> 7918 bytes packages/desktop/build/icons/256x256.png | Bin 0 -> 18092 bytes packages/desktop/build/icons/512x512.png | Bin 0 -> 43393 bytes .../desktop/build/linux/after-install.tpl | 69 ++++++ packages/desktop/build/linux/after-remove.tpl | 36 +++ packages/desktop/electron-builder.yml | 18 ++ packages/desktop/package.json | 1 + packages/desktop/scripts/render-icon.mjs | 72 ++++++ packages/desktop/scripts/stage.mjs | 51 ++++- packages/desktop/src/app-icon.ts | 27 +++ packages/desktop/src/cli-install.ts | 212 ++++++++++++++++++ packages/desktop/src/launcher.ts | 180 +++++++++++++++ packages/desktop/src/main.ts | 29 ++- packages/desktop/src/menu.ts | 54 +++++ packages/desktop/test/app-icon.test.ts | 37 +++ packages/desktop/test/launcher.test.ts | 162 +++++++++++++ packages/desktop/tsup.config.ts | 4 +- packages/docs/content/server-api.en.md | 4 +- packages/docs/content/server-api.zh.md | 4 +- packages/server/src/http/routes/admin.ts | 5 +- packages/server/src/http/routes/desktop.ts | 32 ++- packages/server/src/http/routes/members.ts | 4 + packages/server/test/desktop.test.ts | 74 +++++- .../web/src/components/layout/app-layout.tsx | 4 + .../src/components/layout/project-dialogs.tsx | 163 +++++++------- .../web/src/components/layout/sidebar.tsx | 6 +- .../src/features/admin/admin-users-page.tsx | 12 +- packages/web/src/lib/completion-notify.ts | 75 +++++++ packages/web/src/lib/strings-en.ts | 8 + packages/web/src/lib/strings.ts | 8 + .../src/state/use-completion-notifications.ts | 68 ++++++ packages/web/test/completion-notify.test.ts | 82 +++++++ pnpm-lock.yaml | 3 + 34 files changed, 1404 insertions(+), 100 deletions(-) create mode 100644 packages/desktop/build/icon.png create mode 100644 packages/desktop/build/icons/128x128.png create mode 100644 packages/desktop/build/icons/256x256.png create mode 100644 packages/desktop/build/icons/512x512.png create mode 100644 packages/desktop/build/linux/after-install.tpl create mode 100644 packages/desktop/build/linux/after-remove.tpl create mode 100644 packages/desktop/scripts/render-icon.mjs create mode 100644 packages/desktop/src/app-icon.ts create mode 100644 packages/desktop/src/cli-install.ts create mode 100644 packages/desktop/src/launcher.ts create mode 100644 packages/desktop/src/menu.ts create mode 100644 packages/desktop/test/app-icon.test.ts create mode 100644 packages/desktop/test/launcher.test.ts create mode 100644 packages/web/src/lib/completion-notify.ts create mode 100644 packages/web/src/state/use-completion-notifications.ts create mode 100644 packages/web/test/completion-notify.test.ts diff --git a/packages/desktop/build/icon.png b/packages/desktop/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..90beb5fc8f9033e6575f22b55121267991693a58 GIT binary patch literal 112289 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 K(eqh6dj2C=^Q<`~ z%(=BSPM*vdF}Qb}o&cDEsJ1RcBD%r44VaPc?uPl2*b0f}&0<*$g~$149&0udRK9w4 zGAAqMqg2rm@6E}e)gJAPHq}<{$(AnB;g2{|^!Em2^}~_4fu8IKUja4^a|R71sZ4ch zd?4Xf-*&CoX_1lS*HfJd<+gvdgPzal3ChhTjSt;gVymqHkA998DAS#WVjNhOZYj2vCn{dPGTb=~LenY^)yL45YDnboa3@;l@H02sl_x;GWbC`rMKSns<1^-RpR{(X-X7X} z>>KL995U&eto9lE>g^-0$wILtmXOQh7x?v`ozTz8pCeMw5XM>Gq=W{KX`J*T3`?|p z!^4KJLyFDAavRd(ZH*dmdo(D*w7$Nd+IM^YgGoOY(Bnc|(e-&OdtuWZ>~nl*CasTkWRU}-eIK=P-he&WR&GS2I@4qdH|R!X z)F3?X0ux5kGKAWXm>DPmj9Ic_=?nKjvi6oc8{KMulX`1Kypmd|2(^x)9TlZkh@gBz z1T*)TH)^xKKP`y=Cxnr)V`!h}{;x<@sf$=99?dV3K@7hZ3>csrO9Io9tpX-tR5}h9 z#wabzrV~uA*E`vTuYoFAf$}>N=$7JfMHer)_ANqK;29hOD((q26+gL1Fpa8 z``X>!PA6i?@y{|$#HfMiNmUz>8|LfS>ecju91$>gvbQMle0+v90R4FGX#H}<) zNjcnbX9t3Wojm*Tlmb}p&^^Y|{lUo2ykN!5ZUAr6mph4chjLS9jYSDoZ-Mek7OEwF zK~?exi+*3u%Uz#8fqmCr?4XJUdbmMR;kn7gb95<+B0`t2K+SJvVdgw70GIIQnPHZ6 zzte}Bl~6XWf7^$NJ7CLiSuFo^wjuFR_j_?ar(j-Si!&_fh>Zjr{Q0I|EvYK5yh{pp zuTj*?Yj5!B{nN<`9{1zm^&F<+ddqT08Y(x4@nD?HBV#gO_lVy$aX-jJ|CcB@Ep$O* zp?EUoG#BG(kMeitQyP?lI)>8|E^Ebkpe5jQgs&3wgU|Nv4;E+)b=sz#%c+b8XxOo_ z6s-ehT@%2G^T)JJ4tg(`BQ#P1bE01_+q&{Rsl8P4(o1wyicKH}@znyXN=E6(Q~&HeChF+SA~^e{H8;XnZgs1Dw0Y z>qjZY?Ifk-+4YJH`nJkY-O6B$r55+A5KLF1mf(1$oBUL-(l9$!q%mO|8U7%(j`MD% zs-}xe@COj!w~uBE#9yVWnfK5$20?HJ43OC$&U!yqxtECa7fHRjx80TSyA4ghzp|aR zVSP{rR~c+AM86pd z$l%z2Q{zcEQ|ff9N29^}b=?rv+?L!-psW$LWcM(WE~%&49b(fpZ$9}1|N2f%F6Y|N z+j1zxAdq7_tkxaxPpf9kY`_0{6)T9)(~H2@7xBRt{$U9fqb>#J+4$vdBcKn{{OW|3 zp2n7ZjTPk8c!#wzXGLsu;1h=YNR;5l2=k2Ar_2ss4U7-3_y}9)6Ih~^%yPJ*8zk74WQ&$)u=294+{f9AHxcGSuzJnN4AOyOb(j zh@`*qc%zoY2zD*qVeqZkntnbxIl9?CUKOsb%rGO9YbJ%zVcwm8sFLh(e|l|DqC+IbBXo9p^VRU^V>T-~_ z`L8Xy061Wo0J_|}l{+He@9uGiQ|B#~H3=69H-uD81B8Q$!`N3Z=9c~emvLET%vAX6 zu<|tMsJ0zrU_)U z@~?v=m3#O{0wB(m9vZN4;?`M~r(;uo!}V=$({RO-Y4U5_+G#p}-?f%_mL4_M{a>p5 zca1X*U_IeYX6Q>}>;71EO~UhKz0of3y*kd7kRWD*A1U+wIN2%p2-w94hvTtKD_?+` zx)EFZMH#yrCZK4gf21o4^y5+UvXmASl@jet&1&+_rW{P0i0UYY!|4H;vkBE0xFz}G zMs66Zj3#hadFL$VJxSU&Eq-zqB#^Vd{1Hu)G;bzv-fc9MKN^tjEF4(YTeG4Qx>sJEJ!N-KF}nMsZr5lQ}#FpQ&Lf)(8eSaF83MDK;iR zxO%NsB0?Avaz9byXK{inhp{2d4(b~>-W(JocO5Qk z-~P#Hni6VN`}mVRtzkfIj>Q7UcFNaTET)V*WS{cJxr5?YpNK1e;ztQmx5#q%X5DaX zZSecs3l`cSzN_1tupvVZRIoAh)Ja{)+5w_Fje<>NM@&3H@ zl>prGdTR!5(5F2TG}<_ondvEL-n?P}mg!5cp6W;qHznY~XS~E5gJ7JA0ktHsN#nvN zU&Fl$x#hal(3+*#Z+3*sG&QEv^?ENouN7r3am_j65jzXF#5Mut^*jGMMfYuMF10K` z0`mOR!BhvlEZ@?AiEWRbo{^89?KIC-$@GGY_usjrLKG0SN`iQO9;n@Lj*4RttKA+)Ym)!u$9r3-)KljQ1; zkJD~b#k&E{dVXsQTL-RM3{UA<^mQlPcca%S-#tp|{xXs^Y(#M;XHb7bCg^te*?TX( zpxUcD<5t&TPkHCphz#U8&(#EOrrEcYm73dMd3G@)K}Rd+vShqJ3qcUq=^+&j*zSP! zeKA23!*-YR+u=c6!3BKTh!6?eBh`*BpS>c906C(cy|d)%4X^X7|0vpE6OT1$aV2Oa zkseJJa77#jed;jT$c0VtMJAj#3AvFW9G+GVmY?QnxsBb-X-~-m-HM*boi`~khQ2i^vA)J z(Q^n1-LZj?gafsQ-yk_f#*iFm>fsn{#jL8=Mmf|XsgUqOOLjUf1!r@#m>=HQGDOhw zu2*$sU)dRB)cjVNa(>?casEIc|M;gn2-b@BQ?mDX#Y@rX)3@H*w-mWzwG6Wle}}YO zT|D|}4@23*)dcF-VfE?`N=;;z^Y#R!datP%+Gee+)_xVYRxLvOr{(pUUx%nrC0llA zb7|P;I);@3>mn$7;){_fuUOCO)r-aURl1t*Nnzha9Re=-W6LZ%eAdBH!C zd9h63Q6fukb@iE0$LYhle7{+H^lj+lNJ>$7Kyk@ok3@w_&-kA|8Edv2=0ZZO!C2i7G+J;(W^IY zyh3mU>K>()Z5{Zhv8&rfaNjTt5vX7OW4hBvhfZJYJp_E`PBk4F$lT=LrQf_Uf8+nK=#P{tGH zXzo>ZZg#XFCfh>nHKi@<&TbY_d~h>hs%QdNZ+kFF&8d8fxkI>Y@u(xd*9Pk$hU>&+ zneI)NnU73N2Ujlj=;)K*I95zElTjBkbQV?Cy0U7~Hb8k|q`3XYC?mq|hhS`KcswH%L?XC6f>S_2+tlTbXE-xvGoE0DP18LKV zJgAmUqF~_S70#~c_eG4~QQ>F+<#}zJ&2v-Rl z)7)QqHLEGVKbS>!FOKhk-T`k4n!Z^haD`#?G8uPwVHIY9UweM!0{Lw~4@n9S!Pztr z%tRJScCt${U2UlW%a{%XU0w|dD@?aKkF8$Xe%l+lTYbI5=RCnAqd_E8_E#WQlya;1 zGI7;=r}~8!7i`_?$fx7t;dG&MLMBoUPH`0I7VNcgLAQ{jJz#wa@NJJNuYt`60Vbbq z@=*EnpRhJN>pIxp#$Eal-K>j`pQp0kHM#=1S-G)j>x(0EuQsBzbL~A*_S`z8yS_P* z=x2Nm2W}hM(b#zWeqO#urMqQ*)W8pn|F4V|R4L_Qr|GI}z-SQpg}A+p+V8CSJZ{9o z>YVevQEvT~4-oxvX{F;8TN1-=>;9LM{7|3y^@lVWYVQ@`JkOwpg&FeZ#eBujTG!yP zqT#N=5h>X>ej{2W7{&ZgR-?^Kv!J&_ZV2a1P<&rqixV!e+3WU+-HXg7nWE}R8g?~D z6<@7)L>iE;k5L%n69hzTGyg{Vx0Vy#1GCZM-&?rS@*}w>vsF2AIyQu~C_6LKGNbTI znOGlO824I|t!+7JI>2_nvTa&%#Z`{np{RL<+}7oho84}JdbW3cUOxR?*urrOm}aZx zFMfy`0~;i_=V;}cPF1LD(&Zy_VyGvJes3YgdTA~nhg|RY!WAhlid@m&>M{t4yG-n? zHuKq^G7azRRA(xD7a&xAv&tbPZ68sZVh09B_Iv9^aHIrzV`Mgk@+7IO*J?0$Q{wBB zB%i>UUN1q0g_PD??dqT#N52k>^U>%u$Ym+;PsfTY5NU z3yF}1e8K<|q~{tv#C-tN_)18HO9H#3%apvgp+n{nXcB?}@okp{OJ1^G^RV6lS6W9B zxpK0CyC;_s9QkF@96Y?++JV`zwRpd`(4XaZ(Qw~E46q&;qsm01wxzB z3JOJLAd`L;l?UNZ3_UZ47khK>51l9MiMt*kRz+9b%;7p6V__BZ;QIT_#3GT~a`Vpp zEE6tKwE*gtugl564cBH$gWm3M=isf`j&6##j$5U=$A}-%XXH*u!NYiJ6x+P-l6(Hj zP1nrNU*cEv45;Zhk1hrm?7To(w=p!&!!2cPq_tPrj z`$@~kpaFUdujq})vOSWE*GiCJ?7heE@<~VR-^M4dS6t#Ca`_*jg(Q~q0g%=gVg4I7 zM_-U1$Gk7UnTem8f8H^h;#ww9wW0+je(DXu3q29gm{SS+`wd{t_o1hggPg2Kr|o1(n^*yyWCsKYJPxwj|P=gF^iMHp8kO3RMCElDiZa#0~-CmSsGYqLi|ky1oq=c=x<@y zsEy}GPW-moX~8<`(YT z@COsbXMOOtu>Kwk=JQ8a_%qcy2CkbYJHg+}LflTBhP?M5WP%P)VTe}u(k#v|V$YMs zzB9dFWBuk-fcvxk1VQ(L7+UMCJry)#Gc6}a$dk05%5K5Mo0%}lj@{C98prj$E0Ff> z$VLwLoiZHE*!Ua{JvySgjhP{>xR2_7SPT|!Xjt)0J_4U<@qFBZquD42@_(21+DoITElApsEY`2<)cskW>w_1z%L|`a5K}5&4wrIZLAid-sv6nTUf1{?OeCtz` z|3t@W_CCM$5m;ZpV2b-HyVB|_z$4sV46K*0uMa05HG;dk1rt7u@og`VS<$=7g3c(S z%+(0|%?uaWEenSGjDf3B?-zSjsWc;`_#GppzY!1D8zLgZBCSq-{&SgPVvQ;O9)NvH z=XpjK=0_>9U0e6n9;%tC=aO4_wCI#(9^&8#H*1Z{mbu#A|?O}!ueC7JyKhCbyn445&<1w^0(p@Q2 zU+=%EsQ@kQcL=|UY^=RvcH=!Nyrq37?n#)g2ic)wVu;|Aar#xTS~A|Z=zFD1%>QNq z@3=GTQ06+Tfe6YGzZwinx27b1k!m#&F;bg;_}!46T41D6&vJ;o)7YE z_Z5zEFT3_>{#)mS!p0-G3m58TU>pQh=0TSl#^OUZb7fjt+V1@>knkNs!Mr$y22#x;x*@M2^WY{&G-sj<%HX& zOTt)}3#_9qUO3NX^rv6ZaPdTr-&cAZcI0dOdd2Y5%D2>XHmq&NeR$iSp&Fm9jJ=vQ z%j~*tjCqRY(zlkqBTJ|J0Slemi8ArFaPI@3e(M942eH(-q$^67sH_&a%jTM%m9mf( zXJd%uG{1%Jmjvo^Qtjdp)41ji&mwXM+I`tx|K~ORz21nzq;P8}L(Y@D#>5V-24;gb z!Y8@i!aJSlO~`Ld3IDwB;bbGi2trDP8d(#*2-+SBhx`JR$D8p?soi>YeNSQyau! z)k$m zw^$~m{`P!**y^hPPT-ez&Lpz-kS1mY?co}(_%{;mcNns)SZ0gpTv{N+#Qv&sWJ$E2b54Km6_N=AQ#w4xAE)=H}jmGkUdD z(!9Zw%t`p};$Yb1pZV4GvX0o^lo4O1Udu|UbXA++r&j}(J30{C@k2|ql`F2)12`u; z1?p644kL~p_@WKbX;o(k4Fx-XNm(gc` zMBB+67c18PN7R?cL;ZdKzw9APA(gdvLcCE?vd+-EgzQ_{MvEj{_H`CiDp?|lFe1G{O*5qU-P>6-1|EB+~+y>oO@E2`p4(b$C9--z3lEg zz5P5NO03GHyB z*GZ(+0YAYWJs`z7oU|0oZ7UtRNaD#@;i&gIz*)TfU^zFF(4Gz8`NEmKX&ot9A+$T| z6sK#u$a=&+7B(zlp>rdlVj+K&L=AN*7KgcJ?@(j+&nuI|jRGTV;f$*^y zieuRR3CFOp6TfCuC&qBPb+*)Qj@kj4WoEmfT9p_xRBCOdxqL?>_&Jb^ea`_5kIy1; z@tf*xtTw*b+O0-M+s;sBLRV3)@_E%z_J<{F=}Ht=jr00;MQTdZ2C~6JT9!9Dd!>`m zNt0TAzjnH{d~wfPi~8`v?1~iCHGRL!VtZSLQR+Ac>l=YO+|@q$EqiFzM8z!YMFFgT zg+P%hb*(zFLrqz7d9HIYD!ABiDU_t$3?d9%D8yx@8iKoE+m_rZzy0aldepLK`x!7Z zpCkx)OW!#X{9TkO&F43J^b4(v%IB~9Cr|&XOV>xbFq*2nmU?oEem%J)G;%1eTa$K4 z134op;Opmrta^Xcj_l*b@-v%d&E0>?1tPxMeNzwVYc(>ht%f{6@dT~hx1V2osHl%q zsho)31PW`9pc?yfB443`mY_Uo%z;%#bfwpUJY`B+$6Dhz)B*^wXA%QKp`x7ozcx$) z@g;Vxru^*RFz4B}uuLp=3y+MDSEL{2itvQLfHsuTGsdFz83DdrO^L((I4* z-;Ye_p!MeDbL}i;qFBN#)iL~-##UjGfm|IYdC9GE(Q&pO< zdYt2CvZMoj9XvH;6YAJ=jky*Fy=YJOsk1a^7sae_h&O+_*~SW0ZFEYfcM!60M#Q!1 z`3v~+_E}qL#yyJDwN4Vbf z4syp9(5^UKm#9q7bQmuu>o4C`fI?_Z=c$1n-D8m!-H>~Uf@j%SbdIHm>2U%Q#Z2#Q zla*02_f7DgZjX1|TGfx|?-~Wtdi93}b1$&9qOR}&N=?jI$S8UwE8p7ZBZ-&yU3bxf zhXX~;;gzxu5F@y>SkO^qM@yS3o6<_gK8D67=>+bbOq*A{cNJ}@#`iduI8*cx9ZuJ$ z_OqBCE2e>Z@C96XAGs{*I$khdiQrc||5hZ8ZjE=HzAhp=$oBRp<008A1yJ%mYtg>W z*jP=GTV7eM6We>bUiUO*7E>~RcU{CqihLTrwWH%RAu8p~PLEyc7T{oT?FbEhe{oVn zc#4=uii?YVa02V`ieKf<)YX*@qi|{~Z_ZwhEC78d2;?ya(-9xm9Iz*p9v3K$cBbpK z)7Dp+{zj;5+D6$oLI+K@KwY*VHJ9kkHcpHG*7e-9WFzjA`(oXor)62|k{%+cX=2Cf z^5w<|E?qcn;VwQApg}uiF1SFLd*Z_f6k6u7L8BsTUy`+13=3ED1`%0p;qqb2i0pB` z2S&H^l?tpx7dw4UDPq;6Y!9Em?n-k@Gw;4WC8_%Is3@kSByA)ov9XHa{ivp3zQLXd z%B!J^jbLtGO4Rv)j~BmhZiT7AnU(0cG6b`MR$sNV<3YfbFaFHQujg4W;MhawhX;~J z%Ni30pr1My|=rWdPbKpgH|PGs?a2*~z7g zr>a{SBT}q8xz>-SI1>#lwK}lQTIE?gu=)_Fh%!aW_H#+FJZI7TwwGG7j6oEOFI6}| zY2q11R=u`E2(4o^>Vha*b)mo-ecvC++7WB6L_BC;yNcb+onsU&a~{Bwc<`euw#%mF z>dys=gLQ4~sW#-LDL)FlDxE$s{~sZ7($nf-f!TN5@r`M6FYm;vcF*K*rOs;p-=#33 zhm+YJxJ!qF%Xnj9`$~d@5-q$qxG4jTGmr9BFq4$wrWjX1I=pE;W2Qbn9OX#rCwKW} zO*^KS%nM(*(gE?^OI})TnL+*kScqr(IJ2~E7;)k0UC3FodX4|Qyw6Of9f$)3$WFE1{YL`BK{y{l zNy9rbS52Dh*4>*)#DL}|`tTO+#eD;K`FgBU8gsp6WLrC`#qrn9lD?nB_emUWCUWC# z^9Mp%^WN0Ssl5x6&znDZeFe3P!u1&VDCEd;X59N$0d&Psf~&r19c54W6gBjpaWghV6P=P_^z5{`K-H`|ut zl)|`&4ucNOu@<>uVK<}J(1TqeLjT@q z_}AoMliOhqd8>*sId1QPS-Vupu;BKtGCShhMe~?-!H(&D-SfA4uu_x0f;1iUx$t)% z#%J{pk~R=Bx{(xjTE~tuMK7vJuy{J3FGP4lC|lhQ z+0xX)&n$Jq8i+fS*ruEAWX8DcSvJg{D5OLbV=c6@58JtV9j^CvlX6d!Lt%)aLvAT-z6B=DN+sE43+B!--~VR|81>YR+E@LJ1GP6_pA4q= z^M9d?F@~RAJX8@dy!zl-baT_KcBNF=>&K+4M#r~7Z*8v-K8+gn+{UyhkES20Uo`x| zrJ8xMZM~!2Nu!pHweNrXOFadCVtnwKbi@hARzjxHyFro|{OzNSbN^|R&!}ZhBCoL+ z3PM0;LKSc@NOLA2&Q*H*ThO(6TPkQx$cvR$n<_3R`uPzgLy`J{wJ620A6a^`uH6vl z8eF-*?hfdeZxs%=NJ@{@C^#n(S3bVoMza8MDY7_c-FZ#31>YQTm-d$LvBlGvsev7p z@>O(1%l0ZOALp_75eOemPZC$hhUV*w|EkGPJVajSYa#X=x7^n1k`#(b+{7s(1*Zhl z)|V=~b1u7C*3aoEu6iq~n6FTZs-!e-;fA{qm1sRL87cU}FYSAqOveXX1|Pa0mpIx% zb@fZBx~o%_y~G9YA!^uU#m(3Y-czFT9qYSqH2wO)D~x`A68N>9AaNlBX_8V{zOw@6 zaQRpxB%NpA6Z^AedVO+e#`jz7&$?!pjbHkD(&z3}JQk2DzA0abSvzx3;=<48aSuTy z!4;BhKj8N&_)Y$rbixF+{Hz@lzxGhyt^eAiG=u~_>8KI_&3*wKomHiE?@nkfrurx6 z*$R8r8%HaCe-^SL+rc0E!@J_x#YnPfAbwUO!+h2q(ej$tF+Qz>-&oic4+?!z)84_g zMSsl3BEFuCt0|=U+$P5&}C@}sq$HltV2SdmdXFFQ? ze{^9`7xwTtrzq^r%67F=$3&SIQb$V$>NNDe?kIh;*4|eE^Ts{vPyz2KIM>>YwYKgQ zV5Tl*&|Ueg;tWsMN#D`;^-(f2-C7Td-f$7x%r{SHHc#}CAp6H3S-oyEjhy~u^e7EB zR6F^){}=c5+IL8Dpp_R^fKCWk{VDZcsKSTgr_(j4leArJ5ty#RhGL83Yz4@TwA#)| zJ)0FZu204wpZS`$y+ZTO-M8&i7o+9AyVPpIin`3z_!^P*pr>KbU{=B4e$Bi=Lu~Fp zoyl09kmbSj`Q{k+;>t|gtE)*>Rse!VH`jru#U}huJT;dzrgBcO3!o{NWVpK$Q z8wnO3+R|CHgj7x6_9o|*P-U_~+NZ4ER1;$!P2O4gM+3&sR?~<9*3cE61Lvf8iw9oF zrXIW}apV-+TorF2uM`l199T>2Kdm4s!p*4Kle#E|$jx!RuEO~B7Th`p&@w`w>lw=u zj|E=!Xn!4?OiD4&y3Ner;{@)3raF!>>aIlf{mJizox?wPN959!OL;YUlcm#@7yK(^ z@^k>AHs?Sa7G1PJD<0vU4W6qDP-b)nacYKP%HKK;v~4`N$}?`|u4@yWsEng+=-tp{ zuHrPJ(y6;@uDg?7LH#^TgGqATb%RD1uA&+gYD4=k!3bjv#?$0XcxX zq5$pm(QRx0;@tq{V*j7kpN>Go1w&F!DTZ>3&P}!(pl!k(x=pH5bt}Xctxw_NB?OAO zD8`XtyFJleU157+wdX*#H^N~2KG=-AoC&pH{EB1c-n_(9;>uie!i_@UOk~Y%GS>dg zov4>nmV4n7vq+B~nv-Hjp1H!6RqC~XE911?ALNq#U3uf&0ZE!QQIS?(IF0)##^G=@I!c zh{K|3F=y+u0rTX1Qr6-b(GcZo^E2bWje3`>V3N!K1Zg@YD{TxZuB69nErUx{)) zF*5t2Z%qHFN>*tJmW(Mbz_QYN*9Lw_kM(9aI>Ct}DqQ6Bp@?fsOf7^`l+34^oFm zo16A_yf07Gw-r3Tx>lyhI3uq!Ut4Z!Lx9OmA4#E-suFhMKH zzMMO9u|^&m#q#Ab-TRjvpJy1ghq|>S&OL?1W<)GKT6%+G-P>?iVge0!2WtyUaolv! z0cLsJ;gSCRec_d#v1WZ(OYQK)0s|j*p!z7ddZ%9Sm=6S6$caUr*3)zp6SG%4UGYk( zbX&mmHiqb2--S&d<(+k?Z+RCZ#S_=F9VF}u7l_W0c1W04kPe1U$Flt3WFsn(TxQpA z&+NVphGngmkQE@__J{V*7>LxoJf5)7Pu;Dkb&#pp0=g$v;r%mkUlQIE=VOnZ> z_7`+LwyvrzP>0XCla@!X;kNGNq)EHOV0R%w%fiiTQsNH{ur4(+(53NOW+XZZgogV# z%D+Agc!mJcLaz@zubf3*XWYfI0mo6lrEib=(u#tGeb2U9IajjCPb~vvxO0w3*~MkD z(!`)o1zK=|$0zcJ&ZNSkJP%QuSE=_%atn5WnRbk4Gn0LM-n<}sE@Y41(HkQFUkA>A z#E?Pun0XsPZO1#TrLveVJ~&#+GUZ_#5?{@jJhJL zdLqdM)jr=ku08X8xD)jwY0XZzS9WRlV!74I=tc(4E;$fV^c;_X$o9_1LMEy8U($O z;6`*Hn^MF>qMZs%gDk<$m-Pm*KTMmv<=GQ4`N}=>7p#PwrR}(chCi0K$h;mgW#utd zSQ`7`6>>%mr+VrM}D-sS?9CqcKh^#qwlYh)PyI#=u!aJlAhB0MB{UuHID zuVzq$#dtEXkoV`E*ubaWwGd{062?0prWwL2$h`n2pY zh!R2bsx&r8CR~i1CjzyiVY>_>f*QkQRtp1Q8;DrqQsq#zW%J3mtBj0?$syhcm6=p zy+sQS_Up*SajZ>%bkfE~o```HGYB!TN!@hCSEHZL& z-l2LD4@ci3KNYO%fSxK#GQT_x;Vcmz;GUEmVCgydp*sT6$sggn5-`2Dd|a;~sKhnQ zC%KmUWc3#b-`W@VWh&!;BlZ51+@5VSIp&#~h6+C=@~ysTlaD&!wvu}&BfdrF*-eJ2 z&$@!GeAA)3T_GFuR`^C@Sn)d-Jo8A8RC!4Y#aFBwm)~^0^3#B`M7F+p`jAD5T z8i9=p)(yqg!#pDXYu9EoXgK-aON!e!xVf?tX2SkGqY8I3AGSgh=;(C!ph7{Y@l-5l{G8qsCH;|Evb-RGFbT%WihNo*K}4DLC1@2tXYO& z>SZ}}TLmS@n|sm!lUd+h^T8SihDK;HUmvcy)~aEpGoY2#$B%~`B0)kPKMws1 z-n+{o%nNAXKzOUM`B_}7n&4RWz(aW`zbmAcKX={)F49d5_^;^Hw7OM-dBFfo$qRF zJOZt}08L+9cbJ0JR)I=N7~0XTB8t{Fb3`wwgK*xRD96UpMhpgVxEc@LqUB#w;LZo5 zKq@XGuR!lQc*`nxwZYx0rN-m`(N1fRB;Qi!S6J7+)nFp zLWk;8>1!p@>47aYB@Ftk`$Gh|8{UU5c-+6u;=LHtgaUE z>3^L~KRZyo4?hZXX2KO9GYF#W^Ymz0!l++6?~69} zeD0LN+O^+|pBqgJhnSROW+lnlZjCC%bvg#2T48EDg8{LTl$8a8P1@8Eg_CnMmG9xM zEjvwJNia&}GXj=`P|_|7u#|RH%NKuXtF;^&yGv@Jhv9o;&uOu1j^|F%OuyO4Cl1im z5REA2t?mzsW7zredwvdUxJs9!vUe?>E|RbtiWchf2LRN^(pXN7@%fT(O83at21rEv zjKE%1HruXV&VMgX#)$>BJM{Eh@eGqikvGHZ(Q#7`v`PqpfHO#BQs z4>XRKWtqnWq?~%7%zRWAE4y2_0s_)6twd|%$4x!Fn&ZL>!BM!PDe-e@;k^{SI~^-y z*en%A9#&Bz8yTVfDXBpQzors;;7%+O`)&YDM&Lt_Uc@8~Bd|NZGDd`= zF63QF+Yr_N3SI@pBJ*|FUe=?3j@i_|&z-tC7j)*e*WR16H{y>-%jcF?q|qDE>cb2V zQErfDBp!+(4}uPzD%twI{F*vg831LjbP7Oy2m@^iq6c+yZQDX(jn&E%rb3lRwq_{qhJm#n`?1NF zWz`*lD>i9#Su(@4m*N+X6G~em@?>byd@E0_pSe21r`XN$UCt$Cg&jXxkb|kJHB?-7 z>uE^`1*m~L_T72eNdwtX6;z(TYzr$a(}+|*_SO%vg66C~r{lnyX^-}e)aKhG!2UgG zc{0vKp%+XLZ7|>|zbvC^4FEy>pkx|uFf%xheo)9I(7aUe>kRG-vd&wZ!(=18_@~6g*Vkg&n1rdK7k>#IFnO3zc*qTv>>LzAmUph{1L70!P!JNix}(Mc}%#;fL6 zf*@1;<1-@<6$wo%+A^|Z+AK!M8><4q@uz}-#wbGFqtK^AeM0M=O#aexM>d!N?S$;G z^GR7vUd!=gXYOx>Fg9S_BRoAhr8h5S;*7#KaV+EZJsWi~(rV!T4>2hhulMYOxqI72eBe@TBN=+J~G=+a^gOB6Yvp z_DpM$jTKPm(&!8PcWkvn9d;e=sv>K@wC+rqM7l0T2WTtPyJ`Twa12?!chVwQv9K$P z5dgy2IIQS`@`Dt%?M%QoK(@(@*wAGC1vM?Bg?yaoQf&#<^VVSPM!6MDv+M20kox%V zVr`*aPu>m~2VP5KL06tr7O|$?Z^F3&DAxxdcSV1D?-J=%xnF9rZOdTVe3#8=TB34s z&{DRF+hUp8nmR$>(j(_VWyItobc22Sw0`j&ff&#X)N`K&diCYrSAbF(ilrxJ<&22Z zF=(ZsdF5ZZpYLN+@>i`O!+2QhPfc$D+|nq4q1nxL(s zBEAsYZF7fj$}z-eUEx%30AEjz?h0g9wPDNY=ed=7A19kt=8YcyzQU=vfb-M#w0c?D z`6j072(%{)?!L6H)7Dfu{U7pbne1u4(KbuO&YGG9lJFaBnbhKdnk0H8>)3aghDo?OtOg zIkILGJWhY7H~qi^F*DV!vK9h2O{hiq-t=8Ismg){r#cJUX-pcEEAmZ~VvQ&OT|3E! znhD%;5839Zd-9C|O4LnBmiJb+>q*%{>rcI9FJ?VPj&9jx1LIn> z;t5{i1zX|{K@%$?OKW1tEjolLK`1?vh_qD6B6HNm@1cvJH~aQZFrinMISL_L2^`bC zezeZpl9hfcS{h*$aVJAh0G3NT!oOS%SGerMQ0RW)ih(HaaRAi3npnO^pC@DwaFVzi zFAm7)Yr^8wn{s;*8*dsGd&H|jPtY?@l)rN(I=R~4?C?6S6;=1!wy3@H+~%`Q9caMT zYzbGv-E*BC6SOZC>P3KO;xI9>V9Z=umkFYH0IliLN}}BdYFSV=)d~U6%I%>Bo zbAb&Zx@?qw$e!rX_iU^T{U0ULl%qcvSRisAAsIxY4%xp7f5F=rS zs0tE8anT6pVN5z&qm7mL4y9VT>vnnGUpd&XgbCQ- zF>jyvVcR#EHS3uFXhTVdZKBwI-Ofi9k*w!rSTpIc!nsw|TUGf*R{IoeCX@ZqwKzj_ z9)q#dvme=JJ(L(NlWf9vdpkXclkb?NY!?|3${BYzPm+8lL%y;x`3)qOja29*ntaPI z@=8IIw@(ea78Dtfj^hCIWOt^%Yp;q545LT8opfzm8!^ELR80(&n4HTFF* z$t!GIv@m&d)|RTQ!)E(F6`F7UNYEFSStWy&Df(nxaPi;lQ>{1l)oSEX;~1~_7DkN) zFFa0wuL4 z5ER5#E`GBQU;h}C?sUSz^F(u^64OV^XV(t>?JLp1AqpvQjZp>#komkcFRyx2d>QE&bu22x$*y9h^{hCq*z^^ z;rw=U%c}(c%P_ouCO#={l&c575EhV~HQzOpgw}r5;zA5GSUs!jF0CF6>DlS3Z=q{v z(Ly&hud&x9iMNOw&=Fik{;Q1q=HeS~5#UmH?PcKjTo=d}O{Qk&8-3~q zd4=z2v&{|E$ndlpZ>@`)wuK(0Q+3|M6XsVYdGf)mMsxFsvrGP65OFDxCSD?=OU_`= zUkukGO4lL7ObqX!)0>-@^wqFU+%YlM$uiA;#(kj0qrXLXy)SkYuIGIHaQCNhC);); zF%8=LZ@P2>2g3s<)_3OpV`HPuwG1=IJ29Xhgi8)#15iy(T@m{8d1;%^L)gs-^ zkL}N3q)oSQz#ao}vxfANm*`{1I^CGz#_CMxX#V`)IgPf>+wY+e&n2`@H$_1N0EQ~R zMS09fGYbagfE;w=*}zQ=*m~{&x^#?Y z-rjuO%D=vhZ z45-Yk4qg-T+R{{cv-AiG3^d7_{!4;3Q=nWphzgPn4k^24np6LJC0%%Qk)WMP!)3lQP0*8(AdMaX| zhtN^7X)1;>&9;MX>$`5iI#(IPJ$%VprUomNZ%GPxv`TIi?N1lkcaCZyi!k_b(dna9P%esoluAY5@wg68Wt7%_v zQoB6#KSqD8oma4$l(+#?YG6oA2F_N;_mWVA<}%B8Ha7;Z_f-oFk=9!Cw_}27B6gimUIq z1URDddi5GA-^G;K;`P4k<%}kxoe4QoP_YuKa#=+qdC9r_U7&q*7OfkkXU5Me4UF5E z-7`^QMGqc3l+?Y;BIgU;TYqh}8gK7+&2cBTA`|pJ^S8q-Jg%-%%+24>>Exuyx1up| z(?-!OUodzEaO^!ygMgcYYrq~3ms=BSp=ek6W2s&ZeYis7Li7XMLl(z5=4Qu|Vna^{ zH&xE%NUAx|n_Ej4Ko{(7W8c=I1!X^U6%+p79bCFG(-UQjzuBW$Yv9@6?xYdak#35n33v zZi?Cv!nMVWeIc0dBEM8- z>td>OAMYuP%UzqE zxp7-oO9#r_iAOMRi=*GA9_hAHZ}vr6bo@+Vk`z5m4ZOyK#XZqa9w5vrjRdNxI-89TK)e-}T)>2LUf9sdlRe3ukzfUCbcOR0N`3 z4~$a;(Z1o~A)cNMx)NCegjbbC~x1ZN#lxpZ7tLxqnW&!t?@uzGflCf zQ@?H@qI2MOP@DC$Biwtgl4C{&Em8!XvnBvog1&yEcH*tsTXV$E94Pc6ttrn~3)8vWSpSwvWn*mA-<6Vf_TWI~w@H8>FyArv7=ew5cr&rKVL$zqvW(cAM zQG5GD;C(|#4|}0woI$v*C;c9SzDBTddK-F#QB^v~zh{z?*UwC=85pp$GHl)4D581C zxUH)=$89wzLj{@4^nDRAZ9 zyx=$UPCPdDeLc0Gx}VmDq*txf08^kIv!7H}gY4dRWH%`C(sxu;Yecyw7w>z-u7gXM z_wHJHojgreKtD8eIy7J;pTi=*Ri=)q+W#K3iWt7g&Y2a$FdY(*S=)8x#hFI2-K=`*_Ox8d zu5y(l63-q5BG%%MGlViT%S>*|d#0slg?l-!nyG&;^Vw>*$jJ|{Dkv&Hrg?6nE1To# zJrL6=k0>}XApO^o?vL58Lcy}(vaWZx%8drTKZu?e(ZWr z5fJ^Yezk1(CTW(N_N#8lSIy%%G)O`%m=9VMV9+X8aV=&oti0|Ym?HX_h200HBR7<0~DLuYcuS5l~LrSWN6Vh=CA1 zNB0}1uYj^MS1o)PWJ@>8#athOi_RbneCiPQh}QKC*#o-InWIRbQ7b(tIjvcHdg>HP zgp_W->!*wtTo5n$xl(@C1IM6D4bw`>_sYY}P{iXLX@kO*7zm{>gE|4pI`yCY^Jld^ za{SI~7dniiOZyRDMskC+#{DKLq>jeI*#(UEV=kq42ky73_ z8|K#$I}fiEkX~^AhM&YU=zSrV+o)S%eleku;{ux?mvSc$*|KceTccJGeVk(8Uc`O9 zB{)k%u6XN*08xx*7u1hdx{wraHtW41)UXmcEs$JQLRKKdK3<1I{MxX&ww=8_2W@VE#H%~zfO4C^yr;PD;;=U zud7VL7dISTBpKN(&a>t^r8O&!X^W`bgW@-u_xCz?Z}J!hOeud2WHs;arpt6RGo({H zmRC*HhAK{MfT{)1r#F5S5~;7!!wG0SfgLRiYi2%>%swca&6&KEHbI}h%u1~SUV423 z4RYyIXIiv*yHaJR1Qz*w^raR`{^7N>)aJD`S9+Nw9*|g&DwGr0MBL`9?@&mTDqF*b zzWA2#i*pI=1uFCc03seal+oiNPZ@wFFIfzckgvlbiq^JtP5JKuQgwy%yU;hGH~UR@ z%NQ|yZ(c2c+xyI*aSRv}Qy20395y?qB1*SBRkkHtd-Lj6R)>U6#A_xUba@VDH!b7< z`v|s#^Ff=mXG=g;Zl))}s=}3TG1fX6w#m75E}pLA#c?(N5o^kmGoUPK6XSeSre@=i zOJwK$X~c@v@%q3|F*j3f3@{GG3rlwEKg1AXO3J&%R-L_Tvde`cZluDu4cn38_o;Wx z|NA{_L(zI1t&ZephCM=`1c5#vvKn%#Uz%y~J3zHt+T)(v5E@ropy!mKOF z8)uGItqD)>XY*^^p123HCr}vwY^>!Uwq%!6!ce$#*g{B}DJA0(!-Su%<-;;TQ_D5< zpuR*|bMcGWz!w;`Odqio>`31c(FnLh$-}Qr?%B^w!Sj`Ne8h}VvX~S!7>;tzOco2C z&xCQA9n-uP%2@Wv)PjR{Ij}FG$XD3)V9-0v@GTeua1UkCayvTY2GT-_*HT*7h~4=(P1|2^W`c(uQ|+Qn>246uxz{0j5C$# zEnisrcp`aKRM9r*@SSp8=){3(#(T{DiHE-xUBD6&{z=aUl)}ff?>s>eqhol7&;coc zuMSdIu*-v2v7Aj$<`pch>ShUckH!jFy6A)fEoj;sI=g?q2 zzAeQe?4re??0HIzM^p20GH2{V>9Z;mKBI5{bQLPb3#dgt;??K7J9$r4Pz2RL>#o79 z(fy88-zNR?KLyKw#E6mgq*=ruu*8VS*o_j6fMLJgp7$5lVhP$#ksI|!-5pZIZ`i_% z-o1*Cghjj0w@_H`j?oqo@0+FKisIZnGADv) zmk3GX;D}L=$8OC%J#=?xTDiFiO@g!jD1OIpZKsF_ttt@ut1k6edlHcp!}@NV)Em~M zJHy5C%pPy^+Je9K(#OFsWidTt4L)zc6t#JDm%Zn)K@bymPAf~*%jwOnY6?8-yvK=$9!MMbX6Xu3Cx&1+!WI^iI)a@W|n- z{W_Z3E=`@V*c?K-s@qD`X1-(YZTLUJ*{<=w(Fpm@ZFaQ9Ww3)Q6Wd#+JzvMr@EAF} zxO{fCI6*?QeWj%i4p~>c7f*h)|1YOW0$x%mAThm6Xo=pjCj1!lLo$i{g-1NNeJN@1 z6ORR`_yQ>K4lVf1ZapuMdb;jMsXqI?=SeL-Z^wro{K{l&_vt@P{d|MRz_tw&xbJfr zBKC0-os?)~jJl=tI_VulcKx8`$`YQFg0u1)WDKn@M6zz%~Gl?h^SAu$0i;`;V{_S!@7&@K~H2 zaKZme!b3o#!LkPQK;M4|ZGS=qO==58% zG+kV!Wlk5qDdJ(oFZg>AEvtYnSnj@w5a#5n^3f2F8p@SK=vysguLi|+{W#X3xV{5(NBA3^)luuv}8PgB!&I%$+B3^t5%C1;-g zo}l>#9a^!fRlhFqJo0DzZLVD0{;XD2&5tJzq#T)~L~*9_OV9?WvLK$re#Ujbmy;1| zk5ls7-N=NvH>*Z0g*WWK^8*1105z?zaoq9?4zu@gF*dPhoQa1;k$ zQ)`Iaw)8pH}H2;;gV1llRkxX#ew}fdkutmVp z!f1!}WnM~3gBNx3XGj4+@+z^%eo#P1T+kA6^Tg7sPiMAtX#5tX_u%quXK>y^_Ifk@ z31(Y_jE(bw{?)%50iY$T5182D{u_YzUh7v@Tg~rT1@Yd;FBF!294~5%hwqUWs2qdE z(Y}cq)Ra@yH5l5!kpKBZ;c?^ za%H?`U}|EJB{sak$Zw*+y7ORNaSz?O-~;g5`?GLWsk-=Y)fX()&o(|#Ap_o%UJSPa zZQ!Srk4QY*pDz0D`>tODXHtpHEkozd@jw3tRK9*)&A!hPLe^G6j&imk?nWB^d5|l{ z2?k84g)YW54zRgdaP5PV1uRhIFwid)JG{b)a^Kt+|4Vwa>VX(lvta_L%PfRTlFrePO_p#xvf)t?Ky(#qf|J@HvLt~L8le|Fu|B6t)gW7h9krc3TEIF|tSR)V43q z{aGRaYBQos4p@BcQ?QyhBL(Pm@45e-Zr`e5Rs=We7reM9Ms}>-TP-ub@o$eo!^cJF z7Uw6A3|qPA0RKitu%`n1iGMnVrf0mSPVNdaOB+Ig>x-S{@uTcV<^DYCyAg7qk#jfF zIM|*n2>j6Pcb8||^7`ACdDW+&li-}502f{&KbJZ0pVa^r*Esje_d0v)oqspaH8z5F z5U^;2j)$*&pFBPVc09rU_w~%ulId- zV_Y-X-7>`Wroq)0f9cN~P!^_}lLao0mH|r{^LQp&m?!4vCmrnnU+2w(w--)((waF z>p8!k169)=AUgQ{0stRXm)}R<1-3>9#PMTOu9~)fa1iO7x>X+ zpvh&hb?I+&JmarNzSd$2+pC8}Q4hnbzGZHl4)p){=e1=W`!}=5SL602?bXg89XQ1* zxZ$5Cq!Slj`LxgC?sp2J9ujDpnbZD%sotHo22q|}{QVV9s4!>M&%NaOi~s$3rMhfm zyO`Bmc)4cbcSrL%=Xk+r|38mZets=O`{BXnR=}mw^z;(QV}Ey=++AG}2bR-nHS&ha z^zSh}c=Nw8Ia>68{V0x!*z&810vEpDf|-GEl)>MwghfgaonJp<3We@bP6NC<9|SK< zb}!ET!TvxldDiwW=< zZ}eX}o452_J#y7qGc5< zmPJiLZHKP!07v2&#Cx1f}}vJfcoJN?|z!Wl{H@YFv+qv2B+x% z6h1aiZ%wJ}+WbKU)zvh{4(X5W`y2_X4nx$$EOU zQXlalJv$6)GQQpR8+a}NKRb?ibsO&%eZjxN6K}60XnkepIFkN@RQF{#_{87Njz&?k z)a{-1OcYc!8F|aTr;fe20*Br`Qb0ETB}^@tDdN#AJrj7eZ3=^P#iH5;&_>PMJv(nl*X%~w|jSi*rpNmf$r&?maCjdEuC-xoO!Ehhb#&R z;$J39`V**6=W_k6(1WYcLP4rzrkYm?bBqO3s`}f{<>=fZUtIUgLG9UDUzxs^#Sohh z@Y1&n^x^d@JTa!?wVL))e!mD-#CUHQ(Kg0gs<62P^nI`3S<2pDMeiq}Ll~FIV5#rH z;}&Uqa5|9P1(bC?;Jb?WLoF#if?{vne&Fp^sF*}4ftJc`rhw1Sg2e}=ArwOkAWOlL}_Q*9nU@h=++h#hL9JxbXt zEUv*bp|af6LNX@_Q)}$tK|+E9ysK>3oG})RyZ6lHm`E-Ev`RYvQwsQAKx*D1>1R^i zS7A&U@vJ=bxm>z)%TmIQf(Y=h04#Fnn!*Xo$;xIlI2Ywoz*^Yx?2>b?-MQU}p@Hi< zvg6bmU-jYe+T0!Ir?vM}qy*d&Pyk6LfYKY8~g3*46=w}CkL?4 z&YKYJ=Te6|r?@fJ%^FqbM=vKRHyVg+X$DmDFF2p51BtXHXYGwg-N;Cqk4HmQLHH~E zP~PNfoR_fm0W;89LaR_7pn$uNx!PQ*RB9`*)$;MqK)EB(aFZq|>BvtT%XjzlXtx#W zmkgS)@`jwSiBzHql6|Wt<`E88L0wiV42c=(E;!wH2@ZJ0 zYrHTH7wz^MrN2m-wE3aM75uQDE?|fB#d2dYd10H>_h1hR{jkxRK_soeaZSZbqEhiX zBmOK6#@JhSjCa=}H<(rESJ@#g6atTe;W27@7yt3#D-v3=-a@=yZq3PxiBX5ht*0co zAu=DeM~fu1b0t6LpJdKwI0|h4DPYf*-U z?rRK5abr=>n6PyyMf=iNqBgQQ%Y}@@vCSaRX?{V5!aO3sfoH{Gx^AU8 zZ1KZ&G5K*FPKdJusb!hO)Es+pDaLnLeJN-?s#b6cl@7yjJmZk<>p+RZF9H$a#-3T> z_}tjq9%yZEY;;}=zCAaccf3;7lt3-TQ{2SD!%<3KD#JByKgJQGaVe{P3~B0ewZ{Zl;_&L^SSBsY+4XG6kPKfIAsEwfP=Vyd@S6UDZ^ z{A4;!9eI{C=jqTi%ief7tID;qBbSNdGCw}zU8(=-|7uNKmzZmY?z^_S6N5_l2)hza znGprGxnZ=C8C3$S1ieACZsBV-TQle^vrppm>}z1fS&|4Gj1u`t%e0AXevzsSOKQl#CT$sYDFLCv zc-+aJq)O0Js_j^LN7ylkEX=6y?1;d0f=~qytovCGAeDVosN&0YWmtQQY?9QBnT0B} zTUTsx_Y?`7fJ+^kZ9-||Wy)!GFJ62<+-&1&%)6_1Ox>JrG9ie&Cjq%jLw%xXMTl($ zUodd^WFoGYd)B2)Ul6#MI^h1VOEUXzxq3(^-XqPU? z=IU|>ki7UTxFM?Z`vz}>ufAQoWU5kMX5pF-U;AjK5WH5rn}4ia)#-!@`!KQ@4c+*{ zyvV{8PS_Mag;p8OMhA~QYsMQ#tJ0F8*-@r64I1dKOHvvnd1cdU#=*d!LWh)zrZ$+t@Dqzx|nqGIi`+=O9!Hr z{4&HD&NIvo=WcB&NcYvoW*k3*5g3s4aX0_oM>5HL%13-OJBftVr6e%($+&H5i!LRp z`MrYPP#0A0BDn4eFBhkC;Xb0NI1a`pUHD{DFmkyG34ZnW0=WE{VwvcfuzY!ycmy1!|pf7c2p-7nKRgVQ43g8dYL zd@@9L3bglmNU32uOP!t*ew9WbT4Wv>9Q%@NJ=?u{M7!W%kpp|DI$afpfR<3w!T4S>kEnTRjHkToB2r@<%vhfnOC;H!6pHq4trAD zOPBA#jiip8%qwagYXu`H`BwvJ+0Qgh8ZR$yrJ^)AdsB!4g&HUt#ti;QpxM-~r%n86! zB7SfqrJy_|wXA$P6^6wn6VP-5X-O2elBoECV-EA~;Y~NjG<3 zXaYLH&HR)M4&rsxeIQ-~#EpI~Kqvq=QZlZP1}LG`0=gQYJKW5F7f={FS|DBkX!L&$ zH{JE>BxbaRw%X5h? zGE(Dm8@q&l)GkPZICCx(pEPJ4&va|FWbq>C`%QPWYSsuz1wos4VCLK< zIDYapORt9MCaCy3fCNovNa^{41@htj_p%6c`0!ykh79-yL;HUNM?rngl}HM<({(*0 zQEc3@6M;SZiEC3#kN**M;8(U3CjB@9{^iT!ZDGyYjhH-r4ypMYrkQR7bcMhW*?qI( z*n!RP$(RvNAc$uH*^z|Nq|v7sG5A}vBR~E}1>()c>9hZ!Za_Qq=sgGz9)=^a(YyZ$ zeA#C(t{5=i@cSapw_(U8?&EzP@jwF2oXH1^=1g&x`HbwW0mA4a8JSaqJJ%9c@Nbl{9`(Y0e_TVA* z2Olvz^0oc>kkk14@;RvdK?OL0n=AmY=^_o1I3gooqh8bYI3N12Ssy?bhBlNPs;Lu3 zqsoW=a0OnG!&)bxEiPQVY;2x%Xl7#Ez`niEsa;EC$dKM-Uo1$!uiJ!Q=PkiaviIit z^Y-?_)<2gEljk6!SODx^PV}~L@BRbSZuFVMYMuYk?}zloci(h}(rDY|D{TL3uX#t0 zP_#%PtX(k|dGqA5sn6%nU!Yy!*9bm*Jnj!L?l)Ji90)zJ7Y;(Ud0|LWK+YW5uzKk% zq1G9urmwOgjr;Mnwsh=IQ_-uhE|BV)!4 z*s^XJKC1Si+1bOLyZ13?;c_^NWF-KMa%D(|@+LR9<8B$#{p?LsXw(k<^`tH3j zIE!O6y&M1Y%=oFCsj1z^)hc7n(%DFxM&HstCm}q1^dz1K4mfh`6db{?6yV{Ao@{QOPn7+QTsck8v=_{pEL8l} z^M}x`bu)ZN0@3~JfhJ$uvS~x3k*}rv`C`iH0Ftc$FqSX)CEgz}XY+OA1*U8?`vMJ` zcf{E7Q(+GtJ${0zGv}L(=;@Bs?t$&C_LVMOT8i%7M(L8p@W=Yi_^fj;qt_J3pBH&@ z=hPed(8-b94|8lAAx|V@6rwozPh*CPkz>i`>y3Pd;XPsMjQJFLzJTAz-lk2P*6L?Z znLZCMU%oOL`Pz}m_@qV^a$K#)*FC>b-mYdDERiB zd-}r7)TW257Q;5FSxK@}a2a$bi~qkMk7ev`ck(4t4z z4&p~TbN+($k*|fUpMqs*eTP%0&!OpOU9oEMuki9pSXViJ$x4mGWiYig)gR~VZN=^_ zYp`O~I=p!KQY64i7T2$M>OXWGj8ev={xw3#%qJnBkq$B9H5!1K{$Z~B=-w;_9RoOL zV7xbHvI+%T!>KdpQM+Lqn{2<)k7>qtsO0a5^{W@g3qeu88h9A~NWUM+bUwd-?;iMm z=yy;88#eDim+s%{YXFZl!tM)aPetF)!y9VS2rAE1Xj88Q7EI`6t=r@k3buv{nn0;!^$R{6wH9m5u0T@1%Keod7D;CZ` zK*PFF8kK7`!G+6rQTLN-Si5XG96-v`09wqMK3-1)*lP1(j`<87n{Sc%+Wz8b-$A2< z=};2WXD>o1#RV!?DDEip1yZa4_)`?FVZGWW=lMn>Rr7?&te&NLzGSVxIQk#u4LIKr zOj$c6z%`E}#!NsKidO!%Xa<}?iWLCH|3(is9--E3zJ=JnDVq;V{l(q$``9^c)UvZC zf#f9m4E$d7JL!iJqDBv9wX2|QcNh=5*Eywgc@~QApE~aR=s`MKqELBH!$q4Sdl`a z61Z)vCdm4}V_PnB?I8!F#*P?(Tsf3k&XHoLfrj7`u=?bPJ?8p5!;#J~yw`z|+J~_j z&`UJw^k1ZK0gM>*Et&cqiqPBWh|fkr>~`{Ss=P!cI#0FG0BpO=YMuhSgo{`nV&_ioZK zL`j=(p!RvG_qO#bFiN3B5ZC)HCFhS9fV61R07@do`T)G5h8?C2o3_W>=3d_p5zDc@ z=^2PDqzM*MUSDaO&&#!W@dwxNDTOIB=ZVi5)YrBIk3C2>KERD|%C23JaXE}U`-T#{ zEG%Z@x%R}Vvk>_@O7lP>+5GY}LOFHJi#L@5FB8jGyppJY3^}v|3PVn^8sN}nVD~>V z_FRw=dY2L)r6n}001U9e{E#!}@pZr9qSoKu*uHE|?aQ|13d)u$F4pPk7LO=_<)r$# z|3Tk<1y>-+Xn=FKiQ%Ed@K9j?MH$}20Ee#tYmdoTdtAny$3UsvK$q$g7Iag= z*TxvhElSe{_Uea|r_S0mQe836U$bnEOPJ4j|7$mHDdtR?LZS=6y(hrjy)u>@)G$4h z7to2A-oCPgN`>s|3hRQlqR)Vlcoh)|Th;-M{3mig8jhe5Y3O@s*;3GRe{Fkt*dua;2p%cJlj?qZSr+++~)H=uh(pwIrl-Vmr#C$3xJvLwB(ohpCZicH{#I!lHo9XQwZC*9JwWd%9pDFX3Mk)hbuS z_6@(mg;3TB*Tny(m!1BLk3|uWE{5g;&6)>)) zg#HbbVLYSXkTGH*rqz5t!-Y1VUq6_FF|K4jWBlZq;`4_O>Vw39!y4e~Lz=VCRg1Yi zqh<*Si@uPM?|mqSvE!#<%JjMRk9^o?^R4<2M0q>59YHR&$GCXuil}Dh?O_k?4niWp zF%2+gy^OIN669unR|#D|R&LZY7A#pwk-d5P>YSgDY?$Z6KAR6KHos7Tykg0?tI>bx zSV1R@8-~P!T>`-2+75Hn_~(x1o~LzN`l;*=;8+8z`~kzp5cs2@000h`Nkl;Do7 zwp9ep-zTHRFA2=AMv>2>qm*Yp$MsvZ`@*Q=265C>C6AW5vWa`cek}H9-~jT7-$vOz zS2LgS^>@Q@>&{(_88JX{=0AD~9Q@b(^Hv35;eHuC7blFNDusdV161&FFp_5uywWD1 z_2*(MbVF}niFv*$8z28y8T6MuTUPAe`a4RMECyGDH+kfZp(=k+9z6m(KuK^U_DkYj z4GVvUMH8^&oQ#H(6Q2ICkVfsNx4wsx-Qe9jc>_mlw%Mf3hv_MvBlCRT*lFI(N$}08 zuzE9r!^ckI(C{M_L@L=4Sy122p}15QzZ}X9s?%IR|0(w4W4XKJ%^3Oc{5d$k;d3x~4X3 z0y@vtq-(X97pOe*x!kFK(+=3l%vadvYwvBb`Mezq7mFqq^BJAK=!1Lr!|-*FE}Bgs z6~NT(GRh27d{*qj|m} zHXpF5Ki*5=@ZOE$xS7O4N6KdYwf7(@`uk!0Sm)>bZ0m~-RAay@8TrU^?HH&MQ*>Kk zWCC8ira1n(1mCjXLzS1R&xFxo`y82o6+I=9gmVJ=)4nyxq$Y*nZv?(-2|_nP+HxafNU}w$f3o?QxYELIcBfgk|^=c z>}|QnkrNhU+A?CitcFL#W#A3}m1?_fJ|DI;YFIxcMexB5yab)oxcq&2wlnF+;T9`- zxS(dqL15!4^TN+g_oTLxQ2U7l*=#!a)D4PR&r##w`w5Tnw1Xpq{TfJO^{yf6bee?2 zmxzJUk0HIGOj2wlq?qSWMO*_PYG7{Uo0{im$>f8f1AC)Go95z()T97TTJcfve7uXO z8_4d9(Ilkp={uSN|8{KGmr-!-p@kjc%8`N_-$qgI-d4y~OTvCTBx6$u#qiI{B2U0z z)%0yWNqDA(vuRSB<=Za8?Uz{~MLmY<%@ZK%5md3yA&V0$ND!j`6DL>j2^K(%UGsdN z>iLx`g@6WiojE7hA%tGMjMZy{MDpsvgK+WvxLSy3B77jV;bD;c8)y0dS%v_e_G?kDKjwuLy+!w_qZ$XIh!qw1}pQ#B3aOXbGfhV1mppx#rDV{Wjo zW`wiqXXdjI#0dkUpF)x~Oqb*+$T5*9lGg_(_x~B+2k(71lcrDWH*Lp_o3~+0k|xV!e0(vSLW(;`5Gl?|hdyU2TA zbr|^bge+D^Spxe}-6?L*CN!t(7W>)@=LKNPfy-z)HJaQ!55aV{{TegyI8GqQ7l?Tk zF9cbgJ-Y`uAc5y zOA<-7jLPmFqXe8^8g}}6Bx2GP(P#kA*W~=uNcW6_nyAV%D(=*(Xz~SOkS4V!g162U z%wMhf0(~;1j!bapsn0RK`%QQc zqc)W!bfcJk)x@haaR^Qezz>^Ata-_|XL^mp=Rrc?!9w7zxo1kk;E8B#S~do`b7sTn z=|Pyd`X)V>iI^@!eiH*p#c^nAo*AH)Qc*vV8f_qahgiWpW>8~t1i6IDT0WoEJLes^ zam8__Oc}-2aD2p^B|MAJ6vOVIQNHC&LfX|9RLD>1Sz>yJs*+1;CtU%j1)xfl+q{hZMLr}%P1ST)sg$WyJB&L3kc&ZWy9!WCI3f`!N z5Xdx=RZK}3I1!yOLt4z3_&u67u4mWx;;ADyK5y3=IOE1l=aH^m>u4*gQ_QDUNeL|~ zN+^>D$qr5nz@BL}-g(re5>oF@3N7$tz__eZ)kp4fBjI)(?)2u%G#FjvjY zPxXe>cMMc41Tk{F5NK!&f>zHF`|l|Qj&Sm9=J+)khltq+F3Mu@ggt0L)3+A>K$8lN zS4$-oumDi-7x|z7$`pAY9@`^{k2c?{5K8LnLZpb)wllLB!g-y2?%;W}TC7QPbjr>dp!ICL% z@hsp7T`0O5k>~WeavH}oz1rO)PauPE7*)~QS;7;|%t6ErID+_8*nJQ63tT(0MA&Vc z{*p($cvZ$(N@ShCL)UlY_(iPtf@2#W6_-$#WRIhBrQiO1-Bmcs8Xyb`!xZxw59j;9 zxAS$pNu4v!_S1-`QBMv4Fw&y2H(_Nu_fA4rvvY(FtuoO-Eo z1cfg^0?@ueQS|PfQ1HRiuN8+h*|YmkW!xib%N(4+6|=l)1v9pgFOZXDifOJa6vp<2 z#XW~pI*9i-T%rNYfz`9j^L7<^|1{l88+{#7MB{w`&lprLo)&Wrjy>gAIjdw15R;?g278475bEB0^5n$7in=Lxg&_Q ze>1V_gCt=C+<2!zJl`%T|3@YuH?>=Edsy!Z$QPG#QM<3z030$o3pd^s9AoD5Mf}1) zdO-Pu?%ha|AYRXjzt&!m3Gkp6LYHOWMoPwc5&%DHv3#Se0b;3r4>wXYh{q$f%oq2D zFQ6&mK_b=RMoPpXn)+4KeZXk(KT8PQNRc4k4m5nslmP4_UtliWNKs&(5^oO~J}#Mg zaVl!N=<*}DkrEJ0%&$ewC~0ms@IwONOYJyaCe4+ZZrF<3#CU&d;ijH6y8#fr;UP6% z^cDd(k}D#KhfU2fpJ8zaD0<^5YG1>RWC`M3Ahi%nud%uX7yTzh<$8+LUUK4Btd_6VcO95U$;YP?ob1X+bGwUTl?> zzPvBfxR!EP+&Km=%j1Y$IQ?!+ACj+if#^p1-5$V2_&)#u0RR7E7upyA000I_L_t&o Y08PC7K;4Z4+W-In07*qoM6N<$g1MD{iU0rr literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icons/256x256.png b/packages/desktop/build/icons/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..4e964b746f6656521467165cb4aad4d865c2aede GIT binary patch literal 18092 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/build/icons/512x512.png b/packages/desktop/build/icons/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..9ddc4a24688eb8074f61480477392a7e936de14e GIT binary patch literal 43393 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ʎ|OW;sKSzv6X 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/build/linux/after-install.tpl b/packages/desktop/build/linux/after-install.tpl new file mode 100644 index 0000000..19573c8 --- /dev/null +++ b/packages/desktop/build/linux/after-install.tpl @@ -0,0 +1,69 @@ +#!/bin/bash +# Deb post-install (electron-builder deb.afterInstall). Overriding the option REPLACES +# electron-builder's default template, so this file is that default (app-builder-lib +# templates/linux/after-install.tpl, v26.15.3) verbatim, plus the marked PenguinHarness +# section exposing the bundled `penguin` CLI launcher on PATH. The dollar-brace forms +# are electron-builder template macros (executable, sanitizedProductName); any other +# all-letter dollar-brace token fails the build, so shell variables stay brace-less. + +if type update-alternatives >/dev/null 2>&1; then + # Remove previous link if it doesn't use update-alternatives + if [ -L '/usr/bin/${executable}' -a -e '/usr/bin/${executable}' -a "`readlink '/usr/bin/${executable}'`" != '/etc/alternatives/${executable}' ]; then + rm -f '/usr/bin/${executable}' + fi + update-alternatives --install '/usr/bin/${executable}' '${executable}' '/opt/${sanitizedProductName}/${executable}' 100 || ln -sf '/opt/${sanitizedProductName}/${executable}' '/usr/bin/${executable}' +else + ln -sf '/opt/${sanitizedProductName}/${executable}' '/usr/bin/${executable}' +fi + +# PenguinHarness: expose the bundled penguin CLI launcher on PATH. Never clobber a real +# file of that name; replacing a (possibly stale) symlink keeps re-installs idempotent. +if [ ! -e '/usr/bin/penguin' ] || [ -L '/usr/bin/penguin' ]; then + ln -sf '/opt/${sanitizedProductName}/resources/app/bin/penguin' '/usr/bin/penguin' +fi + +# Check if user namespaces are supported by the kernel and working with a quick test: +if ! { [[ -L /proc/self/ns/user ]] && unshare --user true; }; then + # Use SUID chrome-sandbox only on systems without user namespaces: + chmod 4755 '/opt/${sanitizedProductName}/chrome-sandbox' || true +else + chmod 0755 '/opt/${sanitizedProductName}/chrome-sandbox' || true +fi + +if hash update-mime-database 2>/dev/null; then + update-mime-database /usr/share/mime || true +fi + +if hash update-desktop-database 2>/dev/null; then + update-desktop-database /usr/share/applications || true +fi + +# Install apparmor profile. (Ubuntu 24+) +# First check if the version of AppArmor running on the device supports our profile. +# This is in order to keep backwards compatibility with Ubuntu 22.04 which does not support abi/4.0. +# In that case, we just skip installing the profile since the app runs fine without it on 22.04. +# +# Those apparmor_parser flags are akin to performing a dry run of loading a profile. +# https://wiki.debian.org/AppArmor/HowToUse#Dumping_profiles +# +# Unfortunately, at the moment AppArmor doesn't have a good story for backwards compatibility. +# https://askubuntu.com/questions/1517272/writing-a-backwards-compatible-apparmor-profile +if apparmor_status --enabled > /dev/null 2>&1; then + APPARMOR_PROFILE_SOURCE='/opt/${sanitizedProductName}/resources/apparmor-profile' + APPARMOR_PROFILE_TARGET='/etc/apparmor.d/${executable}' + if apparmor_parser --skip-kernel-load --debug "$APPARMOR_PROFILE_SOURCE" > /dev/null 2>&1; then + cp -f "$APPARMOR_PROFILE_SOURCE" "$APPARMOR_PROFILE_TARGET" + + # Updating the current AppArmor profile is not possible and probably not meaningful in a chroot'ed environment. + # Use cases are for example environments where images for clients are maintained. + # There, AppArmor might correctly be installed, but live updating makes no sense. + if ! { [ -x '/usr/bin/ischroot' ] && /usr/bin/ischroot; } && hash apparmor_parser 2>/dev/null; then + # Extra flags taken from dh_apparmor: + # > By using '-W -T' we ensure that any abstraction updates are also pulled in. + # https://wiki.debian.org/AppArmor/Contribute/FirstTimeProfileImport + apparmor_parser --replace --write-cache --skip-read-cache "$APPARMOR_PROFILE_TARGET" + fi + else + echo "Skipping the installation of the AppArmor profile as this version of AppArmor does not seem to support the bundled profile" + fi +fi diff --git a/packages/desktop/build/linux/after-remove.tpl b/packages/desktop/build/linux/after-remove.tpl new file mode 100644 index 0000000..ce2523c --- /dev/null +++ b/packages/desktop/build/linux/after-remove.tpl @@ -0,0 +1,36 @@ +#!/bin/bash +# Deb post-remove (electron-builder deb.afterRemove). Overriding the option REPLACES +# electron-builder's default template, so this file is that default (app-builder-lib +# templates/linux/after-remove.tpl, v26.15.3) verbatim, plus the marked PenguinHarness +# section removing the `penguin` CLI launcher link installed by after-install.tpl. + +# Delete the link to the binary +# update-alternatives --remove : 'path' must be the registered alternative binary, +# not the generic symlink — see https://man7.org/linux/man-pages/man1/update-alternatives.1.html +if type update-alternatives >/dev/null 2>&1; then + update-alternatives --remove '${executable}' '/opt/${sanitizedProductName}/${executable}' +else + rm -f '/usr/bin/${executable}' +fi + +# PenguinHarness: remove the penguin CLI launcher link, but only if it is ours. +if [ -L '/usr/bin/penguin' ] && [ "`readlink '/usr/bin/penguin'`" = '/opt/${sanitizedProductName}/resources/app/bin/penguin' ]; then + rm -f '/usr/bin/penguin' +fi + +APPARMOR_PROFILE_DEST='/etc/apparmor.d/${executable}' + +# Remove and unload apparmor profile. +if [ -f "$APPARMOR_PROFILE_DEST" ]; then + # Unload the profile from the running kernel before deleting the file so the + # policy is not left enforced until the next reboot. Mirror the chroot guard + # used in the after-install script — live AppArmor operations are not + # meaningful inside a chroot. + # https://wiki.debian.org/AppArmor/HowToUse + if apparmor_status --enabled > /dev/null 2>&1; then + if ! { [ -x '/usr/bin/ischroot' ] && /usr/bin/ischroot; } && hash apparmor_parser 2>/dev/null; then + apparmor_parser --remove "$APPARMOR_PROFILE_DEST" || true + fi + fi + rm -f "$APPARMOR_PROFILE_DEST" +fi diff --git a/packages/desktop/electron-builder.yml b/packages/desktop/electron-builder.yml index 48ed21d..7d7068f 100644 --- a/packages/desktop/electron-builder.yml +++ b/packages/desktop/electron-builder.yml @@ -24,6 +24,10 @@ nodeGypRebuild: false mac: category: public.app-category.developer-tools + # Brand icon (rendered from packages/web/public/penguin-logo.svg by + # scripts/render-icon.mjs, committed): electron-builder converts the 1024px PNG to + # icns itself (app-builder-lib iconConverter; >=512px required). + icon: build/icon.png # No Developer ID yet (M4): identity null skips codesign instead of failing. identity: null # Version-less artifact names, following the CLI bundles (penguin-darwin-arm64.tar.gz): @@ -38,6 +42,9 @@ mac: arch: [arm64, x64] win: + # Same source PNG; electron-builder converts it to the multi-size ico embedded in the + # exe (>=256px required). + icon: build/icon.png artifactName: penguin-desktop-win32-${arch}.${ext} target: - target: nsis @@ -54,6 +61,9 @@ nsis: allowToChangeInstallationDirectory: true linux: + # Pre-rendered freedesktop icon set (scripts/render-icon.mjs): a directory of NxN.png + # files is used as-is for AppImage/deb, no conversion step. + icon: build/icons # The scoped package name is not a valid executable file name. executableName: penguin-harness # ${arch} expands to each Linux target's own convention — x86_64 for AppImage, amd64 @@ -68,3 +78,11 @@ linux: arch: [x64] - target: deb arch: [x64] + +deb: + # Extended copies of electron-builder's default scripts (overriding REPLACES them): + # they additionally create/remove the /usr/bin/penguin symlink to the staged CLI + # launcher (resources/app/bin/penguin), so a deb install gets the `penguin` command + # on PATH without the in-app install flow the other formats use. + afterInstall: build/linux/after-install.tpl + afterRemove: build/linux/after-remove.tpl diff --git a/packages/desktop/package.json b/packages/desktop/package.json index b953737..827aead 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -17,6 +17,7 @@ "pack:win": "node scripts/stage.mjs && electron-builder --win" }, "dependencies": { + "@prismshadow/penguin-cli": "workspace:*", "@prismshadow/penguin-core": "workspace:*", "@prismshadow/penguin-server": "workspace:*" }, diff --git a/packages/desktop/scripts/render-icon.mjs b/packages/desktop/scripts/render-icon.mjs new file mode 100644 index 0000000..d51a0ac --- /dev/null +++ b/packages/desktop/scripts/render-icon.mjs @@ -0,0 +1,72 @@ +/** + * Render the app icon PNGs from the brand mark (packages/web/public/penguin-logo.svg, + * treated as immutable — landing/docs carry byte-identical copies). + * + * Outputs (COMMITTED — regenerate only when the SVG changes): + * - build/icon.png 1024×1024. electron-builder converts it to icns (mac, + * >=512px required) and ico (win, >=256px) at pack time; + * also the runtime BrowserWindow icon (see src/app-icon.ts). + * - build/icons/x.png 128/256/512 freedesktop set for the Linux targets + * (used as-is, no conversion). + * + * Regenerate: node packages/desktop/scripts/render-icon.mjs + * Rasterizes via the Playwright chromium already installed for packages/landing (no new + * dependency; precedent: packages/landing/scripts/capture-readme-demo.mjs). Each size is + * rendered at its native resolution (no downscaling), with a transparent background so + * the SVG's rounded-rect clip keeps the corners transparent. + */ +import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const HERE = path.dirname(fileURLToPath(import.meta.url)); +const PKG_DIR = path.resolve(HERE, ".."); +const REPO_ROOT = path.resolve(PKG_DIR, "..", ".."); +const SVG_PATH = path.join(REPO_ROOT, "packages", "web", "public", "penguin-logo.svg"); +const BUILD_DIR = path.join(PKG_DIR, "build"); +const ICON_SET_DIR = path.join(BUILD_DIR, "icons"); + +// Resolve @playwright/test from the landing package's context (it is not a dependency +// of this package, and must not become one). +const requireLanding = createRequire(path.join(REPO_ROOT, "packages", "landing", "package.json")); +const { chromium } = requireLanding("@playwright/test"); + +const svgDataUrl = `data:image/svg+xml;base64,${readFileSync(SVG_PATH).toString("base64")}`; + +/** [size, output path]; icon.png is the 1024 master, the rest form the Linux icon set. */ +const targets = [ + [1024, path.join(BUILD_DIR, "icon.png")], + [512, path.join(ICON_SET_DIR, "512x512.png")], + [256, path.join(ICON_SET_DIR, "256x256.png")], + [128, path.join(ICON_SET_DIR, "128x128.png")], +]; + +mkdirSync(ICON_SET_DIR, { recursive: true }); + +const browser = await chromium.launch(); +try { + for (const [size, outPath] of targets) { + const page = await browser.newPage({ + viewport: { width: size, height: size }, + deviceScaleFactor: 1, + }); + await page.setContent( + `` + + ``, + ); + await page.evaluate(() => document.querySelector("img").decode()); + const png = await page.screenshot({ + omitBackground: true, + clip: { x: 0, y: 0, width: size, height: size }, + }); + writeFileSync(outPath, png); + console.log( + `[render-icon] ${path.relative(PKG_DIR, outPath)} (${size}x${size}, ${png.length} bytes)`, + ); + await page.close(); + } +} finally { + await browser.close(); +} diff --git a/packages/desktop/scripts/stage.mjs b/packages/desktop/scripts/stage.mjs index b9fc385..7d7c8e3 100644 --- a/packages/desktop/scripts/stage.mjs +++ b/packages/desktop/scripts/stage.mjs @@ -2,20 +2,25 @@ * Assemble the self-contained app directory electron-builder packs (stage/app). * * `pnpm deploy --prod` materializes this package plus its production dependency tree — - * including the workspace packages — into a portable directory whose symlinks all stay - * inside it (verified: the server boots from the deploy dir as-is). On top of that: + * including the workspace packages (@prismshadow/penguin-cli among them, so the staged + * node_modules carries cli + server + core + skills) — into a portable directory whose + * symlinks all stay inside it (verified: the server boots from the deploy dir as-is). + * On top of that: * - prune dev files (sources, configs) so only dist/, node_modules/ and package.json ship; * - copy the web build to `node_modules/@prismshadow/penguin-server/web-dist`, the npm * package layout the server's static-hosting lookup checks first; + * - copy build/icon.png into the app dir (the runtime window icon, see src/app-icon.ts); + * - generate the `penguin` CLI launchers into `bin/` (POSIX + Windows, see + * src/launcher.ts): they run the bundled CLI on the app's Electron runtime as Node; * - ensure `stage/minigit` exists (may be empty): the Windows CI job downloads MinGit * into it, and electron-builder's win extraResources entry must always have a source. * - * Run from anywhere; all paths are derived from this file's location. + * Run from anywhere (after `pnpm -r build`); all paths derive from this file's location. */ import { execFileSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; -import { fileURLToPath } from "node:url"; +import { fileURLToPath, pathToFileURL } from "node:url"; const pkgDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const repoRoot = path.resolve(pkgDir, "..", ".."); @@ -76,6 +81,44 @@ if (!fs.existsSync(path.join(webDist, "index.html"))) { const serverPkg = path.join(appDir, "node_modules", "@prismshadow", "penguin-server"); fs.cpSync(webDist, path.join(serverPkg, "web-dist"), { recursive: true, dereference: true }); +// The shell forks the server by this exact path, and the CLI launchers point at the +// CLI entry: verify both landed in the deploy tree before packing. +const launcherModule = path.join(pkgDir, "dist", "launcher.js"); +for (const [what, file] of [ + ["server entry", path.join(serverPkg, "dist", "index.js")], + [ + "CLI entry", + path.join(appDir, "node_modules", "@prismshadow", "penguin-cli", "dist", "index.js"), + ], + ["launcher generator (dist/launcher.js)", launcherModule], +]) { + if (!fs.existsSync(file)) { + console.error(`[stage] missing ${what} (${file}) — run \`pnpm -r build\` first.`); + process.exit(1); + } +} + +// Runtime window icon: same app-dir-relative location as the dev run (build/icon.png), +// so src/app-icon.ts resolves it identically in both layouts. +const iconSrc = path.join(pkgDir, "build", "icon.png"); +if (!fs.existsSync(iconSrc)) { + console.error("[stage] build/icon.png is missing — run `node scripts/render-icon.mjs`."); + process.exit(1); +} +fs.mkdirSync(path.join(appDir, "build"), { recursive: true }); +fs.copyFileSync(iconSrc, path.join(appDir, "build", "icon.png")); + +// CLI launchers (bin/penguin, bin/penguin.cmd): generated, not committed — the script +// text lives in src/launcher.ts so it is unit-tested with the rest of the shell. +const { posixLauncherScript, windowsLauncherScript } = await import( + pathToFileURL(launcherModule).href +); +const binDir = path.join(appDir, "bin"); +fs.mkdirSync(binDir, { recursive: true }); +fs.writeFileSync(path.join(binDir, "penguin"), posixLauncherScript(), { mode: 0o755 }); +fs.chmodSync(path.join(binDir, "penguin"), 0o755); +fs.writeFileSync(path.join(binDir, "penguin.cmd"), windowsLauncherScript()); + fs.mkdirSync(path.join(stageDir, "minigit"), { recursive: true }); console.log("[stage] done:", appDir); diff --git a/packages/desktop/src/app-icon.ts b/packages/desktop/src/app-icon.ts new file mode 100644 index 0000000..79e58ea --- /dev/null +++ b/packages/desktop/src/app-icon.ts @@ -0,0 +1,27 @@ +/** + * Runtime window icon — pure path logic, no Electron imports (unit-tested). + * + * Only Linux (and Windows dev runs) need it: a packaged Windows app gets its taskbar + * icon from the exe resources electron-builder embeds, and macOS ignores BrowserWindow + * icons entirely (the Dock icon comes from the bundle's icns). The PNG lives at + * build/icon.png both in the source package (committed, rendered by + * scripts/render-icon.mjs) and in the staged app directory (copied by scripts/stage.mjs), + * so the same app-path-relative lookup serves dev and packaged runs. + */ +import fs from "node:fs"; +import path from "node:path"; + +/** Window icon location relative to the app directory (dev package dir / staged app dir). */ +export const WINDOW_ICON_RELPATH = ["build", "icon.png"]; + +/** The window-icon path for a platform, or null where window icons are not used (macOS). */ +export function windowIconPathFor(appPath: string, platform: NodeJS.Platform): string | null { + if (platform === "darwin") return null; + return path.join(appPath, ...WINDOW_ICON_RELPATH); +} + +/** Same, but only when the file actually exists (a missing icon must not break windows). */ +export function resolveWindowIcon(appPath: string, platform: NodeJS.Platform): string | null { + const iconPath = windowIconPathFor(appPath, platform); + return iconPath !== null && fs.existsSync(iconPath) ? iconPath : null; +} diff --git a/packages/desktop/src/cli-install.ts b/packages/desktop/src/cli-install.ts new file mode 100644 index 0000000..7070320 --- /dev/null +++ b/packages/desktop/src/cli-install.ts @@ -0,0 +1,212 @@ +/** + * "Install 'penguin' Command" — PATH exposure for the bundled CLI launcher + * (/bin/penguin, generated at stage time; see launcher.ts). + * + * Per platform (deb is absent on purpose — its postinst ships /usr/bin/penguin, see + * build/linux/after-install.tpl): + * - macOS: symlink /usr/local/bin/penguin → /bin/penguin; on permission errors, + * escalate ONCE via osascript "with administrator privileges". + * - Windows: append \bin to the user PATH (HKCU\Environment) via reg.exe, + * idempotently (read + compare first); new terminals pick it up. + * - Linux AppImage: write an executable ~/.local/bin/penguin wrapper that runs the + * AppImage itself as Node (see launcher.ts appImageWrapperScript). + * + * Everything is native UI (menu item + dialogs) in English: the main process stays + * outside the web app's i18n, and per the design the desktop shell talks to the page + * only through the server's HTTP API — never a private IPC channel. + */ +import { execFile } from "node:child_process"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { promisify } from "node:util"; +import { app, dialog } from "electron"; +import type { BrowserWindow } from "electron"; +import { appImageWrapperScript, cliInstallKind, mergeWindowsUserPath } from "./launcher.js"; +import type { CliInstallKind } from "./launcher.js"; + +const execFileAsync = promisify(execFile); + +/** The staged launcher directory inside the packaged app. */ +function binDir(): string { + return path.join(app.getAppPath(), "bin"); +} + +/** This run's install kind, or null when there is nothing to install (dev run / deb). */ +export function currentCliInstallKind(): CliInstallKind | null { + return cliInstallKind({ + packaged: app.isPackaged, + platform: process.platform, + appImagePath: process.env.APPIMAGE ?? null, + }); +} + +function showResult(win: BrowserWindow | null, ok: boolean, detail: string): void { + const opts = { + type: ok ? ("info" as const) : ("error" as const), + title: "PenguinHarness", + message: ok + ? "The 'penguin' command is installed." + : "Could not install the 'penguin' command.", + detail, + }; + void (win !== null ? dialog.showMessageBox(win, opts) : dialog.showMessageBox(opts)); +} + +/** macOS: /usr/local/bin/penguin symlink, escalating once via osascript on EACCES/EPERM. */ +async function installDarwin(win: BrowserWindow | null): Promise { + const target = path.join(binDir(), "penguin"); + const link = "/usr/local/bin/penguin"; + try { + fs.mkdirSync("/usr/local/bin", { recursive: true }); + fs.rmSync(link, { force: true }); + fs.symlinkSync(target, link); + } catch (err) { + const code = (err as NodeJS.ErrnoException).code; + if (code !== "EACCES" && code !== "EPERM") { + showResult(win, false, String(err)); + return; + } + // Privileged retry; paths contain no single quotes (the bundle path is fixed and + // /Applications-style paths at most contain spaces). + const shellCmd = `mkdir -p /usr/local/bin && ln -sf '${target}' '${link}'`; + try { + await execFileAsync("osascript", [ + "-e", + `do shell script "${shellCmd.replace(/"/g, '\\"')}" with administrator privileges`, + ]); + } catch (escalated) { + showResult( + win, + false, + `Administrator authorization failed or was cancelled.\n${String(escalated)}`, + ); + return; + } + } + showResult( + win, + true, + `${link} now points at the app's bundled CLI. Run 'penguin' from any terminal.`, + ); +} + +/** Windows: idempotent HKCU\Environment PATH append via reg.exe. */ +async function installWindows(win: BrowserWindow | null): Promise { + const dir = binDir(); + let current: string | null = null; + try { + const { stdout } = await execFileAsync("reg", ["query", "HKCU\\Environment", "/v", "Path"]); + // Output line: " Path REG_EXPAND_SZ C:\foo;C:\bar" + const m = /^\s*Path\s+REG(?:_EXPAND)?_SZ\s+(.*)$/im.exec(stdout); + if (m) current = m[1]!.trim(); + } catch { + current = null; // No user Path value yet. + } + const merged = mergeWindowsUserPath(current, dir); + if (merged === null) { + showResult(win, true, `${dir} is already on your PATH. Run 'penguin' from any terminal.`); + return; + } + try { + // REG_EXPAND_SZ keeps any %VAR% entries of the existing value expandable. + await execFileAsync("reg", [ + "add", + "HKCU\\Environment", + "/v", + "Path", + "/t", + "REG_EXPAND_SZ", + "/d", + merged, + "/f", + ]); + } catch (err) { + showResult(win, false, String(err)); + return; + } + showResult( + win, + true, + `${dir} was added to your user PATH. Open a NEW terminal (existing ones keep the old PATH) and run 'penguin'.`, + ); +} + +/** Linux AppImage: executable ~/.local/bin/penguin wrapper invoking the AppImage as Node. */ +function installAppImage(win: BrowserWindow | null): void { + const appImage = process.env.APPIMAGE; + if (!appImage) { + showResult(win, false, "APPIMAGE is not set; this build cannot install the command."); + return; + } + const dir = path.join(os.homedir(), ".local", "bin"); + const wrapper = path.join(dir, "penguin"); + let script: string; + try { + script = appImageWrapperScript(appImage); + } catch (err) { + showResult(win, false, String(err)); + return; + } + try { + fs.mkdirSync(dir, { recursive: true }); + fs.writeFileSync(wrapper, script, { mode: 0o755 }); + fs.chmodSync(wrapper, 0o755); // writeFileSync mode is ignored when the file existed. + } catch (err) { + showResult(win, false, String(err)); + return; + } + showResult( + win, + true, + `${wrapper} now runs the CLI bundled in this AppImage. Make sure ~/.local/bin is on your PATH (most distributions add it at login), then run 'penguin' from a new terminal. Re-run this menu item if you move the AppImage.`, + ); +} + +/** Runs the platform installer (menu item and first-launch offer both land here). */ +export async function installCliCommand(win: BrowserWindow | null): Promise { + switch (currentCliInstallKind()) { + case "darwin": + await installDarwin(win); + return; + case "windows": + await installWindows(win); + return; + case "appimage": + installAppImage(win); + return; + case null: + showResult(win, false, "This build has no bundled CLI to install (development run)."); + } +} + +/** + * One-time first-launch offer: asks once per installation whether to install the + * command, and never again (the app menu keeps the entry point available). The + * "offered" flag persists under userData next to the shell's other state files. + */ +export async function maybeOfferCliInstall(win: BrowserWindow | null): Promise { + if (currentCliInstallKind() === null) return; + const flag = path.join(app.getPath("userData"), "cli-install-offered"); + try { + if (fs.existsSync(flag)) return; + fs.mkdirSync(path.dirname(flag), { recursive: true }); + fs.writeFileSync(flag, `${new Date().toISOString()}\n`); + } catch { + return; // Unreadable/unwritable userData: skip rather than re-offer forever. + } + const opts = { + type: "question" as const, + title: "PenguinHarness", + message: "Install the 'penguin' command line tool?", + detail: + "Makes the CLI bundled with this app available in your terminal. You can do this later from the application menu: Install 'penguin' Command.", + buttons: ["Install", "Not Now"], + defaultId: 0, + cancelId: 1, + }; + const { response } = await (win !== null + ? dialog.showMessageBox(win, opts) + : dialog.showMessageBox(opts)); + if (response === 0) await installCliCommand(win); +} diff --git a/packages/desktop/src/launcher.ts b/packages/desktop/src/launcher.ts new file mode 100644 index 0000000..a678a18 --- /dev/null +++ b/packages/desktop/src/launcher.ts @@ -0,0 +1,180 @@ +/** + * CLI launcher generation and PATH plumbing — pure helpers, no Electron imports, so + * they unit-test under plain vitest AND load in plain node: scripts/stage.mjs imports + * the built dist/launcher.js at stage time to write the launcher scripts into the + * packaged app directory's bin/. + * + * The launchers run the bundled @prismshadow/penguin-cli on the app's own Electron + * runtime as Node (ELECTRON_RUN_AS_NODE), so an installed desktop app provides a + * working `penguin` command without any system Node installation. How bin/ reaches + * PATH is per platform (see cli-install.ts and build/linux/*.tpl for the deb variant). + */ + +/** CLI entry inside the staged app directory (pnpm-deploy layout, asar off). */ +export const CLI_ENTRY_RELPATH = "node_modules/@prismshadow/penguin-cli/dist/index.js"; + +/** + * Platform executable names, fixed by electron-builder.yml: productName PenguinHarness + * (macOS bundle executable and Windows .exe) and linux.executableName penguin-harness. + */ +export const MAC_EXECUTABLE = "PenguinHarness"; +export const WIN_EXECUTABLE = "PenguinHarness.exe"; +export const LINUX_EXECUTABLE = "penguin-harness"; + +/** + * POSIX launcher, staged as `/bin/penguin` (chmod 755). Resolves its own real + * location first (PATH exposure is a symlink on macOS/deb), then finds the Electron + * executable at the platform's fixed position relative to the app directory: + * - macOS: app dir is `/Contents/Resources/app` → `../../MacOS/PenguinHarness` + * - Linux: app dir is `/resources/app` → `../../penguin-harness` + */ +export function posixLauncherScript(): string { + return `#!/bin/sh +# penguin CLI launcher (generated by packages/desktop/scripts/stage.mjs). +# Runs the bundled penguin CLI on this app's Electron runtime as Node +# (ELECTRON_RUN_AS_NODE=1) - no system Node installation required. + +# Resolve this script's real location; PATH exposure installs a symlink to it +# (readlink -f is not portable to macOS, hence the loop). +SOURCE=$0 +while [ -h "$SOURCE" ]; do + DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + SOURCE=$(readlink "$SOURCE") + case $SOURCE in + /*) ;; + *) SOURCE="$DIR/$SOURCE" ;; + esac +done +BIN_DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) +APP_DIR=$(dirname "$BIN_DIR") + +CLI_ENTRY="$APP_DIR/${CLI_ENTRY_RELPATH}" +# The Electron executable sits at a fixed location relative to the app directory: +# macOS /Contents/Resources/app -> ../../MacOS/${MAC_EXECUTABLE}; +# Linux /resources/app -> ../../${LINUX_EXECUTABLE}. +for CANDIDATE in "$APP_DIR/../../MacOS/${MAC_EXECUTABLE}" "$APP_DIR/../../${LINUX_EXECUTABLE}"; do + if [ -x "$CANDIDATE" ]; then + export ELECTRON_RUN_AS_NODE=1 + exec "$CANDIDATE" "$CLI_ENTRY" "$@" + fi +done +echo "penguin: could not find the PenguinHarness runtime next to $APP_DIR" >&2 +exit 1 +`; +} + +/** + * Windows launcher, staged as `\\bin\\penguin.cmd`. `%~dp0` is this script's + * directory (with a trailing backslash): the exe sits three levels up + * (bin -> app -> resources -> install root), the CLI entry one level up in the app dir. + * CRLF line endings on purpose - cmd.exe is unreliable with bare LF scripts. + */ +export function windowsLauncherScript(): string { + return [ + "@echo off", + "rem penguin CLI launcher (generated by packages/desktop/scripts/stage.mjs).", + "rem Runs the bundled penguin CLI on this app's Electron runtime as Node.", + "setlocal", + 'set "ELECTRON_RUN_AS_NODE=1"', + `"%~dp0..\\..\\..\\${WIN_EXECUTABLE}" "%~dp0..\\${CLI_ENTRY_RELPATH.replaceAll("/", "\\")}" %*`, + "exit /b %errorlevel%", + "", + ].join("\r\n"); +} + +/** + * Single-line CJS bootstrap for the AppImage wrapper (`electron -e `): resolves + * the CLI entry relative to the mounted application (process.execPath is the Electron + * binary inside the AppImage mount, resources/app sits next to it), splices it into + * argv[1] so `node -e` argv ([execPath, ...args]) becomes the [execPath, entry, ...args] + * shape the CLI's argv parsing expects, then imports the (ESM) entry. Must not contain + * single quotes: the wrapper embeds it in a single-quoted shell string. + */ +export function appImageBootstrapJs(): string { + return ( + 'const path=require("path");' + + 'const cli=path.join(path.dirname(process.execPath),"resources","app",' + + '"node_modules","@prismshadow","penguin-cli","dist","index.js");' + + "process.argv.splice(1,0,cli);" + + "import(cli).catch((err)=>{console.error(err);process.exit(1);});" + ); +} + +/** + * Wrapper script installed to ~/.local/bin/penguin for the AppImage form, which has no + * stable install directory to symlink into: it invokes the AppImage itself as Node. + * The AppImage path is baked in at install time; the guard turns a moved/deleted + * AppImage into a clear message instead of a shell "not found". + */ +export function appImageWrapperScript(appImagePath: string): string { + if (appImagePath.includes("'")) { + // A quote would break out of the single-quoted assignment below; refuse rather + // than generate a broken (or injectable) script. + throw new Error(`AppImage path must not contain single quotes: ${appImagePath}`); + } + return `#!/bin/sh +# penguin CLI launcher (generated by the PenguinHarness desktop app). +# Runs the CLI bundled inside the AppImage by starting the AppImage's Electron +# runtime as Node (ELECTRON_RUN_AS_NODE=1). If the AppImage moves, re-run +# "Install 'penguin' Command" from the PenguinHarness application menu. +APPIMAGE_PATH='${appImagePath}' +if [ ! -x "$APPIMAGE_PATH" ]; then + echo "penguin: AppImage not found at $APPIMAGE_PATH (moved or deleted?)." >&2 + echo "penguin: re-run \\"Install 'penguin' Command\\" from the PenguinHarness menu." >&2 + exit 1 +fi +export ELECTRON_RUN_AS_NODE=1 +# The -- ends Node option parsing: without it a leading-dash argument (penguin --help) +# would be swallowed as a Node flag instead of reaching the CLI. +exec "$APPIMAGE_PATH" -e '${appImageBootstrapJs()}' -- "$@" +`; +} + +/** + * Idempotent HKCU\\Environment PATH append: returns the new value to write, or null + * when `binDir` is already present (comparison ignores case, surrounding quotes and + * trailing slashes). The existing value is preserved verbatim — only `;binDir` is + * appended — so other software's entries are never rewritten. + */ +export function mergeWindowsUserPath( + current: string | null | undefined, + binDir: string, +): string | null { + const normalize = (entry: string): string => + entry + .trim() + .replace(/^"|"$/g, "") + .replace(/[\\/]+$/, "") + .toLowerCase(); + const target = binDir.trim().replace(/[\\/]+$/, ""); + const base = (current ?? "").trim(); + const present = base + .split(";") + .map(normalize) + .some((entry) => entry !== "" && entry === normalize(target)); + if (present) return null; + if (base === "") return target; + return base.endsWith(";") ? `${base}${target}` : `${base};${target}`; +} + +export type CliInstallKind = "darwin" | "windows" | "appimage"; + +/** + * Whether (and how) this run can install the `penguin` command onto PATH. Dev runs have + * no staged bin/; deb installs already ship a /usr/bin symlink from their postinst + * script (build/linux/after-install.tpl), so only the AppImage form qualifies on Linux + * (recognized by the APPIMAGE env var its runtime sets). + */ +export function cliInstallKind(opts: { + packaged: boolean; + platform: NodeJS.Platform; + appImagePath: string | null; +}): CliInstallKind | null { + if (!opts.packaged) return null; + if (opts.platform === "darwin") return "darwin"; + if (opts.platform === "win32") return "windows"; + if (opts.platform === "linux" && opts.appImagePath !== null && opts.appImagePath !== "") { + return "appimage"; + } + return null; +} diff --git a/packages/desktop/src/main.ts b/packages/desktop/src/main.ts index 9820061..0b73235 100644 --- a/packages/desktop/src/main.ts +++ b/packages/desktop/src/main.ts @@ -19,6 +19,9 @@ import path from "node:path"; import { app, BrowserWindow, dialog, shell } from "electron"; import { resolveRoot } from "@prismshadow/penguin-core"; import { liveServerLock } from "@prismshadow/penguin-server/lock"; +import { resolveWindowIcon } from "./app-icon.js"; +import { installCliCommand, maybeOfferCliInstall, currentCliInstallKind } from "./cli-install.js"; +import { installAppMenu } from "./menu.js"; import { startEmbeddedServer, stopEmbeddedServer } from "./server-process.js"; import type { EmbeddedServer } from "./server-process.js"; import { @@ -30,6 +33,10 @@ import { } from "./util.js"; app.setName("PenguinHarness"); +// Windows toasts (the web app's task-completion notifications) need the AppUserModelID +// of the installed shortcuts; electron-builder stamps them with the appId. Keep in sync +// with electron-builder.yml. +if (process.platform === "win32") app.setAppUserModelId("com.prismshadow.penguinharness"); let win: BrowserWindow | null = null; let server: EmbeddedServer | null = null; @@ -46,11 +53,15 @@ function fatal(context: string, err: unknown): void { } function createWindow(url: string): void { + // Linux window/taskbar icon (and Windows dev runs); packaged Windows uses the exe + // resources and macOS its bundle icns, so those ignore it (see app-icon.ts). + const iconPath = resolveWindowIcon(app.getAppPath(), process.platform); win = new BrowserWindow({ width: 1280, height: 860, show: false, autoHideMenuBar: true, + ...(iconPath !== null ? { icon: iconPath } : {}), webPreferences: { // The window is a plain browser: no Node, no preload — the minimal attack surface. contextIsolation: true, @@ -75,6 +86,7 @@ function createWindow(url: string): void { width: 1100, height: 800, autoHideMenuBar: true, + ...(iconPath !== null ? { icon: iconPath } : {}), // Same hardening as the main window: the preview is Agent-written, untrusted // HTML and must never get Node. webPreferences: { contextIsolation: true, nodeIntegration: false, sandbox: true }, @@ -202,9 +214,20 @@ if (!app.requestSingleInstanceLock()) { } }); - void app - .whenReady() - .then(() => boot().catch((err) => fatal("PenguinHarness failed to start.", err))); + void app.whenReady().then(() => + (async () => { + // Standard menu plus the CLI-install entry where installing makes sense + // (packaged macOS / Windows / AppImage; deb ships /usr/bin/penguin itself). + installAppMenu({ + includeCliInstall: currentCliInstallKind() !== null, + onInstallCli: () => void installCliCommand(win), + }); + await boot(); + // First launch only: offer the 'penguin' command once; the menu entry remains. + // Skipped in smoke mode — a modal dialog would hang the automated run. + if (process.env.PENGUIN_DESKTOP_SMOKE !== "1") await maybeOfferCliInstall(win); + })().catch((err) => fatal("PenguinHarness failed to start.", err)), + ); } // --- smoke hook ------------------------------------------------------------ diff --git a/packages/desktop/src/menu.ts b/packages/desktop/src/menu.ts new file mode 100644 index 0000000..aa0d2a6 --- /dev/null +++ b/packages/desktop/src/menu.ts @@ -0,0 +1,54 @@ +/** + * Application menu. Electron's default menu cannot be extended, only replaced, so the + * standard structure is rebuilt here — on macOS the Edit roles are what make clipboard + * shortcuts work inside the window, so they must be present. The one custom entry is + * "Install 'penguin' Command…" (see cli-install.ts), shown only where installing makes + * sense (packaged macOS / Windows / AppImage; deb ships /usr/bin/penguin itself). + * On Windows/Linux the window uses autoHideMenuBar, so the bar appears on Alt. + */ +import { app, Menu } from "electron"; +import type { MenuItemConstructorOptions } from "electron"; + +export const INSTALL_CLI_MENU_LABEL = "Install 'penguin' Command…"; + +export function installAppMenu(opts: { + includeCliInstall: boolean; + onInstallCli: () => void; +}): void { + const isMac = process.platform === "darwin"; + const cliItems: MenuItemConstructorOptions[] = opts.includeCliInstall + ? [{ label: INSTALL_CLI_MENU_LABEL, click: opts.onInstallCli }] + : []; + + const template: MenuItemConstructorOptions[] = []; + if (isMac) { + template.push({ + label: app.name, + submenu: [ + { role: "about" }, + ...(cliItems.length > 0 + ? ([{ type: "separator" }, ...cliItems] as MenuItemConstructorOptions[]) + : []), + { type: "separator" }, + { role: "services" }, + { type: "separator" }, + { role: "hide" }, + { role: "hideOthers" }, + { role: "unhide" }, + { type: "separator" }, + { role: "quit" }, + ], + }); + } else { + template.push({ + label: "File", + submenu: [ + ...cliItems, + ...(cliItems.length > 0 ? ([{ type: "separator" }] as MenuItemConstructorOptions[]) : []), + { role: "quit" }, + ], + }); + } + template.push({ role: "editMenu" }, { role: "viewMenu" }, { role: "windowMenu" }); + Menu.setApplicationMenu(Menu.buildFromTemplate(template)); +} diff --git a/packages/desktop/test/app-icon.test.ts b/packages/desktop/test/app-icon.test.ts new file mode 100644 index 0000000..86d3694 --- /dev/null +++ b/packages/desktop/test/app-icon.test.ts @@ -0,0 +1,37 @@ +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { afterAll, describe, expect, it } from "vitest"; +import { resolveWindowIcon, WINDOW_ICON_RELPATH, windowIconPathFor } from "../src/app-icon.js"; + +describe("windowIconPathFor", () => { + it("is null on macOS (window icons are ignored; the bundle icns owns the Dock)", () => { + expect(windowIconPathFor("/app", "darwin")).toBeNull(); + }); + + it("resolves build/icon.png inside the app dir on Linux and Windows", () => { + expect(windowIconPathFor("/app", "linux")).toBe(path.join("/app", ...WINDOW_ICON_RELPATH)); + expect(windowIconPathFor("C:\\app", "win32")).toBe( + path.join("C:\\app", ...WINDOW_ICON_RELPATH), + ); + }); +}); + +describe("resolveWindowIcon", () => { + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "penguin-desktop-icon-")); + afterAll(() => fs.rmSync(tmp, { recursive: true, force: true })); + + it("returns the path only when the file exists", () => { + expect(resolveWindowIcon(tmp, "linux")).toBeNull(); + fs.mkdirSync(path.join(tmp, "build"), { recursive: true }); + fs.writeFileSync(path.join(tmp, "build", "icon.png"), "png"); + expect(resolveWindowIcon(tmp, "linux")).toBe(path.join(tmp, "build", "icon.png")); + expect(resolveWindowIcon(tmp, "darwin")).toBeNull(); + }); + + it("the committed source icon resolves for a dev run of this package", () => { + const pkgDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); + expect(resolveWindowIcon(pkgDir, "linux")).toBe(path.join(pkgDir, "build", "icon.png")); + }); +}); diff --git a/packages/desktop/test/launcher.test.ts b/packages/desktop/test/launcher.test.ts new file mode 100644 index 0000000..a30f2eb --- /dev/null +++ b/packages/desktop/test/launcher.test.ts @@ -0,0 +1,162 @@ +import { describe, expect, it } from "vitest"; +import { + appImageBootstrapJs, + appImageWrapperScript, + CLI_ENTRY_RELPATH, + cliInstallKind, + LINUX_EXECUTABLE, + MAC_EXECUTABLE, + mergeWindowsUserPath, + posixLauncherScript, + WIN_EXECUTABLE, + windowsLauncherScript, +} from "../src/launcher.js"; + +describe("posixLauncherScript", () => { + const script = posixLauncherScript(); + + it("is a /bin/sh script that resolves symlinks before locating the runtime", () => { + expect(script.startsWith("#!/bin/sh\n")).toBe(true); + expect(script).toContain('while [ -h "$SOURCE" ]'); + expect(script).toContain("readlink"); + }); + + it("targets the bundled CLI entry and both platform runtime locations", () => { + expect(script).toContain(`CLI_ENTRY="$APP_DIR/${CLI_ENTRY_RELPATH}"`); + // macOS: resources/app -> ../../MacOS/; Linux: -> ../../. + expect(script).toContain(`"$APP_DIR/../../MacOS/${MAC_EXECUTABLE}"`); + expect(script).toContain(`"$APP_DIR/../../${LINUX_EXECUTABLE}"`); + }); + + it("execs as Node and forwards all arguments", () => { + expect(script).toContain("export ELECTRON_RUN_AS_NODE=1"); + expect(script).toContain('exec "$CANDIDATE" "$CLI_ENTRY" "$@"'); + }); + + it("fails with a message when no runtime is found", () => { + expect(script).toContain("exit 1"); + }); +}); + +describe("windowsLauncherScript", () => { + const script = windowsLauncherScript(); + + it("uses CRLF line endings (cmd.exe is unreliable with bare LF)", () => { + expect(script).toContain("\r\n"); + expect(script.split("\r\n").join("")).not.toContain("\n"); + }); + + it("finds the exe three levels up from bin\\ and the CLI entry in the app dir", () => { + expect(script).toContain(`"%~dp0..\\..\\..\\${WIN_EXECUTABLE}"`); + expect(script).toContain(`"%~dp0..\\${CLI_ENTRY_RELPATH.replaceAll("/", "\\")}"`); + }); + + it("runs as Node, forwards arguments and propagates the exit code", () => { + expect(script).toContain('set "ELECTRON_RUN_AS_NODE=1"'); + expect(script).toContain(" %*"); + expect(script).toContain("exit /b %errorlevel%"); + }); +}); + +describe("appImageWrapperScript", () => { + const appImage = "/home/user/Apps/penguin-desktop-linux-x86_64.AppImage"; + const script = appImageWrapperScript(appImage); + + it("bakes in the AppImage path and guards against it disappearing", () => { + expect(script).toContain(`APPIMAGE_PATH='${appImage}'`); + expect(script).toContain('if [ ! -x "$APPIMAGE_PATH" ]'); + }); + + it("invokes the AppImage as Node with the bootstrap and forwards arguments", () => { + expect(script).toContain("export ELECTRON_RUN_AS_NODE=1"); + // The -- is load-bearing: without it Node swallows leading-dash arguments + // (penguin --help) as its own flags instead of passing them to the CLI. + expect(script).toContain(`exec "$APPIMAGE_PATH" -e '${appImageBootstrapJs()}' -- "$@"`); + }); + + it("refuses paths containing single quotes (they would break the quoting)", () => { + expect(() => appImageWrapperScript("/tmp/it's.AppImage")).toThrow(/single quote/); + }); +}); + +describe("appImageBootstrapJs", () => { + const js = appImageBootstrapJs(); + + it("contains no single quotes (embedded in a single-quoted shell string)", () => { + expect(js).not.toContain("'"); + }); + + it("resolves the CLI entry relative to process.execPath and fixes argv", () => { + expect(js).toContain("process.execPath"); + expect(js).toContain('"resources","app"'); + expect(js).toContain('"penguin-cli","dist","index.js"'); + // node -e argv is [execPath, ...args]; the CLI slices argv from index 2, so the + // entry path must be spliced in at index 1. + expect(js).toContain("process.argv.splice(1,0,cli)"); + expect(js).toContain("import(cli)"); + }); + + it("is valid JavaScript", () => { + // eslint-disable-next-line @typescript-eslint/no-implied-eval + expect(() => new Function(js)).not.toThrow(); + }); +}); + +describe("mergeWindowsUserPath", () => { + const bin = "C:\\Program Files\\PenguinHarness\\resources\\app\\bin"; + + it("appends to an existing value with a semicolon", () => { + expect(mergeWindowsUserPath("C:\\other", bin)).toBe(`C:\\other;${bin}`); + }); + + it("does not double the separator when the value ends with one", () => { + expect(mergeWindowsUserPath("C:\\other;", bin)).toBe(`C:\\other;${bin}`); + }); + + it("starts a missing or empty value with just the bin dir", () => { + expect(mergeWindowsUserPath(null, bin)).toBe(bin); + expect(mergeWindowsUserPath("", bin)).toBe(bin); + expect(mergeWindowsUserPath(" ", bin)).toBe(bin); + }); + + it("is idempotent: returns null when already present", () => { + expect(mergeWindowsUserPath(`C:\\other;${bin}`, bin)).toBeNull(); + }); + + it("matches case-insensitively and ignores quotes and trailing slashes", () => { + expect( + mergeWindowsUserPath(`c:\\program files\\penguinharness\\RESOURCES\\app\\BIN`, bin), + ).toBeNull(); + expect(mergeWindowsUserPath(`"${bin}"`, bin)).toBeNull(); + expect(mergeWindowsUserPath(`${bin}\\`, bin)).toBeNull(); + }); + + it("preserves the existing value verbatim (including %VAR% entries)", () => { + const current = "%USERPROFILE%\\bin;C:\\tools"; + expect(mergeWindowsUserPath(current, bin)).toBe(`${current};${bin}`); + }); +}); + +describe("cliInstallKind", () => { + it("is null for dev runs regardless of platform", () => { + expect(cliInstallKind({ packaged: false, platform: "darwin", appImagePath: null })).toBeNull(); + expect(cliInstallKind({ packaged: false, platform: "win32", appImagePath: null })).toBeNull(); + }); + + it("maps packaged macOS and Windows to their installers", () => { + expect(cliInstallKind({ packaged: true, platform: "darwin", appImagePath: null })).toBe( + "darwin", + ); + expect(cliInstallKind({ packaged: true, platform: "win32", appImagePath: null })).toBe( + "windows", + ); + }); + + it("on Linux only the AppImage form installs (deb ships /usr/bin/penguin itself)", () => { + expect(cliInstallKind({ packaged: true, platform: "linux", appImagePath: null })).toBeNull(); + expect(cliInstallKind({ packaged: true, platform: "linux", appImagePath: "" })).toBeNull(); + expect( + cliInstallKind({ packaged: true, platform: "linux", appImagePath: "/x/y.AppImage" }), + ).toBe("appimage"); + }); +}); diff --git a/packages/desktop/tsup.config.ts b/packages/desktop/tsup.config.ts index 788f130..ae59961 100644 --- a/packages/desktop/tsup.config.ts +++ b/packages/desktop/tsup.config.ts @@ -1,7 +1,9 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/main.ts"], + // launcher.ts is a second entry on purpose: scripts/stage.mjs imports dist/launcher.js + // at stage time (plain node, no Electron) to generate the CLI launcher scripts. + entry: ["src/main.ts", "src/launcher.ts"], format: ["esm"], target: "node22", platform: "node", diff --git a/packages/docs/content/server-api.en.md b/packages/docs/content/server-api.en.md index 70573a1..a65faac 100644 --- a/packages/docs/content/server-api.en.md +++ b/packages/docs/content/server-api.en.md @@ -67,6 +67,8 @@ curl -c cookies.txt -H "Content-Type: application/json" \ | POST | /api/admin/users/:userId/password | Reset a password (invalidates all of that user's login sessions) | | DELETE | /api/admin/users/:userId | Delete a user | +In desktop mode (the server spawned by the desktop app) the whole surface answers `403` with code `desktop_single_user`: the desktop app is single-user, so user management is disabled — existing users in the data root are untouched. + ### Server Settings (admin only) | Method | Path | Description | @@ -97,7 +99,7 @@ curl -c cookies.txt -H "Content-Type: application/json" \ | POST | /api/projects/:projectId/members | Add a member: `{userId}` | | DELETE | /api/projects/:projectId/members/:userId | Remove a member | -Member writes are owner-only. +Member writes are owner-only. The member routes also answer `403 desktop_single_user` in desktop mode (see User Administration above). ### Models diff --git a/packages/docs/content/server-api.zh.md b/packages/docs/content/server-api.zh.md index f96b7aa..c9b31eb 100644 --- a/packages/docs/content/server-api.zh.md +++ b/packages/docs/content/server-api.zh.md @@ -67,6 +67,8 @@ curl -c cookies.txt -H "Content-Type: application/json" \ | POST | /api/admin/users/:userId/password | 重置密码(该用户全部登录会话失效) | | DELETE | /api/admin/users/:userId | 删除用户 | +桌面模式下(server 由桌面应用拉起)整组路由返回 `403`、错误码 `desktop_single_user`:桌面应用是单用户形态,用户管理整体停用——数据根中已有的用户不受影响。 + ### 服务端设置(仅管理员) | 方法 | 路径 | 说明 | @@ -97,7 +99,7 @@ curl -c cookies.txt -H "Content-Type: application/json" \ | POST | /api/projects/:projectId/members | 添加成员:`{userId}` | | DELETE | /api/projects/:projectId/members/:userId | 移除成员 | -成员写操作仅限 Owner。 +成员写操作仅限 Owner。成员路由在桌面模式下同样返回 `403 desktop_single_user`(见上文「用户管理」)。 ### 模型 diff --git a/packages/server/src/http/routes/admin.ts b/packages/server/src/http/routes/admin.ts index 73f6a5d..522436f 100644 --- a/packages/server/src/http/routes/admin.ts +++ b/packages/server/src/http/routes/admin.ts @@ -1,10 +1,12 @@ /** - * Admin user-backend routes: only the built-in admin can use these (403 for non-admins). + * Admin user-backend routes: only the built-in admin can use these (403 for non-admins), + * and desktop mode rejects the whole surface (single-user; 403 `desktop_single_user`). * GET|POST /api/admin/users, POST /api/admin/users/:userId/password, DELETE /api/admin/users/:userId. */ import { Hono } from "hono"; import type { AdminUserCreateResponse, AdminUsersResponse } from "../../api/types.js"; import { HttpError } from "../errors.js"; +import { rejectInDesktopMode } from "./desktop.js"; import type { AppEnv } from "../../auth/middleware.js"; import { pathParam, readJson, requireString } from "../validate.js"; import type { AppDeps } from "../../app.js"; @@ -12,6 +14,7 @@ import type { AppDeps } from "../../app.js"; export function adminUsersRoutes(deps: AppDeps): Hono { const app = new Hono(); + app.use("*", rejectInDesktopMode(deps)); app.use("*", async (c, next) => { if (!c.var.user.isAdmin) { throw new HttpError(403, "admin_required", "Only an admin can perform this operation."); diff --git a/packages/server/src/http/routes/desktop.ts b/packages/server/src/http/routes/desktop.ts index 2ee692f..572a35b 100644 --- a/packages/server/src/http/routes/desktop.ts +++ b/packages/server/src/http/routes/desktop.ts @@ -1,15 +1,37 @@ /** - * Desktop-mode routes: POST /api/desktop/shutdown. + * Desktop-mode routes: POST /api/desktop/shutdown, plus the shared desktop-mode guard + * that turns off multi-user surfaces (see rejectInDesktopMode). * - * Authenticated by the shell's Bearer token, not the cookie session (the shell holds no - * cookie), so this mounts OUTSIDE authMiddleware and only when desktop mode is enabled. - * Responds 202 first, then triggers the graceful shutdown a beat later so the response - * isn't cut off by the closing listener. + * The shutdown route is authenticated by the shell's Bearer token, not the cookie + * session (the shell holds no cookie), so it mounts OUTSIDE authMiddleware and only + * when desktop mode is enabled. Responds 202 first, then triggers the graceful + * shutdown a beat later so the response isn't cut off by the closing listener. */ import { Hono } from "hono"; +import type { MiddlewareHandler } from "hono"; import { HttpError } from "../errors.js"; import type { AppDeps } from "../../app.js"; +/** + * Guard for user-management surfaces (admin users, Project members): the desktop app is + * single-user, so the whole surface answers 403 with a dedicated code rather than being + * unmounted — a stray client gets a clear, localizable error instead of a 404. Existing + * users and memberships in the data root are untouched; only the management routes are + * closed while the server runs under the desktop shell. + */ +export function rejectInDesktopMode(deps: AppDeps): MiddlewareHandler { + return async (_c, next) => { + if (deps.desktop !== null) { + throw new HttpError( + 403, + "desktop_single_user", + "User management is disabled in the desktop app (single-user mode).", + ); + } + await next(); + }; +} + /** Delay between answering 202 and starting shutdown: lets the response flush. */ const SHUTDOWN_DELAY_MS = 50; diff --git a/packages/server/src/http/routes/members.ts b/packages/server/src/http/routes/members.ts index f747781..ff75c6c 100644 --- a/packages/server/src/http/routes/members.ts +++ b/packages/server/src/http/routes/members.ts @@ -2,16 +2,20 @@ * Member authorization routes: * GET|POST /api/projects/:p/members, DELETE /api/projects/:p/members/:userId. * Reading requires access; adding/removing is owner-only (validated inside the service). + * Desktop mode rejects the whole surface (single-user; 403 `desktop_single_user`). */ import { Hono } from "hono"; import type { MemberAddResponse, MembersResponse } from "../../api/types.js"; import type { AppEnv } from "../../auth/middleware.js"; +import { rejectInDesktopMode } from "./desktop.js"; import { pathParam, readJson, requireString, requireValidId } from "../validate.js"; import type { AppDeps } from "../../app.js"; export function membersRoutes(deps: AppDeps): Hono { const app = new Hono(); + app.use("*", rejectInDesktopMode(deps)); + app.get("/", (c) => { // Defensive id validation (FD-4). const members = deps.projectService.listMembers( diff --git a/packages/server/test/desktop.test.ts b/packages/server/test/desktop.test.ts index 1b63680..53a4ab7 100644 --- a/packages/server/test/desktop.test.ts +++ b/packages/server/test/desktop.test.ts @@ -1,10 +1,11 @@ /** * Desktop mode: one-shot desktop-login, Bearer-token shutdown, desktopMode in /api/me, - * and the desktop-session password change without oldPassword. + * the desktop-session password change without oldPassword, and the single-user guard + * closing the user-management and Project-member surfaces. */ import { describe, expect, it } from "vitest"; import { apiClient, createTestApp, loginAdmin } from "./helpers.js"; -import type { MeResponse } from "../src/api/types.js"; +import type { ErrorBody, MeResponse } from "../src/api/types.js"; const TOKEN = "test-desktop-token"; @@ -119,6 +120,75 @@ describe("desktop shutdown endpoint", () => { }); }); +describe("desktop single-user mode", () => { + async function expectSingleUser403(res: Response): Promise { + expect(res.status).toBe(403); + const body = (await res.json()) as ErrorBody; + expect(body.error.code).toBe("desktop_single_user"); + } + + it("rejects the whole admin-users surface with desktop_single_user", async () => { + const t = await desktopApp(); + try { + // The seeded admin signed in through the regular login form: even a fully + // authorized admin session gets the dedicated 403, not admin_required. + const admin = await loginAdmin(t.app); + const api = apiClient(t.app, admin.cookie); + await expectSingleUser403(await api.get("/api/admin/users")); + await expectSingleUser403( + await api.post("/api/admin/users", { userId: "eve", password: "password-123" }), + ); + await expectSingleUser403( + await api.post("/api/admin/users/admin/password", { password: "password-456" }), + ); + await expectSingleUser403( + await t.app.request("/api/admin/users/eve", { + method: "DELETE", + headers: { cookie: admin.cookie }, + }), + ); + // No user was created by the rejected POST. + expect(t.deps.db.prepare("SELECT COUNT(*) AS n FROM users").get()?.n).toBe(1); + } finally { + await t.cleanup(); + } + }); + + it("rejects Project member management (reads and writes) with desktop_single_user", async () => { + const t = await desktopApp(); + try { + const admin = await loginAdmin(t.app); + const api = apiClient(t.app, admin.cookie); + await expectSingleUser403(await api.get("/api/projects/default_project/members")); + await expectSingleUser403( + await api.post("/api/projects/default_project/members", { userId: "eve" }), + ); + await expectSingleUser403( + await t.app.request("/api/projects/default_project/members/eve", { + method: "DELETE", + headers: { cookie: admin.cookie }, + }), + ); + } finally { + await t.cleanup(); + } + }); + + it("leaves both surfaces working on a normal multi-user server", async () => { + const t = await createTestApp(); + try { + const admin = await loginAdmin(t.app); + const api = apiClient(t.app, admin.cookie); + const users = await api.get("/api/admin/users"); + expect(users.status).toBe(200); + const members = await api.get("/api/projects/default_project/members"); + expect(members.status).toBe(200); + } finally { + await t.cleanup(); + } + }); +}); + describe("desktop-session password change", () => { async function desktopCookie(t: Awaited>): Promise { const res = await t.app.request(`/api/auth/desktop-login?token=${TOKEN}`); diff --git a/packages/web/src/components/layout/app-layout.tsx b/packages/web/src/components/layout/app-layout.tsx index b2b22a8..6cfb0bc 100644 --- a/packages/web/src/components/layout/app-layout.tsx +++ b/packages/web/src/components/layout/app-layout.tsx @@ -12,6 +12,7 @@ import { useVersionInfo } from "../../lib/use-version-info"; import { useAuth } from "../../state/auth"; import { useProject } from "../../state/project"; import { useSessions } from "../../state/sessions"; +import { useCompletionNotifications } from "../../state/use-completion-notifications"; import { Drawer } from "../ui/drawer"; import { GlyphIcon } from "../ui/glyph-icon"; import { NAV_ICONS } from "../ui/icons"; @@ -167,6 +168,9 @@ function CollapsedRail({ onExpand }: { onExpand: () => void }) { export function AppLayout() { const { user, desktopMode } = useAuth(); + // Desktop shell only (gated inside): system notification when a task finishes while + // the window is unfocused. + useCompletionNotifications(); const [drawerOpen, setDrawerOpen] = useState(false); const [changePasswordOpen, setChangePasswordOpen] = useState(false); // Desktop sidebar collapse (persisted): collapsed state leaves a narrow rail to expand from. diff --git a/packages/web/src/components/layout/project-dialogs.tsx b/packages/web/src/components/layout/project-dialogs.tsx index 9aa2340..bb512b9 100644 --- a/packages/web/src/components/layout/project-dialogs.tsx +++ b/packages/web/src/components/layout/project-dialogs.tsx @@ -172,7 +172,7 @@ export function CreateProjectDialog({ * deletion (owner); members see the name and member list read-only. */ export function ProjectSettingsDialog({ open, onClose }: { open: boolean; onClose: () => void }) { - const { user } = useAuth(); + const { user, desktopMode } = useAuth(); const { currentProject, setCurrentProjectId, projects, reloadProjects } = useProject(); const [members, setMembers] = useState(null); const [newMemberId, setNewMemberId] = useState(""); @@ -196,14 +196,18 @@ export function ProjectSettingsDialog({ open, onClose }: { open: boolean; onClos setConfirmDelete(false); setName(savedName); setNameError(undefined); - api - .listMembers(projectId) - .then((res) => setMembers(res.members)) - .catch((e: unknown) => setLoadError(apiErrorText(e))); + // Desktop mode is single-user: the member section is hidden below and the server + // rejects the member routes (desktop_single_user), so nothing is fetched. + if (!desktopMode) { + api + .listMembers(projectId) + .then((res) => setMembers(res.members)) + .catch((e: unknown) => setLoadError(apiErrorText(e))); + } // savedName is read at open time only: retyping in the field must not be clobbered by a // list refresh, and reopening the dialog re-seeds it. // eslint-disable-next-line react-hooks/exhaustive-deps - }, [open, projectId]); + }, [open, projectId, desktopMode]); if (!currentProject || !projectId) return null; @@ -306,76 +310,85 @@ export function ProjectSettingsDialog({ open, onClose }: { open: boolean; onClos

{projectId}

-
-

{S.project.members}

- {loadError ? ( -

{loadError}

- ) : members === null ? ( -

{S.common.loading}

- ) : ( - // Member permission table: username / role / actions; cells never wrap. - // Last row (owner only) = add member: small username input + add button (new members are always the member role). -
- - - - - - - - - - {members.map((m) => ( - - - - + + )} + +
- {S.common.username} - {S.common.role} - {S.common.actions} -
{m.userId} - {m.role} - - {isOwner && m.role !== "owner" && m.userId !== user?.userId && ( -
+
+ )} +
+ )} diff --git a/packages/web/src/components/layout/sidebar.tsx b/packages/web/src/components/layout/sidebar.tsx index 557e2cc..e714f7f 100644 --- a/packages/web/src/components/layout/sidebar.tsx +++ b/packages/web/src/components/layout/sidebar.tsx @@ -1119,8 +1119,10 @@ export function Sidebar({ )} )} - {/* User management is visible only to admins (the page route also has its own guard as a fallback). */} - {user?.isAdmin && ( + {/* User management is visible only to admins (the page route also has its own + guard as a fallback), and never in desktop mode: the desktop app is + single-user and the server rejects the routes (desktop_single_user). */} + {user?.isAdmin && !desktopMode && (