From d3cbd7c242ab65dc98559d7b35c4a9333bde16f0 Mon Sep 17 00:00:00 2001 From: jkxiao Date: Sat, 7 Nov 2026 12:31:29 +0000 Subject: [PATCH] fix(web-shell): refine scheduled delivery states and coverage --- ...6-11-07-scheduled-task-channel-delivery.md | 10 +- ...7-scheduled-task-channel-delivery.zh-CN.md | 12 +- .../after-cleared-card.png | Bin 0 -> 30862 bytes .../after-whitespace.png | Bin 0 -> 97266 bytes docs/users/features/scheduled-tasks.md | 6 +- .../dialogs/ScheduledTaskDeliveryFields.tsx | 53 ++- .../dialogs/ScheduledTasksDialog.test.tsx | 329 +++++++++++++++++- .../dialogs/ScheduledTasksDialog.tsx | 29 +- .../web-shell.scheduled-task-delivery.spec.ts | 231 ++++++++++-- packages/web-shell/client/i18n.tsx | 31 +- 10 files changed, 615 insertions(+), 86 deletions(-) create mode 100644 docs/design/assets/scheduled-task-channel-delivery/after-cleared-card.png create mode 100644 docs/design/assets/scheduled-task-channel-delivery/after-whitespace.png diff --git a/docs/design/2026-11-07-scheduled-task-channel-delivery.md b/docs/design/2026-11-07-scheduled-task-channel-delivery.md index 0ccb6b3e2f1..28caeedee9f 100644 --- a/docs/design/2026-11-07-scheduled-task-channel-delivery.md +++ b/docs/design/2026-11-07-scheduled-task-channel-delivery.md @@ -8,13 +8,13 @@ Issue #16516 exposes an existing daemon capability: delivering the final respons ## Design -Reuse the SDK `DaemonChannelDelivery` contract on task reads and create/update requests. An omitted update preserves delivery; `null` explicitly clears it. Only actual user changes send the field, matching the existing gate field. Configuring a Channel never enables task delivery automatically. +Reuse the SDK `DaemonChannelDelivery` contract on task reads and create/update requests. An omitted update preserves delivery; `null` explicitly clears it. Only actual user changes send the field, matching the existing gate field. Configuring a Channel never enables task delivery automatically. Destination IDs remain opaque: the form warns about leading or trailing whitespace and offers an explicit action to remove it, without changing IDs automatically. -The form offers delivery off or a Channel instance with a user/chat target ID. Observed contacts supply optional suggestions; labels are accompanied by Channel name, target type, and raw ID to distinguish similar names. Manual IDs remain possible because discovery is not authorization. Cards show the saved Channel, type, and ID even when discovery fails or the daemon no longer advertises delivery. +The form offers delivery off or a Channel instance with a user/chat target ID. Observed contacts supply optional suggestions and load only when a delivery target is selected; labels are accompanied by Channel name, target type, and raw ID to distinguish similar names. Manual IDs remain possible because discovery is not authorization. Cards show the saved Channel, type, and ID even when discovery fails or the daemon no longer advertises delivery. Cards without a saved target omit the delivery line. Configured Channels come from the existing workspace-aware Channel hook. Add a Web Shell action for the existing observed-contacts route, scoped with the same explicit workspace ID as task mutations. Only top-level users and groups become suggestions; threads/topics are not delivery target types. A form workspace change clears its draft destination and invalidates old discovery results. Editing stays pinned to the task's workspace. Missing or untrusted workspaces cannot silently fall back to another workspace. -Gate editing on `channel_delivery` and discovery on `workspace_channel_observed_contacts`. Preserve saved values across capability loss, missing Channels, stale contacts, and request failures. Show understandable loading, failure, empty, and unavailable states. A changed draft cannot be silently ignored after capability loss. +Gate editing on `channel_delivery` and discovery on `workspace_channel_observed_contacts`. Preserve saved values across capability loss, missing Channels, stale contacts, and request failures. Show understandable loading, failure, empty, and unavailable states. Only a successfully loaded Channel list establishes that a saved Channel is missing; an initial, loading, or failed request does not. A changed draft cannot be silently ignored after capability loss. The user can discard the unsaved delivery change, restoring the original target (or no target when creating a task), and save other form changes without sending a delivery update. Delivery requires `persistent`, including the current-session option. Selecting `per_run` never silently clears delivery or switches the chosen mode. Explain the restriction and reject submission until the user explicitly clears delivery or chooses a persistent mode. An unchanged existing destination can be saved without rediscovery. @@ -28,8 +28,10 @@ Focused action tests verify route scoping and error handling. Form and browser c ## Open questions and follow-up -There are no blocking implementation questions. Raw IDs are displayed to resolve the identity ambiguity raised in triage. Maintainer issue housekeeping and actual Channel delivery/retry enhancements are separate work. Stop before publishing the prepared PR as requested. +There are no blocking implementation questions. Delivery guarantees, durable retries, and failure alerts remain separate work. ## Browser evidence Verified with the repository Playwright harness and intercepted daemon responses: [before](assets/scheduled-task-channel-delivery/before.png), [delivery form](assets/scheduled-task-channel-delivery/after-details.png), [saved task](assets/scheduled-task-channel-delivery/after-card.png), and [mobile restriction and long ID](assets/scheduled-task-channel-delivery/mobile.png). These screenshots demonstrate the UI, not real provider receipt. + +The built CLI was also verified with all six delivery scenarios selected by `@smoke`, including [explicit whitespace removal](assets/scheduled-task-channel-delivery/after-whitespace.png) and [a card after delivery is cleared](assets/scheduled-task-channel-delivery/after-cleared-card.png). diff --git a/docs/design/2026-11-07-scheduled-task-channel-delivery.zh-CN.md b/docs/design/2026-11-07-scheduled-task-channel-delivery.zh-CN.md index 21b0d4c990a..17b351a3254 100644 --- a/docs/design/2026-11-07-scheduled-task-channel-delivery.zh-CN.md +++ b/docs/design/2026-11-07-scheduled-task-channel-delivery.zh-CN.md @@ -8,15 +8,15 @@ Issue #16516 要求开放 daemon 已有能力:将成功完成的 persistent ## 设计 -任务读取和创建/更新请求复用 SDK 的 `DaemonChannelDelivery` 契约。更新时省略字段表示保留,`null` 表示明确清除。与现有 gate 字段一致,仅在用户实际修改后提交该字段。配置 Channel 不会自动启用任务投递。 +任务读取和创建/更新请求复用 SDK 的 `DaemonChannelDelivery` 契约。更新时省略字段表示保留,`null` 表示明确清除。与现有 gate 字段一致,仅在用户实际修改后提交该字段。配置 Channel 不会自动启用任务投递。目标 ID 保持原样:表单会提示首尾空白,并提供由用户明确选择的去除操作,不会自动修改 ID。 -表单提供关闭投递,或选择 Channel 实例及用户/群目标 ID。已观察联系人仅提供可选候选;标签同时展示 Channel 名、目标类型和原始 ID,以区分同名目标。允许手工填写 ID,因为发现不是授权。即使发现失败或 daemon 不再声明投递能力,卡片仍显示保存的 Channel、类型和 ID。 +表单提供关闭投递,或选择频道实例及用户/群目标 ID。已观察联系人仅提供可选候选,并且仅在选择投递目标后加载;标签同时展示频道名、目标类型和原始 ID,以区分同名目标。允许手工填写 ID,因为发现不是授权。即使发现失败或 daemon 不再声明投递能力,卡片仍显示保存的频道、类型和 ID。没有保存目标的卡片不显示投递行。 已配置 Channel 复用支持工作区的现有 Channel hook。为现有 observed-contacts 路由增加 Web Shell 动作,与任务变更使用同一个显式工作区 ID。仅将顶层用户和群作为候选,线程/话题不是投递目标类型。表单切换工作区时清除草稿目标,并使旧发现结果失效。编辑固定在任务所属工作区。工作区缺失或不受信任时不能悄悄回退至其他工作区。 -以 `channel_delivery` 控制编辑,以 `workspace_channel_observed_contacts` 控制发现。能力丢失、Channel 缺失、联系人过期或请求失败均保留已保存值,显示易懂的加载、失败、空列表和不可用状态。能力丢失后不能静默忽略已修改的草稿。 +以 `channel_delivery` 控制编辑,以 `workspace_channel_observed_contacts` 控制发现。能力丢失、频道缺失、联系人过期或请求失败均保留已保存值,显示易懂的加载、失败、空列表和不可用状态。只有成功加载的频道列表才能确认已保存的频道不存在;初始状态、加载中或请求失败均不代表频道缺失。能力丢失后不能静默忽略已修改的草稿。用户可以放弃未保存的投递修改,恢复原目标(新建任务时恢复为不投递),然后保存表单中的其他修改,而不发送投递更新。 -投递要求 `persistent`,包括当前会话选项。选择 `per_run` 不会自动清除投递或改变用户选择的模式。解释限制并阻止提交,直到用户主动清除投递或选择持久会话模式。保存未修改的已有目标不依赖再次发现。 +投递要求 `persistent`,包括当前会话选项。选择 `per_run` 不会自动清除投递或改变用户选择的模式。解释限制并阻止提交,直到用户主动清除投递或选择固定会话模式。保存未修改的已有目标不依赖再次发现。 ## 影响面与风险 @@ -28,8 +28,10 @@ Issue #16516 要求开放 daemon 已有能力:将成功完成的 persistent ## 待定事项与后续工作 -没有阻塞实现的问题。通过展示原始 ID 解决分诊提出的身份歧义。维护者的 issue 整理及实际 Channel 投递/重试增强属于独立工作。按用户要求停止在发布准备好的 PR 之前。 +没有阻塞实现的问题。送达保证、持久化重试和失败告警仍属于独立工作。 ## 浏览器证据 通过仓库 Playwright 测试环境及拦截的 daemon 响应验证:[修改前](assets/scheduled-task-channel-delivery/before.png)、[投递表单](assets/scheduled-task-channel-delivery/after-details.png)、[保存后的任务](assets/scheduled-task-channel-delivery/after-card.png)及[移动端限制和长 ID](assets/scheduled-task-channel-delivery/mobile.png)。这些截图展示 UI,不代表真实平台收件。 + +还针对打包后的 CLI 验证了由 `@smoke` 选中的全部 6 个投递场景,包括[明确去除首尾空白](assets/scheduled-task-channel-delivery/after-whitespace.png)及[清除投递后的卡片](assets/scheduled-task-channel-delivery/after-cleared-card.png)。 diff --git a/docs/design/assets/scheduled-task-channel-delivery/after-cleared-card.png b/docs/design/assets/scheduled-task-channel-delivery/after-cleared-card.png new file mode 100644 index 0000000000000000000000000000000000000000..9e731b2ccd9c1c47b25f6e70576da185c947f4bc GIT binary patch literal 30862 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

