From e825abf30c77c6dc8ae53ec6e78ca5d1de096027 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Tue, 5 May 2026 22:05:59 +0000 Subject: [PATCH 1/4] feat(app): add container task manager --- .../issue-239/taskmanager-default.png | Bin 0 -> 73583 bytes .../issue-239/taskmanager-show-system.png | Bin 0 -> 86071 bytes packages/app/src/web/actions-shared.ts | 2 + packages/app/src/web/actions-tasks.ts | 75 ++++++-- packages/app/src/web/actions.ts | 8 +- packages/app/src/web/api-tasks.ts | 7 +- packages/app/src/web/app-ready-actions.ts | 4 + .../src/web/app-ready-controller-context.ts | 2 + packages/app/src/web/app-ready-controller.ts | 18 +- packages/app/src/web/app-ready-layout.tsx | 3 + .../app/src/web/app-ready-main-panels.tsx | 2 + .../app/src/web/app-ready-shortcut-runtime.ts | 9 +- packages/app/src/web/app-ready-state.ts | 2 + .../app/src/web/app-ready-task-actions.ts | 10 +- packages/app/src/web/app-ready-tasks-hook.ts | 16 +- .../app/src/web/app-ready-terminal-screen.tsx | 9 + packages/app/src/web/app-ready.tsx | 5 + packages/app/src/web/panel-tasks.tsx | 46 ++++- packages/app/src/web/panel-terminal.tsx | 28 ++- .../tests/docker-git/actions-tasks.test.ts | 167 ++++++++++++++++++ .../tests/docker-git/app-ready-create.test.ts | 77 ++++---- .../docker-git/app-ready-shortcuts.test.ts | 68 +++++++ .../browser-action-context-fixture.ts | 2 + .../docker-git/menu-create-shared.test.ts | 33 ++-- .../terminal-mobile-controls.test.ts | 20 +-- .../app/tests/docker-git/terminal.test.ts | 10 +- 26 files changed, 523 insertions(+), 100 deletions(-) create mode 100644 docs/screenshots/issue-239/taskmanager-default.png create mode 100644 docs/screenshots/issue-239/taskmanager-show-system.png create mode 100644 packages/app/tests/docker-git/actions-tasks.test.ts diff --git a/docs/screenshots/issue-239/taskmanager-default.png b/docs/screenshots/issue-239/taskmanager-default.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1b64e0be62484a1e3ce372efe73f752407cd9b GIT binary patch literal 73583 zcmb@uWmH^E(=MDlMhplZf(5q#K?f(eyL<59Zh>JENJ4Pe0S0$>7$mq1?l8dMgA*9s z=Hq^nJm>py&N}N|>-4X^tE+W)cU50iwS!cYq%ohpes=HPJxo~{3AKCo9;M&A_h915 z{X5D;##5Jj_g>zUl@QhNO4(h&Fi@X{WBfuT&;Xu1eEB3jJu{s_g@E*PmjC2RetmEe zfpkS}eT|;y0@VEj*+&9>)q>|cQP-kV^c4b~`0QQy(mRK_OqEz;y|;9K8#~a~)lG^IcThDEjq@Rv zcH){Ejgyss`X~D*#(O%(96VA5A7VVxWIg_zu24?>zeN{wqD?Du2_vl8LaZ^s9c^SL ze>%7HKs1kW)BMr+qSV7b%;{gm{U7{!el1AD`U>*%xPoIrorT=BE6zDLED2xo@#w!OXEP+RIjx--tWxJ$f=QAOM~JyJURdy)fW+ zc%J0K=_=)veP!pF`Z^br7eA-NLR0_k>LxK!Oi3y)hg&8K!x8m zISJ&3iq5h%MjyR1Z{Ym18sB%AEt+lzD{1`7c`D=whDxtAne^U2>z)*mi$(&R5@6*s z(zy3A)ld2gA|4KVFE8JylhNe0?4f`kYE46E7(cYr|5HYgbuQ%_45R%$Pa|)V_~Em% zrl7gl=r>d}TSqB0cub`_6~L6M3QU$Q`T6LP)&vY3{;f^}m2H+oHv)6K42BOHl_F12Hu5FSNf8%w! z>c>ao&Blr9>j1Is8BbhYtYP=}&ibI^1h6?F=E6-xE~X7|+bS^z>I6xUP_IHm<*n;F zd0N<2BOcp|f;)$rUAA4*t(rtST8NixsLO08&Ig-<^tE+?ssB?ls|HZ7(4{K+5;XYy zwp5x((j%bqQ20uPIPmt&wEXd~wPbIMbkvo!9**g{JC$e!z-0$HIV6&CzQ3b7<2l2@0|BKCC{OLELlr+y$`LFZi~Q+C2HWrdh7u>ByOP*n(oaGqcOR74;iv& zGsqO!_W#;oU+2Ly%eVK@!(YoYltgJjT0 zr-UqFXQ{N1xjJt?&d-w34#QinPWx%5feod`4BE*m0O3@{H|<{sQKqy*C2sy@YzS7H zS;Rmr6)B9TO1paXAqEh>TDRqsR+}>A*~BT`Pm4YG_HmQTsE*A-E# zXnAb0)nYPDW#wXW`#BAmd(E0Yz%t03CwV?(B;cu7g+rdoZLuZ!N#cF%|wZQb8#k!bSCE@ z^nKK1+mlu;N)szR}GbdY6d&&VI&D2FtEnj#&oP278){}ojkRKdW3;g zOj#ir_DpSb(Q~Bk{uIpw5Bw4Rl}c_}Cc&|^ckdU=VA#1-WAuHK+OIBYji#eAsO-Ux zMz=k7OV^M8lr>Fm7Xp9pV`1UBMz^#4P$dlB;&Z(QxAjnQ<`>3WCh{(&WWd-rD$Oea zQu0KcsrmXoSeBMQ`Z>hZO&__$tp{=4E*`N@4}T@xcy=VlmW@0*#xy$hp~a4Q)|J^_ z9#B{MlmyPi53=dWi{buuf3zbz?;E~y-sf9U4H;{d*zX1M(Arr~o-(B%d8W{#<_7xM z^|eI_@L|2pstW$i@XwU#u}XH?PrhDTsjV^n8Yv0=mlH*L3aS|cr1QJ(@~d?RPeX^| zf8mZl-*jj&g+|@T08nGudp>^H;R!0jt|9h zZQ_*U8CP(uaM-h^8sKDe{j|Uo+v?7{32B1^p^3TTwhY^BokVr2Pt7ikzFi(sDh-Be zdhb0^4T7%1lCtN)s^qw`lU5ydnv0siqz<7e-z< z>2Cy#bogH1iMS-Zai)DGYC-hEPsT6zgCr7Pu`#%F&$`GbMEuwsZuBw{?OGc zsOT5(8n_!ls>_tU zLtgFKw|$R4FT?NZ_sYJOj$MC3L#m(lk0ieCi(rnW3SP0ymP)aV6f<#WBaa%5;e(Nn zoR!eLL3IdYLa8JHF4739{c*zDSL$1PW?)7gGPLDv?kHbjTr4|BjWIzwj$XiqD_cC- z>77@5+lNbfd$3kaogcrw`34t6Fw+vaZET;LkI$e^f`4#w6^cIsbZLYsS#jY*-QB}B z*TR47H_1QyO4U{Tv~W9K{uunuPgA2{vOX>ZMzj?9<13Zg>pI})njqQnBM^%S9EU|s zl~#3g+lcKMh~vwU14EtE)qp-(_t|j-5Wfnc>E+a2te8=lIgxDo8cSPy^vxqGoK^MS z5#eu-+(-@w?B9ChifS}PCJN{r(YDh_`itR%+-`{s=k#VylIj_M%=kFWa!&_oga01# z5e%^Um*AguV8JmJFxBHBdy%@5g~qQI*a73u?FGU;ROi1)!lwp?nv(yyj~isb#0Vq6 z4}RM78DAS9Be8d`;LPEFAoOmV%kRgEL%rL5)7n;WUR9w%5ZBcfo+-~+!1%m;xy zSR1k11RO66QtB?wUa!q3vPwZdxR(@o0JoJ`a7m+&^HHOZ48WA)DWMF(jt;r{6+!}+ zo8Kf%1h%4 zZ5H56xk2gD#3CJeDgmZnVx$#rD7T7ihP1GrOT3;bXwu{gt@T=^?~XxMRtJ92=XgV@ zx0s=2qPXvA-ZIeIq@UNuA6x4-)(h-JcaA&{Qt0_$N1!#t$pE{`$?q5*#cV^FJVsQN~Pa*TS#sb=cge@TPda)v36lT0ttT z8>@?4!N3xuI*w+~h*d!xt>P#XeixN@hIEx6N9HPPWG>UxxsG`+rA36&jjQaKpU+yT zK6cBd;#d~V9w2pR{ij(mz52CY%E7Qa-iwX!=YuJS)BgyhF6mokY7BYc2p;LW)RlwK zs}<@IgX^*qE|Z>tePO{u)bEl%wTFaLd@_p+SeiP`@>V<9=@@Ycg-@P|u#hz~dAd2d zG?TbjZDXiPH52VEattL6vncX6GWPo&$}FfOFjH_CB7g1nl)%eB{$NQ(F(^JeGUNx1 zbFY7R*57*p#@xv}ty7~Bf3||fnp(O05x0WWbF=^P)g~=a`if5dbTLr*t;@^QWOlo$ zQJVfS;PUslV;uZIyziF-;ED_X&of?R0?@IHvFr^0bYdVqsiIYXh$@fq0e@4A2-@3P zRHGcRG1)TxHGYwPh_#UP$CHTg1I`_PQ~wvk-L}Z(IM#J+T+-BcpPf@jkG$ENP;j~70k{1`WZEtl9gw}cYQ3aUsAu{%J~E9pS$GGo?MTR zM6MTGZE%3`Ou5re*hI-X$yZhB1Xh9IWs=_&-J<|U@U@9bjJ7IY?4B|Hz5EC}P@wP$ z{;-@!y#K%4gzo+CFG&B7$W7nDOYdxiZi>(Ftq2RagVF0jw4h5*Yo(~Uj2DC93J1Je z5lyt5&~S9=?wQJA*^Y0_HYB={pViD)2(R@{LEyajX+#=k7bviJcEI1(^!-Gw&ezb} zxCc1RU=|~y3`IU-yoFHtng7KC3@HXzqxiKDhqi-FK2Z6dSOVyXtMv}{lI{lAPSyUw z&wvm($xE*XP-m!PU|I7!vz~9n`W|j}-E{8XEGz*Xo+<#d`)u6Xx4>c0#^FU=t#39Y z5c9NYX5uSBX@ZpP^r_F?xBnTq&vNvDj+%ZSVUy5cwOXB{+}Y1E$13hYaa%2Uv9G4O z@-2iU;p^fco#K4!Vk^95EWuIty0B*4_b5C2G?~|}GOE)dG$y9*X9ib|>;iDPq~v%; z0Mdyo2RFZxr~-IYUSjTD8!9zf$z=Sv?s4X`D?P1B2C=CB89mGgL7Nh zxF^x&Q#^~{z3Zt#%TIckJB3BeexIl}m*YG9!QR1pvFxDPw{Uhccek9bD8N43JY~IR z=PQHgxQq3r_m`qs+HR2d+eW~iGFqO=RadjV6j<|K`1{#wXIh*)N%cVPJS6%UBVcrqUaSUA%aCasWAxvfx97ET!!Cpb40zJOJA z`e?0`yasgn@RjLJ;N82o)S5f>6icqBJB&?fV9evARl860aTAJ#K!T0r^h)!e(OSEk z$tiY`fx%=RkqhgkgZ(e9u5Sfy-0HRGLdl?F2qtD#=VQvjXT!#dK47I*39pY!?c!_V z(m0s+tF7v=0;>fLKD zWP-hyClzr9ksf=N7oKXzI|$KE*@)7>;7eXEYcblQma*AR;PENu6fxN2?J>dBuNC~B z`O1j(@glHM=s(M~6iA-YB3pXqBQ7SM4<~&h;_?JtyH|FI1^(NnCb$fgP(!Q!0AkBS zE0V)(wrD*V=iKZ@5HY~J&1oW4nK+@BHMKWK?#!{%$#lKrG9L`@T4yAxiXYU*E_dR} zky#vX^*<0s3~ifFf3h6T4bP>~eYWGIZ z^{$W8CYH|7(Mg28bRC(4>`-absb=}tF+idS%t1lh&`gb#*v<1ayvJGcD+d5=W>E!Z zrmm$C$)XrKxa~8}vZz8Lpt=&q9S0~|>~$6Jz#5K`vo-{qc_|5ey=l!|E*-NW5g#A# zJ`ZpJW=n{@g0=FCWvtYHEfI1BP78ag~kP(*`uJ;h?P~EpImU$ z6|fh^c^)jWgGA6&S_LPh@vhn=PvVs+< ziQr?oQo3HoI2$T)m-%$vWmp6tS7Odybp!j2AXdHm-vG`7pQ4lnSZrivA)=B1lD4W`_6K2%zRo0z=T3?)MzltF@5sKO*=Xlf9YEz?IfZBsE3z-> z`(Y&I^W4O^h>@Lg&+R9dU;03fDc*V6b$ZSpUw1=1NZw`J2YLun5$2$M1e~r?JDZN= ztP^=plG!JQ{8Pzl&_~O`NBy}T+XAjiA$cHD1dvJD0^2YvC(u@8Ra!beFeZpvf$3mb zC5$inI1^As!nCbUpSVb*aG-8vi-I8Gn00os?tnds+{Xo8LGOIYIY5hQmzQ`=_Ex7K zO%=>_WeWmY(nYQ{wPKf15~;%%Qb5a7KAw7K?&1sqoUL=ej{-vS2DR zEfnO*1XzltHKdR1lx2Q&Y+Sbuy8~6Z9@aGD&vtgt$>ICZa&6f}Thb%xQULP5&QnRf zRyy;Pi>|JEmn*B?x!upXhil3eHXY|>>l~k_NtaiUtVop(Al*j&_44i)7zjE8~Y7CtPoDIyd$} zgO=n|fhm=|n61bje@j^z+L%bG*Vb;RqnzKW8gI|of zsN2|q(#Efr!PAy*SL`)LGydX`+>Z@s-;|piQfXPHy}*e@zGPa4%HQ{J+dBLlzFb0# zlgU)Q%z8BOrr!hWUe;8RtTPxr4_Grq9KXIk!PYJib zuoz}Lno=tAZtkrLiABYIAg&{3FCi1)`j~}u6bKjQzA8L;Z`;TR zt5hO`Y}HP}QEH(}%N35kO$)U{$1NzGTnAFIQ2iI@g*n&r#_}yQ{L@!zUW6vi^`S#1 zQN?hd7LocZjf%;K(`h9}Mn+byT(51_lT&Pzi{9Q$SU|c&RUHS?O`JCa)yZt)svK9J4Y_`z6utr6--5;YwjitT{3i(KiI0Z=H*JV`vWKYq! z=bXQ6nw3ZrfsZ`g&JtTO&Mf$qi1Nfm3dqA9W+6$Nke##83_nA?zqGnx?@xKOii}Q1 zb{(IEZ@CuO)Z|-ngNzwi_MV~ylq0pw0TZ`AcRI+gjKcLNSf!e1%LdWu@k&%DQDuvZ zqsa=hg8Hq=Mk1UoqS{y~t*ou0;Ia)TNgCuSA~*4#dut;XwYix!fHZ!TeHdliEfJ5t z9{!e{H{|;um?rK3R|xAVVX!0(q=)Mjz!ujF%~&Ad;_aej?ZMc9pR_&GSKCY( z(jQe@`*F_b`lE}}so`b+!k$EbF>1g=uj%-{>QIdJErBLhYeIs3j)g=WXs;WgIhpQj+GE7fDsd|V=;W@0iB;Sf-xDw{+p(nLPkZQ=OUbQErA6cGnUDM~#RQPt; zaxMsIDB9oY6q;j>j>ZUlbWGUhB68E(q_B&HTzJdW;H)m#)ittR%^RKt?@{wGlm1dj zT}9%|_qtK>wLZ6Fio3S&{&}-26SHX2D{Nb%CXnnApQPf$9W2yvsKeB{)1sziPf_uE zl|(I?1PS4Jm#mB7b!xKMh-h;QKW?hXCd}MVg@&M959&#ilfzxE@k%ck)*uE%AP zf5LRFvCrL>A0|9}1DP+d)28}_qoLES#>rSbOmFHuNhWipY57y;)jA;~q%+Yc_|QY%AjT7mshMU9Tg6X`BA~ANoEu@s&w*--oq-tvG^yT+at?4Tke<-b!++xIv2*mw zg90oc`LPuJ1PY-5|Vl<+mBaLsi0R7)-l4 z+1Zp7y?xEjR^@PLk{G|yO0F%=>a#;m?X4A}VpooYl+i8aOO9%IM@>yVnhtr!bh@~+ z2oMGQExXgU;7XAnb!GTI8k(4sDeV6F@J3(bG;nkp($HzcD@zKMP+{j#9c-1pyWvw5&(ZRRCZD)DZ1K8?j+m~OJxb=;h_dbv zZ4cq*-HxaYGh|zk27T3fO=v%{0*edy&Rh4fP1|T0S4!iAw?TqtHF1X_H+dSC4zt4L z%fRn(lrWy=s`?0W(7htMszh5bvd%iW)1NvDwac~Egdh3qo1}7$hpZNc<@HeIsHsYR zUr&-Tkg~2~Voh=ehu(-WH&^4Zk8=e3!XE}|(0N@R!AWukC+!{T2M$6k*m#5#0l82S zNt(T()z0O?#>DKW;KVuEZ_mdy{E#tmq-V_t@A#A9)@o#QWwn5{zVE?)Yfs|4%xZ4; zptte{I8{pp*`GV6G(%td(@Qs3$n}ELF0g9V8MQAiQn;V6E(Bln6as<>K)AE8HR*Q8<^u+ zo2)IY%={QYinnNXf~xMIeua8pCEYLeyJ2+{MZ-?eB;#KK03=h{O*}dMWWFjeJ6cW2 zY_)%3d)hcqb2_Ht);)14-=IJ&D%K`TLi70yMAY}U#9N%gJyLqNyNkc zNmHEoBB0@IS$_5yYLIh^{$eg1XlE^YV`^T|$JEAUp zukq}>Mms=*H5%7w!RTm6j<1q8=ej2kdCPYtD}Od5#Sao;DwYM>L|mL0->uyu26S2<0ncLPwPgA^`{Xy86zvfWHlE&Rq^@N~oK&+a?#$8B{Z`vXW6Fn-* z1R!JHT~=y-uHjhcAQLd1e|_lBp9S#QesBqS+RV5p(q;^* z`x;`)-I*+r8Z_)z@$JrtH=@m>3(Y+blvu|>Qo^-AYMs1~$AYjB5XkKSg?IVe;ye_tNT zpt~fbxl}@GFECOy&QZ1zg;Gz{>W};(|4atYunYf1mvh6Mog5Q$KGX+yA~Q|XF=5P_ zUd&h_tCyL%I^U+QxX1WK=@CC`(J&wtw9f?R*tslSODK~{)1p=#<)n(4Z#w^w+HfdL z)UiR-=?46IM()Rbo00i7{xrft;-C9unE*(3yo`K3+eZvP4Pm z&|Q8XY@w8+zO?n*(%7?0Po9t-J&5kF%(j_Ek+mxEewUhy7ORLoyf@bF#%_IPI))#( z;+#!Y@wGwh+iXL@a-Ltx%k!m44*p{dJc~>eRb)6%Mufb^%N}wgPNjzMOi^f>I*$TG z_`3FNzuNN?cI@ky76cZHjm>5k&3TTVW=}VG$9fV1>Wr{*L1SFD+#iPWs2^MIKgowl zvL%*RbFB?eFMSvXnkE%qPN-_fZk-Gt3$qX;$naivyGO#K5WIdOrwI;}L;~Y%msNi3 z&mHm=oMeh_1q+JK99e`D3bR*Sp-Oia?n#jGCfS(PQz9yLsJ)!P>0Xz$F7({k$xDu5!`!*g&o~rQhh{A@JXrS1>ly%oTTi(ow`w@he z-jdE1tXRD^rkom;G%MjM>t&}Zxgx_VO9-oSO?%4^K{PsE1<|>CA)d%uhJ$cD2R^nC zfcIr=v94NnD6+f>;^Jf-7T)rBSo7rqXD6RjY=5DSZD~t(4+o1Nld9qpV4JoFYf1g9 zmZ>tC{Soq8JIchR#xDesGtVqV;;fSXV->g`qZW#es{ zUyKPEi7VgwiIqbgQw4Y6;BIYk!>_9g)wn8>YplJY-A(?gR2SV>z?&~*j3#QLdh3oA zc6(13?JuIRuWe7lQYunII<2V9Q|}O#sqhtR>+rP6ozS{}APl9&W6dXHdC}FGQgYJ6t@#`J`4Xrm}z`dNM;{%B{M}=eGKg*Ji#qoK4D-)_j1@OT6zSiOl@njSt{} zQbVfu6_3B>xueo|>GI|aIch^vk15v=9J?v_y zIvg@yanP+b7SI9b-6GWQ-TREK#nR$?c;1}iO^iVy(h3N^R^2qKtc)QL+2`q?POb+v zgX)?^FWBgL{3Oi}i>8!N1@#!gdLf}a&YR|%FFlzGj=Gq<=L(9n0~O{-FBlmW=lGTf z?1RpdU5^@oN?puTOJ0`~mYcU21fHt19-`hS6=Q}PPm(^h#YEO~#snHRU)9PhYDBJC zmGTbi3e{h=lE2Q}O_4VV>fs}5fFOiNX3GZ;Jib8KYu*QafP%iAoymo9N$VxLGo&`FX0B zkcIk{b`k*YG#OztZ(cPtV!R1@(i^&PzWSPOH)wjrdayP*@qT z%TU9^{Fz1zR#7Q^hX?;;&2Sz3Ctd%8ID}-*+~vEdALQ$`5I;BBJHA>&t@)d^yN4%R zZrh8Q2>_`EPrubd!VqopkQo_IdOT%Eo!T7=P5CSt_01zi!jgH4$|xpX3&LPdrT zP90xDxftz1$!iygr{9M=Xma~|#~xPl7&ViJGL|VUhoxgY_tl(d2);w#w7|m`{@Fc% z>{O!$fv2k%Hu;`LFCg$xh`hU&^7mG@IF6I(;-2RouSmg@)*B1&Hd^!Ulzq$rbhX=Y z;rwV@--*M7;*m*)+ofIV4E^zvG6u@VrBBWqJd^v+NfX_Zd%jQb>w@;?H_iuT+bB*; zFyrci?EUNp+Q;2%__M>;k8fZs*LltLif`WsWOaeJ7AlvV=KZ>UR!D8^DI^R!%KO3& z;xX@<{1tqPwP4onUpTKB$cep8@!M1oIU?vAgmEul;?l&*{hmgaLh|uezFDc^ZR%Rm zSFV*YbQj{&U161RAEOO5p|NcEa}lWGy?eJP-jaEc5K7!?JtaN`4k~U5SSA^9l8qjp zCIg&%-~7~FuNuq#rhRQXwb1tK-{w`6JCZa1b@u%?p$#cu|21oVE_~DW*EbcD9GCPr z%e|2$%KtZHRRmW`6NWLw(Ne>Bo#dI4Wx zN@mwq%_efLPRJlL)9?aKJY&Sq=4L_O{Pz-ny0&c;py*Uy(`qELA^R)Q80z|D;$GM2 zn-f`g->OqBo)ziovHm|!#qWha;GEQWIM0gcyp|kD>1)pE`7u3#wIREVr%lrhdy?bG zZ&jNmt^GilG4xsR^(Z}Ui_GE6H180;Re}1GB`{vl8x|oa<@1eR+@~myERT}Sy?rvw zUUidS73CH^RaJ3;xyNBGY1>>i7!YNe_Ux+;49V{VagJq|_5Fq{ezRjRK2De2l`A() z+dvK;eVLwv{5)os(8fa!VRa$zl9H*LP2Ns5aW4S-JM{n=V~y__z*qf6`V{R`Cy8@r z;Y9^}eb|`6x>fY-jWSth#W=SC?)?;A8*18JXpYrxUp&7OnG#+FWD%3!quSi6BBM_# zZeyrZ?INH?^J3!mAImzLy@tF^_0=XGJ_EPsxRP-#tKLXcTujho6I-bA-u{rRF(*m} z;XNul2rVWt%QkQo9k+KOqPL#+%sSP7!QXJ~pQsVq_+e&f%7bJ+_~F7UuI-T-Au$-c zp^#oe1lH1V+I2yKN4w`LmPaZvdC7u}4Ys|UZrXDFIyRMoeQ;ihXw;mkt4r5kE6i6nZOtqy$JIf?)=%$AA zrL^;qzTk84&9_EFeYh?ARLu1Jgpq#z+5456w*?IHUds-WJ!u7L3hR@l5%Hz^+IwE; zUW8famhP<2G$i$0`%5;~>N_E}$&vEixpoE?TCSoMPj`6WyOzaQ|NZhpHA$IA(bZ$o z&)foIvSiN;iO5pQH@mv?`rM>r@q-?mNx+9|jq7rl6M7$c;sQ@4ZvB+yJQIr+m3W&2 z1(e9_ED=rY+BiAq5UUv9zgU2VH&+suuq=ON)|d4y|7<$nybX&j(crI7at7TD)adUJ zU-BsP5N0K<^v84myv!T=u&0P-1y?os!`2G3&!e(3T1Gjgl=W2J zko``Zt;R64+p>AlruX4tWnmpXw&iB%{|2x;Nj@x{EO9ER1 zuJ!G=2Y`e{mGJWq!VYAq+8IB7c?U~!5ganwV`($xTp=}f3U_1^*w%ktq$Jm3M`ScL zo@8)h&8nG}ri7{szyB`XFHy-K(&5%pc=%Rd0B1QFI@bSh&-L)!cm8fWK6h^-0$EF` z_iAPl?3TgsVjF9y59k!WNhi489|fBRwd|wlEbXW=*xJXZ7hyixFW^D3w{bFQ@!3Sy zzmm%(l#P#dxfil3?Zgm=m5`ecVi=RiFP7DJ!fcv7+AF*b$#PWD%w;zP4p;dLSaOc&rr$vT?;ofoQ1jxe zEBQL;+@5c(%L5x$u184N!8efL%{}k-&(9z2S^faz=y0@kWZdIGDd9zLx)B_@i^RsI&G{!%b9oC!v)4VJ!jRO}74%uRnpZ_~(MAE#}XU^!rx!Z|D1 z$=x}0Ft18S`P$&JRmQ=$d}fZd^wSoA$rAUET%LgNr)H`R)ATWdBa%uH?;Hwik36mY zetiLh58iYfW<=i|MlP40f7(zvc&+9y?o1T7+SVM7ap&^!pY&Po_1OQC`Aq)@;m%IS zYpz!CIOI;p_??9By(QGAi+i_cq2LsYPvk;ki}NSvGxoi@3J+OT%5kIahtd`KpF5Uu z|5p|m#)3=mpHfdCf*d?`Z~kQ6qqv91`J7+3ty()koE>XCGL{fEs7JW5{@=1^Jp=9h z>XC0587-O8Ioed!Bzn=I;F_0|J%6>7gCJeooxJu?|GZhI{(L#75xJ1Af1_#i;4=wv zaTPjtm#ufN#DCfImE8z4D{4y#l@aZiF$2}+le3s}|LT7-?zd;HXku=ArG$xzF%wtb zJG;w&Qo3+oc64-RduIFnEHum2fY zM?rv}x8c9z$Cmxq2M(@VjRD6+r zKBaV)R!_G;sw4*I+2JZYF~d0)^rVNrJ$vXhi0AKNoxi$Ckakk}npxl2r0p{sd$W=* zZJoiK>Mem8+t4wxf9;>I4)}&k@J))Wv{#+smUdpSG9PpT^p*58yHtVIOD+tCg6jqHb#qaKZ{-g!{H%P*K zwSl)St3KT@t+p|)5g~{%T!PHR{W_~_?W~Rc*27!aB!I&u&EpLN4~u|2gG{}*jRktz z(nUpzHDs99Qsmj(X6}4P6>;VAS_toWY8XBVEKh?WP=to;)Qzlxg@KY~tGxfkKV(+x zQ6mp8Rh^}U+yh$NJrZ5yWEkMq$cMwyYE7>~f4UkGC)55oC9#nFF}bGR7u;M|+dv$( z4en_2K@T-ri_$wjD;#!YkfF)U&R^<$n`vudTMBb)5lje+YTvCM*(+`Q3J0Djigw`> z5bUW~kS0f=)=KEbVQ`VtjRH(+d+#`#gUTZf^W--?AK@}21gjj0@IWg8myQAw=U}=V zV_b~fh88amO)_oo-RZQm|G?CD^Yqh)nsB`t48mCk1YO$1ETzAdE}7?D%w1X&99EV0 zr(xUhQrWoC-e2VUN>SsS4I7~tl5ZTIsdbLcgqQRN?&{8`rl8wOpfGche=HoVjl3Gg>oYY(a40pYw@`PZLqqaygP2 z@+lBUg?Y~G8g@i)J?i-RZ1&vgy943QB>ES^#G1g_1otYJS`NBLLC*g7b5R73&?Da* zC+5BNRQ_RXzHkYCW+w2iGh(_3}8d1ytujthZ!a}=~*@x5@bqLqc$l3|A9sX}kQhi0zwf+1zG z{Ueh(&sJ87lCZ@NOY8<49;s%i%HGdl;41h~9Z*`zN@bE9>kukEk-< zZLNKI9uugH=?#_$zZd8{*)yj4MK?oHN zUH4PDE#FYuh!tJ_MD-m1P6?Aix~K_Ki!J`nc-(nGI!Z0#>@3rP1OFOG-D?1e1Fa>kGNRYR=i<|25OsYlB57tY!?{=yq z^cdS25-?SP^MJIo+`NSbLglTE+1=+TpgsQJADws82;+6ZFFI5E@2Qa&;1c-K|7ub0w z9+9FPEfeh@eivNE|6C8``qNH5PWToj2Vw+Eq2L?&NNCj z5tA783jvH8E~pj}Vpe2JWRTD+3oyAYkR_+Z<2Tvg3wov%tGy^hBlJ{g>}*ABd9%Eo~Hxs3GIN z)IFRHY6Ba{4VUOO(Kp76>lS{bP~F^Dq#sX?IBKT-f!IiSg|FRDQDb#xuCI3EZ0x-# zYdH01ac>7kSsaY)jXzvRYk{`L7s?;kQ2;S+^K!DZ*Tb=tO4&_BvnjLQ2HMS>mY8QD zn?6uxc=2S_Qp|2L>CA#QPwV;he%$TWqX`q`zT6CITlTC!DqQ+MI3Y)yXq&qIF@X>G zI|+l@N(mpUYj@94+FFO86rDsGTAR#doxPhy9y|1wF-3yroIy+P=6R5jrm&1;WhSAg zs`b0`T5&`B!K`z^;3sh%3jG*96AP)*-nBP|B{Ztc0V|PzqP0JxQ!3X2BibcuPrLEs zXyRTf#?Eb@_Z|3^&NkVbOTaGtK

dKT8Mb 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 E0AGqG6951J literal 0 HcmV?d00001 diff --git a/docs/screenshots/issue-239/taskmanager-show-system.png b/docs/screenshots/issue-239/taskmanager-show-system.png new file mode 100644 index 0000000000000000000000000000000000000000..f25e0279a4a69869811939b3d92367ac3bd4817a GIT binary patch literal 86071 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 z

  • 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 void readonly githubStatus: GithubAuthStatus | null readonly portForwardInput: string + readonly projectTasksIncludeDefault: boolean readonly reloadDashboard: () => void readonly selectedProjectId: string | null readonly selectedProjectKey: string | null @@ -76,6 +77,7 @@ export type BrowserActionContext = { readonly setProjectBrowser: Setter readonly setProjectTaskLogs: Setter readonly setProjectTasks: Setter + readonly setProjectTasksIncludeDefault: Setter readonly setSelectedMenuIndex: Setter readonly setSelectedProject: Setter readonly setSelectedProjectId: Setter diff --git a/packages/app/src/web/actions-tasks.ts b/packages/app/src/web/actions-tasks.ts index c138dd29..37038be0 100644 --- a/packages/app/src/web/actions-tasks.ts +++ b/packages/app/src/web/actions-tasks.ts @@ -1,9 +1,14 @@ -import type { Effect } from "effect" +import { Effect } from "effect" -import { type BrowserActionContext, requireSelectedProjectId, withBusy } from "./actions-shared.js" +import { type BrowserActionContext, confirmAction, requireSelectedProjectId, withBusy } from "./actions-shared.js" import { loadProjectTaskLogs, loadProjectTasks, stopProjectTask } from "./api.js" import type { ContainerTaskSnapshot } from "./api.js" +type LoadSelectedProjectTasksOptions = { + readonly includeDefault?: boolean + readonly silent?: boolean +} + const requireProjectIdForTasks = (context: BrowserActionContext): string | null => { const projectId = requireSelectedProjectId(context) if (projectId === null) { @@ -66,16 +71,20 @@ const removeTaskFromSnapshot = ( const stopSelectedProjectTaskEffect = ( selected: SelectedProjectTaskAction -): Effect.Effect => stopProjectTask(selected.projectId, selected.pid) +): Effect.Effect => + stopProjectTask(selected.projectId, selected.pid).pipe( + Effect.flatMap(() => loadProjectTasks(selected.projectId, selected.context.projectTasksIncludeDefault)) + ) const loadSelectedProjectTaskLogsEffect = ( selected: SelectedProjectTaskAction ): Effect.Effect => loadProjectTaskLogs(selected.projectId, selected.pid, 200) const applyStoppedProjectTask = ( - selected: SelectedProjectTaskAction + selected: SelectedProjectTaskAction, + snapshot: ContainerTaskSnapshot ): void => { - selected.context.setProjectTasks((snapshot) => removeTaskFromSnapshot(snapshot, selected.pid)) + selected.context.setProjectTasks(removeTaskFromSnapshot(snapshot, selected.pid)) selected.context.setMessage(`Sent SIGTERM to PID ${selected.pid}.`) } @@ -87,18 +96,16 @@ const applyLoadedProjectTaskLogs = ( selected.context.setMessage(`Loaded logs for PID ${selected.pid}.`) } -export const loadSelectedProjectTasks = ( +export const loadProjectTasksById = ( context: BrowserActionContext, - options?: { readonly silent?: boolean } + projectId: string, + options?: LoadSelectedProjectTasksOptions ) => { - const projectId = requireProjectIdForTasks(context) - if (projectId === null) { - return - } + const includeDefault = options?.includeDefault ?? context.projectTasksIncludeDefault withBusy({ context, - effect: loadProjectTasks(projectId), - label: "Loading container tasks", + effect: loadProjectTasks(projectId, includeDefault), + label: includeDefault ? "Loading all container tasks" : "Loading container tasks", onSuccess: (snapshot) => { context.setProjectTasks(snapshot) if (options?.silent !== true) { @@ -108,16 +115,46 @@ export const loadSelectedProjectTasks = ( }) } +export const loadSelectedProjectTasks = ( + context: BrowserActionContext, + options?: LoadSelectedProjectTasksOptions +) => { + const projectId = requireProjectIdForTasks(context) + if (projectId === null) { + return + } + loadProjectTasksById(context, projectId, options) +} + +export const setSelectedProjectTasksIncludeDefault = ( + context: BrowserActionContext, + includeDefault: boolean +) => { + context.setProjectTasksIncludeDefault(includeDefault) + context.setProjectTaskLogs("") + const projectId = requireProjectIdForTasks(context) + if (projectId === null) { + return + } + loadProjectTasksById(context, projectId, { includeDefault }) +} + export const stopSelectedProjectTask = ( context: BrowserActionContext, pid: number ) => { - withSelectedProjectTaskBusy({ - context, - effect: stopSelectedProjectTaskEffect, - label: "Stopping container task", - onSuccess: applyStoppedProjectTask, - pid + withSelectedProjectTask(context, pid, (selected) => { + if (!confirmAction(`Stop PID ${selected.pid}?`)) { + return + } + withBusy({ + context: selected.context, + effect: stopSelectedProjectTaskEffect(selected), + label: "Stopping container task", + onSuccess: (snapshot) => { + applyStoppedProjectTask(selected, snapshot) + } + }) }) } diff --git a/packages/app/src/web/actions.ts b/packages/app/src/web/actions.ts index 08feae70..ad77c9f3 100644 --- a/packages/app/src/web/actions.ts +++ b/packages/app/src/web/actions.ts @@ -31,7 +31,13 @@ export { } from "./actions-databases.js" export { closeSelectedProjectPort, loadSelectedProjectPorts, openSelectedProjectPort } from "./actions-port-forwards.js" export { attachProjectTerminalById, connectProjectById, loadSelectedProjectInfo } from "./actions-projects.js" -export { loadSelectedProjectTaskLogs, loadSelectedProjectTasks, stopSelectedProjectTask } from "./actions-tasks.js" +export { + loadProjectTasksById, + loadSelectedProjectTaskLogs, + loadSelectedProjectTasks, + setSelectedProjectTasksIncludeDefault, + stopSelectedProjectTask +} from "./actions-tasks.js" export const runBrowserMenuAction = ( currentMenu: BrowserMenuTag, diff --git a/packages/app/src/web/api-tasks.ts b/packages/app/src/web/api-tasks.ts index f7e88224..6e87e87d 100644 --- a/packages/app/src/web/api-tasks.ts +++ b/packages/app/src/web/api-tasks.ts @@ -3,10 +3,13 @@ import { Effect } from "effect" import { requestJson, requestText } from "./api-http.js" import { ContainerTaskSnapshotResponseSchema, OutputResponseSchema } from "./api-schema.js" -export const loadProjectTasks = (projectId: string) => +const projectTasksPath = (projectId: string, includeDefault: boolean): string => + `/projects/${encodeURIComponent(projectId)}/tasks${includeDefault ? "?includeDefault=true" : ""}` + +export const loadProjectTasks = (projectId: string, includeDefault = false) => requestJson( "GET", - `/projects/${encodeURIComponent(projectId)}/tasks`, + projectTasksPath(projectId, includeDefault), ContainerTaskSnapshotResponseSchema ).pipe( Effect.map((response) => response.snapshot) diff --git a/packages/app/src/web/app-ready-actions.ts b/packages/app/src/web/app-ready-actions.ts index f8321b58..d1d4b1e5 100644 --- a/packages/app/src/web/app-ready-actions.ts +++ b/packages/app/src/web/app-ready-actions.ts @@ -11,6 +11,7 @@ type ActionContextArgs = { readonly addTerminalSession: BrowserActionContext["addTerminalSession"] readonly githubStatus: BrowserActionContext["githubStatus"] readonly portForwardInput: BrowserActionContext["portForwardInput"] + readonly projectTasksIncludeDefault: BrowserActionContext["projectTasksIncludeDefault"] readonly refreshDashboard: () => void readonly selectedProjectId: string | null readonly selectedProjectKey: string | null @@ -33,6 +34,7 @@ type ActionContextArgs = { readonly setProjectBrowser: BrowserActionContext["setProjectBrowser"] readonly setProjectTaskLogs: BrowserActionContext["setProjectTaskLogs"] readonly setProjectTasks: BrowserActionContext["setProjectTasks"] + readonly setProjectTasksIncludeDefault: BrowserActionContext["setProjectTasksIncludeDefault"] readonly setSelectedMenuIndex: BrowserActionContext["setSelectedMenuIndex"] readonly setSelectedProject: BrowserActionContext["setSelectedProject"] readonly setSelectedProjectId: BrowserActionContext["setSelectedProjectId"] @@ -47,6 +49,7 @@ export const createActionContext = (args: ActionContextArgs): BrowserActionConte databaseLabelInput: args.databaseLabelInput, githubStatus: args.githubStatus, portForwardInput: args.portForwardInput, + projectTasksIncludeDefault: args.projectTasksIncludeDefault, reloadDashboard: args.refreshDashboard, selectedProjectId: args.selectedProjectId, selectedProjectKey: args.selectedProjectKey, @@ -69,6 +72,7 @@ export const createActionContext = (args: ActionContextArgs): BrowserActionConte setProjectBrowser: args.setProjectBrowser, setProjectTaskLogs: args.setProjectTaskLogs, setProjectTasks: args.setProjectTasks, + setProjectTasksIncludeDefault: args.setProjectTasksIncludeDefault, setSelectedMenuIndex: args.setSelectedMenuIndex, setSelectedProject: args.setSelectedProject, setSelectedProjectId: args.setSelectedProjectId diff --git a/packages/app/src/web/app-ready-controller-context.ts b/packages/app/src/web/app-ready-controller-context.ts index 569fb3e2..ff6978dd 100644 --- a/packages/app/src/web/app-ready-controller-context.ts +++ b/packages/app/src/web/app-ready-controller-context.ts @@ -17,6 +17,7 @@ export const createReadyActionContext = ( databaseLabelInput: state.databaseLabelInput, githubStatus: state.githubStatus, portForwardInput: state.portForwardInput, + projectTasksIncludeDefault: state.projectTasksIncludeDefault, refreshDashboard, selectedProjectId: state.selectedProjectId, selectedProjectKey: selectedProjectSummary?.projectKey ?? null, @@ -39,6 +40,7 @@ export const createReadyActionContext = ( setProjectBrowser: state.setProjectBrowser, setProjectTaskLogs: state.setProjectTaskLogs, setProjectTasks: state.setProjectTasks, + setProjectTasksIncludeDefault: state.setProjectTasksIncludeDefault, setSelectedMenuIndex: state.setSelectedMenuIndex, setSelectedProject: state.setSelectedProject, setSelectedProjectId: state.setSelectedProjectId diff --git a/packages/app/src/web/app-ready-controller.ts b/packages/app/src/web/app-ready-controller.ts index 782f3267..f557e0e1 100644 --- a/packages/app/src/web/app-ready-controller.ts +++ b/packages/app/src/web/app-ready-controller.ts @@ -5,6 +5,7 @@ import { attachProjectTerminalById, connectProjectById, loadSelectedProjectBrowser, + loadProjectTasksById, loadSelectedProjectPorts, openProjectBrowserById, openSelectedProjectBrowser, @@ -39,7 +40,9 @@ import { useSshLink } from "./app-ready-ssh-link-hook.js" import { bindTaskActions } from "./app-ready-task-actions.js" import { useProjectTasksReset } from "./app-ready-tasks-hook.js" import { useReadyUrlSync } from "./app-ready-url.js" +import { browserMenuIndex } from "./menu.js" import { filterDashboardProjectsByQuery } from "./project-search.js" +import { projectPickerScreen } from "./screen.js" type ReadyControllerArgs = { readonly dashboard: DashboardData @@ -99,7 +102,8 @@ const useReadyResetEffects = (args: ReadySideEffectsArgs) => { useProjectTasksReset( args.state.selectedProjectId, args.state.setProjectTaskLogs, - args.state.setProjectTasks + args.state.setProjectTasks, + args.state.setProjectTasksIncludeDefault ) } @@ -127,6 +131,7 @@ const useReadyAutoloadEffects = (args: ReadySideEffectsArgs) => { const useReadyShortcutEffects = (args: ReadySideEffectsArgs) => { useBrowserShortcuts({ activeScreen: args.state.activeScreen, + activeTerminalSessionId: args.state.activeTerminalSessionId, actionPrompt: args.state.actionPrompt, context: args.actionContext, controllerCwd: args.dashboard.health.cwd, @@ -257,6 +262,17 @@ const bindTerminalActions = ( onOpenProjectTerminalById: (projectId: string, projectKey?: string) => { connectProjectById(projectId, actionContext, projectKey) }, + onOpenProjectTaskManagerById: (projectId: string) => { + state.setSelectedProjectId(projectId) + state.setSelectedMenuIndex(browserMenuIndex("Tasks")) + state.setProjectNavigationArmed(true) + state.setActiveScreen(projectPickerScreen()) + state.deactivateTerminalWorkspace() + state.setProjectTasks(null) + state.setProjectTaskLogs("") + state.setProjectTasksIncludeDefault(false) + loadProjectTasksById(actionContext, projectId, { includeDefault: false }) + }, onAttachProjectTerminalSession: ( projectId: string, projectKey: string, diff --git a/packages/app/src/web/app-ready-layout.tsx b/packages/app/src/web/app-ready-layout.tsx index 4c5831df..ca31969d 100644 --- a/packages/app/src/web/app-ready-layout.tsx +++ b/packages/app/src/web/app-ready-layout.tsx @@ -68,6 +68,7 @@ export type ReadyLayoutProps = { readonly onOpenProjectBrowserById: (projectId: string) => void readonly onOpenProjectBrowser: () => void readonly onOpenProjectDatabaseEditor: () => void + readonly onOpenProjectTaskManagerById: (projectId: string) => void readonly onKillProjectTerminalSession: (projectId: string, projectKey: string, sessionId: string) => void readonly onOpenProjectPortForward: () => void readonly onOpenProjectTerminalById: (projectId: string, projectKey?: string) => void @@ -77,6 +78,7 @@ export type ReadyLayoutProps = { readonly onRefreshProjectBrowser: () => void readonly onRefreshProjectDatabases: () => void readonly onRefreshProjectTasks: () => void + readonly onProjectTasksIncludeDefaultChange: (includeDefault: boolean) => void readonly onRestartProjectDatabaseEditor: () => void readonly onSaveDatabaseProfile: () => void readonly onSetActiveScreen: (screen: BrowserScreen) => void @@ -97,6 +99,7 @@ export type ReadyLayoutProps = { readonly projectBrowser: ProjectBrowserSession | null readonly projectTaskLogs: string readonly projectTasks: ContainerTaskSnapshot | null + readonly projectTasksIncludeDefault: boolean readonly selectedMenuIndex: number readonly selectedProjectId: string | null readonly selectedProjectSummary: DashboardData["projects"][number] | undefined diff --git a/packages/app/src/web/app-ready-main-panels.tsx b/packages/app/src/web/app-ready-main-panels.tsx index 131b2c3e..83488739 100644 --- a/packages/app/src/web/app-ready-main-panels.tsx +++ b/packages/app/src/web/app-ready-main-panels.tsx @@ -152,7 +152,9 @@ const DatabaseDetails = (props: MainPanelsProps): JSX.Element => ( const TaskDetails = (props: MainPanelsProps): JSX.Element => ( = Dispatch> export type BrowserShortcutArgs = { readonly activeScreen: BrowserScreen + readonly activeTerminalSessionId: string | null readonly actionPrompt: ActionPromptState | null readonly context: BrowserActionContext readonly controllerCwd: string @@ -50,10 +51,10 @@ type MenuOpenArgs = Pick< > const shouldIgnoreShortcut = ( + activeTerminalSessionId: string | null, actionPrompt: ActionPromptState | null, - event: KeyboardEvent, - terminalSessions: ReadonlyArray -): boolean => terminalSessions.length > 0 || isBlockedShortcut(event, actionPrompt !== null) + event: KeyboardEvent +): boolean => activeTerminalSessionId !== null || isBlockedShortcut(event, actionPrompt !== null) const openSelectedMenuScreen = ({ context, @@ -282,7 +283,7 @@ const dispatchActiveScreenShortcut = (event: KeyboardEvent, args: BrowserShortcu } export const dispatchBrowserShortcut = (event: KeyboardEvent, args: BrowserShortcutArgs): void => { - if (shouldIgnoreShortcut(args.actionPrompt, event, args.terminalSessions)) { + if (shouldIgnoreShortcut(args.activeTerminalSessionId, args.actionPrompt, event)) { return } dispatchActiveScreenShortcut(event, args) diff --git a/packages/app/src/web/app-ready-state.ts b/packages/app/src/web/app-ready-state.ts index 8e628b6f..eb7c33c1 100644 --- a/packages/app/src/web/app-ready-state.ts +++ b/packages/app/src/web/app-ready-state.ts @@ -42,6 +42,7 @@ type ReadyStateSetters = Pick< | "setProjectBrowser" | "setProjectTaskLogs" | "setProjectTasks" + | "setProjectTasksIncludeDefault" | "setSelectedMenuIndex" | "setSelectedProject" | "setSelectedProjectId" @@ -69,6 +70,7 @@ export type ReadyState = ReadyStateSetters & TerminalWorkspaceReadyState & { readonly projectBrowser: ProjectBrowserSession | null readonly projectTaskLogs: string readonly projectTasks: ContainerTaskSnapshot | null + readonly projectTasksIncludeDefault: boolean readonly setActionPrompt: Setter readonly setActiveScreen: Setter readonly setCreateView: Setter diff --git a/packages/app/src/web/app-ready-task-actions.ts b/packages/app/src/web/app-ready-task-actions.ts index 5e578332..4d108a3e 100644 --- a/packages/app/src/web/app-ready-task-actions.ts +++ b/packages/app/src/web/app-ready-task-actions.ts @@ -1,4 +1,9 @@ -import { loadSelectedProjectTaskLogs, loadSelectedProjectTasks, stopSelectedProjectTask } from "./actions.js" +import { + loadSelectedProjectTaskLogs, + loadSelectedProjectTasks, + setSelectedProjectTasksIncludeDefault, + stopSelectedProjectTask +} from "./actions.js" import type { createActionContext } from "./app-ready-actions.js" export const bindTaskActions = ( @@ -10,6 +15,9 @@ export const bindTaskActions = ( onRefreshProjectTasks: () => { loadSelectedProjectTasks(actionContext) }, + onProjectTasksIncludeDefaultChange: (includeDefault: boolean) => { + setSelectedProjectTasksIncludeDefault(actionContext, includeDefault) + }, onStopProjectTask: (pid: number) => { stopSelectedProjectTask(actionContext, pid) } diff --git a/packages/app/src/web/app-ready-tasks-hook.ts b/packages/app/src/web/app-ready-tasks-hook.ts index 80a1dcf9..401a1484 100644 --- a/packages/app/src/web/app-ready-tasks-hook.ts +++ b/packages/app/src/web/app-ready-tasks-hook.ts @@ -16,19 +16,29 @@ type TasksPanelAutoloadArgs = { export const useProjectTasksState = () => { const [projectTasks, setProjectTasks] = useState(null) const [projectTaskLogs, setProjectTaskLogs] = useState("") + const [projectTasksIncludeDefault, setProjectTasksIncludeDefault] = useState(false) - return { projectTaskLogs, projectTasks, setProjectTaskLogs, setProjectTasks } + return { + projectTaskLogs, + projectTasks, + projectTasksIncludeDefault, + setProjectTaskLogs, + setProjectTasks, + setProjectTasksIncludeDefault + } } export const useProjectTasksReset = ( selectedProjectId: string | null, setProjectTaskLogs: (value: string) => void, - setProjectTasks: (value: ContainerTaskSnapshot | null) => void + setProjectTasks: (value: ContainerTaskSnapshot | null) => void, + setProjectTasksIncludeDefault: (value: boolean) => void ) => { useEffect(() => { setProjectTaskLogs("") setProjectTasks(null) - }, [selectedProjectId, setProjectTaskLogs, setProjectTasks]) + setProjectTasksIncludeDefault(false) + }, [selectedProjectId, setProjectTaskLogs, setProjectTasks, setProjectTasksIncludeDefault]) } export const maybeLoadProjectTasks = ( diff --git a/packages/app/src/web/app-ready-terminal-screen.tsx b/packages/app/src/web/app-ready-terminal-screen.tsx index 731ea7ae..4bfc0311 100644 --- a/packages/app/src/web/app-ready-terminal-screen.tsx +++ b/packages/app/src/web/app-ready-terminal-screen.tsx @@ -15,6 +15,7 @@ type TerminalScreenProps = Pick< ReadyLayoutProps, | "activeTerminalSessionId" | "onOpenProjectBrowserById" + | "onOpenProjectTaskManagerById" | "onOpenProjectTerminalById" | "onSelectTerminal" | "onSetActiveScreen" @@ -29,6 +30,7 @@ type TerminalPaneProps = & Pick< TerminalScreenProps, | "onOpenProjectBrowserById" + | "onOpenProjectTaskManagerById" | "onOpenProjectTerminalById" | "onSetActiveScreen" | "onTerminalClose" @@ -207,6 +209,7 @@ const TerminalTabs = ( const TerminalPane = ( { onOpenProjectBrowserById, + onOpenProjectTaskManagerById, onOpenProjectTerminalById, onSetActiveScreen, onTerminalClose, @@ -250,6 +253,11 @@ const TerminalPane = ( : () => { onOpenProjectBrowserById(browserProjectId) }} + onOpenTaskManager={browserProjectId === undefined + ? undefined + : () => { + onOpenProjectTaskManagerById(browserProjectId) + }} onOpenTerminal={browserProjectId === undefined ? undefined : () => { @@ -289,6 +297,7 @@ export const TerminalScreen = (props: TerminalScreenProps): JSX.Element | null = void readonly onOpenProjectBrowser: () => void readonly onOpenProjectDatabaseEditor: () => void + readonly onOpenProjectTaskManagerById: (projectId: string) => void readonly onCloseProjectPortForward: (targetPort: number) => void readonly onKillProjectTerminalSession: (projectId: string, projectKey: string, sessionId: string) => void readonly onOpenProjectPortForward: () => void @@ -46,6 +47,7 @@ type ReadyLayoutRenderArgs = { readonly onRefreshProjectBrowser: () => void readonly onRefreshProjectDatabases: () => void readonly onRefreshProjectTasks: () => void + readonly onProjectTasksIncludeDefaultChange: (includeDefault: boolean) => void readonly onRestartProjectDatabaseEditor: () => void readonly onRunAuthAction: (index: number) => void readonly onRunCurrentMenuAction: () => void @@ -81,6 +83,7 @@ const readyActionProps = (actions: ReadyLayoutRenderArgs["actions"]) => ({ onOpenProjectBrowserById: actions.onOpenProjectBrowserById, onOpenProjectBrowser: actions.onOpenProjectBrowser, onOpenProjectDatabaseEditor: actions.onOpenProjectDatabaseEditor, + onOpenProjectTaskManagerById: actions.onOpenProjectTaskManagerById, onKillProjectTerminalSession: actions.onKillProjectTerminalSession, onOpenProjectPortForward: actions.onOpenProjectPortForward, onOpenProjectTerminalById: actions.onOpenProjectTerminalById, @@ -90,6 +93,7 @@ const readyActionProps = (actions: ReadyLayoutRenderArgs["actions"]) => ({ onRefreshProjectBrowser: actions.onRefreshProjectBrowser, onRefreshProjectDatabases: actions.onRefreshProjectDatabases, onRefreshProjectTasks: actions.onRefreshProjectTasks, + onProjectTasksIncludeDefaultChange: actions.onProjectTasksIncludeDefaultChange, onRestartProjectDatabaseEditor: actions.onRestartProjectDatabaseEditor, onRunAuthAction: actions.onRunAuthAction, onRunCurrentMenuAction: actions.onRunCurrentMenuAction, @@ -128,6 +132,7 @@ const readyStateProps = (state: ReadyLayoutRenderArgs["state"]) => ({ projectBrowser: state.projectBrowser, projectTaskLogs: state.projectTaskLogs, projectTasks: state.projectTasks, + projectTasksIncludeDefault: state.projectTasksIncludeDefault, projectNavigationArmed: state.projectNavigationArmed, projectSearchQuery: state.projectSearchQuery, selectedMenuIndex: state.selectedMenuIndex, diff --git a/packages/app/src/web/panel-tasks.tsx b/packages/app/src/web/panel-tasks.tsx index 60c7b66a..39811f92 100644 --- a/packages/app/src/web/panel-tasks.tsx +++ b/packages/app/src/web/panel-tasks.tsx @@ -1,10 +1,12 @@ -import type { JSX } from "react" +import type { CSSProperties, JSX } from "react" import { Box, Text } from "../ui/primitives.js" import type { ContainerTask, ContainerTaskSnapshot, ProjectDetails, ProjectSummary } from "./api.js" type TaskPanelProps = { + readonly includeDefault: boolean readonly logs: string + readonly onIncludeDefaultChange: (includeDefault: boolean) => void readonly onLoadLogs: (pid: number) => void readonly onRefreshTasks: () => void readonly onStopTask: (pid: number) => void @@ -28,6 +30,39 @@ const kindColor = (kind: ContainerTask["kind"]): string => { const compactCommand = (command: string): string => command.length <= 120 ? command : `${command.slice(0, 117)}...` +const systemToggleStyle: CSSProperties = { + alignItems: "center", + color: "#d6e5f7", + cursor: "pointer", + display: "flex", + gap: "6px", + whiteSpace: "nowrap" +} + +const systemToggleInputStyle: CSSProperties = { + accentColor: "#78f0a3", + cursor: "pointer" +} + +const TaskSystemToggle = ( + { + includeDefault, + onIncludeDefaultChange + }: Pick +): JSX.Element => ( + +) + const TaskRow = ( { onLoadLogs, @@ -152,7 +187,9 @@ const taskPanelSummary = ( export const TaskPanel = ( { + includeDefault, logs, + onIncludeDefaultChange, onLoadLogs, onRefreshTasks, onStopTask, @@ -166,8 +203,11 @@ export const TaskPanel = ( Container tasks - - refresh + + + + refresh + diff --git a/packages/app/src/web/panel-terminal.tsx b/packages/app/src/web/panel-terminal.tsx index bb442a94..771a264d 100644 --- a/packages/app/src/web/panel-terminal.tsx +++ b/packages/app/src/web/panel-terminal.tsx @@ -25,6 +25,7 @@ type TerminalPanelProps = { readonly onKill: () => void readonly onMessage: (message: string) => void readonly onOpenBrowser?: (() => void) | undefined + readonly onOpenTaskManager?: (() => void) | undefined readonly onOpenTerminal?: (() => void) | undefined readonly session: ActiveTerminalSession } @@ -56,8 +57,9 @@ const headerStyle: CSSProperties = { const compactHeaderStyle: CSSProperties = { ...headerStyle, + flexWrap: "wrap", gap: "6px", - overflow: "hidden", + overflow: "visible", padding: "5px 6px" } @@ -106,7 +108,7 @@ const headerActionsStyle: CSSProperties = { const compactHeaderActionsStyle: CSSProperties = { ...headerActionsStyle, - flexWrap: "nowrap", + flexWrap: "wrap", gap: "4px" } @@ -245,9 +247,13 @@ const TerminalHeaderActions = ( onDetach, onKill, onOpenBrowser, + onOpenTaskManager, onOpenTerminal, session - }: Pick & { + }: Pick< + TerminalPanelProps, + "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" + > & { readonly compactHeaderMode: boolean } ): JSX.Element => ( @@ -259,6 +265,13 @@ const TerminalHeaderActions = ( {compactHeaderMode ? "Browser" : "Open browser"} )} + {session.browserProjectId === undefined || onOpenTaskManager === undefined + ? null + : ( + + {compactHeaderMode ? "Tasks" : "Task manager"} + + )} {session.browserProjectId === undefined || onOpenTerminal === undefined ? null : ( @@ -281,10 +294,14 @@ const TerminalHeader = ( onDetach, onKill, onOpenBrowser, + onOpenTaskManager, onOpenTerminal, session, status - }: Pick & { + }: Pick< + TerminalPanelProps, + "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" + > & { readonly compactHeaderMode: boolean readonly status: TerminalStatus } @@ -296,6 +313,7 @@ const TerminalHeader = ( onDetach={onDetach} onKill={onKill} onOpenBrowser={onOpenBrowser} + onOpenTaskManager={onOpenTaskManager} onOpenTerminal={onOpenTerminal} session={session} /> @@ -409,6 +427,7 @@ export const TerminalPanel = ( onKill, onMessage, onOpenBrowser, + onOpenTaskManager, onOpenTerminal, session }: TerminalPanelProps @@ -510,6 +529,7 @@ export const TerminalPanel = ( onKill() }} onOpenBrowser={onOpenBrowser} + onOpenTaskManager={onOpenTaskManager} onOpenTerminal={onOpenTerminal} session={session} status={status} diff --git a/packages/app/tests/docker-git/actions-tasks.test.ts b/packages/app/tests/docker-git/actions-tasks.test.ts new file mode 100644 index 00000000..2f66b0b0 --- /dev/null +++ b/packages/app/tests/docker-git/actions-tasks.test.ts @@ -0,0 +1,167 @@ +import { describe, expect, it } from "@effect/vitest" +import { Effect } from "effect" +import { afterEach, beforeEach, vi } from "vitest" + +import { + loadSelectedProjectTaskLogs, + loadSelectedProjectTasks, + setSelectedProjectTasksIncludeDefault, + stopSelectedProjectTask +} from "../../src/web/actions-tasks.js" +import type { ContainerTaskSnapshot } from "../../src/web/api.js" +import { makeBrowserActionContext, waitForAssertion } from "./browser-action-context-fixture.js" + +const loadProjectTaskLogsMock = vi.hoisted(() => vi.fn()) +const loadProjectTasksMock = vi.hoisted(() => vi.fn()) +const stopProjectTaskMock = vi.hoisted(() => vi.fn()) + +vi.mock("../../src/web/api.js", () => ({ + loadProjectTaskLogs: loadProjectTaskLogsMock, + loadProjectTasks: loadProjectTasksMock, + stopProjectTask: stopProjectTaskMock +})) + +const taskSnapshot = ( + tasks: ContainerTaskSnapshot["tasks"] +): ContainerTaskSnapshot => ({ + containerName: "project-dev", + generatedAt: "2026-05-05T00:00:00.000Z", + projectId: "project-1", + sshConnections: 1, + tasks +}) + +const task = ( + pid: number, + command: string +): ContainerTaskSnapshot["tasks"][number] => ({ + command, + etime: "00:01", + etimes: 1, + kind: "background", + logAvailable: false, + pid, + ppid: 1, + tty: "?", + user: "dev" +}) + +describe("web task actions", () => { + beforeEach(() => { + loadProjectTaskLogsMock.mockReset() + loadProjectTasksMock.mockReset() + stopProjectTaskMock.mockReset() + vi.stubGlobal("confirm", vi.fn(() => true)) + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it.effect("loads selected project tasks with the active system visibility flag", () => + Effect.gen(function*(_) { + const snapshot = taskSnapshot([task(42, "node server.js")]) + loadProjectTasksMock.mockImplementation(() => Effect.succeed(snapshot)) + const setProjectTasks = vi.fn() + const { context, setMessage } = makeBrowserActionContext({ + projectTasksIncludeDefault: true, + selectedProjectId: "project-1", + setProjectTasks + }) + + loadSelectedProjectTasks(context) + + yield* _(waitForAssertion(() => { + expect(setProjectTasks).toHaveBeenCalledWith(snapshot) + })) + + expect(loadProjectTasksMock).toHaveBeenCalledWith("project-1", true) + expect(setMessage).toHaveBeenLastCalledWith("Loaded 1 container task(s).") + })) + + it.effect("toggles system process visibility and reloads tasks", () => + Effect.gen(function*(_) { + const snapshot = taskSnapshot([task(1, "init"), task(42, "node server.js")]) + loadProjectTasksMock.mockImplementation(() => Effect.succeed(snapshot)) + const setProjectTaskLogs = vi.fn() + const setProjectTasks = vi.fn() + const setProjectTasksIncludeDefault = vi.fn() + const { context } = makeBrowserActionContext({ + selectedProjectId: "project-1", + setProjectTaskLogs, + setProjectTasks, + setProjectTasksIncludeDefault + }) + + setSelectedProjectTasksIncludeDefault(context, true) + + yield* _(waitForAssertion(() => { + expect(setProjectTasks).toHaveBeenCalledWith(snapshot) + })) + + expect(setProjectTasksIncludeDefault).toHaveBeenCalledWith(true) + expect(setProjectTaskLogs).toHaveBeenCalledWith("") + expect(loadProjectTasksMock).toHaveBeenCalledWith("project-1", true) + })) + + it.effect("stops a task and refreshes the snapshot before updating state", () => + Effect.gen(function*(_) { + const refreshed = taskSnapshot([task(42, "sleep 100"), task(43, "node server.js")]) + stopProjectTaskMock.mockImplementation(() => Effect.void) + loadProjectTasksMock.mockImplementation(() => Effect.succeed(refreshed)) + const setProjectTasks = vi.fn() + const { context, setMessage } = makeBrowserActionContext({ + selectedProjectId: "project-1", + setProjectTasks + }) + + stopSelectedProjectTask(context, 42) + + yield* _(waitForAssertion(() => { + expect(setProjectTasks).toHaveBeenCalled() + })) + + expect(stopProjectTaskMock).toHaveBeenCalledWith("project-1", 42) + expect(loadProjectTasksMock).toHaveBeenCalledWith("project-1", false) + expect(setProjectTasks).toHaveBeenLastCalledWith({ + ...refreshed, + tasks: [task(43, "node server.js")] + }) + expect(setMessage).toHaveBeenLastCalledWith("Sent SIGTERM to PID 42.") + })) + + it.effect("loads task logs into task log state", () => + Effect.gen(function*(_) { + loadProjectTaskLogsMock.mockImplementation(() => Effect.succeed("line one\nline two")) + const setProjectTaskLogs = vi.fn() + const { context, setMessage } = makeBrowserActionContext({ + selectedProjectId: "project-1", + setProjectTaskLogs + }) + + loadSelectedProjectTaskLogs(context, 42) + + yield* _(waitForAssertion(() => { + expect(setProjectTaskLogs).toHaveBeenCalledWith("line one\nline two") + })) + + expect(loadProjectTaskLogsMock).toHaveBeenCalledWith("project-1", 42, 200) + expect(setMessage).toHaveBeenLastCalledWith("Loaded logs for PID 42.") + })) + + it("clears task state when no project is selected", () => { + const setProjectTaskLogs = vi.fn() + const setProjectTasks = vi.fn() + const { context, setMessage } = makeBrowserActionContext({ + setProjectTaskLogs, + setProjectTasks + }) + + loadSelectedProjectTasks(context) + + expect(loadProjectTasksMock).not.toHaveBeenCalled() + expect(setProjectTaskLogs).toHaveBeenCalledWith("") + expect(setProjectTasks).toHaveBeenCalledWith(null) + expect(setMessage).toHaveBeenLastCalledWith("No project selected.") + }) +}) diff --git a/packages/app/tests/docker-git/app-ready-create.test.ts b/packages/app/tests/docker-git/app-ready-create.test.ts index acb41e7b..19b7d9da 100644 --- a/packages/app/tests/docker-git/app-ready-create.test.ts +++ b/packages/app/tests/docker-git/app-ready-create.test.ts @@ -1,36 +1,55 @@ import type { Dispatch, SetStateAction } from "react" import { describe, expect, it, vi } from "vitest" -import { createInitialFlowView, type CreateFlowView, resolveCreateFlowSteps } from "../../src/docker-git/menu-create-shared.js" -import type { BrowserActionContext } from "../../src/web/actions.js" +import { + type CreateFlowView, + createInitialFlowView, + resolveCreateFlowSteps +} from "../../src/docker-git/menu-create-shared.js" import { submitCreateView } from "../../src/web/app-ready-create.js" +import { makeBrowserActionContext } from "./browser-action-context-fixture.js" -const createBrowserActionContext = (): BrowserActionContext => ({ - githubStatus: { - tokens: [{ status: "valid" }] - } as never, - setActionPrompt: vi.fn(), - setActiveScreen: vi.fn(), - setMessage: vi.fn(), - setSelectedMenuIndex: vi.fn() -} as unknown as BrowserActionContext) +const validGithubStatus = { + summary: "valid", + tokens: [{ key: "default", label: "default", login: "octocat", status: "valid" }] +} as const + +const createSetCreateViewSpy = () => { + const spy = vi.fn<(value: SetStateAction) => void>() + const setCreateView: Dispatch> = spy + return { setCreateView, spy } +} + +const requireCreateViewValue = ( + value: SetStateAction | undefined +): CreateFlowView => { + if (value === undefined || typeof value === "function") { + throw new Error("Expected CreateFlowView value.") + } + return value +} + +const submitCreateBuffer = (buffer: string) => { + const { context } = makeBrowserActionContext({ githubStatus: validGithubStatus }) + const { setCreateView, spy: setCreateViewSpy } = createSetCreateViewSpy() + + submitCreateView({ + context, + controllerCwd: "/workspace", + createView: createInitialFlowView(buffer), + projectsRoot: "/home/dev/.docker-git", + setCreateView + }) + + return { context, setCreateViewSpy } +} describe("app-ready-create", () => { it("advances to the next create field on Enter for a repo URL", () => { - const context = createBrowserActionContext() - const setCreateViewSpy = vi.fn() - const setCreateView = setCreateViewSpy as unknown as Dispatch> - - submitCreateView({ - context, - controllerCwd: "/workspace", - createView: createInitialFlowView("https://github.com/org/repo/tree/feature-x --force"), - projectsRoot: "/home/dev/.docker-git", - setCreateView - }) + const { context, setCreateViewSpy } = submitCreateBuffer("https://github.com/org/repo/tree/feature-x --force") expect(setCreateViewSpy).toHaveBeenCalledTimes(1) - const nextView = setCreateViewSpy.mock.calls[0]?.[0] + const nextView = requireCreateViewValue(setCreateViewSpy.mock.calls[0]?.[0]) expect(nextView).toMatchObject({ step: 1, values: { @@ -51,17 +70,7 @@ describe("app-ready-create", () => { }) it("shows a parse error instead of submitting on invalid inline flags", () => { - const context = createBrowserActionContext() - const setCreateViewSpy = vi.fn() - const setCreateView = setCreateViewSpy as unknown as Dispatch> - - submitCreateView({ - context, - controllerCwd: "/workspace", - createView: createInitialFlowView("https://github.com/org/repo --bogus"), - projectsRoot: "/home/dev/.docker-git", - setCreateView - }) + const { context, setCreateViewSpy } = submitCreateBuffer("https://github.com/org/repo --bogus") expect(setCreateViewSpy).not.toHaveBeenCalled() expect(context.setMessage).toHaveBeenCalledWith("Missing value for option: --bogus") diff --git a/packages/app/tests/docker-git/app-ready-shortcuts.test.ts b/packages/app/tests/docker-git/app-ready-shortcuts.test.ts index fb429b17..94a73e0d 100644 --- a/packages/app/tests/docker-git/app-ready-shortcuts.test.ts +++ b/packages/app/tests/docker-git/app-ready-shortcuts.test.ts @@ -1,6 +1,8 @@ import { describe, expect, it, vi } from "vitest" +import { createInitialFlowView } from "../../src/docker-git/menu-create-shared.js" import type { DashboardData } from "../../src/web/api.js" +import { type BrowserShortcutArgs, dispatchBrowserShortcut } from "../../src/web/app-ready-shortcut-runtime.js" import { handleMenuNavigationKey, handleProjectNavigationKey, @@ -9,6 +11,7 @@ import { shouldRefreshProjectDetails, usesProjectPrimaryNavigation } from "../../src/web/app-ready-shortcuts.js" +import { makeBrowserActionContext } from "./browser-action-context-fixture.js" const makeEvent = (key: string): ShortcutKeyboardEvent => { const event: ShortcutKeyboardEvent = { @@ -39,6 +42,49 @@ const runProjectNavigation = (projectNavigationArmed: boolean) => { return { handled, setSelectedProjectId } } +const storedTerminalSession: BrowserShortcutArgs["terminalSessions"][number] = { + closePath: "/projects/by-key/project-a-key/terminal-sessions/session-1", + exitMessage: "ended", + header: "SSH terminal: org/repo-a", + pendingDeleteMessage: "closed", + readyMessage: "ready", + session: { + createdAt: "2026-05-05T00:00:00.000Z", + id: "session-1", + projectId: "project-a", + sshCommand: "ssh dev@127.0.0.1", + status: "ready" + }, + subtitle: "ssh dev@127.0.0.1", + websocketPath: "/projects/by-key/project-a-key/terminal-sessions/session-1/ws" +} + +const makeShortcutArgs = ( + activeTerminalSessionId: string | null, + setSelectedProjectId: BrowserShortcutArgs["setSelectedProjectId"] +): BrowserShortcutArgs => { + const { context } = makeBrowserActionContext({ selectedProjectId: "project-a" }) + return { + activeScreen: { tag: "ProjectPicker" }, + activeTerminalSessionId, + actionPrompt: null, + context, + controllerCwd: "/repo", + createView: createInitialFlowView(""), + currentMenu: "Tasks", + dashboard, + projectBrowser: null, + projectsRoot: "/home/dev/.docker-git", + selectedProjectId: "project-a", + setActiveScreen: vi.fn(), + setCreateView: vi.fn(), + setProjectNavigationArmed: vi.fn(), + setSelectedMenuIndex: vi.fn(), + setSelectedProjectId, + terminalSessions: [storedTerminalSession] + } +} + const dashboard: DashboardData = { apiBaseUrl: "/api", health: { @@ -84,6 +130,7 @@ describe("app-ready-shortcuts", () => { expect(usesProjectPrimaryNavigation("Ports")).toBe(true) expect(usesProjectPrimaryNavigation("Databases")).toBe(true) expect(usesProjectPrimaryNavigation("Browser")).toBe(true) + expect(usesProjectPrimaryNavigation("Tasks")).toBe(true) expect(usesProjectPrimaryNavigation("ProjectAuth")).toBe(true) expect(usesProjectPrimaryNavigation("Logs")).toBe(true) expect(usesProjectPrimaryNavigation("Create")).toBe(false) @@ -155,9 +202,30 @@ describe("app-ready-shortcuts", () => { expect(shouldRefreshProjectDetails("Select", true, "project-a", null)).toBe(true) expect(shouldRefreshProjectDetails("Status", false, "project-a", null)).toBe(true) expect(shouldRefreshProjectDetails("Logs", false, "project-a", null)).toBe(true) + expect(shouldRefreshProjectDetails("Tasks", false, "project-a", null)).toBe(true) expect(shouldRefreshProjectDetails("Info", false, null, null)).toBe(false) }) + it("allows shortcuts when terminal sessions are stored but inactive", () => { + const event = makeEvent("ArrowDown") + const setSelectedProjectId = vi.fn() + const args = makeShortcutArgs(null, setSelectedProjectId) + + dispatchBrowserShortcut(event as KeyboardEvent, args) + + expect(setSelectedProjectId).toHaveBeenCalledWith("project-b") + }) + + it("blocks global shortcuts while a terminal workspace is active", () => { + const event = makeEvent("ArrowDown") + const setSelectedProjectId = vi.fn() + const args = makeShortcutArgs("session-1", setSelectedProjectId) + + dispatchBrowserShortcut(event as KeyboardEvent, args) + + expect(setSelectedProjectId).not.toHaveBeenCalled() + }) + it("skips selected project details when the same project is already loaded", () => { expect(shouldRefreshProjectDetails("Select", false, "project-a", { id: "project-a" })).toBe(false) expect(shouldRefreshProjectDetails("Info", false, "project-a", { id: "project-b" })).toBe(true) diff --git a/packages/app/tests/docker-git/browser-action-context-fixture.ts b/packages/app/tests/docker-git/browser-action-context-fixture.ts index 735b6f5b..3fb9e772 100644 --- a/packages/app/tests/docker-git/browser-action-context-fixture.ts +++ b/packages/app/tests/docker-git/browser-action-context-fixture.ts @@ -27,6 +27,7 @@ export const makeBrowserActionContext = ( addTerminalSession: vi.fn(), githubStatus: null, portForwardInput: "", + projectTasksIncludeDefault: false, reloadDashboard, selectedProjectId: null, selectedProjectKey: null, @@ -49,6 +50,7 @@ export const makeBrowserActionContext = ( setProjectBrowser, setProjectTaskLogs: vi.fn(), setProjectTasks: vi.fn(), + setProjectTasksIncludeDefault: vi.fn(), setSelectedMenuIndex: vi.fn(), setSelectedProject: vi.fn(), setSelectedProjectId: vi.fn(), diff --git a/packages/app/tests/docker-git/menu-create-shared.test.ts b/packages/app/tests/docker-git/menu-create-shared.test.ts index 3b4cf38a..a1102f7b 100644 --- a/packages/app/tests/docker-git/menu-create-shared.test.ts +++ b/packages/app/tests/docker-git/menu-create-shared.test.ts @@ -1,6 +1,10 @@ import { describe, expect, it } from "vitest" -import { advanceCreateFlow, createInitialFlowView, resolveCreateFlowSteps } from "../../src/docker-git/menu-create-shared.js" +import { + advanceCreateFlow, + createInitialFlowView, + resolveCreateFlowSteps +} from "../../src/docker-git/menu-create-shared.js" const expectContinueResult = ( next: ReturnType @@ -25,6 +29,17 @@ const expectCompleteResult = ( describe("menu-create-shared", () => { const cwd = process.cwd() const defaultRoot = `${process.env["HOME"] ?? cwd}/.docker-git/org/repo` + const expectRepoFields = ( + values: { + readonly outDir?: string | undefined + readonly repoRef?: string | undefined + readonly repoUrl?: string | undefined + } + ) => { + expect(values.repoUrl).toBe("https://github.com/org/repo/tree/feature-x") + expect(values.repoRef).toBe("feature-x") + expect(values.outDir).toBe(defaultRoot) + } it("advances from repo URL into the wizard by default", () => { const view = expectContinueResult(advanceCreateFlow( @@ -33,9 +48,7 @@ describe("menu-create-shared", () => { )) expect(view.step).toBe(1) - expect(view.values.repoUrl).toBe("https://github.com/org/repo/tree/feature-x") - expect(view.values.repoRef).toBe("feature-x") - expect(view.values.outDir).toBe(defaultRoot) + expectRepoFields(view.values) expect(view.values.runUp).toBeUndefined() expect(resolveCreateFlowSteps(view.values)).toEqual([ "repoUrl", @@ -54,9 +67,7 @@ describe("menu-create-shared", () => { { quickCreate: true } )) - expect(inputs.repoUrl).toBe("https://github.com/org/repo/tree/feature-x") - expect(inputs.repoRef).toBe("feature-x") - expect(inputs.outDir).toBe(defaultRoot) + expectRepoFields(inputs) expect(inputs.runUp).toBe(true) }) @@ -66,9 +77,7 @@ describe("menu-create-shared", () => { createInitialFlowView("https://github.com/org/repo/tree/feature-x --force --mcp-playwright --no-up") )) - expect(view.values.repoUrl).toBe("https://github.com/org/repo/tree/feature-x") - expect(view.values.repoRef).toBe("feature-x") - expect(view.values.outDir).toBe(defaultRoot) + expectRepoFields(view.values) expect(view.values.force).toBe(true) expect(view.values.enableMcpPlaywright).toBe(true) expect(view.values.runUp).toBe(false) @@ -87,9 +96,7 @@ describe("menu-create-shared", () => { ) )) - expect(inputs.repoUrl).toBe("https://github.com/org/repo/tree/feature-x") - expect(inputs.repoRef).toBe("feature-x") - expect(inputs.outDir).toBe(defaultRoot) + expectRepoFields(inputs) expect(inputs.cpuLimit).toBe("25%") expect(inputs.ramLimit).toBe("4g") expect(inputs.runUp).toBe(false) diff --git a/packages/app/tests/docker-git/terminal-mobile-controls.test.ts b/packages/app/tests/docker-git/terminal-mobile-controls.test.ts index 15c303e3..1d0c77b6 100644 --- a/packages/app/tests/docker-git/terminal-mobile-controls.test.ts +++ b/packages/app/tests/docker-git/terminal-mobile-controls.test.ts @@ -8,23 +8,23 @@ import { describe("terminal-mobile-controls", () => { it("maps mobile terminal buttons to terminal input sequences", () => { - expect(mobileTerminalKeyInput("escape")).toBe("\u001b") + expect(mobileTerminalKeyInput("escape")).toBe("\u001B") expect(mobileTerminalKeyInput("tab")).toBe("\t") expect(mobileTerminalKeyInput("ctrl-c")).toBe("\u0003") - expect(mobileTerminalKeyInput("up")).toBe("\u001b[A") - expect(mobileTerminalKeyInput("down")).toBe("\u001b[B") - expect(mobileTerminalKeyInput("right")).toBe("\u001b[C") - expect(mobileTerminalKeyInput("left")).toBe("\u001b[D") + expect(mobileTerminalKeyInput("up")).toBe("\u001B[A") + expect(mobileTerminalKeyInput("down")).toBe("\u001B[B") + expect(mobileTerminalKeyInput("right")).toBe("\u001B[C") + expect(mobileTerminalKeyInput("left")).toBe("\u001B[D") }) it("derives control characters from keyboard keys for one-shot ctrl", () => { expect(terminalControlCharacterForKey("c")).toBe("\u0003") expect(terminalControlCharacterForKey("C")).toBe("\u0003") - expect(terminalControlCharacterForKey("[")).toBe("\u001b") - expect(terminalControlCharacterForKey("\\")).toBe("\u001c") - expect(terminalControlCharacterForKey("]")).toBe("\u001d") - expect(terminalControlCharacterForKey("^")).toBe("\u001e") - expect(terminalControlCharacterForKey("_")).toBe("\u001f") + expect(terminalControlCharacterForKey("[")).toBe("\u001B") + expect(terminalControlCharacterForKey("\\")).toBe("\u001C") + expect(terminalControlCharacterForKey("]")).toBe("\u001D") + expect(terminalControlCharacterForKey("^")).toBe("\u001E") + expect(terminalControlCharacterForKey("_")).toBe("\u001F") expect(terminalControlCharacterForKey("?")).toBeNull() }) diff --git a/packages/app/tests/docker-git/terminal.test.ts b/packages/app/tests/docker-git/terminal.test.ts index 0488c9bd..dd972d8a 100644 --- a/packages/app/tests/docker-git/terminal.test.ts +++ b/packages/app/tests/docker-git/terminal.test.ts @@ -1,16 +1,16 @@ import { describe, expect, it } from "@effect/vitest" import { afterEach, beforeEach, vi } from "vitest" -import { - resolveTerminalCompactHeaderMode, - resolveTerminalTypingMode -} from "../../src/web/terminal-mobile-layout.js" -import { shouldShowTerminalTabs } from "../../src/web/terminal-mobile-layout.js" import { createTerminalPasteGuard, extractTerminalImageBase64, isTerminalPasteShortcut } from "../../src/web/terminal-image-paste.js" +import { + resolveTerminalCompactHeaderMode, + resolveTerminalTypingMode, + shouldShowTerminalTabs +} from "../../src/web/terminal-mobile-layout.js" import { resolveTerminalReconnectDelay } from "../../src/web/terminal-reconnect.js" import { parseTerminalServerMessage, resolveTerminalWebSocketUrl } from "../../src/web/terminal.js" import type { TerminalServerMessage } from "../../src/web/terminal.js" From 835d07424d810ba6feae55f04e7127c2778b876b Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Tue, 5 May 2026 22:28:12 +0000 Subject: [PATCH 2/4] fix(app): satisfy shortcut effect lint --- packages/app/src/web/app-ready-create.ts | 11 +++++++-- .../app/src/web/app-ready-shortcut-runtime.ts | 23 ++++++++++--------- packages/app/src/web/app-ready-shortcuts.ts | 1 + .../tests/docker-git/app-ready-create.test.ts | 5 ++-- .../docker-git/app-ready-shortcuts.test.ts | 5 ++-- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/app/src/web/app-ready-create.ts b/packages/app/src/web/app-ready-create.ts index e3a41246..7068100e 100644 --- a/packages/app/src/web/app-ready-create.ts +++ b/packages/app/src/web/app-ready-create.ts @@ -28,7 +28,14 @@ type CreateSubmitArgs = CreateKeyArgs & { readonly quickCreate?: boolean } -const createCharacterInput = (event: KeyboardEvent): string => event.key.length === 1 ? event.key : "" +type CreateKeyboardEvent = { + readonly key: string + readonly shiftKey: boolean + readonly preventDefault: () => void +} + +const createCharacterInput = (event: Pick): string => + event.key.length === 1 ? event.key : "" export const resetCreateView = (): CreateFlowView => createInitialFlowView() @@ -94,7 +101,7 @@ export const useCreateMenuReset = ( } export const handleCreateKey = ( - event: KeyboardEvent, + event: CreateKeyboardEvent, { context, controllerCwd, createView, projectsRoot, setCreateView }: CreateKeyArgs ): boolean => { if (event.key === "Escape") { diff --git a/packages/app/src/web/app-ready-shortcut-runtime.ts b/packages/app/src/web/app-ready-shortcut-runtime.ts index 6d3c3855..dce83586 100644 --- a/packages/app/src/web/app-ready-shortcut-runtime.ts +++ b/packages/app/src/web/app-ready-shortcut-runtime.ts @@ -13,6 +13,7 @@ import { isBlockedShortcut, refreshCurrentMenu } from "./app-ready-shortcuts.js" +import type { ShortcutKeyboardEvent } from "./app-ready-shortcuts.js" import type { BrowserMenuTag } from "./menu.js" import { type BrowserScreen, isProjectMenu, menuScreen, projectPickerScreen, screenForMenu } from "./screen.js" import type { ActiveTerminalSession } from "./terminal.js" @@ -53,7 +54,7 @@ type MenuOpenArgs = Pick< const shouldIgnoreShortcut = ( activeTerminalSessionId: string | null, actionPrompt: ActionPromptState | null, - event: KeyboardEvent + event: ShortcutKeyboardEvent ): boolean => activeTerminalSessionId !== null || isBlockedShortcut(event, actionPrompt !== null) const openSelectedMenuScreen = ({ @@ -79,7 +80,7 @@ const openSelectedMenuScreen = ({ } const handleMenuScreenKey = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, { context, currentMenu, @@ -130,7 +131,7 @@ const runProjectPickerAction = ( } const handleRefreshShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, { context, currentMenu }: Pick ): boolean => { if (event.key !== "r" && event.key !== "R") { @@ -142,7 +143,7 @@ const handleRefreshShortcut = ( } const handleProjectPickerShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, args: Pick< BrowserShortcutArgs, | "context" @@ -182,7 +183,7 @@ const handleProjectPickerShortcut = ( } const handleBackToMenuShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, context: BrowserActionContext, setActiveScreen: Setter, returnToProjectPicker: boolean @@ -197,7 +198,7 @@ const handleBackToMenuShortcut = ( } const handleOutputShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, args: Pick ): void => { if (handleBackToMenuShortcut(event, args.context, args.setActiveScreen, isProjectMenu(args.currentMenu))) { @@ -207,7 +208,7 @@ const handleOutputShortcut = ( } const handleContentShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, args: Pick ): void => { handleBackToMenuShortcut(event, args.context, args.setActiveScreen, false) @@ -215,7 +216,7 @@ const handleContentShortcut = ( } const handleMenuShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, args: Pick< BrowserShortcutArgs, | "context" @@ -235,7 +236,7 @@ const handleMenuShortcut = ( } const handleCreateShortcut = ( - event: KeyboardEvent, + event: ShortcutKeyboardEvent, args: Pick< BrowserShortcutArgs, "context" | "controllerCwd" | "createView" | "projectsRoot" | "setActiveScreen" | "setCreateView" @@ -253,7 +254,7 @@ const handleCreateShortcut = ( } } -const dispatchActiveScreenShortcut = (event: KeyboardEvent, args: BrowserShortcutArgs): void => { +const dispatchActiveScreenShortcut = (event: ShortcutKeyboardEvent, args: BrowserShortcutArgs): void => { if (args.activeScreen.tag === "Menu") { handleMenuShortcut(event, args) return @@ -282,7 +283,7 @@ const dispatchActiveScreenShortcut = (event: KeyboardEvent, args: BrowserShortcu handleContentShortcut(event, args) } -export const dispatchBrowserShortcut = (event: KeyboardEvent, args: BrowserShortcutArgs): void => { +export const dispatchBrowserShortcut = (event: ShortcutKeyboardEvent, args: BrowserShortcutArgs): void => { if (shouldIgnoreShortcut(args.activeTerminalSessionId, args.actionPrompt, event)) { return } diff --git a/packages/app/src/web/app-ready-shortcuts.ts b/packages/app/src/web/app-ready-shortcuts.ts index 48bba0a5..e95f2c87 100644 --- a/packages/app/src/web/app-ready-shortcuts.ts +++ b/packages/app/src/web/app-ready-shortcuts.ts @@ -24,6 +24,7 @@ export type ShortcutKeyboardEvent = { defaultPrevented: boolean readonly key: string readonly metaKey: boolean + readonly shiftKey: boolean readonly target: EventTarget | null preventDefault: () => void } diff --git a/packages/app/tests/docker-git/app-ready-create.test.ts b/packages/app/tests/docker-git/app-ready-create.test.ts index 19b7d9da..18352a68 100644 --- a/packages/app/tests/docker-git/app-ready-create.test.ts +++ b/packages/app/tests/docker-git/app-ready-create.test.ts @@ -6,13 +6,14 @@ import { createInitialFlowView, resolveCreateFlowSteps } from "../../src/docker-git/menu-create-shared.js" +import type { GithubAuthStatus } from "../../src/web/api.js" import { submitCreateView } from "../../src/web/app-ready-create.js" import { makeBrowserActionContext } from "./browser-action-context-fixture.js" -const validGithubStatus = { +const validGithubStatus: GithubAuthStatus = { summary: "valid", tokens: [{ key: "default", label: "default", login: "octocat", status: "valid" }] -} as const +} const createSetCreateViewSpy = () => { const spy = vi.fn<(value: SetStateAction) => void>() diff --git a/packages/app/tests/docker-git/app-ready-shortcuts.test.ts b/packages/app/tests/docker-git/app-ready-shortcuts.test.ts index 94a73e0d..25e4bccb 100644 --- a/packages/app/tests/docker-git/app-ready-shortcuts.test.ts +++ b/packages/app/tests/docker-git/app-ready-shortcuts.test.ts @@ -20,6 +20,7 @@ const makeEvent = (key: string): ShortcutKeyboardEvent => { defaultPrevented: false, key, metaKey: false, + shiftKey: false, target: null, preventDefault: () => { event.defaultPrevented = true @@ -211,7 +212,7 @@ describe("app-ready-shortcuts", () => { const setSelectedProjectId = vi.fn() const args = makeShortcutArgs(null, setSelectedProjectId) - dispatchBrowserShortcut(event as KeyboardEvent, args) + dispatchBrowserShortcut(event, args) expect(setSelectedProjectId).toHaveBeenCalledWith("project-b") }) @@ -221,7 +222,7 @@ describe("app-ready-shortcuts", () => { const setSelectedProjectId = vi.fn() const args = makeShortcutArgs("session-1", setSelectedProjectId) - dispatchBrowserShortcut(event as KeyboardEvent, args) + dispatchBrowserShortcut(event, args) expect(setSelectedProjectId).not.toHaveBeenCalled() }) From 1a5bdbcbf748cdc8862d9fe8904d3cff98b142c4 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Tue, 5 May 2026 22:43:09 +0000 Subject: [PATCH 3/4] fix(app): satisfy task manager lint --- packages/app/src/web/app-ready-controller.ts | 48 +------ .../app/src/web/app-ready-terminal-actions.ts | 47 +++++++ packages/app/src/web/panel-terminal.tsx | 121 +++++++++++------- 3 files changed, 125 insertions(+), 91 deletions(-) create mode 100644 packages/app/src/web/app-ready-terminal-actions.ts diff --git a/packages/app/src/web/app-ready-controller.ts b/packages/app/src/web/app-ready-controller.ts index 3797d4cb..566b6143 100644 --- a/packages/app/src/web/app-ready-controller.ts +++ b/packages/app/src/web/app-ready-controller.ts @@ -1,19 +1,14 @@ import { updateActionPromptValue } from "./action-prompt.js" -import { withBusy } from "./actions-shared.js" import { - attachProjectTerminalById, cancelBrowserActionPrompt, closeSelectedProjectPort, - connectProjectById, loadSelectedProjectBrowser, - loadProjectTasksById, loadSelectedProjectPorts, openProjectBrowserById, openSelectedProjectBrowser, openSelectedProjectPort, submitBrowserActionPrompt } from "./actions.js" -import { deleteProjectTerminalSession } from "./api.js" import type { DashboardData } from "./api.js" import type { createActionContext } from "./app-ready-actions.js" import { resolveCurrentMenu, runAuthActionByIndex, runProjectAuthActionByIndex } from "./app-ready-actions.js" @@ -39,10 +34,9 @@ import { bindScreenActions } from "./app-ready-screen-actions.js" import { useSshLink } from "./app-ready-ssh-link-hook.js" import { bindTaskActions } from "./app-ready-task-actions.js" import { useProjectTasksReset } from "./app-ready-tasks-hook.js" +import { bindTerminalActions } from "./app-ready-terminal-actions.js" import { useReadyUrlSync } from "./app-ready-url.js" -import { browserMenuIndex } from "./menu.js" import { filterDashboardProjectsByQuery } from "./project-search.js" -import { projectPickerScreen } from "./screen.js" type ReadyControllerArgs = { readonly dashboard: DashboardData @@ -255,46 +249,6 @@ const bindBrowserActions = ( } }) -const bindTerminalActions = ( - actionContext: ReturnType, - state: ReturnType -) => ({ - onOpenProjectTerminalById: (projectId: string, projectKey?: string) => { - connectProjectById(projectId, actionContext, projectKey) - }, - onOpenProjectTaskManagerById: (projectId: string) => { - state.setSelectedProjectId(projectId) - state.setSelectedMenuIndex(browserMenuIndex("Tasks")) - state.setProjectNavigationArmed(true) - state.setActiveScreen(projectPickerScreen()) - state.deactivateTerminalWorkspace() - state.setProjectTasks(null) - state.setProjectTaskLogs("") - state.setProjectTasksIncludeDefault(false) - loadProjectTasksById(actionContext, projectId, { includeDefault: false }) - }, - onAttachProjectTerminalSession: ( - projectId: string, - projectKey: string, - projectDisplayName: string, - sessionId: string - ) => { - attachProjectTerminalById(projectId, projectKey, projectDisplayName, sessionId, actionContext) - }, - onKillProjectTerminalSession: (_projectId: string, projectKey: string, sessionId: string) => { - withBusy({ - context: actionContext, - effect: deleteProjectTerminalSession(projectKey, sessionId), - label: "Killing SSH terminal", - onSuccess: () => { - state.closeTerminalSession(sessionId) - actionContext.reloadDashboard() - actionContext.setMessage(`Killed SSH terminal: ${sessionId}.`) - } - }) - } -}) - export const useReadyController = ({ dashboard, dashboardRefreshTick, refreshDashboard }: ReadyControllerArgs) => { const state = useReadyState() const currentMenu = resolveCurrentMenu(state.selectedMenuIndex) diff --git a/packages/app/src/web/app-ready-terminal-actions.ts b/packages/app/src/web/app-ready-terminal-actions.ts new file mode 100644 index 00000000..459894e3 --- /dev/null +++ b/packages/app/src/web/app-ready-terminal-actions.ts @@ -0,0 +1,47 @@ +import { withBusy } from "./actions-shared.js" +import { attachProjectTerminalById, connectProjectById, loadProjectTasksById } from "./actions.js" +import { deleteProjectTerminalSession } from "./api.js" +import type { createActionContext } from "./app-ready-actions.js" +import type { ReadyState } from "./app-ready-hooks.js" +import { browserMenuIndex } from "./menu.js" +import { projectPickerScreen } from "./screen.js" + +export const bindTerminalActions = ( + actionContext: ReturnType, + state: ReadyState +) => ({ + onOpenProjectTerminalById: (projectId: string, projectKey?: string) => { + connectProjectById(projectId, actionContext, projectKey) + }, + onOpenProjectTaskManagerById: (projectId: string) => { + state.setSelectedProjectId(projectId) + state.setSelectedMenuIndex(browserMenuIndex("Tasks")) + state.setProjectNavigationArmed(true) + state.setActiveScreen(projectPickerScreen()) + state.deactivateTerminalWorkspace() + state.setProjectTasks(null) + state.setProjectTaskLogs("") + state.setProjectTasksIncludeDefault(false) + loadProjectTasksById(actionContext, projectId, { includeDefault: false }) + }, + onAttachProjectTerminalSession: ( + projectId: string, + projectKey: string, + projectDisplayName: string, + sessionId: string + ) => { + attachProjectTerminalById(projectId, projectKey, projectDisplayName, sessionId, actionContext) + }, + onKillProjectTerminalSession: (_projectId: string, projectKey: string, sessionId: string) => { + withBusy({ + context: actionContext, + effect: deleteProjectTerminalSession(projectKey, sessionId), + label: "Killing SSH terminal", + onSuccess: () => { + state.closeTerminalSession(sessionId) + actionContext.reloadDashboard() + actionContext.setMessage(`Killed SSH terminal: ${sessionId}.`) + } + }) + } +}) diff --git a/packages/app/src/web/panel-terminal.tsx b/packages/app/src/web/panel-terminal.tsx index 98c28233..23736747 100644 --- a/packages/app/src/web/panel-terminal.tsx +++ b/packages/app/src/web/panel-terminal.tsx @@ -248,6 +248,31 @@ const TerminalActionButton = ( ) +const OptionalTerminalActionButton = ( + { + compactHeaderMode, + compactLabel, + enabled, + label, + onClick + }: { + readonly compactHeaderMode: boolean + readonly compactLabel: string + readonly enabled: boolean + readonly label: string + readonly onClick: (() => void) | undefined + } +): JSX.Element | null => { + if (!enabled || onClick === undefined) { + return null + } + return ( + + {compactHeaderMode ? compactLabel : label} + + ) +} + const TerminalHeaderActions = ( { compactHeaderMode, @@ -257,43 +282,49 @@ const TerminalHeaderActions = ( onOpenTaskManager, onOpenTerminal, session - }: Pick< - TerminalPanelProps, - "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" - > & { - readonly compactHeaderMode: boolean - } -): JSX.Element => ( -
    - {session.browserProjectId === undefined || onOpenBrowser === undefined - ? null - : ( - - {compactHeaderMode ? "Browser" : "Open browser"} - - )} - {session.browserProjectId === undefined || onOpenTaskManager === undefined - ? null - : ( - - {compactHeaderMode ? "Tasks" : "Task manager"} - - )} - {session.browserProjectId === undefined || onOpenTerminal === undefined - ? null - : ( - - {compactHeaderMode ? "New" : "New terminal"} - - )} - - Detach - - - Kill - -
    -) + }: + & Pick< + TerminalPanelProps, + "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" + > + & { + readonly compactHeaderMode: boolean + } +): JSX.Element => { + const hasProjectActions = session.browserProjectId !== undefined + + return ( +
    + + + + + Detach + + + Kill + +
    + ) +} const TerminalHeader = ( { @@ -305,13 +336,15 @@ const TerminalHeader = ( onOpenTerminal, session, status - }: Pick< - TerminalPanelProps, - "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" - > & { - readonly compactHeaderMode: boolean - readonly status: TerminalStatus - } + }: + & Pick< + TerminalPanelProps, + "onDetach" | "onKill" | "onOpenBrowser" | "onOpenTaskManager" | "onOpenTerminal" | "session" + > + & { + readonly compactHeaderMode: boolean + readonly status: TerminalStatus + } ): JSX.Element => (
    From 513fcc3fc676840dea08c5d36cc851b0d6b978df Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Wed, 6 May 2026 08:01:14 +0000 Subject: [PATCH 4/4] fix(app): open task manager inside ssh session --- .../ssh-session-taskmanager-button.png | Bin 0 -> 18435 bytes .../ssh-session-taskmanager-open.png | Bin 0 -> 45107 bytes .../app/src/web/app-ready-terminal-actions.ts | 33 ++-- .../app/src/web/app-ready-terminal-screen.tsx | 156 +++++++++++++++++- packages/app/src/web/panel-terminal.tsx | 38 ++++- .../app-ready-terminal-actions.test.ts | 49 ++++++ 6 files changed, 257 insertions(+), 19 deletions(-) create mode 100644 docs/pr-screenshots/issue-239/ssh-session-taskmanager-button.png create mode 100644 docs/pr-screenshots/issue-239/ssh-session-taskmanager-open.png create mode 100644 packages/app/tests/docker-git/app-ready-terminal-actions.test.ts diff --git a/docs/pr-screenshots/issue-239/ssh-session-taskmanager-button.png b/docs/pr-screenshots/issue-239/ssh-session-taskmanager-button.png new file mode 100644 index 0000000000000000000000000000000000000000..053ca08c7f928efbf53f2d377dfa498101b74951 GIT binary patch literal 18435 zcmeIaX;{NFeOn&86#sL5P~2?LP7`uGAAAC+}ro*d;9I~d*A2j5B<~^Hu)$2J*>U<-oN!* zYwgtEY|O=ekoiGGL`2Nu=8fATB1hkfh#YzHx4#IV%xiu3R7B)Q5sMrDxD#7U#(y7s zXa60Om;B_!%cFnom65di&E-zNSgzw&tu%?FF`@OyfJs=#UKvuNF|8Zm1zDJ*`D{fnru_^~I~ zOY3gS&V(N$%y-M`k}Tx!S<9!odpV&!KM5=Pd(`_oG}jgd0W`bDFjIjd4{i9Xh{%WN zu++oB|7i5+h_Luu>4!hsv|SN?_&;h>=ErNe^ASTS^0o=w8OP@5GMDmc@a_gV9Xbi5 z>~mwW;@}a|rYM1^czjfFLIxXX3)L0Y46JgOyY`^|r2dyCA5&^Zq2t*sNPIvHkT$kk z&aO>3@1m7PYU`qOSuGnAeHSLhFL`6sG|%ZUNOJfsQ$wo~T+~*D&P|Kd_UUH~CE)az zY{LXDCCA~EuxjoKr2oU@TaLVdnjB{uN(i@{103;mNhz5!4xDXm4wcF`1KuBpL_esV zDT&1WS_d+7hxf$Y1@>q87!f7av zE}>AFC~1qQ_6!NAg-1rSn$tnDiNo{PpPevP#4c{`-`R4KM+b-V`XBCS0NTNRYUj3;h_14 zUvVV|hTJZ`Y=TaD-WiR!sNP(`n;xBI(p#7y?C)R7F?SLCCYaVY=WFcLM-i@g0jHr; z+?bZ4Uy-K{v4jUUUIX8QTcgi&$Ld9u`ORUt2%fy#9p{C;QBk?@)oAA>{;V&OBKhGyA+>h6#CXP_tqs69v^+Z-=%knv6Ma1-dSX-?zbv(&KFJPP8q5}6%QJXN@n~%;YoKsc%B-o>t z^LdP=HsC-+gm6-->}q0;nFkbkJ~N4pKvz=n;k#N%y0M8p#J6rKP&VB84*Saym>wQR zcA|BqR&$zhQPFmeuuNmpEZ^q`O4l+Zq=3xDCV|(= zlVY_=5KBTJqZS?RZug}tcWlhraqUHaF1$q>ewA@6_g!z9SRUYUO9hq?>AN)wO^A;( z1$S^K<_ebLV&m{tiR@;-K615y9JYBKJFa0h^NJjAnk3jF7@S~XwLNaE*Vp=O3rraP zMjT&#x(Aw%7b`hQn%7WBlj; z9T`%zXI6p~5SO6Pc@^Pa_m!Bys87{k+#oR{eub6_C!CMMtTjsb@VGN3388Vh z&^Im!zk`&bMu0^y4&_mzPKXMfjdY*vjk5D8XV(`E z{6N%H9U1#HQYWvbR)`2GnmE1i>-w}{4hbX;J=j9MMs9BrM$;SnM{BCeSL&I>54CRh>#ExqN7jb>oJz9ytbd9l6Zcgyim0ff!FSoCQLTp zI3eQdP5+l~Bxn62Cncmnd;2opGnl0gb+k&F?lRndWD{Sk4#-Wb@^kTfl17Ga;LAUB5PWXNiE{X;G7WE zFWP|YCr7q6fF>kl{c^`uR85mg8j%3mXl&rjeUdgtv#Wce`mf4d9JzjfvL?2zAfhNQ zGl?W$4^3;q@wl6Wm`_Q2!;hvBlw+s2P_bX|-so+@mk<4B>H=ht!(^c!Pb!9Ru%tog zN;l`tnR>s;Xn9D=T}QQF#3i9a>Tj=^dYoy!-ZfFN+u(=0#HE$XomPXcCUv6OmNv!ld@U{F=hF&N?4YU8x(w zkP8u=0n-4D?#q1Ki%4j3CNd}kdn%G(5DC$JBlE!@W%+7b9Xr} z>Rh|qn;tZ-g`4_`qXM|(P&)ER86wyGGMuWdgIe?xq!7Y(JcX0b;wo@#1H(qgcT?!1sm14 zcNocyj)fq%r=Jc4dYU%REi^xsuUibK0=D zi9wjnl>bnBV%kWhXq&oV2hqnb@nC(cm{vmTcG(lAwV0I6t>YdL%Crl`pcDcjEC4c! zP)P!qtv{-os&j1}+X+kLwMrc>fbh1dt1^!4Ud7|o9{9fEWTpirtk;@RDkUHse`cfp z;=vnP40|+LA#)6U@ZLiV1Ki11mN(LZ3~34If&`cf4pbz6nnPCPO`Lr==d)CEI{AL*$bZ#&X3G z=n!FlM1pQ3t?twWPWC5kpG}~zOGp*nQAwmWp9_f(ir%bYT8mO6?1gwxWar3y=OYEz z{pHg{-fk+rtmHkj?f#J0$#mg&zvCAtkT;GB|64Kt`F{&X{{>NkEF~J<|3IbDhj>)@ z@^5RimZN@W4}s>BF~v*5;@<(;{~{LsU%h6vkpC)x(riARAG`(gowKrP%#k@9l1Oyr zeg!Qm(6Q0o{Z5lg=-Ob0n=IPV)vT{($Z!6=%c!0{biByj)s?;eti`phc<->+;kilUEBT9 zJ@@PmXQ#G>GW= z9Xh-LTzwhtpS*kbr57`LTtThYAKw*KUZP?`-K2N52TktxPO`o;|9wo(DYFF5q)RJs ze8Jk6^P^$~eMOQ;6Sg~8XifbNt&=@@zP>xkUshtgaF1Qr+q(oPMIF@Hivo=sRW^45 zE&;!IhA+E`m%ch}s!s$m>{z-#hl&B)SDD7}2!Wd!QeXLs7ykuK{O*iGtr4`}K>R$M zb^DcmRtbJ<@6;M`3`(Eh6y1}iZNTI+)}e1FQHhl`QrONTWWEqe*;WBA$o+f9?II|37c99bZg*zA|;G6 zvm}$)b4OsrATW6>#8+INvmfu?>3_^(u9kcEO@DL;pO&WWy_`fQk69!`AoEYlkC%s< zyzS%2<#vWmeZ#6vSChctkVk5abwPs770pZVOp;3bG6DYI9LafzD7RB>8)v$I8B#ViU=d)F6&Pil& zrlCqh-FqX$NJ`%D*3IFOYh4lvHJdRfWg^ErVhgkz&|mh(%@3NH-7zIt zA`y1iD#)MuuUr5pJ{gs|a1e?X6aM0uSXo!|llqJTFnOPGa*MEs?~gCJ>UEd9lWxA` zYC^cUrK?rCKv_N2hrz@#(jX}Z(neiXeZOxBJ_FR+2lnFksIOeEZL&6t3e9&n@1TqU zwiW)q3eF)7A~WmmCKTbr!NVJn~H0biFsGOS(m=tZZ5#?d5wx=Txq0@)oLxj3-HR=EwZXFuP3UhJx; zDclDf;cjLz*}Jr~^t9G8?FXOnv2l&(LqB;2t-mw^wbnF+vA>xQj%UcUZr_y)Nb@l^ zX4Y9zi;UD58I$5!qZx(KCRO{6SzE`4+~b{p89yI3rvR@(-MW|`^;sJ1R`As%NuZG9 zi@d^aFb8S*;nwz0`W9HVIUQKUR#)vqLM#9PWZ(f0ofL0dZUBr`^TEvDLzT1-Nsky29fEx5WA_IrRyww- z8uqW%rj=ENB+t1B2LyU)7_(|ivlfM3nN96Jl^OlV~f?+v`4RmprGxF4{HxOmKO% z_J_2x>^Ct7iwM)v{31R%Y79SJ3(m)>VYX8F+gi-+t|@Esd<$M7|bZ;C9(b7`YxH8CUB&h8)g)nQhMy5NLq zJ%X1Gh`DXQwqfRe>~3Ow)&!ni3T!e@ehes;D=13r_TKM;^vk!D8dMnFB1g?vV>3(l zqjEoym(Za^m6#>Tx`V|QF2W3{JE1gv6W=I7;XYzcCyAInNw`2x!LMjq9vod zQIo6(eA50v@~CaeA~Ef$h2(k$CnSMib;@^%J}0f%sby^J?}PZxcPRo>cX|Shz*gBg zMJ?#OIp$>jshd>0zGPIiTl8WO0nxQG608S`il>To?>-|c-3dZ;AM@bv^}OHOkA&EL z*;`^tOTA!!dz{8-bY*V8PYLa2@rPNov0@bRC-537ywj~T{Hqk4Y33Jbk=8_RitfOP)AHLu+;U`&Xy7=B#S%m33>R=Nh#%To68Z(yF(Wl=(S; z;})_lfHEmWK|*wps%u$ouUuv@GS_Gu#A>TeFVJ#tZSHbInQdFWn+G4TWN|~$n}yq- zvYp-?;wMXwYj4e|3)6(>RSOUFd7;u*F7pfM4X^K>&4b2YS#5Sp(CA@3v8TGuQ`o-p z9BXd7{RHlnTFljiyZQ&6>Do~F8Q;&}djBT!`}?bmprx{4&bk#)OHCtV$O^Ueo8;_? zgc+OE+4`dFY~1^}bkjI`nv*7B5TG1UPFX)mAY5)y0s9x+o&zr57;u_I^%JmanO7!xdftd2{a3?} zn1ju$L>?j=FY!zNzX&f6Tz9O|f7S|BaY@szx|bIxs*Xeby(0@o@1(Y1_2l6)Q#wFMiv&KWTVwKRmdy0$oN&DDCiu3mgx@=Npj z)~qdR{m8#G@3t@$uv6%W{JQwb+DzCeXSO;=X35^@^zmY6vR7l}jK%(q`I3vx_wBPo zSwH@B;u2>$&eovmnu5f0`pN%Bq+jrx6bybZZ&T>VC!&rs8c#pfYQs184T%9c%FUX0 zt_N_m<<9P75^TOTAw95yJ-+6}oGy&2!Vo_8c6U`JbJ@3m44*fJzB**(4c$xHc`1tg z2*H<8!%FkTP5R_@4moB64sS&plO>~F1fLwok0 zOLlKGU8<-1ONk}jAFGwmWD(1+V@$45YAbGTeHL)yb>NH?{u&Y08Edjzf@z^rIiFV<-ylnKK zNz@cWkd*?<>}sZ#R^H2|4}d2ebURweK>rt$_=Y zenopZmceo4o$4Y?GBbW;G8%ll+j4VPNSH70@0bT?QlW7F3u+5j9fF772j-$M&DZ6@ z4}Kkx{v}o8^S7e7%61BmrvZo0ZhjWDd_+1KCGHa{)f=3jUxd1goeo;L8Jx}QA8=2a zy^NDnmA;;YyxM!CL?CKSMRc^5pTH{G_TL+bBSv~%(g zCv{#oU=h7KjhA>;x<2Qq2$SW7X<=E}6ohO77aeMHSXyk*HkL$MZyE|hQ z=G!r23w=Iyep7ANH`V$k3@SONt}AP1MmJ0?sW#TlcPC-m-9Wm(ZT=+L_({z=bnzlG zd{nQ3Uhp0fl)L;sF1~e@zIu@;dj_2pNGR{3#_Y~&fe(fiq~wqutHg2}88$zS6!HjD z?ghQGxmuuQ{L7UENC8mbLW_x+BqiSNcHB%mN_X-l7foN&UC6gZDdyDMnGF$67{mHj zeN#%~cR$p6SWuE|gnRAwZ+Ss)N;KA9Mm#$aqRkt0193^}d6$6Qg`UJ?nYkuMx`0@1 z1y8q>BO)JcF{QHc2p1mi#nI7%i9~M;_62ve!QwBMG$u;)qQ0c9YWZX&aKBVn$i~M6 z++E+Xtml7gbCS}fPQ!bObZ|n0#&7V6IO=)y)2XbX6S6v7C{^9PId*x^$wvzlG#wk! zWMP|80SK7wp@25+mKSaD?Ec)I#;j(0H*y3iBZhlvf3torV^_alN`sZiC$Be~RS#J0 zZX`JtyFw)XKE-nE@&3r|&%bN1{w4+FKIccx->e=k&~CFRlB~9>v@Sv3V@YWfAZl96 zRlzw`T)wJt0u@Pq`bt4*e8lYVJLOlW}MZftZ7O1X#0F?ObH3+St+{tz|wTL4Z>~`B&#!U zlxd?@wV>!-ixbUN(QVHTWpBNvXD&BYz4$vv8RSX}v-hqEgZ+ay-QP-2RcDA_^ZcYgBtKQ{o|87~tQSK6 z%LekH;FC=O|Dfd*+B$31suI1&}sFUOriv4Fnejc)%9 z0{2Xoo~);``-FFA+<yA(2}$k9h0;wZC5u6hZE zdb?RIM{8&nl!whKZLO`5Q9Why4oGj5#)6Eu*LzrggJwhGImZ_7=*pRyF*B%uxBEqY zU)F&6*u=h(PaOIV??n{-+j&*@?pFCFxHm)6?n_d@TJpbg0lklh2Ep9FLtOkVlZ!M> z$aThmjL&PyChLMvNu2SVLDOV4S(E757E74@6_8oZ26k^NYz(wt*6Y3IQDhioMr#>| zFPHOB9HU8N&WGI9E2n*zFMCodB^PSki;6hgvq)2Q_Je`f!*H|=${gDu8@jz%V?WZx z@KGPj5)!dPpZyvSH^;L}fy~zRb#WIX&T?Rv{O4~2Jrx8wwYKoJy;vG)iduqzdNK3o zlK2N5ooJo|RKXE3AG2SZwGl!wdS3G0W|1#d+)4Fi2x$3EKxY}*hm+4QcqHW@ede_L zj+tny)9lN^nP+3C2c!<5SD25Uu5aDpE~Eoaq7uTXMcW~Y2B7$?h87*ot*nz$-A~e?h2$a(4+G!QWvh=(=2F9g$@af?5<>s+3J;4 zaUs&l?5J<85BZ9H%FsP-wlg+bS%($y&i>$ezDCE_x}B$&uv8?VYS{}Cd`b>BOCKB+`H=NF-_<>`Hehl}p93(|`*Nslhl>$jQJ8sfb1&?0nv2zr|%8|6iKmvxI*_TU0mE0&UX z)Y`^~-m%LuucSuItTUEkqX%SFqTfl#XB9Q66QwwzU5|ej9!XlRKedr(%5)g?bt}m; zx}=sQHfde0ecgF~agE%i@f+SYnrIcg#Fml*>FumcZ8m;wn17~0$Jdv5WjH2rM_Rr0 zeNPy)yLGqjMVpI(@Aa=JMB`1`{oh#?pbU0tJ-j5{rkVtiSslak*DMP(_`Do>V5vt} z&_2#z9&G0f&hU27$ZF6B!4a3-7oaCsP|Ofo>?wfVgdm4(*YB zc{m~~aXo$9Try8A^j|E4-CbSt?b%I0RtEIo%lj13B;L)Zy3-zor$V!Z`_iFy~G2+GP^*FN!*@`K}~mtXW}G{a3J&Zd~T4$>ZpR zzwxFhG3dE(W22bOIi_e)Xw;CF1}NL9IASB&6JUJlLGSTCt;SeCQ~%{rg=feqzt6nW zz~ViOq0I|xFn2(F?nV*x!d3pO3+`@vJ*(9*r$eQ6>jYU*D$d-6+)22VXAv{$b@*iV`amrZD&K|&fLUerpm#0tb5^0IL*T6idEksBlVow;GgS7o4|Up{t9B*b zmtP*S53If<&?M{BpOn4o!_6HQC&atbZTS!mFVrdM%SE@!UIxNz7u*&*(FZWmi6Nw$ zXG$A}j}2tNmiIp`29~*NymH^xLc=$Y;@y;Z;x ze)BvJTY4?6$V;#`rsOGCLSv5X!i_Y6zJi14Wt5lC!XsmGaEt9mzNaLFxov@IAk9!$ zE~rKb=&behvNTxL339P6t%N|#Hx-h$JcFpME1?sjlhHQ`0`4h9JBt{1-Q#YLbsyqt zTQWvI+?uYO6tmWDJWviE;^pwL{DVfjZ!)rpBc?njVBFSd#A$QY>V)X+B-&@Vm3gUQ z(1>`P?P)iN(*n3Xu_MrRAUjmGS(1vTSsq%-#@7z~2yK0F3xQ@v`Vol`|6KeR`6KP2 zX%;a1JGUjXNInqV*_qtjsyg+!NN$T?)MihowpQFjT5)Jwx^asWM0&J=KC5f}(L`40 z$-MMxZoT8WJwdRzSHgQS1#L0NU{Dw8XWg_QQI0q2xZLONk-*dU63EO~kc9$Ti`H?c zd`&BhVarshyhO&n7uI3`5o|DEmEYq!wbKI{7Z2<(H|wiIpCCtDch|^_^z;nSWqhEB zQ2dMC?i?R{EJbqSp(Wb^KApN82C26C#*j(^1zwxMAeyC^b-G z+Nqq%oD?0DThZmY#bbI!7?_?U&nL@JQym%ka^)qF*tz}RC;I= z?;LSPqaw3#svaR#{0dAhup{&yA>f4V20a`g2izVE=(&JXQ1s@p-!lT$-8@{oqeq^J zbrS}bDn*)i=0ugavzV=<9>wb2q z!eQuOJ7HHb{Tv|h)KSG+mvnEd?B&czR<>zIQQM38?+bN8-yDuXEc~DJQ)sY!ZRfwe z8~tH0BYk&6H+VtmhZ_&OC90ipb)s@$2vQepNe#n_{t6$r*NnQ%4c3du>yo_6>_8XxOH{+Ttxh=o~-G`IhAHf zp;tJB`S3bLrrqpaRmuGB{xqo~FO>Co;CMTYS+7L>Cu2%k9*Slah7httvuDfpr?{*< z)K^uZ3v}mt^=ya#C|g=uNLtMncbhhN$Y(XW!+rKiLSlBdX1geGHejmGo45C(Yk$gq zDXz6}WUipWt^1I=?a$AusaN_BoGk53Uartb%)B3T7u4hz_m4Z;4xF1>m(X5G3nvK& zS(Mx5LMCgTSi5U~*PgK=WYPb9^e6B6qjC_;Q>&XLXsh?A2bfBy?4h|`eT7}`4xRch zXKd+8<<0GAa?IfGU^wGNe$v&o3eF%h4{_m&PR06n#Jhld0^@?7ogt30$59$ zwQRj2L(lE9?8c#>$XK+8xZi8WXC77z61mGx#$5A-zS#Y!24pTiAGPV`Ghjj@Vw^fw zq8kx%e?9L)`PQT|qsEXJnksF)H?>M$o6x_uz*1c_@u?W?)V|ZTZFucRp%kKD$pVwh zxl2#%F$UG{K6l#Ne@=pR(yYQ_Xvk5g#+asbS+SfSazzp|E zUBkjFal0eY${tvRXRFs{A=$@YTRTg?V_~V8VeB|Z%)+BfZ6}xfZFzCt%S*c6cDaV0 z>)~J-pSe_wG>f6{p)tq@7dE~&>bwW8u#z6##wGF=*Ff=LR+ma4d;V*tlk8H%X6wsqrR^@*J_z(17ihYNE;)seJd>fD(rFqu9nbgdXXkD^ELfXfxn6&3*v3lL^-P-~DsbdU$}?~_cvpWRiqsEGB)?n4hN=X1VDcj_ zsol+WbEetzd^r07p!RQV5^m?quv?$o-1>TM{Cu;86t$&$%LRaVZwG}>Y{GY+p3+V) z>&n=ouDqr#jpV~!Z_CWN^FLq50_VKY-+^t7U{2dnS`*de)mN5Su;@Q^vZe2lCw_!m zVTT3z%Ho5zvrXY9g(jX3Lb9%9g*M|LV5 zW&&hU)>C8FF|O?m?ho$OxnPS=it24%ZXs?oThej5b;!4usmZ;`-BCA-;8&5J*seIi zh*stZu@wTgG~>0HLe*72)pkD!j%G1a16~Hnk`M+DcdCbGp{%SSsXC62UvlQq*E%RW zXc<=(pc-|XR8eseH|`ib{n|mD7&99pbocSY5_5LttsPeoRX-CNw5-uPK-Hz>6~-V zK+%Z8%{HQYK9K*;kjj~Ov{$oKt(GA7YPzl|WN4$)1P1>Z!+m+a>_d1S9@?HyfJz0Mg^%BIk!;-i^>Jlupi|2_rGYWqKoH>yAlS zQJzK#vSs<5an?6n2Z-0|BP%nfCV$q$Kmka?(LbMTzR~M9yTyD&td+hL^RHY0b-L<7 zp_&iI8P_y=3Ve{^GgfzPOjGTW`e=}ZMq$@`JPX}TE^Elh!KhYv6LUlvx888SdYD6q zKN{EfX?4%N;Y}3xYKRWv_#^}X4<000FC$h zGBa35Zu-ynIMg~@_W9tC?Tw}8Ygj&Hn^kO~l8*=-2KS^EzGz=dqwh+}Mv&gV;*oAB zjsk~E`14;o1IvZ#7ZR~L-?UnvdfGtj8ZAo->KvXkX$=cHgL%!Ip@T6Uq%`{}%X}1L z!b*HS1hv^W!rhD$6P0UbKi$gD3y$a1^%x{4$m#`>Dap#_YEHpjbnkMIuRFwUVk1YN zpSYiDH%#uPCRDpOmX;LVDAC%Eo2-<|ztyqJzY+m>-@3&3gmgk1J{XSC?5@gjM1Wiu zu#4)=H!;?7VQdEhUO8<}tB|#Xr>Z-5mwP(47c-U(;~ZMYN9J<9#jg>+jsv7ij1app z#9Td|_UrtmcQ-Tm$V=!5J%6UZ5b_!ciK8fxJ1CwoSrWmoU5+XHOf zzve@QyA^jPk~Fu*1AwacDrC{3=GJFCb{g#v{J=YhVOL~HNZ}(-Mq9{WIs)_jaB~B| zh3az{2{%9cKjdKiC&HutnYy9s&@)%(oKQrNAe;9n1${7pM@Ye9LzO4IHz zbnE{h`{O^|@;{SC{(SBKM)={si;Vl{)c-jF{~w7=f9m9)I{Cj(cl%RI{?w8`wdB8$ zv-#)3`E%j?xp4kmIRF0)mp{?#e?YGhVoKs7BBIX^?+f@-JpVyFe~RQ!k*o;Gj6d0o ze~S zH}_)l?E6Qa6jGUU0R9ge@!0bLQoW0N?&0(Ddy|i&Ib=k*=OL-s6sY(Y({6CrVOr;@ z0N7x5X=U^M>n>(}gMn#Ihw0xU-8S^O1PO4nI!c&;da5QqZDhpT3Xq$phgnv8_{-rn zGfh@OORuZWZLKNR=1bkV;^^QTb}_fkU6@YWMqLWFrj2L;l=z4XX#v8}2Vu}Ub`TeJ zd#l2mytv<#H+tN$UZpCY>?*wDro6t|q1MrHRL_4?j8x$}W0CRC7p8?njjBz@)@jzP zqRzSDD*w2V=C_>x^ldl-c@YtTKq}p`SJ;nZhiCE;k-ev+Cz4B{HHTfZFtxeS@aw(D F{|$E}Ch-6O literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/issue-239/ssh-session-taskmanager-open.png b/docs/pr-screenshots/issue-239/ssh-session-taskmanager-open.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef184b6a8f15ce86d0955e80a2c3a3c1ae3e3cc GIT binary patch literal 45107 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 literal 0 HcmV?d00001 diff --git a/packages/app/src/web/app-ready-terminal-actions.ts b/packages/app/src/web/app-ready-terminal-actions.ts index e674606a..77298fdb 100644 --- a/packages/app/src/web/app-ready-terminal-actions.ts +++ b/packages/app/src/web/app-ready-terminal-actions.ts @@ -11,7 +11,28 @@ import { deleteProjectTerminalSession } from "./api.js" import type { createActionContext } from "./app-ready-actions.js" import type { ReadyState } from "./app-ready-hooks.js" import { browserMenuIndex } from "./menu.js" -import { projectPickerScreen } from "./screen.js" + +type TerminalTaskManagerState = Pick< + ReadyState, + | "setProjectTaskLogs" + | "setProjectTasks" + | "setProjectTasksIncludeDefault" + | "setSelectedMenuIndex" + | "setSelectedProjectId" +> + +export const openTerminalTaskManager = ( + actionContext: ReturnType, + state: TerminalTaskManagerState, + projectId: string +): void => { + state.setSelectedProjectId(projectId) + state.setSelectedMenuIndex(browserMenuIndex("Tasks")) + state.setProjectTasks(null) + state.setProjectTaskLogs("") + state.setProjectTasksIncludeDefault(false) + loadProjectTasksById(actionContext, projectId, { includeDefault: false }) +} export const bindTerminalActions = ( actionContext: ReturnType, @@ -30,15 +51,7 @@ export const bindTerminalActions = ( connectProjectById(projectId, actionContext, projectKey) }, onOpenProjectTaskManagerById: (projectId: string) => { - state.setSelectedProjectId(projectId) - state.setSelectedMenuIndex(browserMenuIndex("Tasks")) - state.setProjectNavigationArmed(true) - state.setActiveScreen(projectPickerScreen()) - state.deactivateTerminalWorkspace() - state.setProjectTasks(null) - state.setProjectTaskLogs("") - state.setProjectTasksIncludeDefault(false) - loadProjectTasksById(actionContext, projectId, { includeDefault: false }) + openTerminalTaskManager(actionContext, state, projectId) }, onAttachProjectTerminalSession: ( projectId: string, diff --git a/packages/app/src/web/app-ready-terminal-screen.tsx b/packages/app/src/web/app-ready-terminal-screen.tsx index c0bd3f75..3d72c3bc 100644 --- a/packages/app/src/web/app-ready-terminal-screen.tsx +++ b/packages/app/src/web/app-ready-terminal-screen.tsx @@ -1,16 +1,19 @@ import { Effect } from "effect" -import type { CSSProperties, JSX } from "react" +import { type CSSProperties, type JSX, useEffect, useState } from "react" import { deleteTerminalSessionByPath } from "./api.js" import { canOpenProjectBrowser } from "./app-ready-browser-openable.js" import type { ReadyLayoutProps } from "./app-ready-layout.js" import { Box, Text } from "./elements.js" +import { TaskPanel } from "./panel-tasks.js" import { TerminalPanel } from "./panel-terminal.js" import { type BrowserScreen, projectPickerScreen } from "./screen.js" import { shouldShowTerminalTabs } from "./terminal-mobile-layout.js" import { terminalSessionId } from "./terminal-state.js" import type { ActiveTerminalSession } from "./terminal.js" +type TerminalWorkspaceView = "terminal" | "tasks" + type TerminalScreenProps = Pick< ReadyLayoutProps, | "activeTerminalSessionId" @@ -18,11 +21,20 @@ type TerminalScreenProps = Pick< | "onOpenProjectBrowserById" | "onOpenProjectTaskManagerById" | "onOpenProjectTerminalById" + | "onLoadProjectTaskLogs" + | "onProjectTasksIncludeDefaultChange" + | "onRefreshProjectTasks" | "onSelectTerminal" | "onSetActiveScreen" + | "onStopProjectTask" | "onTerminalClose" | "onTerminalMessage" + | "project" | "projectBrowser" + | "projectTaskLogs" + | "projectTasks" + | "projectTasksIncludeDefault" + | "selectedProjectSummary" | "terminalSessions" | "viewportLayout" > @@ -34,13 +46,24 @@ type TerminalPaneProps = | "onOpenProjectBrowserById" | "onOpenProjectTaskManagerById" | "onOpenProjectTerminalById" + | "onLoadProjectTaskLogs" + | "onProjectTasksIncludeDefaultChange" + | "onRefreshProjectTasks" | "onSetActiveScreen" + | "onStopProjectTask" | "onTerminalClose" | "onTerminalMessage" + | "project" | "projectBrowser" + | "projectTaskLogs" + | "projectTasks" + | "projectTasksIncludeDefault" + | "selectedProjectSummary" | "viewportLayout" > & { + readonly taskManagerOpen: boolean + readonly onCloseTaskManager: () => void readonly singleSession: boolean readonly terminalSession: ActiveTerminalSession } @@ -72,8 +95,83 @@ const activeTerminalPaneStyle: CSSProperties = { overflow: "hidden" } +const taskManagerBodyStyle: CSSProperties = { + background: "#080a0d", + boxSizing: "border-box", + color: "#d6e5f7", + height: "100%", + overflow: "auto", + padding: "10px" +} + +const taskManagerToolbarStyle: CSSProperties = { + alignItems: "center", + display: "flex", + justifyContent: "flex-end", + marginBottom: "10px" +} + +const taskManagerReturnButtonStyle: CSSProperties = { + background: "#171d24", + border: "1px solid #3a4652", + borderRadius: "8px", + color: "#d6e5f7", + cursor: "pointer", + font: "inherit", + padding: "6px 10px" +} + const terminalTabLabel = (session: ActiveTerminalSession): string => session.browserProjectName ?? session.header +const TerminalTaskManagerBody = ( + { + onClose, + onLoadProjectTaskLogs, + onProjectTasksIncludeDefaultChange, + onRefreshProjectTasks, + onStopProjectTask, + project, + projectTaskLogs, + projectTasks, + projectTasksIncludeDefault, + selectedProjectSummary + }: + & Pick< + TerminalScreenProps, + | "onLoadProjectTaskLogs" + | "onProjectTasksIncludeDefaultChange" + | "onRefreshProjectTasks" + | "onStopProjectTask" + | "project" + | "projectTaskLogs" + | "projectTasks" + | "projectTasksIncludeDefault" + | "selectedProjectSummary" + > + & { + readonly onClose: () => void + } +): JSX.Element => ( +
    +
    + +
    + +
    +) + const TerminalTab = ( { active, @@ -211,14 +309,25 @@ const TerminalTabs = ( const TerminalPane = ( { onApplyProjectById, + onCloseTaskManager, + onLoadProjectTaskLogs, onOpenProjectBrowserById, onOpenProjectTaskManagerById, onOpenProjectTerminalById, + onProjectTasksIncludeDefaultChange, + onRefreshProjectTasks, onSetActiveScreen, + onStopProjectTask, onTerminalClose, onTerminalMessage, + project, projectBrowser, + projectTaskLogs, + projectTasks, + projectTasksIncludeDefault, + selectedProjectSummary, singleSession, + taskManagerOpen, terminalSession, viewportLayout }: TerminalPaneProps @@ -227,6 +336,22 @@ const TerminalPane = ( const browserProjectId = terminalSession.browserProjectId const browserProjectKey = terminalSession.browserProjectKey const canOpenBrowser = canOpenProjectBrowser(projectBrowser, browserProjectId) + const bodyContent = taskManagerOpen && browserProjectId !== undefined + ? ( + + ) + : undefined const detachTerminalSession = (): void => { onTerminalClose(sessionId) if (singleSession) { @@ -236,6 +361,7 @@ const TerminalPane = ( return (
    { @@ -279,12 +405,16 @@ const TerminalPane = ( } export const TerminalScreen = (props: TerminalScreenProps): JSX.Element | null => { - if (props.terminalSessions.length === 0) { - return null - } + const [terminalView, setTerminalView] = useState("terminal") const mobileMode = props.viewportLayout.mode === "mobile" const activeSessionId = resolveActiveTerminalSessionId(props.terminalSessions, props.activeTerminalSessionId) const activeSession = props.terminalSessions.find((session) => terminalSessionId(session) === activeSessionId) + useEffect(() => { + setTerminalView("terminal") + }, [activeSession?.browserProjectId, activeSessionId]) + if (props.terminalSessions.length === 0) { + return null + } return ( {shouldShowTerminalTabs(mobileMode, props.terminalSessions.length) @@ -305,14 +435,30 @@ export const TerminalScreen = (props: TerminalScreenProps): JSX.Element | null = { + setTerminalView("terminal") + }} + onLoadProjectTaskLogs={props.onLoadProjectTaskLogs} onOpenProjectBrowserById={props.onOpenProjectBrowserById} - onOpenProjectTaskManagerById={props.onOpenProjectTaskManagerById} + onOpenProjectTaskManagerById={(projectId) => { + setTerminalView("tasks") + props.onOpenProjectTaskManagerById(projectId) + }} onOpenProjectTerminalById={props.onOpenProjectTerminalById} + onProjectTasksIncludeDefaultChange={props.onProjectTasksIncludeDefaultChange} + onRefreshProjectTasks={props.onRefreshProjectTasks} onSetActiveScreen={props.onSetActiveScreen} + onStopProjectTask={props.onStopProjectTask} onTerminalClose={props.onTerminalClose} onTerminalMessage={props.onTerminalMessage} + project={props.project} projectBrowser={props.projectBrowser} + projectTaskLogs={props.projectTaskLogs} + projectTasks={props.projectTasks} + projectTasksIncludeDefault={props.projectTasksIncludeDefault} + selectedProjectSummary={props.selectedProjectSummary} singleSession={props.terminalSessions.length === 1} + taskManagerOpen={terminalView === "tasks"} terminalSession={activeSession} viewportLayout={props.viewportLayout} /> diff --git a/packages/app/src/web/panel-terminal.tsx b/packages/app/src/web/panel-terminal.tsx index 349a5098..9273f0c9 100644 --- a/packages/app/src/web/panel-terminal.tsx +++ b/packages/app/src/web/panel-terminal.tsx @@ -29,6 +29,7 @@ type TerminalPanelProps = { readonly onOpenTaskManager?: (() => void) | undefined readonly onOpenTerminal?: (() => void) | undefined readonly session: ActiveTerminalSession + readonly bodyContent?: JSX.Element | undefined } const panelStyle: CSSProperties = { @@ -88,6 +89,31 @@ const terminalBodyStyle = (compactTypingMode: boolean, mobileMode: boolean): CSS return mobileMode ? bodyStyleMobile : bodyStyle } +const terminalBodyFrameStyle = (compactTypingMode: boolean, mobileMode: boolean): CSSProperties => ({ + ...terminalBodyStyle(compactTypingMode, mobileMode), + boxSizing: "border-box", + overflow: "hidden", + position: "relative" +}) + +const terminalHostStyle: CSSProperties = { + height: "100%", + minHeight: 0, + overflow: "hidden" +} + +const terminalBodyContentStyle: CSSProperties = { + bottom: 0, + height: "100%", + left: 0, + minHeight: 0, + overflow: "auto", + position: "absolute", + right: 0, + top: 0, + zIndex: 1 +} + const closeButtonStyle: CSSProperties = { background: "#171d24", border: "1px solid #3a4652", @@ -504,6 +530,7 @@ const MobileTerminalControls = ( export const TerminalPanel = ( { + bodyContent, keyboardOpen, mobileMode, onApplyProject, @@ -539,6 +566,7 @@ export const TerminalPanel = ( }, []) const compactHeaderMode = resolveTerminalCompactHeaderMode(mobileMode) const compactTypingMode = resolveTerminalTypingMode(mobileMode, keyboardOpen) + const hasBodyContent = bodyContent !== undefined useEffect(() => { if (!mobileMode) { @@ -611,10 +639,12 @@ export const TerminalPanel = ( status={status} />
    - {mobileMode + style={terminalBodyFrameStyle(compactTypingMode, mobileMode)} + > +
    + {hasBodyContent ?
    {bodyContent}
    : null} +
    + {mobileMode && !hasBodyContent ? ( vi.fn()) + +vi.mock("../../src/web/actions.js", () => ({ + applyProjectById: vi.fn(), + applySelectedProject: vi.fn(), + attachProjectTerminalById: vi.fn(), + connectProjectById: vi.fn(), + loadProjectTasksById: loadProjectTasksByIdMock, + runApplyAllProjects: vi.fn() +})) + +vi.mock("../../src/web/api.js", () => ({ + deleteProjectTerminalSession: vi.fn() +})) + +describe("app-ready terminal actions", () => { + it("keeps terminal workspace active when opening task manager from an SSH session", () => { + const setActiveScreen = vi.fn() + const setProjectTaskLogs = vi.fn() + const setProjectTasks = vi.fn() + const setProjectTasksIncludeDefault = vi.fn() + const setSelectedMenuIndex = vi.fn() + const setSelectedProjectId = vi.fn() + const { context } = makeBrowserActionContext({ setActiveScreen }) + const state = { + setProjectTaskLogs, + setProjectTasks, + setProjectTasksIncludeDefault, + setSelectedMenuIndex, + setSelectedProjectId + } + + openTerminalTaskManager(context, state, "project-1") + + expect(setSelectedProjectId).toHaveBeenCalledWith("project-1") + expect(setSelectedMenuIndex).toHaveBeenCalledWith(browserMenuIndex("Tasks")) + expect(setProjectTasks).toHaveBeenCalledWith(null) + expect(setProjectTaskLogs).toHaveBeenCalledWith("") + expect(setProjectTasksIncludeDefault).toHaveBeenCalledWith(false) + expect(loadProjectTasksByIdMock).toHaveBeenCalledWith(context, "project-1", { includeDefault: false }) + expect(setActiveScreen).not.toHaveBeenCalled() + }) +})