From dc1d59a3550aa1c2573123050cc091a9fa85d832 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 4 Oct 2024 13:05:18 -0700 Subject: [PATCH] Create separate chat-tools-sample which is more of an agent --- chat-sample/.gitignore | 5 - chat-sample/.vscode/launch.json | 35 -- chat-sample/.vscode/tasks.json | 40 -- chat-sample/.vscodeignore | 13 - chat-sample/README.md | 16 - chat-sample/demo.png | Bin 108688 -> 0 bytes ...ode.proposed.chatParticipantAdditions.d.ts | 366 ------------------ .../.eslintrc.json | 0 chat-tools-sample/.vscode/launch.json | 31 ++ chat-tools-sample/.vscode/tasks.json | 38 ++ chat-tools-sample/README.md | 21 + {chat-sample => chat-tools-sample}/cat.jpeg | Bin .../package-lock.json | 0 .../package.json | 24 +- .../src/extension.ts | 105 +++-- .../src/tools.tsx | 0 .../tsconfig.json | 0 .../vscode.proposed.lmTools.d.ts | 169 +++++--- 18 files changed, 294 insertions(+), 569 deletions(-) delete mode 100644 chat-sample/.gitignore delete mode 100644 chat-sample/.vscode/launch.json delete mode 100644 chat-sample/.vscode/tasks.json delete mode 100644 chat-sample/.vscodeignore delete mode 100644 chat-sample/README.md delete mode 100644 chat-sample/demo.png delete mode 100644 chat-sample/vscode.proposed.chatParticipantAdditions.d.ts rename {chat-sample => chat-tools-sample}/.eslintrc.json (100%) create mode 100644 chat-tools-sample/.vscode/launch.json create mode 100644 chat-tools-sample/.vscode/tasks.json create mode 100644 chat-tools-sample/README.md rename {chat-sample => chat-tools-sample}/cat.jpeg (100%) rename {chat-sample => chat-tools-sample}/package-lock.json (100%) rename {chat-sample => chat-tools-sample}/package.json (72%) rename {chat-sample => chat-tools-sample}/src/extension.ts (57%) rename {chat-sample => chat-tools-sample}/src/tools.tsx (100%) rename {chat-sample => chat-tools-sample}/tsconfig.json (100%) rename {chat-sample => chat-tools-sample}/vscode.proposed.lmTools.d.ts (50%) diff --git a/chat-sample/.gitignore b/chat-sample/.gitignore deleted file mode 100644 index 0b60dfa1..00000000 --- a/chat-sample/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -out -dist -node_modules -.vscode-test/ -*.vsix diff --git a/chat-sample/.vscode/launch.json b/chat-sample/.vscode/launch.json deleted file mode 100644 index 9bc4c02c..00000000 --- a/chat-sample/.vscode/launch.json +++ /dev/null @@ -1,35 +0,0 @@ -// A launch configuration that compiles the extension and then opens it inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" - ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js", - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "tasks: watch-tests" - } - ] -} diff --git a/chat-sample/.vscode/tasks.json b/chat-sample/.vscode/tasks.json deleted file mode 100644 index 0dc11430..00000000 --- a/chat-sample/.vscode/tasks.json +++ /dev/null @@ -1,40 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never", - "group": "watchers" - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "type": "npm", - "script": "watch-tests", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never", - "group": "watchers" - }, - "group": "build" - }, - { - "label": "tasks: watch-tests", - "dependsOn": [ - "npm: watch", - "npm: watch-tests" - ], - "problemMatcher": [] - } - ] -} diff --git a/chat-sample/.vscodeignore b/chat-sample/.vscodeignore deleted file mode 100644 index c6136798..00000000 --- a/chat-sample/.vscodeignore +++ /dev/null @@ -1,13 +0,0 @@ -.vscode/** -.vscode-test/** -out/** -node_modules/** -src/** -.gitignore -.yarnrc -webpack.config.js -vsc-extension-quickstart.md -**/tsconfig.json -**/.eslintrc.json -**/*.map -**/*.ts diff --git a/chat-sample/README.md b/chat-sample/README.md deleted file mode 100644 index 32fe5c65..00000000 --- a/chat-sample/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Chat Example - -This sample shows - -- How to contribute a chat participant. -- How to use the chatRequestAccess API to request access to the chat. -- How to respond with follow-ups. - -![demo](./demo.png) - -## Running the Sample - -- Run `npm install` in terminal to install dependencies -- Run the `Run Extension` target in the Debug View. This will: - - Start a task `npm: watch` to compile the code - - Run the extension in a new VS Code window diff --git a/chat-sample/demo.png b/chat-sample/demo.png deleted file mode 100644 index c7eb98525523e568e2a65b55fcd414cc37243b75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108688 zcmeGDWmFwY7d4C$f^3321cw9&?(P~K0>LG?>&D%k5JGSZkl^m_?h@SH-TiCMbCR6# ze&hbXcicCl_n^~VtGl{n)tYn73Xzu;M|}1A6$AtXqQrZV4-gQL#=vhJ1Or@A-1%t- z0r9HAR9IMELRgqs-p<;{)WQ$~;(bU=9ITS!3|8Q9BYWcrnoty)EBX&~0mMS8%SJa2+CI*N=@N$5vR8H?i&(6>>yCS`Sc3a8idy? zWJ!%8X7I3dwb^!sZ=`3-GI;Qiv&|A2N@R5Py{@s|kA=?mlUz<(6Vp zYsV+}W^elb97=d0fm2r!D|;w3*#OmxiEvj|#lJ&_Np3TZr`O#|Al}Y$vfx-k79HC5 zo6CCgv;~yWQx!<*50y#_>x>4 zub(=3!ODj^#7LJ(d3Znec{MKMJVo(0)LmRHg3Fu^e?3C$T`I|{W!PD}3kobNNhdRD zlU^xKel-w%w+5}&D%ng!FIKDknXo6fQlZZ{z7;Vd(EtU0%m*^~1rf*_dBAcRT);thQ~QbyLNfFaBDSwoo8fZo^5mN1>aOjU zO-c>lJcuxIs&#I;@i@wvPWv-`$59JWTUzH*$JH7?N)MEY`uS7`&2v>rZaI>EvBCKMsvc7_Uhrt2Tfysewk7bu3Z=qLP4vSc@BcC)t9P5sm~*)V#a5Ksl(O}dmZxtjiVVyv5K zs;uv{3UesbFvhfUJg@zAm1C)Fbx}!^?#sEF*5^NNdsbDr%Ri>yxR)&URZyN2+_8f~`**M@|}cZ>Y4SJyZ< zHXeEIsn?0uryf^#NF{~SxckEUah{i+ADYoUj~;mM<8IR61t5K2hCiCtkYu zo<32BTGzW(_0^ASTU}Ef&2pgkloHz#$x$^lC+c6VzEbAC!%f3aYv6Y=kX=r;1mAAe z4bUdL8K-tOh@KSHz>ZPf+>08rbf9*EfwpRPJ^RaW1sOB8ab1Jeo`c7SU13d$~1J-JAY8Ny9 z```AX^$=~dYFN98jTL0GJH$Rv?(|;tEW~otAVwd?36{B(k#iDYN=;$Lh8|%wx-7b2 zx)5P?(eqTj_lR;Hz37|_o1!J`LGF7pg)@S)mgxVG`7=NEl1`s~t{h)IwXVT1pf}VP z^MTq=g-}&gJ*IYdYT`0qO1W7px+JSsp!t)b;F448(gao>h9vw^(S>IHo!h`w#?jmq zXW?Awp*d>vwppo%t?9|uMZ<-Pm(6whevmcZ7+Zz4{X&g7x>dCEc*-DO67sj4xb?Vm z%aG}@l9<{`lf5}h_$sY;4s;8RDHU3!joCB}1*SnepJllD;gDEvM;*PV&YWC9n%U*vA^qahPj$@& zF!8N`d4z_{pkSjPp81Np=)rP&Z4eg{EWTA1gduFiR8*4PYiQYW@@WG>RTdC7@a2#*=%MeEL zjU(IBeh+7FZTeZ;nFlSrI-%zK2Ag^ZNAtVRlCU^>Xsx=DE-P-gnZ46oYC;uRZ9^@~ zhE3PPmAd{5^ya#I*NlbA#+AUih%BV5&znODDaKZ}^E_VE%acFnlIN!Cj2s*mL+Zyp zoDLUKtvs*F-PEqM7l!NkZ$E7a@3&`&n?*_z?eP}f4(?Xp5>BO#H@;|`O6%Zp8R_10 zJE`Bl8h(J5%axOYMSwL+<>cdL#bKE~aUVK+#Qut%DIDOH^Q3SycDixG@A1^Ym&`H$ zBze0#w|8M}zo^vg;5o;H#(H|Kby+`pB}!z^hkxC3JAL_XWxQp(ZTNcFP^X}Y#S8K7 z_E_Vx+8V9s8#f&^ihYZzDMUjNjCZ2HSr8J$doVf6WsM;E67(9>Bf8x7u`L+-`z*G1 zO$>y8=4(T2t^xV1?`QGSp%>64(b0C&yDPQ_d`2AS)L9)u{ctPQPS6EVPbF|#PjMbk zU>JS1ZiD-!Ew2|?pOC^hg{|9wa8}t+Rl-O{27(GW2SL0DGKGKw&Rzh&*T4?~;^o&s z2w31R8t@bO4*B~or1AHcf6m9B3koU2wXO^$h8pEp47nAb6a)fKy9DdtG8@OA9M7moqQvKP9+;^XJR-q{ROeu{Y-> zRh5w^7PhuCBxa*ypkpBAdqqr4%wuO@#PvZ$>|b->f4rn7_VzYh^z=?nPIOMpbk=sp z^o*RGob(J#^h`{&KnYr~i>Yx$o$|EJ|gu%Vr>wI%RMd%nLt^RMxLZ~kk@L;w8c z|7nT;HS<4Lfp+G5#Y6w6&-h;T)f{0$KnOrchzKeZiVBw zLxARLO;X_x;REqPD9D}U$0($a040f!yf7S!BqhoDq8qHDrGf3abWYKiVAz8G?a+I@8i2LO3x9Bc)B0T3)DZyG1QwO zdy-&p(7%TOEGe<=q>pSMlIU+cf#)KK|6f}~e%j}A=kD%qK~`3mnYsBxepA!pYrLe? z{?xcQV`yk-WhJF`owsk_DyvSXBQ=wy|0@0SDeIIz4S*&2Mfq!P`HvqBV`5^olQFTe z-9`gY`iF1F4Bhyd0nsXD;x_oV?zFx#sV2Q zRFJn>EH=3CsT4E@;1=XW3qn>1YB2qMc@Hb38m6)H07%z}$tSJO)UV2blo;~gJgK65M0S^Q6Ct*&qH6!-m*`AV#tZn`Kgk?}c3E@#c@ zoA2kr!!vO@o;zvyBgH!Wb2jaWmW7p*rw$Z;GD*%u9D&k-ipImKmT8{1xt6sXv5Dri zGrcAou8fv%88ET`8PwY>P)vL=UGufzhkO0p4&1YET5boGmmTPG1yGJ7-vvDn%ZB;x zEPh%hS=Hq}+)g#ia#rIypfBz()L%*7RafXu7N}j0iWALHq`9wN>3|1WEgLT;&(Ige zt{!HFJ&hEzWh;T2Pk-hv|<_%`(vgIK8~tN}F45^|Ks^XJm8SpRVw~luR+(2o;fbT68hi z=}&vQH=ffAqg7YS4E=XF2w0)?PCR^hbdF;&!bYj)R8^!TO1RfOa$%@%)$FD$yu zIL)I9_(BcpiGF;utu(Ku!urFyQcI7!%ZpVSstOcVWZv^H4o8a%vfKw1s%qr@594W% z>&-g0otSW)YSW%WoLkeEbJj$2>?r}qG-LLC|x2d zS+FQ+mSy47k=Ii_(VMcPraRYRbB(?6$KQhw4iXpBcz#{cWk4v%w|l?gY^a<>IM9D$ zveI0Ien_?S>G5t3_`bvH!sf@@KALfi zQCCc(BFuO{Mn(HX(LULAH`j5&ValcTy<(iEU5LlsLA4kT8xG`Y0Jb(mho(|;zyZNU z^vw!g!*N?Y!<_S4gk||4TX_Pr@$1wYICS!9de0O1`h%)DCaxAT)bT1Nx7(fUhv+vT z{{Da6>-S8wo*a(+!a_?0lqhsIuSa*Hrm$Dc-l7y=JCiUgftjrVj6;vg{)0}0sRzcAu&B$UHebcs6Ycv*&3XNJ>hqmX9VY6p9fs=Ink(jFE ze2uO48#EX~hED>0SwwF8rK;00$J;)zggDgA-Gpw_5)>)x&{Q74#N*YU+upi9S!>K$ zBe@7xw}W)~q0Asu6iqI})SzdvHSMSJ4Zm%KzOS1Z(c#UlMXu%P)S}B4f!E@6T7y^- zt-rAp4_alm!|&ddfW*Z%rga$-!a+h-YzUaAnFM-muWGNTo{f4eUxogOfbmP;t5>ha zQa`+8^o!ECj841%p;j3j3e;o@9(H#fz-l&AT23wscKfB>uC|WjGVCsLc-&+KboKj8 zcx)E&g?SwMLRz~mC>Vkr#AfZT4H`T=d}dGgTl@!JPj@=@F)6lPxPu}e%Oeh@K!#&a zFOfLD&lq(uNQ16OD||WH!7hF8vO8|^9owRvCqAll3RQ!+gr z({wT;ZmjZ;n;eIgk1fNP~W||jKt?;(k-XGAbQb9 zjRT2^OzJ>Za>CMfFvNXSfy-=kJB+y6bx}CmQ?!4r2<$@}un&d+gQWNBn znYL3E0ei&Wd=r7pU(TQLbq_?J{X0tFdhHV)%50TN8^Y|pe4?vFp(|n)ziv%3$#Cii zatdT1T`XI%YJt$kzFf&#`s(yqe_2(XsX;Rs0YOfMA#1e;7_IG7(-f_?$>Epz@8g2gwx-eS-ZPS7dR*>+y_8hc4yvLkvkIEsl$HYtP&ItyH%*;A8wS&_c>peXy`VM<11x3Y4f` z4{4d|Q!DRRjLVjeIa4Hf`U<{6r;rUVjHDAeYe!++!SSWS$)Lc=RO1x? z6X&61&QkJ|*I7*QqO{Hf8QKNgjW`*Lu4~1$_Ol;w|BY{Yu%3r65A|r0je9oQ;H@04 zT|+#>Ik0GaJ`fthU2^ePBo%(|@1A>o@XumF;5e<@grnyZV&dl%$b~{vz37_1)YOi| zeLZYoO@jP+O{k`#Gb5F}AwnA7_u5B-imWzOAu1R(3szSWkw%+FbPq%($$1Dk;OY1* zsCH(Ful$OdpLmqv!^kI?uhbZXMq1-**vv{AH)1v1Q$Tg*MYZHroQZqb8VLsJm6ot_ z#ywF|9}1QKUE*8J-hLS^A=eeM+U+Ixl40{jJMsAr(xw6hY~(nRr)rknsuB%Sge}qE z5)`AYCTZ_y53&TF_Pig3X2Y0R;4IllggpqO?!g;6@?2=NY-nCRjBUbJE0rMt(E)3^s-tVEykpzuc7BJ6}RU-FMd zm^Cc>!n+eXYxnyBqY={`;`?q_&qo`dwat$4e^m!+(h;6vY>4rUxEuN;-Mf0wWkRFJ`W>sBynoA0Qx ztQhwo3%qfPLu{H>8dG+fr|Z7YWO$E=Hx!A_Ral)b1R0CNMvTgBheO}7`=HHQL{+Pu zGo&CBvbOupwv*MW^LGxc)Q6eZQP{gH)2J8!|}m(dJwb(cgWj(d0Y9yxHJV|)AF zsz-Y34ROxG@1w`S@0q|C8{dC|s$zBkMUTMHlWJ}w8_xO3=)?X23l#FK#qS^Lnh+ zky}JX-jQXa$G$^-6@grMlX4OJ5%Oe}CO;yd@%NlUg~T1?^m~!cun8wcK6D(9D&&6D zcy;e?$io*Res%on4qd3d9gS6N_heo?l@%8eEZSc(P=QB+%Hx^zUo0a|_QiG>mw+4= z4q27S2P?og8*vyXl_eFU(53)w)tX(r;VB#R!yxMjZQU)W>< z?^6)MjP$j{sOP15zhL$(wyqf73{rX)7r7<+A2jV_4`=W(ISMrNrtD3iF=>ZH$}btb zQHc-Z0qJ)CRvW-tC3SEHh5`Z^vUHj?Bg6b%N_acrtI|s1szKS|y&rlR6)BnJN3(y! zDgin)Rm)Wb)$mn=M<$~n3ftyNQbYwYf`RwL%(yZ4X<>2SKdb%5qQuWDNx2R2ddSKR z>6;LNwNftsw+WhT(hPWnwe88qx=l2FD=zSIsGy4-#otB(P&-X%Jm<#E-o${0q8RGD_8L#nCx?j zZhK&%68S`EEqH5|wt8Og=g*&x>rvwBQ$<>enALrKk{WgPx%A_WZcfzi-btuwZpQ=y9&#widx|F<92!wn?^Q3EJKn$ zGeo3A%FuoBjQabB^+%UNv;?|=PWx@}^yeh)QDow?K<^r7iba&&-@D)Kmk&1_-!1zg zKgY^v8&v=%nARmJvTA;COyYH`ddBgk7dv$OwOgrd?$%f^J}x6V`@?lC7EJICW;hC4i z>>twonZUe4iZUF(ineOHt?A)XBZ*NzkRRz*SQ{@@!b;B%2C+$LDDa3Nrz;)zKiYAb}A~W#7gftjG^^?(Ys!*s+hPq_Ijk_EIm!49UOd4+1nK9 z?Qx`ZaSlWrhEG53R#Z8TK#!c@P3K~(X3qzvMCKls4W6@?zK+qj-Q6ePqD+M7m>_Wn z2Z!*R4AHQA*7gf6C8ci`)zhw*KR>sSRkhOkH$xA}vFNZ&u(mv|a0T-(S!k3QgcOHy z-DtGwcSU9_zip@fZ2X1DAri0-M2 zYTB%kND#js060^NzJd*a&0a4BH6w5s+n&}UzUZeNc^tVtc1e29K0Pcw-Eesx`w>m= zWTzd*bw?5%b!wt;uHc~HJkwB?6{BLF6U@Ur`p+Q#!A|Mi0~i2JMJC(OB$cf&c>Z~b z9(I0>K%BS_;6m%FRQh%2XK-A4@dSW!1UX{IdE4$8ME3dRI8<;j^J$V*ubCcf^#nxJfR#gr8ayz&5XjI&En|EbaMrbQF zL{Mu!4S=it;r@5o$*X4w50Y11F0M}xR}Zzb05kbu)jKZjgs>f;Y;E6x}9ouHnpY19f1hAdi=Mekqr>b zfqppffhO0hVf6di{13SV4!;x@@j9J^(ofi9OOVs%oqfd-TifZuvqBcOXRAhErRQzN z#dAaha2-4Wn(VRD?$@!9jbi94=G`p9eR{8(uqzDIqKInZfz_#?qu@yA%qN6T9Q!5h ztL#572y}bkH}SU=<#;!6(*QEm@j0mG+D334H|o|18iy2fWFHuc}wz=Q+szuK*8nh`xx*?OfFs z30YLQ^l<2;O?g`Zxzz{xfhC$)D2PPeYnZZ-n}njxoNY5v?w8cfW=q=$_vx{XSRv!C;_m{QCHYtDXL=D|3Fy)7Q3eA#%ro6jrWhk9s~ zhc0%-X!t7itu{XQV#VsJo(_Rt)L8^&IJU8K49WsN86gjk89-~NU1_3vTG6k)ZUjc0 z{%YubKc02NDEun%5RQl+Ed8#6Fiknp;=GEsOQ+lD2Lg1`_`OgfhG{`qg7q_|6MH*E zabDF?SCq_qV!dx~99mwlb;DO(ExNgh?P$L|*8I3u$9Xjmey|;RGU#r|yD;bfXC-0t zxwl~J;h(?PPu<4k5h>(N4MC^4)q3C4eJrgzA6z@SyaQrKYHn>TEFa?Xj2bazB6Fg~ zVaKt$TrVSjl@qPPq}$~w$WkU99F9-lfts2p;)jG1)`~*vOjx5!;w;1+ENb^<6;U@( zCDg;Y6OR;97fAUCqtU!hgx?!`_(6AzfuP&|UISq?G=Pu9-Iqb1R|sMlek&QDBOH%v z=_R{A>J}nufDOe!5aTYY6xM5_Ie$3x>tjM@C@TgYI_J>%aU_KHNStd5(3?1Up@}w zY9|?>H!y`VIg6_Mz4J%(i*Gacg^m(JW95_`t&=e7dXFM!1bTO>2}DFsH>Cc(&brQY zNSx~^@a)pfOoz0=V#>vplj?(2c4v`S>ZohYp zg8Gd73?T(-dco+#_yO1uk+AGw9?-mnAH&+F4=PM+n@o?F#Icw*n$R||_+4fYJ6{Pk zeSGgMTVl>^t%c&3u6ge?Dct5O00vT$6g&^9r|)3DH}hC_ zs-W7aD`6yzz)$a$VZjBq_&BxP&Tb6;SW9b&wnBPbVyT)STqfEVOMVL0MK~TpIBP2* za?407wIf7On5j%W`XmOpIK+uPjqnAE8%eF?{yr!E0rKXb#GJp`uw@`yG(ZPx&bap%=Nt$((b$Qh7&L6kRk z=ipSJOtZtug>U#LVTqiTmUb&z#2KD%N*7OYKSeSsHy39tP; z&;qD4JrMUL;=BDY!jpKk$?YI=Bf+7fY3e?4kuP2XIbdd(xSSPSa%4vT^~|}|I5>&G zdDg1dx8cj-$lcvX{Z3*vdeWV(7ZD>7rxt^(-k-XJa>l%Dtr0RLjDi)1n8#Ooo|9GI z%TanaKe=|B`^mHh3FlXpY{e|CU4bwT)G*;v<_4~=WU7Y!IX*kJ z5P04>BjjR~Etg_3rCF8vRZ?}smU&g6XYq+ zcFyfyh7|U+SmC&FbxDQIYmDGqyZ%+Gp*lWUN-RB)b1t6HZ;wD~f{ouG-qZJyIhTPH zQ#bs*+!TsqYsOZDLq*CVFlaX2{cUJpir^gdvaqP0yI*4-(mG3w!?gx_oWFY}8VOPa zQu|xgIW_7ti5z^_$l}7`#Na}pg{Qyli7aAimp_N@`QMWKV4)+S*kK8$qPNLWXQj_2 za>A4NbnCVUSrukVkdTpU74pZlb23@eoL|>6g8hcRwR(enj|a0*o8A<>#_T;gIP0Mq zV$QS&kJfbI1`81X|X@Ui7TTW=f@iMiBjgD2qgLqW4D6eLcdl06UOg7vumH@B>y8M z5d$d43L`PM?|pyx6Or%es9!ktL?{%sP=C{KJstp8SL=l|@$xt2<|8X2uv&ngBJJ=; z4n%wf_da>!ky8ozkF|IktbE8)1zcFowkK7Scfdo)OwiHV7blpplFfqyTr^SlUP z1wUfsy?h=>{~ReHKua5QCGCd&E+#O9{)MCeMllEJ4;5}t4s?IYjz!)-T+cstoN@xI zG+T1%T)!Vg3ap#&lO3|kbDRFy0q+YbPv#HU{i{VXepZns3}xMt{#yakFK0ma+x`Dp zr7#?S4E>szP?M2~cqZ0WJUkj%+1PG{2m1TVeSIORsi;nizkWrdrrDPdT8fh2RsB0P zz6odp98UDDS_DB3!2bbMXug)RzDq=9tg*vk`Os^;-FXF)5sn(3E3YQjcyxoCPOIAK zP$|hmKq02AtX%avQd{Of9^ejDwQzL+PFSPCxs>(SgsKn8Kx`+EVXOWoe+rkmeOdU1 z(cYQV;H&<^oSHC)y~#mIsRgJ1in|zmCdh}d=rm0}#z+{T>O&S`=R{e$bxwV9}_4 zy6C4Wd{c~;()lDC$VsxJoIHEdnz z_a^e=pw#KKLb#NFySNu}#QCchhx4^V?Hm4Tspv*E{hEZh${NiBbX-^XZjUot3nqgw z)P2?^ogX8V%L`gx%?C@fBemR~=a<0KaSXG~*fTdrVjI!@n3*mi#ij){`i{M#-dmh< zy*fPT-Hsb4e4sKN(DUQ0%uodI;%gCR^;tL3dOqo<(AuYQ}_sXSf8C6O>($i{g`s2=qwUc)?lD(;_%Ryc}%QCjI;_P2>CifO26m_;(*bAv9Z8a)Xf@t zqRs8@O6C`-o3Tz{^rg^ zzT^6YhcSytDUh@wFji@PIoSypXDTg{5=ExoQ`db7gJ|-aY{0P8^-D8ZJ6(ZqppG(pE>d zI$+4}A^_glk+#1)LOfPO#+Gl!%qlMe2D`5VJbA8m)Br{-YP{v*+j|gr(Xr$^D>2!) zWRnk$9?v?X8EW#ln+0-3&%|0`9a~$^$Z>+1am^zU>%>K7q_>HVbU{`t zm>@4!yWZ`BnnvZeutIJ=&WONa>mm0%tGw8r8ovD&H+RCnFf~+nszX=c^NiK(JOLFJZ4P-}L*_^kF)k(9C2{Y1=DQ+?iDVL(F?RaMT z@i=TgadcGh0TN01Io%+F0(-;+!KOO@0y$EsUYC%=iv6LY=V?_5kYdnwqg<~fcc<^aK={@f}y4nFFv zu51mE;F_xjvTj$Z3U;#`UGD6CF?EZsd$dU$wi(FLNQ6Aosh+o{{Gasp3ahIC)!Fpj zQS(v2ZXlkO37$oXU;*KOW}5V~5-^~@Q%xyeG%iZbA>yWLC}(9-e;Xp{c7o4|RDHuiNx=YPqGfD0b3O)78$xxZCRK{6Iwmis{NmvWW~CXG)J?j_x6xyz&MN z^bhJGfQ6-_Z~M%9IURpp2k1i&63vTFE<~4}#bw<0$L$Y!&+6RgeAAr!*&uB&GYo06 z{g?!sVc)lDt0^5X4+}SopBls+E+?JXa{vvGr*#nboVl9=*xkK23YkQMI4#En9Zw)z zxc@Uw`?MbqbzJMT#k^g(#cyA{p{bdO45@$eG2z+CgEg~+{ zj~OHXnO0b${Z6vs*PR@f_M&Fxedm9}ee-7-51Dj#IPUZ-g+Kvw^=@v`y!4!r-M~WY zux95za`%&5R*Y{Nwkd7^Y)VBe+%{##Qc09LsitD5V&-3xDfbCONLN{gQWs2zPpMfFaOnAw}!jH-1XTgkO4=sA{agcNx`_yj6~1kHcaE1rdz=Fv?X!h!-C-9ZJpDL_k&K`p#};q4fF}&&R>Cuc_rA|?n9e&DTaQoaWk;Yv8tWR z3VcBWa{WHXcBC}TBQ68;`QN|yxQ(iAv0cYu8x`dmj5`;&V^9~boX7$6y5WFu=XZ$B zchA7oW1DgDC6?K;T1M+?qxs3W{Xh~sJ%&SMv3k_~a33)Ox{OtS>D%({s%^WnQ+4{^ zk=_U+$UrHXqziQP7R_)mf1^r&Jz#^=wsKOrep&^rsYrTvtOoBk2GRE@0dwn!fNG=fDNzXtA4G&^Ihn`ai$ z81EIv#{%{X46C9k^` zk3a&qLEZyM?#vt1AKhN8M2u|rM3FtHz~K7-cmUF4-Esk~fsFcH{;Rhbzd`(V2NV+* z@%Nmbji6fGyF!Sa3Zd_ep=fey!djUz9J(Ji#1v!eDWF(lzs+rST2!7bYpTS zU9!%e{j=dmgkm)u(GYnu*zlVHAr5eUVU?sh?YK!YP{qJ(3m|8D<@@;o#ZmXEV zRNDhqt=LDnu-m(p&1PMdVp7slO)J9dgFvR6D@5Hu^;Xsr<=&!kOegMQF(49|rFe>7 ze*$zRc<4i`y>%;rcm;B4d`(WR%s97wTYzUZ4=zGk75PFk2JCxiHeqaT0EF#$aumza zb|B`{!T93+Wbly0-VV&D{->|%fBnrNY7bbqmi+1i%;%I`a$x7B<;G9hs2h&Vq{5|$ zj{ULBNIVBM3l}T@jj}{ZiZM;SdPT*~p)j_GPPam1m(q`uzvePr!uBiKwW~=fSYFLP z2KWVW`%HGi6qaUPyk;3VeZ9~=WFD)w} z!)flN<;WM-F*J@`1_q(%4tFSxQuLTYMlt=^dhriG*IF|P+P;&}%qBW2DgOo_#MN*H zzZ%>8y5JWm2e_^v2HP@jUTGt=u)4}*il??OYO%4gEMM5`@162 z%)my2_U7~LtqYpQ?eoc+?LmmuK8NKc74wo>9)?=|g$?E^)Zo;rqQiuQpBpqzwxq?= zRIZn{8O76bTvFE+8Aq>`58Kjrc+MMsD)#1xZ-UGV88WpSKJ5TGtFh1ixNm;%T{>PM z1GJAYvZwiG=4XXD@uo!c!Xxl!7AqF)`AzWboAn`jaWu(CMyJM{OB>k}Ggjg$dVl~j zW-#%*5-&>4^a19)gwTV^q9;p3jUHQQz==dYYmit~5~o-^Qd{=dhDLSjLqU3%OxrG$ zx{D~$kJPK=3qmfg*oNVgzW_$$I~jUU4aZq@MP0&O+{CZCgj@5%1~==g-4&=gCVnd0 zoz(zYkrQuwilJooh+Y%+yWW$kj*tSE@=cBEBHlu;Cm%MGajk;9x-Lo0?XsZ&Ds%I^ zdvr+2{=P<7y5^Q%R`%8MVtA)mj5sw@HI=1MJ?_(x(b7Nhusb`Pfo8H# zjOp80nnF7l{Qyt12(-9{VT00%38{trvAle$l&ky}&hgjtE#6#vi`FHUB~PPOU4;Bq zH{(XCy<8g8Kah1!Qp?8Z3_XbjQ{Cj9o7|+)3E5$=l<3s9?dqrs^5J!3W1PT{CE18t z=88*~PG`UJrv7kEweN{D6-}Xte-6!we!crj#cpe%-$WbFKIe*zZ**oX2d>qvRMx8f zwekICCB|xqxjIgxz-iTdBp$Iq{D|-JP^0)Rxh&nh(EMU(ZStpv6E&r-XGKH}5sc0ZWp*9SZX3$6TZ<`$FxW2+f;D)Xmf5Lv29>XE;qpl$kDEbR$;JKHZd z^@B1q_ARv(Y>jV*ufp9c66bU;8#pH?0x0hgaLjn`>O)KxG)>-Gbr>a}n>;eg6g8xM ziXBa+!Q5$l)J2SDl6&;yhsEx^SQ;A_lm7d1 zre0BV8}#oRwJ3&-c=#jBS*^sHGt0n?@xo(uRHU|z9%3RbZ{Zg&AF1Q;iQU4$Z(^q3 z)C?|9FCEI$w9<%5LZ;=3E+Z3~V*Jy$!2(SG?BA<#z1ZC#O`=mNsA$6)OjxlS;b0-p zc2G3t=pS}+G4*F%xPrE7Dg!*=x4E| zt~|b?UX>j7-;wJJR8<+MvaevQ1H6n}r=!Ixn-!sa9Hv>b-Q*F{Q3TOV5iD>j$$;5> z&ww5KmzF~N-p4TaZFJPwBOc>NI0)Gh%-X0FhoLp)Ey9y;D)SRT+;C}qe->I1Vih<8 ztz>BVU`lcgTH70g{`nl4?9pTdeJ;c}zsoab^U}mTvwX+Zf)-vG2nr1a-H?g8 zEr-d8Ni}VS1X}fmUy=6(+oOuTPcMr2{?OTWu`Ook#whx4-WKQO6+OCq1<#Xx4xLwo zj^$k0fJ`1x+%vkQw_8e)2P4yqx75O#b1^C#gvBb~;$GD|92L0?c)$BYe{5qwG2L1W zPNJ=<#Y@*J?7@JJ^PEVecua9fWP~z!AVaXVt1q43D4ItqZ2YN!2yrx&a{d-glm4Sx z@(`H(&(lzRj;Nk>vG+wn%FX{Nt_6^-J6}I={%!dlNPtJB5l}||GnGic&;gh1C32I0 z18{GU!LuwDi#Q+dui^VR;8NX>|0Qex*VttO0C5ZdWy1fj;SVX`lGX<*ir?WGF{BzX zz|uqamRlN z>grnAtv2IcY)^gq6K~jVA#p_e(1d3ed|f5aSfR?spHYwqS_d{KbI*KJ%g-AwPnZZ$ zo{A5w>)lT;usaBFiD3I)G1T|!>)I~DgEY207ho&(*H#&&$5|C!?n4ngvkeK&4(x-3 zLCVjxklR=jEnoxMLFVrbXvC1T&)%5qTS7l!Ii=98pck5&@vd>k<6HH(Q1OgY^*^mJ z!t_kM*bQ(+zul87yGY4B3b{SiI&dPz`cvjWka(>xm$ml^K2~YQINEr2>yQ?UITtZmL3CJ>j)_f^gNmp110)`2+<$Evr}ey07c{-CInW=25Mul@a*UD_~6IqRdUU%b=T}Smx$eB@n)7vw`A5z6@=fPyhL5>|9hccW(aPd{ z7sB8uHK%d8`#u~TZd-L{3pwBWE_{B{UNYGH;<%^Zg>VTb=GGVl ze|D+Ya+`6u+}6md(IIUuUXu%}liI#a5i{R!1cb#ceBPLlh&9KI zw$zXG8V>zio7x!;A;lYJ=22sQ^4iB#|NWBOs~X{@`}&8gK(u`mcN=UrA%;XF%{wlMZ6XwVDO zwY~h;5S!@fP&#T-?= zRHxqS9?)vLTu>*Rq3`bLtwnFUOfK;Lss2jReJ_qyzUI72tM2o{?d86?&ST zVe<{%p4Rx(^25D_`^?L+(rMDQsDv*%54N#Ow|#_Vqf11&m5-ls8B4)Y)bcLN4eHe9 z2uciA@+gti&D%W8i#)2mBpOk*7wIgSO%*?Zg>kxGQXj^N%qRK1Khu@^n+kOS6U5gH zn@)n~>(X3C5CMMMf`}HMF9wUM&PUZpocy;J>9~8<<;Hv`6_ZHc>y}{r&>#w&&F=#E z-`4bk9bo-pVxpSaM%+iY7(QF3m9zw*>?-N;^HyRa`(ADmX3byIuH0_S{tQ%bcVXsk zmU69kw$m>cwETJA&`JlKMT>a+7I!4Tv%Sw8I5c?UeO-Hh-GBd zW=xVjKmL;+%1CWDZOIm~%AZsSxQF|e@2bRa0S>Ior~&Ow|X*}Mk6 zdQ>O=$lPpp#(O~P3_n_^M=uUAqLxn^R<&v3jnZ#+a`MA03-CYb{KapV#8jY&yEZ~L z^jUTD^pFdmeRA1>WEi*`=PI7Hh<*4si(=^0ZjNqpwpb{GvE&cruFY*%j;FlKeoLr) zN>^seGJbyIi|*A8fAt>ZTtaiT(7Axj{drX_DeI!>ta(_Yh9fZxa`|hdNU>%~IHeAS zut8JvyZP!wx$*Vz_R_Iwr@kw0N>oWjc6(TP(sJ5rXEJ*_OxnS%@|>pcj3sZcc#Dc+X%$@tv4Y5^ezRu<4nO0MLz3mo5mc}n4S^Vnx#xJB_jmAXnJ`5J7 zbUvqy$J6nGECzB_T)iUy;-BUhaLnva$E9u&a^cWmBFkxirF3-7w}VrgKiGei_vfw7 zcS=6ns3+Q2oM=7vf>ppET!bnsoOk%po)WH3-6o(#$T}8n_`}v-%2`YDm!1454_3sm8CxUUA>;dFl&W1{@YNq^i z+w)!U*NaWVnj>=|qAhXQ)%i>-$a+$Ur);>LC=;G!eIyQNovbWmt|LEx#n-S}{V@mh z(fMx1=^GuhOn=U-!)i9z{LGpf^C49>MHKNgkJRd@MJ#FYGCsp|smtrrI(d@~4*!oB zrne*p0|-(Q@CIY;Hf6WvOXqDf_jCcsD%xOuSPdz5p(6p86O}4~xr~^c1HBMw2H6?( zUD;{*or&k8El15E^a6eX49smC_`(l}P65=k@%1;OIcKRY8}L|ULpeCRmZ3_Hq>O(w z)Dj`s;vNSG5YSye^jNp*3X_7pO_AO=o@mutjT`CbF5Xe!in|lG^M8RjSNa=}RxRL} zq;##T$7$Su`G;NxTaaE}Fgp9c!0QM-XwsTk^+Q>71O+IjIIj=d7~hE^9(i!}2nYJu zk5_DgwtFZGP(EDD@Ml#IL(0}jNhKSUSu@eUvdWN~_s{FaZ#7v@(k!=Dm%Dd!Ifo-I zv|c~LG51B@tX+9>wrI%{H|V*NJlQWyM6SRHzqCPgpja0B%&sLrzA;ht&--BeE@g%K z7H@8o1YW;i@OzVFS5xjZS};p4u@B)Xe=lh@!5)9&{zn6yY%i%Aof zKQLY51s~h349+}ahL(HWhL3-eH@cFeo=mg49W+uRG#)*8PEF1YzRc=pBI>7+7O-5f z)X0 zK~TLx`ra-3;FVRRJJU|(oz+GrPQ@hJmsy)Tl!uT}M_zPzuRgh{XTlOTlR{2sfQM?? zteW-kC9=`DoEI;8RKhE>z<-WbL>=z*M{zNGGKLM8UjJ8H{d@G7IH$9&@*4sA(=O0E zSv%36PZ--T48-P$x$rYiV`RULya=P$!mHu=EuiW6Gs*6oh=dMZu4O5vjI6UpbesLA zi{s39MYEd7YcH=~@GSQy5NS{Qrzqz+Ds>L<;zxcWW+k<}FCHIViLf#uuFnW9XsX6A z3S`D>a4}D0+)c3m)ay*8$Tswbf!F3@t9I||D%LNj=?0gVdc9~FNg;1P_j4mb_ODhH zRvTU|Znn8B4hK zilv7LSZ~%jsl4yWt-e%y!1!-v(pMJxLZ16v`NEB>x{;;e1%a5Mh*?GgHWjLcbE4OG z_m2E7%B9AC7csgopvlbCu4;}paC_q9FX~}Y4ZF|8CZXwcVlKe?0`tqzdK8E19sWv` z;flr}rJCTsmFMVWKr&Zb->Usn#R5cTARhV4jUq>*_MgZs^r)hhfpwT#PbuWj^In3C z6IgUjdekWY^X@DHSM?59I~CVYCI2&^d=T@1#A0G<6!`yA^3VW<3gC<~!mcCuYwa`% zxL!Vg`YV80f&nb@ z=&U*aqV^O4hm*gRTl&|I{y%@Rd^-Vs(XdwZ?;WFvPXCWP#^7{#{*S>3dM)K(Us)K( zf#?5k$N>Y-7YFKwgON%5>#U_g&)QoJtG~_~67VZ^n7rY?4pj~~k#l*a;D5(O_6y)w zj4(g{lRo?JqpR-?a4{`^s%ZTCk7LkPJPwRm^}j>KFb=o^TxP|L|GbGmLpO!4;*or6 z{$zK7G4>X?C}}lQiU0m%4X}zYc_A|Y*MOa)0tSZMy!rco2d6r)il2rhv%>jD0s#41 zLa*iH9jwnW86>sq@n(NO4EkuM1I$r<(dAb4_Ek}2^fJkO>QBmdmy!z9R^71+$ z%IJ;k=H{lNsHiI`Dfy`U@uPlVV6pS{oH=#z@#LRdOr(G;T2)JHDbGvAz~#q}A0<^) zKS6RmJw4iv=_ss_{n!`eBel1Ee5Ck;T!fQ zuDX|K9A@RW5jtae@`|QS%rE}3T6=4^+dmmUPWDf zH&D&bK(_IfuN1NCOrz7@)}G8Ko|?EL2^BLpTzY5yNUlows{xI}3E|kQdnrJl3>$o z#azB~D5+K*LEB0;o;X&(SI-aya?IedU(aA-wPy<`l{yU zW|ZL8)3WzTd`F2$-j_h8(B}N0o~X7=Fs)Vk3UQtOw%-{}&EF-H6VhyMbvPkvAL*Iac8OonzrENR>}nOE`oY1Gs6k+G^cVi`tElXLm*b)T^ji=~*$L3(mt ztgV>+nk2s*U!UsxgA#F1C>W#Iyq>=A{=i`b8;xkp0DzyDHE*cC{1?gv+$yFBuxc6a zo-5#x56Qk{cU9yj9}!5}iDI$9FdQM=ipORSz}q8O6ayLWZ_nIyHZyWREm=8~akMFX zJ`x(#TdY|=o(N!C+YKxchDlFQ-J(z7nbS%=rNG+<>Gc^F;k3pTLuzIJFBZ*K; z3z-U0o8xLKu^wd7TCButY9{vSAFu()Hy-N!rX1?KH%h@VuBi^!WT75P#rF%BVAKAP zAJk|bNIuXkc}ba7YJ5{TuJS2A=ihrgI{Lq6B^EmN39w;5#@=$1YPIn_6?jk*dk{_F zGG3VveVZ|))YzTliEXX8A3|@ez1q+LTZz3T?e|mqk0=C$+!I6~J@_wg17H{Uw4~k> z=Vy3uvsH7*!%0a_YT}*>oGiY#DiDvXWqu?7PAh-mBocw7@&Hu`;>@$jgBx3FLw7Wt z`&(s)Z-#pd2&J+_ivBf!Taj0oj|!VhhEZ*^cUbZPwg;^Lq;Y|K*h%&2|2KAxbZ_!+ z>{@43qgjDPdFG?L>n7$NAtmNuRcpK4O68n_m*L&xx~lU;kI4d8nw40kvC2`vENOZ3 z2#ME))?Hhhma*#NsjRSWJFfi?23g&O8l^Z{dba*XYU@2Ew?*M^4a-|D)!o-asa5DM$HdWY4DbGz;C9(y zd0|~4YPQ&H<~n?u;k-@@lRS!V;ke?w*fmY}TTfVE&Bgh~M!uqdMYh^R$7_M^i*s$) z<-*{h`@Nd`O&G277z+0+ZrCD>f8pJ5sGyYRM;k{cJGCO^#*Sy_b+x1S(Acl%`MC5Y z5H$aMwA^Af%sEp7Xtp-5txeMHg5)yzrci~hbpfW(Mk-&zCh>P@igcxMT#8U_G*eKO z?&kh%^v($|#`xN}|A(`~ zyMy5?p-M;&hWkNLlI2oFF9)Vx>k9(Wybs={W1cv?zEW8e*d~Y#fW2m6`O6^j`*hZh z1Au>L1E9dHE#I%SdbaR{y<(I=fd#u?9RiMtf}Vl(xA*_QDRYG`Y#FDa1MRy*?4vaR z49zuvINc_)Tp_EzgP1#FmnPElL_j(1 zEJ+b@(AmW=!mpIVt@3yRdutr*G0#8D=vdzb=5y&?ily<~dDeO7q7d-TA71z7UoIn% z&SgE_C=3?!%?>-@l(r8~R%#|!CeE8-(lans&a=#Bn<@Wv=^h3wNd%b2=b?{l`0hYX z_Ws_iAoI%)Ete%H?c|T+uah+O0cTh#`XNe?BGhwuKk+JOox$>`FiTd(1Na#dFb5&D zu}rf9r?fQ)19mAcy-v8h9%e7Sx+P}~De0Rx`tvx($jC2A`k@>Et0Fq;%U^s_@h8vq z+I^luoMdM+VkR^Pf!i~6<+3{KVW@!I@Q0GiqFwM6m;^v8rI?FdKwpkUrV)WPN9`u> z2C1Ew6Xr z>eLKV2h5dehO!78xyJDAqZE_OlZ7bWEj<3sXmNd`D4|=^jliotDCPm`8Sz>Gl>7s= zlVm!vEasN;*ejB%7?v#nV0aif1l(n~#l@URHCI3Y`c~^WFAyCZ{vRLR!!0pzu=yU` zBba`%EVIXJT`1qCKGNJ(_L77JYAFB_S^nep=LW%z0B8?SoBGXleiV??HL)aIM__*0 z;3AOWd(3RLwOxK3(+W5UymUHqhlG18D@oUu02gM#947I43WVTY#n{J%fczC8Up|`| zV%(e#U>M`P4=pUkV_%ffk5JAy*9af~y4|*+O+AuvdkSHjaSTOM{-_PRC7C;@#a^J2eO__1;nJA#C8@H~n-xSeh; ziq~uBN4@B&NX38WJ>=sywh;t}0?$thz(*)$r8vC$1QkcfRaNnisnQojF0u3`~fg9JpVo z`#ZUO8-E$sT6M)6%V1HwM zs&Shh8DkJc&g69(m&LIVsJH+?BrFgStewxp2#O+?`MQl2`cgY<$O?-dOs&OoTqub~{yW3E&dF+K!z8zu!FIv+0^i5E7?} zdnC1Oe>M!JY}E6U-U47>A))Mv==LX4-lKebCCMxzh^ubmECK-SV)*L>iRVl1BiHZ4 zucTY^Cb;}npjq2{T_D5nq`n@W&MzPm;w0wR0UA2rK=Zy9-%oG9YkPVq$EA!1@Fpkg z2+kcc2qJjosjQFM*Mt9#%B`9iJ^FjKBr^pZIJAm+az z)Nrq9GHbkin1I#%Rf8Gc3PI|wV0^@6MhZfFw|TM(-%p>AVcYp~xjFzBmD~xyIO2U< zb?ur6kS50jd?#T1JRdtsNt#E%$$7PmAt6p-QS^kUsNI3M9ornWhEB;H%n0i07E^Oo1ZO4XGEA8Mt*~aZl zU_7U_xx?`Y3xLwoRd1i^NRW{$-M%9QZH7L=tM7-uf(lpwt{KWYv=(l#1AXi;5UGz$ zL(@muAhmxSM_Ci}dO#x;T6_{85xVcRIrXdWrDIfmx3~#1LNDDSMLkyWN8(pGuZgwR z+Ml|ax=dTi(j`2oYeOOB>o#un@W<4QP-*ONc3#*!n#-`(ZO5VJVU}BNJD7fr0>P@T zMHv(?Ze1^A*pNwcA5Wd8^4i`K7ea-gP~&l{S${qWN+KIaF#()lr)y-^x&h62YDs;^ z`bIyGPhXIS&a6WLl&q3Hd2i!9@K{@|ZWU+VfW8Ih)jIOG=eTh4$MIDt){OYuAYYj*d_*4>@j~(- zUK}Z1gd;BDcEsXS?l3zmG6<-qV`6X>cej%s&#SO9Qh;l|;~4q$=(!Qd^*$L%c;`AV z>c7*X6Kt_odW=%H@advqLuD)AM$V*N4g%;xqruD|UDsa3o9ML8Fv6GI*w!Mh7V`H~ zPd5)Lr$X7^(m&EW@zN-1drrK*W(E^b`+aXP;|4eF5)eLJV}cW#D#y8=BJf!!;jQXg zE{HB1+|MedJu;32uYNFU)z5wn``WTY`6;!nipye4@{IqD8xlDuR~!;nxF(wb>q^)1>V>D9_6)>uA&kJ|n-^{q__>drM3__g%xnXDJd zQa7_jYp=q$3gCf8$ZTD5|2%?w^+$2pDGBD*BHwN|W(gAeMH835$Y8<4ufysV=UIrh z+nu=k>Ti>S=`iLBr1JY>PhO|*2h|(Sm!nAD7QI<6l?nCZiQMT|8vOTlxU<|VBb7_7 zbt%LimnoNbNX)e>S;r29oR%_iFb)IAPZE{{D0Sf~24$S{HvRSAZ2cwUy@08ta{d0a z?f!J|!Noq^+V-qOk6gOfTP=_q9ycJ()X_yu#Hw}`KXkf_ulwUUglH*pR*D59V0uzRN9&3Gs-ZSL*!s9Eh_baf%Kl*69I!|gHQ4!5z zi~nOv@jb%$59Rd-fXC*g6P08KybwOzU zVIJ**(IvUTN^Wgf+j_Zze)KUx@cjHt<+t_i(c_gf{eTPkc<1+kJ85m#p2Nq5EUP_~ znYxz>ix#yPPF(IMADa#zr7bgJDEE_qTo+YyND|YG4uigEBxk+O^*JvwrGP(=!7JFH zr;P?Oj($XL23Le*E{PU`-;*srjB>a?TW88f_^egR7`t*D>%!UK4VHA}kS|<6{1#r{ z2LR5;XEQxWwD!|@pp%Cq?-gpd4bipx-Y{M~cwph<`uRL7U?c|zyR-BqciFpz8p5)k z9o9T`RDJk0EY4&Ip_^v&F*sHsSdp@3@S^j}XWM13n?W7O5y2fvnX-gZ^NSO#Hlf=L zQoJ>f0E-u+S5Od7`LoO&-(FnQih_*xi~ybdLP}z&og1;>9xu(>vR4-(5gsS;SmSKk+VWoT ze7b%g$Kv1=Jq)qd!`eBeyT80u=jIIFbKt|-GU)8;mZ%}eMPMC_*ap_E7gM&m?~U|+ zU1$)v_)`e6x%M796Fei3?5faZt@AU-25qFzj(+(}G2cpS( z0=U#`(bva6tUOj?HuGC zc&4I+jQBY($9vpNQjTdlL($_jF#~weLu`AIWFJlYSdmFab|xunt|pZf+>ThaTgX5+ zzL45(-i=#Cy}6x}lMNq>xBn@IWcZ3m37Xt*jG|DvDzE###?)+c0FL`*aXgWfQyOd_Rss|n)aK?WPN=qEwFF|=IA1Cln2vepX( z02Vm}tD98235lt`eY@+#wV15=V{Mq?x=rAR2+b$g6vVw4OH$4NEE3hzfmQ!rO!BWW zBt9LHynWZAUF~pqWT*AhVmop6$Q0yBarWVbn>NfLI^Y7fGHfpy+fo(<;$_AWi{y9y z>Ffe|h&)n;K?b=a6%px5Ug35^Cy|sya|qgc@$>@MdOa?;Sfl>8$2e@K@g1z2ycF_A z&;n0%F*H!JA%!WSOd---|G*lzL%xFEoDiEvnQi?aX(qdk1rQ%rTsl z{XDIMFk}n>h|D0BlYQ^xeeE3`>W0ofG;wLe{ekV9qCHYqtpu?&u~R&*plr3M_M6V| znE3E$T-J)w0@Xr9P%-)( zo(jtq+3|N^)~F=ZITkTfJDPk<{F^ajV^6#S5acj3Me*Ru3AMR)Up3HC4Y4z}Z}!J| zro<@-&4HKPsOg=!FLmYWBo;LvpDO0Pne5jRi#7XBfoew9UA`dXOMRM}r>B40Z|+9h zx$-FCfy))oUSn=7=gpwiuGB$`4Sv6h`G;E_ut{%M|k7j_N>Xov-5=3-jEJt%6D7a}h^dF5+Kwb`5L*KR`+jZoRe zzRH%0Mp7)Rcu`3pph*nYIrAznj5q3b)}mv-9zQ5b)I)O-kSYoXMssE;PrySx(`s17 zTPLQXuuFA^=5sU~ob{LD@#KCtdXj0b4S0QV1BL$JhRZl&QYSmjqT9EGqKM@KoXNX* zwf_n1R=p+LSPxG_emZ`Gv`03StVFw+86D?W;8TG-NM6%1jLi%eH_nz~+{aJ;sk5uP zKk0|F(H9ic)QOipbLa1}hX4=A(n-tNc<*IL0cJ@trt?BWzln4SYxfc&0AH7JvnH{$ zyTWv#RIAkcHh4tKY;}5F`nfoNN|a1Hy)@F`x~%rCH9kdz2PYi9_tjc3d?xRIYt16J zaBNH?JXiuKAte&a)wYHAT_b%AVnp|`s8S(eIz!_DM&J{q3;|qwwa#)wjF6@VGop8c zY0W00>5@N?rruoVIZ9Z)ra@O>l|;aK$LzqJ^X`hK5cKiYuk(g4fWlTva%lcvxis4o z3g!*uO+a+3H4I=n3153_@WvJnR}a6FDuh((d(3J&&0M-OPLs~@LlEkTHak3=tH!sB z)K;!W1gfU!iK<5RVmqgq>881-r6Hpihr(}?jJ`%-a8pXDiN>UvKNnVu){~n$NeIrY z#!;AW#%C{W8f-J8g{$?j@ia_^(UUF1_d>2Q{$w14_I~RBv@SsX2e6eq7$iQjLWtiY zWeE;=RMReY77E^G=l|le_-HfiX=3L$L|jAq?YB^jk=|bH4bq}vO~gx+)loxX<+^_~ zB9U#XXr4;C=blFAc|m`9OKe(vDByl~MGsEJEAXHW&^eQpAjTG(@q$BN zsPHDK$JJQ|vJ`99%n~e4KCk)LXbkebB#Y*>gLGg_Q&kGb!A3Mb)Sy~-zg~ZdL{b^u z9)&QZu{mLb)W~o;SDy}YNDG|Wf4?-ih*;$)Rx20r`yZqfAW~6AJK5o&1}w5*)ScMp6ZGH@6x?F}DPsyxw4n>3sYU>!o8w+opJm&w>C4NJZ#^KM;bLp21 z3pRaOe^&mNY3$mVtjjTH+CL`$_*CtJstYDsSSgzYD_Aaotrq$ttQNpd27BFLPyI7e z&$rg6!y5hN)y^4P(?gj>7Xt2$O^uBe<_#)W$CV>xqn5gP&miz;Gf#VLL+8J|5Bo#9 zXznfwvX-*6H1gdZuBFzqLVW-Jz_W~%LQ)`dnRqeGk1@4E-tErh8dSU4L)=M}D2eBLa;n zud3UqU+B;O{z&5OphHsNL&tkmsGmGiNQ07vWZpZX_(ynKbVo4`eQDF1D)ZtfcMZo2 z`RhXy=1XFfoocaonqBi_nXiqf{O@B4@r~>h;TYjFZ&=r*gs1rP`N9vM zV>i8^$}_^OPxj}Noy!7>sE$-GJ#rs)@#*pX*pf9=T*4YI^WNp2!ND%YP4 zkm+aF8ITc}w0H(?-2eM+6!3hno{#hF75@6_AMy7l4)8)CYBoA+JZ*n}-~VfNnUD4O z>2c-Bq3!9>JwsvUX%-4LZ2&qKcsHQ1fPq{QZ=Jl$$~^!Ah6+71OI;xk(#R6Xj%4uj z*6A%kr=vpvm+L4^WEa4H+DEwr1&{*S>e5e>0PfMq8t8N31k|8E?mpynLUF~y-aup< zSDDe1)Tk%f8Gx*Arl_39aahaGPeuK%GLR?rI2LsQ;`;SE-Ve1ulYurs&s_i!h1ZsF z%?7zWH_fstRKqyMXi?pwbV{YB`R=gEIzK_h9ta3q{j{M$SnU9c&Ap7kvh@&3F5bPU z!8BY1*3!Eq-uEY+-z1lrBt9%*vqS^z$+v*8Fw+1?3&A!@IyrjpRbPa~hpQExiDmlo=JmTMR1p;QFT*{n2dOW$H=&W_Ljc+8+t>`y9b2-O z%nCBh5BuG>=DvuGJ^`xGg+S(QI3x#Lly_!)88_|Lbo+L%sUQiEz}yajxV1e{`e^}p zkSFiZaHXGh1nao~gxDmnvO1N3RyzSjc_hY~=ro}1%L1RW1fF`vEbV(t%xt15Y*`$--nl;Cdb)1!!x1C4j+sXDd z4r5BS0?)zIsdfNC@?VjFY~by7f6`lU`s_4_kB3D`o;RPws{aJYo?aY4n+LtUgZ7Z% z9vR`=W8elZF7>YrM|%K*+Jr8J*8$}nXK?I;!)vV|b3nOz52YH|)n50w>LIo;aS*g= z5)=-5@zoCK2y{+jr(sOO|63Uk&%TfR!2_PS#)Ab9ji3uzBnCq=4XA!TIO#l`0Xb(k z%^`uaAt2;_X~9pRXb&WJ^9jAK*IM)vxqQ9_5e%TCJON6^B28|1tV+IgJQP%Q2*`}( zb~qtbivX(=^jq131uCS1kZ!!D!NejoPj=6qYI;gSLyt~ZY`0x@2^?cuff~k zVacT-(%d4Y?!RRL3dwhC?PwW@JQ@=00BzvjG(Dd|*G(?*)OL;niwqX`4ewU6!QudY z`TmA|7rp1WXpwvKjKs)xgP=G1kYao_o;261$x9M zV;EizfatBgPRyMvH&4S)nhewI2}DT)wJ>9J57l^b?t$-=on8eF&KcSfEXuynZY}C! z;Q1kx>0Q(y9-iXGfl5I);2NPz?gPlw zkF{VJMKgZM*g$AVA%=FJKiK1m}#KmLS4iH_8j3N}` zj)G}zBXX-BntN}E9Ei;FVg$-}@FnlNr90#1$0`|YidzM@hF7NF^P3DEx9xm(sJbS1 zBI|x>l|NPMS@8gAEbzT1&qLT1Q&^=$!Bb5vF{a0ywd*Bbq6lMHf0Jg(RtErAn}B{J zBS{8@3BFK#H54Xn^kaIGHa4F#VXr>g&iKa1X?)(45qg?Zr|sTVZ(7Uscr%G*8VjzP z8Gazy9M(A>JUiDE%Q6cm9Q^j4gG$Ug~_!gqWhRA%^{hnfM4+tr> zxaM^H8{zC8@n_KdaJ`uAvk6)D2!5dbnWr`!uO=)7c?tcyckR=t3(vkJp8o!xHgW*W z)Ybr8`fO@eMYqYvE|PQlv(U$!?YTzi1ib_ZDrFSh-5~MnGrE{+U}78=u3mCpxN%zn z${W@|UmZt1LJiBxKyJ%^|IP*&t_4f>I^b;FIppw2h;xt