vt5W4d#m-u@53 zF^C#sVnyagc=TC@DaI(>O-@I0P+pnu!R8ZOI!TLPy*6d|BrjdU_Dff0@d~rDug_x6 z$&6Dv4KPhq} zIGjuU$+BsVz2y1YSXr74JJ}V^mENLkJC*04c(L`>zfU4#eKn{?l;+>N>#IDXMzY!e z95bFV;SevVm2hm}Bv<6uJ-;rrAw}&!OYIy)5b^)t2$Wp+e+#<)`^7W2*Ry(hdWxLN zwmq#e+Lp6t#r*RF$#=*Kk$cO}-DS)DwEvxO19v6X87YyC4VYzAb|4}0gckvF1*O{i zc!R68nf8U=1+0-a`My8DHv*82?^6d5L*7`yFJ7VKQg11bT2V{w$?5fYjZYt(xOOS` z+xh9w(xM$UV;%Wq?Fv1oBec3+ys6XDejBidZ)LKQBgtn<6Cfnw^*66y8J0?#JjWX@ zH0QextStYjPmn!Wkg`2ZH}S!-p_~gX4s{8#*vZ~mM@WFr>vMln>04@kabSydW)k0; zHGUiS?sj^C8hdqdW(Wm;F$W;PCc#;4hV|d9UAQ#$X}oY+7lAJQ%_hNoEinH1yn!I?Buh$Jh$28ONMD)t4Zp5)@pHmSwBgk;M)&c>i4X< zR(uni6D1qZsQ&U^Qa?gIaF<)Ds=~n+|9#9>nB?TGr9fBF) zw2)voU_orw%14r4jeC+-mu$R#l;LdxX^#UvrP?(<;Zh5}@+%{6i_z8#FZ0g_n>;_6 zf!FT=uz&xImmN|r5MpNTrS`fcWxp?v4&i}X@rJv9p~Spi9DZKu*@PXxh?*-@$lHGL zjZVwU)418Ml&&*(Vr{Vg8+WkI;}slDQc{#YmF4>V>RhLh>7|^G&i&y$<-S7W52?HMf}T&P2M9}mG~UTyLr-zAX%iWHO;-~S+(zO znN95*pa8LY#tbBI01WqR!`fnx@$dPUgYJYRGDhxXJkWKU;Y=(F=gh?)@0YJ{WN$?; zAyZHh#*q}tboVRDg&SIvRCCL@jDq23a~-aFKcfSFoOm(1f#u?^cf6;#nD+^oXugyD z%6-xodE9F(f8ae}xm&NX+enaZq8yuZ87-;9&Cd)iO)VlVC6i6qQPE`DQk=V6vF@iN ze&1nnkg==?Zl#7uf0sGwQX4DA^E=G^YAyHs3WXFuuUnNbWhcw_tj-m$j*@z(Kja)s zH}^c?;V@b3++;tu*=LWw#&JyYwxQDWmYV_n<&$YjH_;WsX zN?QE=Yv5Vq(N>Ef5nkN{8T+Pmsyc%Fb8=IdSW0$K&10vM$?1A!b(6RCN`K6J7y9gy z(hvMVi1RBa|1FDV$fAv3G$kY1K5+hTi$}ni3=ch{q*0lBMDjXze>+yTKAc%4VE4fQ z<`ky_eQH9`>7U6L_F6kdk-$4kr=VYz2#5txf%e#wwa<)B<1U-KG2M5udTdtSXUqHr zoWcG#UbXg}@$8Gv>vT6gVQr_HxaXH2+6X^nMbf=q)Q_@nIOq~$>?UzG$}la_{S=*D z!)do1W#FFl9O@DNn4B8H=N-h-7i#Rh;9xz=~LMjf&0YQ7}a+g?re`uu9`YHQ_6#*;nJZlu$Xr z6XkxAB5sFT*>dzANkacW+8k^meE4W&LQ(7HZqqCb+l?T$&%ppr{miV{ia>U^ZxU z(%^X6NoAA2edWbgx<1?_5KhArWCm?q9Xgl%V@Jy8v&!7=(3&ZsoouiTKdv$rv4NF` zZJ*e=-mSDeWy5T)wPJ*FK?4^Z_4n>TU`?sed%$QF>|s3zP7faDlnZ{#?NY)hD=Fa7XH}ANy|1Vn&ekZViqcL=Y>6xn8MoT>*U9eZe8I&-orhO zy2y}boO0?+f~@Eh{;rg+;OdmW!`gU<H>jxP%GKCnaewV!8-(4~YA2ix zldTMxGY;`j;EeUx5@lmHWq8gILO-P0ASrxxk41Y=lgBLvvAot{Po{a^b}`)x}|UvKIw4rYl8zmrhB#HWbc0NfDHbEFs&cA0G`$A z_VQ(C=J!7^zV3g;!bB`7*{FZu#x)H^m(e}WYE9EwZTStu4E}0$zXP;#T0J(WN;~b% zrD_S4|77?T`Rllrj6sdV=~|oHpdoWx(^e}M2c&W*ROM1OWC4YNA1 zW9q}rjrS$aFHs4BXPeFFdE$C`f?h+9!X34s@}$?BdN|!yPze*G?89{!L|!3_()p(8 zjXheo=332*!|dXqseZ^TpP3(v=4TH2OdFFq_ruQ*g*mW5A~1yVNGZ56f9O$%$mXZX zhJ%M)u4_cGlI)ytJcLtLYJq^YHsvh=JGZLTHl(PB&CLGck0Ak~p%^OLA8TepE&d0K zrK|Y6Nya@$o(T^>pH|pSSir+|IrkWn;HuK81PiWT@ zJ!mqlqoMjq0mO2Hmsmf$_sAp?l-ex@=cC+8x7CGaHT*-oKzN)1u~4emV&?i8kWhY3 zaxVRW@qlrXZJyi7t!#FhA3j}8ZVGPJp#Nwv{#7+F#2z^FK?L2IYJ)}PiITs9{8)4i zdb$TAcQsj3UFsV1Y(nf7;)W25!!-YWH$Vu&B>BvLZKfaWg|ydAGq`Zv+cY zYJPY+{_^y@Cuu%;-@Sg#Q0J_~qOv=Ti(2o=^b~!W53iGO{I1}UqS8yNf4Ne28U;yd zOPa=eEoBzg94}#8JcQ8Vm2hkv1iU+Po^J6N$j&0~xibkKJMU+2mUW(0Dw0uV7TIx= zpVra@VWaDzRj@a;R=J;5)1+4hn^5A4#1&zoOG*A`T_o*a9C@L)C>e1hIp>1aMzK0T z&RC&ijZA8L6XgS4Vl471LW4dEn?$vSO$uqWoFf1uVP*1o&1psb5o@~JB5pqP&nZv% zJ%SVt(;HC3_Pe{4(Py>MhV(hG2x#^S#5)w&)$;A=xxGQ8!RN3Fca|RMiDo=GtGgu~ zHL+0f#?LpIQ!^(S1Qbg`<%ZLf)&E|z<^;QS(G5$qMfHj$oGVGXKVIEqVYU$g0rK0&JT>xNT>Z zIgl5{n9(X*$y-)S@|4WCKOp62!5X&ac>TQ1;NE)fE||){1BV&u(rg$Odc&#rSi1F`oh#d;r&2$YJqvo1EhHcJpX5E3-@tb@;_#665>n(25MHZG1Inr! zJJEY}7F-Sr(b^(7Tv~t4xB$D3$+J#&fKsi!e*F-aAdxyOLuGj_q9~7gy`cWjLNDKP z)>Z30kPvv#P1=}?{1#ES*;(@G-buQvvrc6BuP%@Kr3Mo+w%l=nFr3lBY>DrjpHfyt z-_KjTs0Mk%9KT1g=YrR{6PomLO4`gBtxq&++Bw7S-Hw_`3F;(_pd+|>XU4LJI)61r zsPuY(3EshY;L)IY70&}bg9#&^b>T8g8@4k?&6?Eqi+n8$*h6@~s!!eZ-b?(Pkwv4q z?cHI9OMyKabt0gz1mg=kqNlZ=S$~Sr?@;5pCx4rrZ`mF_=Ubl;*J~tC?>?P#<^_LT zpptXsUc;tpw6@<5kL&HL8BZ?)%ie4ir~P9iYeV~C>5-_Wq;gu>^D5l5-|)^vHRBT9 zsG3l?{E)^#*UY~Y{I!?W`HY;$ViqJCa9IJ34PRCi(n#yR^iIK2z1V zR*lyC4+R#q6m3x?pWgoaZkCnn)^G>#^zTG9Nau5)k5z2<={WJkaqe{z&u zA>y@NQ+fl0wu2y~fEDHDlt6CHd+&BS7GUNzl)5?k;~Wirv2xJ(n{}F=jLN=C0elZ* z!SGmn2Guk@Jsx?Z<)7X~;hC69xy!@Ab(WA?{w3B_Pc7aJz5@iGIWs3f1c;rAGhZy; zXQa@vixUq8q9Q%-nDe^*><6usSc~4 z+Xq0NWEiAsl^xw2ZK`54`IjsTk2#t(ikab4qE`%+n+JlW;swUHHbgz=pQ;RHW9eH4 z#}YF$Ao})~(c#qyC+AnkOM| zacy4$qY^pA)rI$7^X%kxsJnbZ_dvBbJvS278sq<{#dPU*$8616v39?ttFyAxwFgtq zAFYadAbG*z)rSqJEUXGwoD6h3lCj&OG!w!ueSPt5upuRKuRc`4%3!ABR8=OS*<7Oy zsd;{M)u5bpa_pOTzqSJ@3X+&VbHMou;VO^uB8n5mt+ig?cp!J#UO?}KSr&QqMa$kZ zgZi}f&#dCOcD$|wmWa;}L7Ob?{~P`PKPuWXcYs=J-fXyj7nHZ8~1x1i~%t)|!AoF!t)>j%ovNsT@!XuX6^`59U+M0VgRHF9t1%XeeU;h(Rq{R@mF>;ahv>lF?P z#3O$?5I;dp7kE%WsPRZ^&cI=Ogy&N=p$hSWwxPFoU?2AJEmsFMJOYeg77$UG-EWnD(urgo^jxcOZ-wo=7<#;fpDY<}_YK~%=tKh|+*e4=xdJ+iC=o4IRs?`ou*nc8yiemdIx5iSUo|$5;{K_8TiqZma`yPX%((h5(!-l%iV1t6@3*d2QC&vnk zmIp}O2`XVJlYAEiL`6lHy-L<@R1q?KYQW>MRgX@x!3)*~|7QPcK+soT7CnZW1nTI+ z7{xg0J)ohbDVk>6(wfpdt3=bnx?d{C< z0pXSrf9+Ioiqw&kh4G^CP&i!z;uvo}Wb^7|n4hrmtH0S~PuW4C>wr%167;&UZQC>| zw;aUa4(1czzdY^()*>$GItUmLgQ!ds{hW!)Aj-H!qrc#p>JQtU|&Y9JEB{62<eo3Pi=IjIb>tFG)T4^URLF4TH@SPTgR^#=x423si5 zKk|k?7fOVU=7$g#qtln0L7nYgeXdT!Zf$IE?0V&DJ3cwDC6p00`wgOV@&N)jx|K&Q z_++s}P_}cy;#U@r{k!;nD{=dUY9eJEImFbPED3Y}THytNh5jLmp_)D{3g;6HLulE( z1|M5UiwLA&OgTf42qEJEkQEk3uyp#`mDvp{w6|5x?KaU|zuoj=mg=p)8@$5jd+BLa zwIDyFoY5&JHki!9DXo_!JM^2dx-0~G_Xm#I*4{oTzV6A=(h`3zaA%)!QMOICebg8I z3H1iJ2pGyYj}J0=s?P*#34T2=Jk7s5rLVEX8svOn&N3oCvhUpN$T#BfxwTF;X?V9O zLx}rmPK%lt(`=PC3H7=+uQ6tS*uX+85)Euj#~?m_#VhN`rd3cxQC(eZDTc$x z8&J6{i%k)^yROwb+*#%I9=`HMTY=$9+k2o5McM@2kF8g0c%zr36wX|x&z5f>y#LaI zj2BmS8^jtVw6}xvXoVxoPr8{V+W-JKAZ2NMvk*n@>CdXW%@-iz1)(^F%QxcY#+{*- zPtg_L~h&?Zg35q7t|^(0H1)9#bv9j+ajq}dq_O=K>vmkH&1 z6U^aL%f0)HMk3b}{A_7BF(ZM_TOCkdjbrBkjL?OKLfzBk>?`wZhQB1@##Z{|Y;R~H zDe_w={0%9(D^NKY9!S~0k||DnXeMkI;ji4yG4HRsh2fTdwCZIBHfSQ=C!(vTcI~zF zQ4`P~`2yZvg)Q9uezsls1qzqSXHNtzLt-_$MMj&h9}x25#|z% zLR9ndh869ync~`SV!MOZv&`m%r~a~9oxzo3QGMb2RqL}4te|F6SCAzS6+F{V=0HlM zwJ&?NV)D0FMfH;ZS{yM zW-?bOwdxM_ro!tqjXvt9RR9y(Wuo%%pSH};dQ0glO=vaQdV0TpU~;?5@YA%4?_sKG z+5r#4Z;QAng-7ww(D!)Y)XSFxPqK!xBcL(wExYP)!2-3SCnqf%9kd(@D6IMKuJqR@DT83&#Nc9C zai;3iCvDMg|3mtD9>2bdwDIZQt$ZB+oil2WJkQiq{%u@RWJ~JGk7k2V4+VrJ^pY*j z7G+Dxnqk{)%A*^hwnN~gYqtlU4EgH`pn1MhxHuh)ldxNwre=G@{?v)ZvTczDrqS*odXynPPZ zTWS5qP|@M$Pyp&{e6DN|KC3!Rn?Hp1iR(mAF_+z{Oh4z|m&gGs4f*kXSh3RNO~t@m z1Ov`A*)=T@o=5ApilK?yv(g+h&B!v@S(!Z6)uKv)U;Gu+aM$|3jYE^Qf?rR=xF_O1 z$SEyi-~Vxkyzq^9uuK;oGx+rm-;bRD_!Cw53B}RuO09+j=ZVEi6rtg4&G=Z1 zjFWykr654K2X?Siwu5+BeKZq{=N_-9wo9pb1GWpMru0VH5e128S@nPV43Q%d*W@lb`m(+RYoO51#z8sz=nk3vw%h(|5TxoMt zW!t!VjBT?mq?J$oCRo?33IKuW=ZT+pi~Da-_@yBJMr*$fd}tzSXKEo(UiXUI$jn)_ zb_uFO@M&~FM*WNG>*>E8yA>eDe~N3=6P3H1SLM2b9hG7w`*h+O*Qwl@79~TeaD7O% zk5N6HU!+M#mp4SxDHL+~{*`YUAl2dY5qB@|ex}!$_BapCeeYDi2&l(*Wp;2fh1lk{ zs^AkUvhqGQ6?d&F|pI)At zu8y4L+ezW!$48z(B0LX56yR!TftECa`?3aJ`f1ANw%I?ooh9nhRefjHv(UkuM&740ZLPnA zHr&qr80u8(tpAl{Z)68gq$&$P@W1B;g!WhxI5%`*ze`Z4b-4>vY>rN}c(r{hu=ECV zN?dL0fol#Snvr}^*xfW2rbHMCx$N61U7oB&*gAY1{j^XK58v`4SX1@TMzEJM6)xHf z=p<}vW5elKW1O$0nleAtVO4N8D-T%pmyPJ7l>QZp2QG$_74fMT!FJ!wMbnCPa$_o- z$Ur+*&i^EN_Q!?Co^kywIV2N)x%_?MU~&-gXv%EjyaG#7QX~KVZkx<|kTUA8dHKak8E79m`dPZ7@t zqTOFKLnTnUE?rOf6)?bFwv1Mtpy|wTdE!+x_nB0si_5>U(4fxI3G``kGTdtkF+Q0O zk{rJ$u~^oh_S@zhF+P9;TR_60D>~k94!q&}XOtmz99_&jkT}EXERFTaT3Rg%bN3pO zD?-`47y9n2U++xQOKSZNx@P|<$BoB5ee7JKsg~it-&rUmFk5sza=i-Fq6Lh>VcB7(CEAGz5!@dFESaCJXG$W zO<@;X9ppIZgMPwd>h_bG`uecbKIl}-PpVLM>z6|aA^fJQ;C<6oe^seYx5n5b66NSK zA5<7_-J((nI*Xz5%%Tj{T2!<<)#|B=De-P({YCJ$@*Cp5V}GE;Anj|Xd5D`y#HC(w zE^4MbLe(AwXYV;sO~)2scCv7Dc4Rj`7xntO&=O%4BwYGDvo~7PI%^uR$E@s2d0JRl zxM@NP#PRLL`dG0ZB*CNaxQev5>~As|{?}#yh|YSuj63*Y!;>a`3%?81nf{v#7)a7{ z6slp8v~TLjcm0p?EN^CQC0rG#L&exrB#wa8p27{^T^zxHZ1IRy2KUV}CD?oN*PD8{{eHPSn%991x@9e+QhX3$XI#V`8s z1Dd$FU47PwX5yVeJF>J*iRs)*p=bEXvi!c(x4-uN!ZSyuE~k8hQK@PF>4I#ORZx+e zqxD9<0#y3|m3wqJtE(28nf%w-NPN`)lZC>6{SPza|ISPa?(u)+=zGS?t$F6mnUDvo z>d5iaTM1|T&$n9910G`?@ITf)kaY!Rs(E|i-A2}M>!zosdFMlz-<<#aK-N-CViB#s zV0JlvzRQtQR5X(qUGWy6nG_XV#&;zz4LA8KL~NPJ+d*72`aqE|+k_-4$dWs%X}&?T zwVys#*7dwk2C6AuKA+x01(-i6h07p+kUG9TGrUlGYjeXFLP;O{0OKcpgBtA5X~+Ti zZHn2l4u_Qfo0Az;A@E0ucH&dlta)oD_$z)jy*!Ou!6(@M3WaG-I^A5E*$u%=e(BXV zRWT)aG!bCxo)4pvz;Wrn(@n&^eU3ZGNA4{qpT8P8o4wD|z<0%ct-7zTZ_YDAt}YF7 zg+41xP&7X`4B}K2;PZQTEk*6~1H6(cPGkHlfZTzwDTTlpO2X3Uy3kWJYt<3EYlMyP zGGCbZuC4qrCYfdU+;DnkJNfije_f&}q6V8B9&k8xH3W+a3l-+l@Q)=f(%85B)JPWt zhqaaG<1fwD`>nh|m}>U%cH!Tz)%;yEUBl?~BC7)8I_3nB57wOhCYW?B1z42S_E4!y zZDd8)d^)+Xo|U+IeSKGuMCirTF?<953$H8PXI-fKXj=$uzY|>_KxR9_u}yCI)wXE8 zk}QyBJAvmx@WUhMbe~ZFuYwJAY93*Ff-JWA*{XZ{8u% z`aNI*p_8G(jR9P=fZyYJFpE621l&LzfoLtrh|RyjP)*&)x}8Nz0bCDt48snB&*lc_ zfgkd~`eCmIvqJKJ<>4sdj7=)JqPsdlMSsQ)od!;U zQFF~daU_vrsUe1;ls*GnSi{2r@(qNkJ+Lunmn~v~!h+<=iadpMBA)2L>Qu6pu&($_ z1P_@lh<#>%eO@lF1P{Q;?+HrcCAdT~mhk(a7uW%Rv6nk3);YEAR%yr<5I) zTdpF6MH+WcnG!f&qW^-p&cPjKLQ062xR3sFEMtIetx8vx>Fo`qPbPC!x! zk>R!I2eltZQt_ITSM)a!S(H|;5S73DjM%aFvmhIZ!5j`&WYf3kRLbi%l~IzVlAJa(HHSV~!m)&?*Rj zhQ}CPC*A3GT$tbF5E@h;i|g||WHJ0K2}gprx?uPl)D=`!5LI%MUbPcaEliQN+HqVUbyod|rF27qt=NPwyK zO!Hzqwz>N^YcfiJn!l^h)!^k02wo&ZI5T@{C7g7mQmQdi7s=xRLg$HznhN*U&JHJh zzG8p@=y5P5j5qqo!ba9}z~Y288_7j^=Qhc0P-EfIb_jSm?;mW5VW6x>svB6J+P2#^ zL$hV);0RA#oJ+FRszMIomXNwMHz3W2Z zBercaJLlO*ETs6wf%BKKlEjwLpgh|`NO$xRsmr8Qg6O2~h8dM4B!fjfmE6x;dx%km z@b_i@w38o$uJEwEL97ygCbxT5M-^Kh&{*~=*iJIRR$i4=W~{Z85a^%*I6|mA3_p}{ zl3oV)E6{ccOhm|DLjB9tVWC;gH*RCx)k&0)F=8qQ?H)jDkwauQ0Qf@a?OBifmB~m; zsVUp9gdHG}l1Q_`=H9wbitp<*rn0_6Q)m>kjI>m=Y{QI3nR!g?fzhP>zbaT9(c3Co zE}^n@0`E8Q#l(j065%knd^WF0B3s)U4i?hnliIR(k^%ejX9N#c25}@%OlPKsf(=# zI7?9Y)FdB%k~zFBaPS<858U z9*FSFx7~r-`}4Wi`6C6XX)%~LHdsWkD|)Fs#9W`nZSVOornU|dm5|+lY^B(YU~Fp-QN*R+ef*{c~b^f z3ogdM&tcr@NF^SfmyMVY>%@ukh)2P+~^AmtRkM1^g5&FH~;O$_udBJg|>pDe& z6#@whgA6+FNUf)b*M&}?6xb}UL{Ylzn5!d%W^de{I(2OQ7JZ{)c-kA5i7P{1y@8#^ z$0wv);SM`~qv7=YwV-XOc(LJsQ+DQmK5at;1+wdiJtM^|EX5BQ(iDoI>+$UzN(xgq zX6R$vaxM_|H9%Iy|K8FMc^DB}krz`+!<@L21Ib(?HO5Vcn$!pSp8l?HFD)$-edj%6 zGoRVR0GQ!kU!!7k8)X}3r~jL#aEDq9Ku|-{=Y5wZD`ip=q9XZUcbi@DIoT$yapFWtmIZVT z6Bq5M5ek>+$_-cq_B=i0_46Z>O#l98fo!hYXyMKzso9^;auT47na*max4SKa89k)Wk)7&&X^}2$T5{GS}?1QOgIo zp+NJH@c~po#)0l2(a=ncIoi)?CS@(cFH>Rjq8=SVkV6%c3-hwaH|zVxMfir0FCVN$ zMqWWiRtb}`PF*F&s~U2R?af=vzceG$gK_EGa22TwkgevD?%3gAnDk|tmAxLqKxX%* zw||!(ovz#vC01|oHxxL%Ey*F94q=*Q5(U44m!K)@J$zx1KWhGkj}gKdr9)~>9`NLv zd?yBs1^K7zxEtbYiM`3*pmxpbDowRXyz`5?-l6hK}yt|!B4ixCNa53 z3V8EJMIJov&6Q(|^8V@ilFOwMe%opUNIz=s55x~CfTgbfaRY5q0#z6GW84AV3o8`O zNy&9jQs17~h%tD+xdCQdt77rMPK( z(5Tb>3|e^5ntso+x7_R)`i@1cgSpyeqAveH-KVt=W|kbrC<$={E(x;ZT5buz6VXa} z09L#-0w0Myrg`qC5Ci@3#gY1|O(xdoJ+EtEtU8~3!I z!;FdMhq&LRErmuK)`e14*0>|(s^-6^=&^)YW+Mbri$$d(Zj%=6q2eFd9ZjiggnjoC zlFMp6q3{W~gDM`1c~+1>K-d>pJDmR!of>|EM5IW)2c$KCZFUtk)nbWE8kiggr*o8Y zlZ+#;-N?F&CH{Sp`;52V}hz~jbW`+onqy}(CtO2J~IeD zZNbRGj;-oKZ;)kovPcOF?EGw+%~*8nZUX^nN{3uERlgpi772!5Q@PH@=1dpkSfEyp z`F0?)fU7O=HdrKGL^*vm0>u9E@DD5If$<=v4M?z?os$&>-lXzVwQ-<>YS0=B@OKQz zR}o6-oSbkpoi96KxRsk`XW=%mGeKN{!@0re>T)&WnJ5!7g38ey=WXT@kL>7x7`9rR5c z?(Cfi*2I6MpP2fW@C*Jwc032^`2Lr}kxZ^sO+K7gASMux9s3SOlxpz?q!(aEX?*co z;0ejcC%_c7V+=W7!cH8V2yvL;F?3^|li_2);_8TB)YMOCDZ+(a;oK#2_Y8hZuogEx zGyDaErVei4Y}RHOtv%(l$}5v$AeCQYehdNs2|`*-9)KXPi3<>6C$4&5yF?5#ikt4x z`z^sj1$O0Mim7Bbty9z!+#d4fAIyQLc!Silt0(RZ^!dcr=?2ks3f8zHuBk-XOS{d|HQaFGBy{oV3Sy->|cnzf6#}(=yND9&C zA>8-kTys|;Gjq{6(bT@%MbL1cwJO9*2dlF z{2Cu)JiQQI_3&3Rr8u_(`ykN?!v^g@TrlU+xBtdY7lEI|ivWDg85$lXV=H9_Tcpe3 zStpHO>vs}EsGY<(0VG`G7u+vYgiK19lAPAuCM}Bua;6Kwv{*lkn~a(t z0Q2_J{^RC|830=TGS2RUuWuqds@?;OXdcWaFZCpFz6)uq7!||iQ=pjTvq66`qG{6} zSlU|2bNHr=lX{HsarDPMm8>LmJJVW3UmW0Mev4iWG_E%Q z9r4c59*t63!8$WE9HAQk9}!x=N%B9eMJ(u%G%gh;j=trtb+jBRJRIhJ5dI+N)51(l zmjuSj-+cnYJeBwY_#YH?8mXZWZgl&-M|Jg4%> z-(-IP;39-SJ~Lb`UZ2q_8Js#Z)+zshry#|Tq$urF)|XxB*r5rRIdGmq)O)~PQ3Zb8 zCiO!shHeoipkw^KRW0z*U>=@_2=FamJqrt z`~x9N5LeQ+U;Y-T5~b2|atgRRV@sHBW5xiKfs<-Q1r7C3P~ms(JTCxWElYp6|Jcm_ z9_5gKNy!MB=binHwwtaKXVUop*89_fTS^Ye_6D-oJhT)ZUx=sBnSDzr%bJ(0>q5a_ zU&?M!BeX-%j=(8NWk1y`doDFikT#SUwK~BgW+E=zlyx}i%@@;yBA}m$fw_H$tyLMq z;(>6zuVjcj!Qgg0IlN?94w5gHX$E1=Z`Z$7abM1$0@s@>SWg^obDYZR;usV1ITJjw zu-NO2(&>ON+#Uj2s6||50dy%KBU4|T6LyO$dIewTwY|o&l%4u1b@9@fPDx}~7=FT| zuN|YY=aHzW+ItIdo&)3@ZW<2*02Za9;dAJqbZYb{e-WdcnvGc=g<_Ner>xu;|43LEOk}1bjIvxeWt|)$n1sq)t>a5l_k;w@bhQ$_{FwReSB?7nkk-9rr5 zK2&_?l!W}}0erf(@9${yTkFEPnlenK0~cDUjjjKnTe^Mu{~${h^|Fh0?!5SzUO1S;Y=^g|`!%NH0pVQuQY?{ay0cPP)V+!o(&I z*yOwTAl5jk^oV*eqrThrBd8r@`UWL~Ow?hUjWnj!lS5&Uzk&T%>t;Ta$|kJsnSXHh zUuQqLKR`utHW8T~&<{rwZm0mxT0qiYM)s~YutSYK z(XZ)g`#rgQ@J8j4S1O#IQ1^TV@=Bs86BjH{iyysm5vG2cmdrYK0zv4qQ-TIzv*k5( zK>&)oJJ=q0-&7N@NMJm8HIm;?2rFcWTG?pojeC65EeuZCxw{OIGq?57)}qH;?_(r* zO(x;;=FuL*8zfKisN1kgL=eyL69-uQhiOm7#sLbnd~D=P?1ZDng9hX%v1@_HcC4*@ zyRLkP7h(qQi=3>r<^&}WM@HP+cjVviZaMjIZ6#`{83w3HsDS0Kzh>E66;9G;iTM2_ z@)fIuYyU6jjYSWbo><|}zqTTDhJegv=qDm%tOIMFuGwn#&+<0VqzKQ#JTqNl*vadr_GknyPoFQOmB{Cfz> zx=k|lkCCLngdgSK*$~n2ko;hj^x8^J#J`90%T5$mWKoC{{`D@IKT+hIkyX?yN&5_j znmcZ<2-9dBzVnag9;YZ6^ov1<1+fyTiJ%6Yq16H)fWu{QRLrXx&F`p;<6Bh-!b?dHrvOi={?DDTS}Ucz!@b8}e62aO=OMa943vBTyeA%O zaw8ZH6|k!%*_438nn#FzR9NG58#pk@1QMyKND6EUS0;%2K@oBQNTIy<@M5A6jKeQR zUvQSvsu?(H5@B0!Af5ugO5_1&TW_GyOBw8VOqIk%<>4`fN!zwhrPB>^Z0~zwb1Z+@ zz7oF+FU;jSRecZ?6!$vXjTCb|Sm&~PkT8%J7dSI}Vx=9w!)8tZ79M{Qf3&^Nz~l*X zewLhifV)f8>r(*JM<8Fv31YTVVbAKA`Gt%z|6_F}Z{p%knXYSuJSW8$Z&V&!KE^tW z@C0HjctVb!+78)J`h7q+g#iO$%acq1AX_<0?Cdzi;VSfTB!qemIdW1O-~jQEO$C9O zVUX9%Qq=x7OhR4U4RiwOf(;+r-M|C?hYK(|y;q1hL3sL}A&ahj2!TQBm5xP>R)K z*jIiSnC}br6aNZfCFctOPSx1;uiV0^4{SId0((w*Ai*^hXLS&VJ~fh2wzRM`1w#~q zhi_$j1KuD?Ps12vnUc&kDhp0wkicbNkKIqzH6!WT-yogwT)K#Gh*S+2TTQV4W zmPd+DX?l8^>*)gcF@nYYV?eR(lDCCzp7@9XbOS@_8wq2B4Mj(W8pyQxDAVyoSh0cS zwaW~UT>W~LP?CoU(SL-D)w~Fx@@l2=KLRexEL~1vJ_UjViG-M}$Zl#)GvZK6>Eb7E3uAmI5XWR#VznKVfN+Wnj+j| zx~b(CG_sOcCc60F6JK_^0hyZYI|Ch_c;&4;ooLkUw2GCjfyMVLt|i7>XnGOlyVf2W z8;U1*?WP^lA{t+}Fg4ah6oQ~ow8~(~$I#CUDoE^jv3U=#%4d#BGn{Iob;|aIj|yXc zCR&oCqfI5-3WNg^&H`xs@qOz zu_9+5iz~P5ha+#GiYrXG!xf=~gM)q&U_iu1GK-jzZ4jkBq_Y8>5gCtL1$OmUO%@My z_L>_j!U!Z~k2}u6t9v~_4LLy<5N?rxoRak-;v~?osY8ArO!J{8B6V+sg-UmueW1O3 zF?yZ8Tuh&AxW1v9l0;?+_@jv0z>n4tuWtWQ>5l%sLia~fO5{$3jB|&u%Skfk;6-4Mv8ygLL(O!5aV`O7LHH=-`=WiNonNSe3s=JNePQ54E;wRHyb z4&j5L3o0WFnrEVxv$V*R0Jbw!Xv0PB^4X(WP)Y=jSmxuKj&3uc#Gzy9Zt?YPh^1wM z$9_BUkjVL>JQ_Q=;YIS{i7#fQsB-R6?uz|M+_C3UB)4!limgJ-;NM+CJaQJKQ2u>0 z*@g6~J4#)*+q?r!as_x|U%8*; zK!=BR`-KY3KVc zNlGU)557t+|NMOe^6iax=XQhJ=7I1=o?usSUMr2k!0RRW9{-60#}OD7AbnO^@hOPitRHFt_F#UQ3L) zcrl>`E0jHvmFHeT{;={u5aV-WZR?6|L77qb0svxi2sHQ4OHD-e5~)?bn7}aCcN(Q~ zX*&YY6nPIDUo<*s@NGObHG>4x*wnME?OW$JM|Z2j)~M{xT~rpND>8L=31n;;5(^8C zv|Si6yKI7yxL|;l^i?(X(X%ON&3~{r8|j7SBVv-Q_ynRW+INtvr|u>aiq6s>X>b#W zz$l7V-8>i+Uq+j;MO*{e0w`FfKkK8sbvNQF0U4;!sCA2OxIq;@WN8Fvj;+TM;R9fc zwd=E4n*qnbJ<_?U8r>pkcec)xStKL;CUSQARO)E7O%C5Qn;Up72Ll#lc)+6rsIH}) z09n}@7?k}8LSI;l{g6}rMiRzS)(LK$-g#V8&%hhN1og2D*ND9k0ryP3xsi%BtI(O* z^FFqNTS39knMUDGuq+zNMEdhJvWijAwIiho)D+9Apr)|tFfry3Ss&3Pm|G$xL+CmO zhNc1BK{wrsaVjJ)3hIke##yS<7wSEURd9$XUk2u^m-vhjt3b~7r<-hMt@mP_7JtU6 zMzi#nWcS?1@kLGwUb(%KgAbm@qss`(dmxceraGM^DzK5LEEb89LYd$`QMxvH&L;EI z>&|@>UKrJvnLb#fp9h}BFlDaHLR~$tPUEYG(oj5CbUljOXf7-FC_^&ZNOu!TeyL&W zBqSN6p^2vF-t;BmxAJ#4yJH{*PxdpuMntgNV+#WlnB@LW{rv42K5fLsdAi>IM)@G=uDR9y7dX*GY}^4(p;vVsyqMuCnn=aOA>0ltyy}%y8fkz5zDWi(2sV5ckcd!P**>3Q#=Gc0rm-21UnAXNR&Gd)5L_YLEy4XPo%OXc63a=0$VBkmtx&Lnc0>(3B;JOfC?KPSiBzTx1tLAu zFP&6~0zya79pi`?E$hOSQqaMbNZ6%_juPPZ%)?Fa`2h4l$85M@^8v;>h=Lu95yv35 z3+kSbDyrx<`lf0^T+P?g6vJodkwXB8xPsa@%^UE~2#8-qP{=$?luLSosGvi85bVw( z365UY605z(7St~A@u+m$@-gTg=kg@cUm_2I%YEVPDMNLlnB;py;R>VeX3LMM?SBnX zQWGxUuwp~hYoG!q}V@%NCsPx1c_T!oYHIhLYUvR+{+?GvllQV^zVsEg1fS{ zbS8WPPZjAC)olLllI4FO_Y-eV$8b36IuP#~Fus$%xP`bP7?0z$0#sfA14Hl!S89I1 zEo2n60PxfI1r}y+DCz<5u;wULu_t4I6(9q{W?3yQi6z#DFeTO$)1<2!USk-j38)C> z6}1pJ^Q(|_e@H=h9+U{u2(_GAnV@lCAW;nzLKAsqcw(NDrBapKA0}^Ro1M6CR&IuZ z$rMx&@)F@L`2f4Ay_^gxmChtlf}bs&e}qIC$}X@XF@po1+(p#Eu()_lDAM@?+U)>L z|CZP2rVWFH8}dhiS6snh8ckTA6MgkCX}*X7ylFP$Tm(+%sW6}2Y7t?u)s~%OZd9() zLNpu6;TQcZu!Y0#iBex}4Il+KC#)%a5()s6%NQy7QKgek50NKQ;~DTDfAO@uh^x=V zSPd4it_R^G5o{AmbhkJHwo1V+z*CASCz7JTJzXcp7s%l377Kp^k%f0W)U<3?oza}g zhD8#e7paEHbt)W56B-7@h7L30O3}d_P3bv^v3Ts)v)1Q4N6v?`3M2DM5$RxKlg&!y zN#&+hv-fEP_ehnd@q{UIMD1qSY>acMo~z-$>%85hmDDTB!A93cl1~z-uoWLx4Y;5hH(j0)xLLw9cBaXuw3Z2y>$9vL%5!%sOX>Oz4s570P6=YlYEV}elE_Kl z?nlHJW|W}{M8FCN2DaM+v=eEGH*}S+v_-4~!UvjMG3$09p4{(hU;!9d^AkRsL8s~>LTtKF2Ka{e= z4=kg<3gwg?Gm(wie#q(;UpV=kXuF^Z_mJI3vRsN~(RSv!UovZth3jPW%6U!*iBAFa zi{E%Ir2j4Zi*p@9pDUkYD_BgETxqq~DA zV&kZCi#}H-U5`)H=%$`9YR!jLRYWT+6UF8~&feyXq*8uXWdD*(mvyvGopLO%)?Lmt#*#nu5I1)AK-2;9cM3JMX@*7|wDG3#h};s0Ofhz?j)^^Z52J z(2>ESp<}UU24;4o6TUQDX*HxwDM&73T|(=dL?%g<2F3C!{nj4_f7c+T`B-r)Qh2JH&13@D6Y!-t1MY_01c}XS$ancXH<p#-GyFhVo< zRZ;ni70yLe#2CRQFo2QW6#{>!ZaQ2IQM&M*@V(`S2oOUDf&0P)E@~?9Ko9;D_&*_U zkk0||C~p}GT;Ma*5pdxya4D2YT20Au754XC62}0nIQFG40h~pq{JJV-(Z@T86DWnK z4T9ypfS5zL9d1bU87_bx;1gs)fN$$|nsXQIazDQaW~_RSOcjh**)xJR9Vmr6(X*rx zCaP8ObPY-rTz5m*zFDFAei zqwO}O0LdCWP{;^^dY~)G6LHV8kCJZbKr4J*C6A!z6HR#lD?+hMVY&MZS& z#Yqwp%UHoDmM?nZF07d3vDr%aQ1q7H^ctT^`yT#A*tfuC!J34~SBv*q?)sqi@%A6H zZ(HB4xaPkoq=08}GPlSm6Xfbmdhk-wGt;aE|MI+?%FTc@0|-S7l-x^y>zhPGn?E^e z;GR7W;OnJ#3jS9gFn-csS^n|W8(%&DzrKtA5oYxKeq-ZCi`!*oWl*`wzVqOL(fdz$ z`3^X7-yXYNS68>=6M!#3YB4NNUtinDZ>dio5<<{Oi&l4PGEVyNX&B5QmtDIU&GL5F z0Li}sTiV9Prhec}Lk@r-mjdgnSFeJw$n(9@@5wDv6_@Ke&*$Wfs^4_=^nB`4l-->p zC|X~bHNXDJRPuYL)WS-hx%Az8^WKY(kB`o~;j@V=;``P7=RacQ|0E_9gm~F}0va_?3l9KZB@@Vx>i4^eO8yp<$>gww2b7h{yu*5lDgQDgI-yIuG z>~vF)jEn@eY92+J>J!!hX)k&={OquG>uKxjKA+rI&XtvudyXHGgoFg|(UIY%CTohb z)&AB24%@c14Gj$yIk1@S>PcglnqjNh)a^bUNBF;5Eu@;6nd#{0Nc~*@S8EQoI2BmK zP=etcCN`}c6n!~Gxr`jxJOmd!shFvI%n#NIUI<< z;2aB?yW|emG-8T9N616a)C}99M$}+luN&jD*Q*G r`sBfxoOm#2nY&rBVw}lCy literal 0 HcmV?d00001 diff --git a/docs/design/assets/scheduled-task-channel-delivery/after-whitespace.png b/docs/design/assets/scheduled-task-channel-delivery/after-whitespace.png new file mode 100644 index 0000000000000000000000000000000000000000..1c897c1c00401a7ea869d08bdca2254603ac02d7 GIT binary patch literal 97266 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 literal 0 HcmV?d00001 diff --git a/docs/users/features/scheduled-tasks.md b/docs/users/features/scheduled-tasks.md index 09dbc0625fa..f2daf58e5ef 100644 --- a/docs/users/features/scheduled-tasks.md +++ b/docs/users/features/scheduled-tasks.md @@ -12,12 +12,14 @@ Messaging channels use a separate persistent scheduler so results can be pushed ## Deliver Web Shell task results to a Channel -In `qwen serve`, open **Scheduled Tasks** and create or edit a task in its workspace. Choose a persistent run destination (a dedicated session, or the current session when available), then choose a **Delivery Channel**, a user or chat destination type, and a destination ID. Recent observed contacts are optional suggestions; check the Channel name, type, and raw ID before selecting one. You can also enter an ID directly. The configured Channel must support sending to that destination. +In `qwen serve`, open **Scheduled Tasks** and create or edit a task in its workspace. Choose a persistent run destination (a dedicated session, or the current session when available), then choose a **Delivery Channel**, a user or chat destination type, and a destination ID. Recent observed contacts are optional suggestions; check the Channel name, type, and raw ID before selecting one. You can also enter an ID directly. If an ID has leading or trailing whitespace, the form warns you and offers **Remove surrounding whitespace**; it never changes the ID automatically. The configured Channel must support sending to that destination. -Delivery is off by default. Configuring a Channel alone does not enable delivery for any task. When enabled, a successfully completed scheduled run's final response is sent through the selected Channel; this does not guarantee receipt or add durable retries or failure alerts. The task card displays its saved destination. +Delivery is off by default. Configuring a Channel alone does not enable delivery for any task. When enabled, a successfully completed scheduled run's final response is sent through the selected Channel; this does not guarantee receipt or add durable retries or failure alerts. The task card displays a delivery line only when it has a saved destination. To remove delivery, edit the task and select **Delivery off** under **Delivery Channel**. Editing other fields preserves the saved target, including a target no longer found in recent contacts. Loading failures or missing Channels do not clear it. Changing the workspace while creating a task resets the draft destination; an existing task remains in its original workspace. +If delivery support becomes unavailable after you change a destination, choose **Discard delivery changes** to restore the original destination and keep editing the task's other fields. On a new task, this removes the draft destination. Saving then leaves any existing delivery configuration unchanged. + Tasks that create a fresh session for each run (`per_run`) do not support delivery. Switching to that mode keeps your draft destination visible and asks you to explicitly turn delivery off or return to a persistent mode before saving. Delivery controls require the daemon's `channel_delivery` capability; existing destinations remain visible with older daemons, but cannot be changed there. ## Schedule a recurring prompt with /loop diff --git a/packages/web-shell/client/components/dialogs/ScheduledTaskDeliveryFields.tsx b/packages/web-shell/client/components/dialogs/ScheduledTaskDeliveryFields.tsx index 1bde36e65ba..5e2653a4fb2 100644 --- a/packages/web-shell/client/components/dialogs/ScheduledTaskDeliveryFields.tsx +++ b/packages/web-shell/client/components/dialogs/ScheduledTaskDeliveryFields.tsx @@ -11,6 +11,7 @@ import { useWorkspaceActions, } from '@qwen-code/web-shell/daemon-react-sdk'; import { useI18n } from '../../i18n'; +import { Button } from '../ui/button'; import { Field, FieldDescription, FieldGroup, FieldLabel } from '../ui/field'; import { Input } from '../ui/input'; import styles from './ScheduledTasksDialog.module.css'; @@ -64,12 +65,13 @@ export function ScheduledTaskDeliveryFields({ const [suggestions, setSuggestions] = useState([]); const [contactsLoading, setContactsLoading] = useState(false); const [contactsError, setContactsError] = useState(false); + const hasTarget = delivery !== null; useEffect(() => { let cancelled = false; setSuggestions([]); setContactsError(false); setContactsLoading(false); - if (!canDiscover || !observedContactsAvailable) return; + if (!canDiscover || !observedContactsAvailable || !hasTarget) return; setContactsLoading(true); void actions.listChannelObservedContacts(workspaceId).then( (contacts) => { @@ -95,11 +97,18 @@ export function ScheduledTaskDeliveryFields({ return () => { cancelled = true; }; - }, [actions, canDiscover, observedContactsAvailable, workspaceId]); + }, [actions, canDiscover, observedContactsAvailable, workspaceId, hasTarget]); const names = canDiscover ? Object.keys(channels.channels) : []; + const channelsReady = + canDiscover && + channels.data !== undefined && + !channels.loading && + !channels.error; const target = delivery?.target; - const unavailableTarget = !!target && !names.includes(target.channelName); + const unavailableTarget = + !!target && channelsReady && !names.includes(target.channelName); + const hasSurroundingWhitespace = !!target && target.id !== target.id.trim(); const matchingSuggestions = suggestions.filter( (suggestion) => suggestion.channelName === target?.channelName, ); @@ -150,7 +159,7 @@ export function ScheduledTaskDeliveryFields({ } > - {unavailableTarget && ( + {target && !names.includes(target.channelName) && ( )} {names.map((name) => ( @@ -185,21 +194,18 @@ export function ScheduledTaskDeliveryFields({ {t('scheduledTasks.delivery.channelsFailed')} )} - {canDiscover && - !channels.loading && - !channels.error && - names.length === 0 && ( - - {t('scheduledTasks.delivery.noChannels')} - - )} + {channelsReady && names.length === 0 && ( + + {t('scheduledTasks.delivery.noChannels')} + + )} {target && ( <> {identity(target)} - {unavailableTarget && !channels.loading && ( + {unavailableTarget && ( {t('scheduledTasks.delivery.targetUnavailable')} @@ -286,8 +292,29 @@ export function ScheduledTaskDeliveryFields({ id="scheduled-task-delivery-id" value={target.id} disabled={disabled || !available || unavailableTarget} + aria-describedby={ + hasSurroundingWhitespace + ? 'scheduled-task-delivery-id-whitespace' + : undefined + } onChange={(event) => updateTarget({ id: event.target.value })} /> + {hasSurroundingWhitespace && ( + <> + + {t('scheduledTasks.delivery.whitespace')} + + + + )} )} diff --git a/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.test.tsx b/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.test.tsx index 0e5216b55e0..8c9e90a12a5 100644 --- a/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.test.tsx +++ b/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.test.tsx @@ -2723,9 +2723,26 @@ describe('ScheduledTasksDialog Channel delivery', () => { ], }; + const channelInstances = Object.fromEntries( + ['team-bot', 'ops-bot'].map((name) => [ + name, + { + name, + config: { type: 'dingtalk' }, + secrets: {}, + startsWithServe: false, + runtime: { state: 'stopped' as const }, + }, + ]), + ); + beforeEach(() => { useDaemonChannels.mockReturnValue({ - channels: { 'team-bot': {} }, + data: { + catalog: [], + snapshot: { revision: '1', instances: channelInstances }, + }, + channels: channelInstances, loading: false, error: undefined, reload: vi.fn(), @@ -2767,6 +2784,62 @@ describe('ScheduledTasksDialog Channel delivery', () => { enterPrompt(); } + it.each([ + { label: 'not started', loading: false, error: undefined }, + { label: 'loading', loading: true, error: undefined }, + { label: 'failed', loading: false, error: new Error('load failed') }, + ])( + 'does not mark an undiscovered saved Channel missing when $label', + async ({ loading, error }) => { + useDaemonChannels.mockReturnValue({ + data: undefined, + channels: {}, + loading, + error, + reload: vi.fn(), + }); + await mount([baseTask({ delivery })], options); + click(document.querySelector('[aria-label="Edit"]')); + await flush(); + expect(document.body.textContent).not.toContain( + 'No Channels are configured', + ); + expect(document.body.textContent).not.toContain( + 'This Channel is unavailable', + ); + expect(channelSelect().value).toBe('team-bot'); + expect(targetInput().disabled).toBe(false); + }, + ); + + it('does not discover contacts before delivery is enabled', async () => { + await mount([], options); + await openCreate(); + expect(actions.listChannelObservedContacts).not.toHaveBeenCalled(); + select(channelSelect(), 'team-bot'); + await flush(); + expect(actions.listChannelObservedContacts).toHaveBeenCalledTimes(1); + input(targetInput(), 'first'); + input(targetInput(), 'second'); + await flush(); + expect(actions.listChannelObservedContacts).toHaveBeenCalledTimes(1); + select(channelSelect(), ''); + await flush(); + expect(actions.listChannelObservedContacts).toHaveBeenCalledTimes(1); + expect(suggestionSelect()).toBeNull(); + select(channelSelect(), 'team-bot'); + await flush(); + expect(actions.listChannelObservedContacts).toHaveBeenCalledTimes(2); + }); + + it.each([true, false])( + 'omits the delivery row on an unconfigured card with capability %s', + async (deliveryAvailable) => { + await mount([baseTask({})], { ...options, deliveryAvailable }); + expect(container?.textContent).not.toContain('Delivery off'); + }, + ); + it('keeps delivery off by default even with configured Channels', async () => { await mount([], options); await openCreate(); @@ -2810,11 +2883,15 @@ describe('ScheduledTasksDialog Channel delivery', () => { ); expect(actions.listChannelObservedContacts).toHaveBeenCalledWith(undefined); expect(useDaemonChannels).toHaveBeenCalledWith( - expect.objectContaining({ workspaceCwd: '/repo/main', enabled: true }), + expect.objectContaining({ + workspaceCwd: '/repo/main', + enabled: true, + autoLoad: true, + }), ); }); - it('permits a manual target without observed-contact capability', async () => { + it('preserves a manually entered raw ID without observed-contact capability', async () => { await mount([], { ...options, observedContactsAvailable: false }); await openCreate(); select(findSessionModeSelect()!, 'dedicated'); @@ -2825,14 +2902,15 @@ describe('ScheduledTasksDialog Channel delivery', () => { )!, 'user', ); - input(targetInput(), 'manual-user'); + input(targetInput(), ' manual-user '); + expect(findButton('Remove surrounding whitespace')?.disabled).toBe(false); click(findButton('Create')); await flush(); expect(actions.listChannelObservedContacts).not.toHaveBeenCalled(); expect(actions.createScheduledTask.mock.calls[0]?.[0]).toMatchObject({ delivery: { kind: 'channel', - target: { channelName: 'team-bot', type: 'user', id: 'manual-user' }, + target: { channelName: 'team-bot', type: 'user', id: ' manual-user ' }, }, }); }); @@ -2868,6 +2946,7 @@ describe('ScheduledTasksDialog Channel delivery', () => { it('explains an empty Channel list without opting the task into delivery', async () => { useDaemonChannels.mockReturnValue({ + data: { catalog: [], snapshot: { revision: '1', instances: {} } }, channels: {}, loading: false, error: undefined, @@ -2887,15 +2966,23 @@ describe('ScheduledTasksDialog Channel delivery', () => { it('round-trips a saved target absent from discovery and omits unchanged delivery', async () => { const saved = { ...delivery, - target: { ...delivery.target, id: 'old-group' }, + target: { ...delivery.target, id: ' old-group ' }, }; - await mount([baseTask({ delivery: saved })], options); + let stored = baseTask({ delivery: saved }); + await mount([stored], options); + actions.listScheduledTasks.mockImplementation(async () => [stored]); + actions.updateScheduledTask.mockImplementation( + async (_id: string, patch: Partial) => { + stored = { ...stored, ...patch }; + return stored; + }, + ); expect(container?.textContent).toContain('team-bot'); expect(container?.textContent).toContain('old-group'); click(document.querySelector('[aria-label="Edit"]')); await flush(); expect(channelSelect().value).toBe('team-bot'); - expect(targetInput().value).toBe('old-group'); + expect(targetInput().value).toBe(' old-group '); input( document.querySelector('input[maxlength="200"]')!, 'New name', @@ -2905,9 +2992,13 @@ describe('ScheduledTasksDialog Channel delivery', () => { expect(actions.updateScheduledTask.mock.calls[0]?.[1]).not.toHaveProperty( 'delivery', ); + expect(stored).toMatchObject({ name: 'New name', delivery: saved }); click(document.querySelector('[aria-label="Edit"]')); await flush(); - expect(targetInput().value).toBe('old-group'); + expect(targetInput().value).toBe(' old-group '); + expect( + document.querySelector('input[maxlength="200"]')!.value, + ).toBe('New name'); }); it('updates a saved target and explicitly clears delivery with null', async () => { @@ -2940,7 +3031,11 @@ describe('ScheduledTasksDialog Channel delivery', () => { }); it('preserves saved delivery without capability and offers no discovery', async () => { - await mount([baseTask({ delivery })], { + const saved = { + ...delivery, + target: { ...delivery.target, id: ' group-1 ' }, + }; + await mount([baseTask({ delivery: saved })], { ...options, deliveryAvailable: false, }); @@ -2948,6 +3043,8 @@ describe('ScheduledTasksDialog Channel delivery', () => { click(document.querySelector('[aria-label="Edit"]')); await flush(); expect(actions.listChannelObservedContacts).not.toHaveBeenCalled(); + expect(targetInput().value).toBe(' group-1 '); + expect(findButton('Remove surrounding whitespace')?.disabled).toBe(true); click(findButton('Save')); await flush(); expect(actions.updateScheduledTask.mock.calls[0]?.[1]).not.toHaveProperty( @@ -2963,14 +3060,37 @@ describe('ScheduledTasksDialog Channel delivery', () => { await flush(); if (operation === 'clear') select(channelSelect(), ''); else input(targetInput(), 'group-2'); + input( + document.querySelector('input[maxlength="200"]')!, + 'Keep this name', + ); + enterPrompt(); await rerender({ ...options, deliveryAvailable: false }); + expect(document.querySelector('[role="alert"]')).toBeNull(); click(findButton('Save')); await flush(); expect(actions.updateScheduledTask).not.toHaveBeenCalled(); - expect(document.body.textContent).toContain( + expect(document.querySelector('[role="alert"]')?.textContent).toContain( 'does not support Channel delivery changes', ); - expect(document.body.textContent).toContain('delivery'); + const discard = findButton('Discard delivery changes'); + expect(discard).toBeDefined(); + click(discard); + expect(targetInput().value).toBe('group-1'); + expect(document.querySelector('[role="alert"]')).toBeNull(); + click(findButton('Save')); + await flush(); + expect(actions.updateScheduledTask).toHaveBeenCalledWith( + 't1', + expect.objectContaining({ + name: 'Keep this name', + prompt: 'Summarize the project', + }), + undefined, + ); + expect(actions.updateScheduledTask.mock.calls[0]?.[1]).not.toHaveProperty( + 'delivery', + ); }, ); @@ -2984,6 +3104,9 @@ describe('ScheduledTasksDialog Channel delivery', () => { click(findButton('Save')); await flush(); expect(actions.updateScheduledTask).not.toHaveBeenCalled(); + expect(document.querySelector('[role="alert"]')?.textContent).toContain( + 'A new session every run does not support Channel delivery.', + ); select(channelSelect(), ''); click(findButton('Save')); await flush(); @@ -3016,7 +3139,9 @@ describe('ScheduledTasksDialog Channel delivery', () => { await act(async () => oldContacts.resolve(contacts)); await flush(); select(channelSelect(), 'team-bot'); - expect(suggestionSelect()?.textContent ?? '').not.toContain('group-1'); + await flush(); + expect(suggestionSelect()).not.toBeNull(); + expect(suggestionSelect().textContent).not.toContain('group-1'); select(channelSelect(), ''); click(findButton('Create')); await flush(); @@ -3075,7 +3200,183 @@ describe('ScheduledTasksDialog Channel delivery', () => { click(document.querySelector('[aria-label="Edit"]')); await flush(); expect(targetInput().value).toBe('group-1'); - expect(document.body.textContent).toContain('unavailable'); + expect(document.body.textContent).toContain('Could not load Channels.'); + expect(document.body.textContent).toContain('Could not load suggestions.'); + expect(document.body.textContent).not.toContain( + 'This Channel is unavailable', + ); + expect(targetInput().disabled).toBe(false); + click(findButton('Save')); + await flush(); + expect(actions.updateScheduledTask.mock.calls[0]?.[1]).not.toHaveProperty( + 'delivery', + ); + }); + + it('allows a create draft to discard delivery after capability loss without losing other fields', async () => { + const { rerender } = await mount([], options); + await openCreate(); + select(findSessionModeSelect()!, 'dedicated'); + select(channelSelect(), 'team-bot'); + input(targetInput(), 'group-2'); + await rerender({ ...options, deliveryAvailable: false }); + click(findButton('Create')); + await flush(); + expect(actions.createScheduledTask).not.toHaveBeenCalled(); + expect(document.querySelector('[role="alert"]')?.textContent).toContain( + 'does not support Channel delivery changes', + ); + click(findButton('Discard delivery changes')); + expect(channelSelect()).toBeNull(); + expect(document.querySelector('[role="alert"]')).toBeNull(); + click(findButton('Create')); + await flush(); + expect(actions.createScheduledTask).toHaveBeenCalledWith( + expect.objectContaining({ + prompt: 'Summarize the project', + sessionMode: 'persistent', + }), + undefined, + ); + expect(actions.createScheduledTask.mock.calls[0]?.[0]).not.toHaveProperty( + 'delivery', + ); + }); + + it.each(['', ' '])( + 'refuses an empty destination ID %j before creating a task', + async (id) => { + await mount([], options); + await openCreate(); + select(findSessionModeSelect()!, 'dedicated'); + select(channelSelect(), 'team-bot'); + input(targetInput(), id); + click(findButton('Create')); + await flush(); + expect(actions.createScheduledTask).not.toHaveBeenCalled(); + expect(document.querySelector('[role="alert"]')?.textContent).toBe( + 'Choose a Channel and enter a destination ID.', + ); + }, + ); + + it('resets the destination type and ID when switching Channels', async () => { + await mount([], options); + await openCreate(); + select(findSessionModeSelect()!, 'dedicated'); + select(channelSelect(), 'team-bot'); + const typeSelect = document.querySelector( + '#scheduled-task-delivery-type', + )!; + select(typeSelect, 'user'); + input(targetInput(), 'user-1'); + select(channelSelect(), 'ops-bot'); + expect(typeSelect.value).toBe('chat'); + expect(targetInput().value).toBe(''); + click(findButton('Create')); + await flush(); + expect(actions.createScheduledTask).not.toHaveBeenCalled(); + input(targetInput(), 'ops-group'); + click(findButton('Create')); + await flush(); + expect(actions.createScheduledTask.mock.calls[0]?.[0]).toMatchObject({ + delivery: { + kind: 'channel', + target: { channelName: 'ops-bot', type: 'chat', id: 'ops-group' }, + }, + }); + }); + + it('ignores an old contact response after discovery capability changes without remounting the form', async () => { + const oldContacts = deferred(); + const currentContacts = { + users: [], + groups: [{ ...contacts.groups[0]!, id: 'current-group' }], + }; + actions.listChannelObservedContacts + .mockReturnValueOnce(oldContacts.promise) + .mockResolvedValue(currentContacts); + const { rerender } = await mount([baseTask({ delivery })], options); + click(document.querySelector('[aria-label="Edit"]')); + await flush(); + const originalInput = targetInput(); + await rerender({ ...options, observedContactsAvailable: false }); + expect(targetInput()).toBe(originalInput); + await rerender(options); + expect(actions.listChannelObservedContacts).toHaveBeenCalledTimes(2); + expect(suggestionSelect()).not.toBeNull(); + expect(suggestionSelect().textContent).toContain('current-group'); + await act(async () => oldContacts.resolve(contacts)); + await flush(); + expect(targetInput()).toBe(originalInput); + expect(suggestionSelect().textContent).toContain('current-group'); + expect(suggestionSelect().textContent).not.toContain('group-1'); + }); + + it.each(['create', 'update'])( + 'offers explicit surrounding whitespace removal on %s', + async (operation) => { + const rawId = ' group with spaces '; + await mount( + operation === 'create' ? [] : [baseTask({ delivery })], + options, + ); + if (operation === 'create') { + await openCreate(); + select(findSessionModeSelect()!, 'dedicated'); + select(channelSelect(), 'team-bot'); + } else { + click(document.querySelector('[aria-label="Edit"]')); + await flush(); + } + input(targetInput(), rawId); + expect(targetInput().value).toBe(rawId); + expect(document.body.textContent).toContain( + 'This ID has leading or trailing whitespace, which will be sent as part of the destination.', + ); + const removeWhitespace = findButton('Remove surrounding whitespace'); + expect(removeWhitespace).toBeDefined(); + click(removeWhitespace); + expect(targetInput().value).toBe('group with spaces'); + expect(findButton('Remove surrounding whitespace')).toBeUndefined(); + click(findButton(operation === 'create' ? 'Create' : 'Save')); + await flush(); + const payload = + operation === 'create' + ? actions.createScheduledTask.mock.calls[0]?.[0] + : actions.updateScheduledTask.mock.calls[0]?.[1]; + expect(payload).toMatchObject({ + delivery: { + kind: 'channel', + target: { + channelName: 'team-bot', + type: 'chat', + id: 'group with spaces', + }, + }, + }); + }, + ); + + it('marks a saved Channel unavailable only after discovery confirms it is missing', async () => { + useDaemonChannels.mockReturnValue({ + data: { catalog: [], snapshot: { revision: '1', instances: {} } }, + channels: {}, + loading: false, + error: undefined, + }); + const saved = { + ...delivery, + target: { ...delivery.target, id: ' group-1 ' }, + }; + await mount([baseTask({ delivery: saved })], options); + click(document.querySelector('[aria-label="Edit"]')); + await flush(); + expect(channelSelect().value).toBe('team-bot'); + expect(targetInput().value).toBe(' group-1 '); + expect(findButton('Remove surrounding whitespace')?.disabled).toBe(true); + expect(targetInput().disabled).toBe(true); + expect(document.body.textContent).toContain('This Channel is unavailable'); click(findButton('Save')); await flush(); expect(actions.updateScheduledTask.mock.calls[0]?.[1]).not.toHaveProperty( diff --git a/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.tsx b/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.tsx index 2b5ff086c10..21b49caf668 100644 --- a/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.tsx +++ b/packages/web-shell/client/components/dialogs/ScheduledTasksDialog.tsx @@ -1879,6 +1879,19 @@ export function ScheduledTasksDialog({ disabled={submitting} /> )} + {!deliveryAvailable && !sameDelivery(delivery, editedDelivery) && ( + + )} {runDestination === 'per_run' && (

@@ -2124,7 +2137,11 @@ export function ScheduledTasksDialog({ )}
- {formError &&
{formError}
} + {formError && ( +
+ {formError} +
+ )}