From dc345671ae074b63eb9b37bdc057bd054fe6f202 Mon Sep 17 00:00:00 2001 From: Vito Date: Sat, 17 Oct 2026 13:43:19 -0700 Subject: [PATCH] feat(workspace): inspect and send positive and negative prompts (#206) * feat(workspace): inspect and send positive and negative prompts * docs(workspace): capture complete inspector and viewer previews * docs(inspector): explain the subprocess cleanup race * fix(workspace): defer observed gallery layout writes (#207) * fix(inspector): keep path-only prompt associations unverified --- TESTING.md | 14 + docs/prompt-inspector.md | 34 + docs/screenshots/204/inspector-dark.png | Bin 0 -> 89870 bytes docs/screenshots/204/inspector-light.png | Bin 0 -> 88564 bytes docs/screenshots/204/inspector-mobile.png | Bin 0 -> 30730 bytes docs/screenshots/204/sender-preview.png | Bin 0 -> 71983 bytes docs/screenshots/204/viewer-prompts.png | Bin 0 -> 47717 bytes py/api/images.py | 73 +++ tests/browser/prompt-inspector.spec.mjs | 205 ++++++ tests/browser/server.py | 44 +- tests/comfyui/prompt-sender.spec.mjs | 68 ++ tests/js/prompt-inspector.test.js | 36 ++ tests/js/prompt-sender.test.js | 121 ++++ tests/test_api_prompt_inspector.py | 643 +++++++++++++++++++ tools/vendor/frontend-coverage-baseline.json | 12 + utils/prompt_inspector.py | 267 ++++++++ web/js/workspace/images.css | 43 ++ web/js/workspace/images.mjs | 36 +- web/js/workspace/prompt-inspector.mjs | 124 ++++ web/js/workspace/prompt-sender.mjs | 155 +++++ 20 files changed, 1868 insertions(+), 7 deletions(-) create mode 100644 docs/prompt-inspector.md create mode 100644 docs/screenshots/204/inspector-dark.png create mode 100644 docs/screenshots/204/inspector-light.png create mode 100644 docs/screenshots/204/inspector-mobile.png create mode 100644 docs/screenshots/204/sender-preview.png create mode 100644 docs/screenshots/204/viewer-prompts.png create mode 100644 tests/browser/prompt-inspector.spec.mjs create mode 100644 tests/comfyui/prompt-sender.spec.mjs create mode 100644 tests/js/prompt-inspector.test.js create mode 100644 tests/js/prompt-sender.test.js create mode 100644 tests/test_api_prompt_inspector.py create mode 100644 utils/prompt_inspector.py create mode 100644 web/js/workspace/prompt-inspector.mjs create mode 100644 web/js/workspace/prompt-sender.mjs diff --git a/TESTING.md b/TESTING.md index 9f40f7f..dc1f5c9 100644 --- a/TESTING.md +++ b/TESTING.md @@ -183,3 +183,17 @@ The compatibility runner reserves loopback ports 8193–8195; `PM_COMPAT_PORT` selects another consecutive unprivileged range. Never run automated tests against the maintainer's running ComfyUI. This JavaScript host extension needs a full browser refresh after deployment; its first slice adds no gallery send controls. + +### Workspace prompt inspection and sending + +`tests/test_api_prompt_inspector.py` covers rooted physical-file identity, +execution/graph/parameter evidence, saved associations, ambiguity, empty negatives, +read-only behavior, bounded PNG/video metadata and corrupt inputs. Run it with +`python -m unittest discover -s tests -p test_api_prompt_inspector.py` in a disposable +checkout. `tests/js/prompt-inspector.test.js` and `prompt-sender.test.js` cover +request races, explicit destination selection, preview tickets and uncertain +acknowledgements. Browser workflows exercise the same controls in Images and +Viewer, including nested modal focus, mobile layouts and per-role sending. +`tests/comfyui/prompt-sender.spec.mjs` sends through the actual workspace UI into +real Classic and Nodes 2.0 widgets and verifies workflow serialization without +loading a workflow or queueing generation. diff --git a/docs/prompt-inspector.md b/docs/prompt-inspector.md new file mode 100644 index 0000000..539fd39 --- /dev/null +++ b/docs/prompt-inspector.md @@ -0,0 +1,34 @@ +# Prompt inspection and sending + +The opt-in workspace at `/prompt_manager/workspace#/images` shows full positive +and negative prompts in both Image details and the full-image preview. Existing +gallery and metadata tools remain available during the application rebuild. + +Each prompt shows its evidence source: recorded execution, workflow inference, +or embedded generation parameters. Path-only saved-library associations are +marked unverified and cannot be sent: a filename alone cannot prove that an image +has not been replaced. Missing, ambiguous, and unreadable prompts remain visible +as distinct states. An explicitly +empty negative is a resolved value and can clear a destination's negative field. + +Use the blue paper-plane action beside a prompt, or **Send prompt pair**. Keep a +ComfyUI tab open under the same origin and deployment prefix. Choose a window and +compatible Prompt Manager node, select **Preview changes**, review the complete +before/after text and preserved prepend/append composition, then **Apply to +ComfyUI**. The dialog reports success only after a matching acknowledgement. +It does not load workflows or queue generation. If confirmation is lost, inspect +ComfyUI and preview again before another attempt. Closing the dialog cannot undo +an update already sent. + +## Read-only API + +`GET /prompt_manager/images/inspect/{relative_path}?root={root_index}` requires +an explicit configured root, including when two roots contain the same filename. +The response contains `image` identity and `prompts.positive` / `prompts.negative`. +Each role has `status` (`resolved`, `absent`, `unresolved`, or `ambiguous`), `text` +(string only when resolved, otherwise null), and `source`. Inspection does not +index files, alter saved prompts, run scans, or decode image pixels. PNG text and +video probe output are bounded; unsupported or malformed evidence remains +unresolved rather than becoming sendable placeholder text. + +Python route changes require restarting ComfyUI. Browser assets require a refresh. diff --git a/docs/screenshots/204/inspector-dark.png b/docs/screenshots/204/inspector-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a69c5c8cb713aa51e8d7e3f17025e29ac602ef9c GIT binary patch literal 89870 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

yW6|l$9`ydX|0F*Ms&_E&)2(dKbmld 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 z%0D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 QUqQ&rD*u^x=h4gm09K>lsQ>@~ literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/inspector-mobile.png b/docs/screenshots/204/inspector-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..67ef1e5d781c4a2393256a0ff799d25b68bfc8e4 GIT binary patch literal 30730 zcmeFZWmsHaxaC=d1QH04puv;i9)i0|;ZV3H!QBeC00Dvr5AGC&yF=jwcXxLPE>*zP z|IWSB_fF4qdwRNO=1YG)?4r(d&b#+sYrVf+p(;u;SQsQ20000BC@ZN30H6c|0H_Kt zpCPZzVy6QEfHwf3q?o#U+R^e0ZFL<|^uL%AZf+qMKXZQOd~!x%1PP>ypYyI`3Uo_5WvcOG-mw7LISI9iLQ4MM-UbZ0~ zKy`e?+!%(3!O=L7KW9pV-d=GjU)?Z}pY^`a$GEKxrN9hLzX#|901SyzqW~n{00Hf9 zByj=7aO|)$U6Asi>)b^@I(An zR#AoDGtG{U{y(zL02P8c5qMG7kGNmIR8)Qq4i8h^-QB%-K?d*^z{O3=qb87f#=wBm z*HT2R(H5?l>3MRzS+P}9B6va?XFU}kSViBDk*26VdsAo%&2LAk$i_gkt4GBpv31`% z$y9me@jO#>^vMPG9CC$o`kdMUU{iP`n{!_{Yj`@eC|H`2c9@uGIP89)AKE+zq~C-A;Y{ud8I@ zX?jAn<OfUO21sixwJ1$nq@Ulww_+&{GRDr*HNLdQ zxQsV7tNCniU20jxO7t$%@yz8YMX!S)xpAqUvot8VG1wb!Ysl!N1|(i}H8NV0Qnzvt zr$tvOt$YW>m+*_WRZ(d__QPGLq^p@xLv-|KfmljM1X{jLIycz&YAc>BG~YtrGLXg5 zru%fEsJk&^FZmvRk@DE8d0amy73<5CVQYT7huEbep(#Dlj5F%+(%p=~!m@lHSCMyh zn5@{xbNA#>P+WSQFdoGYt8HR06U*dpLUd+F-Mi6pk}b~d9Wy80(v(_)&5Db)y`wQE zVzv5sxvNzuH*F-1D;b6r_g5F^S#tH zHr3~FZz4A_q4Pa?H^BKxk%pR=@u#a02HRuy!1J#o*$`FRk|)0$)_n_?cBTo}>DJ|F zs>eOUYKd_^oBVuHy1&~zmDtvlM_#y%=AyRzE_YYQR|%eT`wbN5mi1SmRV7m?(fhr4 zJ6mpZCs*%zEiVE;-ObO=uD)7-O#O@#{gRr7{tfEJ4-qmCM}bd{4RIY?I|ZDywiPQ> zydO5tqpvQ`F)4mf-&8)mDVTT`8dY1PBpA)Q;*pGVQQ#MlUKX49ZM}Z|vamERBYk#4 zEzk%CZCuzK%VS0ueE5mF^RZvuAfv#^urDu3`;nhNeT0Y6{5Ey=0e8>FFEgd}UbDhn zd*EkqaE-%{xNI5O^Gr7hDp1w6NN5XDJUwIlRvtCP$Q@2C7}RSD&yeIq^g2(NQc#=@ zq&Dy+J&d$PWT%lIScn#)PV%#tYRS1pzgI{-2lg(7i-n`t_l1_%}9E14EUUQ=iV@D;80}nlUQs z{vQ2w671js7UpToEt;nAo#0z(JKv7tJsftTH%Zy_R9XH*^-N>~f`ThOT9r9LiI+XMtnKq-5n=ZW=NSAL1u<1oXQ3Wt19AC{AikWqYIi5o-EB$7cy>+7e z=7;FjVQNrE=u%i^8qz~~5g7sS;y6y za*<>KgR7Q+j*BB3FBSfAv=d|@XRVEjD%bVs;?lUl5f_Ow9BkrlMhBZ_U4JOk&T6rT#NN$0dMrlgfTD7P7LopK{@H{W&)nC+M5u zGNLvWw~cvTVn88R5xtptD^+y)@z`Xd)wb}5r{`G17*9vvs%pzwT2-ZtGmE9@K47Ue z9ec{1eqDaIE9tz>X^z-*G&%_%lf3;gS?*`~RnEN4uf<_Gea&c5&*yQ+l)})`ONa_N z-9&Ol`)Sx%_6ah?C)f2=p|V_2);q7lPC_Ik&uezz*X>F(C`a|ERUL2h7rU?c#1Wz?@DpXeq$!1!#b(>SRlNZxYM(eKEb z){s2DBCT3?WUdSXUU&W=Bm=1HYZ&UP0W}ZG#jq~T(_Td=R*z}&ACk8rs_aqvfSA-b z(GF3v1KRE@yVsX>HD;wjMDQ6NorUTV_|_1AI2+7hqW0lF^(tc8NQy>YPIl;2t+}<- z@GQfx`S$#%x+1OR8L3ag0~N{O;7jq1NjmZ?xi@A^121=6>#Xfc@zP`OHXmgwEp;$H z2MndfCZyP#oW~m*LUkHDkCteb4=)`)<>>B|866$o^q<)07|&cAg4d;3e5PNqlnOoD zEFkk^>~O5RFS5@CjYQb9()=o{pJMS;v|rc?P?of@(v1D22UN0x{|YWh2}8;qV;s-6 zFol9?G#*aU#icOR@6ko>tf3Qq(niw)g6xcZ##3!FA-*;neDxBU_q}D!6r8nF1^R#b z2O;efnu*ODq`<>f_lq`=Evl8^E1-j|iL1R?v()m@Zl;f6%jo22=ZGL?ZnL-Vv1D$i z5nD@EkY~}kKnPcpK<@Dnb{)QVjmgUVF8&*e>c!J{3xDVYE4%%%7Cih+K=Ms)v!8Z5 znkmK#e-Tc|+A44`ts6Z+yYWi-Y@++vY^{aTmVG5b;cyg3n)}8*Jh3xRKh0+8ofN-i zZy9-d2_jdhqWojVgy)Q&CMsC$#|hqvNpkp7tUA~oL3C89kQ{?Kz4eIgAWi*q-!}L|>%GQYNA;P2z z{dk%s*q;_PilU+X`;uy ziMsenJ+pZjKh2`xURhC}5QtHM|G%|l>ixUbbB<03Mr0aDW*bbI!4hR^oM=UJhOKY2`Nt=72GR9zwV6SUge}lR_TzQqzcT&9QAv*04 z)yUXsw4nXDVEEzHVreXD%+LT7js&LH*mKqKfAENYu zS+2;T+KeFDD5pxq>_`Ytr8`NA1@}!0G&rC-h*0rzO#Gl_cBeU}A0M6H+qSC2d^s~( zFniye+;qO|I=IIx>)G*CgIR0+l7Z(wO#&afG&k$%Fqb$;%6Y^c)WG|$IMssw@o;_k z&_)Kd2{Z5(>oCuSbfSo|&Qs~S=jafE#j_tNlCs6mUBG}2ctSz51N^=Ex`qar zM)~*(@Ge0186fz5Ea1B_`o~xC!x@qPmIeH~KYjQ~4fyi%KaBqW^U}v2jTi(1(a?|= z5it}Ian#Zxhz)2%@fUs1#zw`)2FcH-Wne&~k)4*DxT-f~Dkra;WvA4IwWbFpM?`R< z16D=t>@rk-C&$K~>=Id76z1mTwO5v6eC&T%t`_r3QZaT27<>ftRWDL7x zV_~8C{JFPXH1$lq=t!KEfy#EGUj+IUYWk@~RR$Zt7!(`Z5))%5DXCy+DBM>u5S5o} zcrp$Row|kU;JkYE3OOV^Ab>1E76^orbs-&TOXtd2qM_bUQXKF2BB!FIeOH($!s!c~vC_v<1j=8nhcz{>+H+^<8h03o z(6r>>vb37lt1HLrntkm#{y;@5d0E-139h%zr?MVIc&>NTxeP3DC%|;noH~%vDNKat zG$Az;_H?!yUVa2eV7bIkjYJ!?RcwB;qQd~~rmcRs4~XaHIxu?I+~T%umZqJpz6{=F zMpq#ZRiuV8(LXHghv>!405S8*+OD^V>>AzLIu0r|!wvlS+k`*!MJ1YSnLK%VL=QHF z5{9Ei^VUq<_&7*9rCq0Gpk5;gQ{GM5O@fQ+c8r#!0d z6^j7@&n~0_nf;uH2S=4hN76h!@vf95VDr26pxquEOGKqhFXp{{tJ})sO-yZ4H1DQ! zG$9&Y3#3d*u(|ep;cc}MdRr8B|Il!Tt6BB%1ZA3Lw4UdcsHPousq5GUNon0?M~~Sd zT{0_~Xo%bTHmcR+SDbkmv#?Np%cGWoNLAmaoSHO=?TYQ9K6aMp+v-MYVg^eR(|-9u zC#jy!PWfhr?1dR{-dz@Us(FD)L8h0Z{l&8LRYYl$+Y>tn-J*(yd`+pST2(<5JD0`Y zjeM~$ElE>O^Zl$fP^7%|EGH8u&?w*3^wQBn=}?*fj?T2NBA9$(+N$DkeOtsnozYPc zpNFZO($Y*Pp`T+^gk?k zujdQZUJd6zS35b)h!m^|o8i%%Eoc`y*funL0?%Q5u5wcQeE9}#%Dx9ho$VVQFtn4i z$d06pA}KxT@SEi*0U?Rs6hovDF2`&DsR@ zQ?%Q7;R@Kj;>wcWK(u1h*3Ry-J3QVaFQt;7-D$jE6{cfJYUp(+ zb=O(WUGf#qf?9AMI6!f&SdWD;1t!HzVFM#r%b)zO^oj=<*F_Es#Jvn>;~@P(Qsfu+n~Sp>ga)p7#Ha}O$8}?BVyNY$GPx<&y`}yoS1N+l>D)Pvk%x7-gSkcq-)E4@P{N1kM(6camkTQ8Qtky55v8I+n za}S}p-0O_{W}dbzw>=%fjmr1kN-{!(kq>H`*?4SVSy6Y?;v|M?2OUyz{mlOXGiXU@rOk{?dP^ZZP0}2Y|Ft*Te`PU^!EGq0K(tP<#ZC@s^+YS84m)bO^yzrWd)oROaXS8QyK*YHrp&8bKM z1me8eOAZ9~-(5gT4Ii{hb!TSFS4jk1-G@^&FH;2>82H%O%4MQQhEw?H=paW+9>4CB zVq%d0i=oY$apq*%i<*Jq?VC4(u17dM@bTGMA@{$Mv@aAiU02(d$;l7Z`m3F`(eUtc z3k&y_mRf{;nhaXpxp;WABqV$gw=vH;LN+evDmg+!f#9u~nM8x;ItbNL?csZZKwMm0 zeDCY)x*BZq#?(a@e^Jpzr3^u7C8em0Ec7|v?kBW*I zC4w(6Zg84BE>?z;@hrD*Z@cdzllj@%iJ6&fo-KTQjUo@6 zK8G_Rdlqh|!uW6B)_xKDnxc@|=CDxns;Fq7Mniqdi~sd~x){zc3a7JO$tfK2=@=?V z@augegemSaDFuZN0t!-B=k+)jY*hfyMi7USaF?u>8{OpP#Wy-9jdeKxC4U18r}glH zX}8|<(9raNAgub$uFhjw!pluAEyyB@XV~0ZxjL+GYPzniE_OLyVA1`$P?On^a}X@v z-PswTl=|yeMU%_%Bf>c-AOMjqL04MJvIow=Gwun)iX`RXb=*ixOhmJlq8n}TkPkmi zQW6w_iQ3u@W0UJ9?U|3H(JVK+*(}X5eEQ@*UnOGkp_CFIpZ{C;7iVV>f8X`7K$S^9 z*^3u1_&*r6c`K5h`#k>bYS*hjxiEi!1zfi<1_j2(D{bb=jH*!Q7Zez@-12A;#(&nU zJ92b`%{Dsg`7Vaw2rGxzd9xpR<0OO1Mr1W$}n8Dq)Vk&n|>1|zn ze3n)@t9R;SABgL6Cz4Vt{w0`1Wl!PvU#jJ)>FEN{8D7YTgOCwm5qK|eBRVn)IhB6I z{=|5555$a&#Df0K7TgF^qx$fnvPF2GdKb>l!LhEDYm@VCjn0(5qRxLqmv$D1nC{Hh)Dd>@yX(al}`r9|z{5MywPmfdsV_r9cg*6Pzq{C$6XCR!K?)iDg zo0Gtv=)RGWVD6Ztq}<;#6BC!$zQC^?vv%c1uw18Tl1p7q%MHnKi5PW6BMmWevh}Q8 zLHo8*`GlN^OLq3xsVpu3XXzAc=>j-VyL{s{H;h%(vv6u19pW}IbM-TSv}~g_@Z(=8 z8Ao;Ap9}F~Io#=Aa%FIGtLtwEz=l3cG0a-Rsv?|ixp77{X$$Ht_@#fpLO99rN=1*A z^%-N;B5=q_D9(#jUr6Q-;wHRMR#bG^83J++*7?966IoL0EXGZSQxw%vh)E8RH5NHy zq6_i3p!K>YtE;L~QB%v=24^JgMScW=ZE6lTl(8%8>$AmUqvprQ#Xz7yD|-H>CKqcz z@2S|F5QRgBCvQ8Twl;OpGIAoC57EO@Hcf?HYONPlR>n_5-%_FF=fCptHXI*DLG^U} z>r<#n`7Eni-Owzlup{Erh2oMt-I=NLD7_UJEBGhptUePUb(T`N)(*tEzC( zSJBxEWA~Cc9x}Y2gi}_I?=MrpVM^)zkE0^>28|m^ps7|bH`~>=X}TFo{+iX^NC7&< z6baZC)cg0Ruj(*gA>@3&KT3`c3kwSj6uKd{fN(0eeC?{MHfNiB#cj9baG#tCZzMX( z6MB4v-;;1LTl%(MwsQKC@lCi~9Yh`+Sb-CjQaFQWwocFg{>_odPsL~ABsQ_KlDtrn zPb>iffw@2*RUCDp@hMzI-Go`vNSH-pI&G*$mK;c&2K#$KoP~{4a~AjT%;a3+PUtPf z?&01RhN${ZnnvT%S(n{Nb=+;;a zbhx2vHNUuRTeGSM05UQEUuupU&Hs1>vNyy?FZs7DV7aLarJd+)s%(?P`uX2=Pg#;WaDiHUUx3$rzrLvqNk_r~+hhDnxqcyYg<`nyX`h&|R6+xln{V><#Ft=00{SDLQsFyK z4>wnoeu({<(qb#CqHrQMWKlMO_rYNB&=iz|LF^XG?Q}(%NyOt^R9c#!k56angH&q$ zjWZ@@^^8#(#t6>;(63aPVS(zgi;3;SLjT&X{*U`g><1}THZ zX%Y%;EiB%Uk|w34iKFsJNJ#i*$HaWKItXDv-uK1%Jv%pdd|Vtn02T0k^aGkkY<_-F zNy$(G)2tkGrmzpI;%jmN*Y?rVp!D=e3qFxR&@VAl~Gx&w|H>y*vw7k%b)td zv0aYlGK}JOep3pa=ebY_{-s|DEVV5~t}qklQsIeqtB*v(wv(O63V8Kg4Oyvnt8ID^ zrDMy*iDuUFu5;`)XYS|U&wqA=03HQAAvWusGDQfZY@fq>W9Nr7#<8QGrD;VgfadA%Ze)prI zh`}c(_uA;b(=1KlvQSYL6Z1zs`+$!T7psO%&d>KnRGFNd1$!;7`^%d2)!XfuVrvmp zRH3byx$L9}!-fwM_ml#z-0bY3sJGPYKdDK|Reiesf9Dd#7|Q+gq4%*CkFtu2L8$DI zf&!9v?>bSuW8V$YjC*tUT2Ft^$r1OwPtwoEY-7581Nc|O;m+_Q0}Y3H7t0g7Or|5C zy~4_uydDt{Kx%J{;}vA&eJ5O=^~G^lmkjW!WIIx%Mq;dj2Ptb4qF@BW zZPKVbiuaOJa9{q>tVe{q^^CH(WQak;N9!^r~=XfT{P2~727$5_ilj#|7;`4|SMtY#-P zc8E^SUM_pH{R;L9wsP`96PUnYJv@Ew%IV}qKsD5VeE5ZTr6)~O;F9{NT)^Mzd}3xn zj;2ZI>0{VqtMV|e+3o@3pzR(=Mn;F5k1FJRoQ<1BNT58VbtTO;NNOoSzC2)qqoor! z30z6O@+a>pqfY>R`r@^sH-0Sd;S!S&!8{%n={csK;JJ;@DLXW$*c=xqc3GNH`j0-G}4sAkA6x&<&pU$rI17F!8j+{JfHggT%&aQN)`BE@Y{Sp*t zih1h1PPcWDTEuqw47Dz-stRG*j!6vaLN%CdxvY0>Fu}63R_L%r7s2eqErEBgnsTI-yLHasz~L!4 zev38ITCm(_Sc3;Ka5UK=YwLh&d@ob{A$m=uh}IbxY;_)wFT%}D+R*2G4kc1wQ{a2} zR$gpOBp|d}h=2MMe-`cObEVHtpY)`j9=uKYxa#<;iPO$903%tQl*@zcb& z_PQ2>Do}h(PA@d<<>(kSk-TDDj{o#nFl~NwsdZryi1Rhs%-EKr#Ye8f-El<)Xm&RJ z9s;oF%m;cdmpJSvg?<{u&7DV`N@ovt6YRx0vCNY?y13a-7iRYhMMI7nWlCb{AnYAH0vHtDG*LQywzt z(tr4n4f*KiWJ1NLO`CB^ykR1k8_A_5Y)hkqPBl$>`Yl={{M~YQMB>)g_T={wCD@S& zDzgtj|7)JF`!a{~dA=|!q$}y}_KQirupl82==nX?J9jP4=b1Ob^f3(o;T$HAuj50d z;RfsE`ECK0=prLQ@$oEpxdxQKT$nj#>f@v8)0E#zyz zj+Ak}m;YJ5mODvee2f7vZk}iNym}x>Y1bZrSkZ#;#7C zo?tbtC@DS%haI1%ux8wer#;XRFv3NYFYDgX&tMg%`TBFxNh>{lGfZOry$+K zG8aOIpSjXy2#XFx(O~nttb!1m`e^WxbRN5uDx3T6V_CNIHXC5g`ecCRCV$BVF!7~J zZZGng4_`>M!U!k2vR^r+xbGCR95_tHKx+M9AAbGH`Z>?n@Cd=l;!OdZhblN~ zyG&{;midR?D@);BKNW#9!Jp!k@5bIIsnxc4Vy!vL<`ww#Q<{f7msyzCaUy^SLFiV0 zK0F+m+f{kr-JfmBI1xxD{GsG|upH>>5qAa>k(M!z34qMKKi)L(J85j`k+u8nI}au< zJMSv3XUYA?P*BTu_n9;ocPTVic5*@@z33Wm5m%o8PKd6uje}8CdLSs&*a(w2B+*4c zA_1bz>boM%`EFI%*tYE&QNEkWZKG(0~qSul>>bL@a+u{1LIu$ zLtC}ZQ9cBdfZ&Y$;4d3;&t_&GLTZ2BH_pfui;%E@teq}YjJmOb)5#6i_0Q&BsZ-ti zzhAVpD8wS0yJ+_}Mk=_5gQ$N|1-zbj`Uda~Pw&6w-J9e*wzj3&67c2L!?*bOVd}VS zoPLs#e(GOqurAo!X;4xPbLspCwa4jtvPJq{iv_xx$jZTV^l3O*F zAR8N-*x1;-{QSnEYK!q_1_tQ?0Rci@*I4BI+D1l3$h=}WC4sDXX{pS_%#4qJW*1PT z>+&;iYb!pL=QNGaS>K@bud+mKtq6i)rc}@E`gl=!{QVnQkit7s(lVXusEL6^xQDc~ zSy!+Ur~rZ3%}k9?NRWvnQ93kgalac$_bS$8+2vttt;)+odgXzITGD{Pz@W~EI$OPH z;tMJ+ZkxGx6cmr=`KR#=ah_KP>@Eip`SN}jXJ;PQM;>5sOCXqBTZBg=I%fG86%y)*6;T3+iBs=zGzoxcp{D`i+FLp}x>g|vN z@BXg)#LEe|9_?uT`t@tBVaP$PfSiO zHo4g1z&`$477!AtSbDPDJRzcsWIy`G=0)fD`1su1&xMEks{&kF z9-gFyt3!c5_^~Hb(9Mfo;hh~b5)v!UeTn>;Vy*HNE_fg1WCHRD2zs2?_&o{hk5g)^ zu#0-ySk#fR;j`XZsSzQ&7|wlmwDI_A9Qgc7;esu>E@2JCgL~qDaFpFE3A0 zrqBBx@U!^vy@7#&)!1{DdOL%y?QN*%!D2lTIRGXeh!%A@IWQn+V6eQfkg|}Nn8?mv ziD-=%LpWX^%^%-g?2-ZGi@Mr}=jM1nefl+G&fg`434Q(crSKNM20K_2bS!#|KzNUf zw~d$T%_8r80*HJnOqTn8f*+2Y2;^nBU69H z#a*1FuNEkh(gzkOr3+e3y-S&#o|s4z@#;xjC4QW~@TyHw%l4=|Wx^(zal`N&0A%fa|xr zbDEqW&Q-}n*knk^9=3|S%zqRd-`GoGIk50`+ zoa43!XQL^fT!g12PQNCnre5t&7I!;&u7<7rCKdAB+AYzyZ0kW86R_h<))4$CvYN=! zjC{JC{=YA-ux_j3>T|r7 zD0Fsd$01RTZD)<>Zihf`*n>NBg%EVDs3ppiL3UIa{dsiuy}Ng|BqNAw||_WG4p#F}JWNbb4KUB>P!)_OAL=(&`6Y zkMQg3Z9taV)-I8xbT0|!>1bleGfSFsrl%L3`rYdrHm>8 zfjBtPXBU|4oKvcrnp<<4Tpsgv1;*Bgo{o+{WHZ9w|1Dx0g0fbedoybxtY>IA(%vqq zruJI+5@bq4CM3YmPeKL|Wxp+?{;v;i{NHZn<_)yHdM_f9`Q#KE5nO$KN;7)s;3eiSYO5-h`^p2k9$0g^kv{m{O_v z#6dohiTYhGJCEAlB#-p%+qk5p(SJxL21Ivb$!}h(-_aDkKv@TXiVm^@3nh`^FQl1(F84GM26;l6>`ye5Xz6hjz8Z~zYoyR(aGC8J0oAx{&B?5LL322 z)t&zV`ssbF+(1~QoBhxdLyz1*_X}lUh)!lMxc*{ncKM&Ik3 z`9Z-;*x-VL{(h&MHdfundSX;7eDIxe&+0|PY~?C}HC=QY6|P{$U(C%D&n3J02hWE@ z-^2P92b*m^?`JGSFR^Zt>(&b7cZ<14GDHyZ_xI#1-hw7%Tr1565b>ks1;yl;Q>fS> z40g%GwZaS!JpJ2W2n2I%PcODaL=aUI8CAP6kgYy6eH6K%G`jlheIUpmyS5y%L|WIp zKE-{|so{G!+)HjabRT)Wak3>1YS)*oX113PBJXtOYm|^}=^D(Y8#}nL zIvOEG;G&DwlR-0dc8_8HRp|DWax}a9>Udh7$-+|Z>Pu`<8ziyCFkLfoI3av?Hn|70 zCp5~qpE*6N$ULvEJ|-L;ai@IP>g(t0XSh7wpM!ReIi$}FcPeK<_CNTV>KGi?e1G3% zXuwG-fNVZJ`$@<+Tf=;`I@pi}Q-?H}MhRO&S~GCGnS0jjFYGPz7{`*idd z828};yioUY#hLeueE-6ajbP6iuw{JQ?>!+8C24nRnBc+2G-MMpXk|%1UE%pSh!_i` zQ@386ct7s983hqhB(i-xsGnwZt)(`}GhRNOSW}-b2o8u5yVSV(2_hOe%+&m)rv58F zAwT5HT)hDL`#R)1J^w*mYo?s|E7r65n~#`b#*ekGm=H<eov})y8QXl>0I(8luu8uG1F@lM<`0zZN(p0toI8(QK$K)Jbe1;%c!F_;WSK( zCB-B!D^CnQ{Czzm!oiq=!Cn;n+RH814*E&exdIYnaBO;E8BgT*{8+ zfp42|Ka**v=8a%)S@{`XtLGTlCIjsu_Zw^qJ$(eZ0t z?ADg}6xymyp(N*M_mrA(_y}bCx$K3uG?IQA@O%l_kQ(|3)Ya&*+Sub6oDEHUce&R+ ztJt`V$wWn>J-#MioLrrkMyA*{My4`Ry_=JODdQa*tDZpZE{w+#KR%VkA##$@*F5dV zkdlf|**xxHHHiF72Ty=lf*NLhEnzkE{7iT<25C~)5dfecyl&+?n_p)8KBR3k$ zbnan!VGI|p1$jhZAKNYq%b!7IkF$XaH!YwJ@kw>UNoGO6g<8McqZ2=4is}ZSJMPv; zeZqT6h5td4XZm2eQjb4LTIi9qZX8zQ7DUC&ze{?g&t`A)&Sk&Iu30lD!Io$^adI-- zt-KJ7JKQ)%RyW*Y$;o`a+F)=wz4nn)J6AA=k9mOBH}v5^Dus1~vrDlVbHz(i{5`$T zFDn;obek0#74{^pwIur}{4FNQC5R zEDl+T|BikB=j5!MM@H;ySD4nJ_uC~{oP!nR_8S$J6lJs<`? zifpbFKceyg=%dd3N!wll{<~<~e}L-$RNj0PwkK}wMAHZrejB2v<3hjs7?X|oT!Ek9o;nj*cS9O)sVVjBPZFA%u2Y2{rm|L>#>Xq=lgh|>>?EC>&dUr!FfcHX9&FE$gJbgn z9=*T6ztrF;qo(Hch_EcydeSIPyh1`gy;0ZZ@}*^1p+DF3vF$T zh89xt7g5P5VG&QjkWfz(kDy@HEeKLr=y1N};hDTwM$AFTWupxf(*@3%j z0`Gmb=+CZwD?P95<>bO3N(K$C$2(bKK20u%?l&i03?K})!dBl0O{6$?b*(KkXqIA9 zNWI3>QeRg2iS$+DmUy_hn)PMNnSN!+W6mN-vZuE8MYTE@1YC>O7Tf^DfYNV$9w|4Px_Ox&*7p;|0F@;z4 zQiYnp&kiUpy|Yl8%HVJ}TU;}tY+zyWj%!aNOB90czB?jOq__X>Hofyk6!8(LsTpiP zMy%nTCALSzn=ax#u1ZFLox^SVt5A_{Zg0G6?}(-CbGjC#8}(p<@)SGPhl4nv2Ee6JY!cd zcx-AaizFrJ>IB{TbaB>UNFRmb2xK(&~EluRKcb5eA`Jo8nPry}G z?Q9Vn1aC=Kb06moVj?L~g?_WM>-6E~@2{?^YH*6K`0H+Q9R};i8FN=ZRr$%wH%-c4 z^VIByqK-RZ@@5;G1+vfWOU{pbfH=@_OQB_|<{=<3#c(Vt+M`WyqFJ%atwI|3DCq$# z65gpYgTrM3zm&|JKlBF!vBACis`(NUe?AxgMnX*%dvacm&dsVjxl9+(Tr%&o4K9Kf zPtT?rqoUJ2E)7l1jWzgtG!5Jbr-IeE(^Z+tW`j(_IHhqYsPE}+w~k3`$ubNX!Y6*brO@ zj{6ow8>pZdX+dGtAIrtSV95z(JMb@}OVP~%7N2|Oo)HaKO;W$bQn!>V>_!;_<3^TR z5KR@#dy*_p2)=!qDm8)~Cm9ir{Q&nx*;;Us+$GK>9<=1pnUf8dfN~r&Z>GlQ5)BWL zWWzYdW!NMF8MiC)-P-+wSgjK29}@!BoIm`xcJu$^5Y>OW=l@@f`bZI@o-3XHhEob5K7__1pa?}BXf(Opd?PPI2k;hV52Jn+<$=UcWo2bI0BiC{=k-q> z)RV86E6svUA*i-dwmqm-YS8R&kIc=uZ5LAPCkNP!+72eo#|l+91%+B^6@Gg@B4`dw zx`Gw!>aLJKgmE{GTrNJDDfBZ*nwy(1F3iX)Fb@$e%nTG=7i-xUlD~WR5A0%fd)q?B z=VX)4uO#G!jZBzHScnC#cl)9ApxkfO>|^1 zR%tfui4)zISq+qv`@B6HjAiY5ydcNZ+L{T!yF-GMX6IY4SoFAI?q{E2BHqiO*JQYv?8TzvNzvhLq=h#PVt&pdyB-)IVh#ae6U zyYuPMd1^K`m{$1-GU-PsGKTLBX{oAayOtX+vl@bPr4dxe+!roI&+^;jzDl`UCv^kK3~6hY1S- z?iDk(0KRyvax1O(WD&hY##;~)7RFSWoo^??oSXLTn+;(8u>$4Y2QY_VXEz7hene)f z1lYFb?+HPbl{Yj(aT|(LifbgJIb%$(Nu0()%QiCd$-!q|p$EL292^`<(F$>!JIaY6 zYMDR5zrsjQ4-Nr&i+i9E+1S`XB8eN;@GmCQ-QRQ6*4ExA$MI%2D$H1o4=uG{XbEHV zRB8AgmZB?wjpVVlE0<2r+%$ zPmFXu+PivXa?kS}HXfb(trRQ5U7yO(UuLc0LjHb!bdlT$7Fy0A`^CPeIqUc3(v-CF zU&wtL6T>RQ#v|{3&)&XFF6g$*#<$#?Mk`0__2GjOhbWinlj)_yvOOGNx`D{%v7Hue z4R4=M{Uj3tSQw|7>XU56kdB!FHBm2&TU?FO&EX4y^y$ydkbNf+zX=ovBw3zzatdk-`V&3f85rf8j324S-x zPx`2Ec8O%&h}KGMSKsVKjoO!+yOq2ynD-D}h?CIn#ts-PG;clgDC~fo(x*{BThl>R zS$Vkn^pvtNQ==2KJm{(>NmfqI#Nrxm#4|j>g}?0v|JS0Ze}~?R{t3M)|NDTL&iYQ# zd*SEG$}NyZz`i`6k(AVM<|yRW<>7R}M1EU`72{{|-u(DZ7@VFZZbQjagQkwnelBb} zd6)$^nyXUSC{}ivOXuFlURQvII=d%uh_#Qm6aQk~;1B)HyaoQnynV$*ak*Xmd*|uK z92AO-D<=`IXcOm*ELVb%566GfrH0RzGU&l@cjMmF|Dy>z_oteval0z8B0I@Jfu- z1wZ^wTWWNugmN%G))GlX@kwH8*0RBBr``M)D=JUgVWgb&&}<|s||?PSj1KGT$JJkjh*;dLi? zyj3+$(q&t4Cf;~&!+4@E)yzaKaF9^b7h9liR>!Tds`xl-t4iccOE!Jp)@ImDGF@Q0 z92&dYI#6PM*7c35)@@Yt%I#%I#*(aRwqM;pR@D3+(iZ2wn|MWJr|FOLt$Otws#!+M zoH1;E=jc;oJU-L0B2r{MQ`;qpI)(LZ)s(Ye^;?Wk(O|$ zcUYQ{hQrR1`S7dg#PU`yKAY{$WNJ@S%al7zzxLzTRrsBbrZ_Pf`BRTS7Y5`71h<_u zCD2N6O!}f~!%5aEW5yiElD^`5w^PU}i#rCc1ez@{oNr9)edQ>&J9tI5Z~h`+VPg%c zfTejB$FCfQW|b1T_2zB8A8@uCLeE>INib?VlZkkT28WraGxU#)KI^X=pY|ITym~=J zQ!{+ES6st%wv@=@TkQiaij!aUm%pDQP$Nq%23W{t#cew8BxmjLrgUQe*5HE`GZAO| zJ*i)Pz05^;SrO5lrVK4TAG0dR(=m#l!--4!?UpLbBn4;Dg?Fw~%rQCS*DL2sH+LmPOy>h&Lr-q({)q>t`i-H`fKicu8 zQA=6$i9C%NUTV=VuH+M|msWXpTM7b!Znr|M?GjrDy8Zb@@b@4eJVWR5AkdsY!)u0O z_2jC!**lV3z11>P#9F3|n@je2=#*e8rAU#LcM7!^&|Ha*QQqyY*TaNaY%Jg6Zu6X! za8Ro>>Pjg*{7uDQ)^lCcF94n;S)9k=FuFN37S!J>dCp4@ayFbl~C1YStPc)Wf z#m!PUB&>fd#ds!sRYggCvABcN;fmTkcaX&Td6Y;P6)n?Vrd14!MCGx5uj))n%6Tsy z*FHwK#V8_I@4hwtw0@T<9flw(YAV6*<|qmhXD{j%SJFYFp*k!P68@`FvYj0%Dxs^s zQmw&9x42f!7dBlBdenWTn=$Tji~1R+iMo4I9SK+D$S=@_&KFe$AwTF(m~`vvZDY11 z&46QTk&zk2yRXegPw6e}|G{6CQ7Nt<`JMj*f6|QWF-YelQ!2Ta1lH#ZG^3hi14B^+ zEul6KW+f``1zfhW=DJhWRyUi`A_YvKN>X{HpqGP%CShTWEP8>4gRUbnm@T8OwvJOh zJ3DRj{(Y}Ohs&y}(4*W^8lp@ZK)N}c8FYV+ z;oK@|3X#5qErRADa@*yZ9C-3~FQAN9nQVe2Y?3S}&(q|c!tNtyF|6AMT*u3wk`(Gp zKMSiUVSnHaedbsP7b`1Hs5Isk~~_ntPz{a9y_ zHcS?LFIhbjm{wdA`*U#7S+oZOO+DMLN5QKpie0LqsdwkLK2EdZMK@8bH<7vjN;+z) z>-fsgSD zKXMjr#e4Oku;}LjhR=jPilXHj@h2}T!&{lnTUS>8Sa?u5$1WXY_)05VjF#W=!rE^cM=Amw<3DZ}dpchb2J;2EutJ=S%XF zdV$u?8beAFu|H3aKRgny9guaO8$WPgB<8;&vsiwpx_ki8&3D#mYIK4Bih?X=~M)`GG)Ky1-FGI zo;s$7uuM7M3_*t7X`2;tv)-1&Jd-e39ikh@Dal>Y!dx25H#=NdQG%(uW73Y6Ll2vpfo#6XZ76qb$3*U=TuQ?bzLWI+!n=a!>Gal<*vk?VXjmf<}F7L zzSYbFLibvy9A1gwSl{9Ao~~;Yud%{ax2(>74tasW`;Lg0-LoJ;JcJ;w)Z@pxboCMJ z8e9tt!eU}>DZHUn7lI6*KMxNLg(4z2G7`RS`CX0t&-pzw2FYpuGZJf$7NGkpR|?-? zxsr2R-@kVcKVsneA61HEZfd5vo^~vr^o>BL;ex`#4_8;5c5@^Y73q|vvbvA1`@`mo zC7;-9Qwfz$u2|^6j3}U*Gb9KK$cX zf<&h{P=VafE>+&clvyM6qHl@fw^K|gus==uJ5*q)|1d&yYv5MyH*qDUGkVR4v9p5b z5dZ2I{ok>70W2FEmvnU%_IFa{v>xbH)qYz9oQ?DmK?aRRxz4{6cRY=RZMODV z3YHrE-#0gHNkepj-I#4Fh3%|0LM;K#j8g|{_=nLx*lg__!^_I)!U;Vh6(q#6$`2bm$KSXMp;>CNl-_($_WbI|;8Ip`~| zpGqNE9j%P}{5cYdM5Uz-q10Mc(mE8&MZAj&#(LZ#Oq;8@En#gv|Lfb0gPj%sXK!0H z$S%CBs>*F^^V{dgPe_Kw!~SH$r=8UibeTh|7cS98Yh4{>k>wB|WiKh>AeyKP(}tn_ zEu#JM96hJCU*ASxn?F)wGZHJncaJiOpC3mktHNsRvFqWWL?F3#sqKKCr)5V+$3T^P zL_k2t$+4@)vBSyA(C*$9*s?-C`H=raWBueFa)uT)OrvM5U!G2I(8?6O=qWPf-#ji7j4)2YY+>wbXB23-#&aseZ1lJq$^$bo)dk zH8piAxq17{=IL@ z>FFvJBcsfnJ!|RSXL91=n!>_w2SLV~=;fBARh$FwYGFY^a<8)H0foXvwJUD#ie|Xl znwxctEP}$q)HcxP-r{L(?2Dz!MhV(ZuLB>YbUV)sO`JmtBqcPCe9OwD`*U>YUfbH* zE}}Cfwl$&{KLu3meQ#}P@i^Gn+}FZfqoViQ<6Oy%zf)Zycm}2DaI2)d!mqG!d#yUR zrI|hp_kHbUq)wvV3HysnxVUN5u#%-Z8=bs&+i8m)^G$VFL^IwugMIDF%*^rl_qvXl z(_`M>;N0(Y-wmlgc^R3cIETf)4Gd<|_kr!{WP^-HVPxbl8o4hSq6dd-OGo(9nHUTP zzf#HHacxw;~QG9!b&K_j(&3>vQfH8szW(>+~XbRJgDfxErZ zyHXpP2i#{E5z9C39Pdv? zJzwm*t*WA!Ql}6B{9V`0+-lE9F}ypcWl0$-v>kEP>E`{h_KUpSeNW3U#ViKmfRs+0 z93Qf>=0OtksAMo12t6Qid!9>56N+QCD>G>o*&glr^rp%YZi`=kW@sq79pmM7dn9@1 z3r{|cLM$pNDLOLp(G31fjENDlNXY%*zMPm!8Ixwg*ZMczMMi>#2k`YCu4)=?HLsy@UGip4r)$8>LlDMmEq-`zkNMvTy;A1Q)tFOX0s~V)89lwz2))$#g$1Ch zQmS$#k%I1KKGc}hTgOu;SV-%P_dG-{Y#WQ{TpqJSard)F5_|bt|IxYi@i7%W-49%^ zJ*06_avH9fC;sJi0s!uT+M}jUv91ZOucyMrRk=ED4p^V9jp_8Nhc{Mu7h_M>Q-eRh z2~AKE?yqy85V&{mo=rk5N~}|;5(lGMQnu63usyDIEwGc?6uO3FgKMigfdI}YD-$H{ zQxfN1A>l+gpBwx5%S}~TM4<>t5r_AGiQy;bQA&v~)j4q3swe}js149roZSMF zK^4e8eXUPc7wag0e>*Db>E)6kZFhcB zQquP`h@0;MrO*C9xGhn$(TIO0F#n|)m79QbkDixzr`~4^J`Uzx@v)$=!q%7hw_3?l zec+$9QaxGaTMX~j|4=Kzul!XjrR&afq-ca=?RA2X?9T}1yG60T;|iS&u7AZ9JZ=&Y z^z?c`0_8tsFTVLD_q7fCJDqJLcW*rNXuB5Uz$`;YH@NcLyq!f`?5E;+Dxn^iN(6MyDNTJ)@@?>OTiHVK`v9N5}nqBdiz_lUukY zydM~#$pyWeNmOBTny!6rc7JLr=WZODLzM&l8Nv-`lY%gd?k$fy*QYvbGvv@+DDpz4 zf}8L!+ROLM+^r6u&bfPYhmo+{G&BelC`PO3_O|MZJVr9ym%5bW(%RN+=Sd_JRPTNT z_6ktJy)Tta%s20Q944?axkw3$xq6DbX?V&gfm>aMI3g&=42 z6ZT!XwAkdta!hv2{L9CxBob6(I36moDKaHFj&rR&&#hi~dB>kITFWeZ%^)|MO2(-) zt2#e9e<@uLew=UG?XQ^dOj*V6bG7$yMr=68h+^o}G(%CPdl-h4CS6 zO5{|O5VQb28j+Cq9jS|+m?ADE=A(y1{-n@rOH|3vtq4es##+41w5ZCR@YAhsb88JYsOyT?P_%u%&^V>tW;#TM zCrs#wDxKeqmbiN7uPE}6g67Y*OXCX=6Puzod)&y$wsGQIW*bKDZoB^M z78<`TOdXsoS{epUC@>wiZ5OjphpSX!hK`>oiCaUM5k>A;E+9PretOM?Jj$(+cCqX0 zg?`$SWW(7G-cw(_sx_PW-yy4+xqK~$^c2@d+PpS_o>`4C(KurCe8=?c_e-@Dfk&s= zHMi$W#k$vc zu9@x+RXfGB95U@KTCW!TO*mSJEUBZsRkW6gRo7k{&kshQ+%$uBMrc?tKTG2CTHgl^ zTl2l%X?G~mMX4R_KJ7brHWeqFJGtd=QYZ$8BKtO)Dh|1CeW950<9{n%GwI1H!m*EQ z5aVfK!D$^xD;Ko9aWTgBpg~uo>4Bq5l@k5vb^4quf*f1Y^x|w?hXQq)mKDVt@(4Ax zBiq37bJEx?XBVpzG7i3eXuOGYq*J?G5jJ9JzQEAmr$#(saqy7)jb7EMjpV6|c+3i> zZ`!Dlog*__V<)b*YnJ5jXJL;zd%x3&#{JjsQ=)QWwCgrp@_ zm`^(s$4#RzvVC)fxl%WFZVxygAt6S&aApzpGi6#$O?n44TP0WYX!J}U3{OQ6uC7gvxE!b8zFa&i!5>#1l& zdA8=BLsiVz&km_hU8JHqJJq{zlolOhaVk`O<66Yaq{CCiO!IVME3ymJ$wP$HF(#3w zsR?%uq-6VMLRe3#RXznaJuP9zZHFEayHjI-@C^OhdaM_1uEXwDfF!V@<(f|;HdgL| z*Z1d7z2_~Y<7_O)0b1?`=yDb0_VC2SDp7w@fS?>(_xs&4T?awCt)CnP^X$={3u>n$ zvCMNt3Dl{JIGryF87fnQWd}Onouj==y?>goBd)k(5;UtXdM-2-UwgDkY_sQdjGvFI z8dKCmaTswp_f@iN*!|ek7~nmU(Ab`{t2aP;?wjy(h+@a?;V+i2JkO zDMQ64If9X7-_$lVtL@bl zHHdGvMRHHgC7beAywW^gnsDyUa`gCKHtJx~C%*km(Tx|o2Eh{fHTiC1@Pi`ujDmgL zYn9A93y*OUHh%nceT<1EJGOHrs66;Uak`_;Xl`k4net7dQcpakOY!4sV#XH*Cyu^m z!(s`#N)d@0%37=E1+LN`YPC$KoM)#zc|hZznnxSAnQ$%H6xow`+|{**KJ0_30adcG z3iAHpAya$AC5F9AUay{Wwzo8;5s{xFNlxmBk?XBYg`oigR}|XY|evh+6~uRE+txnB+SRAv|-TXb8;Gdm2uHT zRhPsHYZ|_FunXU|nWrCtVM<|E=1N-mK|+F*z1i$^h+q(X6uUP^nvOsA<4Y+TNj%H5 z;Yg;_3YmT3wY=OVOT8CXs@Gx;yPZdvPSIRPXad87K6Knj&IOIfF&6e%Q$1M`+DW@3 zbS!Cwd6N;$^NMzp8FQ(havrScZ}kd|*)wjfo80rXH|R}WT2mbQBZwMpo-&$rF5L}) zOubDGuDjoZ938{88(?GS0V*@?hDwFzqy6cv5K0moKc3TjixF(hM?^()Rh3WY(ra4> z^@6HRG79R3@{D$eOI5gE-~0Qt7oYaHk;RN3WTbTlv(670GpoEC`9i&fz$=O($|W$|tRDWXPb z!tVc@qig7MdH_RctgB-a&@r*HT3Q^`0IL)hf)1iJm{pycd}Bd2V|mtxU7tRF1b^NP z0wIW6mV}*s7`V3h6N?fO1gpDRTMvgz8A&znT)PPHPC{lTSmTagzm5mQpsUhp&85QQ z_+?w<^TS<=-rn9)o2dX0$E;N|bGz;Jf%t@#jSV)y=t@@!&DB}Q7?-XtMNohFefa|F zlF8IO%I2R%si52eoXo7h$aJJE3bs|s%9{aX*n~_-F&h9UwxK(Ax-*ou$yp6ftzX}S z0AEy+-#^3#{zE}r92pME5Ky!2f-w+a%_56|sa20$ySXA##K&lcNExJntL?LAUxC%6 zmiZ|g!#mo^{8gRFyoIt1M&98P0bhXIVzwHBNSYG4(o{Q1HLrsOtV)p8Y;S8DE-)o3 zq@SXqqT)te6H&V+6-pEyK8vwh8>IwmUSC&N{F`6iNkRA^^;L?!*?E(A$!Abi&1VqO zy@`(U@-M+9sFLb8g?RKuZO0n{-GZveVsaK1AgxOU+!D>bHrCWt3&t`u%1G=|N=^>p z?fqE2tre})p5wkO(}k%mUn^rHBPCjZc&=W&cv3=i7aO6Uo|l;{5m>Ra%mdlpYh+|Y zUlRPEYs8(M{GJSdRw&K53vX zt@zA;&NlxqIH%f|R1FOcLN3$IYF#NZ8gMwL|dI{U5fSb;OGorD`G1pyTq!M4Zx_(VX!cB))- z+nLuT8OxHsK0YyQ#^0e?CMzcg-4-Fs!TY{pJ(+<04dv=tnH?Q%c{BT7zI2Jt?GMMXs^E1#``?uOiTN+r<(VR?D^C=%bC>vs+gRyqf85cM+f zTacgy65=5hRp=lPC=QMq4hw zpUt>VOiV~dwq+yc1O6nqwjs|}hn=+>sA*Fc=iQpU^5OGRSXc;}G)Hhb0fDCH8IzWn zsBdWaY9nz7TA(RDmM}E<@?{vp+9bE;DTF)@rkmLu9XX--nxCI+ukNC5kM+V z9SqSw_~Gz~Rd*;SfgYs%AQ7jm_*t*eOy}9N&*0~}ia<$PSR^8mtQt0x8zVyi`o1(W zVtKWWfS2~2$aB|`!0qCAD=3H{EH*NM_uD-%sYK1B&Fzi#dJTd4KQ@p{8hN@5^>aap zj6p5RlTA+v9tZb@h!Bc153RBORGt4fC_PC6ZFW=4e1^FA0kqyVHHqJ0?{YlsVzlGH z3#0{PK7C?ge|bWr6OhH@DsY2=8Z+xy#Cpro`G@jz#&$P)L>qt8J>fOzYvK51@g z@gwGV-@*u2F^S<*GJs#O;%1^yisVv~l9=TIF%=a7T3V;t_qVgPxJcO3cNcnzpi|vK zaAg>1<201ChQ?uE25x`O2q}9y-tYSlzdamn~kjBSoD`!X#j_2AyG)l!7_*J#KgDrvlDe`Cialue`IQ!k*P5vlgrG^ z+{r~(y}7joZJpG}y=#y3^@Fo5VYAPiJI7uqD&spF$O=;R4%Hbu`bjLGcBlZ?#F zjkrq>xwu$ZS)b$?%4Mpzn@C5)JN{184EZ^;1jc`EpEwbrP5oRoeQmEZx!qhy{`*M` zH3})n|8DH!O;^PxNhmGbfj*$8 zmul#n@1_iA)*DHYX^QhC=W|%hij0heiwd5P-PI9FA)(XVv3~wn;|b~M>6w|?2^$lw zrLfBPlsU+ln$kn37er%$A3y%+=&-TlW2B^1(I?8tFa>fe!SUHMMS1y-PlnF?2= zTkcL`JS_pQY`*8|T^=6rGz`UY+syW)^pYZOstg3#gL}->bm92WNg0unoVxp8Un`@62^M@%F;GODfYSavi z0!BDY^xtqH?oJUG0hYXUogr{0R>PC)(spWMBI~R5^}}5O%>wHL>b|giySjJSfk*pu zsc`=jdTQUj``jCEZHC+D4VJfViFFj~M?&Q`GX4@RObK}P;REJ8Q7dI&kOUgG*||9z z#JU2k5->lDkBS-d(E6Dm!pB>=@AX?_5SN#i2k0b-4Pczr87r`haTBIi(AIX-*S}Xi zn66YuADC`4*WnIM-KId?>i5wdcG6L43YD(gi{dFbOknwwdGdstLs+EF#Ey@T#7u>S z!>HvlQ3MVA@kv+4Z@9ixFjV&?6<=zgF**Fm_P!Y}=qNh6@n62gi(du$!KaFfB@#wP zDT%!47S7HTRoB0mJ?a*AcJ`VK%$&b-{s>=C;7t7cme|qM{TIZHNRf4Kv8#E6=5gOd0gU27g+uq0O{<x%&!rM<)UC+6Bc)|xRktG)whng_Y1>|WTcDXy3a=|qF@wh zZ(}MFcDgn3XEF_UWa(KTsnxhZ$;<$XI ziK6rIfgB&7)>XubkIyF>ccJuHUw{8>jm|gXZd-Gmvv5nmqwjSt9;DgQul}DQlMIJ= z(ope1R9gA|>4KP%1pdk8^9aE+@F)J;CxNJbcNhjW$<)L|RP2L-;$jDf6-GwJa@&~? z)H1U$4;jf^mUP*DFh0N*2N^3E@r#LyW@KdGoO`S1vG0S0NI&}LuH-n`*7W3P27qfA zA|QYx(>B)hU!xnnOn zbCrjOr(q4HSKV>6-V8bWR&gk7%*ua3D7c?+UXC66doVSz8H&(cM z`Ld%^b-7_P62cIzKYrY-hB;oH{Qv?O=oJHlJc-$3O~Ov7LP;6$qA!D z6?+YR{T|>NXkQ2-Ob`Er>G zhaSlTe&%0g4tRy2I`_W3AoOQ#k4B?SbWMAbS=i^=!J$MGgxsM3uYmMTl((Uh6Kv8PoGXq4%z`(%4feTy`71*F5k;sLG84pU| z;^NLA$|msL&|JGHic3ZoZ7rrJ!Q**yUq^=wYAE{I)MBV-C+DA7wT7=W5V<%DygJ+g z;d&|X^kXG9pRit=`DRNd@|rCF0x06!VowTVAh|PP^(S8%Mn+uPv{{g4`))N2# literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/sender-preview.png b/docs/screenshots/204/sender-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..497df5f29f2ec80a3e063a60b3ba406ada0b14cb GIT binary patch literal 71983 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

8(YrbzF?ysvlu61hv!C?tDyOrP6@Sk%?;^h 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/viewer-prompts.png b/docs/screenshots/204/viewer-prompts.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a4502756af85df23171d9e8a7ba0af1093ff55 GIT binary patch literal 47717 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�E;OthC-nx_NyL-5Q9~fx)q%SfM5X+O=ab*_k@qa%}jIE z)f2iZj2k;DuGbz?mfh-=nUIh-3W_$s=-#ks;IxOzHO~gZs(TmhTbI)1@e@vNA`fhT z^-vJhJZzL7MV>AmRcao;dGZvhxi%(#%dqeUGi)GfHduF`Cg*onHFa_eosKx5pA)vd zBL^YPt)9T*;^tPo4vL3^O}u`B^%K*lfsr{u={zIU)+l@lo4fcyqfanZ(M}vn31)fG zQO}I`TRZ28qh~msh1JqE)GIS1YPWYT@|b)*HO;x;DsD|ndDN`mSW!8)qkVfv?7Tk zkM12y3rJ+gK|p6!+Vz5+CMQ+uE_Iu^3#T33bBLaH7E|TVyYe+FBIuiAb(QlCIRED0 zyul|?*ZbkqSJAALK<`vdBldm!VJ-vHpJ>||D}b4}6UULHaCKtvrst82ywh6qTsr^u zC&d2pk<&k&-%2W4+-jFA{qyuvGXx{GiMJ#o3S>FG(Vwv`gyRUz%@&b{32Dqx@7>;0 zu@_|ON}D7ajPB(_}21h{c-mMjIO3ZTII;F;790l%wAs447VBL?Z0nz z_C*t_CaQ(=ooreLsLrH_q9fQ2?N4kC0V$Wj@PfeJ*;L`1ePiL#W$||FYQVzaAay}t z#7g0546gEN0eie0k*{i3&mAeIXI{T#*lPr8s;gA+-Ess)J ziQlp!xU4l89S>r!*h?roT;l9Re1b;XM?ImepE*TW8~P0mhDRwLG|sg>nHiFJ_1ixX z>7c4p3OZFTKh#g{EY=`S+mhok1l9frdv6(6Rokt7V<0Lj3L=6EDhSd_3J55ObayLA zcMFTKKoJpXknWOZ(Iwpti$>{MbS~-{z;#`B?%%%mexK*t>o*t7$y_ted7j5Oj{k^v zUKxFFwK!jFT|tQNpW;xU8@NN7cpFMgr8}YM^c^b{yVG2HjNZ*`^*4=)5^q=Td3ZZZ#~3nVeRMkmmH*|=60xB zgx~_Nf9HXR=Q(9;BQN38Y(fP#zXC&Ssa`F9ZSA;LRH|(M#J}#=@0r`!9jOn4xhsa= z)7VOr4%|z`WSH!QmC)EGmZplf1q59%sH@vlyFz!79g%Vey~`FMR#qCUC}%iKfV*kJ z!uHL?*_NZC?nn617soMk+1+)AdA(Zx(u*{n6Ayos zXnuU6XTl`YnVT1|WXhI?s0;9&=|8y=87oMtn_pBZe`TSgvmZr$C;Qh;?UTqqR)PuK z{j{Us&$e3d&Ich`b!!qYu`9^Q>X~?=Z_Ql!rG;3qiL2_Qt`jIF)y%hR`TEF3FU0hY zsmznKte~*&8GOI-%8o211EpPAKrnR4ljX*05x-30Dp8AydbTNB(WJ3jVmbyZzG z?)pw!E275wlH+KIW243{O##71T#aI{SpBsxxQiNS39Aorpfc-|JSCDus?e{XSrxgXpa-*B&J*DX*U3{O* z{S^ZnjBVdWH3X4!oo*Vql6N4tffRp?JTan9e2?{a1Kv0s;}6wOb6x}5tK%p9{KZGE zTG>?DhgBzIf&w_RLk(9?GjJVEzRC|QGIF;JUwxzC>kN+HXCy?^nKBXBfi% zZhAzjh=KXh1NCDae~Ovi$P<+O@F^NtbcQ_m&0zC3wgEGoe4kNpj`ZaM48m!%711T` zxEmBr*N3FLy}t*Q$9>uE)9VEJ@ro zY;1^m9G8A5uL3=wkEjslKo9|c2~MmSK|Fwp!5rupT^k&${_bP$q1vyv3QdRNfzwz zq=a-#RBrFUfUDb?_4z(9i3^;t@jP-?)G%^ztS3ZVQ@0ZLx^$~wm_jy@e#L@cS9fE+ zj~9=Or?<0H{e;cuqvA|koiN&NxL6?O`Niec)jNAVO!gIfdrr^2NZIsSD!zQ7!|tL! zUQ!f*0dRA+n?FjTUNpmWi1KegfGm%m9+fNS1Qg*IKb)MsdQ{>Tkl2vctJ|7vU)>9)rLV zYs0`AnAvL54*!`Ar|7x3w{Q1h>(Wo&|2X*9lV1C!{ zh^5j%peMLNZyqe*qNc9z>|FI%)VR*I(E@N9FUZ?uxAJr+%i|IsR1;}J+^8Fg+JNP7 zpp1+RfaX9H$vtrjLrjJurn*folo-y2jsai%#&RtcI7GjIX;xOv_$)52{cpAtBUFEC z0j^WV#>TJS-Y_e69;<1VL4`f|9Udoo;3s*Sj?Owu-NoeqJk+Ub1)Qv`;_0YHg7qe5 zNeB|QhOle0<=M>TPK6^l@86d?u}%p1IGCSz0h8)B1%;Go*>ikqO@zrTZF=ze54b^5w*R2WiBJU`&;}Z zV9$c!2iS;tnDv|)AHHr0T^w<=YJl~(ikzI|!nsdye>-jtu`{hC%cm%&@9#7+^6vfq z80_=53}aZB`zAQJFCoHttBSxk+;OE3bV>f_`knFX@36}ZHy8SmdJTSxQ0=Ixt({tJ zEi)W0?kj(LYFzXh`CfGR@j%e!?{~eaDY^9FaJHTq3>>FUor>kQo~D-xXT5%*W1%f7 zOrE3hhS_`(Vl%w0?J_%iAgs+riML@taQS~c7V>wE(;LXWRp~ZFbCHNhk2C-+rk2xdargp;T2ODk>`KZqwe388DtZ&ZTZa97twiL_w6Us36r-HVVn({P&83gMAg*^89>PpkbnA{BBR}t z_N&e8=;0F86Blv*xVG45&XDptt98VT3u`C%DcKZuCMnV6_}qzOph1HdRXd?4e z>0rAgucETjN@HUm%VK`Tu=u3fvT*Njr=3f;IIVLU_77h+Pn<5}i?_%Y?GqTt*sfBs3MD_SA3qH#TmU4eK%A{vb|a8M-FCdr z8#3vJr=Z*t*7YF{PRA@vU?3<3<*zi<+`Yk;h_Xo0z?Rv^LIp)2n8{!LrZY#lno|dP zFYu0y5rSoyYFpf5^qDc#SPyI1iGeUarp|QgL2B$2#7m$uus80DN3ksNoyB4>AF;Q$ z2X(v%XUsVhVZb>F`-XqRWL#BGFIrHUv9Pv2kBjU1nX@Nee2%74LGyJ-?8k5i!xf+b z#q~cn?E2J`s>-02KMjwpKgG=Kti!?H7;QQjil-S%w;UD*BjP2Tx_j-r<+*jXo%b*X zZ`IC(0*vXzDO0ddobE?yAhr+ZE#+^VKjM)QvrH>!YH9}8*LhcV*?()r)o_@R7cS1t zwUy-E%U@eVBZeUECK0sMrtKyESe2e65$`CAZm0xrk<-5vQokpyjM0kV-QvW*cC90Q zB-P$N>F^B18#ef%x?EQsCv{W3S1=W;YC5xB1_YF9;U3eat1UZGQFro&IrBvhP@1jx zLBX2}FKW^Its+Z6pj2Sl4Z#UooR!thKW8{KTK|5A^P_u00f*`*4Xy0CbMA+KR{ssf zw89KE0~?)kmNmHO5BI4sMSwNyU&wJTAS5K^P!%UBC1x&FEnM@0Y{L4=iX0Zh$L~A8 z;!RIxAlE0-bq?!9tY{dMm?%w$_2FBnMArwNG?Xzg2rjVqoKIC_KauZ7 z3f?O8cwqDj^{)GxO>h zk~d&)*4AoBKZK{WuLvFY8baQzsy@KHRt^QP3+5Moj5MS$IvN+hambwn)&#ySjq6S0TCP z$Wx6)!l9@b2xYO>@2rdr4Bk#rM!}DNTUeX})8j2}hfiHKSC4`MdKc0mO zEll^L>T5Jez?no(ODl_Is4gL)0pF#$S@{odD+>kK(a0{@3z1j^Q{RxBSHv<@G%!%+ z;}d!ECJ-#0f9~o9CU1UY>{e^us@InN+z40n*Tc(=#oF}Zetk=ehlePS!&)qOhht(& zz&ot*3J0zmh6UZrmE~k;7_XsezWdrySlIofl&>{sSZb<&YN{t#jtlJhQ)BTD{i1ER z>s8Ge8QHP1raX`4jsH8VOxmdnSbD5B@8b;X!b_qL=`Fv={_}Fsu@p-Z3(|a7msm;Z zlXONJYHDe4NJ}JSBaskcSY9%J$ZnSCFLyj;4fm6uyHvL0F5Wm5QhVJ}hI zsaf9lQ53vox4F0$r`xZ)xG>`2aCKuH+1lF5V|PoO=g^y?QTYF&I}eYvk1A=lDO#5Br9 zU@R-e6D!ou@9qecxtsPm#3NwJd^kv81yN8hIdG^1`csqX-4HJ87#n*otf`+pGN=^y zz-0T-qXE-%WQC18@HDb-`&XH}wQ^?~R}F76gD*S}_}A!JhjVZ*b@j1i%)Oa>E(x5+PEpj`m60mr^H^Vnvp7^&@P0%WJZ=i{yjdk(ZX`8-u+1FKbE$S zkoq(uc*QFU>qQ+sCMqbqX)^CH_KO9~PMvJ2%r@xwvUKA7=t@?>1gCw)S`F33*H1Xt zA6g(t5zg{n&W+#g1{`+wIB>j#rUD*r3XgSl5X!vbSy`aMK9>-Cr!fMvCuwl=`${<5 zuUref#^(7`A4S(NC6Z-X#Wr64>gildqc`HPvHhvC5gk@cz670m>GPIDnqfN>`?+Fs zn%#SDC6Xm{s>*$6j4!hb9X;LP=6niMNjLWnnf*>oN5x%bO525#eIEvkHZZDjRq8w+ z<7i{|^ipW^MplKS9cub&0&8DuO@@v((J4E1ws8@*3H@Pxz4;wZeHo8-`(3&fkN(G`9yCNGW5S_ie;_uuaT z=^!-AFsw>_#@d)fgU9)qepS_ShuO`(9n3H%*T8u9T&%i^9G!dr9VRi$t?*jSPkXEmbawAViz zIT#;Ic2zfj(Iu#f&Ofjio5j&^9!Sz*W~OcQ^Ea~l;?k9APf&za7OO)$Hg#Z|yR35p z7r|v^WMqGKpZ^R^r1udWq@2QUd@h8WyB((2OE)^%oiZ-4k(JrXe$naTepw>`;ZhgQe$dan9h&rH)v;Ks;`CnpPa zIz3TbcpC4Vu?aU~)6b3Px1VDk-nkA8n(v*Z7b#>B58^_Ex=J(t<)T znz$B+g!}lZ6&jB{XTiJYFg_#+p`092BT2mN;rRl=Fx9*^hnsgRa>(CWT_W>elqq9P zD}`s}9=5A^#A~VKbk&+cyF$eq$v=KzCI^dbvX<8+wh>MnCEOn%F?Y-hcw1@Ov9a1d zn{!E=T%~k3C-+NBO+4l^ruWel8~u5FN%^L>y)|1p>x8NK-wHgLpXp4DdokPL8ck}O zi%%x?h9_1pj5WqQ>g2~FAviwTPjT6@Rs5Sbzhg=>Yt7m`Rm6KAWE9UD)iqm{MSBRg znohE@Ew8%J($lmI77XN@Zc}3hEv?L(GLPH`t`C<%_9_ycM5l!)^GY@KdBI)fzps)m(DM& zQ|Mqb?%NzR(zzGchrrt!VJaW&7YWOo9aBXhX2=M{MmdEzUU*6PYe|bh7bi3@qA% ziK|9i$Hq3dIRfz`C;!oG4CDH;yFA+zZ+=;)DvVUYhd%CZSB(AEAGvqGzWh-7ij2Oj>*^8?`8jH%_)7nT> z@h-LBiI1{7bKzFkCC*kDC*)6oA3Nyl-i{a2m^h7Luq&xk;m4ME zH}-MKJDH}XVfgW^M$r?Ok4sW$&gbE%H7R6LJYMaDxn>Z>(IuDiZ>j08=-KG=>zl_C8HSPot&*wimYHFe1 zRcMROHyKC+>Mj75LM`4_e)IxFMDbF^ShCyR-X>;g>D$xyrgDM8PoMtA<84~(N%dtq z;jbC*v@u5XPR0NK$nFr*b5P(Mpo&FdQ+oCm`qY@%U*Q&V#h!t6;;MvY&#f4g&v z%hs57Vvv1g_xAn!w;w*Ne{sKHy(i=vqlWH->w|-8RATv}30x)QQ-cM#AlvIqdVBvq zbw-Vmc^52Kacw3*^?L}+m1|jFnjB|32sy(fdcqzpYXI)rWa#tKZua9P;IImMl5`Z= zwSt$0QE92@u`Pt>AUOS8Kp+XuX9?z04+YdwUowJ zF_C?okhwFc@t|p(N~HVz@d()n9?e6q7*rFsS6x&~9lPti^MV_4GOojymWzo9m%z8ckiIb>w9xeRGqhe-v9?AP_J$h6I1>c*Xq4t z=Gaz(02LF{U0EsK$~8U!)m(yxNp<3I`bFC9BJ0R4`IV za_VePPX__Zf{=uS&fRpfi40tJ#Nds0cL7$SA0hIgS(#JSZ1)_pm`YpZs@ZU{`?&2n zPcV&q!wU8FEqc8iA;an~w$rD_tdORLO4lSa8S=c5Ct~O{87xSVG&waTD*5D1M3uUz zsHpufpKcvt_fDYltfh-zZmCSc*pouawO^(;g0;G2$_{VN&ogg8AUKAo&jfSmSxoNB*?m%3RbJ;(l zaC0PrMp%`{>s!^r_;`k1tMj>X0A?`pXeUz5qfI7a0y<>2Y3Qk`S+9Q{$9c~4^Uppn zop(7DI{aAPy+4(5(}ULHA(SJMBUj|1SBO7<>Oli-QG<%gKm{NBYjc-W`fU-K5(tmV z6K>1$1wI?ZAJZ-yaO)S`+Z0OkN6JqD5rtk zFdt!xRvheYQE7?i;MB>c*Z_!~mMJm?3LeaoR)$N&#tYRs8f!dW(f{gsJZjCHt4c76-<4Dq&$3p->EI*l`h2ZN!53 z94WO2G10f&XRg_v)WOOg`H&Uq*OD1B>1T-+>6Qa`8&JjY0GKh?$XHf1`JEP0;-Bq? zx1S{!?eCY02G9i#-fvX1=_X{>-MxI}%H*$KxA%N#Qoc~0=zYZAXFWkB2)tgk&*Mx} zUvCW*6cq_ODe0neO;TJ)kp;_ljKJ)b0v_D|)c)P2y;7-dWJJ%KwsJ4-g}nB$cwzqi z6^KIv5R-`+YHCGAAhzr3mIOQk45?LAl^TK$pQh*1(#x6J?X$aVG}88SJz>dOd3w~9 z(1#^ymC`#aBSR|8#%*Gi!*>3It?WRzGC5LB_*NKK9vPQyuQz#Z>>zq_@-DR^#%{hh zhMt_+`)44%Y9EZ#%wK^taG#7=s9MQXB)G7FIx>zTBs8?p2sI3_Kcr#ze4Te3 zmj!X3e=-F8DW%4M-?J6sVVox2$s?_{X22fM(A0k{_j@JT^SrrpDGxQZG7o_a;m3PW zdImowO!zj>egmlj`D3?3XmS#|WYxq}F~*SKmE(gc6d$M%z|(=!UUfBVJ}>*Bs1X_E zJFRM=?{w-y`I+}oiHU$l$gn&IJj-WC>WGvlWG{Y7#T!0p*3{1rwFivkL`wq|?V+rQ zRX#l!xKkMGEq@VgKS00}lWcu#O9!<=&;CQ~EY`1^6as8rSacwPfk*_tdMKSk4gs0{ z@_64NpgU(+usy$$rNni`dU z0JH-t%jfMOH3GhAO3kT^f&w6-z~ht|9GnH^1xrg9;S`U4+?96t-5o+$&i(QKq<)?w zK@aN7M6KV{{1Lj#~`9-IVKE;`t;PX$K zkIa|l6iq?P>RzNMTR=_%eoAQ~4G2aKn?raxw$N9LHhn%7sdHHA8g!VegW~f*q0P=I zJTaA=X*=R^$R8TCM}rk0Ah$Pfq@@rTg(+WvPSX`Fu=C~13JdMr^Jh7n(CjJ4i_B}G z?e}>DV1F*A71iV!bZ$?Ee1uY*9umC`{j^>iO#&-RJL&-i8HSEXnh1d!O=)`16 zVbfeA6gnkc*Lu;}(-D|_2QVPd^ksYHjJO<-n{3ajCh>e~AFpSGTwzpBj@${)tH-g! zJJi(n!^MkWF>$vW4hC34z$)|);u7sx0m2y+9wQo?p~6naO@e$?{|Bujwk@h8Hwy4!0?*xGBC633fU(8C?8jI|1qG$ME2~^~rhr%)fN71a z1Go#c&CJqy_m!>^B3mmeMxl7hZ8O_d;c5jFnkEQU|^j$9);WVbGHAKl?t&pO*Ko!{V@0gyTwS0SEC3&uhGcaJxM?w>fAP z7!k1;`ScV3O8f7L286ZJz(WYx0q~EbOhxJyE#rNCeRFW|N)47r<2r;SBsg9#efy&9 zw9cT;3HdyJ5|@J#h1^nG^ci`Li^G(A9p7F;`PiCs$Og48A@&$zl`{52fFl@jR$YM# zHF)7)y#-5pb4Z>-gwJ*Mg-bw3dZ_&zsL+G91NsFi5P1MD5|ps?21NXyzEXwT?qDKN zQ?F^O0#JP?Jc*7k$j|!vd+)e=|I`Acjo=LlM?Ucw^}fRT<4P;;uA3+fZYFfAW)+T26;+W?3y zJ6R~oAJyE@a1Es~z<4*>-w_Q?2XgWlj2{gzLvRS7;xkiqhO$lK8g84FtV3Qj4ybQ` zDVFaZuEod2!RuPSR5T&`n|?A)r;mYtQbLI^#S)k6;z1jA zCI0SCklxePnd%ksNAm2hAMBh5=T@f}HfSz^c#*C{Mo-ZU?o8 zR+F3RMFEOhag=Iuam2UxJ zG*2>O|IGV4;P+5(`nz&ZkS8km=viu*ix!$;dxtn3o_tAJrv&pbh z!K{9RtkYepkv5jRwqN=t?dh&wAK!QPDL5L`-%-A|Rjp&!GJGX4Ns)+w=3e>^!X<^o zH&ph1w{hy;O2>OEyQ(CN;m`1A*j-pO#c)f7TW@G+?Cw1du{T+Z524>8PQ)F zF}ADqKTRA7%?pl83$sv>dfqa)VJBzUYHn9w!j4?Y?DAiv-mc8;6)v0KGkmpkY|;nk zWb6MmlfIhmeGb;V`=XljFJcfb=5tRJxeDxCL&FlXa4*E^cx`;X-uEyvHb+dRuxX^Z zWj6V&*LdhVJDj|)&2=sg?QbtQWroFV$CQxI)7fa6J)+i5a~IkB)x)M~^6BfE<(g#% z##FSab*wP?vwCUzw*JuXdM91euc=HXCQQMY=%<>drjuy%$Moqx#7Z7!$S2$;3jQ5W zKrAR@+4C&!mVIe!(tL%U%Rq#xoR6m5%Djy@2D#>qz5ghPPPT!8Ws7Uzf-!otxrRX5 zp)wV{OIko#j0tKkxfQ-^v)JypyB}dzyz}|8)&mB{BgGQ%Zht!W^J1tA4z2r`uxxJA zj&~&^UuVp%Zj30aN{Vcw2Ag1hDx}=q(xFwAr^>5IL~o(u(6REFXKSZ78c~>v7^fk+ z(YTmfqc19Ax@Y2;H&ScovhKwX_jSJ5-gq_6)Nr5u%m-QuD+Mz9zMrwJZpgi{eOk^l zg^u#xFaFhj@7A$hM8NhuA>ARdwgORT${n1RIz6FJ{?xACX^5uWh<4c1H)W)f#a&mPkgr5q;JJCb0p}u4}Z{HoXOpNOFOJ) zL6P1jf$YXZ?UdLm+x?c--P{B4N8h`< zAlWob7_m3hD=|g-^5>9xUafA+ApW6`KfA`Z-;#+uz3%o~sRfZ1dX@vKL5-0nRrzNN zXC*&Y&A;1AuypuPgj3KjJk`ta^oC@tB5^MN8;=mD?YFh5PGK&6VYfZ~1!axtn^9zp znoP2qbXOc!-K~>OH3oH9@mnqO3v+Y`HBblTk>9x^su|z#DwDZIIl5F%>)y{{6uEWF z#unM)bk2rSKb$6u+|2o#<20UcQ=Q`2!hKZlqg#HaS;~^&hZAIfWw)$V$n|= zLXT#12BcO%hyL%e-mU>@J=1t*lxtxh)x_1pKGkpwu}HULN3*5OFQ**ED%LCEW6r$~ zjf|SUNZ+E^6FK;inpr~5eNxT1wWQGRBNui-9cm1Bv!(CK)S_`GeU%9$M&z$$XEU*z zrsez)Be`}k?`NQA@Alp@?k=WvCHY6Rw3-ZNy>5fvDU60OUOv^;zj~&Q6A~1Vkl^Xz z(z0`$g#9IDU+;eSWWoRJtf^UF(}0DYV-I}GcFNsWHwm-$jR=D|4^cX6UH^nvCI$hr ziN^cNPe|WoHkg<)#Dv+vcUU4g9AtMzMFNe;X8P`w+fTHw5Kt0b4Qv`9X3w>1D?l|c zJW|(crhX7AhQcZAwLNF6>cpah5R31Lun8bB4!j+BD^uCkO~xRdD?Gl1A9Xp;PVu?F zT$P|nQAc+C=vs@9=K-f9=5Z^GD(Oa()Dt5Sc40g*S#d35@rpV*wkH^%hlHl_C(`!J z-Sd)D;kFV{FC`rVSYqqu^-X@yEV)c!R&25|^E&AJRZ9!hErQ!;>`nGUyIqoa;wh#= z-)a3hQvb8ZpBNf7=;-dLI7Iw=lmE%Ze=+&T|AWc@d{iaZ=^*OtgV5ow6ZAEE`7zyd zE;CI{g|7L|+{u-xCVRG3x|f1W3+kkLYFd>w)xs?`=SCdo?YJZ+uCAT6>inuf+B57j zy32j4Y;X-DPEUjPs8F{22JP2U*2K6R{vmYBLlZKpIpPq>=W*krVcXd+(aBS zwFA27Z;qyVaXZFJs@mI_o5^0(nFR%2vSqF8!^8Ka!U?d|cyygGYtlARU|Ri0FPth= z8jaRG`mDlJ#6T^m_)ye^jnN&e-&7E==TO-^YvqD;vFd)}Sg`-hIKGsUGBk;Cc4Of? zzb~VnV}8{`-W_8MxQnBu1pkVtuSi-RY7WN}tjQHki7&^9ALi>Q?);>{y@jnGnPI2o z_X0v?6T`Md=(zm4S`NzW9+y7SNfuK#Wqn9#&UTbF#0u?8sO;z7S~W$_maZ!Yly23u zvO%Vfb=mscT1wbQ;wLsoE8t&Ej-ke-2k9wfkcri})Xu1$ZW!c|+Wos8mDHF_S#!GO zxckLl(SXtGFW@%*bB+bkfb8sM=qRPH29ZNF8hzFL&L0r~04qQWl8_|uh~fI;Z&Mpm z?!q*+g6D@*o*cbaNJm~iIuaI3fXV{bH=NbT)X|YogLH?F-FW4E!`%J!$)Jb)(8LP% z{f9+~7Y}a}=+e-tj+&Fx?ZRLrbcA(v#U8O8Fz;YwIG#9C{`>=^`hO`G@OKkLDM8Ry zDl6V0)~3OB8vRD)2vG853|fV8nhmFyIIPciB|(?oFuq&$t*xz1P2t=-Q_!>pN&vKx zwwXuOZxW8AJrN9e^AeAupr-Y!jOi6XsF`e12D(ntoBpFo*%R_S(;?lYJ(@16mCto^ z(SLn>m;)Uhjg^W3EC--rWKJMGw2zErbrVx_5dAEL81`Xg;|V(YzwCs5v7Sv znQdktarcsh+Ku3McC+x{U<1JQ%m#z49UAUIt?GRa0HSq_jACXF*X0aKOLM?gO?iX) zcw_;T4fOXvq*i0&P8Jjv)`?3>;-$K*&$5D*Tv0(GzEin$tz-3n76V|w<$CmJez-)i zp%JX9K-bBUNNB99d;QPeec>HAatR3uTPv&0l@-VxXU76tw+c|?4`^u{dwMp$a@7FD zs0qyXHG|OOLO_Q@DXtwFpVihH&32*Y z(UO{2&>(Z?Ee@rdt7}bF6^;BxFMvc0yR{}71h! zorct*v}7hHUmY+jJDAV*0$f&nm8EdCKb6&V+iz8~5&=qP@Ib?1D$l89y>fs20Z{pb z*RF*vFN>swGfnu8x3Y@m2{LMnd~U05|6hH+U^BY%@D0$h82<& z78Ze`jMf9@6cu8CjsJZ-0NSqTKe!${1YIq`%4ab6T3a(|VfgjfMHr4C0TZa^@T>eS z1OQ@IZp+-u&A9K#~G5K{Q=z$m`w z38rN6FpMtH&U2sv3^{x2@@pMhXj9bzfdSl$7rW)pUbrA4E)M&7JQnn%r!nv=YK!}U{0Ac7Wrw24Y$$z~}mX;=Q z>dabTzN(rU^xQxs(MMRk9BZPL9PaPO40=aZ^XJDkbb^!RDxKt!0T{h5-xVb2G6k=yX z{RW%yJSu(B#WV#vly)Y#D9Xs(MMFV*dl+s`zz~R%lapJ4JlL;QUr!BvJ;WQzT=on2 z=DdwV0|OOxSdw^QiEld5&zW?hum1XXH?=2e6w*f)!mn@Z2mq0a4^^wD~t#5`;Ip!*hQs`QEANpC~;gY85?#v zc)vb}QdL$4lFC{{HL3G#(iBLKuSg~*C!Rt}qB)RNttvizBt;lUTd%@FrO7**p6xew=UotL15y_yNsaENNCdNst%Gi;T@qYE8b zDl01&N;aL7BqCa=PChYVn(IvPO2&nkSL;7O2?u>5JKfVXo5KGz{13)4e6$<3=Vf6T zhi(*#GY6PCVwqHE-Xl8H&?(7Fg&ZX1PLm4^`7r*n^7-C!t(MKU+Gr2}$M*X4$fWf% z{{3X~RrFinmy%DQ%>odI3%a`EAm6d$9E-S-xJ zJRa`Mmvx)AOlLZH-7b}MLxw}$57gp=ttZ#9#BLcyN-NkUU zPm%(lupB!4F%;zF%ye{0@IpRPjh?50d!JS@O*&C>oDf9%qLYTl;;(0DNJwLy_j|qO z?}x1l18Ym$Y=pyIpyG?X&aC?hx-i3U20n#S$dj>u!pqNn1NBEqX~`t-BGq2B#L?>L z1-_cP`k6~VmK)J06I=gC{-~ zW`7HC!3;ZBw%*;d;KKXwo%oLt>*i&c&qt>AUt7yt{{#*Pr@Gaun~Lypvg4^w-Y*Re z)ALv@H~#%S0L<9`;o1C;N?1oqWMmXfvo!Ne51}K@r5aH`Ax{QfY!@K(0Ti;6hNQ=F z2r=M{72B6>%ywtXCTu`>o zxg&0nArM9IEMRv%IFj-H2SZixq`;xGN@V}mb`{7N}eOg%{b?oPJFQ7`? zvE4cpF|4v!V&{&&o~Nc`{C+KZ8DJOjQ$+RR!eziECFeYy+`rzHzJs5ItLKSMBtZiI zg9KK6VpILj4sQ>h9o=U!^01WO*^gb!tNFqCy`R1coy6nK;p&z^gtp7cohF=_`TfEs zmykU|$YsK-@}rNXNTb{hmjqBbpW9xL^6anLM&RVG6yzo)6utt)!TTX&LaBpe#?#qb zkNo%cdh+eL#$xIHhx5)L&#z`2I2+AddEki^#jVSFY6o5+8k9? z1gBD?I?zY#k(wT?wKAmx_y`0l62kNYB)-eLqwjYlbs7gT$fe-dHuNUQB}by2+(}Ious+R(XT`?adpq)fw1W%GqR-) z&j}np&Gn!CTXcJE#Hw-vj!uz!z1w1Dl8!wgv|mjN;U znb8Pa)WU}!*a&>RksgEUQ{14|O44&ig4T?`3R!;T*PERsruvg5FC;67^X{jBD9z%c zhGHd1=kyMD+4MRH568Fz9_JOIBj*ovzUfaH57M=X`2EykJKpXc&$sk0!-NM-W;>pu zJVjgO>O=4Hc!%d2q&DI95ytGj5Sl9^TL_j_TB%t4_{Br``?_^T|D%~%v*)=HNY=?A zd1?HpyvNR-NY`yiJ6mCw7?+7P#KKIUvhte2EOIs~e8h7mf7HC8*2qiIMgOC(6=lmnbzNiMlZ)&`@ zfqKk-cofqw(8pf|o8#@k!<<{IOOkhQ{bdpb;*pX%;qQn04d0YiwYpq52G(MyT1=lh zx3CTI51AUw6>;&TU<#A$1Mkf!l%NbVA?)g(4lD^1Fau_c+MiA|<^C}SkLr=X{6`gBGXkpLngX!F&+>86360Jtk-YK43#vk+hh|4@~D-MY5mEE|wqZd9g zaNf$rPDjo{I7xwuHzZr!Oi!(+h}LW2bE{7)_IR3xH)%HtncWelZDti2a2&?cw>fLA zu_M&_RMSMop2bG$#>l%-9~j_<$p$AMD=rRI@$(IhkKkPhDYY5NMu|vfqzttrILK>u z{G4rCOlkHDcHJ)P>kzS*0 zstdcW$x8-yiWJq^E{;$O2Yd%JjOAFHt+S@5K4aV@yW&l6ytB#aM(U;SPR^b?z6RQp zFHDyEGHiL#UsNp~ZRa^9SWiwKDvbxT_`?ovMMgRUl;M{wf*n%(?Zf#7(O+Z7ubYV= zH@6g>%>hRVV3NS@vN+Nak4OyZDvaq|xhl1Ie8%cnmn~l}*XR;VE$&&Xuhm^T zF*Q7-I1hy;NA7*6p+LMj}ms{weSVyX14exO8@JnORWH&GbJ@ zsXQsv3w2YpmDXpTbE37<&JM3#{TJ)^juj86D6r6{JMJ&;656N+-cIEmtbDofH6Msa zApbeWqpCWg>@Nq}$lhZt41tmwwT{jGRXX_lyRU~j4-H(+wanA4t) zRq}H*emG9fn*CDp3IVxjnAP%@sae`1%c=QWmgzCbYQGcoE!>i=qTDa0x>FQs z7hB7WV(q&ers4FEohv1!VkmvvJTkJ>qeWmoXsR!FPzVooS*e!`RYRrx7?jP`8StCwBbq)Lu zU-+pgp-PTE2C9@6_k+lQsrj#OJziT4k64(Eo(&d25Rj>7u+O^A$u}cr z6_YfGoY`~7w$o*dI(O!?XF$gI^zPg@muiUnJ1^)!149T1&RQPVXncQ-y<(o@d#7o_ z*_fHfnoV!>)6mM{iRW>kN3J(?=T$8h3D;jP`=cc0n?jZhWV&OL%JO8S!tBZJ$+b7% zpJN~9x=&noRxn_{QfB;|3?$#qr>>$Z$UAD?)FwCCtf0uYaa=b2}GD6rB^6 z+ZjBwviFK<#uCGI&>3!pIoNYam;&pqwCszMV$Y8LiN8Jf;L6cIR&2`h)m8hIO=BXxH{xjz1x?+Jga#9EVXBP zy%5@3_4M>)o%gyRFY*oiV>2_<(wAZz#>TXR5R#IT)SamMA}ZOGZqFQt!xO?i8pti3 z{ps0VE30f#(Z>2$cXyUwJb1%9ewrz`I3*<|Jsr>eJiiI=Rl~Bev9bFHpFf9ka}l3+ z1&P(8>+KwR$b+?J_9-0qy6D?s|6W{v{+M?CCzspPo*e8~xuYJFwoZ;j>IyrQ3{Onl z3zNXRfNYjJTrjO#Y2A2$8z-Z~7E&#d>l@W@Uf@}`%}iY2*}H~3E_-vhot*^L3GUCe zxh%}D5xj^#^N|x2hWTJ-f_&-GHHm~%@`B^)97sVo8g9SF36dLJ^tl%;#3+3w5(v0D zCE(MmSJ0;q&yWEg!3zzXpv0dXH&e2+nWM#+nL9zwydbZf`0Os&=P8q4X=yzs_0r?5 zz|)fCJG}O%;3ny+8#LYQ?afa-`&susFOwX06u?MDxTdUx?|Rp*tXNJm@P0CMbr{(h zMgeR<>pol&!wX_>+)4UINBO+TxJiNg-WJ908ZJ)h3z>m?ZZv7H6JrcwVq&ypSHGGX zzEn;nxqf|mZmw}~VSfI{Bfrz0?S{w@verwk143^+PCvYUAzBR1QZV^zTqFT*F91y* zx1>46BgtlqS6hkzsB2obx51ZC+;C0+&b}wy&C->86Xqr+scnbtqj~q2y~>t7&91t? z3H(_3o1Wi4TIzn%ArKp-Cz;+k6I;ukm*J zBD1}>IWp4IV_SbO@OBGit3KM{nI*OB)3IN@fQL8YFqaDLBgWy6y6QVQISIY@R*$f1 z;m~od`1W&(_h35|$6L{5*+cW{MBaH*pgF6W76`;jJYchEW<|a5r)7z|`nPK|vASKI zYyWuI(ADSN)${k{-$-9}p72)$YR^3y6GA5TT|vVS#+TVIkv_i9eRqg~*6&$^v$rYO z^`O=8Zbomiytj~?-vyhQba=q;E0;}iFH-ZwUCrIXu^97YkG}MniRqnjb{(Uq2VE9l zRGs~4i*JMn<5axu`Ydp`I~%{=ao^SdQ{r<9eD_d6sgnZN0{6~ld5CS}%6HC#<-w16xjd1w9o z@BMtw$KA8DbI#1X@x1W}=Qu@&tN_k(ZLoYG1|zg9qC2Uu)34zU4%Y%$08q$NdoU=~ zg2@-a3zdgvXZR{w2o)9-I0FiiwX7h}#s6Lxq8*UK@&gvw`FT_8bX7Zbvcs{mKv-UH zIjLS7QTum9%v;y;`yM4xlEMS*%7LRaqB+vVv4hu|1vcx zpGO{?BZQYA4hP(Fq& z02L`P+UKq~YWuZkfBFQj{tg8xKe_Y7(=bQStGuFOzeqcPhl=P)9CMNK195Ufy&uSB zH?`jCx?u_+BOhR8Wci1xuE?R?5)R=0mj|l9{_xB!W z_5|kqxcN2ut%BHP-B7@9kX0*pqZ~3dlFJ7wbhJUJRDI$6m$-YvX4K;dg;K0?4sWY? z2@iiEk`&N1HGuIm2?+CBiC5XXN-}od*w~0?`nyQ*IAWVt{PLvhaT2wf+vX_uN^6_> z9(Z9bOW_Rd`lY(XFt|0SA4AP~%}_sk4wXI|c>7>j%en<5U&ke0n7R*$hEFs#L_jL(y8*A73N+a40O8|6cl`@tbhImt7*hR1Q7@z#?eZUZ!NT%28h<|w<_M_<-1FZSf(mmx<#@priYK<>F93%SW9B;}|<+4ORfsQele^<~mHYS735t?5&k?^OeA0ixB)VY zB|Ft>h_MQpB$V15t}G@k&GHdeoBA`1mGz8{$2ezOTq^N7zkulxpZFPdQ6HYSt(MAj zL^Q|6hx4uYfq7Klm{}yAru{@VG^B56!EDx>>Ezab=IcL;l=F-ybhB7YKqYJ72)XN0qtLqJ+U=2vy-Dk9;GopJnXj8 zEn!oYnp1PH*Rta6cZ-$B7{7JzHzHc# zGAOX+DLMK#NKcS69Nsz%SGb>N>jTM!I#x@5?0Ktj$4x98>5Ks8aZynf{54pd`i2Je z)Jpz&nN*De{bG9iLuNR#_HcZc2$-W+m%EQ81JAE$vpRRl9ID42-y;wRg^WJuvxn2u zA*q_0nv6<8k&iIN&Eyk`SY;_dT?1^wWz0GA5gT?9$5_E!AyT)BoPZ_xy`sLn+~7RI zF0?HI>7t@Su$d2BiHHc~OESvEyf$;hqF)LG;;F))?Cs&PEI<(nUbktP0D0@BfF~1f zlWAN=PLK81DWg$`YOHtRU?-auME36Vm=A|E?7EE14lqg(Ma&(Vw%@SBA|xINl;MZ^ zC*l8|@_dsq2m{gp`)}YIduAN3NBZqdQ&qT=t41RZhf=RB9l?m;LTZw}8`&|X^|vPD zZRP#>(>9K&Ne*}m;DS;F31ek0(Bv(E(CZ2~IhMQIFRl|87x!t)9Nts5I>V!V z&Xv6T%IbfU+#LKY;Xm`zTlR32Qfm!4`P4s%l;@ol$o%H~wiFGfB}fx}a?w0C1}mH3 z{oik7|GvIlT^;*G{cfc0sF%0waxF-<3RP_u36gEB;9_5^Jv}@RjY`Gxbz{T-xl-VP zpFN>^H0KP$`>*kAoBo`I8kH*R8IzcV5xVp;Ws<~fj%qp4b#*-@u(>NWTDO`=`pzAc z*nf6^-@PgfcKg^TznJ&@&w6-=Na;z|r zl-veI^g#TtWgLs;qFqlh29NH_`s`gZ6&4c1XY>CiUBQkZkD2VW8 zri~6{&oD(V&Rcv&`PFEM!btGvl0Lq2k^9Qn&?1gdyUJ<5_-+#kQP_^LHO-`f81hR5 z>1@ZGUi{?=@>186cn#~a6!I`egKqW>Kj!Ab0t?%+RcL8UhWgvjj$*S3W)~J{PVyjl1dHTJ%;HaSg4Ho1pQ9T?Eq!eNY z5JM9xrGPqO3LXxCa+WCEf5t_%p#wcn{*@4@&p?Qa3)PJ3qBQVSg577XRQvDm zNu6p)s>GS$^j)|qcE)`6T5CX*)J{1W8NSMX?!LE(<6!_gQ|jF2VJB2mJ_$lA?ehIO zycY?{V_0%!^G~^(pSj)hBes*3i#}C@V>Y$}9unb&cZ?4dLv`FcIZ7C5lW|;ED2`1A zKP*drjGZa2XVnekogaE%Jtp)wH&VoQNGoTQk{Ewt;%S!%%eRx0w+p+;1@dL|I8Zes z0|P!xGzW->V!3}!=^`N$6DDAMCNRDpY39zSO%ukl?C2CK9&(-Ck56EK5U_078cz`4&z%($vxFo zOqORsw$5kb`Asw)O+P6f3o)(c8aX++vz>jkyTBRYFf=;qWM+m!)YR2=A>EU z(6`!?=fNdH_O77*gXCV_7qY-4peB(wT>NJw^0jBt7F}7)4$Qz^sZaT!n#JkMNg9Eq zon_GZ=$O|e&zwf*ej?Lm(CF7fkYrpE(wp<4hfi`f*eg`4)_}pnyNAIdd!R^!PP|$GWHF7;1YTO*wbiK`g?P;JMgueTYXuXN~yjQ zOZ?PS*wRw)7_6}CC#*=%t!~zC6jf706;)TU1d_WtMJ_IyLJ*PFC{*NWTN4g?u&AsF z=k{17pQk~@UsSO z*XmuRoBEh4GcDb?^;xY32S{=1c-D-WYXQFcoZ-XOB8;6&Hs8-tXCU^&6w=Zpl?wsqP4Bag<{zKe0LQD1 zw*9$}%LM77XE0}pPXn!#$ucP*Ums%6?xupX#3cMBy0}`+SCHQOGXY~Cz=Kj}C!f3-XB20uMt-huVLPf?zgT`izifiw zdfWW`sP!<~Oo2_5o`gx>Sz64?#@bqE6E`MK8xSg)-(}37tEr)}p6QHW!;R~9VI!@v|#Lk~b<4u69S$u=U_R$g8%+=FYDAfHqwZixFOG`MfErtdM%Ss+a z-JM-MJXKK+kGiYJ0p+1SDd^HUZEpwGr`(FUppyuFJi)RUg%w+His-Ovk?ou0?BqAI zbblohtWh(uxO9pere(AN5uX>=-!scA1-_3#Z#-8Sx`7%|-V2IENbauYoQ$8Bk(@0)*;1`g>6u_zx zDii{;6fqThgV~fdmCJYO)&~L!aCeAbleaM|+k8v?=w*(<*}AbQxSp`-A!$E}=Sq7| zD6^M=09Y7ZYh1D9OUfc?r$*n>0EBTn67uSXc8+^YFm+M0wFteSW4w|2h0k3RYbU(( zlE@<>tj7EjKR$YNx!kWT{nw^mYL~Rhy;XAB#wUP%Y`@vARd|c&KChU4V!VOnIAhuZ z;ghE|cSZw1Q}*0FrDgZuKac{4QqlY$3%cNjf5HizBuA6xa@OCnF2=P#bWiMSM>|)+ z3cqe7ru>O{=qasU20KI9qeSEzhz-qBymlSMziz-dlLJVD z@)nRgg7zLfb-Z-xMr7^FJwXg#n`_ohZb9=%m zbKU)RQw*}z3B9R1%7;s&KizF7d`r!yV}Bm*2gC`OCkExacvu6#U5S3r*}fv*u?p{g z^^7p^Lj`M-!#z4sx&{4iDpu+U*xNly2pi5lespVlH!_87=ugEL{8=6 z9+JDd?#}Gpu`{mE&^egT2=%j6^24c4^{Z7qR2}t^rXyZvKZ*MzFpO@zt@hlyQQhZe zy_SA4bv!!q3EOfvTnWic-bY0wEYN-y)BBLZ9P@5ZKlkxlJnfdDK?qA^puwP&oK#+J zF5|9reU*f$SIJGkCMJ_%jpS#Ng7;m>4fWZ%wrm{mjGjMN#!U<@Kec$!p~n8PN4&)W z@Gf>{5$b4uyA)&6cADRER*^IxV4Up(I{($AQ@XW_jwF@8?eiQT{bZpuRhA4zrgUHH zJk7@&#Gm)hKG?pm*$PEJ5?0Po3-);B_F%8mEw3Y6a@azHEkG-Xhd|6B@yPnmN&=ZY z+1IW8gk;*rRJ(5CtBS?C?5^$T_D;s4ZCc-=$?(Pj%8h&cOgloXyE1imy$EvWY&2Um z#eeU)ytPdE`B%oqx}2enPItT?<0GEO@nXe9;~BH0og#^GIE!xslvC$c?| zmFmTjI(+$~`IDQrISuLeFFtmbDxE@@Q+KUWJqZ7_sM);Sbo2FH7)v#={S_g+;*aQJ zA%ld`_@4ag_PME++YOarB6IsT0JyFU>XSWx7&)_!aC0sDLQx%~|BmGPI5Ej#-zpK6 zTl|HkrALa+e&@padW46b@6jzFBPHbwT;sZID+~l>(s(rEdJlqcoDmH~Aa7;y$li*n zQ&nlPmC0-;$eU<6%nuRP!ZRB_iKsBN;2%CAC6eXZRpm_m7?>q6{9QzAE!}+q5CBCW zNw*61T1!}*@TM4^#V*djK|G4-w#8pBW^WSz5qX*i>xJ(1^AD+=FFmSk&>(Y`AveLi zW!-O&;a$JkQU9Q5wzjK8o+C2K?op<}pSRGB9l>VbBb-KZ`#er1i)qk=^=8r&h`iq2 zgK#UKC9SMF9+v|)$6!L9{_f!T1Qr?7S=BL@?-lKDAHMl5%JaQ8`g)m2#av#}&8etk zGcDhAZy^)a%8xD_O%MDImz53jKctHkWgwM`JqR2zwa(KosJ|SWn0V#6PJu?;7uCbs z?(q&RyvAnUps|@+G99Bh{ik@G(nMn3C79=69E0(l_DY=-B=9Ab+qE5YU4CG|Hiqq18kt;Nz*)0oGdB*OUx5z z3PS!^B*193w1@I->36rbdSVoBk6kC$v|OnDOGP%b1tFe4rL zopxYW3`yOsMPNKXP08Y@WYbWlxqy6@LpbZK!wMU;x6SEDv;jEv;*^9p`4d@+4RevV zo8DR^scHIQH_LU4`l*=u!bWL(W`IlaNi8;BV&k~@Wn3JYv3D{A%ATln6rP;#?#eB`M@;OC|%_|hnDOa^DlNX6o_ z)+Vyiz9W8`3uSHj6wY*@ELUjj;6QVrpqYIVHis75V0KukcfNrN~1u+u3#}v1RSNp=KIVm0?O=--L%qLxaZ^P-cRfDW^$s=e2c} z?IR&b#3esP3xzhakrFHeQp3;X$Gob4=u4u)p%y0{-p^Nly_})S!3p*p)csl?_sxIt z_ZD&{AAHWXO}G8Pk9wnv@ZD&*8m7oANWCX$%bZhP7+qhAKepB9I~efETWBuWARQXk zf5#otLo08D;W2yk-kYkff_XY);aapur07{9Q#ZbQ=ZXf$&m6^EiL%}^Scb2~uc-mf z#BYHIi)|O_X1Xi4***^M53O@$GsHh-?RY8yAje}j;foljw683;1-sDb_|MN)O;!f1 zNTy8SjRKJApq1{neiODyi38+<5R``{fbWHaNc-A>RXPPkl+0gY`~CATv4@A`;lfJ! zg0hGS$LRAnHB-R)_I&3b>ZJQ;+zQ>_uyA^(T#bKA*#3Di%AwHj(6}W<(2=?ga~OO* z9(VXLlqALTDF4kN@=suPJjypchbGpxL;3el-sU~KbeubUM8?A|DOJ=)8f^Vs9IP9k z=D8YO5lXZo2r-}YhZmGmMBJ)=6~z~8Q=(%50Wy~U2|aB1a{&FoMf1B!P7FUL_+hcf zZX59yVUzQbC*yM#GQ$4`Qe~FGI^F2j=LM@km6jJhl%&cFjl>BW9D`r*9*#_6c%*B8 z#j(I@HuTE)3kI*3*WTU~b0nQ2dH6+7lX`VTj;%TAlUVW~Lli4cC*S90Lfu|dbzfV9 z?wQ5`oimvq&T{cyQw(V23gUFIPPb*-^Mu9cb!)-LLCcKXAC~a`=tf3)juDqc0SXm_ zeyHC#BNfD6<4woxtb!mN@+9K-K%SXbbeg{-m_qEH>x5 zmEPi^sOj@7Z=prL%CM7LX^qMd=axp#W; zW|vmkDS=awAuc@fj<;)Ge#{8L%1hJC9%&1zx_BNk)F#xWQ^R)rsgg@#8?^&UbHQ@WPfSh--n$)_Ch=*hg$ibjtXCz zNgH)WdMV_%a<9pjNTB}6N5Ws+G!CN~?qNqp|3(+B zs5A_OIP`=y(Uc~nLZ2>n{ew)u7MDn_wvZSYV|c=1TBPRGeXfiTkykQyqV`lFX*Ys` z0YNliHk}#vH2=s9pX(s{|4&_k@_$m`Pwru@Y2$-xfsutV}&y{ z{JsmxLrB^wqb&Zram9_TRhsE7BF8+pv*1Alf?EiOqc`mGm2j%ZDZrxX3B@+8*>9Fh zGueX3q0aLDBe9qA5Y0%2$Ivfgp`F=KzYsKcp*A^GF~#GgF$W=E>h#c|*DpufQ|sF8 z*gqf0;rPJ=h8!Qks18Q6Cy{R4E0y0(e&vymI9_@NfxtqB;*PhM%$wL#Rg@w0lI$u` zjoq)G>&{IUr2FKD3JI%R8pvn~c#>5MJzkY*l6}aZF<;uPR*2_L$%waQ8>2Q`IW+e= z9}gUj_`bx2{emQ2P|VtC5Fj3O1g#N&wyHLv+>$@{GCWTw&g1n%r%Pa|UwNt%zAHnj z`6<+W6w$Fd9s{)dZ{d?kWS(h~14b1j>mps26*`aLAJna-qxqma>Kq>x)!(>%o5!qujoQ>3&N4L_aFHxJ!Q$iyS@0gG(@aZ$6nkhz3;;7SXD+WigmhQ%h7Vn(n{t_3KH6?G7so?mk8PEO!)% zLMve|>(zKD=4sz6Ks0i7wVfU`0@C^Lu@>5mYoCIosz{;@(!nR!o+xQSz9^W7{2%{~ B(=z}7 literal 0 HcmV?d00001 diff --git a/py/api/images.py b/py/api/images.py index 51f97b7..8f42289 100644 --- a/py/api/images.py +++ b/py/api/images.py @@ -22,8 +22,18 @@ from .prompts import safe_error_message as _safe_error try: from ...utils.parallel import map_parallel + from ...utils.prompt_inspector import ( + MetadataReadError, + inspect_prompt_roles, + read_inspection_metadata, + ) except ImportError: from utils.parallel import map_parallel + from utils.prompt_inspector import ( + MetadataReadError, + inspect_prompt_roles, + read_inspection_metadata, + ) # Only these file types are ever served by the image routes, regardless of # what sits inside an allowed directory (defence in depth for the gallery). @@ -448,6 +458,10 @@ class ImageRoutesMixin: async def get_image_prompt_route(request): return await self.get_image_prompt(request) + @routes.get("/prompt_manager/images/inspect/{image_path:.*}") + async def inspect_image_route(request): + return await self.inspect_image(request) + @routes.delete("/prompt_manager/images/{image_id}") async def delete_image_route(request): return await self.delete_image(request) @@ -1628,6 +1642,65 @@ class ImageRoutesMixin: {"success": False, "error": _safe_error(e)}, status=500 ) + async def inspect_image(self, request): + """Read prompt evidence for one explicitly rooted physical media file.""" + roots = list(self._get_all_output_dirs()) + try: + index = _workspace_root(request.query, roots) + if index is None: + raise ValueError("Gallery root is required") + except ValueError as error: + return bad_request(str(error)) + relative = request.match_info.get("image_path", "") + if ( + _has_traversal(relative) + or "\0" in relative + or re.match(r"^[a-zA-Z]:", relative) + ): + return _forbidden() + path = Path(roots[index]) / relative + denied = _media_access_error(path, [roots[index]]) + if denied is not None: + return denied + if not path.is_file(): + return web.json_response( + {"success": False, "error": "Image file not found"}, status=404 + ) + try: + + def inspect() -> dict: + try: + metadata = read_inspection_metadata(path) + except MetadataReadError: + return { + role: {"status": "unresolved", "text": None, "source": None} + for role in ("positive", "negative") + } + saved = ( + self.db.get_image_prompt_info(str(path), False) + if not metadata + else None + ) + return inspect_prompt_roles(metadata, saved) + + prompts = await self._run_in_executor(inspect) + return web.json_response( + { + "success": True, + "image": { + "root_index": index, + "path": Path(relative).as_posix(), + "filename": path.name, + }, + "prompts": prompts, + } + ) + except Exception: + self.logger.exception("Prompt inspection failed") + return web.json_response( + {"success": False, "error": "Prompt inspection failed"}, status=500 + ) + async def get_image_prompt(self, request): """Get prompt information for a specific image path.""" try: diff --git a/tests/browser/prompt-inspector.spec.mjs b/tests/browser/prompt-inspector.spec.mjs new file mode 100644 index 0000000..8d072b6 --- /dev/null +++ b/tests/browser/prompt-inspector.spec.mjs @@ -0,0 +1,205 @@ +import {startCoverage,saveCoverage} from '../../tools/vendor/browser-coverage.mjs'; +import {test,expect} from '../../tools/vendor/node_modules/@playwright/test/index.mjs'; + +const workspace='/prompt_manager/workspace#/images'; +const details=page=>page.getByRole('region',{name:'Image details',exact:true}); +const role=(scope,name)=>scope.getByRole('region',{name:`${name} prompt`,exact:true}); +const select=async(page,key)=>page.locator(`article[data-image-key="${key}"]`).getByRole('button',{name:/^Open /}).click(); +const dialog=page=>page.getByRole('dialog',{name:'Send to ComfyUI',exact:true}); + +test.beforeEach(async({page,request,browserName})=>{ + await startCoverage(page,browserName);await expect(await request.post('/__test__/reset',{data:{prompt_inspector:true}})).toBeOK(); + page.promptErrors=[];page.on('pageerror',error=>page.promptErrors.push(error.message)); +}); +test.afterEach(async({page,browserName})=>{await saveCoverage(page,browserName);expect(page.promptErrors).toEqual([]);}); + +async function fakeHost(context,page,{rejectApply=false}={}) { + const host=await context.newPage();await host.goto('/prompt_manager/workspace#/overview'); + await host.evaluate(async rejectApply=>{ + const {createBridgeHost}=await import('/prompt_manager/js/shared/toolkit/prompt-bridge.js'); + window.hostValues={positive:'Existing positive',negative:'Existing negative'};window.applied=[]; + const target={id:'pair-1',label:'My prompt pair',type:'PromptManagerPair',roles:['positive','negative']}; + window.fixtureHost=createBridgeHost({origin:location.origin,namespace:'/',label:'Test ComfyUI',adapter:{ + listTargets:()=>[target], + preview:(_id,roles)=>({preview:{target,fields:Object.entries(roles).map(([role,after])=>({role,before:window.hostValues[role],after})),composition:{prepend:'trigger',append:'detail',prependConnected:false,appendConnected:false,before:`trigger ${window.hostValues.positive} detail`,after:`trigger ${roles.positive??window.hostValues.positive} detail`}},snapshot:roles}), + apply:roles=>{if(rejectApply)throw new Error('Workflow changed. Preview again.');Object.assign(window.hostValues,roles);window.applied.push(roles);return{targetId:target.id,values:roles};}, + }}); + },rejectApply); + return host; +} +async function chooseDestination(page) { + const sender=dialog(page);await expect(sender).toBeVisible(); + const host=sender.getByRole('combobox',{name:'ComfyUI window',exact:true}); + await expect(host.locator('option')).toContainText(['Test ComfyUI']); + await host.selectOption({label:'Test ComfyUI'}); + await sender.getByRole('combobox',{name:'Destination node',exact:true}).selectOption({label:'My prompt pair'}); + return sender; +} + +test('physical image inspector resolves positive and negative metadata separately for duplicate filenames',async({page})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await expect(role(details(page),'Positive')).toContainText('Cat portrait');await expect(role(details(page),'Negative')).toContainText('blurry, watermark'); + await expect(details(page).getByRole('button',{name:'Send prompt pair',exact:true})).toBeEnabled(); + await select(page,'1:shared/same.png');await expect(role(details(page),'Positive')).toContainText('Dog landscape'); + await expect(role(details(page),'Negative')).toContainText('low quality');await expect(details(page)).not.toContainText('Cat portrait'); +}); + +test('explicit empty negative is sendable while unrecorded text is never invented',async({page})=>{ + await page.goto(workspace);await select(page,'0:empty-negative.png'); + await expect(role(details(page),'Negative')).toContainText('Empty negative prompt'); + await expect(details(page).getByRole('button',{name:'Send negative prompt',exact:true})).toBeEnabled(); + await select(page,'0:uncertain.png');await expect(details(page)).toContainText('Not recorded in this file.'); + await expect(details(page).getByRole('button',{name:/^Send (positive|negative) prompt$/})).toHaveCount(0); +}); + +test('inspection failures retry and a delayed previous selection cannot replace the current prompt',async({page})=>{ + let fail=true;let release;const held=new Promise(resolve=>{release=resolve;}); + await page.route('**/images/inspect/**',async route=>{ + const url=new URL(route.request().url()); + if(url.searchParams.get('root')==='0'&&url.pathname.endsWith('same.png')){ + if(fail){return route.fulfill({status:503,json:{success:false,error:'Temporarily unavailable'}});} + await held; + } + await route.continue().catch(()=>{}); + }); + await page.goto(workspace);await select(page,'0:shared/same.png'); + await expect(details(page)).toContainText('Could not read prompts from this file.'); + fail=false;await details(page).getByRole('button',{name:'Retry prompt details',exact:true}).click(); + await select(page,'1:shared/same.png');await expect(role(details(page),'Positive')).toContainText('Dog landscape'); + release();await expect(role(details(page),'Positive')).toContainText('Dog landscape'); +}); + +test('sender requires explicit destination, previews full changes and acknowledges only the applied pair',async({page,context},testInfo)=>{ + const host=await fakeHost(context,page); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await details(page).getByRole('button',{name:'Send prompt pair',exact:true}).click(); + const sender=dialog(page);await expect(sender.getByRole('button',{name:'Apply to ComfyUI',exact:true})).toBeDisabled(); + const chosen=await chooseDestination(page);await chosen.getByRole('button',{name:'Preview changes',exact:true}).click(); + for(const text of ['Existing positive','Existing negative','Cat portrait','blurry, watermark','trigger Cat portrait detail'])await expect(chosen).toContainText(text); + expect(await host.evaluate(()=>window.applied)).toEqual([]); + await page.screenshot({path:testInfo.outputPath('sender-preview.png')}); + await chosen.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(chosen).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.applied)).toEqual([{positive:'Cat portrait',negative:'blurry, watermark'}]); + await chosen.getByRole('button',{name:'Close',exact:true}).click(); + await page.evaluate(()=>scrollTo(0,0)); + await page.screenshot({path:testInfo.outputPath('inspector-dark.png'),fullPage:true}); + await page.getByRole('combobox',{name:'Appearance',exact:true}).selectOption('light'); + await page.screenshot({path:testInfo.outputPath('inspector-light.png'),fullPage:true}); + await details(page).getByRole('button',{name:'Open full preview',exact:true}).click(); + await expect(page.getByRole('dialog',{name:'Image preview',exact:true})).toBeVisible(); + await page.screenshot({path:testInfo.outputPath('viewer-prompts.png')}); + await page.getByRole('button',{name:'Close preview',exact:true}).click(); + await page.setViewportSize({width:390,height:844});await details(page).scrollIntoViewIfNeeded(); + await page.screenshot({path:testInfo.outputPath('inspector-mobile.png')}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('host apply rejection retains the current text and requires a new preview',async({page,context})=>{ + const host=await fakeHost(context,page,{rejectApply:true}); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await details(page).getByRole('button',{name:'Send positive prompt',exact:true}).click(); + const sender=await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText(/Workflow changed/); + await expect(sender.getByRole('button',{name:'Apply to ComfyUI',exact:true})).toBeDisabled(); + expect(await host.evaluate(()=>window.hostValues.positive)).toBe('Existing positive'); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('nested viewer sender Escape restores focus without closing the image and navigation disposes both overlays',async({page})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await details(page).getByRole('button',{name:'Open full preview',exact:true}).click(); + const viewer=page.locator('dialog[open]').filter({has:page.locator('.viewer-canvas')});await expect(viewer).toBeVisible(); + const send=viewer.getByRole('button',{name:'Send positive prompt',exact:true});await send.click();await expect(dialog(page)).toBeVisible(); + await page.keyboard.press('Escape');await expect(dialog(page)).toBeHidden();await expect(viewer).toBeVisible();await expect(send).toBeFocused(); + await send.click();await page.evaluate(()=>{location.hash='#/overview';});await expect(page.locator('dialog[open]')).toHaveCount(0); +}); + +test('empty negative send clears only the negative destination and preserves its positive',async({page,context})=>{ + const host=await fakeHost(context,page); + try { + await page.goto(workspace);await select(page,'0:empty-negative.png'); + await details(page).getByRole('button',{name:'Send negative prompt',exact:true}).click(); + const sender=await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.hostValues)).toEqual({positive:'Existing positive',negative:''}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('no open ComfyUI window is actionable and rediscovery finds a newly opened host',async({page,context})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await details(page).getByRole('button',{name:'Send positive prompt',exact:true}).click(); + const sender=dialog(page);await expect(sender).toContainText('No compatible ComfyUI windows found.'); + const host=await fakeHost(context,page); + try { + await sender.getByRole('button',{name:'Find ComfyUI windows',exact:true}).click(); + await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.hostValues)).toEqual({positive:'Cat portrait',negative:'Existing negative'}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('mobile inspector exposes full long prompts, truthful uncertainty and copy failure feedback',async({page})=>{ + const text=`A long detailed prompt ${'with readable full composition, '.repeat(150)}END OF FULL PROMPT`; + await page.addInitScript(()=>Object.defineProperty(navigator,'clipboard',{configurable:true,value:{writeText:async()=>{throw new Error('Permission denied');}}})); + await page.route('**/images/inspect/**',route=>route.fulfill({json:{success:true,image:{root_index:0,path:'shared/same.png',filename:'same.png'},prompts:{positive:{status:'resolved',text,source:'execution'},negative:{status:'ambiguous',text:null,source:null}}}})); + await page.setViewportSize({width:390,height:844});await page.goto(workspace);await select(page,'0:shared/same.png'); + const positive=role(details(page),'Positive');await expect(positive.locator('pre')).toHaveText(text); + await expect(role(details(page),'Negative')).toContainText('Multiple possible prompts. Source could not be determined.'); + await expect(details(page).getByRole('button',{name:'Send negative prompt',exact:true})).toHaveCount(0); + await positive.getByRole('button',{name:'Copy positive prompt',exact:true}).click();await expect(positive).toContainText('Copy unavailable. Select the prompt text to copy it.'); + expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+1)).toBe(true); + await positive.getByRole('button',{name:'Send positive prompt',exact:true}).click(); + await expect(dialog(page)).toBeVisible();const bounds=await dialog(page).boundingBox(); + expect(bounds.x).toBeGreaterThanOrEqual(0);expect(bounds.x+bounds.width).toBeLessThanOrEqual(391); +}); + +test('filtering away a selected image aborts its pending metadata request',async({page})=>{ + await page.addInitScript(()=>{ + const fetch=window.fetch;window.inspectionAborts=0; + window.fetch=function(input,options){ + if(String(input).includes('/images/inspect/')&&options?.signal)options.signal.addEventListener('abort',()=>window.inspectionAborts++,{once:true}); + return fetch.call(this,input,options); + }; + }); + let started;const requested=new Promise(resolve=>{started=resolve;});let release; + const hold=new Promise(resolve=>{release=resolve;}); + await page.route('**/images/inspect/**',async route=>{started();await hold;await route.continue().catch(()=>{});}); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await requested; + const baseline=await page.evaluate(()=>window.inspectionAborts); + await page.getByRole('searchbox',{name:'Search filenames',exact:true}).fill('no-such-file'); + await expect(page.getByText('No matching images or media. Try changing the filters.',{exact:true})).toBeVisible(); + await expect.poll(()=>page.evaluate(()=>window.inspectionAborts),{timeout:1500}).toBeGreaterThan(baseline); + } finally {release();} +}); + +test('responsive gallery defers observed size writes and still fits the new viewport',async({page})=>{ + await page.addInitScript(()=>{ + const Native=window.ResizeObserver;window.inlineResizeWrites=0; + window.ResizeObserver=class extends Native { + constructor(callback){super((entries,observer)=>{ + const sizes=entries.map(entry=>entry.target.style.height); + callback(entries,observer); + entries.forEach((entry,index)=>{ + if(entry.target.classList.contains('image-grid')&&entry.target.style.height!==sizes[index])window.inlineResizeWrites++; + }); + });} + }; + }); + await page.setViewportSize({width:1280,height:900});await page.goto(workspace); + await expect(page.locator('.image-card')).toHaveCount(4); + await page.setViewportSize({width:390,height:844}); + await expect.poll(()=>page.locator('.image-card').first().evaluate(node=>node.getBoundingClientRect().width)).toBeLessThan(390); + await expect.poll(()=>page.locator('.image-grid').evaluate(node=>Number.parseFloat(node.style.height))).toBeGreaterThan(900); + expect(await page.evaluate(()=>window.inlineResizeWrites)).toBe(0); +}); + +test('unverified saved associations explain uncertainty and cannot be sent',async({page})=>{ + await page.route('**/images/inspect/uncertain.png?root=0',route=>route.fulfill({json:{success:true,prompts:{ + positive:{status:'unresolved',text:null,source:'saved-association',message:'A saved library association exists, but it cannot be verified against this file.'}, + negative:{status:'absent',text:null,source:null}, + }}})); + await page.goto(workspace);await select(page,'0:uncertain.png'); + await expect(role(details(page),'Positive')).toContainText('cannot be verified against this file'); + await expect(details(page).getByRole('button',{name:/^Send /})).toHaveCount(0); +}); diff --git a/tests/browser/server.py b/tests/browser/server.py index f1e36d0..1d3cd4d 100644 --- a/tests/browser/server.py +++ b/tests/browser/server.py @@ -78,7 +78,11 @@ def create_app(root: Path) -> web.Application: api = PromptManagerAPI() api.add_routes(routes) - def seed(extra_images: int = 0, include_video: bool = False) -> None: + def seed( + extra_images: int = 0, + include_video: bool = False, + prompt_inspector: bool = False, + ) -> None: with api.db.model.get_connection() as conn: for table in ( "image_prompt_pairs", @@ -107,6 +111,25 @@ def create_app(root: Path) -> web.Application: ) with Image.new("RGB", (64, 64), (index * 255, 64, 128)) as image: image.save(image_path, pnginfo=info) + if prompt_inspector: + graph = { + "1": {"class_type": "CLIPTextEncode", "inputs": {"text": text}}, + "2": { + "class_type": "CLIPTextEncode", + "inputs": { + "text": "blurry, watermark" if index == 0 else "low quality" + }, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["2", 0]}, + }, + "4": {"class_type": "SaveImage", "inputs": {"images": ["3", 0]}}, + } + info = PngInfo() + info.add_text("prompt", json.dumps(graph)) + with Image.new("RGB", (64, 64), (index * 255, 64, 128)) as image: + image.save(image_path, pnginfo=info) stamp = time.time() - index * 10 os.utime(image_path, (stamp, stamp)) pid = api.db.save_prompt( @@ -120,6 +143,21 @@ def create_app(root: Path) -> web.Application: extra.parent.mkdir(exist_ok=True) shutil.copyfile(image_path, extra) api.db.link_image_to_prompt(pid, str(extra)) + if prompt_inspector: + for name, parameters in ( + ( + "empty-negative.png", + "Explicit empty negative\nNegative prompt: \n" + "Steps: 20, Sampler: Euler", + ), + ("uncertain.png", None), + ): + info = PngInfo() + if parameters: + info.add_text("parameters", parameters) + with Image.new("RGB", (64, 64), (100, 80, 120)) as image: + image.save(root / "output" / name, pnginfo=info) + os.utime(root / "output" / name, (time.time() - 100, time.time() - 100)) api._generate_gallery_thumbnails_sync(api._get_all_output_dirs(), (150, 150)) if include_video: # Seed after thumbnail generation to exercise a real unthumbnailed video. @@ -135,14 +173,16 @@ def create_app(root: Path) -> web.Application: data = await request.json() if request.can_read_body else {} extra = data.get("extra_images", 0) include_video = data.get("include_video", False) + prompt_inspector = data.get("prompt_inspector", False) if ( isinstance(extra, bool) or not isinstance(extra, int) or not 0 <= extra <= 200 or not isinstance(include_video, bool) + or not isinstance(prompt_inspector, bool) ): raise web.HTTPBadRequest() - await api._run_in_executor(seed, extra, include_video) + await api._run_in_executor(seed, extra, include_video, prompt_inspector) return web.json_response({"success": True}) @routes.post("/__test__/add-nested-image") diff --git a/tests/comfyui/prompt-sender.spec.mjs b/tests/comfyui/prompt-sender.spec.mjs new file mode 100644 index 0000000..a8beeeb --- /dev/null +++ b/tests/comfyui/prompt-sender.spec.mjs @@ -0,0 +1,68 @@ +import {execFileSync} from 'node:child_process'; +import {test,expect} from '../../tools/vendor/node_modules/@playwright/test/index.mjs'; +import {installHostHooks} from './host-fixture.mjs'; + +installHostHooks(test,['PromptManagerPair']); + +test('native image inspector previews and sends a pair into real visible widgets without loading or queueing',async({page,context,request},testInfo)=>{ + const positive=`Inspector host positive ${testInfo.project.name}`;const negative='host negative, watermark'; + const image=execFileSync(process.env.PM_TEST_PYTHON||'python',['-c',[ + 'import io,sys', + 'from PIL import Image', + 'from PIL.PngImagePlugin import PngInfo', + 'info=PngInfo()', + 'info.add_text("parameters",sys.argv[1]+"\\nNegative prompt: "+sys.argv[2]+"\\nSteps: 20, Sampler: Euler")', + 'buffer=io.BytesIO()', + 'Image.new("RGB",(64,64),(30,80,140)).save(buffer,format="PNG",pnginfo=info)', + 'sys.stdout.buffer.write(buffer.getvalue())', + ].join('\n'),positive,negative]); + const filename=`sender-${testInfo.project.name}.png`; + const upload=await request.post('/upload/image',{multipart:{image:{name:filename,mimeType:'image/png',buffer:image},type:'output',subfolder:'prompt-sender',overwrite:'true'}}); + expect(upload.ok()).toBe(true); + const id=await page.evaluate(async()=>{ + const {app}=await import('/scripts/app.js');const node=LiteGraph.createNode('PromptManagerPair');app.graph.add(node); + node.setSize([700,1000]);app.canvas.ds.scale=.8;app.canvas.centerOnNode(node); + return node.id; + }); + const nodeRoot=page.locator('.pm-pair'); + await nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true}).fill('Before positive'); + await nodeRoot.getByRole('textbox',{name:'Negative prompt',exact:true}).fill('Before negative'); + await nodeRoot.getByText('Composition · prepend / append',{exact:true}).click(); + await nodeRoot.getByRole('textbox',{name:'Prepend',exact:true}).fill('LoRA trigger'); + await nodeRoot.getByRole('textbox',{name:'Append',exact:true}).fill('fine detail'); + await page.evaluate(async()=>{ + const {app}=await import('/scripts/app.js');window.senderEffects={queue:0,load:0}; + for(const [method,key]of [['queuePrompt','queue'],['loadGraphData','load']]){ + const original=app[method];app[method]=function(...args){window.senderEffects[key]++;return original.apply(this,args);}; + } + }); + const workspace=await context.newPage();const errors=[];workspace.on('pageerror',error=>errors.push(error.message)); + try { + await workspace.goto('/prompt_manager/workspace#/images'); + await workspace.getByRole('button',{name:'Refresh',exact:true}).click(); + const card=workspace.locator('article[data-image-key]').filter({has:workspace.getByRole('button',{name:`Open ${filename}`,exact:true})}); + await card.getByRole('button',{name:`Open ${filename}`,exact:true}).click(); + const inspector=workspace.getByRole('region',{name:'Image details',exact:true}); + await expect(inspector.getByRole('region',{name:'Positive prompt',exact:true})).toContainText(positive); + await inspector.getByRole('button',{name:'Send prompt pair',exact:true}).click(); + const sender=workspace.getByRole('dialog',{name:'Send to ComfyUI',exact:true}); + const hosts=sender.getByRole('combobox',{name:'ComfyUI window',exact:true}); + await expect(hosts.locator('option')).toHaveCount(2); + await hosts.selectOption({index:1}); + await sender.getByRole('combobox',{name:'Destination node',exact:true}).selectOption({index:1}); + await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + for(const text of ['Before positive','Before negative',positive,negative,`LoRA trigger ${positive} fine detail`])await expect(sender).toContainText(text); + await expect(nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true})).toHaveValue('Before positive'); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click(); + await expect(sender).toContainText('Sent to ComfyUI.'); + await expect(nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true})).toHaveValue(positive); + await expect(nodeRoot.getByRole('textbox',{name:'Negative prompt',exact:true})).toHaveValue(negative); + const state=await page.evaluate(async id=>{ + const {app}=await import('/scripts/app.js');const node=app.graph.getNodeById(id);const serialized=node.serialize(); + return{inputs:(await app.graphToPrompt()).output[String(id)].inputs, + serialized:Object.fromEntries(node.widgets.map((widget,index)=>[widget.name,serialized.widgets_values[index]])),effects:window.senderEffects}; + },id); + for(const name of ['inputs','serialized'])expect(state[name]).toMatchObject({text:positive,negative_text:negative,prepend_text:'LoRA trigger',append_text:'fine detail'}); + expect(state.effects).toEqual({queue:0,load:0});expect(errors).toEqual([]); + } finally {await workspace.close();} +}); diff --git a/tests/js/prompt-inspector.test.js b/tests/js/prompt-inspector.test.js new file mode 100644 index 0000000..d662877 --- /dev/null +++ b/tests/js/prompt-inspector.test.js @@ -0,0 +1,36 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { inspectPath, promptRoles, createInspectionLoader } from '../../web/js/workspace/prompt-inspector.mjs'; + +test('inspection keeps exact physical root and encodes every path component', () => { + assert.equal(inspectPath({root_index:2,path:'a b/x#%.png'}), '/prompt_manager/images/inspect/a%20b/x%23%25.png?root=2'); +}); +test('only confirmed strings can be sent, including explicit empty negatives', () => { + const record = {positive:{status:'resolved',text:'full\npositive'},negative:{status:'resolved',text:''}}; + assert.deepEqual(promptRoles(record), {positive:'full\npositive',negative:''}); + for (const status of ['absent','ambiguous','unresolved','other']) { + assert.deepEqual(promptRoles({positive:{status,text:'placeholder'},negative:{status:'resolved',text:null}}), {}); + } + assert.deepEqual(promptRoles(null), {}); +}); +test('superseded requests and disposed loaders cannot replace current metadata', async () => { + const pending = [], changes = []; + const loader = createInspectionLoader({get:(url,{signal})=>new Promise(resolve=>pending.push({url,signal,resolve}))}, value=>changes.push(value)); + const first=loader.load({root_index:0,path:'one.png'}); + const second=loader.load({root_index:1,path:'one.png'}); + assert.equal(pending[0].signal.aborted,true); + pending[1].resolve({prompts:{positive:{status:'resolved',text:'latest'}}}); await second; + pending[0].resolve({prompts:{positive:{status:'resolved',text:'old'}}}); await first; + assert.equal(changes.at(-1).prompts.positive.text,'latest'); + const third=loader.load({root_index:0,path:'third.png'}); loader.dispose(); + assert.equal(pending[2].signal.aborted,true); + pending[2].resolve({prompts:{positive:{status:'resolved',text:'disposed'}}}); await third; + assert.equal(changes.at(-1).loading,true); +}); +test('failed reads report a retryable error and later reads recover', async () => { + let fail=true; const changes=[]; + const loader=createInspectionLoader({get:async()=>{if(fail)throw Error('bad');return {prompts:{}};}},value=>changes.push(value)); + await loader.load({root_index:0,path:'one.png'}); assert.equal(changes.at(-1).error,true); + fail=false; await loader.load({root_index:0,path:'one.png'}); assert.deepEqual(changes.at(-1).prompts,{}); + loader.dispose(); await loader.load({root_index:0,path:'one.png'}); assert.equal(changes.at(-1).loading,undefined); +}); diff --git a/tests/js/prompt-sender.test.js b/tests/js/prompt-sender.test.js new file mode 100644 index 0000000..70d3395 --- /dev/null +++ b/tests/js/prompt-sender.test.js @@ -0,0 +1,121 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const source = import('../../web/js/workspace/prompt-sender.mjs'); +const hosts = [{hostId:'host',label:'Workflow',targets:[{id:'one',label:'Positive',roles:['positive']},{id:'pair',label:'Pair',roles:['positive','negative']}]}]; +const tick = () => new Promise(resolve => setImmediate(resolve)); +function setup(createSendSession, overrides = {}, roles = {positive:'new'}) { + const calls = []; + const client = {discover:async () => hosts, preview:async (...args) => {calls.push(['preview',...args]);return {ticket:'ticket',target:{id:args[1]},fields:[{role:'positive',before:'old',after:'new'}],composition:{before:'prefix old',after:'prefix new'}};},apply:async (...args) => {calls.push(['apply',...args]);return {targetId:'one',values:{positive:'new'}};},dispose:() => calls.push(['dispose']),...overrides}; + const states = []; const session = createSendSession({client,roles,onChange:state=>states.push(state)}); + return {client,calls,states,session}; +} +test('sender requires explicit compatible host and target, preview, then acknowledged apply', async () => { + const {createSendSession} = await source; const s=setup(createSendSession); + await s.session.discover(); assert.equal(s.session.state.hostId,'');assert.equal(s.session.state.targetId,''); + await s.session.preview(); assert.equal(s.calls.length,0); + s.session.selectHost('host');assert.equal(s.session.state.targetId,''); s.session.selectTarget('one'); + await s.session.apply();assert.equal(s.calls.length,0); + await s.session.preview();assert.equal(s.session.state.phase,'ready');assert.equal(s.session.state.preview.composition.after,'prefix new'); + await s.session.apply();assert.equal(s.session.state.phase,'success');assert.equal(s.calls.filter(call=>call[0]==='apply').length,1); + await s.session.apply();assert.equal(s.calls.filter(call=>call[0]==='apply').length,1); s.session.dispose(); +}); +test('pair roles filter incompatible nodes and do not silently choose the sole destination', async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{}, {positive:'',negative:'bad'}); + await s.session.discover();assert.deepEqual(s.session.state.hosts[0].targets.map(target=>target.id),['pair']); + s.session.selectHost('host');s.session.selectTarget('one');assert.equal(s.session.state.targetId,''); + s.session.selectTarget('pair');assert.equal(s.session.state.targetId,'pair');s.session.dispose(); +}); +test('late previews are ignored after target changes; aborted and disposed work cannot update state',async()=>{ + const {createSendSession}=await source;let resolve;const s=setup(createSendSession,{preview:()=>new Promise(done=>resolve=done)}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');const pending=s.session.preview(); + s.session.selectTarget('pair');resolve({ticket:'old'});await pending;assert.equal(s.session.state.preview,null); + s.session.selectTarget('one');const pending2=s.session.preview();s.session.dispose();const count=s.states.length;resolve({ticket:'old'});await pending2;assert.equal(s.states.length,count); +}); +test('unknown apply outcome never retries a ticket and requires a new preview',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{apply:async()=>{throw Error('timed out');}}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply(); + assert.equal(s.session.state.phase,'error');assert.match(s.session.state.message,/may have applied/i);assert.equal(s.session.state.preview,null); + await s.session.apply();assert.equal(s.session.state.phase,'error');await s.session.preview();assert.equal(s.session.state.phase,'ready');s.session.dispose(); +}); +test('only matching explicit acknowledgements count as success',async()=>{ + const {createSendSession}=await source; + for(const ack of [undefined,{targetId:'other',values:{positive:'new'}},{targetId:'one',values:{positive:'wrong'}}]){ + const s=setup(createSendSession,{apply:async()=>ack});await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply();assert.equal(s.session.state.phase,'error');s.session.dispose(); + } +}); +test('discovery, empty results and stale preview errors remain actionable',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{discover:async()=>[]});await s.session.discover();assert.match(s.session.state.message,/No compatible/i);s.session.dispose(); + const failed=setup(createSendSession,{discover:async()=>{throw Error('unavailable');}});await failed.session.discover();assert.match(failed.session.state.message,/unavailable/);failed.session.dispose(); + const stale=setup(createSendSession,{preview:async()=>{throw Error('Workflow changed. Preview again.');}});await stale.session.discover();stale.session.selectHost('host');stale.session.selectTarget('one');await stale.session.preview();assert.match(stale.session.state.message,/Workflow changed/);stale.session.dispose(); +}); +test('rediscovery invalidates selections and old discovery cannot replace new results',async()=>{ + const {createSendSession}=await source;let resolve;let count=0;const s=setup(createSendSession,{discover:()=>++count===1?new Promise(done=>resolve=done):Promise.resolve(hosts)}); + const first=s.session.discover();await s.session.discover();resolve([]);await first;assert.equal(s.session.state.hosts.length,1); + s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.discover();assert.equal(s.session.state.hostId,'');assert.equal(s.session.state.preview,null);s.session.dispose(); +}); +test('pending apply explains closing cannot undo the sent update',async()=>{ + const {createSendSession}=await source;let done;const s=setup(createSendSession,{apply:()=>new Promise(resolve=>done=resolve)}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();const pending=s.session.apply(); + assert.match(s.session.state.message,/Closing this dialog does not undo/i);s.session.dispose();done({targetId:'one',values:{positive:'new'}});await pending; +}); +function fakeDOM() { + class Node extends EventTarget { + constructor(tag){super();this.tagName=tag;this.children=[];this.attributes={};this.dataset={};this.value='';this.textContent='';this.isConnected=true;this.open=false;} + append(...children){this.children.push(...children);} + add(option){this.append(option);} + replaceChildren(...children){this.children=children;} + setAttribute(key,value){this.attributes[key]=value;} + showModal(){this.open=true;} + close(){this.open=false;this.dispatchEvent(new Event('close'));} + remove(){this.isConnected=false;} + focus(){this.focused=true;} + } + const previous={document:global.document,window:global.window,Option:global.Option}; + const body=new Node('body'); + global.document={body,createElement:tag=>new Node(tag),createElementNS:(namespace,tag)=>new Node(tag)}; + global.Option=class extends Node {constructor(text,value){super('option');this.textContent=text;this.value=value;}}; + global.window={location:new URL('https://example.test/prefix/prompt_manager/workspace'),ApiClient:{resolveUrl:()=>'/prefix/prompt_manager/'}}; + const find=(root,predicate)=>predicate(root)?root:root.children.map(child=>find(child,predicate)).find(Boolean); + return {body,Node,find,restore(){Object.assign(global,previous);}}; +} +test('native sender dialog uses prefixed namespace, full safe text, explicit choices and owned cleanup',async()=>{ + const {createPromptSender,createSendButton}=await source; + const {createScope}=await import('../../web/js/shared/toolkit/core.js'); + const dom=fakeDOM();const scope=createScope();const trigger=new dom.Node('button');let options,disposed=0; + const client={discover:async()=>hosts,preview:async()=>({ticket:'t',target:{id:'one'},fields:[{role:'positive',before:'',after:'new'}],composition:{prepend:'prefix',append:'suffix',before:null,after:null,prependConnected:true}}),apply:async()=>({targetId:'one',values:{positive:'new'}}),dispose:()=>disposed++}; + try { + const button=createSendButton('Send positive prompt');assert.equal(button.attributes['aria-label'],'Send positive prompt');assert.equal(button.children[0].attributes['aria-hidden'],'true'); + const sender=createPromptSender({scope,clientFactory:value=>{options=value;return client;}});sender.open({positive:'new'},trigger);await tick(); + assert.deepEqual(options,{namespace:'/prefix/',origin:'https://example.test'}); + const dialog=dom.body.children.at(-1);assert.equal(dialog.open,true);assert.equal(dialog.attributes['aria-label'],'Send to ComfyUI'); + const host=dom.find(dialog,node=>node.id==='prompt-sender-host');const target=dom.find(dialog,node=>node.id==='prompt-sender-target'); + assert.equal(host.value,'');assert.equal(target.value,'');host.value='host';host.dispatchEvent(new Event('change'));target.value='one';target.dispatchEvent(new Event('change')); + dom.find(dialog,node=>node.textContent==='Preview changes').dispatchEvent(new Event('click'));await tick(); + assert.ok(dom.find(dialog,node=>node.tagName==='code' && node.textContent==='(empty)'));assert.ok(dom.find(dialog,node=>node.tagName==='code' && node.textContent==='new')); + const apply=dom.find(dialog,node=>node.textContent==='Apply to ComfyUI');assert.equal(apply.className,'ca-primary');assert.equal(apply.disabled,false);apply.dispatchEvent(new Event('click'));await tick(); + assert.ok(dom.find(dialog,node=>node.textContent==='Sent to ComfyUI.'));scope.dispose();assert.equal(dialog.isConnected,false);assert.equal(trigger.focused,true);assert.equal(disposed,1); + sender.open({positive:'new'},trigger);assert.equal(dom.body.children.length,1); + } finally {scope.dispose();dom.restore();} +}); +test('unsupported client or deployment errors are visible and close stays available',async()=>{ + const {createPromptSender}=await source;const {createScope}=await import('../../web/js/shared/toolkit/core.js');const dom=fakeDOM(); + try { + for(const baseUrl of ['https://other.test/prompt_manager/','/prefix/not-prompt-manager/','/prefix/prompt_manager/']) { + const scope=createScope();const sender=createPromptSender({scope,baseUrl,clientFactory:()=>{throw Error('BroadcastChannel unavailable');}}); + sender.open({positive:'new'});const dialog=dom.body.children.at(-1);const alert=dom.find(dialog,node=>node.attributes.role==='alert');assert.match(alert.textContent,/unavailable|Invalid/); + dom.find(dialog,node=>node.textContent==='Close').dispatchEvent(new Event('click'));assert.equal(dialog.isConnected,false);scope.dispose(); + } + } finally {dom.restore();} +}); +test('approval requires an exact destination and complete unambiguous matching preview',async()=>{ + const {createSendSession}=await source; + const valid={ticket:'ticket',target:{id:'one'},fields:[{role:'positive',before:'old',after:'new'}]}; + for(const preview of [null,{}, {...valid,ticket:''},{...valid,target:{id:'other'}},{...valid,fields:[]},{...valid,fields:new Array(1)},{...valid,fields:[null]},{...valid,fields:[...valid.fields,...valid.fields]},{...valid,fields:[{role:'negative',before:'old',after:'new'}]},{...valid,fields:[{role:'positive',before:null,after:'new'}]},{...valid,fields:[{role:'positive',before:'old',after:'unexpected'}]}]) { + const s=setup(createSendSession,{preview:async()=>preview});await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview(); + assert.equal(s.session.state.phase,'error');assert.equal(s.session.state.preview,null);await s.session.apply();assert.equal(s.calls.filter(call=>call[0]==='apply').length,0);s.session.dispose(); + } +}); +test('acknowledgement cannot claim an extra role beyond approved changes',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{apply:async()=>({targetId:'one',values:{positive:'new',negative:'also changed'}})}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply();assert.equal(s.session.state.phase,'error');assert.match(s.session.state.message,/unexpected acknowledgement/);s.session.dispose(); +}); diff --git a/tests/test_api_prompt_inspector.py b/tests/test_api_prompt_inspector.py new file mode 100644 index 0000000..9932197 --- /dev/null +++ b/tests/test_api_prompt_inspector.py @@ -0,0 +1,643 @@ +"""Physical-file prompt inspection is bounded, conservative and read-only.""" + +import json +from unittest.mock import patch + +from PIL import Image, PngImagePlugin + +try: + from test_api_images import ImageAPITestCase, make_png +except ImportError: + from tests.test_api_images import ImageAPITestCase, make_png + +from utils.pair_execution import EXECUTION_KEY, record_pair_execution +from database.pair_ingestion import ingest_resolved_pair +from utils.prompt_pair_resolver import resolve_prompt_pair + + +def graph(positive="portrait", negative="blurry"): + return { + "1": {"class_type": "CLIPTextEncode", "inputs": {"text": positive}}, + "2": {"class_type": "CLIPTextEncode", "inputs": {"text": negative}}, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["2", 0]}, + }, + } + + +def png(path, **metadata): + info = PngImagePlugin.PngInfo() + for key, value in metadata.items(): + info.add_text(key, value if isinstance(value, str) else json.dumps(value)) + path.parent.mkdir(parents=True, exist_ok=True) + with Image.new("RGB", (4, 4)) as image: + image.save(path, pnginfo=info) + return path + + +class TestPromptInspector(ImageAPITestCase): + async def inspect(self, path="image.png", root="0"): + params = {} if root is None else {"root": root} + response = await self.client.get( + f"/prompt_manager/images/inspect/{path}", params=params + ) + return response, await response.json() + + def side(self, text, source="graph-inferred"): + return {"status": "resolved", "text": text, "source": source} + + async def test_unindexed_graph_pair_is_read_without_indexing_or_decoding(self): + path = png(self.output_dir / "image.png", prompt=graph(negative="")) + before = path.read_bytes() + with self.api.db.model.get_connection() as connection: + rows = connection.execute("SELECT total_changes()").fetchone()[0] + with patch.object(Image.Image, "load", side_effect=AssertionError("decode")): + response, result = await self.inspect() + self.assertEqual(response.status, 200) + self.assertEqual( + result["image"], + {"root_index": 0, "path": "image.png", "filename": "image.png"}, + ) + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"], self.side("")) + self.assertEqual(path.read_bytes(), before) + with self.api.db.model.get_connection() as connection: + self.assertEqual( + connection.execute("SELECT total_changes()").fetchone()[0], rows + ) + self.assertEqual( + connection.execute("SELECT COUNT(*) FROM prompts").fetchone()[0], 0 + ) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + + async def test_root_identity_collisions_are_not_filename_fallbacks(self): + other = self.comfy_dir / "input" + other.mkdir() + first = png(self.output_dir / "image.png", prompt=graph("output")) + png(other / "image.png", prompt=graph("input")) + self._link_image(first, "Saved output") + self.api._get_all_output_dirs = lambda: [self.output_dir, other] + _, result = await self.inspect(root="1") + self.assertEqual(result["image"]["root_index"], 1) + self.assertEqual(result["prompts"]["positive"]["text"], "input") + make_png(other / "plain.png") + _, result = await self.inspect("plain.png", root="1") + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + + async def test_requires_valid_root_safe_relative_path_existing_media(self): + make_png(self.output_dir / "image.png") + for root in (None, "-1", "1", "x", "0.0"): + response, result = await self.inspect(root=root) + self.assertEqual(response.status, 400, root) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + for path in ( + "%2Fetc%2Fpasswd.png", + "..%2Fsecret.png", + "%5Csecret.png", + "bad.txt", + "null%00.png", + "C:%5Csecret.png", + ): + response, result = await self.inspect(path) + self.assertEqual(response.status, 403, path) + response, result = await self.inspect("missing.png") + self.assertEqual(response.status, 404) + outside = png(self.comfy_dir / "outside.png", prompt=graph("private")) + self._make_symlink(outside, self.output_dir / "escape.png") + response, result = await self.inspect("escape.png") + self.assertEqual(response.status, 403) + self.assertNotIn("private", json.dumps(result)) + + async def test_missing_negative_is_distinct_from_explicit_empty(self): + source = graph() + del source["3"]["inputs"]["negative"] + png(self.output_dir / "image.png", prompt=source) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"]["status"], "absent") + self.assertIsNone(result["prompts"]["negative"]["text"]) + + async def test_graph_ambiguity_and_unknown_semantics_do_not_use_saved_fallback( + self, + ): + path = self.output_dir / "image.png" + self._link_image(png(path), "Legacy saved") + for expected in ("ambiguous", "unresolved"): + source = graph() + if expected == "ambiguous": + source["4"] = source["3"] + else: + source["1"]["class_type"] = "UnknownEncoder" + png( + path, + prompt=source, + parameters=( + "Fallback\nNegative prompt: noise\n" "Steps: 20, Sampler: Euler" + ), + ) + _, result = await self.inspect() + for side in result["prompts"].values(): + self.assertEqual(side["status"], expected) + self.assertIsNone(side["text"]) + + async def test_parameters_and_partial_resolution_are_conservative(self): + path = self.output_dir / "image.png" + png(path, parameters="A mountain\nNegative prompt: \nSteps: 20, Sampler: Euler") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + self.side("A mountain", "embedded-parameters"), + ) + self.assertEqual( + result["prompts"]["negative"], self.side("", "embedded-parameters") + ) + source = graph() + source["2"]["class_type"] = "UnknownEncoder" + png(path, prompt=source) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"]["status"], "unresolved") + + async def test_execution_evidence_wins_over_graph_and_saved_recipe(self): + source = { + "1": { + "class_type": "PromptManagerPair", + "inputs": {"text": "portrait", "negative_text": "blurry"}, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["1", 1]}, + }, + } + evidence = {} + record_pair_execution( + evidence, + "1", + text="portrait", + negative_text="blurry", + positive_text="portrait LoRA trigger", + negative_effective_text="blurry", + ) + path = png(self.output_dir / "image.png", prompt=source, **evidence) + self._link_image(path, "Saved recipe") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + self.side("portrait LoRA trigger", "execution"), + ) + self.assertEqual( + result["prompts"]["negative"], self.side("blurry", "execution") + ) + png(path, prompt=source, **{EXECUTION_KEY: "broken"}) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + + async def test_saved_associations_remain_unverified_without_file_evidence(self): + path = make_png(self.output_dir / "image.png") + self._link_image(path, "Saved positive") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + { + "status": "unresolved", + "text": None, + "source": "saved-association", + "message": ( + "A saved library association exists, but it cannot be " + "verified against this file." + ), + }, + ) + self.assertEqual(result["prompts"]["negative"]["status"], "absent") + other = make_png(self.output_dir / "paired.png") + metadata = {"prompt": graph("Effective positive", "Recorded negative")} + resolution = resolve_prompt_pair(metadata) + ingest_resolved_pair(self.api.db, str(other), metadata, resolution) + _, result = await self.inspect("paired.png") + self.assertEqual( + result["prompts"]["positive"], + { + "status": "unresolved", + "text": None, + "source": "saved-association", + "message": ( + "A saved library association exists, but it cannot be " + "verified against this file." + ), + }, + ) + self.assertEqual( + result["prompts"]["negative"], + { + "status": "unresolved", + "text": None, + "source": "saved-association", + "message": ( + "A saved library association exists, but it cannot be " + "verified against this file." + ), + }, + ) + + async def test_corrupt_malformed_and_no_metadata_do_not_invent_text(self): + path = self.output_dir / "image.png" + for content, expected in ( + (b"broken", "unresolved"), + (None, "absent"), + ("bad-json", "unresolved"), + ): + if isinstance(content, bytes): + path.write_bytes(content) + else: + png(path, **({"prompt": content} if content else {})) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], expected) + self.assertIsNone(result["prompts"]["positive"]["text"]) + + async def test_compressed_international_and_post_pixel_metadata(self): + import struct + import zlib + + path = self.output_dir / "image.png" + for kind in ( + "compressed", + "international", + "compressed-international", + "post-idat", + ): + info = PngImagePlugin.PngInfo() + value = json.dumps(graph("猫"), ensure_ascii=False) + if kind == "compressed": + info.add_text("prompt", json.dumps(graph()), zip=True) + elif kind in ("international", "compressed-international"): + info.add_itxt( + "prompt", + value, + lang="en", + tkey="Prompt", + zip=kind.startswith("compressed"), + ) + else: + payload = b"prompt\0" + json.dumps(graph()).encode() + info.add_text("unrelated", "header text") + with Image.new("RGB", (4, 4)) as image: + image.save(path, pnginfo=info) + if kind == "post-idat": + content = path.read_bytes() + chunk = ( + struct.pack(">I", len(payload)) + + b"tEXt" + + payload + + struct.pack(">I", zlib.crc32(b"tEXt" + payload)) + ) + path.write_bytes(content[:-12] + chunk + content[-12:]) + with patch.object( + Image.Image, "load", side_effect=AssertionError("pixels") + ): + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"]["text"], + "猫" if "international" in kind else "portrait", + ) + + async def test_corrupt_truncated_duplicate_and_expanding_metadata_fail_closed(self): + import struct + import zlib + from utils.prompt_inspector import MAX_METADATA_BYTES + + path = self.output_dir / "image.png" + base = png(path, prompt=graph()).read_bytes() + cases = [base[:-1], base[:30]] + index = base.index(b"tEXt") + broken = bytearray(base) + broken[index + 8] ^= 1 + cases.append(bytes(broken)) + for kind, payload in ( + (b"tEXt", b"prompt\0{}"), + (b"zTXt", b"prompt\0\0" + zlib.compress(b"x" * (MAX_METADATA_BYTES + 1))), + (b"tEXt", b"prompt\0" + b"x" * (MAX_METADATA_BYTES + 1)), + (b"tEXt", b"bad-key-without-separator"), + (b"zTXt", b"prompt\0\1bad-compression"), + (b"iTXt", b"prompt\0\2\0\0\0text"), + (b"iTXt", b"prompt\0\1\1\0\0text"), + (b"iTXt", b"prompt\0\0\0\0\0\xff"), + ): + chunk = ( + struct.pack(">I", len(payload)) + + kind + + payload + + struct.pack(">I", zlib.crc32(kind + payload)) + ) + cases.append(base[:-12] + chunk + base[-12:]) + for index, content in enumerate(cases): + path.write_bytes(content) + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"]["status"], "unresolved", index + ) + self.assertIsNone(result["prompts"]["positive"]["text"]) + + async def test_jpeg_header_only_no_metadata_and_read_failure_are_safe(self): + path = self.output_dir / "image.jpg" + with Image.new("RGB", (4, 4)) as image: + image.save(path) + with patch.object(Image.Image, "load", side_effect=AssertionError("pixels")): + response, result = await self.inspect("image.jpg") + self.assertEqual(response.status, 200) + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + with patch( + "py.api.images.read_inspection_metadata", + side_effect=RuntimeError(str(self.comfy_dir)), + ): + response, result = await self.inspect("image.jpg") + self.assertEqual(response.status, 500) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + + async def test_invalid_json_depth_and_saved_filename_collision_do_not_escape(self): + path = png(self.output_dir / "image.png", prompt="[" * 2000) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self._link_image(path, "Saved first") + other = self.comfy_dir / "input" + other.mkdir() + make_png(other / "image.png") + self.api._get_all_output_dirs = lambda: [self.output_dir, other] + with patch.object( + self.api.db, + "get_image_prompt_info", + wraps=self.api.db.get_image_prompt_info, + ) as lookup: + _, result = await self.inspect(root="1") + lookup.assert_called_once_with(str(other / "image.png"), False) + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + + async def test_video_inspection_uses_bounded_container_evidence(self): + import io + from unittest.mock import MagicMock + from utils.prompt_inspector import MAX_METADATA_BYTES + + (self.output_dir / "clip.mp4").write_bytes(b"video fixture") + metadata = {"prompt": graph("Video portrait", "")} + payload = json.dumps( + {"format": {"tags": {"comment": json.dumps(metadata)}}} + ).encode() + process = MagicMock() + process.stdout = io.BytesIO(payload) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch( + "utils.prompt_inspector.subprocess.Popen", return_value=process + ) as spawn, + ): + response, result = await self.inspect("clip.mp4") + self.assertEqual(response.status, 200) + self.assertEqual(result["prompts"]["positive"], self.side("Video portrait")) + self.assertEqual(result["prompts"]["negative"], self.side("")) + self.assertTrue(process.stdout.closed) + process.wait.assert_called() + self.assertNotIn("shell", spawn.call_args.kwargs) + self.assertIn(str(self.output_dir / "clip.mp4"), spawn.call_args.args[0]) + process.stdout = io.BytesIO(b"x" * (MAX_METADATA_BYTES + 1)) + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self.assertTrue(process.stdout.closed) + + async def test_video_missing_probe_and_timeout_preserve_uncertainty(self): + import io + from unittest.mock import MagicMock + + (self.output_dir / "clip.webm").write_bytes(b"fixture") + with patch("utils.prompt_inspector.ffprobe_path", return_value=None): + _, result = await self.inspect("clip.webm") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + process = MagicMock() + process.stdout = io.BytesIO(b"") + process.poll.return_value = None + process.returncode = -9 + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.webm") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + process.kill.assert_called_once() + process.wait.assert_called() + self.assertTrue(process.stdout.closed) + + async def test_video_description_execution_evidence_and_invalid_envelope(self): + import io + from unittest.mock import MagicMock + + path = self.output_dir / "clip.mp4" + path.write_bytes(b"fixture") + source = { + "1": { + "class_type": "PromptManagerPair", + "inputs": {"text": "portrait", "negative_text": "bad"}, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["1", 1]}, + }, + } + evidence = {} + record_pair_execution( + evidence, + "1", + text="portrait", + negative_text="bad", + positive_text="portrait trigger", + negative_effective_text="bad", + ) + for value in ( + { + "format": { + "tags": { + "comment": "not-json", + "description": json.dumps({"prompt": source, **evidence}), + } + } + }, + [], + {"format": {"tags": []}}, + {"format": {"tags": {}}}, + { + "format": { + "tags": { + "comment": json.dumps( + {"prompt": source, EXECUTION_KEY: "bad-json"} + ) + } + } + }, + ): + process = MagicMock() + process.stdout = io.BytesIO(json.dumps(value).encode()) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch( + "utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe" + ), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + positive = result["prompts"]["positive"] + if ( + isinstance(value, list) + or not isinstance(value["format"]["tags"], dict) + or "bad-json" in json.dumps(value) + ): + self.assertEqual(positive["status"], "unresolved") + elif not value["format"]["tags"]: + self.assertEqual(positive["status"], "absent") + else: + self.assertEqual(positive, self.side("portrait trigger", "execution")) + + async def test_large_sparse_pixels_are_skipped_and_chunk_count_is_bounded(self): + import struct + import zlib + from utils.prompt_inspector import read_inspection_metadata, MetadataReadError + + path = self.output_dir / "large.png" + header = struct.pack(">IIBBBBB", 1024, 1024, 8, 2, 0, 0, 0) + + def chunk(kind, data): + return ( + struct.pack(">I", len(data)) + + kind + + data + + struct.pack(">I", zlib.crc32(kind + data)) + ) + + with path.open("wb") as stream: + stream.write(b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", header)) + stream.write(struct.pack(">I4s", 64 * 1024 * 1024, b"IDAT")) + stream.seek(64 * 1024 * 1024, 1) + stream.write(b"\0\0\0\0") + stream.write(chunk(b"tEXt", b"prompt\0" + json.dumps(graph()).encode())) + stream.write(chunk(b"IEND", b"")) + original_open = type(path).open + reads = [] + + def tracked_open(item, *args, **kwargs): + stream = original_open(item, *args, **kwargs) + original_read = stream.read + + def read(size=-1): + value = original_read(size) + reads.append(len(value)) + return value + + stream.read = read + return stream + + with patch.object(type(path), "open", tracked_open): + metadata = read_inspection_metadata(path) + self.assertEqual(json.loads(metadata["prompt"]), graph()) + self.assertLess(sum(reads), 4096) + with patch("utils.prompt_inspector.MAX_PNG_CHUNKS", 1): + with self.assertRaises(MetadataReadError): + read_inspection_metadata(path) + + async def test_large_jpeg_uses_bounded_header_without_rejecting_valid_file(self): + from utils.prompt_inspector import MAX_HEADER_BYTES + + path = self.output_dir / "large.jpg" + with Image.new("RGB", (4, 4)) as image: + image.save(path) + with path.open("ab") as stream: + stream.write(b"x" * (MAX_HEADER_BYTES + 1)) + self._link_image(path, "Saved large JPEG") + with patch.object(Image.Image, "load", side_effect=AssertionError("pixels")): + _, result = await self.inspect("large.jpg") + self.assertEqual( + result["prompts"]["positive"], + { + "status": "unresolved", + "text": None, + "source": "saved-association", + "message": ( + "A saved library association exists, but it cannot be " + "verified against this file." + ), + }, + ) + + async def test_invalid_or_execution_only_video_evidence_never_uses_saved_fallback( + self, + ): + import io + from unittest.mock import MagicMock + + path = self.output_dir / "clip.mp4" + path.write_bytes(b"fixture") + self._link_image(path, "Saved recipe must not replace unknown evidence") + for envelope in ( + {"prompt": None}, + {"parameters": None}, + {EXECUTION_KEY: {"version": 1, "nodes": {}}}, + ): + process = MagicMock() + process.stdout = io.BytesIO( + json.dumps( + { + "format": { + "tags": { + "comment": json.dumps(envelope), + "description": json.dumps( + {"prompt": graph("Other comment")} + ), + } + } + } + ).encode() + ) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch( + "utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe" + ), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self.assertIsNone(result["prompts"]["positive"]["text"]) + + async def test_same_path_same_size_replacement_does_not_resolve_stale_saved_prompts( + self, + ): + import io + + metadata = {"prompt": graph("Original portrait", "Original negative")} + path = png(self.output_dir / "image.png", **metadata) + ingest_resolved_pair( + self.api.db, str(path), metadata, resolve_prompt_pair(metadata) + ) + _, original = await self.inspect() + self.assertEqual( + original["prompts"]["positive"], self.side("Original portrait") + ) + size = path.stat().st_size + replacement = io.BytesIO() + with Image.new("RGB", (4, 4), (0, 0, 255)) as image: + image.save(replacement, "PNG") + content = replacement.getvalue() + self.assertLessEqual(len(content), size) + path.write_bytes(content.ljust(size, b"\0")) + self.assertEqual(path.stat().st_size, size) + _, replaced = await self.inspect() + for record in replaced["prompts"].values(): + self.assertEqual(record["status"], "unresolved") + self.assertIsNone(record["text"]) + self.assertEqual(record["source"], "saved-association") + self.assertIn("cannot be verified", record["message"]) + self.assertNotIn("Original portrait", json.dumps(replaced)) diff --git a/tools/vendor/frontend-coverage-baseline.json b/tools/vendor/frontend-coverage-baseline.json index 7c7a753..ba3c41b 100644 --- a/tools/vendor/frontend-coverage-baseline.json +++ b/tools/vendor/frontend-coverage-baseline.json @@ -190,5 +190,17 @@ "branches": 93, "functions": 98, "statements": 98 + }, + "workspace/prompt-inspector.mjs": { + "lines": 97, + "branches": 92, + "functions": 98, + "statements": 97 + }, + "workspace/prompt-sender.mjs": { + "lines": 98, + "branches": 89, + "functions": 98, + "statements": 98 } } diff --git a/utils/prompt_inspector.py b/utils/prompt_inspector.py new file mode 100644 index 0000000..03d6c10 --- /dev/null +++ b/utils/prompt_inspector.py @@ -0,0 +1,267 @@ +"""Read prompt evidence without inference, indexing, or decoding image pixels.""" + +import io +import json +import struct +import subprocess # nosec B404 +import threading +import zlib +from pathlib import Path +from typing import Any + +from PIL import Image + +from .pair_execution import EXECUTION_KEY +from .prompt_pair_resolver import resolve_prompt_pair +from .video_metadata import ffprobe_path, is_video_path, metadata_from_tags + +MAX_METADATA_BYTES = 2 * 1024 * 1024 +MAX_HEADER_BYTES = 8 * 1024 * 1024 +MAX_PNG_CHUNKS = 10_000 +_METADATA_KEYS = frozenset({"prompt", "parameters", EXECUTION_KEY}) +_SIGNATURE = b"\x89PNG\r\n\x1a\n" + + +class MetadataReadError(ValueError): + """Prompt evidence is unreadable, incomplete, or exceeds inspection limits.""" + + +def _inflate(data: bytes) -> bytes: + inflater = zlib.decompressobj() + result = inflater.decompress(data, MAX_METADATA_BYTES + 1) + if len(result) > MAX_METADATA_BYTES or not inflater.eof or inflater.unused_data: + raise MetadataReadError("Compressed metadata is invalid or exceeds limits") + return result + + +def _png_text(kind: bytes, data: bytes) -> tuple[str, str]: + keyword, separator, body = data.partition(b"\0") + if not separator or not 1 <= len(keyword) <= 79: + raise MetadataReadError("Malformed PNG text metadata") + key = keyword.decode("latin-1") + encoding = "latin-1" + if kind == b"zTXt": + if not body or body[0] != 0: + raise MetadataReadError("Unsupported PNG text compression") + body = _inflate(body[1:]) + elif kind == b"iTXt": + if len(body) < 2 or body[0] not in (0, 1): + raise MetadataReadError("Malformed international PNG metadata") + flag, method = body[:2] + fields = body[2:].split(b"\0", 2) + if len(fields) != 3 or (flag and method != 0): + raise MetadataReadError("Malformed international PNG metadata") + fields[0].decode("ascii") + fields[1].decode("utf-8") + body = _inflate(fields[2]) if flag else fields[2] + encoding = "utf-8" + if b"\0" in body: + raise MetadataReadError("Malformed PNG text metadata") + return key, body.decode(encoding) + + +def _png_metadata(stream: Any, size: int) -> dict: + """CRC-check text and structural chunks, seeking past compressed pixels. + + PNG text chunks may follow IDAT. Pillow's ``.text`` loads pixels to find + them; this bounded reader instead follows the W3C PNG chunk layout. + IDAT checksums/pixel validity are deliberately outside metadata inspection. + """ + found, compressed_size, expanded_size = {}, 0, 0 + saw_header = saw_pixels = False + for index in range(MAX_PNG_CHUNKS): + header = stream.read(8) + if len(header) != 8: + raise MetadataReadError("Incomplete PNG metadata") + length, kind = struct.unpack(">I4s", header) + if length > 0x7FFFFFFF or stream.tell() + length + 4 > size: + raise MetadataReadError("Incomplete PNG chunk") + if index == 0 and (kind != b"IHDR" or length != 13): + raise MetadataReadError("Missing PNG header") + if kind in (b"tEXt", b"zTXt", b"iTXt", b"IHDR", b"IEND"): + compressed_size += length + if compressed_size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + data, checksum = stream.read(length), stream.read(4) + if zlib.crc32(kind + data) != int.from_bytes(checksum, "big"): + raise MetadataReadError("PNG metadata checksum mismatch") + if kind == b"IHDR": + if saw_header or not all(struct.unpack(">II", data[:8])): + raise MetadataReadError("Malformed PNG header") + saw_header = True + elif kind == b"IEND": + if length or not saw_pixels: + raise MetadataReadError("Incomplete PNG image") + return found + else: + key, value = _png_text(kind, data) + expanded_size += len(value.encode("utf-8")) + if expanded_size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + if key in _METADATA_KEYS: + if key in found: + raise MetadataReadError("Duplicate prompt metadata") + found[key] = value + else: + saw_pixels |= kind == b"IDAT" + stream.seek(length + 4, 1) + raise MetadataReadError("PNG chunk count exceeds inspection limits") + + +def _video_metadata(path: Path) -> dict: + probe = ffprobe_path() + if not probe: + raise MetadataReadError("Video metadata reader is unavailable") + command = [ + probe, + "-v", + "quiet", + "-show_entries", + "format_tags=comment,description", + "-of", + "json", + str(path), + ] + process = subprocess.Popen( # nosec B603 + command, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0), + ) + + def stop() -> None: + if process.poll() is None: + try: + process.kill() + except OSError: + # Timeout and final cleanup can race with the process exiting. + pass + + timer = threading.Timer(3, stop) + timer.daemon = True + timer.start() + try: + raw = process.stdout.read(MAX_METADATA_BYTES + 1) + if len(raw) > MAX_METADATA_BYTES: + raise MetadataReadError("Video metadata exceeds inspection limits") + process.wait() + if process.returncode: + raise MetadataReadError("Video metadata could not be read") + finally: + timer.cancel() + stop() + process.wait() + process.stdout.close() + probed = json.loads(raw) + if not isinstance(probed, dict) or not isinstance(probed.get("format"), dict): + raise MetadataReadError("Malformed video metadata") + tags = probed["format"].get("tags", {}) + if not isinstance(tags, dict): + raise MetadataReadError("Malformed video metadata") + # The scan normalizer drops null fields and unknown keys. Inspection must + # retain explicit prompt/execution markers so malformed evidence cannot + # silently fall back to an unrelated saved recipe or another comment. + for key in ("comment", "description"): + raw = tags.get(key) + if not isinstance(raw, str): + continue + try: + envelope = json.loads(raw) + except ValueError: + continue + if not isinstance(envelope, dict) or not _METADATA_KEYS.intersection(envelope): + continue + metadata = metadata_from_tags({key: raw}) + for field in _METADATA_KEYS.intersection(envelope): + value = envelope[field] + metadata[field] = ( + value if value is None or isinstance(value, str) else json.dumps(value) + ) + return metadata + return {} + + +def read_inspection_metadata(path: Path) -> dict: + """Return bounded, header-only metadata or raise a response-safe error.""" + try: + if is_video_path(path): + metadata = _video_metadata(path) + else: + with path.open("rb") as stream: + signature = stream.read(8) + if signature == _SIGNATURE: + return _png_metadata(stream, path.stat().st_size) + stream.seek(0) + header = stream.read(MAX_HEADER_BYTES) + with Image.open(io.BytesIO(header)) as image: + metadata = dict(image.info) + result, size = {}, 0 + for key in _METADATA_KEYS: + if key not in metadata: + continue + value = metadata[key] + if not isinstance(value, str): + raise MetadataReadError("Malformed prompt metadata") + size += len(value.encode("utf-8")) + if size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + result[key] = value + return result + except MetadataReadError: + raise + except ( + OSError, + ValueError, + EOFError, + SyntaxError, + RecursionError, + struct.error, + zlib.error, + ): + raise MetadataReadError("Media metadata could not be read") from None + + +def _side(status: str, text: str | None = None, source: str | None = None) -> dict: + return {"status": status, "text": text, "source": source} + + +def inspect_prompt_roles(metadata: dict, saved: dict | None = None) -> dict: + """Keep uncertainty visible; a saved association never replaces file evidence.""" + if not metadata: + result = {role: _side("absent") for role in ("positive", "negative")} + if saved: + context = saved.get("pair_context") + paired = isinstance(saved.get("pair"), dict) or isinstance(context, dict) + for role in ("positive", "negative") if paired else ("positive",): + result[role] = { + **_side("unresolved", source="saved-association"), + "message": ( + "A saved library association exists, but it cannot be " + "verified against this file." + ), + } + return result + canonical = dict(metadata) + if "prompt" not in canonical and "parameters" not in canonical: + return {role: _side("unresolved") for role in ("positive", "negative")} + if isinstance(canonical.get("prompt"), str): + try: + canonical["prompt"] = json.loads(canonical["prompt"]) + except (ValueError, RecursionError): + return {role: _side("unresolved") for role in ("positive", "negative")} + resolution = resolve_prompt_pair(canonical) + state = resolution["state"] + result = {} + for role in ("positive", "negative"): + side = resolution[role] + if ( + state != "ambiguous" + and isinstance(side, dict) + and (role == "negative" or side["text"].strip()) + ): + result[role] = _side( + "resolved", side["text"], side["provenance"]["text_source"] + ) + else: + result[role] = _side(state if state != "resolved" else "unresolved") + return result diff --git a/web/js/workspace/images.css b/web/js/workspace/images.css index 4881459..cf225b7 100644 --- a/web/js/workspace/images.css +++ b/web/js/workspace/images.css @@ -57,3 +57,46 @@ main.images-main { max-inline-size: none; padding: 28px; } } .image-continuation button[aria-disabled="true"] { opacity: .55; cursor: wait; } .options-status { font-size: 12px; padding-inline: 4px; } + +.prompt-inspector { margin-block-start: 22px; min-inline-size: 0; } +.prompt-block { border: 1px solid var(--ca-line); border-inline-start: 3px solid var(--prompt-role); border-radius: 7px; padding: 14px; margin-block-end: 14px; min-inline-size: 0; } +.prompt-positive { --prompt-role: #6bd6a4; } +[data-ca-theme="light"] .prompt-positive { --prompt-role: #14784f; } +.prompt-negative { --prompt-role: #ff7f7f; } +[data-ca-theme="light"] .prompt-negative { --prompt-role: #b51d2d; } +.prompt-block h3 { font-size: 12px; margin: 0 0 8px; color: var(--prompt-role); } +.prompt-source, .prompt-empty, .prompt-block > .muted { font-size: 11px; } +.prompt-text { font: inherit; font-size: 12px; line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; margin-block: 12px; } +.prompt-text:focus-visible { outline: 2px solid var(--ca-focus); outline-offset: 3px; } +.prompt-actions { display: flex; flex-wrap: wrap; gap: 8px; } +.prompt-actions button { font-size: 11px; } +.prompt-copy-status { font-size: 11px; margin-block-end: 0; } +.prompt-copy-status:empty { display: none; } +.image-preview-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(270px, 340px); } +.image-preview-details { padding: 0 18px 18px; max-block-size: 75dvh; overflow: auto; min-inline-size: 0; } +.image-preview-details .prompt-inspector { margin-block-start: 0; } +.image-preview > header { border-block-end: 1px solid var(--ca-line); } +.prompt-send-button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; color: var(--ca-focus); } +.prompt-send-button svg { inline-size: 16px; block-size: 16px; flex-shrink: 0; } +.prompt-sender { background: var(--ca-surface); color: var(--ca-text); border: 1px solid var(--ca-line); border-radius: 12px; padding: 22px; inline-size: min(760px, calc(100% - 32px)); max-inline-size: none; max-block-size: calc(100dvh - 32px); overflow: auto; } +.prompt-sender::backdrop { background: #000b; } +.prompt-sender-header, .prompt-sender-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; } +.prompt-sender-header h2 { font-size: 20px; margin: 0; } +.prompt-sender-options { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-block: 20px; } +.prompt-sender-options .ca-field { display: flex; flex-direction: column; align-items: stretch; gap: 6px; } +.prompt-sender select { inline-size: 100%; min-block-size: 38px; } +.prompt-sender-status { font-size: 13px; line-height: 1.6; } +.prompt-sender-status[role="alert"] { color: var(--ca-error-text); } +.prompt-sender-preview { margin-block: 20px; min-inline-size: 0; } +.prompt-sender-field { border: 1px solid var(--ca-line); border-radius: 7px; padding: 14px; margin-block: 12px; min-inline-size: 0; } +.prompt-sender-field :where(pre, textarea), .prompt-sender-composition { white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; font-size: 12px; line-height: 1.65; max-inline-size: 100%; } +.prompt-sender-field textarea { inline-size: 100%; min-block-size: 100px; resize: vertical; } +.prompt-sender-composition { padding: 12px; background: var(--ca-field); border-radius: 6px; } +.prompt-sender-actions { justify-content: flex-end; margin-block-start: 18px; } +@media (max-width: 780px) { + .image-preview-body { grid-template-columns: minmax(0, 1fr); } + .image-preview-stage { block-size: 52dvh; } + .image-preview-details { max-block-size: none; } + .image-preview { max-block-size: calc(100dvh - 24px); overflow: auto; } + .prompt-sender-options { grid-template-columns: minmax(0, 1fr); } +} diff --git a/web/js/workspace/images.mjs b/web/js/workspace/images.mjs index bdf3d2e..1566cf8 100644 --- a/web/js/workspace/images.mjs +++ b/web/js/workspace/images.mjs @@ -1,6 +1,8 @@ import { createScope, createButton, createField, createSelect } from '../shared/toolkit/core.js'; import { createImageStream, imageKey } from './images-state.mjs'; import { layoutImages, visibleImages } from './image-layout.mjs'; +import { mountPromptInspector } from './prompt-inspector.mjs'; +import { createPromptSender } from './prompt-sender.mjs'; function el(tag, text, className) { const element = document.createElement(tag); @@ -19,6 +21,9 @@ export function mountImages(main, api, parentScope) { const scope = createScope(); parentScope.cleanup(() => scope.dispose()); const { resolveUrl } = window.ApiClient; + const sender = createPromptSender({scope}); + let detailInspector, previewInspector; + scope.cleanup(() => { detailInspector?.dispose(); previewInspector?.dispose(); }); const visit = lastVisit; let layout = visit?.layout || 'grid', selection = visit?.selection || null, frame = 0, loadFrame = 0, restoreFrame = 0, observer, viewer; let state, geometry = { positions: [], height: 0, maxHeight: 0 }, optionsRequest; @@ -107,11 +112,17 @@ export function mountImages(main, api, parentScope) { const close = createButton('Close preview'); dialogHeader.append(previewTitle, close); const stage = el('div', undefined, 'image-preview-stage'); - dialog.append(dialogHeader, stage); + const previewBody = el('div', undefined, 'image-preview-body'); + const previewDetails = el('aside', undefined, 'image-preview-details'); + previewDetails.setAttribute('aria-label', 'Preview prompt details'); + previewBody.append(stage, previewDetails); + dialog.append(dialogHeader, previewBody); main.append(dialog); scope.listen(close, 'click', () => dialog.close()); scope.listen(dialog, 'close', () => { destroyPreview(); scheduleLoad(); }); function destroyPreview() { + previewInspector?.dispose(); previewInspector = null; + previewDetails.replaceChildren(); viewer?.destroy(); viewer = null; for (const video of stage.querySelectorAll('video')) releaseVideo(video); stage.replaceChildren(); @@ -130,6 +141,7 @@ export function mountImages(main, api, parentScope) { video.pause(); video.removeAttribute('src'); video.load(); } function inspect(image) { + detailInspector?.dispose(); selection = imageKey(image); for (const video of details.querySelectorAll('video')) releaseVideo(video); const thumbnail = mediaElement(image); @@ -145,8 +157,10 @@ export function mountImages(main, api, parentScope) { preview.dataset.previewKey = selection; const download = el('a', 'Download original', 'workspace-link'); download.href = resolveUrl(image.url); download.download = image.filename; - const legacy = el('p', 'Open Current gallery for prompt details and tagging.', 'muted'); - details.replaceChildren(el('p', 'SELECTED IMAGE', 'eyebrow'), el('h2', image.filename), thumbnail, metadata, preview, download, legacy); + const prompts = el('div'); + const legacy = el('p', 'Open Current gallery for tagging.', 'muted'); + details.replaceChildren(el('p', 'SELECTED IMAGE', 'eyebrow'), el('h2', image.filename), thumbnail, preview, download, prompts, metadata, legacy); + detailInspector = mountPromptInspector(prompts, {api, image, sender, parentScope:scope}); for (const [key, card] of rendered) { card.classList.toggle('selected', key === selection); card.querySelector('.image-open').setAttribute('aria-pressed', String(key === selection)); @@ -161,6 +175,7 @@ export function mountImages(main, api, parentScope) { if (selection !== imageKey(image)) inspect(image); destroyPreview(); previewTitle.textContent = image.filename; + previewInspector = mountPromptInspector(previewDetails, {api, image, sender, parentScope:scope}); if (!dialog.open) dialog.showModal(); if (image.is_video) { const video = el('video'); video.controls = true; video.src = resolveUrl(image.url); video.preload = 'metadata'; @@ -272,9 +287,19 @@ export function mountImages(main, api, parentScope) { grid.style.height = `${geometry.height}px`; renderVisible(); } - const resize = new ResizeObserver(updateLayout); resize.observe(grid); + let resizeFrame = 0, observedWidth; + const resize = new ResizeObserver(entries => { + const width = entries[0].contentRect.width; + if (width === observedWidth) return; + observedWidth = width; + if (!resizeFrame) resizeFrame = requestAnimationFrame(() => { + resizeFrame = 0; + updateLayout(); + }); + }); + resize.observe(grid); scope.listen(window, 'scroll', scheduleVisible); - scope.cleanup(() => { resize.disconnect(); observer?.disconnect(); cancelAnimationFrame(frame); cancelAnimationFrame(loadFrame); }); + scope.cleanup(() => { resize.disconnect(); observer?.disconnect(); cancelAnimationFrame(resizeFrame); cancelAnimationFrame(frame); cancelAnimationFrame(loadFrame); }); function renderState(next) { const changed = state?.items !== next.items; if (changed) { @@ -315,6 +340,7 @@ export function mountImages(main, api, parentScope) { observer.observe(continuation); } function reset() { + detailInspector?.dispose(); detailInspector = null; selection = null; for (const video of details.querySelectorAll('video')) releaseVideo(video); details.replaceChildren(el('h2', 'Image details'), el('p', 'Select an image to inspect it.')); diff --git a/web/js/workspace/prompt-inspector.mjs b/web/js/workspace/prompt-inspector.mjs new file mode 100644 index 0000000..bcd9bc8 --- /dev/null +++ b/web/js/workspace/prompt-inspector.mjs @@ -0,0 +1,124 @@ +import { createScope, createButton } from '../shared/toolkit/core.js'; +import { createSendButton } from './prompt-sender.mjs'; + +export function inspectPath(image) { + return `/prompt_manager/images/inspect/${image.path.split('/').map(encodeURIComponent).join('/')}?root=${image.root_index}`; +} + +export function promptRoles(prompts) { + return Object.fromEntries(['positive', 'negative'].filter(role => prompts?.[role]?.status === 'resolved' && typeof prompts[role].text === 'string').map(role => [role, prompts[role].text])); +} + +export function createInspectionLoader(api, onChange) { + let request, disposed = false; + return { + async load(image) { + if (disposed) return; + request?.abort(); + const current = request = new AbortController(); + onChange({ loading: true }); + try { + const result = await api.get(inspectPath(image), {signal:current.signal}); + if (!disposed && request === current) onChange({prompts:result.prompts}); + } catch { + if (!disposed && request === current) onChange({error:true}); + } + }, + dispose() { disposed = true; request?.abort(); }, + }; +} + +const sources = { + execution: 'Recorded at execution', + 'graph-inferred': 'Inferred from the saved workflow', + 'embedded-parameters': 'Embedded generation parameters', + 'saved-association': 'Saved library association', +}; +const statuses = { + absent: 'Not recorded in this file.', + ambiguous: 'Multiple possible prompts. Source could not be determined.', + unresolved: 'Prompt could not be resolved.', +}; +function el(tag, text, className) { + const node = document.createElement(tag); + if (text !== undefined) node.textContent = text; + if (className) node.className = className; + return node; +} + +export function mountPromptInspector(container, {api, image, sender, parentScope}) { + const scope = createScope(); + const dispose = () => scope.dispose(); + parentScope.signal.addEventListener('abort', dispose, {once:true}); + scope.cleanup(() => parentScope.signal.removeEventListener('abort', dispose)); + container.classList.add('prompt-inspector'); + const loader = createInspectionLoader(api, render); + scope.cleanup(() => loader.dispose()); + scope.listen(container, 'click', async event => { + const send = event.target.closest('[data-send-role]'); + if (send) { + const role = send.dataset.sendRole; + sender.open(role === 'pair' ? roles : {[role]:roles[role]}, send); + } + const copy = event.target.closest('[data-copy-role]'); + if (copy) { + const role = copy.dataset.copyRole; + const status = copy.closest('section').querySelector('.prompt-copy-status'); + try { + await navigator.clipboard.writeText(roles[role]); + if (!scope.signal.aborted) status.textContent = 'Copied.'; + } catch { + if (!scope.signal.aborted) status.textContent = 'Copy unavailable. Select the prompt text to copy it.'; + } + } + if (event.target.closest('[data-retry-prompts]')) loader.load(image); + }); + let roles = {}; + function render(state) { + roles = {}; + container.replaceChildren(); + if (state.loading || state.error) { + const status = el('p', state.loading ? 'Loading prompts…' : 'Could not read prompts from this file.', 'muted'); + status.setAttribute('role', state.error ? 'alert' : 'status'); + container.append(status); + if (state.error) { + const retry = createButton('Retry prompt details'); + retry.dataset.retryPrompts = ''; + container.append(retry); + } + return; + } + roles = promptRoles(state.prompts); + for (const role of ['positive', 'negative']) { + const title = `${role[0].toUpperCase() + role.slice(1)} prompt`; + const record = state.prompts?.[role]; + const block = el('section', undefined, `prompt-block prompt-${role}`); + block.setAttribute('aria-label', title); + block.append(el('h3', title)); + if (Object.hasOwn(roles, role)) { + block.append(el('p', sources[record.source] || 'Source not recorded', 'prompt-source muted')); + if (roles[role] === '') block.append(el('p', `Empty ${role} prompt`, 'prompt-empty')); + else { + const text = el('pre', roles[role], 'prompt-text'); + text.tabIndex = 0; + block.append(text); + } + const actions = el('div', undefined, 'prompt-actions'); + const send = createSendButton(`Send ${role} prompt`); + send.dataset.sendRole = role; + const copy = createButton(`Copy ${role} prompt`); + copy.dataset.copyRole = role; + actions.append(send, copy); + const status = el('p', '', 'prompt-copy-status muted'); status.setAttribute('role', 'status'); + block.append(actions, status); + } else block.append(el('p', typeof record?.message === 'string' ? record.message : statuses[record?.status] || statuses.unresolved, 'muted')); + container.append(block); + } + if (Object.hasOwn(roles, 'positive') && Object.hasOwn(roles, 'negative')) { + const pair = createSendButton('Send prompt pair'); pair.dataset.sendRole = 'pair'; + container.append(pair); + } + } + loader.load(image); + return {dispose:() => scope.dispose()}; +} diff --git a/web/js/workspace/prompt-sender.mjs b/web/js/workspace/prompt-sender.mjs new file mode 100644 index 0000000..8d33a00 --- /dev/null +++ b/web/js/workspace/prompt-sender.mjs @@ -0,0 +1,155 @@ +import {createBridgeClient, validateRoles} from '../shared/toolkit/prompt-bridge.js'; +import {createButton, createField, createScope, createSelect} from '../shared/toolkit/core.js'; + +export function createSendSession({client, roles:rawRoles, onChange}) { + const roles = Object.freeze(validateRoles(rawRoles)); + let state = {phase:'idle',hosts:[],hostId:'',targetId:'',preview:null,message:''}; + let operation, generation = 0, disposed = false; + const emit = patch => { if (!disposed) { state = Object.freeze({...state,...patch}); onChange(state); } }; + function invalidate() { generation++; operation?.abort(); operation = null; } + function begin(phase) { invalidate(); operation = new AbortController(); emit({phase,preview:null,message:''}); return {signal:operation.signal,version:generation}; } + const current = request => !disposed && generation === request.version; + const selected = () => state.hosts.find(host=>host.hostId===state.hostId)?.targets.find(target=>target.id===state.targetId); + return { + get state() { return state; }, + async discover() { + if (disposed) return; + const request = begin('discovering'); emit({hosts:[],hostId:'',targetId:'',message:'Looking for ComfyUI windows…'}); + try { + const found = await client.discover({signal:request.signal}); + if (!current(request)) return; + const hosts = found.map(host=>({...host,targets:host.targets.filter(target=>typeof target.id==='string' && Array.isArray(target.roles) && Object.keys(roles).every(role=>target.roles.includes(role)))})).filter(host=>host.targets.length); + emit({phase:'select',hosts,message:hosts.length ? 'Choose a ComfyUI window and destination node.' : 'No compatible ComfyUI windows found. Open a workflow with a compatible Prompt Manager node, then find windows again.'}); + } catch (error) { if (current(request)) emit({phase:'error',message:error.message}); } + }, + selectHost(hostId) { if (disposed) return; invalidate(); emit({phase:'select',hostId:state.hosts.some(host=>host.hostId===hostId)?hostId:'',targetId:'',preview:null,message:'Choose a destination node, then preview changes.'}); }, + selectTarget(targetId) { if (disposed) return; invalidate(); const host=state.hosts.find(host=>host.hostId===state.hostId); emit({phase:'select',targetId:host?.targets.some(target=>target.id===targetId)?targetId:'',preview:null,message:'Preview changes before applying.'}); }, + async preview() { + if (disposed || !selected() || ['previewing','applying'].includes(state.phase)) return; + const request=begin('previewing'); + try { + const preview=await client.preview(state.hostId,state.targetId,roles,{signal:request.signal}); + if (!current(request)) return; + const fields=preview?.fields; + if(typeof preview?.ticket!=='string' || !preview.ticket || preview.target?.id!==state.targetId || !Array.isArray(fields) || fields.length!==Object.keys(roles).length || new Set(fields.map(field=>field?.role)).size!==fields.length || Array.from(fields).some(field=>!field || !Object.hasOwn(roles,field.role) || typeof field.before!=='string' || field.after!==roles[field.role])) throw Error('ComfyUI returned an unexpected preview. Find the destination and preview again.'); + emit({phase:'ready',preview,message:'Review the complete changes, then apply.'}); + } catch(error) { if(current(request)) emit({phase:'error',preview:null,message:error.message}); } + }, + async apply() { + if(disposed || state.phase!=='ready' || !state.preview) return; + const {ticket}=state.preview; const targetId=state.targetId; const hostId=state.hostId; + const request=begin('applying'); + emit({message:'Waiting for ComfyUI confirmation. Closing this dialog does not undo a sent update.'}); + try { + const acknowledgement=await client.apply(hostId,ticket,{signal:request.signal}); + if(!current(request)) return; + if(acknowledgement?.targetId!==targetId || !acknowledgement.values || Object.keys(acknowledgement.values).length!==Object.keys(roles).length || Object.keys(roles).some(role=>!Object.hasOwn(acknowledgement.values,role) || acknowledgement.values[role]!==roles[role])) throw Error('ComfyUI returned an unexpected acknowledgement.'); + emit({phase:'success',message:'Sent to ComfyUI.'}); + } catch(error) { if(current(request)) emit({phase:'error',preview:null,message:`No confirmation received. The update may have applied. Check ComfyUI, then preview again. ${error.message}`}); } + }, + dispose() { if(disposed) return; disposed=true; invalidate(); client.dispose(); }, + }; +} + +function element(tag,text,className) { + const node=document.createElement(tag); + if(text!==undefined) node.textContent=text; + if(className) node.className=className; + return node; +} + +export function createSendButton(label='Send to ComfyUI') { + const button=createButton('', 'prompt-send-button'); + button.setAttribute('aria-label',label); + const icon=document.createElementNS('http://www.w3.org/2000/svg','svg'); + icon.setAttribute('viewBox','0 0 24 24');icon.setAttribute('aria-hidden','true');icon.setAttribute('fill','none');icon.setAttribute('stroke','currentColor');icon.setAttribute('stroke-width','1.8'); + const path=document.createElementNS('http://www.w3.org/2000/svg','path'); + path.setAttribute('d','M21 3 9.5 14.5M21 3l-7 18-4.5-6.5L3 10z');icon.append(path); + button.append(icon,element('span',label)); + return button; +} + +export function createPromptSender({scope,baseUrl=window.ApiClient.resolveUrl('/prompt_manager/'),clientFactory=createBridgeClient}) { + let active; + const close = () => active?.dispose(); + scope.cleanup(close); + return {open(roles,trigger) { + if(scope.signal.aborted) return; + close(); + const local=createScope(); + const dialog=element('dialog',undefined,'prompt-sender'); + dialog.setAttribute('aria-label','Send to ComfyUI'); + const header=element('header',undefined,'prompt-sender-header'); + const title=element('h2','Send to ComfyUI');const dismiss=createButton('Close'); + header.append(title,dismiss); + const description=element('p','Choose where to send this prompt. Nothing changes until you approve the preview.'); + const status=element('p','', 'prompt-sender-status');status.setAttribute('role','status');status.setAttribute('aria-live','polite'); + const host=createSelect([['','Choose a ComfyUI window']], ''); + const target=createSelect([['','Choose a destination node']], ''); + const controls=element('div',undefined,'prompt-sender-options'); + controls.append(createField('ComfyUI window',host,'prompt-sender-host'),createField('Destination node',target,'prompt-sender-target')); + const preview=element('section',undefined,'prompt-sender-preview');preview.setAttribute('aria-label','Prompt changes'); + const find=createButton('Find ComfyUI windows');const inspect=createButton('Preview changes');const apply=createButton('Apply to ComfyUI','ca-primary'); + inspect.disabled=true;apply.disabled=true; + const actions=element('footer',undefined,'prompt-sender-actions');actions.append(find,inspect,apply); + dialog.append(header,description,controls,status,preview,actions);document.body.append(dialog); + let session,closed=false; + function dispose() { + if(closed) return;closed=true;local.dispose();session?.dispose(); + if(dialog.open) dialog.close();dialog.remove(); + if(active?.dialog===dialog) active=null; + if(trigger?.isConnected) trigger.focus(); + } + active={dialog,dispose}; + local.listen(dismiss,'click',dispose);local.listen(dialog,'close',dispose); + local.listen(host,'change',()=>session?.selectHost(host.value)); + local.listen(target,'change',()=>session?.selectTarget(target.value)); + local.listen(find,'click',()=>session?.discover()); + local.listen(inspect,'click',()=>session?.preview()); + local.listen(apply,'click',()=>session?.apply()); + function options(select,placeholder,entries,value) { + select.replaceChildren(...[["",placeholder],...entries].map(([value,label])=>{const option=element('option',label);option.value=value;return option;}));select.value=value; + } + function textBlock(parent,label,value) { + parent.append(element('h4',label));const text=element('pre');text.tabIndex=0;text.append(element('code',value === '' ? '(empty)' : value));parent.append(text); + } + function render(state) { + if(closed) return; + const busy=['discovering','previewing','applying'].includes(state.phase); + status.textContent=state.message;status.dataset.phase=state.phase; + status.setAttribute('role',state.phase==='error'?'alert':'status');status.setAttribute('aria-live',state.phase==='error'?'assertive':'polite'); + dialog.setAttribute('aria-busy',String(busy)); + options(host,'Choose a ComfyUI window',state.hosts.map(item=>[item.hostId,item.label]),state.hostId); + const selected=state.hosts.find(item=>item.hostId===state.hostId); + options(target,'Choose a destination node',(selected?.targets || []).map(item=>[item.id,item.label]),state.targetId); + host.disabled=busy;target.disabled=busy || !selected; + find.disabled=busy;inspect.disabled=busy || !state.targetId;apply.disabled=state.phase!=='ready'; + preview.replaceChildren(); + if(state.preview) { + preview.append(element('h3','Review changes')); + for(const field of state.preview.fields || []) { + const section=element('section',undefined,`prompt-sender-field prompt-role-${field.role}`); + section.append(element('h3',field.role==='positive'?'Positive prompt':'Negative prompt')); + textBlock(section,'Before',field.before);textBlock(section,'After',field.after);preview.append(section); + } + const composition=state.preview.composition; + if(composition) { + const section=element('section',undefined,'prompt-sender-composition');section.append(element('h3','Positive composition')); + textBlock(section,'Prepend (preserved)',composition.prepend || '');textBlock(section,'Append (preserved)',composition.append || ''); + textBlock(section,'Combined before',composition.before ?? 'Resolved at execution from connected inputs.'); + textBlock(section,'Combined after',composition.after ?? 'Resolved at execution from connected inputs.'); + if(composition.prependConnected || composition.appendConnected) section.append(element('p','Connected prepend and append inputs are preserved and resolved when the workflow runs.')); + preview.append(section); + } + } + } + dialog.showModal(); + try { + const url=new URL(baseUrl,window.location.href); + if(url.origin!==window.location.origin || !url.pathname.endsWith('/prompt_manager/')) throw Error('Invalid PromptManager deployment origin or path'); + const client=clientFactory({namespace:url.pathname.slice(0,-'prompt_manager/'.length),origin:window.location.origin}); + try { session=createSendSession({client,roles,onChange:render}); } catch(error) {client.dispose();throw error;} + session.discover(); + } catch(error) {status.textContent=`Prompt sending is unavailable. ${error.message}`;status.dataset.phase='error';status.setAttribute('role','alert');status.setAttribute('aria-live','assertive');find.disabled=true;host.disabled=true;target.disabled=true;} + }}; +}