>`+BXz2Bc=w4@RKcQ% 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�y$+k`CZWD+*`7{@^56{rxI4nG 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

s492ubt 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 diff --git a/chat-sample/vscode.proposed.chatParticipantAdditions.d.ts b/chat-sample/vscode.proposed.chatParticipantAdditions.d.ts deleted file mode 100644 index b6eba7e9..00000000 --- a/chat-sample/vscode.proposed.chatParticipantAdditions.d.ts +++ /dev/null @@ -1,366 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - export interface ChatParticipant { - onDidPerformAction: Event; - } - - /** - * Now only used for the "intent detection" API below - */ - export interface ChatCommand { - readonly name: string; - readonly description: string; - } - - export class ChatResponseDetectedParticipantPart { - participant: string; - // TODO@API validate this against statically-declared slash commands? - command?: ChatCommand; - constructor(participant: string, command?: ChatCommand); - } - - export interface ChatVulnerability { - title: string; - description: string; - // id: string; // Later we will need to be able to link these across multiple content chunks. - } - - export class ChatResponseMarkdownWithVulnerabilitiesPart { - value: MarkdownString; - vulnerabilities: ChatVulnerability[]; - constructor(value: string | MarkdownString, vulnerabilities: ChatVulnerability[]); - } - - export class ChatResponseCodeblockUriPart { - value: Uri; - constructor(value: Uri); - } - - /** - * Displays a {@link Command command} as a button in the chat response. - */ - export interface ChatCommandButton { - command: Command; - } - - export interface ChatDocumentContext { - uri: Uri; - version: number; - ranges: Range[]; - } - - export class ChatResponseTextEditPart { - uri: Uri; - edits: TextEdit[]; - constructor(uri: Uri, edits: TextEdit | TextEdit[]); - } - - export class ChatResponseConfirmationPart { - title: string; - message: string; - data: any; - buttons?: string[]; - constructor(title: string, message: string, data: any, buttons?: string[]); - } - - export class ChatResponseCodeCitationPart { - value: Uri; - license: string; - snippet: string; - constructor(value: Uri, license: string, snippet: string); - } - - export type ExtendedChatResponsePart = ChatResponsePart | ChatResponseTextEditPart | ChatResponseDetectedParticipantPart | ChatResponseConfirmationPart | ChatResponseCodeCitationPart | ChatResponseReferencePart2 | ChatResponseMovePart; - - export class ChatResponseWarningPart { - value: MarkdownString; - constructor(value: string | MarkdownString); - } - - export class ChatResponseProgressPart2 extends ChatResponseProgressPart { - value: string; - task?: (progress: Progress) => Thenable; - constructor(value: string, task?: (progress: Progress) => Thenable); - } - - export class ChatResponseReferencePart2 { - /** - * The reference target. - */ - value: Uri | Location | { variableName: string; value?: Uri | Location } | string; - - /** - * The icon for the reference. - */ - iconPath?: Uri | ThemeIcon | { - /** - * The icon path for the light theme. - */ - light: Uri; - /** - * The icon path for the dark theme. - */ - dark: Uri; - }; - options?: { status?: { description: string; kind: ChatResponseReferencePartStatusKind } }; - - /** - * Create a new ChatResponseReferencePart. - * @param value A uri or location - * @param iconPath Icon for the reference shown in UI - */ - constructor(value: Uri | Location | { variableName: string; value?: Uri | Location } | string, iconPath?: Uri | ThemeIcon | { - /** - * The icon path for the light theme. - */ - light: Uri; - /** - * The icon path for the dark theme. - */ - dark: Uri; - }, options?: { status?: { description: string; kind: ChatResponseReferencePartStatusKind } }); - } - - export class ChatResponseMovePart { - - readonly uri: Uri; - readonly range: Range; - - constructor(uri: Uri, range: Range); - } - - // Extended to add `SymbolInformation`. Would also be added to `constructor`. - export interface ChatResponseAnchorPart { - /** - * The target of this anchor. - * - * If this is a {@linkcode Uri} or {@linkcode Location}, this is rendered as a normal link. - * - * If this is a {@linkcode SymbolInformation}, this is rendered as a symbol link. - */ - value2: Uri | Location | SymbolInformation; - } - - export interface ChatResponseStream { - - /** - * Push a progress part to this stream. Short-hand for - * `push(new ChatResponseProgressPart(value))`. - * - * @param value A progress message - * @param task If provided, a task to run while the progress is displayed. When the Thenable resolves, the progress will be marked complete in the UI, and the progress message will be updated to the resolved string if one is specified. - * @returns This stream. - */ - progress(value: string, task?: (progress: Progress) => Thenable): void; - - textEdit(target: Uri, edits: TextEdit | TextEdit[]): void; - markdownWithVulnerabilities(value: string | MarkdownString, vulnerabilities: ChatVulnerability[]): void; - codeblockUri(uri: Uri): void; - detectedParticipant(participant: string, command?: ChatCommand): void; - push(part: ChatResponsePart | ChatResponseTextEditPart | ChatResponseDetectedParticipantPart | ChatResponseWarningPart | ChatResponseProgressPart2): void; - - /** - * Show an inline message in the chat view asking the user to confirm an action. - * Multiple confirmations may be shown per response. The UI might show "Accept All" / "Reject All" actions. - * @param title The title of the confirmation entry - * @param message An extra message to display to the user - * @param data An arbitrary JSON-stringifiable object that will be included in the ChatRequest when - * the confirmation is accepted or rejected - * TODO@API should this be MarkdownString? - * TODO@API should actually be a more generic function that takes an array of buttons - */ - confirmation(title: string, message: string, data: any, buttons?: string[]): void; - - /** - * Push a warning to this stream. Short-hand for - * `push(new ChatResponseWarningPart(message))`. - * - * @param message A warning message - * @returns This stream. - */ - warning(message: string | MarkdownString): void; - - reference(value: Uri | Location | { variableName: string; value?: Uri | Location }, iconPath?: Uri | ThemeIcon | { light: Uri; dark: Uri }): void; - - reference2(value: Uri | Location | string | { variableName: string; value?: Uri | Location }, iconPath?: Uri | ThemeIcon | { light: Uri; dark: Uri }, options?: { status?: { description: string; kind: ChatResponseReferencePartStatusKind } }): void; - - codeCitation(value: Uri, license: string, snippet: string): void; - - push(part: ExtendedChatResponsePart): void; - } - - export enum ChatResponseReferencePartStatusKind { - Complete = 1, - Partial = 2, - Omitted = 3 - } - - /** - * Does this piggy-back on the existing ChatRequest, or is it a different type of request entirely? - * Does it show up in history? - */ - export interface ChatRequest { - /** - * The `data` for any confirmations that were accepted - */ - acceptedConfirmationData?: any[]; - - /** - * The `data` for any confirmations that were rejected - */ - rejectedConfirmationData?: any[]; - - userSelectedModel?: LanguageModelChat; - } - - // TODO@API fit this into the stream - export interface ChatUsedContext { - documents: ChatDocumentContext[]; - } - - export interface ChatParticipant { - /** - * Provide a set of variables that can only be used with this participant. - */ - participantVariableProvider?: { provider: ChatParticipantCompletionItemProvider; triggerCharacters: string[] }; - } - - export interface ChatParticipantCompletionItemProvider { - provideCompletionItems(query: string, token: CancellationToken): ProviderResult; - } - - export class ChatCompletionItem { - id: string; - label: string | CompletionItemLabel; - values: ChatVariableValue[]; - fullName?: string; - icon?: ThemeIcon; - insertText?: string; - detail?: string; - documentation?: string | MarkdownString; - command?: Command; - - constructor(id: string, label: string | CompletionItemLabel, values: ChatVariableValue[]); - } - - export type ChatExtendedRequestHandler = (request: ChatRequest, context: ChatContext, response: ChatResponseStream, token: CancellationToken) => ProviderResult; - - export interface ChatResult { - nextQuestion?: { - prompt: string; - participant?: string; - command?: string; - }; - } - - export namespace chat { - /** - * Create a chat participant with the extended progress type - */ - export function createChatParticipant(id: string, handler: ChatExtendedRequestHandler): ChatParticipant; - - export function registerChatParticipantDetectionProvider(participantDetectionProvider: ChatParticipantDetectionProvider): Disposable; - } - - export interface ChatParticipantMetadata { - participant: string; - command?: string; - disambiguation: { category: string; description: string; examples: string[] }[]; - } - - export interface ChatParticipantDetectionResult { - participant: string; - command?: string; - } - - export interface ChatParticipantDetectionProvider { - provideParticipantDetection(chatRequest: ChatRequest, context: ChatContext, options: { participants?: ChatParticipantMetadata[]; location: ChatLocation }, token: CancellationToken): ProviderResult; - } - - /* - * User action events - */ - - export enum ChatCopyKind { - // Keyboard shortcut or context menu - Action = 1, - Toolbar = 2 - } - - export interface ChatCopyAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'copy'; - codeBlockIndex: number; - copyKind: ChatCopyKind; - copiedCharacters: number; - totalCharacters: number; - copiedText: string; - } - - export interface ChatInsertAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'insert'; - codeBlockIndex: number; - totalCharacters: number; - newFile?: boolean; - } - - export interface ChatApplyAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'apply'; - codeBlockIndex: number; - totalCharacters: number; - newFile?: boolean; - codeMapper?: string; - } - - export interface ChatTerminalAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'runInTerminal'; - codeBlockIndex: number; - languageId?: string; - } - - export interface ChatCommandAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'command'; - commandButton: ChatCommandButton; - } - - export interface ChatFollowupAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'followUp'; - followup: ChatFollowup; - } - - export interface ChatBugReportAction { - // eslint-disable-next-line local/vscode-dts-string-type-literals - kind: 'bug'; - } - - export interface ChatEditorAction { - kind: 'editor'; - accepted: boolean; - } - - export interface ChatUserActionEvent { - readonly result: ChatResult; - readonly action: ChatCopyAction | ChatInsertAction | ChatApplyAction | ChatTerminalAction | ChatCommandAction | ChatFollowupAction | ChatBugReportAction | ChatEditorAction; - } - - export interface ChatPromptReference { - /** - * TODO Needed for now to drive the variableName-type reference, but probably both of these should go away in the future. - */ - readonly name: string; - } - - export interface ChatResultFeedback { - readonly unhelpfulReason?: string; - } -} diff --git a/chat-sample/.eslintrc.json b/chat-tools-sample/.eslintrc.json similarity index 100% rename from chat-sample/.eslintrc.json rename to chat-tools-sample/.eslintrc.json diff --git a/chat-tools-sample/.vscode/launch.json b/chat-tools-sample/.vscode/launch.json new file mode 100644 index 00000000..c3e647c7 --- /dev/null +++ b/chat-tools-sample/.vscode/launch.json @@ -0,0 +1,31 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js", + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "tasks: watch-tests" + } + ] +} \ No newline at end of file diff --git a/chat-tools-sample/.vscode/tasks.json b/chat-tools-sample/.vscode/tasks.json new file mode 100644 index 00000000..ee70aab3 --- /dev/null +++ b/chat-tools-sample/.vscode/tasks.json @@ -0,0 +1,38 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/chat-tools-sample/README.md b/chat-tools-sample/README.md new file mode 100644 index 00000000..8c2a122b --- /dev/null +++ b/chat-tools-sample/README.md @@ -0,0 +1,21 @@ +# Chat Tools Example + +This sample shows + +- How to create LanguageModelTools. +- How to write a participant that calls tools via a LanguageModelChat. + +## Running the Sample + +- Run `npm install` in terminal to install dependencies +- Run the `Run Extension` target in the Debug View. This will: + - Start a task `npm: watch` to compile the code + - Run the extension in a new VS Code window + +## TODO +- Read files from references +- Tools + - Something to collect some vscode window context (tab count) + - Something that has a side effect and confirmation- run in terminal? + - Something that returns a large amount of data and uses Prompt-TSX and references- findFiles +- Use prompt-tsx for main prompt \ No newline at end of file diff --git a/chat-sample/cat.jpeg b/chat-tools-sample/cat.jpeg similarity index 100% rename from chat-sample/cat.jpeg rename to chat-tools-sample/cat.jpeg diff --git a/chat-sample/package-lock.json b/chat-tools-sample/package-lock.json similarity index 100% rename from chat-sample/package-lock.json rename to chat-tools-sample/package-lock.json diff --git a/chat-sample/package.json b/chat-tools-sample/package.json similarity index 72% rename from chat-sample/package.json rename to chat-tools-sample/package.json index fb3a97d5..2fff36bf 100644 --- a/chat-sample/package.json +++ b/chat-tools-sample/package.json @@ -1,8 +1,8 @@ { - "name": "chat-sample", + "name": "chat-tool-sample", "publisher": "vscode-samples", - "displayName": "Copilot Chat Sample", - "description": "Sample chat extension, a trusty cat tutor that will can teach you computer science topics.", + "displayName": "Copilot Chat Tools Sample", + "description": "Sample chat extension that registers and uses LanguageModelTools", "repository": { "type": "git", "url": "https://github.com/Microsoft/vscode-extension-samples" @@ -17,14 +17,12 @@ ], "activationEvents": [], "enabledApiProposals": [ - "chatVariableResolver", - "chatParticipantAdditions", "lmTools" ], "contributes": { "chatParticipants": [ { - "id": "chat-sample.tools", + "id": "chat-tools-sample.tools", "fullName": "Tool User", "name": "tools", "description": "I use tools", @@ -34,6 +32,7 @@ ], "languageModelTools": [ { + "tags": ["editors", "chat-sample"], "id": "chat-sample_tabCount", "name": "tabCount", "displayName": "Tab Count", @@ -54,19 +53,6 @@ "text/plain" ], "requiresConfirmation": true - }, - { - "id": "chat-sample_catVoice", - "name": "catVoice", - "displayName": "Cat Voice", - "modelDescription": "Speak in a cat voice", - "userDescription": "Speak in a cat voice", - "icon": "$(files)", - "canBeInvokedManually": true, - "supportedContentTypes": [ - "text/plain", - "application/vnd.codechat.prompt+json.1" - ] } ] }, diff --git a/chat-sample/src/extension.ts b/chat-tools-sample/src/extension.ts similarity index 57% rename from chat-sample/src/extension.ts rename to chat-tools-sample/src/extension.ts index bd492d40..67e7b24a 100644 --- a/chat-sample/src/extension.ts +++ b/chat-tools-sample/src/extension.ts @@ -8,27 +8,11 @@ export function activate(context: vscode.ExtensionContext) { } function registerChatTool(context: vscode.ExtensionContext) { - context.subscriptions.push(vscode.lm.registerTool('chat-sample_catVoice', { - async invoke(options, token) { - const result: vscode.LanguageModelToolResult = {}; - if (options.requestedContentTypes.includes(promptTsxContentType)) { - result[promptTsxContentType] = await renderElementJSON(CatVoiceToolResult, {}, options.tokenOptions, token); - } - - if (options.requestedContentTypes.includes('text/plain')) { - result['text/plain'] = 'Reply in the voice of a cat! Use cat analogies when appropriate.'; - } - - return result; - }, - provideToolInvocationMessage: async () => 'Speaking in the voice of a cat', - })); - interface ITabCountParameters { tabGroup?: number; } - context.subscriptions.push(vscode.lm.registerTool('chat-sample_tabCount', { + context.subscriptions.push(vscode.lm.registerTool('chat-sample_tabCount', { async invoke(options, token) { await new Promise(resolve => setTimeout(resolve, 5000)); const params = options.parameters as ITabCountParameters; @@ -41,14 +25,17 @@ function registerChatTool(context: vscode.ExtensionContext) { return { 'text/plain': `There are ${group.tabs.length} tabs open.` }; } }, - provideToolInvocationMessage: async () => 'Counting the number of tabs', - provideToolConfirmationMessages: async (options) => { - const params = options.parameters as ITabCountParameters; - return { - title: 'Count the number of open tabs', - message: new vscode.MarkdownString(`${options.participantName} will count the number of open tabs` + (params.tabGroup !== undefined ? ` in tab group ${params.tabGroup}` : '')) + prepareToolInvocation: async (options) => { + const confirmationMessages = { + title: 'Count the number of open tabs', + message: new vscode.MarkdownString(`${options.participantName} will count the number of open tabs` + (options.parameters.tabGroup !== undefined ? ` in tab group ${options.parameters.tabGroup}` : '')) }; - } + + return { + invocationMessage: 'Counting the number of tabs', + confirmationMessages + } + }, })); } @@ -58,6 +45,12 @@ interface IToolCall { result: Thenable; } +const llmInstructions = `Instructions: +- The user will ask a question, or ask you to perform a task, and it may require lots of research to answer correctly. There is a selection of tools that let you perform actions or retrieve helpful context to answer the user's question. +- If you aren't sure which tool is relevant, you can call multiple tools. You can call tools repeatedly to take actions or gather as much context as needed until you have completed the task fully. Don't give up unless you are sure the request cannot be fulfilled with the tools you have. +- Don't ask the user for confirmation to use tools, just use them. +- After editing a file, DO NOT show the user a codeblock with the edit or new file contents. Assume that the user can see the result.` + function registerChatParticipant(context: vscode.ExtensionContext) { const handler: vscode.ChatRequestHandler = async (request: vscode.ChatRequest, chatContext: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken) => { const models = await vscode.lm.selectChatModels({ @@ -66,12 +59,12 @@ function registerChatParticipant(context: vscode.ExtensionContext) { }); const model = models[0]; - // stream.markdown(`Available tools: ${vscode.lm.tools.map(tool => tool.id).join(', ')}\n\n`); + stream.markdown(`Available tools: ${vscode.lm.tools.map(tool => tool.id).join(', ')}\n\n`); const allTools = vscode.lm.tools.map((tool): vscode.LanguageModelChatTool => { return { name: tool.id, - description: tool.modelDescription, + description: tool.description, parametersSchema: tool.parametersSchema ?? {} }; }); @@ -81,9 +74,14 @@ function registerChatParticipant(context: vscode.ExtensionContext) { }; const messages = [ - vscode.LanguageModelChatMessage.User(`There is a selection of tools that may give helpful context to answer the user's query. If you aren't sure which tool is relevant, you can call multiple tools.`), - vscode.LanguageModelChatMessage.User(request.prompt), + vscode.LanguageModelChatMessage.User(llmInstructions), ]; + messages.push(...await getHistoryMessages(chatContext)); + if (request.references.length) { + messages.push(vscode.LanguageModelChatMessage.User(await getContextMessage(request.references))); + } + messages.push(vscode.LanguageModelChatMessage.User(request.prompt)); + const toolReferences = [...request.toolReferences]; const runWithFunctions = async (): Promise => { const requestedTool = toolReferences.shift(); @@ -134,7 +132,7 @@ function registerChatParticipant(context: vscode.ExtensionContext) { // NOTE that the result of calling a function is a special content type of a USER-message const message = vscode.LanguageModelChatMessage.User(''); - message.content2 = [new vscode.LanguageModelChatMessageToolResultPart(toolCall.call.toolCallId, (await toolCall.result)['text/plain'])]; + message.content2 = [new vscode.LanguageModelChatMessageToolResultPart(toolCall.call.toolCallId, (await toolCall.result)['text/plain']!)]; messages.push(message); } @@ -149,10 +147,57 @@ function registerChatParticipant(context: vscode.ExtensionContext) { await runWithFunctions(); }; - const toolUser = vscode.chat.createChatParticipant('chat-sample.tools', handler); + const toolUser = vscode.chat.createChatParticipant('chat-tools-sample.tools', handler); toolUser.iconPath = new vscode.ThemeIcon('tools'); context.subscriptions.push(toolUser); } +async function getContextMessage(references: ReadonlyArray): Promise { + const contextParts = (await Promise.all(references.map(async ref => { + if (ref.value instanceof vscode.Uri) { + const fileContents = (await vscode.workspace.fs.readFile(ref.value)).toString(); + return `${ref.value.fsPath}:\n\`\`\`\n${fileContents}\n\`\`\``; + } else if (ref.value instanceof vscode.Location) { + const rangeText = (await vscode.workspace.openTextDocument(ref.value.uri)).getText(ref.value.range); + return `${ref.value.uri.fsPath}:${ref.value.range.start.line + 1}-${ref.value.range.end.line + 1}\n\`\`\`${rangeText}\`\`\``; + } else if (typeof ref.value === 'string') { + return ref.value; + } + return null; + }))).filter(part => part !== null) as string[]; + + const context = contextParts + .map(part => `\n${part}\n`) + .join('\n'); + return `The user has provided these references:\n${context}`; +} + +async function getHistoryMessages(context: vscode.ChatContext): Promise { + const messages: vscode.LanguageModelChatMessage[] = []; + for (const message of context.history) { + if (message instanceof vscode.ChatRequestTurn) { + if (message.references.length) { + messages.push(vscode.LanguageModelChatMessage.User(await getContextMessage(message.references))); + } + messages.push(vscode.LanguageModelChatMessage.User(message.prompt)); + } else if (message instanceof vscode.ChatResponseTurn) { + const strResponse = message.response.map(part => { + if (part instanceof vscode.ChatResponseMarkdownPart) { + return part.value.value; + } else if (part instanceof vscode.ChatResponseAnchorPart) { + if (part.value instanceof vscode.Location) { + return ` ${part.value.uri.fsPath}:${part.value.range.start.line}-${part.value.range.end.line} `; + } else if (part.value instanceof vscode.Uri) { + return ` ${part.value.fsPath} `; + } + } + }).join(''); + messages.push(vscode.LanguageModelChatMessage.Assistant(strResponse)); + } + } + + return messages; +} + export function deactivate() { } diff --git a/chat-sample/src/tools.tsx b/chat-tools-sample/src/tools.tsx similarity index 100% rename from chat-sample/src/tools.tsx rename to chat-tools-sample/src/tools.tsx diff --git a/chat-sample/tsconfig.json b/chat-tools-sample/tsconfig.json similarity index 100% rename from chat-sample/tsconfig.json rename to chat-tools-sample/tsconfig.json diff --git a/chat-sample/vscode.proposed.lmTools.d.ts b/chat-tools-sample/vscode.proposed.lmTools.d.ts similarity index 50% rename from chat-sample/vscode.proposed.lmTools.d.ts rename to chat-tools-sample/vscode.proposed.lmTools.d.ts index 89175362..5f12e3df 100644 --- a/chat-sample/vscode.proposed.lmTools.d.ts +++ b/chat-tools-sample/vscode.proposed.lmTools.d.ts @@ -12,7 +12,7 @@ declare module 'vscode' { // API -> LM: an tool/function that is available to the language model export interface LanguageModelChatTool { - // TODO@API should use "id" here to match vscode tools, or keep name to match OpenAI? + // TODO@API should use "id" here to match vscode tools, or keep name to match OpenAI? Align everything. name: string; description: string; parametersSchema?: JSONSchema; @@ -71,21 +71,32 @@ declare module 'vscode' { content2: (string | LanguageModelChatMessageToolResultPart | LanguageModelChatResponseToolCallPart)[]; } + // Tool registration/invoking between extensions + + /** + * A result returned from a tool invocation. + */ export interface LanguageModelToolResult { /** - * The result can contain arbitrary representations of the content. Use {@link LanguageModelToolInvocationOptions.requested} to request particular types. - * `text/plain` is required to be supported by all tools. Another example might be a `PromptElementJSON` from `@vscode/prompt-tsx`, using the `contentType` exported by that library. + * The result can contain arbitrary representations of the content. A tool user can set + * {@link LanguageModelToolInvocationOptions.requested} to request particular types, and a tool implementation should only + * compute the types that were requested. `text/plain` is required to be supported by all tools. Another example might be + * a `PromptElementJSON` from `@vscode/prompt-tsx`, using the `contentType` exported by that library. */ [contentType: string]: any; - } - // Tool registration/invoking between extensions + /** + * A string representation of the result. + */ + 'text/plain'?: string; + } export namespace lm { /** - * Register a LanguageModelTool. The tool must also be registered in the package.json `languageModelTools` contribution point. + * Register a LanguageModelTool. The tool must also be registered in the package.json `languageModelTools` contribution + * point. A registered tool is available in the {@link lm.tools} list for any extension to invoke. */ - export function registerTool(id: string, tool: LanguageModelTool): Disposable; + export function registerTool(id: string, tool: LanguageModelTool): Disposable; /** * A list of all available tools. @@ -95,26 +106,35 @@ declare module 'vscode' { /** * Invoke a tool with the given parameters. */ - export function invokeTool(id: string, options: LanguageModelToolInvocationOptions, token: CancellationToken): Thenable; + export function invokeTool(id: string, options: LanguageModelToolInvocationOptions, token: CancellationToken): Thenable; } + /** + * A token that can be passed to {@link lm.invokeTool} when invoking a tool inside the context of handling a chat request. + */ export type ChatParticipantToolToken = unknown; - export interface LanguageModelToolInvocationOptions { + /** + * Options provided for tool invocation. + */ + export interface LanguageModelToolInvocationOptions { /** - * When this tool is being invoked within the context of a chat request, this token should be passed from {@link ChatRequest.toolInvocationToken}. - * In that case, a progress bar will be automatically shown for the tool invocation in the chat response view. If the tool is being invoked - * outside of a chat request, `undefined` should be passed instead. + * When this tool is being invoked within the context of a chat request, this token should be passed from + * {@link ChatRequest.toolInvocationToken}. In that case, a progress bar will be automatically shown for the tool + * invocation in the chat response view, and if the tool requires user confirmation, it will show up inline in the chat + * view. If the tool is being invoked outside of a chat request, `undefined` should be passed instead. */ toolInvocationToken: ChatParticipantToolToken | undefined; /** - * Parameters with which to invoke the tool. + * The parameters with which to invoke the tool. The parameters must match the schema defined in + * {@link LanguageModelToolDescription.parametersSchema} */ - parameters: Object; + parameters: T; /** - * A tool invoker can request that particular content types be returned from the tool. All tools are required to support `text/plain`. + * A tool user can request that particular content types be returned from the tool, depending on what the tool user + * supports. All tools are required to support `text/plain`. See {@link LanguageModelToolResult}. */ requestedContentTypes: string[]; @@ -137,59 +157,118 @@ declare module 'vscode' { }; } - export type JSONSchema = object; + /** + * Represents a JSON Schema. + * TODO@API - is this worth it? + */ + export type JSONSchema = Object; + /** + * A description of an available tool. + */ export interface LanguageModelToolDescription { /** * A unique identifier for the tool. */ - id: string; + readonly id: string; /** * A human-readable name for this tool that may be used to describe it in the UI. + * TODO@API keep? */ - displayName: string | undefined; + readonly displayName: string | undefined; /** * A description of this tool that may be passed to a language model. */ - modelDescription: string; + readonly description: string; /** * A JSON schema for the parameters this tool accepts. */ - parametersSchema?: JSONSchema; + readonly parametersSchema?: JSONSchema; /** - * The list of content types that the tool has declared support for. + * The list of content types that the tool has declared support for. See {@link LanguageModelToolResult}. */ - supportedContentTypes: string[]; - } - - export interface LanguageModelToolProvideConfirmationMessageOptions { - participantName: string; - parameters: any; + readonly supportedContentTypes: string[]; + + /** + * A set of tags, declared by the tool, that roughly describe the tool's capabilities. A tool user may use these to filter + * the set of tools to just ones that are relevant for the task at hand. + */ + readonly tags: string[]; } + /** + * Messages shown in the chat view when a tool needs confirmation from the user to run. These messages will be shown with + * buttons that say Continue and Cancel. + */ export interface LanguageModelToolConfirmationMessages { + /** + * The title of the confirmation message. + */ title: string; + + /** + * The body of the confirmation message. This should be phrased as an action of the participant that is invoking the tool + * from {@link LanguageModelToolInvocationPrepareOptions.participantName}. An example of a good message would be + * `${participantName} will run the command ${echo 'hello world'} in the terminal.` + * TODO@API keep this? + */ message: string | MarkdownString; } - export interface LanguageModelTool { - invoke(options: LanguageModelToolInvocationOptions, token: CancellationToken): ProviderResult; + /** + * Options for {@link LanguageModelTool.prepareToolInvocation}. + */ + export interface LanguageModelToolInvocationPrepareOptions { + /** + * The name of the participant invoking the tool. + * TODO@API keep this? + */ + participantName: string; /** - * This can be implemented to customize the message shown to the user when a tool requires confirmation. + * The parameters that the tool is being invoked with. */ - provideToolConfirmationMessages?(options: LanguageModelToolProvideConfirmationMessageOptions, token: CancellationToken): Thenable; - - /** - * This message will be shown with the progress notification when the tool is invoked in a chat session. - */ - provideToolInvocationMessage?(parameters: any, token: CancellationToken): Thenable; + parameters: T; } + /** + * A tool that can be invoked by a call to a {@link LanguageModelChat}. + */ + export interface LanguageModelTool { + /** + * Invoke the tool with the given parameters and return a result. + */ + invoke(options: LanguageModelToolInvocationOptions, token: CancellationToken): ProviderResult; + + /** + * Called once before a tool is invoked. May be implemented to customize the progress message that appears while the tool + * is running, and the messages that appear when the tool needs confirmation. + */ + prepareToolInvocation?(options: LanguageModelToolInvocationPrepareOptions, token: CancellationToken): ProviderResult; + } + + /** + * The result of a call to {@link LanguageModelTool.prepareToolInvocation}. + */ + export interface PreparedToolInvocation { + /** + * A customized progress message to show while the tool runs. + */ + invocationMessage?: string; + + /** + * Customized messages to show when asking for user confirmation to run the tool. + */ + confirmationMessages?: LanguageModelToolConfirmationMessages; + } + + /** + * A reference to a tool attached to a user's request. + */ export interface ChatLanguageModelToolReference { /** * The tool's ID. Refers to a tool listed in {@link lm.tools}. @@ -197,10 +276,11 @@ declare module 'vscode' { readonly id: string; /** - * The start and end index of the reference in the {@link ChatRequest.prompt prompt}. When undefined, the reference was not part of the prompt text. + * The start and end index of the reference in the {@link ChatRequest.prompt prompt}. When undefined, the reference was + * not part of the prompt text. * - * *Note* that the indices take the leading `#`-character into account which means they can - * used to modify the prompt as-is. + * *Note* that the indices take the leading `#`-character into account which means they can be used to modify the prompt + * as-is. */ readonly range?: [start: number, end: number]; } @@ -209,12 +289,11 @@ declare module 'vscode' { /** * The list of tools that the user attached to their request. * - * *Note* that if tools are referenced in the text of the prompt, using `#`, the prompt contains - * references as authored and that it is up to the participant - * to further modify the prompt, for instance by inlining reference values or creating links to - * headings which contain the resolved values. References are sorted in reverse by their range - * in the prompt. That means the last reference in the prompt is the first in this list. This simplifies - * string-manipulation of the prompt. + * *Note* that if tools are referenced in the text of the prompt, using `#`, the prompt contains references as authored + * and it is up to the participant to further modify the prompt, for instance by inlining reference values or + * creating links to headings which contain the resolved values. References are sorted in reverse by their range in the + * prompt. That means the last reference in the prompt is the first in this list. This simplifies string-manipulation of + * the prompt. */ readonly toolReferences: readonly ChatLanguageModelToolReference[];